在AngularJs中,json形式的字符串可以转为json格式的对象,代码如下:
利用HTML5的2种本地存储方式(localStorage和sessionStorage)来做测试:
01var m = angular.module('app', []); 02m.controller('ctrl', ['$scope', function($scope){ 03 $scope.data = {'name':'K`illCode博客'}; 04 //window.localStorage.setItem('data', $scope.data); 05 //console.log(window.localStorage.getItem('data')); 06 07 window.sessionStorage.setItem('data', angular.toJson($scope.data)); 08 console.log(angular.fromJson(window.sessionStorage.getItem('data'))); 09 console.log(window.sessionStorage.getItem('data')); 10}]); 下面用jQuery表单提交的案例来演示一下toJson和fromJson的用法:
toJson:将json对象转为json字符串;
fromJson:将json字符串转为json对象。
html和js部分:
01<!doctype html> 02<html lang="en"> 03 <head> 04 <meta charset="UTF-8"> 05 <title>Document</title> 06 <meta name="Keywords" content=""> 07 <meta name="Description" content=""> 08 </head> 09 <body ng-app="app" ng-controller="ctrl"> 10 <form action="./5.php" method="post"> 11 <p> 12 <label>博客名称:</label> 13 <input type="text" name="name" ng-model="
先秀一下 demo!此款 Table 源码~
表面上,在顶部及左侧悬挂两栏并非难事。但单元格尺寸根据其不确定的内容伸展,且顶部及左侧表头也应随之调整宽高。
Table 天然具备如此属性,我们可将 thead 剥离进行 fixed,但首列每一项分散在每一行,如何整体剥离?显然剥离较棘手,需转变思路。
定义新元素模拟首列并悬挂于左侧,但其单元格如何同步同行单元格高度?利用 js 获取当前行高度并赋值于首列元素,假定表格上千行便需如此操作上千次,过于麻烦...
一个 Table 难搞定,两个何如?我需要它们一模一样:
令 table1 与 table2 共享一套样式、数据便可一模一样(使两者同行同列元素尺寸同步)。将 table1 的 thead 剥离进行 fixed;table2 整体置为 fixed 覆盖于 table1 之上,并将 table2 除首列单元格外的其它元素置为透明。此时首行及首列悬挂完成了,但它们并未随表格主体的滚动而滚动。
动用 js 获取 window 滚动位置,scrollX 即为首行向左偏移距离,scrollY 为首列向上偏移距离:
var curX = 0; var curY = 0; $(window).on('scroll', function () { var scrollX = window.scrollX; var scrollY = window.scrollY; // 首行向左偏移 scrollX Math.abs(curX - scrollX) && $('.table1 .thead').css('left', -scrollX); // 首列向上偏移 scrollY(table2 仅首列非透明等同于整体偏移) Math.
#学习历程记录#
/*********************************************C Primer Plus 第四章 编程练习***********************************************/
1.编写一个程序,提示用户输入名和姓,然后以“名,姓”的格式打印出来
//编写一个程序,提示用户输入名和姓,然后以“名,姓”的格式打印出来 #include<stdio.h> int main(void) { char last_name[20],first_name[20]; int x=0; printf("请输入名:\n"); scanf("%s",first_name); printf("请输入姓:\n"); scanf("%s",last_name); printf("%s,%s\n",first_name,last_name); //以“名,姓”的格式打印出来 return 0; } 2.编写一个程序,提示用户输入名和姓,并执行以下操作:
打印名和姓,包括双引号;在宽度为20的字段右端打印名和姓,包括双引号;在宽度为20的字段左端打印名和姓,包括双引号;在比姓名宽度宽3的字段中打印名和姓。 #include<stdio.h> #include<string.h> //包含strlen()函数的头文件 int main(void) { char last_name[20],first_name[20]; int x=0,y=0; printf("请输入名:\n"); scanf("%s",first_name); x=strlen(first_name); //获取名的字符长度 printf("请输入姓:\n"); scanf("%s",last_name); y=strlen(last_name); //获取姓的字符长度 printf("您的姓名为:\"%s,%s\"\n",first_name,last_name); //打印名和姓,包括双引号 printf("您的姓名为:\"%*s,%s\"\n",20-y,first_name,last_name); //在宽度为20的字段右端打印名和姓,包括双引号 printf("您的姓名为:\"%-*s,%-*s\"\n",x,first_name,20-x,last_name); //在宽度为20的字段左端打印名和姓,包括双引号 printf("您的姓名为:\"%*s,%s\"\n",x+3,first_name,last_name); //在比姓名宽度宽3的字段中打印名和姓 return 0; } 3.编写一个程序,读取一个浮点数,首先以小数点记数法打印,然后以指数记数法打印。用下面的格式进行输出(系统不同,指数记数法显示的位数可能不同):
输入21.3或2.1e+001;输入+21.290或2.129E+001; #include<stdio.h> int main(void) { float x; printf("请输入:"); scanf("%f",&x); printf("%.1f或%.1e\n",x,x); //第一种情况,输入21.3,输出2.1e+001 printf("%+.3f或%.3E",x,x); //第二种情况,输入21.
[教程]在Windows 2012 R2上安装Intel I217-V/I218-V网卡驱动
由于Intel坑爹的在Server版不支持I217-V/I218-V网卡,研究了一番,终于把驱动装上咯。网卡型号去主板官网查看参数即可看到 以下以I218-V网卡为例。因为我是x299 1、下载Intel官方驱动: https://downloadcenter.intel.com/Detail_Desc.aspx?agr=Y&DwnldID=23071&lang=zho
注意要下64位的,下载好是名为PROWinx64.exe的文件
2、使用WinRAR右键解压缩到PROWinx64:
解压后:
3、进入\PRO1000\Winx64\NDIS64目录,找到e1d64x64.inf文件
4、用记事本打开该文件,可以看到有这么一段:
从文件下面的信息可以知道,I280-V是[E1559.6.3.1]:
对应上面那一段的:
也就是E1559.6.3.1相关的部分,这里很明显看到这个信息在6.3.1里有,在6.3里没有 所以我们要做的就是把这一段剪切到下面:
好了保存即可。
5、修改签名验证,用管理员权限打开命令提示符,输入以下两行,回车执行: bcdedit -set loadoptions DISABLE_INTEGRITY_CHECKS bcdedit -set TESTSIGNING ON
然后重启下电脑。
6、打开设备管理器,右键以太网适配器,由于我这里已经安装了,所以显示的是设备型号,否则在上面显示个黄色问号的“以太网适配器”,
7、选择“浏览计算机以查找驱动软件”:
8、选择“从计算机的设备驱动程序列表中选取”
9、找到“网络适配器”,点下一步:
10、选择“从磁盘安装”:
11、点击“浏览”:
12、选择刚才修改的文件\PRO1000\Winx64\NDIS64\e1d64x64.inf,然后点击打开:
13、点击“确定”:
14、在列表里找到I218-V:
点下一步安装,一会会提示驱动程序签名,继续安装即可。
好了重启电脑,设备就装好了,还原驱动程序签名: bcdedit -set loadoptions ENABLE_INTEGRITY_CHECKS bcdedit -set TESTSIGNING OFF
重启一切OK。
其他不支持的网卡可以参考这个安装。
Verdi看波形的基本操作小结:
在代码窗口,单击选中信号,此时处于高亮状态,按Ctrl+w,可以将信号发送到波形窗口。
快捷键:(大写字母=Shift+小写)
g get, signlas添加信号,显示波形
n next, Search Forward选定信号按指定的值(上升沿,下降沿,both,指定Value)向前跳转
N 与n功能相同,方向向后
y Keep Cursor at Centor(开关)移至中央并保持居中,再按取消固定居中
c color,调整所选信号的波形显示颜色,线的粗细和类型,非常方便Debug
f full, Zoom All波形全部显示
z Zoom Out波形缩小,一般配合鼠标放大非常方便
Z Zoom In 波形放大
l last view,上次波形位置,相当于Vim里的``或''
L 重新加载波形或设计文件,这个很方便,在新一次仿真完成之后Roload即可
b begin移动Cursor到波形开头
e end移动Cursor到波形结尾
r restore signals 保存波形信号列表
h hierarchy显示信号的绝对路径
H Highlight(开关)是否高亮显示所选信号
m move将信号移动到黄线位置
Delete 删除所选信号
Ctrl+Right Arrow 向右移动半屏
Ctrl+Left Arrow 向左移动半屏
鼠标:
左键:用于选择信号
右键:调出菜单
中间:单击移动黄线,拖动信号可移动位置排列顺序
滑轮:上下滚屏
左键圈定波形范围:按选定缩放
双击信号波形: 跳转到代码,并用绿色高亮该信号
双击信号:按位展开(expand),Struct展开下一层。再双击折叠(collapse)
右键信号名->Bus Operations->Expand as Sub-bus->可以按指定位宽展开,比如512bits的信号分成4个128的,方便查看
先讲一下原理:checkboxhack技术
我们使用 CSS 一些特殊的选择器,然后配合单选框以及复选框自带的一些特性,可以实现元素的显示隐藏效果。然后通过一些简单的扩展,我们可以不使用任何 JavaScript 代码实现类似:自定义的单复选框,“更多”展开与收起效果,选项卡切换效果,或是多级下拉列表效果等等。
相信很多前端开发人员都会遇到 boss 让修改 checkbox 和 radio 样式,毕竟自带的样式太丑了。后来我们发现修改自带样式并不是那么容易,最后直接使出杀手锏——点击之后替换图片。
今天教大家一种方法,不用替换图片,随意修改样式。
先讲一下原理:两个关键东东,一是伪类选择器 :checked,表示对应控件元素(单选框或是复选框)选中时的样式;二就是加号 + 相邻兄弟选择器,这个符号表示选择后面的兄弟节点。于是,两者配合,就可以轻松自如控制后面元素的显示或者隐藏,或是其他样式了。
而如何让单复选框选中和不选中了,那就是 label 标签了哈,for 属性锚定对应的单选框或是复选框,然后点击这里的 label 标签元素的时候,对应的单复选框就会选中或是取消选中。然后,就有上面的效果啦!
radio 的css样式:
radio的html:
checkbox的css样式:
checkbox的html:
一.介绍:
一. 常用格式
其中:^表示以此正则表达式开始 $是以此正则表达式结尾
1 Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
2 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
3 InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
4 手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
5 电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$
6 国内电话号码(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}
7 身份证号:
15或18位身份证:^\d{15}|\d{18}$
15位身份证:^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$
8 中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)
9 IP地址:\d+\.\d+\.\d+\.\d+ (提取IP地址时有用)
二、校验字符的表达式
1 汉字:^[\u4e00-\u9fa5]{0,}$
2 英文和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
3 长度为3-20的所有字符:^.{3,20}$
4 由26个英文字母组成的字符串:^[A-Za-z]+$
5 由26个大写英文字母组成的字符串:^[A-Z]+$
6 由26个小写英文字母组成的字符串:^[a-z]+$
7 由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$
8 由数字、26个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$
9 中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$
10 中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
11 可以输入含有^%&',;=?$\"等字符:[^%&',;=?$\x22]+
12 禁止输入含有~的字符:[^~\x22]+四.特殊用法
1.替换文档里面某个字符串
String str="张三和王四是中国人"; String regex2="[(张三)(王四)]";//一个*代替一个字
String regex3="(张三)";//一个字代替一个括号里面的内容
String str2=str.replaceAll(regex2,"*");
1. Testbench里面加入:
initial begin $fsdbDumpfile("hello.fsdb"); $fsdbDumpvars("+all"); end 其中如果不用+all的参数,SV中的struct结构体无法被Dump出来。
关于$fsdbDumpvars()以及其他相关FSDB Dumping Commands的参数的细节请参考Verdi安装目录的文档:linking_dumping.pdf
2. 保证环境变量设置正确:
NOVAS_HOME <novas_path> 3. VCS仿真命令:
Makefile添加:
SNPS_VCS_OPT+= -debug_access+cbk 或者命令行:
% vcs -debug_access+cbk <file_name> 这个参数的作用是让VCS自动设置novas.tab和pli.a两个文件,避免了写很长一串,简单方便。
4. 查看波形:
verdi -sv -f run.f -ssf ./work/hello.fsdb & 或
nWave ./work/hello.fsdb & 实验环境:
vcs-2014.03
Verdi_vK-2015.09-SP1-1
###读取数据常见错误:
在读取数据过程中可能遇到以下问题,参照上一篇博客:
可能遇到报错:
1、Error in if (is.na(n) || n > 65536L) stop(“size cannot be NA nor exceed 65536”) :
missing value where TRUE/FALSE needed
没有处理数据转化距离。
2、Error in hclust(dist(test)) : NA/NaN/Inf in foreign function call (arg 11)
In addition: Warning message:
In dist(test) : NAs introduced by coercion
数据读入方式错误,详见各参数,与两种数据类型。
###Plot开始画图:
> test<-read.table("C:/Users/admin/Desktop/test.txt") > hc = hclust(dist(test)) plot(hc,hang=1,cex=0.5,labels = NULL) ###另类聚类图
将hclude生成的对象转换为另类的聚类图
> hcd = as.dendrogram(hc) > plot(hcd) # tweeking some parameters op=par(bg="
举例说明: 产品需求: 假如后台返回格式: var data = [ {"time": 1517482336545, "location": "浦东"}, {"time": 1517482336543, "location": "静安"}, {"time": 1516344919173, "location": "内环"}, {"time": 1515574927334, "location": "五环"}, {"time": 1517482336544, "location": "苏州"} ]; 这就需要前台再处理成我们需要的数据了。 步骤:将毫秒转换成日期格式----处理数组---返回需要的数据格式[{time:"",location:[]}] 方法: //转换时间 function transDate(n) { var date = new Date(n); var Y = date.getFullYear() + '-'; var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'; var D = date.
在iphone手机上,网站可以添加到主屏幕,默认情况下,一个网站被添加到主屏幕时,默认显示的是网站截图,如何才能显示成我们自己想要设置的图标呢?我在实际工作中遇到了这个需求,将实现步骤总结如下:
1.制作4中不同尺寸的图片: <!--适用于 Retina 屏的 iPad--> <link rel="apple-touch-icon-precomposed" sizes="144x144" href="./static/apple-touch-icon-precomposed-144x144.png"> <!--适用于 Retina 屏的 iPhone--> <link rel="apple-touch-icon-precomposed" sizes="120x120" href="./static/apple-touch-icon-precomposed-120x120.png"> <!--适用于非 Retina 屏的 iPad--> <link rel="apple-touch-icon-precomposed" sizes="72x72" href="./static/apple-touch-icon-precomposed-72x72.png"> <!--适用于非 Retina 屏的 iPhone--> <link rel="apple-touch-icon-precomposed" href="./static/apple-touch-icon-precomposed-57x57.png"> 2.vue项目中,需将4张图片放到static文件中 3.在index.html的<head></head>之间添加以上代码 4.部署上线 5.完成上述步骤后,在safari中打开网址 , 你的桌面上就会出现一个类似app的图标了,大功告成了,是不是很简单呢。
方式1 Request.java @Data public class Request implements Serializable { private String url; private String payCode; private String amount; } IPay.java public interface IPay { void pay(Request request); } Context.java public class Context { public void execute(IPay iPay, Request request){ System.out.println("开始支付"); System.out.println("payCode:"+request.getPayCode()); request.setUrl(request.getUrl()+"/pay"); //修改A类中的属性值 iPay.pay(request); //调用A类中的实现 System.out.println("支付结束"); } } Test.java /*** * A->B, B->A */ public class Test { public static void main(String[] args) { final Request request = new Request(); request.
找到nginx\conf\nginx.conf如下部分: server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } 修改后如下: server { listen 80; server_name painpointcloud; #charset koi8-r; #access_log logs/host.access.log main; #默认静态资源 location / { root html; index index.html index.htm; allow all; } #其他动态请求反向代理到tomcat容器 location ~ \.(json|do)?$ { index index; proxy_pass http://localhost:8080; } #配置[企业宣传]动态请求反向代理到tomcat容器 location ~ \.(com)?$ { index index; proxy_pass http://localhost:1010; } # 匹配任何以business开始的请求 location ^~ /business/ { index index; proxy_pass http://localhost:1010; } # 匹配任何以idea开始的请求 location ^~ /idea/ { index index; proxy_pass http://localhost:1010; } 说明: listen:是监听的端口,即用户访问nginx服务的端口 server_name:服务名,经过测试并不会影响到什么 location:定义资源类型与服务器中资源地址url的映射关系,可在/后面定义资源类型,可设置多个location 其中proxy_pass代表要反向代理的服务器资源url,只要资源类型匹配,在这个url下的子路径资源都可以访问到, 其中root代表本地的资源路径,同样只要资源类型匹配,这个路径下的子目录资源都可以被访问到, 一个location中只能配置一个root或proxy_pass。 修改后ngnix.
自从意识到深度学习是未来之后,自己看了相关的书籍三本,看了吴恩达和李飞飞两位神级人物的课程,配置了caffe,torch,pytorch等等开源架构,也跑了几个开源工程,却始终都感觉似懂非懂,实在是糟心。 经过了严肃认真的思考后,本人决定从最底层开始,自己写一个架构,进而可以深入了解深度学习的方方面面。 本篇作为系列文章的开篇总览,目的就是给自己挖个坑,以提醒自己要好好努力。并且也给这一系列文章定出规则,以时时回望。 因为本人最熟悉的是C++,所以会用C++实现一个架构。另外python作为机器学习的近乎官方语言,在这一系列文章中也会实现一个架构。最后,本人最喜欢pytorch架构,也会用其实现想要做的东西(分成cpu和gpu两个版本)。 因此,本系列每篇文章将涉及到的内容如下:
原理的理解(其中有可能大部分都借鉴网上优秀的博客或者书籍中的内容,因而如有雷霆,是本人抄的。但绝非不过脑子的抄,当然也会标明出处)C++实现python实现pytorch的CPU实现pytorch的GPU实现 需要说明一下的是本人自行实现的代码(也有可能借鉴别人)书写肯定受限于本人水平,几乎不可能有现成架构的效率和规范,只作为本人练习之用。工程中本人将用成熟的框架进行,这也才有了4,5点。 如果有看本人之前写的一些博文可能会觉得很多只讲实现没讲原理,那是因为相关内容本人在工程中用到于是就快速实现出来,有些原理本人也不知道。但这一系列本人将力求做到自己透彻理解,并把涉及到的原理认真仔细的整理出来。 那么预告一下下一篇,深度学习1—最简单的全连接神经网络
1.定长数组-Array //方式一 //长度为5的整数数组,所有元素初始化为0 val ary1=new Array[Int](5) //长度为5的字符串数组,所有元素初始化为null val ary2=new Array[String](5) //方式二 //长度为2的数组,数据类型自动推断出来,已经提供初始值就不需要new关键字 val ary3= Array("zhangsan","lisi") // val ary4= Array(1 to 10 :_*); println("数组的元素:"+ary1(0)) //赋值 ary1(0)=11 println("改变后数组的元素:"+ary1(0)) 数组中的常用方法 val numbers = Array(1, 2, 3, 4) //声明一个数组对象 val first = numbers(0) // 读取第一个元素 numbers(3) = 100 // 替换第四个元素为100 val biggerNumbers = numbers.map(_ * 2) // 所有元素乘2 val a = Array(1,2) val b = Array(3,4) val c = a ++ b //c中的内容是(1,2,3,4) val a = Array(1, 2, 3,4,4,5,6,6) val c = a.
mui是h5十大框架之一。很好用,但是针对不同的场景,文档的描述不够我们理解。
场景:通过mui的上拉加载更多数据,下拉刷新回刚刚进入当前页面的状态。笔者设置每次上拉就清空旧页面的内容,把新加载的10条数据渲染到页面上,当下拉时候,恢复到第一次加载的状态。
问题:当上拉加载的数据达到最多时候,通过
mui('#pullrefresh').pullRefresh().endPullupToRefresh(true) 设定不让继续上拉加载。然后当下拉刷新想要回复上拉加载,采用如下:
mui('#pullrefresh').pullRefresh().endPullupToRefresh(false); 测试发现,没办法恢复上拉加载的功能。
笔者也尝试了用:
mui('#pullup-container').pullRefresh().refresh(true); mui('#pullup-container').pullRefresh().disablePullupToRefresh(); mui('#pullup-container').pullRefresh().enablePullupToRefresh(); 来做测试。但是只有当使用禁用和启动交互时候可以恢复,但是当刷新的时候,会自动执行一次上拉加载动作。所以这些方案都被笔者废弃了。针对上面这些,笔者又尝试如何不让mui再执行刷新动作时候不自动执行一次上拉加载动作,经过研究发现如下调用启用上拉功能的代码,就不会自动执行一次上拉加载的动作:
setTimeout("enablepull",1000);//延时至少1s,小于1s就不行。 function enablepull(){ mui('#pullup-container').pullRefresh().enablePullupToRefresh(); } 上面虽然可以解决,但是笔者还是觉得不好,又尝试了一种曲线救国的方式:
设定全局变量enablepull
每次获取结果之后都判断是否还有更多数据,如果没有更多,那么enablepull=false;
这样每次上拉之前做如下判断:
if (!enablePullUp) { mui('#pullrefresh').pullRefresh().endPullupToRefresh(false); mui.toast("没有更多数据了"); return; } 成功解决问题。
附上笔者关于曲线解决问题的代码:
//作者是模拟实现分页的效果,只是只做了下一页(上拉加载),和回到第一页的效果(下拉刷新) var pageNo = 1; var pageSize = 6; var enablePullUp = true; $(document).ready(function(){ mui('body').on('tap','a',function(){document.location.href=this.href;}); //上拉加载下拉刷新初始化 mui.init({ pullRefresh: { container: '#pullrefresh', down: { style:'circle',//必选,下拉刷新样式,目前支持原生5+ ‘circle’ 样式 color:'#2BD009', //可选,默认“#2BD009” 下拉刷新控件颜色 callback: billRefresh }, up: { auto:false, contentrefresh: '正在加载...', contentnomore:'', callback: billLoad } }, swipeBack:true, //启用右滑关闭功能 beforeback: function(){ //返回true,继续页面关闭逻辑 return true; } }); }); /** * 上拉加载具体业务实现 */ function billLoad() { if (!
系统:linux mint xfce 64bit
软件:
1、SW4STM32
2、STM32CubeMX
关于这两个软件在linux的安装教程请看我另一篇博文
Linux/Windows配置stm32免费开发环境详细流程
sw4stm32比较难下载,在此提供百度网盘链接:
链接:https://pan.baidu.com/s/1nxgh1VF 密码:rvzu
3、开发板:STM32F407VET6核心
FreeRTOS软件定时器特点:
(1)是RTOS的一个组件
(2)可以用来扩展STM32的定时器
(3)不是很精确,但可以用作处理循环事件或者延时事件
(4)两种模式,periodic和one pulse
使用STM32CubeMX配置FreeRTOS的话,API是CMSIS_RTOS标准的,也就是进行了封装,下表给出了一些对应关系
对于软件定时器的操作请看下图
下面介绍一下使用STM32CubeMX配置FreeRTOS软件定时器的例子,使用到了以上几个函数,参考资料在文末。
配置RCC(外部晶振8M),SYS(systick设置为TIM4),LED灯所在引脚,串口1(用来打印输出信息)
配置时钟,选择外部晶振,HCLK输入168会自动寻找配置
在Configuration 里选择FreeRTOS ,FreeRTOS使能软件定时器
添加软件定时器,模式选择周期性
生成sw4stm32工程,记得在代码生成设置里面勾选为每个外设生成独立的.c/.h 文件
修改main.c文件里的内容,第一步是串口重定向,添加下列代码到相关位置
7. 修改freertoc.c内容,主要修改两处,一处是任务函数StartDefaultTask,一处是软件定时器的回调函数Callback01
(吐槽CSDN,本来想传代码的,无奈CSDN博客转换为代码格式有问题,会和前面的代码结合在一起,造成错乱,对于有强迫症的我来说就只上传图片了)
烧写程序验证 参考资料:STM32F4-and-FreeRTOS
链接: https://pan.baidu.com/s/1i7d8doT 密码: hiuv
相对应的视频介绍请查看:https://www.bilibili.com/video/av63560586
一、搭建思想(很重要!!!) 主要分为两个方面,Git仓库和项目库(图用的画图工具画的,太low了.......)
1、你需要在你服务器上拥有一个Git仓库(提供者)
2、本地仓库、你的服务器项目仓库、或者其他服务器仓库(实际使用者),开发或者上线的库
二、搭建过程 我的服务器是:CentOS6.*版本(7.0以上有改动不知道好使不,大家可以踩一下坑)
1、服务器安装git
# yum install -y git 复制代码 执行命令之后,可以查看一下版本 $ git --version复制代码 [root@iZ2zeftluibm3hesz36v3tZ ~]# git --version git version 1.7.1 复制代码 2、安装完成之后需要在服务器上创建用户进行Git仓库管理,并设置密码(我设置的为git名称的用户)
查看一下有没有git这个用户
[root@iZ2zeftluibm3hesz36v3tZ ~]# id git 复制代码 添加git这个用户
[root@iZ2zeftluibm3hesz36v3tZ ~]# useradd git 复制代码 为git用户设置密码
passwd git 复制代码 3、核心,现在你需要在你的服务器上选择某一个目录作为你的版本库存放地址
OK,那我们现在首先创建一个仓库的目录
[root@iZ2zeftluibm3hesz36v3tZ home]# mkdir -p test/git 复制代码 然后可以在这个目录下创建你新建的项目地址
[root@iZ2zeftluibm3hesz36v3tZ git]# mkdir -p aa.git 复制代码 创建完成之后看一下
[root@iZ2zeftluibm3hesz36v3tZ git]# ll total 12 drwxr-xr-x 2 root root 4096 Feb 2 15:04 aa.
近日通过CAE软件分析弹性体折叠过程中的半径变化趋势,已经从分析结果文件中提取了弯折区域三点的运动轨迹,设想将弯折区域近似为圆弧并通过三点计算得出圆的半径。经网上查找一翻,发现一篇博客有比较详细的计算公式,由于不能直接转载,在此记录一篇作为笔记。为向原作者示敬,附上原作链接如下:http://blog.csdn.net/liyuanbhu/article/details/52891868
我们设一个圆的圆心坐标为 (x0,y0),半径为 r。那么这个圆的方程可以写为:
取圆上任意三点,设这三个点的坐标分别是 (x1,y1),(x2,y2),(x3,y3)。由于圆弧上所有点到圆心距离均为半径,那么有:
公式(1)(2)相减,(1)(3)相减之后经过化简可以得到: x0,y0有唯一解的条件是系数行列式不为 0: 简单变变型也就是: 上式的几何意义即:三点不能共线。
设:
那么 : 有了x0和y0的值后,带入(1) 式就可以得到半径 r 的值。至此,三点确定圆的问题就解决了。
好了,有了以上理论以及计算公式,利用 Python 读入CAE软件计算得到的圆弧上三个点的运动轨迹,即可得到折叠过程中半径r的变化趋势了。
Spring对第三方自定义元素配置的支持 Spring中bean的定义可以通过编程,可以定义在properties文件,也可以定义在通过xml文件中,用的最多的是通过xml形式,由于xml格式具有很好的自说明便于编写及维护。对于xml的文档结构、数据定义及格式验证可以通过DTD和Schema, 在spring2.0之前采用的是DTD,在spring2.0之后采用Schema。使用Schema方式使得spring更加便于与第三方进行集成以及第三方可以提供更简单更便于使用的个性化配置方式。 对于XmlSchema,有个重要的概念命名空间(namespace)必须要提一下,spring就是利用它来做第三方自定配置格式的解析的,在spring中aop, transaction的就是一个实现自己自定义配置很好实例。 如上图:xmlns=http://www.springframework.org/schema/beans是默认命名空间 xmlns:aop=http://www.springframework.org/schema/aop 定义的aop的命名空间 xmlns:tx=”http://www.springframework.org/schema/tx” 定义了事物的命名空间spring通过schema方式来解析配置文件的基本原理: 类DefaultBeanDefinitionDocumentReader会把spring的xml配置文件当做一个文档格式来读取。 每读取一个元素节点都会判断下这个元素的命名空间,如果是默认命名空间(http://www.springframework.org/schema/beans)则按默认方式读取bean的定义。如果不是如namespaceUri如下: http://www.springframework.org/schema/aop, http://www.springframework.org/schema/tx, http://code.alibabatech.com/schema/dubbo 则走解析自定义元素流程。根据命名空间去获取具体的处理器NamespaceHandler DefaultNamespaceHandlerResolver类传了key为namespaceUri,在类中有个Map存储类所有的自定义NamespaceHandler,这个Map中的值是通过工具类PropertiesLoaderUtils加载所有在”META-INF/spring.handlers”中的值 解析Dubbo自定义的元素到注册Spring容器中 DubboNamespaceHandler中注册了这么多的BeanDefinitionParser用来解析dubbo定义的那些xml元素节点如:
<dubbo:application name="dubbo-admin" /> <dubbo:registry address="${dubbo.registry.address}" check="false"file="false" /> <dubbo:reference id="registryService"interface="com.alibaba.dubbo.registry.RegistryService"check="false" /> <dubbo:reference id="demoService"interface="com.alibaba.dubbo.demo.DemoService" /> <dubbo:service interface="com.alibaba.dubbo.demo.DemoService"ref="demoService" /> 各个BeanDefinitionParser会把上面的xml元素转换成spring内部的数据结构BeanDefinition,最终当被引用时实例化成对应的bean如<dubbo:application/>节点得到ApplicationConfig。当然通过默认配置方式也是可以的如:
<dubbo:registry address="${dubbo.registry.address}" check="false"file="false" /> 也可以配置成
<bean id="registry" class="com.alibaba.dubbo.config.RegistryConfig"/> <property name="address" value="${dubbo.registry.address}"/> <property name="check" value="false"/> <property name="file" value="false"/> <bean/> 利用自定义元素解析更加简洁,同时也可以屏蔽一些具体的实现类型,如你不需要知道com.alibaba.dubbo.config.RegistryConfig这个类,只需要知道注册registry这个元素就可以了,用户可以通过文档以及schema的在ide中的自动提示可以很方便的去配置。
Jupyter notebook访问远程服务器 Jupyter notebook安装 学校服务器无法使用sudo。如果直接pip安装报错。可以使用以下方法安装:
首先确保安装python3、pip
激活某一virtualenv环境或者conda环境
# python3 python3 -m pip install --upgrade pip python3 -m pip install jupyter # python2 python -m pip install --upgrade pip python -m pip install jupyter安装成功。终端输入jupyter notebook测试
配置Jupyter notebook 进入python环境
导入设定密码模块
>>>from notebook.auth import passwd # 生成密码 >>>passswd() # 输入密码,并且验证输入密码 # 输入两次之后,会生成一个加密字符串,将其复制下来 # 退出python环境 编辑jupyter的配置文件。查看用户目录 ~/.jupyter 路径下是否存在 jupyter_notebook_config.py 文件。若不存在,使用
jupyter notebook --generate-config产生此文件。编辑此文件,写入
c.NotebookApp.ip = '*' # 允许访问此服务器的 IP,星号表示任意 IP c.NotebookApp.password = u'sha1:xxx:xxx' # 之前生成的密码 hash 字串 c.
A:给定n个正整数,请找出其中有多少个数x满足:在这n个数中存在数y=kx,其中k为大于1的整数
代码:
#include <bits/stdc++.h> using namespace std; int z, n, v[1000020]; int main() { scanf("%d", &n); for (int i = 0; i < n; i++) { int x; scanf("%d", &x); v[x]++; } for (int i = 1; i <= 1000000; i++) { for (int j = i + i; j <= 1000000; j += i) { if (v[j] > 0) { z += v[i]; break; } } } printf("%d\n", z); }每次i+i这样增速度肯定快!!吸取这种方法的好处。 c:c题是第一次尝试用大数,但是要打表才行。否则的话超时或者存不了。
在用Go语言对时间字符串进行parse的时候,经过 试验,“2016-12-25 00:00:00”这种格式是可以的, “2016-12-25“这种格式在试验的时候可以,然而在某些情况却会报错,比如说 当parse”2018-01-28”的时候,就会报 “month out of range”.
原因不清楚,需要继续看源码研究,所以以后parse的时候,使用time模块自带的那几种格式,和“2016-12-25 00:00:00”这种格式都是ok的, 如下。
time.Parse("2016-12-25 00:00:00", timeStr)
前言:本篇博客将爬取顶点小说网站全部小说、涉及到的问题有:Scrapy架构、断点续传问题、Mongodb数据库相关操作。 背景: Python版本:Anaconda3
运行平台:Windows
IDE:PyCharm
数据库:MongoDB
浏览器工具: Chrome浏览器
前面的博客中已经对Scrapy作了相当多的介绍所以这里不再对Scrapy技术作过多的讲解。 一、爬虫准备工作: 此次我们爬取的是免费小说网站:顶点小说 http://www.23us.so/ 我们要想把它全部的小说爬取下来,是不是得有全部 小说的链接? 我们看到顶点小说网站上有一个总排行榜。 点击进入后我们看到,这里有网站上所有的小说,一共有1144页,每页大约20本小说,算下来一共大约有两万两千多本,是一个庞大的数据量,并且小说的数量还在不断的增长中。 好!我们遇到了第一个问题,如何获取总排行榜中的页数呢?也就是现在的“1144”。 1、获取排行榜页面数: 最好的方法就是用Xpath。 我们先用F12审查元素,看到“1144”放在了“id”属性为“pagestats”的em节点中。 我们再用Scrapy Shell分析一下网页。 注意:Scrapy Shell是一个非常好的工具,我们在编写爬虫过程中,可以用它不断的测试我们编写的Xpath语句,非常方便。 输入命令: scrapy shell "http://www.23us.so/top/allvisit_2.html" 然后就进入了scrapy shell 因为页数放在“id”属性为“pagestats”的em节点中,所以我们可以在shell中输入如下指令获取。 response.xpath('//*[@id="pagestats"]/text()').extract_first() 我们可以看到,Xpath一如既往的简单高效,页面数已经被截取下来了。
2、获取小说主页链接、小说名称: 接下来,我们遇到新的问题,如何获得每个页面上的小说的链接呢?我们再来看页面的HTML代码。 小说的链接放在了“a”节点里,而且这样的a节点区别其他的“a”节点的是,没有“title”属性。 所以我们用shell测试一下,输入命令: response.xpath('//td/a[not(@title)]/@href').extract() 我们看到,小说的链接地址我们抓到了。
同样还有小说名, response.xpath('//td/a[not(@title)]/text()').extract() 我们可以看到页面上的小说名称我们也已经抓取到了。
3、获取小说详细信息: 我们点开页面上的其中一个小说链接: 这里有小说的一些相关信息和小说章节目录的地址。 我们想要的数据首先是小说全部章节目录的地址,然后是小说类别、小说作者、小说状态、小说最后更新时间。 我们先看小说全部章节目录的地址。用F12,我们看到: 小说全部章节地址放在了“class”属性为“btnlinks”的“p”节点的第一个“a”节点中。 我们还是用scrapy shell测试一下我们写的xpath语句。 键入命令,进入shell界面 scrapy shell "http://www.23us.so/xiaoshuo/13007.html" 在shell中键入命令: response.xpath('//p[@class="btnlinks"]/a[1]/@href').extract_first() 小说的章节目录页面我们已经截取下来了。
类似的还有小说类别、小说作者、小说状态、小说最后更新时间,命令分别是: #小说类别 response.xpath('//table/tr[1]/td[1]/a/text()').extract_first() #小说作者 response.xpath('//table/tr[1]/td[2]/text()').extract_first() #小说状态 response.xpath('//table/tr[1]/td[3]/text()').extract_first() #小说最后更新时间 response.xpath('//table/tr[2]/td[3]/text()').extract_first() 4、获取小说全部章节: 我们点开“最新章节”,来到小说全部章节页面。 我们如何获得这些链接呢?答案还是Xpath。 用F12看到,各章节地址和章节名称放在了一个“table”中: 退出上次的scrapy shell ,分析 全部章节页面。
本文转自滤波器
引言 阻抗匹配在高频设计中是一个常用的概念,这篇文章对这个“阻抗匹配”进行了比较好的解析。回答了什么是阻抗匹配。
阻抗匹配(Impedance matching)是微波电子学里的一部分,主要用于传输线上,来达至所有高频的微波信号皆能传至负载点的目的,不会有信号反射回来源点,从而提升能源效益。
大体上,阻抗匹配有两种,一种是透过改变阻抗力(lumped-circuit matching),另一种则是调整传输线的波长(transmission line matching)。
要匹配一组线路,首先把负载点的阻抗值,除以传输线的特性阻抗值来归一化,然后把数值划在史密夫图表上。关于史密斯图表,可以参考这一片个人认为讲的还不错的文章史上最经典的史密斯圆图讲解。
改变阻抗力 把电容或电感与负载串联起来,即可增加或减少负载的阻抗值,在图表上的点会沿著代表实数电阻的圆圈走动。如果把电容或电感接地,首先图表上的点会以图中心旋转180度,然后才沿电阻圈走动,再沿中心旋转180度。重覆以上方法直至电阻值变成1,即可直接把阻抗力变为零完成匹配。
调整传输线 由负载点至来源点加长传输线,在图表上的圆点会沿著图中心以逆时针方向走动,直至走到电阻值为1的圆圈上,即可加电容或电感把阻抗力调整为零,完成匹配。
阻抗匹配则传输功率大,对于一个电源来讲,单它的内阻等于负载时,输出功率最大,此时阻抗匹配。最大功率传输定理,如果是高频的话,就是无反射波。对于普通的宽频放大器,输出阻抗50Ω,功率传输电路中需要考虑阻抗匹配,可是如果信号波长远远大于电缆长度,即缆长可以忽略的话,就无须考虑阻抗匹配了。阻抗匹配是指在能量传输时,要求负载阻抗要和传输线的特征阻抗相等,此时的传输不会产生反射,这表明所有能量都被负载吸收了.反之则在传输中有能量损失。高速 PCB布线时,为了防止信号的反射,要求是线路的阻抗为50欧姆。这是个大约的数字,一般规定同轴电缆基带50欧姆,频带75欧姆,对绞线则为100欧姆,只是取个整而已,为了匹配方便。
阻抗从字面上看就与电阻不一样,其中只有一个阻字是相同的,而另一个抗字呢?简单地说,阻抗就是电阻加电抗,所以才叫阻抗;周延一点地说,阻抗就是电阻、电容抗及电感抗在向量上的和。在直流电的世界中,物体对电流阻碍的作用叫做电阻,世界上所有的物质都有电阻,只是电阻值的大小差异而已。电阻小的物质称作良导体,电阻很大的物质称作非导体,而最近在高科技领域中称的超导体,则是一种电阻值几近于零的东西。但是在交流电的领域中则除了电阻会阻碍电流以外,电容及电感也会阻碍电流的流动,这种作用就称之为电抗,意即抵抗电流的作用。电容及电感的电抗分别称作电容抗及电感抗,简称容抗及感抗。它们的计量单位与电阻一样是欧姆,而其值的大小则和交流电的频率有关系,频率愈高则容抗愈小感抗愈大,频率愈低则容抗愈大而感抗愈小。此外电容抗和电感抗还有相位角度的问题,具有向量上的关系式,因此才会说:阻抗是电阻与电抗在向量上的和。
阻抗匹配是指负载阻抗与激励源内部阻抗互相适配,得到最大功率输出的一种工作状态。对于不同特性的电路,匹配条件是不一样的。
在纯电阻电路中,当负载电阻等于激励源内阻时,则输出功率为最大,这种工作状态称为匹配,否则称为失配。
当激励源内阻抗和负载阻抗含有电抗成份时,为使负载得到最大功率,负载阻抗与内阻必须满足共扼关系,即电阻成份相等,电抗成份只数值相等而符号相反。这种匹配条件称为共扼匹配。
一、阻抗匹配的研究 在高速的设计中,阻抗的匹配与否关系到信号的质量优劣。阻抗匹配的技术可以说是丰富多样,但是在具体的系统中怎样才能比较合理的应用,需要衡量多个方面的因素。例如我们在系统中设计中,很多采用的都是源段的串连匹配。对于什么情况下需要匹配,采用什么方式的匹配,为什么采用这种方式。
例如:差分的匹配多数采用终端的匹配;时钟采用源段匹配;
1、串联终端匹配 串联终端匹配的理论出发点是在信号源端阻抗低于传输线特征阻抗的条件下,在信号的源端和传输线之间串接一个电阻R,使源端的输出阻抗与传输线的特征阻抗相匹配,抑制从负载端反射回来的信号发生再次反射.
串联终端匹配后的信号传输具有以下特点:
A 由于串联匹配电阻的作用,驱动信号传播时以其幅度的50%向负载端传播;
B 信号在负载端的反射系数接近+1,因此反射信号的幅度接近原始信号幅度的50%。
C 反射信号与源端传播的信号叠加,使负载端接受到的信号与原始信号的幅度近似相同;
D 负载端反射信号向源端传播,到达源端后被匹配电阻吸收;
E 反射信号到达源端后,源端驱动电流降为0,直到下一次信号传输。
相对并联匹配来说,串联匹配不要求信号驱动器具有很大的电流驱动能力。
选择串联终端匹配电阻值的原则很简单,就是要求匹配电阻值与驱动器的输出阻抗之和与传输线的特征阻抗相等。理想的信号驱动器的输出阻抗为零,实际的驱动器总是有比较小的输出阻抗,而且在信号的电平发生变化时,输出阻抗可能不同。比如电源电压为+4.5V的CMOS驱动器,在低电平时典型的输出阻抗为 37Ω,在高电平时典型的输出阻抗为45Ω[4];TTL驱动器和CMOS驱动一样,其输出阻抗会随信号的电平大小变化而变化。因此,对TTL或CMOS 电路来说,不可能有十分正确的匹配电阻,只能折中考虑。
链状拓扑结构的信号网路不适合使用串联终端匹配,所有的负载必须接到传输线的末端。否则,接到传输线中间的负载接受到的波形就会象图3.2.5中C点的电压波形一样。可以看出,有一段时间负载端信号幅度为原始信号幅度的一半。显然这时候信号处在不定逻辑状态,信号的噪声容限很低。
串联匹配是最常用的终端匹配方法。它的优点是功耗小,不会给驱动器带来额外的直流负载,也不会在信号和地之间引入额外的阻抗;而且只需要一个电阻元件。
2、并联终端匹配 并联终端匹配的理论出发点是在信号源端阻抗很小的情况下,通过增加并联电阻使负载端输入阻抗与传输线的特征阻抗相匹配,达到消除负载端反射的目的。实现形式分为单电阻和双电阻两种形式。
并联终端匹配后的信号传输具有以下特点:
A 驱动信号近似以满幅度沿传输线传播;
B 所有的反射都被匹配电阻吸收;
C 负载端接受到的信号幅度与源端发送的信号幅度近似相同。
在实际的电路系统中,芯片的输入阻抗很高,因此对单电阻形式来说,负载端的并联电阻值必须与传输线的特征阻抗相近或相等。假定传输线的特征阻抗为50Ω,则R值为50Ω。如果信号的高电平为5V,则信号的静态电流将达到100mA。由于典型的TTL或CMOS电路的驱动能力很小,这种单电阻的并联匹配方式很少出现在这些电路中。
双电阻形式的并联匹配,也被称作戴维南终端匹配,要求的电流驱动能力比单电阻形式小。这是因为两电阻的并联值与传输线的特征阻抗相匹配,每个电阻都比传输线的特征阻抗大。考虑到芯片的驱动能力,两个电阻值的选择必须遵循三个原则:
(1). 两电阻的并联值与传输线的特征阻抗相等;
(2). 与电源连接的电阻值不能太小,以免信号为低电平时驱动电流过大;
(3). 与地连接的电阻值不能太小,以免信号为高电平时驱动电流过大。
并联终端匹配优点是简单易行;显而易见的缺点是会带来直流功耗:单电阻方式的直流功耗与信号的占空比紧密相关;双电阻方式则无论信号是高电平还是低电平都有直流功耗。因而不适用于电池供电系统等对功耗要求高的系统。另外,单电阻方式由于驱动能力问题在一般的TTL、CMOS系统中没有应用,而双电阻方式需要两个元件,这就对PCB的板面积提出了要求,因此不适合用于高密度印刷电路板。
当然还有:AC终端匹配; 基于二极管的电压钳位等匹配方式。
二、将讯号的传输看成软管送水浇花 2.1 数位系统之多层板讯号线(Signal Line)中,当出现方波讯号的传输时,可将之假想成为软管(hose)送水浇花。一端于手握处加压使其射出水柱,另一端接在水龙头。当握管处所施压的力道恰好,而让水柱的射程正确洒落在目标区时,则施与受两者皆欢而顺利完成使命,岂非一种得心应手的小小成就?
2.2 然而一旦用力过度水注射程太远,不但腾空越过目标浪费水资源,甚至还可能因强力水压无处宣泄,以致往来源反弹造成软管自龙头上的挣脱!不仅任务失败横生挫折,而且还大捅纰漏满脸豆花呢!
2.3 反之,当握处之挤压不足以致射程太近者,则照样得不到想要的结果。过犹不及皆非所欲,唯有恰到好处才能正中下怀皆大欢喜。
Finding Lane Lines on the Road
The goals / steps of this project are the following:
Make a pipeline that finds lane lines on the roadReflect on your work in a written report Reflection
1. Describe your pipeline. As part of the description, explain how youmodified the draw_lines() function.
My pipelineconsisted of 5 steps. First, I got a image-copy and converted the images tograyscale:
Then I usedgauss blur to reduce the noise point
@(标签) [平穷发挥我的想象] [Openwrt] [Markdown] [Linux]
闲来无事 折腾点事,自从腾讯云和阿里云取消了免费的大学生服务器套餐。 ╮(╯▽╰)╭活在梦里,我已经不是大学生了呢。阿里上一个月几十上百的服务器租费,看着能让我冒一阵鸡皮疙瘩。想来自己真心没有闲钱来租一个服务器玩。要是弄个老机器开着当服务器。耗电不说,整天嗡嗡嗡的脑袋疼。思来想去,唯一满足以下几点的能让我架设服务器的只有家里的路由器了。
全天工作 :家里的路由器全天工作,星期一二四六会有个重启,喘口气;
功耗低 :12w不到的功耗,用一小时也就0.012度电,整个路由器算上家里的宽带消耗也就5~6块钱不到;
噪音小 :路由器也没机箱风扇,噪声基本为0;
性能尚可:有1核580MHZ,128RAM,跑一组静态服务,一组动态服务足以;
硬件准备 吃灰的U盘 : 路由器的FLASH是在太小,仅仅12MB,一定是不够用的,所以需要在路由器上挂载一个U盘。小米路由器MINI : 本主,MINI内核基于Openwrt,这能做的事情就太多了啊。同局域网电脑 : 用于对MINI进行配置,启动关闭服务等。 刷开发版固件 软件准备 下载开发版的ROM : 雷猴王想的很周全,刷了开发版ROM,并开启SSH后,据说没有保修,观众请三思。 ROM下载地址为:MiWiFi 官网。由于我用的是MINI,于是就下载官网开发版ROM,操作流程如下:
步骤(1)步骤(2)步骤(3)如果你是其他型号,自行查阅相关型号官方说明,路由器刷机步骤则参照截图中官方刷机教程。下载小米路由SSH工具 :有了SSH工具,用PuTTY和WinScp就可以搞事情了。将下载好的SSH工具重命名为miwifi_ssh.bin,放置于之前刷机用的U盘根目录即可。下载位置如图所示:
组装轻量级WEB服务 使用PuTTY开始搭建 接下来使用之前提到的PuTTY,点击文章中的高亮部分,即可到官网下载。下载好后,双击运行,IP地址填路由器网关地址,默认为192.168.31.1 端口号为SSH默认端口 22。然后点击Open按钮。输入用户名为root,密码为下载SSH工具时显示给你的root密码。当看到大大的ARE YOU OK,说明已经进入到小米路由的Shell中了,这是成功的一大步。
编译好的Python 这里直接提供编译好的Python下载,这个链接为MINI型号下编译好的Python2.7.5。通过之前提到的WinScp,直接解压好了,像windows平时复制黏贴文件一样,拖拽WinScp界面右侧U盘盘符下的/extdisks/sda1/python文件夹下即可。
配置Python环境变量 python的环境变量在Openwrt中的配置也很简单,打开/etc/profile 进行添加环境变量,参考如下:
vi /etc/profile 然后在文本最后,添加如下注册内容:
export PATH="/extdisks/sda1/python/bin:$PATH" 然后按ESC,再按两遍 Shift + z,保存好退出。然后直接更新环境变量。
source /etc/profile 由此Python环境变量即配置完成。尝试shell中输入python2.7,看到python呼出,即大功告成。
安装Bottle和Markdown2 在SSH下,直接运行如下:
pip install bottle markdown2 pip工具就能下载好bottle轻量web服务框架以及python的markdown2标记语言库。
开启静态服务器 首先在U盘根目录下创建WEB文件夹。然后修改系统 httpd。
vi /etc/sysapihttpd/sysapihttpd.conf 然后按 Ctrl + F,到文本末尾最后一个“}”前添加如下符合nginx语法的配置:
方法一:打开我的电脑—->>管理—–>> 服务—>>下面把VMware Authorization Service 这个服务手动开启以下就行了,注意用管理员权限执行服务;
方法二:如果上面还未能打开,打开文件路径C:\ProgramData\VMware\hostd找到dataStores.xml 删除,再重新打开服务(即执行方法一);
方法三:如果还是不行,可能是VMware Authorization Service 这个服务不再你的服务列表里,就比较麻烦了,因为这是一个授权服务,没有它,虚拟机时开不了的,需要我们以管理员的身份创建一个,下面是具体办法: 1、以管理员的身份运行命令模式 2.执行下面命令 sc create VMAuthdService binpath= “C:\Program Files (x86)\VMware\vmware-authd.exe” 注意不要有空格,C:\Program Files (x86)\VMware 这个就是你的虚拟机的安装路径,根据自己安装路径修改即可找到下面这个文件vmware-authd.exe 执行成功后再重启服务就可以运行虚拟机了
前言:平常写CSS习惯性的写 line-height: 1.5em,也见过类似line-height: 1.5,line-height: 150%这种写法,但是从来没有想过这三者有什么区别,最近突然看到有人提到这个问题,很感兴趣,于是查资料自己尝试了一下。
首先有一点要明确的是,line-height是具有继承性的,如果直接在某个元素上使用line-height,那么这三种写法是没有区别的,比如给所有的p标签添加行高属性:
p{line-height: 1.5em;} p{line-height: 1.5;} p{line-height: 150%;} 复制代码 最后的效果是一样的。
这三种方式的区别在于,给父元素设置行高的时候子元素的继承方式。
假如我们有一个父div类名为parent1,另一个父div类名为parent2,均包含了一个类名为child的子div,HTML结构如下:
<div class="parent1"> <div class="child">line-height: 1.5em;</div> </div> <br><br> <div class="parent2"> <div class="child">line-height: 1.5;</div> </div> 复制代码 CSS如下:
.parent1{ font-size:14px; line-height: 1.5em; background: #999; padding:10px } .parent2{ font-size:14px; line-height: 1.5; background: #999; padding:10px } .child{ font-size:26px; background: #ccc; } 复制代码 此时的页面如下截图:
可以看到,当设置line-height: 1.5em时,很明显子div的文字已经超出自己的行高范围了,设置line-height: 1.5时子div的文字没有超出自己的行高。
这是由于CSS继承时的计算方式区别造成的,如示例,当我们给类名为parent1的父div设置line-height:1.5em时,该div的font-size为14,此时经过计算父div的line-height为14px*1.5=21px,然后子div的line-height就会继承21px这个值,而子div的font-size为26px,自然会超出自己的行高范围。
而当我们给类名为parent2的父div设置line-height:1.5时,子div会直接继承line-height:1.5,然后计算26px*1.5=39px,不会超出自己的行高范围。
经过测试line-height: 150%和line-height: 1.5em相同,都是先计算然后把固定的行高继承给子元素,所以我们可以总结一下,继承line-height的时候,带单位的先计算再继承,不带单位的直接继承。
以上就是我对line-height这个属性一点浅显的认识。
参考资料: www.cnblogs.com/fengzheng12…
序言 当有多台物理机的时候,就要考虑使用集群的模式了,那么docker如何来使用集群来进行管理呢?在这里主要使用的是docker自带的swarm mode,也就是docker集群的管理和编排。所谓的编排就是指多台集群的管理,主机的配置,容器的调度等。
swarm mode是docker engine中自带的一种模式,很容易使用,并且无须安装其他的软件。
swarm mode的使用 在使用swarm mode的时候,几台主机上都要先安装好docker,架构如下所示:
将主机名为docker-ce的机器作为manager节点,也就是管理节点,而docker1和docker2作为工作节点。
1、 创建swarm集群
[root@docker-ce swarm]# docker swarm init --advertise-addr 192.168.1.222 (初始化集群,节点之间相互通信的ip地址为192.168.1.222,默认端口为2377)
Swarm initialized: current node (pk4p936t4e03cpse3izuws07s) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-60h71geyd7z297jfy2icektmq3ha3n5nego2znytgrzqix768e-f36psbhrnrdn9h0bop6np22xm 192.168.1.222:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
[root@docker-ce swarm]# docker info|grep -i swarm(swarm模式已经激活)
1.MySQL数据库介绍 MySQL是一种关系型数据库管理系统,关系型数据库的特点是将数据保存在不同的表中,在将这些表放在不同的数据库中,而不是将所有数据统一放在一个大仓库里,这样设计增加了MySQL的读取速度,灵活性可管理性也得到了很大的提高,访问以及管理MySQL数据库的最常用标准化语言为SQL结构化查询语言。
2.为什么选择MySQL数据库 MySQL数据库的到底有哪些优势和特点呢,让大家都选择它?
原因可能有以下几点:
(1)MySQL性能卓越,服务稳定,很少出现异常宕机。
(2)MySQL开放源代码且无版权制约,自主性及使用成本低。
(3)MySQL历史悠久,社区及用户非常活跃,遇到问题,可以寻求帮助。
(4)MySQL 软件体积小,安装使用简单,并且易于维护,安装及维护成本低。
(5)MySQL品牌口碑效应,使得企业无需考虑就直接用之 ,LAMP, LNMP(LEMP)流行架构。
(6)MySQL支持多种操作系统,提供多种API接口,支持多种开发语言,特别对流行的PHP语言有很好的支持。
3. Mysql 数据库分类与版本升级 MySQL数据库的官方网站为http://www.mysql.com。
分为社区版和商业版而这两个版本又各自分为四个版本一次发布,这四个版本为:Alpha、Beta、RC和GA版本。
这四种发布版本之间的说明及区别,如下:
(1) Alpha版
Alpha版一般只在开发的公司内部运行,不对外公开。主要是开发者对自己的产品进行测试。
(2) Beta版
Beta版一般是完成功能的开发和所有的测试工作之后的产品,不会存在较大的功能或性能BUG,邀请或提供给用户体验与测试,以便更全面的测试软件的不足之处或存在的问题。
(3) RC版
RC版属于生产环境发布之前的一个小版本或候选版,是Beta版本的测试结果收集到的BUG或缺陷之处等收集到的信息,进行修复和完善之后的产品。
(4) GA版:
GA 版属于软件产品正式发布的版本,也称生产版本的产品,一般情况下企业的生产环境都会选择GA版本的MySQL软件。
转载于:https://blog.51cto.com/10642812/2065446
idea作为功能强大,又好用的工具,广受青睐。
但是功能强大势必有个问题,就是内容太多,不易掌握。
今天分享的问题就是idea的jdk版本设置有哪几个地方。总共5个地方。
1、工程编译用的jdk,如果提示编译的jdk版本不符合要求,就要修改这边的:
2、其他的jdk版本设置:
3、其他的jdk版本设置:
4、其他的jdk版本设置:
5、其他的jdk版本设置:
Linux上的Docker Engine也依赖于另一种称为CGroup的技术。CGroups 最初叫Process Container,顾名思义就是将进程放到一个组里进行统一控制。后来改名叫Control Groups。CGroups 是 Control Groups 的缩写,它为资源管理提供了一个统一框架,可以把系统任务及其子任务整合到按资源等级划分的不同任务组内。并且对这些任务组实施不同的资源分配方案。CGroups可以限制、记录、隔离进程组所使用的物理资源(包括CPU、memory、I/O等)。
cgroups有如下四个有趣的特点:
cgroups的API以一个伪文件系统的方式实现,即用户可以通过文件操作实现cgroups的组织管理。cgroups的组织管理操作单元可以细粒度到线程级别,用户态代码也可以针对系统分配的资源创建和销毁cgroups,从而实现资源再分配和管理。所有资源管理的功能都以“subsystem(子系统)”的方式实现,接口统一。子进程创建之初与其父进程处于同一个cgroups的控制组。 相关概念 任务(task)。在 cgroups 中,任务就是系统的一个进程;
控制族群(control group)。控制族群就是一组按照某种标准划分的进程。Cgroups 中的资源控制都是以控制族群为单位实现。一个进程可以加入到某个控制族群,也从一个进程组迁移到另一个控制族群。一个进程组的进程可以使用 cgroups 以控制族群为单位分配的资源,同时受到 cgroups 以控制族群为单位设定的限制;
层级(hierarchy)。控制族群可以组织成 hierarchical 的形式,既一颗控制族群树。控制族群树上的子节点控制族群是父节点控制族群的孩子,继承父控制族群的特定的属性;
子系统(subsystem)。一个子系统就是一个资源控制器,比如 cpu 子系统就是控制 cpu 时间分配的一个控制器。子系统必须附加(attach)到一个层级上才能起作用,一个子系统附加到某个层级以后,这个层级上的所有控制族群都受到这个子系统的控制。
子系统 cgroups提供了subsystem(resource controllers)作为资源的控制器
cpu (since Linux 2.6.24; CONFIG_CGROUP_SCHED) 用来限制cgroup的CPU使用率。cpuacct (since Linux 2.6.24; CONFIG_CGROUP_CPUACCT) 统计cgroup的CPU的使用率。cpuset (since Linux 2.6.24; CONFIG_CPUSETS) 绑定cgroup到指定CPUs和NUMA节点。memory (since Linux 2.6.25; CONFIG_MEMCG) 统计和限制cgroup的内存的使用率,包括process memory, kernel memory, 和swap。devices (since Linux 2.6.26; CONFIG_CGROUP_DEVICE) 限制cgroup创建(mknod)和访问设备的权限。freezer (since Linux 2.6.28; CONFIG_CGROUP_FREEZER) suspend和restore一个cgroup中的所有进程。net_cls (since Linux 2.
小编说:目前研究人员正在使用的深度学习框架不尽相同,本文介绍了6种常见的深度学习框架,PyTorch与他们相比又有哪些优势呢?本文选自《深度学习框架PyTorch:入门与实践》
1 PyTorch的诞生 2017年1月,Facebook人工智能研究院(FAIR)团队在GitHub上开源了PyTorch,并迅速占领GitHub热度榜榜首。
作为一个2017年才发布,具有先进设计理念的框架,PyTorch的历史可追溯到2002年就诞生于纽约大学的Torch。Torch使用了一种不是很大众的语言Lua作为接口。Lua简洁高效,但由于其过于小众,用的人不是很多,以至于很多人听说要掌握Torch必须新学一门语言就望而却步(其实Lua是一门比Python还简单的语言)。
考虑到Python在计算科学领域的领先地位,以及其生态完整性和接口易用性,几乎任何框架都不可避免地要提供Python接口。终于,在2017年,Torch的幕后团队推出了PyTorch。PyTorch不是简单地封装Lua Torch提供Python接口,而是对Tensor之上的所有模块进行了重构,并新增了最先进的自动求导系统,成为当下最流行的动态图框架。
PyTorch一经推出就立刻引起了广泛关注,并迅速在研究领域流行起来。图1-2所示为Google指数,PyTorch自发布起关注度就在不断上升,截至2017年10月18日,PyTorch的热度已然超越了其他三个框架(Caffe、MXNet和Theano),并且其热度还在持续上升中。
PyTorch 和 Caffe、Theano、MXNet 的 Google 指数对比(类别为科学)
2 常见的深度学习框架简介 随着深度学习的发展,深度学习框架如雨后春笋般诞生于高校和公司中。尤其是近两年,Google、Facebook、Microsoft等巨头都围绕深度学习重点投资了一系列新兴项目,他们也一直在支持一些开源的深度学习框架。
目前研究人员正在使用的深度学习框架不尽相同,有 TensorFlow 、Caffe、Theano、Keras等,常见的深度学习框架如图2所示。这些深度学习框架被应用于计算机视觉、语音识别、自然语言处理与生物信息学等领域,并获取了极好的效果。本部分主要介绍当前深度学习领域影响力比较大的几个框架,限于笔者个人使用经验和了解程度,对各个框架的评价可能有不准确的地方。
常见的深度学习框架
2.1 Theano Theano最初诞生于蒙特利尔大学 LISA 实验室,于2008年开始开发,是第一个有较大影响力的Python深度学习框架。
Theano 是一个 Python 库,可用于定义、优化和计算数学表达式,特别是多维数组(numpy.ndarray)。在解决包含大量数据的问题时,使用 Theano 编程可实现比手写 C 语言更快的速度,而通过 GPU 加速,Theano 甚至可以比基于 CPU 计算的 C 语言快上好几个数量级。Theano 结合了计算机代数系统(Computer Algebra System,CAS)和优化编译器,还可以为多种数学运算生成定制的 C 语言代码。对于包含重复计算的复杂数学表达式的任务而言,计算速度很重要,因此这种 CAS 和优化编译器的组合是很有用的。对需要将每一种不同的数学表达式都计算一遍的情况,Theano 可以最小化编译/解析的计算量,但仍然会给出如自动微分那样的符号特征。
Theano诞生于研究机构,服务于研究人员,其设计具有较浓厚的学术气息,但在工程设计上有较大的缺陷。一直以来,Theano因难调试、构建图慢等缺点为人所诟病。为了加速深度学习研究,人们在它的基础之上,开发了Lasagne、Blocks、PyLearn2和Keras等第三方框架,这些框架以Theano为基础,提供了更好的封装接口以方便用户使用。
2017年9月28日,在Theano 1.0正式版即将发布前夕,LISA实验室负责人,深度学习三巨头之一的Yoshua Bengio 宣布Theano即将停止开发:“Theano is Dead”。尽管Theano即将退出历史舞台,但作为第一个Python深度学习框架,它很好地完成了自己的使命,为深度学习研究人员的早期拓荒提供了极大的帮助,同时也为之后深度学习框架的开发奠定了基本设计方向: 以计算图为框架的核心,采用GPU加速计算。
2017年11月,LISA实验室在 GitHub 上开启了一个初学者入门项目,旨在帮助实验室新生快速掌握机器学习相关的实践基础,而该项目正是使用PyTorch作为教学框架。
点评:由于Theano已经停止开发,不建议作为研究工具继续学习。
2.2 TensorFlow 2015年11月10日,Google宣布推出全新的机器学习开源工具TensorFlow。 TensorFlow 最初是由 Google 机器智能研究部门的 Google Brain 团队开发,基于Google 2011年开发的深度学习基础架构DistBelief构建起来的。TensorFlow主要用于进行机器学习和深度神经网络研究, 但它是一个非常基础的系统,因此也可以应用于众多领域。由于Google在深度学习领域的巨大影响力和强大的推广能力,TensorFlow一经推出就获得了极大的关注,并迅速成为如今用户最多的深度学习框架。
比如要做这道题吧,需要用到scipy库里面的函数
scipy.optimize.linprog(c, A_ub=None, b_ub=None, A_eq=None, b_eq=None, bounds=None, method='simplex', callback=None, options=None)
直接贴代码吧
from scipy import optimize as op import numpy as np c=np.array([2,3,-5]) A_ub=np.array([[-2,5,-1],[1,3,1]]) B_ub=np.array([-10,12]) A_eq=np.array([[1,1,1]]) B_eq=np.array([7]) x1=(0,7) x2=(0,7) x3=(0,7) res=op.linprog(-c,A_ub,B_ub,A_eq,B_eq,bounds=(x1,x2,x3)) print(res) 很容易发现,c指的应该是要求最大值的函数的系数数组,A_ub是应该是不等式未知量的系数矩阵,仔细观察的人应该发现,为什么第一行里面写的是[-2,5,-1]而不是[2,5,-1]呢,应该要与图里对应才对啊,原来这不等式指的是<=的不等式,那如果是>=呢,乘个负号就行了。A_eq就是其中等式的未知量系数矩阵了。B_ub就是不等式的右边了,B_eq就是等式右边了。bounds的话,指的就是每个未知量的范围了。我们看一下结果
fun: -14.571428571428571 message: 'Optimization terminated successfully.' nit: 2 slack: array([3.85714286, 0.57142857, 6.42857143, 7. , 0. ]) status: 0 success: True x: array([6.42857143, 0.57142857, 0. ])重点关注的就是第一行和最后一行了,第一行是整个结果,最后一行是每个x的结果。为什么第一行是负的呢?原来这个函数其实是求最小值的,那么求最大值,怎么办呢?很简单,仔细观察的人应该发现,之前的函数里面,我写的是-c,而不是c。那么这个函数的出来的结果其实就是-c的最小值,但很明显这恰恰是c最大值的相反数。那么答案就是14.57了,以上。
struct Point
{
double x,y;
friend Point operator - (Point a,Point b) //重载友元运算符
{
Point temp;
temp.x = a.x - b.x;
temp.y = a.y - b.y;
return temp;
}
};
Point get_pc1(Point p1, Point p2, Point p3) //求圆心
{
double a, b, c, d, e, f;
Point p;
a = 2*(p2.x-p1.x);
b = 2*(p2.y-p1.y);
c = p2.x*p2.x+p2.y*p2.y-p1.x*p1.x-p1.y*p1.y;
d = 2*(p3.x-p2.x);
e = 2*(p3.y-p2.y);
f = p3.x*p3.x+p3.y*p3.y-p2.x*p2.x-p2.y*p2.y;
p.x = (b*f-e*c)/(b*d-e*a);
尝试编译下Linux-kernel 4.14.14,使用Ubuntu 16.04 64位 系统。 Linux内核官网: https://www.kernel.org/ 内核下载链接: https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.14.14.tar.xz
kernel-4.14.14 内核文件约96MB,解压后得到linux-4.14.14目录约900MB。在终端中切换到解压后的linux-4.14.14文件目录,执行下面的命令:
1. .config 复制一份当前系统编译时的配置,在/usr/src目录下
$ ls /usr/src/ linux-headers-4.10.0-35 linux-headers-4.8.0-36 linux-headers-4.10.0-35-generic linux-headers-4.8.0-36-generic 其中,在 linux-headers-*-generic目录下存在 .config文件,复制一份到linux-4.14.14目录下
linux-4.14.14$ cp /usr/src/linux-headers-4.10.0-35-generic/.config . 2. 编译配置 可能出现的问题
$ make menuconfig *** Unable to find the ncurses libraries or the *** required header files. *** 'make menuconfig' requires the ncurses libraries. *** *** Install ncurses (ncurses-devel) and try again. *** scripts/kconfig/Makefile:202: recipe for target 'scripts/kconfig/dochecklxdialog' failed make[1]: *** [scripts/kconfig/dochecklxdialog] Error 1 Makefile:543: recipe for target 'menuconfig' failed make: *** [menuconfig] Error 2 编译出了问题,提示缺少ncurses相关的库,安装就好
之前在本地连redis一直都没什么问题,今天把redis服务放到虚拟机上,本地启动测试代码报了连接异常:
Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
at redis.clients.util.Pool.getResource(Pool.java:53) at redis.clients.jedis.JedisPool.getResource(JedisPool.java:226) at com.mmall.commom.RedisPool.getJedis(RedisPool.java:38) at com.mmall.commom.RedisPool.main(RedisPool.java:46) Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.ConnectException: Connection refused: connect at redis.clients.jedis.Connection.connect(Connection.java:207) at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:93) at redis.clients.jedis.BinaryJedis.connect(BinaryJedis.java:1767) at redis.clients.jedis.JedisFactory.makeObject(JedisFactory.java:106) at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:868) at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:435) at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:363) at redis.clients.util.Pool.getResource(Pool.java:49) ... 3 more Caused by: java.net.ConnectException: Connection refused: connect at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at java.
新手上路开车不稳 不过代码比较好理解 前端用ajax发送请求 和后端注解映射。
Demo地址: https://github.com/jsphLim/LibrarySystem 欢迎star~~
前面谈到通过 THREE.Sprite 创建粒子时,可以通过加载外部图片的方式来格式化粒子。那么,如果一幅图片中包含多种精灵的话,那又该怎么办呢?
接下来我们就来探讨一下其实现方法,例如咋们有以下图片:
一幅图片中包含 5 种精灵
我首先大概来分析一下这张图片,可以看出这张图片一共有 5 种精灵,排列方式是一行平均分布,即每一种精灵在水平方向上(U 方向)都占整幅图片的 1/5 即 0.2;而在垂直方向上(V 方向)都是占 100% 也就是 1/1=1。
好了,有了上面的分析之后,聪明的读者肯定大概已经知道从整幅图中单独加载每一种精灵的大致思路了。下面我们先给出一个完整示例,代码如下所示:
<!DOCTYPE html> <html> <head> <title>示例 07.06 - Particles UV</title> <script src="../build/three.js"></script> <script src="../build/js/controls/OrbitControls.js"></script> <script src="../build/js/libs/stats.min.js"></script> <script src="../build/js/libs/dat.gui.min.js"></script> <script src="../jquery/jquery-3.2.1.min.js"></script> <style> body { /* 设置 margin 为 0,并且 overflow 为 hidden,来完成页面样式 */ margin: 0; overflow: hidden; } /* 统计对象的样式 */ #Stats-output { position: absolute; left: 0px; top: 0px; } </style> </head> <body> <!
删除QStringList中的重复项(相同项):
1、删除相同项函数
void removeListSame(QStringList *list) { for (int i = 0; i < list->count(); i++) { for (int k = i + 1; k < list->count(); k++) { if ( list->at(i) == list->at(k)) { list->removeAt(k); k--; } } } } 2、执行例子
int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QStringList list; list<<"chen"<<"li"<<"long"<<"li"<<"long"; qDebug()<<"list: "<<list; removeListSame(&list); qDebug()<<"list: "<<list; return a.exec(); } 3、执行结果
前面很长一段时间,我们讨论了 three.js 中最重要的一些概念和相关的 API。今天开始,我们来探索一下 three.js 中一直还未提到的“粒子(particle)”概念。使用粒子可以很容易地创建出很多细小的物体,可以用来模拟雨滴、雪花和火焰等。你也可以将某个单一几何体(例如圆环)渲染成一组粒子,并分别对它们进行控制。
在旧版的 three.js 中可能会有 ParticleSystem(粒子系统) 、 ParticleMaterial(粒子材质)、ParticleCanvasMaterial(在画布上为粒子造型)等概念。但是在新版 three.js 中,没有那么多概念了,已经简化成了 Points(粒子系统)及 PointsMaterial(粒子材质)、Sprite(精灵)及 SpriteMaterial(精灵材质)两种粒子类型了(扩展插件实现除外)。因此,接下来的介绍将不再针对旧版的粒子系统进行讲解,感兴趣的读者可以自行研究。
我们先来看看一个超简单的粒子系统示例,核心代码如下:
/** 创建 10x10 个粒子 */ function createParticles() { var material = new THREE.SpriteMaterial(); var group = new THREE.Group(); for (var x = -5; x < 5; x++) { for (var y = -5; y < 5; y++) { particle = new THREE.Sprite(material); particle.position.set(x * 10, y * 10, 0); group.add(particle); } } group.
kubernetes集群卸载后docker程序无法启动问题:docker.service启动失败:Unit not found 最近在搞k8s集群,现在有外网的环境上安装了一个k8s测试集群。现在要把外网转换为内网安装生产集群。
发现把k8s相关组件卸载完之后,发现docker还是无法启动。发现报如下错误:
# Failed to start docker.service: Unit not found 安装k8s之后docker的启动需要有些依赖的服务启动之后才能启动,但是我把所有相关的服务都删除了,并且添加的依赖也在docke.service中删除了。但是docker还是无法启动。我甚至把docker都卸载了但是还是无法解决。
后来在网上查找相应的错误,找到了一篇和我的错误极为相似的问题,也是卸载k8s集群后无法启动docker。
经过检查,/etc/systemd/system/flanneld.service依然存在,并且存在/etc/systemd/system/docker.service.requires目录,在该目录下包含了软连接flanneld.service,该软链接指向了真正的flanneld.service,从而实现了两个服务的启动顺序的关联。
解决办法:
删除 /etc/systemd/system/docker.service.requires/flanneld.service,使用systemctl daemon-reload重新加载服务配置文件,最后systemctl start docker.service,发现docker启动成功了。
参考链接:
docker.service启动失败:Unit not found的原因及解决办法
各应用程序及版本
storm1.1.1zookeeper3.4.10
拓朴结构
nimbus、ui:CentOS65Appsupervisor:CentOS65M1、CentOS65M2、CentOS65M3
配置文件
zoo.cfg,zookeeper仅安装在三台supervisor服务器 server.6=CentOS65M1:2888:3888 server.7=CentOS65M2:2888:3888 server.8=CentOS65M3:2888:3888 storm.yaml,在四台服务器配置一样 storm.zookeeper.servers: - "CentOS65M1" - "CentOS65M2" - "CentOS65M3" nimbus.seeds: ["CentOS65App"] storm.zookeeper.port: 2181 storm.local.dir: "/app/data" ui.port: 9099 supervisor.slots.ports: - 6700 - 6701 - 6702 - 6703 按序启动zookeeper,nimbus,ui,supervisor storm ui可以在浏览器正常访问
http://centos65app:9099/index.html
不部署topology,集群一切正常;一旦部署了topology,supervisor就抛异常了。
./bin/storm jar /opt/storm_jars/storm-starter-1.1.1.jar org.apache.storm.starter.WordCountTopology WordCountTopology 过一两分钟,从storm ui就发现Supervisors由3变为0。逐个进入三台supervisor服务器,jps后,发现确实原来的supervisor已经不存在了。在supervisor服务器的[storm_home]/logs/supervisor.log文件发现有如下异常: 2018-01-17 11:18:45.329 o.a.s.d.s.Slot main [WARN] SLOT CentOS65M1:6700 Starting in state EMPTY - assignment null 2018-01-17 11:18:45.330 o.a.s.d.s.Slot main [WARN] SLOT CentOS65M1:6701 Starting in state EMPTY - assignment null 2018-01-17 11:18:45.
背景
大多数时候我们不希望在服务器上安装图形界面,但有时候有些程序需要图形界面,比如安装Oracle的时候。此时,可以配置让Linux使用远程的X Server进行图形界面显示。
首先要明确的是Linux X Window System的基本原理,X是一个开放的协议规范,当前版本为11,俗称X11。X Window System由客户端和服务端组成,服务端X Server负责图形显示,而客户端库X Client根据系统设置的DISPLAY环境变量,将图形显示请求发送给相应的X Server。
因此,我们只需要在远端开启一个X Server,并在目标机器上相应的设置DISPLAY变量,即可完成图形的远程显示。
“真理体验”版
环境:远程无图形机器A(IP 192.168.9.135,OS CentOS 6.2),本地有图形机器B(IP 192.168.1.135,OS CentOS 6.2),子网192.168.0.0
X Server是Gnome等桌面环境的基础,一个桌面环境通常包含了XDM(X Display Manager,通常的图形化用户登录界面就属于XDM)、窗口管理器(X Server显示的图形是没有“窗口”边框的,通过替换窗口管理器可以实现不同的视觉效果,比如实现3D效果的Compiz)等组件。
进行图形显示并不需要桌面环境,只要有X Server即可。
现在要在B机器上开启一个X Server,然后配置A机器的DISPLAY环境变量指向B上面的X Server,在A上启动一个图形程序,图形应该在B上面进行显示。
Linux提供了一个startx脚本来启动X Server,startx脚本通过调用xinit来完成此工作。xinit完成两个工作,首先在后台启动一个X Server,然后根据配置启动一系列客户端程序连接到X Server,这些客户端程序只有最后一个可以并且必须在前台运行,当这个前台的客户端程序退出时X Server将被关闭。
B机器上有桌面环境,查看进程可以看到如下进程在运行:
/usr/bin/Xorg :0 -nr -verbose -audit 4 -auth /var/run/gdm/auth-for-gdm-Ikd3i7/database -nolisten tcp vt1
这表示在display 0上运行着一个X Server,这里的X Server是Xorg。出于安全考虑,这个X Server不监听TCP连接(-nolisten tcp),所以无法通过网络连接上这个X Server。X Server可以通过TCP和域套接字进行连接,后面讲述DISPLAY变量时会详细描述。
我们可以通过startx或直接使用xinit来手动启动一个X Server,startx的选项与xinit相同,选项直接传递给xinit。xinit选项分为两个部分,以符号 “--”为界,前面是客户端选项,后面是X Server选项。
startx [ [ client ] options ... ] [ -- [ server ] [ display ] options .
前言 近来,微信小程序一直活跃在开发者的眼球中。很多开发者都投身微信小程序的开发中,而这些开发者,总是需要面对最后一道难题:如何以一种优雅的姿势来通过微信官方的审核。本文基于几天前提交审核的一次总结,写得有不当的地方,请各位大佬指正。
问题描述 先上一下微信小程序平台常见拒绝情形的说明文件。由于我提交的小程序中包含了“分享群”的按钮,所以审核未通过,未通过的原因如下:
3.2.1 小程序的页面内容中,存在诱导类行为,包括但不限于诱导分享、诱导添加、诱导关注公众号、诱导下载等,要求用户分享、添加、关注或下载后才可操作的程序,含有明示或暗示用户分享的文案、图片、按钮、浮层、弹窗等的小程序,通过利益诱惑诱导用户分享、传播的小程序,用夸张言语来胁迫、引诱用户分享的小程序,强制或诱导用户添加小程序的,都将会被拒绝; 辛辛苦苦开发的小程序,还未曾面世就要胎死腹中了吗?简直不能忍!
解决方案 曾经听过一句话:“既然我感动不了你那么我就选择放过我自己。”那么,既然我们改变不了官方规范的约束,那就避免和他的冲突。所以解决思路大致如下:
第一步,在小程序的入口文件添加一个判断机制,控制小程序的版本。第二步,编写一个简易的待提交审核版本。第三步,等待审核通过之后,再通过第一步设置的判断机制切换回正式版本。 接下来就具体说说是怎么操作的。
1、首先,我创建了一个QuickStart项目,如下图:
2、接下来就是在入口文件也就是index.wxml中添加一个判断机制,来控制小程序的版本。具体代码如下:
<!--index.wxml--> <view class="" wx:if="{{ version == '0'}}" wx:key> <!--此处为小程序第二入口,放的是能正常通过审核的简单代码--> <text>hello</text> </view> <view class="" wx:else> <!--此处为小程序第一入口,放的是正式上线后的代码,也就是提交后通不过审核的代码--> <view class="container"> <view class="userinfo"> <button wx:if="{{!hasUserInfo && canIUse}}" open-type="getUserInfo" bindgetuserinfo="getUserInfo"> 获取头像昵称 </button> <block wx:else> <image bindtap="bindViewTap" class="userinfo-avatar" src="{{userInfo.avatarUrl}}" background-size="cover"></image> <text class="userinfo-nickname">{{userInfo.nickName}}</text> </block> </view> <view class="usermotto"> <text class="user-motto">{{motto}}</text> </view> </view> </view> 接着就是在index.js中设置version的值,具体代码如下:
data: { motto: 'Hello World', userInfo: {}, hasUserInfo: false, canIUse: wx.
0 sqoop介绍 Apache Sqoop是专为Apache Hadoop和结构化数据存储如关系数据库之间的数据转换工具的有效工具。你可以使用Sqoop从外部结构化数据存储的数据导入到Hadoop分布式文件系统或相关系统如Hive和HBase。相反,Sqoop可以用来从Hadoop的数据提取和导出到外部结构化数据存储如关系数据库和企业数据仓库。
Sqoop专为大数据批量传输设计,能够分割数据集并创建Hadoop任务来处理每个区块。
sqoop的安装和下载可参考该地址
1 使用场景 Sqoop底层其实就是MapReduce,那使用Sqoop必然会存在数据延迟的问题,我个人建议哈,在数据量不是很大或者实时性要求不高的情况下,使用Sqoop还是很方便的哈,直接通过配置就可以各种数据的导入导出。如果大家学习过Spark应该知道其实Spark SQL用起来也是很方便的,给我们提供了外部数据源,方便我们对各种数据类型的读写哈。 所以怎么用看大家的自己选择,没有最好的,只有最适合自己的~。
官网
使用手册
2 查看帮助命令 查看命令帮助(sqoop help
)
[hadoop@zhangyu lib]$ sqoop help usage: sqoop COMMAND [ARGS] Available commands: codegen Generate code to interact with database records create-hive-table Import a table definition into Hive eval Evaluate a SQL statement and display the results export Export an HDFS directory to a database table help List available commands import Import a table from a database to HDFS import-all-tables Import tables from a database to HDFS import-mainframe Import datasets from a mainframe server to HDFS job Work with saved jobs list-databases List available databases on a server list-tables List available tables in a database merge Merge results of incremental imports metastore Run a standalone Sqoop metastore version Display version information See 'sqoop help COMMAND' for information on a specific command.
Helm 基本概念 Helm 可以理解为 Kubernetes 的包管理工具,可以方便地发现、共享和使用为Kubernetes构建的应用,它包含几个基本概念
Chart:一个 Helm 包,其中包含了运行一个应用所需要的镜像、依赖和资源定义等,还可能包含 Kubernetes 集群中的服务定义,类似 Homebrew 中的 formula,APT 的 dpkg 或者 Yum 的 rpm 文件,Release: 在 Kubernetes 集群上运行的 Chart 的一个实例。在同一个集群上,一个 Chart 可以安装很多次。每次安装都会创建一个新的 release。例如一个 MySQL Chart,如果想在服务器上运行两个数据库,就可以把这个 Chart 安装两次。每次安装都会生成自己的 Release,会有自己的 Release 名称。Repository:用于发布和存储 Chart 的仓库。 Helm 组件 Helm 采用客户端/服务器架构,有如下组件组成: Helm CLI 是 Helm 客户端,可以在本地执行; Tiller 是服务器端组件,在 Kubernetes 群集上运行,并管理 Kubernetes 应用程序的生命周期 ; Repository 是 Chart 仓库,Helm客户端通过HTTP协议来访问仓库中Chart的索引文件和压缩包。
安装helm 客户端 参考 https://github.com/kubernetes/helm/blob/master/docs/install.md?spm=5176.100239.blogcont159601.25.ee1b35eCYPzhZ&file=install.md 下载安装helm
tar -zxvf helm-v2.8.0-rc.1-linux-amd64.tgz mv linux-amd64/helm /usr/local/bin/helm helm help 安装helm服务端 因为网络原因,指定helm的repo为阿里云的https://kubernetes.
在arcmap 根目录下有一个文件:Normal.mxt
我的地址是:C:\Users\Administrator\AppData\Roaming\ESRI\Desktop10.1\ArcMap\Templates
将文件重命名为:OldNormal.mxt
重新运行arcmap,问题解决
操作系统:win 7/8/10 中文版 + Ubuntu 16.40 双系统运行
问题描述 在Ubuntu系统下无法打开Win分区,提示以下信息
问题解决思路 win8系统定义了一个快速启动的功能。当此功能启用的时候,win8系统并不是真实完全地关闭计算机,而是进入一个“休眠关闭”的状态,能够在启动时,把上次关机时的备份状态迅速恢复,从而达到快速启动的目的。
所以,在此功能启用的情况下,通过ubuntu系统访问win8系统分区时,提示非完全关闭分区的情况下是无法访问的(Pleaseresumeand shutdown Windows fully (no hibernation or fastrestarting))
问题解决步骤 步骤一,打开win8控制面板,点击“电源选项”按钮
步骤二,选择左侧面板中的电源按钮工作状态选项;
步骤三,点击“更改当前未启用的功能选项”
步骤四,关闭“快速启动”功能