alibaba的fastjson: 1、JSONObject转JAVABEAN `
InHospitalParam param=JSONObject.toJavaObject(args, InHospitalParam.class); JSONObject.parseObject("", InHospitalParam.class); `
其中args是JSONObject 2、JAVABEAN转JSONObject
String jsonString=JSONObject.toJSONString(param); JSONObject jSONObject=JSONObject.parseObject(jsonString);
在学习后台的权限控制,自己参考了各种资料后的新手demo,ui框架选型为大家可以参照网上的,项目架构为spring mvc + spring+mybatis,简单易用好上手!搭建好框架后开始了第一个任务,设计并实现一套简单的权限管理功能。
一套最基本的权限管理包括用户、角色、资源。
数据库设计:
资源表:tb_menu (含菜单项、菜单栏、按钮等) 角色表:tb_role(这里我没有创建中间表,所有的权限通过组合的字符串存储) 用户表:tb_users(关联角色ID获取资源权限)
注:1)、做法支持1对多,也就是用户有多对多权限控制,表的数据机构设计就靠大家自己构思啦,也可以参考我设计思路 2)、因是简单的DEMO版本,所以service层和controller层写在一起,大家实际做的时候,可不要模仿哦。
后台分发权限页面效果实现 采用ztree树来展示效果 所需JS资源下载路径:http://download.csdn.net/detail/u014799292/9502805
展示效果页: 实现代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head lang="en"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>权限功能</title> <link rel="stylesheet" href="${pageContext.request.contextPath}/js/ztree/zTreeStyle/demo.css" type="text/css"> <link rel="stylesheet" href="${pageContext.request.contextPath}/js/ztree/zTreeStyle/zTreeStyle.css" type="text/css"> <script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-1.11.3.min.js"></script> <script type="text/javascript" src="${pageContext.request.contextPath}/js/ztree/jquery-migrate-1.2.1.js"></script> <script type="text/javascript" src="${pageContext.request.contextPath}/js/ztree/jquery.ztree.core-3.5.js"></script> <script type="text/javascript" src="${pageContext.request.contextPath}/js/ztree/jquery.ztree.excheck-3.5.js"></script> </head> <body> <div class="form" align="center"> <form id="rolePowerForm" action="${pageContext.request.contextPath}/role/powerRole"> <input type="hidden" name="roleId" value="${role.roleId}"/> <input type="hidden" id="menuLinksId" name="
VS2015英文版的代码对齐快捷键是:ctrl+k和ctrl+f;
有两种方法可以修改:
(一)如果不习惯可以在tool->option->environment->keyboard中进行修改;
如下图:在Press shortcut keys中输入要改的键位,再点Assign就可以。
(二)可以在下图所指的地方更改默认主题:
如:选择visual C++ 6,更改后快捷为alt+F8。
原创文章
转载请注册来源 http://blog.csdn.net/tostq 教程目录:http://blog.csdn.net/tostq/article/details/51245979
本节我们将运行第一个多核DSP程序,熟悉CCS开发环境,学会使用CCS调试工具,主要内容如下:
(1)新建CCS项目
(2)导入Target 仿真模块
(3)使用调试工具 一、新建CCS项目
选择File/New/CCS Project
二、新建项目对话框 (1)Project name: 指项目名称,这里要注意的项目名称不区分大小写
(2)Output type: 输出类型,Executable指可执行文件(一般为.out格式,可直接下载到DSP内运行),Static Library指静态库(输出格式一般为.lib文件),我们这里的程序需要直接在DSP内运行,所以选择Executable格式
(3)Use default location: 是指项目存放的目录
(4)Device: 确定我们程序需要在什么型号的DSP下运行,如果我们选择的型号是通用型号如Generic C66xx Device,只能进行软仿真,但是如果我们有硬件评估板之类如EVMC6747,此时下面的Connection会高亮,可以选择需要硬件仿真器,如下所示: (5)Project templates and example: 可以选择项目模板,有空项目也有许多DSP自带例子,这里我们先选择Empty Project 关于项目模板的创建和使用可以参考这个文档: http://processors.wiki.ti.com/index.php/Project_Templates_in_CCS (6)Advance setting,保持默认就可以了 (7)点击Finish,完成项目创建,之后我们可以在Project Explorer看到工程项目,当前项目中只有一个Includes文件夹,项目名称旁边的[Active - Debug]是指当前项目是工作项目,当Project Explorer有多个项目时,同一时间只能有一个项目是有效的,通过单击项目就能实现切换。 三、新建与添加文件 (1)新建文件helloworld.c,选择当前项目,右键单击,选择/New/File,得到新建文件对话框,输入文件名后Finish (2)编辑文件内容,双击文件,就可以进行编辑了,DSP的语法同C语言基本一致。这里的DNUM是在c6x.h中定义,表明当前核的ID号。 (3)导入Linker文件(或叫链接命令文件),其是.cmd格式的,是项目必须的,主要是给处理器安排内存、堆、栈等方面的分配,可以自己手动生成,也可以到Ti官网上根据不同的处理器下载不同Linker文件:http://processors.wiki.ti.com/index.php/Linker_CMD_Files_for_CCS 。这里我们假设处理器平台为C6678,因此下载对应的C6678链接命令文件。 下载后C6678.cmd文件后,回到项目上,右击选择Add Files...,将C6678.cmd导入到项目中,此时出现如下对话框: 选择Copy files是将导入的文件复制到项目目录下,而Link to files只是相当于快捷方式,这里我们选择Copy files,此时我们完成了项目的文件导入,如下,还有一种导入方法,是直接将文件复制到项目目录下,然后刷新Project Explorer后就能自动导入项目需要的文件。 三、编译项目 当源文件、链接命令文件、头文件就位后,就可以进行项目编译了。项目编译有如下几种方法: (1)右击当前项目,选择Build Project (2)选择菜单栏Project,点击Build Project (3)选择工具栏上的小锤子,此时还可以切换Debug/Release 点击编译后,可能会得到如下提示,这里Console是控制命令窗口,Problems是提示错误和警告,这里的编译结果是没有错误和警告。 四、项目仿真 这里仿真是软件仿真,我们需要首先生成一个Target文件,这个文件主要目的是定义仿真器 点击选择Target Configuration File,键入目标配置文件名称后,Finish完成安装 此时Project Explorer中多了一个.
当 A页面中嵌入一个新页面B时,我们常常会使用 iframe来实现。当 A页面和 B页面在不同的域名下时,A页面就不能使用 Javascript 访问到的 B页面的高度,那么该如何解决这类问题呢?直接看例子吧。
以下是跨域时 iframe 自适应高度的一些 demo:
说明: - 以下 A 、B 和 C 分别代表 a.html 、b.html 和 c.html; - 以下例子均为 A 嵌入 B; - 以下例子仅提供了主要功能代码片段,完整的代码请到 github 中查看; - demo01是子域名的例子,其他例子为完全不同的域名。
demo01 关系: A 和 B 在不同的子域名下。
实现方式: 设置 document.domain,指定相同的 domain 后,两者就可以交互了。
domain/a.html
<script type="text/javascript"> document.domain = "aaron.com" </script> <iframe src="http://sub2.aaron.com/b.html" frameborder="0" width="100%" id="iframe-b"></iframe> subdomain/b.html
<script type="text/javascript"> document.domain = "aaron.com" window.onload = function() { var h = document.
这套笔记是跟着七月算法四月机器学习班的学习而记录的,主要记一下我再学习机器学习的时候一些概念比较模糊的地方,具体课程参考七月算法官网:
http://www.julyedu.com/ 数理统计和参数估计部分
一. 概率与数理统计
首先,看一下概率与统计的关注点
1概率论问问题的方式:
已知总体的所有可能性,求某种事件发生的概率,如图所示:
已知小桶中小球的总数和白球和黑球的个数,从小桶中取球,求取出白球或黑球的概率
2 数理统计问问题的方式(概率问题的逆向工程)
已知总体服从某种分布,抽取样本,根据样本估计总体的分布方式,如图:
现在,我们不知道小桶中有多少个小球,我们从小桶中取出一些小球,根据这些小球中白球黑球的数据,估计小桶中黑球白球的分布情况。
3. 概率统计与机器学习之间的关系:
对于一个有监督的训练模型,如下图所示:
对于一个有监督的学习模型,我们已知一些有标签的样本,通过这些样本,构造出一个模型,来估计未被标记的样本,正如有图所示。
机器学习的训练过程,类似于统计的过程,预测过程,类似于计算概率的过程。
其次,在样本中,每个样本都用其自身的特征和对应的标签,假设每一行表示一个样本,如下图:
其中,每一列对应一个分布。标签也是一个分布。因此,可以基于各个分布的特性来苹果模型和样本
总结下概率统计和机器学习的关系
i. 统计估计的是分布,机器学习训练出来的是模型,模型可能包含了很多分布。
ii.训练与预测过程的一个核心评价指标就是模型的误差
iii. 误差本身就可以是概率的形式,与概率紧密相关
iv. 对误差的不同的定义方式就演化成不同损失函数的定义方式。
3. 协方差:(关于期望方差之类的内容,这里不再说明)
定义 Cov(X,Y) = E{[X-E(X)][Y-E(Y)]} =E(XY)-E(X)E(Y)
协方差评价两个随机变量之间的关系,是两个随机变量具有相同方向变化趋势的度量
Cov(X,Y)>0, 则其变化趋势相同
Cov(X,Y)<0, 其变化趋势相反
Cov(X,Y)=0. X与Y不相关
协方差的上界:|Cov(X,Y)| <=两个变量标准差的乘积
4. 独立与不相关:
不相关,是说明X,Y 没有线性关系,即线性不相关,但是他们有没有非线性关系是不能保证的。
5. 贝叶斯公式的思考
P(A|D) = P(D|A)P(A)/P(D)
P(A|D):在给定条件D的时候A发生的概率,
D为已知的样本,
因此P(A|D)表示给定样本之后,计算分布的参数, 哪组参数取的概率越大,哪组参数就是最有可能被我们估计的那个值。
即: 给定某些样本D,在这些样本中计算结论A1, A2,...An出现的概率,P(Ai|D)。
maxP(Ai|D) = maxP(D|Ai)P(Ai)/P(D) -------> max(P(D|Ai)P(Ai)) //P(D)为常数,样本本身发生的概率
-------> max(P(D|Ai)) //假设在没有任何先验信息的情况下,P(Ai)近似等概率出现
reference link: http://blog.csdn.net/shenxiaolu1984/article/details/51066975
Region CNN(RCNN)可以说是利用深度学习进行目标检测的开山之作。作者Ross Girshick多次在PASCAL VOC的目标检测竞赛中折桂,2010年更带领团队获得终身成就奖,如今供职于Facebook旗下的FAIR。 这篇文章思路简洁,在DPM方法多年平台期后,效果提高显著。包括本文在内的一系列目标检测算法:RCNN,Fast RCNN, Faster RCNN代表当下目标检测的前沿水平,在github都给出了基于Caffe的源码。
思想 本文解决了目标检测中的两个关键问题。
问题一:速度 经典的目标检测算法使用滑动窗法依次判断所有可能的区域。本文则预先提取一系列较可能是物体的候选区域,之后仅在这些候选区域上提取特征,进行判断。
问题二:训练集 经典的目标检测算法在区域中提取人工设定的特征(Haar,HOG)。本文则需要训练深度网络进行特征提取。可供使用的有两个数据库: 一个较大的识别库(ImageNet ILSVC 2012):标定每张图片中物体的类别。一千万图像,1000类。 一个较小的检测库(PASCAL VOC 2007):标定每张图片中,物体的类别和位置。一万图像,20类。 本文使用识别库进行预训练,而后用检测库调优参数。最后在检测库上评测。
流程 RCNN算法分为4个步骤 - 一张图像生成1K~2K个候选区域 - 对每个候选区域,使用深度网络提取特征 - 特征送入每一类的SVM 分类器,判别是否属于该类 - 使用回归器精细修正候选框位置 候选区域生成 使用了Selective Search1方法从一张图像生成约2000-3000个候选区域。基本思路如下: - 使用一种过分割手段,将图像分割成小区域 - 查看现有小区域,合并可能性最高的两个区域。重复直到整张图像合并成一个区域位置 - 输出所有曾经存在过的区域,所谓候选区域
候选区域生成和后续步骤相对独立,实际可以使用任意算法进行。
合并规则 优先合并以下四种区域: 1.颜色(颜色直方图)相近的 2.纹理(梯度直方图)相近的 3.合并后总面积小的 4.合并后,总面积在其BBOX中所占比例大的
其中第三条:保证合并操作的尺度较为均匀,避免一个大区域陆续“吃掉”其他小区域。
例:设有区域a-b-c-d-e-f-g-h。较好的合并方式是:ab-cd-ef-gh -> abcd-efgh -> abcdefgh。 不好的合并方法是:ab-c-d-e-f-g-h ->abcd-e-f-g-h ->abcdef-gh -> abcdefgh。
其中第四条:保证合并后形状规则。
例:左图适于合并,右图不适于合并。 上述四条规则只涉及区域的颜色直方图、纹理直方图、面积和位置。合并后的区域特征可以直接由子区域特征计算而来,速度较快。
多样化与后处理 为尽可能不遗漏候选区域,上述操作在多个颜色空间中同时进行(RGB,HSV,Lab等)。在一个颜色空间中,使用上述四条规则的不同组合进行合并。所有颜色空间与所有规则的全部结果,在去除重复后,都作为候选区域输出。作者提供了Selective Search的源码,内含较多.p文件和.mex文件,难以细查具体实现。
特征提取 预处理数据 使用深度网络提取特征之前,首先把候选区域归一化成同一尺寸227×227。 此处有一些细节可做变化:外扩的尺寸大小,形变时是否保持原比例,对框外区域直接截取还是补灰。会轻微影响性能。
python
1, range(0,10,7)这种形式是什么意思
2,装饰器
3,迭代器
4,输出全排列,升序
string data abc
combine(string[])
abc, acb, bac, bca, cab, cba
5,lamda: 6,x=[x for x in range(1,10,7)] 含义
7,输入:ab2abc3a1 输出:abababcabcabca
8, 获取一个数字每一位上的数,并进行处理
9,
背景:
打开MapInfo 时,提示“The Microsoft Jet Engine is not available for error information”:
原因:
MapInfo为32位,而Offiece自带Access数据库为64位导致的。
解决:
卸载掉Access或
将MapInfo和Access安装相同位(32位或64位)的程序。
为什么80%的码农都做不了架构师?>>> 快捷键介绍Ctrl + F在当前文件进行文本查找 (必备)Ctrl + R在当前文件进行文本替换 (必备)Ctrl + Z撤销 (必备)Ctrl + Y删除光标所在行 或 删除选中的行 (必备)Ctrl + X剪切光标所在行 或 剪切选择内容Ctrl + C复制光标所在行 或 复制选择内容Ctrl + D复制光标所在行 或 复制选择内容,并把复制内容插入光标位置下面 (必备)Ctrl + W递进式选择代码块。可选中光标所在的单词或段落,连续按会在原有选中的基础上再扩展选中范围 (必备)Ctrl + E显示最近打开的文件记录列表Ctrl + N根据输入的 类名 查找类文件Ctrl + G在当前文件跳转到指定行处Ctrl + J插入自定义动态代码模板Ctrl + P方法参数提示显示Ctrl + Q光标所在的变量 / 类名 / 方法名等上面(也可以在提示补充的时候按),显示文档内容Ctrl + U前往当前光标所在的方法的父类的方法 / 接口定义Ctrl + B进入光标所在的方法/变量的接口或是定义出,等效于 Ctrl + 左键单击Ctrl + K版本控制提交项目,需要此项目有加入到版本控制才可用Ctrl + T版本控制更新项目,需要此项目有加入到版本控制才可用Ctrl + H显示当前类的层次结构Ctrl + O选择可重写的方法Ctrl + I选择可继承的方法Ctrl + +展开代码Ctrl + -折叠代码Ctrl + /注释光标所在行代码,会根据当前不同文件类型使用不同的注释符号 (必备)Ctrl + [移动光标到当前所在代码的花括号开始位置Ctrl + ]移动光标到当前所在代码的花括号结束位置Ctrl + F1在光标所在的错误代码出显示错误信息Ctrl + F3调转到所选中的词的下一个引用位置Ctrl + F4关闭当前编辑文件Ctrl + F8在 Debug 模式下,切换断点Ctrl + F9执行 Make Project 操作Ctrl + F11选中文件 / 文件夹,使用助记符设定 / 取消书签Ctrl + F12弹出当前文件结构层,可以在弹出的层上直接输入,进行筛选Ctrl + Tab编辑窗口切换,如果在切换的过程又加按上delete,则是关闭对应选中的窗口Ctrl + Enter智能分隔行Ctrl + End跳到文件尾Ctrl + Home跳到文件头Ctrl + Space基础代码补全,默认在 Windows 系统上被输入法占用,需要进行修改 (必备)Ctrl + Delete删除光标后面的单词或是中文句Ctrl + BackSpace删除光标前面的单词或是中文句Ctrl + 1,2,3.
How to code a proxies pool 代理的基本知识 代理服务器类型很多:HTTP代理,FTP代理,SOCKS代理。各种代理的特性如下:
HTTP代理:能够代理客户机的HTTP访问,主要是代理浏览器访问网页,它的端口一般为80、8080、3128等。FTP代理:能够代理客户机上的FTP软件访问FTP服务器,它的端口一般为21、2121。RTSP代理:代理客户机上的Realplayer访问Real流媒体服务器的代理,其端口一般为554。POP3代理:代理客户机上的邮件软件用POP3方式收发邮件,端口一般为110。SOCKS代理:SOCKS代理与其他类型的代理不同,它只是简单地传递数据包,而并不关心是何种应用协议,既可以是HTTP请求,所以SOCKS代理服务器比其他类型的代理服务器速度要快得多。SOCKS代理又分为SOCKS4和SOCKS5,二者不同的是SOCKS4代理只支持TCP协议(即传输控制协议),而SOCKS5代理则既支持TCP协议又支持UDP协议(即用户数据包协议),还支持各种身份验证机制、服务器端域名解析等。SOCK4能做到的SOCKS5都可得到,但SOCKS5能够做到的SOCKS则不一定能做到,比如我们常用的聊天工具QQ在使用代理时就要求用SOCKS5代理,因为它需要使用UDP协议来传输数据。 HTTP代理相关知识 透明代理:也叫普通代理,它不但改变了我们的请求信息,还会传送真实的IP地址。从:HTTP_X_FORWARDED_FOR等代理信息可以查到我们IP地址!匿名代理:普通匿名代理,它能隐藏客户机的真实IP,但会改变我们的请求信息。它不传送正式ip,但是可能会发送HTTP_VIA、HTTP_PROXY_CONNECTION信息,还是可以通过这些判断出使用了代理!高级匿名代理:不改变客户机的请求,这样在服务器看来就像有个真正的客户浏览器在访问它,这时客户的真实IP是隐藏的,服务器端不会认为我们使用了代理!HTTP通道:http代理服务器支持Connect请求,这类代理服务器基本可以代理所有软件,如:QQ,FoxMail,FTP等等,不支持通道的HTTP代理,基本上只支持简单的HttpGET,POST等请求服务! ###SOCKS代理知识
SOCKS5:常见SOCKS代理有Socks4,socks5,不过目前基本上以socks5代理为主,它基本支持所有客户端请求协议,Http,Ftp,Smtp等,可以具备高级匿名代理隐藏功能! 运用场景 这在某些情况下比较有用,比如IP被封了,或者比如IP访问的次数受到限制等等。
爬虫抓取思路 分布式爬虫ip代理池设置延迟抓取 网站反爬思路 针对并发数高的爬虫,可手工识别;也可在服务器端设置每个ip连接次数。通过User-Agent识别爬虫。此种情况下是针对并发连接数不是很高的爬虫而设置的。通过网站流量统计系统和日志分析来识别爬虫。有些爬虫喜欢修改User-Agent信息来伪装自己,把自己伪装成一个真实浏览器的User-Agent信息,让你无法有效的识别。这种情况下我们可以通过网站流量系统记录的真实用户访问IP来进行识别。网站的实时反爬虫防火墙实现策略 思路 定时抓代理页面,然后分析后提取.
定时获取代理源,根据需要测试的目标网站,用代理ip进行速度,超时等一些性能指标的测试.以便获取针对目标网站抓取的最佳ip.
亮点难点 就是要根据若干提供的目标网站,做多重判定(测试到每个目标网站的速度,超时).
代理池现状 一般的代理网站只有单一测试. 改进思路: 构建一个目标网站测试url池.
编写代理池相关网页 互联网网站的反爬虫策略浅析Python简单抓取原理引出分布式爬虫代理666代理IP自动切换的方法鲲鹏Web数据抓取 - 专业Web数据采集服务提供商鲲鹏免费HTTP代理列表(每3小时更新一次)一种基于连接代理优化管理的多线程网络爬虫处理方法用python爬虫抓站的一些技巧总结再次复活你的goagent代理 含代理数据相关网页 [-] http://blog.chinaunix.net/uid-23500957-id-3794837.html[-] https://linuxtoy.org/archives/python-ip.html[*] http://proxy.ipcn.org/proxylist.html[*] http://proxylist.hidemyass.com/[*] http://proxy.com.ru/[*] http://www.kuaidaili.com/ #proxy
因为搜索引擎的流行,网络爬虫已经成了很普及网络技术,除了专门做搜索的Google,Yahoo,微软,百度以外,几乎每个大型门户网站都有自己的搜索引擎,大大小小叫得出来名字得就几十种,还有各种不知名的几千几万种,对于一个内容型驱动的网站来说,受到网络爬虫的光顾是不可避免的。
一些智能的搜索引擎爬虫的爬取频率比较合理,对网站资源消耗比较少,但是很多糟糕的网络爬虫,对网页爬取能力很差,经常并发几十上百个请求循环重复抓取,这种爬虫对中小型网站往往是毁灭性打击,特别是一些缺乏爬虫编写经验的程序员写出来的爬虫破坏力极强,造成的网站访问压力会非常大,会导致网站访问速度缓慢,甚至无法访问。
手工识别和拒绝爬虫的访问 相当多的爬虫对网站会造成非常高的负载,因此识别爬虫的来源IP是很容易的事情。最简单的办法就是用netstat检查80端口的连接:
netstat -nt | grep youhostip:80 | awk '{print $5}' | awk -F":" '{print $1}'| sort | uniq -c | sort -r -n 这行shell可以按照80端口连接数量对来源IP进行排序,这样可以直观的判断出来网页爬虫。一般来说爬虫的并发连接非常高。
如果使用lighttpd做Web Server,那么就更简单了。lighttpd的mod_status提供了非常直观的并发连接的信息,包括每个连接的来源IP,访问的URL,连接状态和连接时间等信息,只要检查那些处于handle-request状态的高并发IP就可以很快确定爬虫的来源IP了。
拒绝爬虫请求既可以通过内核防火墙来拒绝,也可以在web server拒绝,比方说用iptables拒绝:
iptables -A INPUT -i eth0 -j DROP -p tcp --dport 80 -s 84.80.46.0/24 直接封锁爬虫所在的C网段地址。这是因为一般爬虫都是运行在托管机房里面,可能在一个C段里面的多台服务器上面都有爬虫,而这个C段不可能是用户宽带上网,封锁C段可以很大程度上解决问题。
通过识别爬虫的User-Agent信息来拒绝爬虫 有很多爬虫并不会以很高的并发连接爬取,一般不容易暴露自己;有些爬虫的来源IP分布很广,很难简单的通过封锁IP段地址来解决问题;另外还有很多各种各样的小爬虫,它们在尝试Google以外创新的搜索方式,每个爬虫每天爬取几万的网页,几十个爬虫加起来每天就能消耗掉上百万动态请求的资源,由于每个小爬虫单独的爬取量都很低,所以你很难把它从每天海量的访问IP地址当中把它准确的挖出来。
这种情况下我们可以通过爬虫的User-Agent信息来识别。每个爬虫在爬取网页的时候,会声明自己的User-Agent信息,因此我们就可以通过记录和分析User-Agent信息来挖掘和封锁爬虫。我们需要记录每个请求的User-Agent信息,对于Rails来说我们可以简单的在app/controllers/application.rb里面添加一个全局的before_filter,来记录每个请求的User-Agent信息:
logger.info "HTTP_USER_AGENT #{request.env["HTTP_USER_AGENT"]}" 然后统计每天的production.log,抽取User-Agent信息,找出访问量最大的那些User-Agent。要注意的是我们只关注那些爬虫的User-Agent信息,而不是真正浏览器User-Agent,所以还要排除掉浏览器User-Agent,要做到这一点仅仅需要一行shell:
grep HTTP_USER_AGENT production.log | grep -v -E 'MSIE|Firefox|Chrome|Opera|Safari|Gecko' | sort | uniq -c | sort -r -n | head -n 100 > bot.
启动MySQL服务的时候,报下面警告:
[Warning] Buffered warning: Changed limits: max_open_files: 1024 (requested 15000)
[Warning] Buffered warning: Changed limits: max_connections: 214 (requested 3000)
[Warning] Buffered warning: Changed limits: table_open_cache: 400 (requested 2000)
截图如下:
问题原因:
用户需要打开的文件数超过了上限,通过命令“ulimit -a”可查看如下信息:
可以看到该用户的最大打开文件数为1024个,而我启动的mysql服务需要打开15000个,所以出现了上述的警告。出现了这个警告后,mysql服务是正常可用的,只是性能没有达到最优。下面我们着手解决这个问题。
首先在文件sudo vi /etc/security/limits.conf中追加下面信息:
liyuming hard nofile 65535
其中liyuming为我当前使用的linux用户。截图如下:
然后退出该终端,再重启一个终端,执行命令:ulimit -n 65535。具体截图如下:
重启mysql服务,问题解决。截图如下:
Eclipse中使用自己安装的tomcat时默认web工程发布路径是wtpwebapps,而不是webapps,如果修改为webapps,此时在Eclipse中启动tomcat时,tomcat会加载两次。解决办法,删除掉tomcat重新添加一次,添加的时候注意不要点击下一步,直接点击完成,然后在Eclipse中修改tomcat的加载路径参数,如果点击下一步直接发布项目了,就无法修改项目发布到tomcat安装目录下还是Eclipse的目录下了。
上次讲述了一下Android studio Terminal的使用配置,今天又学习了一下关于Traceview和lint工具的使用。
首先来讲lint吧:
Android lint工具是Android studio中集成的一个代码提示工具,它主要负责对你的代码进行优化提示,包括xml和java文件,很强大。
编写完代码及时进行lint测试,会让我们的代码变得非常规范而且避免代码冗余。让我们及时发现代码中隐藏的问题。
举个例子:我们在代码中建立全局变量,而这个变量实际并不需要全局便利,lint在检测之后会提示我们改成局部变量,这对内存优化是一个很强大的促进手段。
如何使用:
可以看到有Inspect Code,翻译就是检测代码
点击选择whole project(整个项目)即可
效果如下:
这里提示ImageView没用添加ContentDescription属性,已经解决办法,真真是很智能,很强大。
clean Code会帮助我们检测有无可疑代码。
Android lint就讲到这。
Android TraceView的使用:
TraveView是Android studio集成的一个性能优化工具,相信很多人都知道它,但是用到它的应该不多,它的使用比较复杂,应该说理解比较复杂。它主要计算工程内方法运行所占用的时间,调用次数,以此来优化App运行效率。
例如:一个方法,占用时间比较长,但是调用次数少,那么你就要检测这个方法耗时在什么地方,由什么原因导致?
使用方法:
打开Android Device Monitor,这个大家都知道
1.选择你要调试的进程。 2.点击start mothod profiling,待图标变黑。 3.选择sample base profiling
这里需要解释一下:
Trace base profiling
整体监听,项目中所有方法都会监听,资源消耗比较大。
sample base profiling
抽样监听,以指定的频率进行抽样调查,一般不要超过5s,需要较长时间获取准确的样本数据。
再次点击start mothod profiling,就会生成检测样本。
效果如下:
上部分为时间轴,x轴表示时间,黑色区域可放大,每个区域代表每个方法的执行时间。
y轴表示每一个独立线程。
下部分Name为你所选择的颜色区块所代表的性能分析。
不同的颜色,代表不同的方法,颜色长度代表占用时间。
属性介绍:
Incl cpu time:某方法占用cpu时间(父+子) Excl cpu time:某方法本身占用cpu时间(父)
Incl Real time:某方法真正执行时间(父+子) Excl Real time:某方法自身执行时间(父)
当然还有相应所占百分比,不过多介绍。
还有Calls+RecurCall 调用次数+递归调用次数
最近学做一个软件需要在EditText中输入东西并且发送给服务器,但是输入东西后习惯性的按了Enter键居然是换行,不能发送,于是上网查了以下怎么修改Enter键功能
private EditText TranslateEditText;//软件盘的出现都是有EditText private InputMethodManager Imm; //输入设备控制器 TranslateEditText = (EditText) findViewById(R.id.translateEditText);//设置好EditText TranslateEditText.setOnKeyListener(new EditEnter_Function()); //为EditText设置软键盘监听 Imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);//获取当前输入设备软键盘 //创建键盘监听 public class EditEnter_Function implements View.OnKeyListener{ @Override public boolean onKey(View view, int i, KeyEvent keyEvent) { if(i==keyEvent.KEYCODE_ENTER){ ------------------//你所要实现功能的方法 Imm.hideSoftInputFromWindow(LinearLayoutMainActivity.getWindowToken(), 0);//实现功能之后隐藏软键盘 return true; } return false; } } 如果以上代码出现一些html的东西,请忽略,本人刚开始写的博客,不知为什么发表后代码中老是出现一些html代码,应该是我操作不对,有人知道希望能告诉我怎么避免这些错误。
使用苹果airport路由器的WDS功能扩展wifi覆盖范围的设置方法 我有一台第一代的apple airportcapsule(下称airport),一直当作主路由器使用。最近把书房换了位置,信号一直不好,想通过无线路由器进行扩展。找到了一个旧的TP-LINK路由器,这个路由器没有扩展功能,就想要换换配置,用TP-LINK做主路由器,用apple做扩展。 apple很烦人,不知道为什么不同的电脑使用apple utility设置会有不同: 我的台式机设置完参数进行airport重启时,会有5374??错误; 我的thinkpad设置完重启时会有-4错误; 实在让人抓狂。只有我的DELL笔记本能够设置成功?? 设置WDS也比较复杂,主要是一下思路,苹果所有路由器应该都可以这个方法: 1、airport 设置WDS模式 2、airport 设置成远端站,并设置主站的MAC 3、为airport设置静态ip 下面一步一步来: 1、airport重置:加电后用笔按住后面的reset按钮10s以上,指示灯快速闪烁,说明已经重置成出厂状态了; 2、等一会儿airport启动后,电脑无线网寻找这个路由器的信号,名称应该叫applexxxxxx,连接; 3、打开airport utility,查找苹果设备,应该马上能找到,设备黄灯; 4、手动设置,先airport类里面的无线菜单,按下图设,自己定密码 5、设WDS菜单,按下图设,主机站的MAC在主路由器的菜单中找到 6、设置internet类的internet菜单 7、设置internet类的TCP/IP菜单,ip地址是拍脑袋定的,只要不重就好, 一般路由器内部地址是192.168.1.1 路由器分配给其他设备的地址是192.168.1.1--192.168.1.200 这个设备的地址可以从高端选,这里选199 8、苹果设置好了,但是不要重启,要先设好TP-LINK。首先设置无线菜单 再设置静态ip菜单 9、好了,重启TP-LINK,然后更新重启airport 10、airport呈绿灯,设置成功,实测信号非常好! 来自:http://blog.sina.com.cn/s/blog_54bf41d30101piq4.html
数据挖掘建模工程师 intern
4 paradm
1, 什么是二叉查找树
2,如何前序,中序,后序遍历
3, git过程是什么样的?如何将文件推送到服务器,如何区别版本
4,设计函数,设计一种数据结构,实现最近十条浏览记录的输出。要按照访问先后排序,要去除重复的浏览记录
void newVisit(string s)获取用户输入记录,并存储到设计的数据结构中
vector Recent(int n)从上述数据结构中调取最近的10条记录,并输出显示
5, Angular JS的一个最大问题是什么?(提示:前向兼容?后向兼容?)
6, Angular JS的优点在哪,不同于其他框架的地方?
MVC面试中多次被问到
7, streaming的原理、优缺点 http://www.cnblogs.com/joyeecheung/p/3757915.html
360
1,快速排序
2,爬虫遇到对方网站屏蔽的情况怎么办
3, 堆排序
(时间复杂度最好的排序算法是什么,背下来
时间复杂度最好的查找算法是什么,背下来)
4, 金刚坐飞机问题,http://www.cnblogs.com/python27/archive/2012/04/08/2438009.html
5, 一个数组,里面存在最大值,最大值两边的数都是单调排列的,最大数左边单调递增右边单调递减,找这个数的位置。
类似与二叉查找。手写代码。
6,hadoop如何分发文件,如何上传文件到集群
7, 声音这么小,性格内向吗?。。。。(是态度谨慎么面试官并不知道)
8, 爬虫多线程?性能如何?每分钟爬多少个?(多线程多次被问到)
情况1:你定义的字段为 not null而插入时对应的字段却没值。
情况2:你定义的字段设定PRIMARY,而插入的值已经在表中存在。
在sqlite里对timestamp字段进行where语句查询时,请首先确定存储的时间格式是否是ISO 8601标准的时间字符串,也就是2011-04-10T15:45:58,或者是* 2011-04-10T 14:25:10.487 如果你的timestamp字段写入的是2011-04-11 15:45:58,可以肯定告诉你,你再怎么按时间查询都是有很大问题,明明表里有就是查不出来,所以写入新纪录时必须写入ISO 8601标准的时间字符串,在C#里用System.Data.SQLite,标准转换ISO 8601方法是datetime1.ToString("s")。 确认存储正确后,写sql语句时,也要符合ISO 8601标准,FK吧 例子: select * from table1 where logdate > '2011-04-10T15:45:58' 日期和时间之间必须加T
有时间看到别人网站的页面比较漂亮,就想给扒皮下来,学习学习。
分享一个我常用网站扒皮命令wget 这个命令可以以递归的方式下载整站,并可以将下载的页面中的链接转换为本地链接。
wget加上参数之后,即可成为相当强大的下载工具。
wget命令详解
wget -r -p -np -k http://xxx.com/xxx -r, --recursive(递归) specify recursive download.(指定递归下载)
-k, --convert-links(转换链接) make links in downloaded HTML point to local files.(将下载的HTML页面中的链接转换为相对链接即本地链接)
-p, --page-requisites(页面必需元素) get all images, etc. needed to display HTML page.(下载所有的图片等页面显示所需的内容)
-np, --no-parent(不追溯至父级) don't ascend to the parent directory.
另外断点续传用-nc参数 日志 用-o参数
网站扒皮试一下吧
执行 wget -r -p -np -k https://baidu.com/ 命令
著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:Wujunze
链接:https://wujunze.com/linux_wget.jsp
来源:wujunze.com
转载于:https://www.cnblogs.com/qulinke/articles/5381026.html
在使用SQLite的过程中(c++),如果创建一个表,如果SQL语句中包含中文字符,就会报错;如果是从数据库表中查询数据,如果数据库表中的某些字段为中文,查询结果也不能正常显示,出现这种情况的原因是因为SQLite的编码与工程的编码不一致造成的。
Sqlite的编码默认为UTF-8编码,而vc++工程中所编写的SQL语句,可能是Unciode或者ASCII码,特别是ASCII码,如果不进行转换,写入数据库以及从数据库中读出的数,都会是乱码(只针对中文字符),因此,本文主要写一下各种编码下的编码转换:
<pre class="cpp" name="code">//将ASCII码转换为UTF8编码
void ASCIIToUTF8(char cACSII[] , char cUTF8[] ) {
//先将ASCII码转换为Unicode编码
int nlen= MultiByteToWideChar(CP_ACP,0,cACSII,-1,NULL,NULL);
wchar_t *pUnicode = new wchar_t[SQL_MAX_LENTH];
memset(pUnicode,0,nlen*sizeof(wchar_t));
MultiByteToWideChar(CP_ACP,0,cACSII,-1,(LPWSTR)pUnicode,nlen);
wstring wsUnicode = pUnicode ;
//将Unicode编码转换为UTF-8编码
nlen = WideCharToMultiByte(CP_UTF8,0,wsUnicode.c_str(),-1,NULL,0,NULL,NULL);
WideCharToMultiByte(CP_UTF8,0,wsUnicode.c_str(),-1,cUTF8,nlen,NULL,NULL);
}
//将UTF-8编码转换为ASCII编码
void UTF8ToASCII(char *cUTF8 , char ASCII[])
{
string str = cUTF8 ;
//先将UTF8编码转换为Unicode编码
int nLen = MultiByteToWideChar(CP_UTF8,0,str.c_str(),-1,NULL,0);
wchar_t *pwcUnicode = new wchar_t[nLen] ;
memset(pwcUnicode,0,nLen*sizeof(wchar_t));
MultiByteToWideChar(CP_UTF8,0,str.c_str(),-1,(LPWSTR)pwcUnicode,nLen);
//将Unicode编码转换为ASCII编码
nLen = WideCharToMultiByte(CP_ACP,0,pwcUnicode,-1,NULL,0,NULL,NULL);
WideCharToMultiByte(CP_ACP,0,pwcUnicode,-1,ASCII,nLen,NULL,NULL);
} //将ASCII编码转换为Unicode编码
void ASCIIToUnicode(char cASCII[],wchar_t wcUnicode[])
{
int nlen= MultiByteToWideChar(CP_ACP,0,cASCII,-1,NULL,NULL);
MultiByteToWideChar(CP_ACP,0,cASCII,-1,(LPWSTR)wcUnicode,nlen);
} //将Unicode编码转换为UTF-8编码
void UnicodeToUTF8(wchar_t wcUnicode[] , char cUTF8[] )
{
wstring wsUnicode = wcUnicode ;
int nLen = WideCharToMultiByte(CP_UTF8,0,wsUnicode.
3GPP 24301: 5.5.1.1
The attach procedure is used to attach to an EPC for packet services in EPS.
The attach procedure is used for three purposes:
· by a UE in PS mode of operation to attach for EPS services only;· by a UE in CS/PS mode 1 or CS/PS mode 2 of operation to attach for both EPS and non-EPS services; or· to attach for emergency bearer services. The Attach Type indicates the purpose of the attach and as in most of other procedure, the attach type is also determined by a kind of mutual agreement between UE and Network.
前言 历时将近6年的时间来制定的新 ECMAScript 标准 ECMAScript 6(亦称 ECMAScript Harmony,简称 ES6)终于在 2015 年 6 月正式发布。自从上一个标准版本 ES5 在 2009 年发布以后,ES6 就一直以 新语法 、 新特性 的优越性吸引著众多 JavaScript 开发者,驱使他们积极尝鲜。
虽然至今各大浏览器厂商所开发的 JavaScript 引擎都还没有完成对 ES2015 中所有特性的完美支持,但这并不能阻挡工程师们对 ES6 的热情,于是乎如 babel 、 Traceur 等编译器便出现了。它们能将尚未得到支持的 ES2015 特性转换为 ES5 标准的代码,使其得到浏览器的支持。其中,babel 因其 模块化转换器(Transformer) 的设计特点赢得了绝大部份 JavaScript 开发者的青睐,本文也将以 babel 为基础工具,向大家展示 ES2015 的神奇魅力。
笔者目前所负责的项目中,已经在前端和后端全方位的使用了 ES2015 标准进行 JavaScript 开发,已有将近两年的 ES2015 开发经验。如今 ES2015 以成为 ECMA 国际委员会的首要语言标准,使用 ES2015 标准所进行的工程开发已打好了坚实的基础,而 ES7(ES2016) 的定制也走上了正轨,所以在这个如此恰当的时机,我觉得应该写一篇通俗易懂的 ES2015 教程来引导广大 JavaScript 爱好者和工程师向新时代前进。若您能从本文中有所收获,便是对我最大的鼓励。
我希望你在阅读本文前,已经掌握了 JavaScript 的基本知识,并具有一定的 Web App 开发基础和 Node.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <script src="HTML/js/jquery-1.4.1.min.js" type="text/javascript"></script> <script type="text/javascript"> var InterValObj; //timer变量,控制时间 var count = 5; //间隔函数,1秒执行 var curCount;//当前剩余秒数 function sendMessage() { curCount = count; //设置button效果,开始计时 $("#btnSendCode").attr("disabled", "true"); $("#btnSendCode").val("请在" + curCount + "秒内输入验证码"); InterValObj = window.setInterval(SetRemainTime, 1000); //启动计时器,1秒执行一次 //向后台发送处理数据 $.ajax({ type: "POST", //用POST方式传输 dataType: "text", //数据格式:JSON url: 'Login.ashx', //目标地址 data: "dealType=" + dealType +"&uid=" + uid + "&code=" + code, error: function (XMLHttpRequest, textStatus, errorThrown) { }, success: function (msg){ } }); } //timer处理函数 function SetRemainTime() { if (curCount == 0) { window.
目录:
第一部分: iOS 学习资源整理(包括视频/教程/博客/书记/插件/社区/网站)
第一部分: iOS 各大牛博客列表
第一部分: iOS github 上托管的各类第三方
----------------------------------------------------------------------------------------------------------------------------------
iOS 学习最全资料 这份学习资料是为 iOS 初学者所准备的, 旨在帮助 iOS 初学者们快速找到适合自己的学习资料, 节省他们搜索资料的时间, 使他们更好的规划好自己的 iOS 学习路线, 更快的入门, 更准确的定位的目前所处的位置.
该文档会持续更新, 同时也欢迎更多具有丰富经验的 iOS 开发者将自己的常用的一些工具, 学习资料, 学习心得等分享上来, 我将定期筛选合并, 文档尚有一些不完善之处, 也请不吝指出, 感谢您对 iOS 所做的贡献, 让我们一起把国内的 iOS 做得更好, 谢谢.
视频教程(英文)
视频简介Developing iOS 7 Apps for iPhone and iPad斯坦福开放教程之一, 课程主要讲解了一些 iOS 开发工具和 API 以及 iOS SDK 的使用, 属于 iOS 基础视频iPad and iPhone Application Development该课程的讲师 Paul Hegarty 是斯坦福大学软件工程学教授, 视频内容讲解得深入, 权威, 深受好评Advanced iPhone Development - Fall 2010iOS 开发的进阶课程, 开始涉及到 Core Animation, Core Data, OpenGL 等框架的应用iOS Dev Center苹果官方提供的 iOS 学习视频LyndaLynda 上面 iOS 和 Objective-C 的学习资料比较多, 从初级到高级的都有, 覆盖面比较广, 无论 iOS 走到哪个层次, 都可以在上面挑到适合自己的课程Code SchoolCodeSchool 上面的 iOS 不多, 不过质量都不错, 一些课程也挺有趣的UdemyUdemy 帮助初学者规划了视频学习路线, 从新手到高级分的比较详细Developing iOS 8 Apps with Swift斯坦福白胡子老爷爷最新的 iOS8 和 Swift 课程, 现在 GitHub 上面也有人在翻译 视频教程(中文) 视频简介iOS 7 应用开发斯坦福白胡子老爷爷的系列视频, 所有视频皆完成翻译, 视频较新, 翻译质量也很高iPhone 开发教程 2010 年冬全部视频翻译完毕, 较为深入的讲解 iPhone 开发, 视频适合给有一定 Objective-C 基础的人观看使用 Swift 开发 iOS8 App 实战慕课网的视频, 主要讲 Swift 的一些基本使用, 并在讲解的过程中做了几个小 APP, 最后还讲了 Sketch 制作分享按钮征战 Objective-C视频还未完结, 讲了一些 C 和 Objective-C 的基本语法, 适合零基础的人观看Developing iOS 8 Apps with SwiftGitHub 上正在翻译的斯坦福最新的 iOS8 课程, 目前正在翻译, 未完结 书籍 书籍名称推荐理由Objective-C Programming内容不多, 却都是精华, 有了一点 C 语言基础可以快速阅读此书, 大概一天时间就可以看完, 看完后对 iOS 开发能够有个基本的印象, 该书的官方论坛有各个章节习题的解答.
1,给一个list,里面是一组数字,不大于25,搜索里面相加之和为25的两个数。如何使时间复杂度与list长度N无关。
提示:使用hash map的数据结构
2,python的日志分析脚本到底完成了什么,解决了什么难点
3,css中 absolute的含义。如何调整参数使一个div覆盖一个固定的button。以及为什么这样做
4,angular js的MVC实现过程,如何从用户的提交发送请求到返回结果。详细描述
5,项目中有什么难点,如何解决的
你做的事情有什么意义
6,对一个排好序的数组,再按照绝对值大小进行排序,输出。
算法复杂度是多少
7,if / if ... else不是循环。 break能否跳出语句块而不是循环
centos 6.4 64位,现在与大爱分享一下修改TCP连接数(centos实测) !
一、 文件数限制修改
(1) vi /etc/security/limits.conf
在末尾追加
* soft nofile 10240
* hard nofile 10240
(2) vi /etc/pam.d/login
在末尾追加
session required /lib/security/pam_limits.so
二、 网络端口限制修改
vi /etc/sysctl.conf
net.nf_conntrack_max=6553600
将参数65536改为6553600
vi /proc/sys/net/nf_conntrack_max
查看修改是否成功
最新研究了一下NGINX+TOMCAT 配置 HTTS。其实还是比较简单。知识其中有些流程如果没有搞清楚,还是容易被绕晕。在此简单的分享一下。
首先服务器采用的是 NGINX 负载了两台TOMCAT。这里容易误会成NGINX和tomcat的证书需要有所关联,其实不然。NGINX和tomcat的配置是独立开来的。可以当做两个工作来做。
先说一下服务器安装需要哪些文件。
TOMCAT : CSR文件 JKS文件 从服务商处获取的 TOMCAT服务器证书 和 服务商的中级证书
NGINX: CSR文件 KEY文件 从服务商处获得的证书文件(这里比tomcat少一个服务商中级证书,因为NGINX的证书本身包含了服务器证书和中级证书,如果申请时提供的CSR是同一个,那此处的证书实际上是 TOMCAT的服务器证书和 中级证书 拼成的一个文件。使用文档编辑器打开看一下就会明白了)
申请NGINX和TOMCAT证书文件 。这里有两种方法: 第一种(NGINX和TOMCAT使用各自的CSR文件):
1.在服务器上生成TOMCAT的 JKS,通过JKS生成 CSR。 参考:https://www.trustasia.com/help/tomcat6x-generate-csr.htm
这里特别注意 使用的 别名 和 密码 要牢记。因为按照证书时要保持一致。 2.在服务器上生成NGINX 的 CSR文件 和 KEY文件。 参考:https://www.trustasia.com/help/nginx-generate-csr.htm 也可以方便的使用在线生成工具:https://www.trustasia.com/tools/csr-generator/
网上相关的文章很多,这里就不多说了。 需要特别注意此处生成的CSR只使用于NGINX。TOMCAT服务器必须要有JKS(这里也可以是kestore,其本质就是一个密钥存储的容器)。
经过以上两部可以得到 NGINX的CSR文件和tomcat的CSR文件。将两个CSR分别提交申请。可以获得相应的证书文件。
第二种(NGINX和TOMCAT使用同一CSR文件)
1.在服务器上生成TOMCAT的 JKS,通过JKS生成 CSR。 参考:https://www.trustasia.com/help/tomcat6x-generate-csr.htm 这里特别注意 使用的 别名 和 密码 要牢记。因为按照证书时要保持一致。 2.NGINX的CSR可以使用TOMCAT的CSR。这样我们必须要通过TOMCAT的JKS文件生成 NGINX的KEY文件。参考:http://blog.csdn.net/maotongbin/article/details/51064272
通过CSR申请获得证书文件,你会发现NGINX的证书文件,实际上就是TOMCAT两个证书文件拼成的一个文件。
最后提供两个校验方法:
CSR校验:https://cryptoreport.websecurity.symantec.com/checker/views/csrCheck.jsp
校验 证书 、CSR、KEY是否一致:
symfile:ssl2016>openssl x509 -noout -modulus -in 证书.
1. 选择器:IE6.0及以下不兼容,其它主流浏览器都兼容
新增的属性选择器:
[att^='value'] :属性 att 的值以指定值value开始 [att$='value']:属性 att 的值以指定值value结束 [att*='value']:属性 att 的值包含指定值value,而无论其位置 新引入连字符的兄弟选择器:
如:div ~ img{.....} 选择特定的 div 标签的同级的所有图片
2. RBGA透明度:IE系列全不支持,Weskit核心系列、Firefox 3+ 和Opera 9.5+支持
background: rgba(255, 0, 0, 0.5 ) : 最后一个参数表示透明度</span> rgba的透明度只影响指定元素,而Opacity还会影响到指定元素的子元素
3. 多栏布局: Webkit核心系列和Firefox 2+支持
在Webkit核心系列浏览器(safari、chrome等)中使用时,加'-webkit' 前缀
-webkit-column-count : 3 ; 分栏总数 -webkit-column-gap : 1.5em ; 栏之间的间距 -webkit-column-rule : 1px solid #999 ; 栏间分割线 在Firefox览器中使用时,加'-moz' 前缀 -moz-column-count : 3 ; -moz-column-gap : 1.5em ; -moz-column-rule : 1px solid #999 ; 4.
成组链接法是UNIX/Linux等大型文件系统采用的文件空间管理方法。在UNIX/Linux系统中,将空闲块分成若干组,每100个空闲块为一组,每组的第一个空闲块登记了下一组空闲块的物理盘块号和空闲块总数。如果一组的第一个空闲块号等于0,则有特殊的含义,意味着该组是最后一组,即无下一个空闲块。平时整个链接信息保存于计算机系统磁盘上的系统区,系统启动以后,第一组的链接信息经缓冲区复制到内存专用块中。如图1-2所示。
图1-2 UNIX/Linux系统空闲块成组链接示意图
分配空闲磁盘块时,总是先把专用块中的空闲块计数减1,以它为指针找到专用块的相应表项,其内容就是要分配的空闲磁盘块号。当空闲计数减1后等于0时,专用块中仅剩1个磁盘块号,此时要取出表项中磁盘块号(设为i),再把此盘块中所保存的下一组空闲磁盘块链接信息经缓冲区复制到内存专用块中,然后把当前磁盘块i分配出去。释放存储块时,将盘块号记录在由专用块所指示的表项中,然后空闲块计数加1。若发现此表已满(达100项),则应把整个表经缓冲区复制到下面要释放的磁盘块中,然后将释放块的块号写入专用块中的第一个位置,置空闲计数为1。搜索到磁盘块中的第一项是0时,系统应向操作员发出警告,表明空闲块已经用完。
Problem Description CA is a fine comrade who loves the party and people; inevitably she loves GCD (greatest common divisor) too. Now, there are N different numbers. Each time, CA will select several numbers (at least one), and find the GCD of these numbers. In order to have fun, CA will try every selection. After that, she wants to know the sum of all GCDs. If and only if there is a number exists in a selection, but does not exist in another one, we think these two selections are different from each other.
现在我将阐述我所了解的优化常识,来让 UITableViews 更快和更流畅。
使用内置工具
第一点:是即使要显示更多内容,也要重用 cell/header/footer 的单个实例(single instance)。这是优化 UIScrollView(UITableView 的父类)最显著的方式,苹果工程师已在回收机制上做了处理。正确的做法是,你应该持有唯一的 cell/header/footer 类,且只初始化了一次,并返回给 UITableView 来重用该对象。但有一点需要重视:需要在 UITableView 的数据源中实现 tableView:cellForRowAtIndexPath: 方法,在方法中调用每个 cell 并应尽可能让方法快速运行。所以你必须尽可能迅速地返回重用的 cell 对象。在该方法中,不要进行数据绑定(perform data binding),因为在当前在界面上还没有 cell。为此,你可以在 UITableView 的委托(代理)中使用 tableView:willDisplayCell:forRowAtIndexPath: 方法,该方法会在 UITableView 的 bounds 里显示 cell 之前被准确调用。
第二点:该工具只用于设置 UITableView 的固定行高是没意义的,但如果你的上下文出于某种原因需要动态设置 cell 的高度,那么你可能很容易得到起伏不定的滚动。我们知道,UITableView 只是 UIScrollView 的子类,可以让用户在比可视范围更大的区域内进行交互。任何 UIScrollView 对象通过诸如 contentSize、contentOffset 等东西来显示符合要求的矩形给用户。但 UITableView 哪里出问题了?正如前面讲到的,UITableView 不会同时保留所有的 cell。相反,它仅仅显示必要的 cell 给用户。那么,UITableView 是如何得知它的 contentSize 的呢?它仅仅是计算了所有 cell 的高度总和。UITableView 的 tableView: heightForRowAtIndexPath:委托方法会为每个 cell(即使它不显示)调用一次,所以你应当非常迅速返回当前 cell 的高度。大多数人会犯巨大的错误,通过通过边界(bound)数据布局初始化过的 cell,并取得它们高度。如果你想提高滚动性能,那么就不该用这种方式去计算 cell 的高度,因为这样会造成一切的东西都极其的慢,60 FPS 是 iOS 的显示标准,这样做就会下降到 15~20,并且你的滚动操作会变得迟缓、卡顿。
今天在联调微信支付,遇到下面这个问题 这种只有一个确定按钮的真的是让人抓狂了,点击后返回的状态竟然是-2,用户取消。
1、只显示一个确定按钮
遇到这个问题基本是:传递接口的字段导致的问题(也就是发起请求的参数传错了)
可能出现的问题点:
1、注意一下 nonceStr 需要是第一步里生成的 nonceStr,而不是重新生成。 2、package = @"Sign=WXPay" 注意服务器传来的"="会不会被转义成 %3D 3、sign需要大写。
iOS集成微信支付总体来说还是比较容易的(如果没有那些坑的话),所有文档都在:
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_1
甚至只要看:
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_3
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5
这两部分就可以搞定。
遇到的大部分问题来自于另一个非常常用的第三方:友盟分享
2、onResp不回调
来自跟友盟分享的冲突。
+(BOOL)handleOpenURL:(NSURL *)url wxApiDelegate:(id<WXApiDelegate>)wxApiDelegate; 解决办法就是判断下回调是否是微信支付
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { return [self applicationOpenURL:url]; } - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { return [self applicationOpenURL:url]; } - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary*)options { return [self applicationOpenURL:url]; } - (BOOL)applicationOpenURL:(NSURL *)url { if([[url absoluteString] rangeOfString:@"wx000000000000://pay"].location == 0) //你的微信开发者appid return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]]; else return [UMSocialSnsService handleOpenURL:url wxApiDelegate:[WXApiManager sharedManager]]; } 3、关于闪回 发起支付后,打开微信,然后立即返回到了你的程序。
项目不能正常发布运行,java heap space 不能看到结果,代码写着没感觉。
这个解决其来很简单的,很好用的哟:
window-preferences-java-installed JREs
选中已配置的JDK,edit
在新窗口中,default vm arguments:配置:-Xms128M -Xmx512M即可。
再来发布项目吧,就可以啦,跑起来妥妥的。
好不容易安装成功的oracle数据库和PLSQL,却发现不能连接到想连接的数据库,还不能应用配置管理工具建库,建监听,太忧伤。
我们看看怎么解决吧:
1、有可能你安装的只是一个客户端;
2、连接远端数据库,其实很简单:
(1)找到oracle的安装目录:oracle\product\10.2.0\network\admin\tnsnames.ora文件,增加自己想要连接的数据的信息即可:
DB=
(DESCRIPTION = (ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST = 远端的IP)(PORT=1521))
)
(CONNECT_DATA=
(SERVER=DEDICATED)
(SERVICE_NAME=数据库名)
)
)
(2)启动PLSQL:进入界面:tools-preferences下的:
oracle home:配置信息
oci library:配置信息
(3)重启PLSQL就能看到刚刚配置的数据库名啦。
medusa 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。 http://nortorm.blog.51cto.com/8134477/1335607 ############################################################
#暴力破解linux超级管理员root帐号密码medusa使用方法整理:
#
#By:nortorm
#
###########################################################
#准备工作:(下载下面软件)
1 wget http://www.foofus.net/jmk/tools/medusa-2.0.tar.gz 2 wget http://www.libssh2.org/download/libssh2-1.2.6.tar.gz
3 字典库的问题(此处用mkpasswd举例)
#正文:
首先安装libssh2-1.2.6.tar.gz
tar -zxvf libssh2-1.2.6.tar.gz -C /usr/src/
cd /usr/src/libssh2-1.2.6/
./configure ; make ; make install
接着安装medusa-2.0.tar.gz tar -zxvf medusa-2.0.tar.gz -C /usr/src/
cd /usr/src/medusa-2.0/
./configure --prefix=$HOME/medusa-2.0 --enable-debug=yes --enable-module-afp=yes --enable-module-cvs=yes --enable-module-ftp=yes --enable-module-http=yes --enable-module-imap=yes --enable-module-mssql=yes --enable-module-mysql=yes --enable-module-ncp=yes --enable-module-nntp=yes --enable-module-pcanywhere=yes --enable-module-pop3=yes --enable-module-postgres=yes --enable-module-rexec=yes --enable-module-rlogin=yes --enable-module-rsh=yes --enable-module-smbnt=yes --enable-module-smtp=yes --enable-module-smtp-vrfy=yes --enable-module-snmp=yes --enable-module-ssh=yes --enable-module-svn=yes --enable-module-telnet=yes --enable-module-vmauthd=yes --enable-module-vnc=yes --enable-module-wrapper=yes --enable-module-web-form=yes
最近学习caffe,里面自带的模型训练cifar。
要先转化数据集,去cifar官网上下载:http://www.cs.toronto.edu/~kriz/cifar.html
解压后得到:
解压路径放在:D:\CaffeProject\CaffeTest\bin\input
同时建立文件output,路径为D:\CaffeProject\CaffeTest\bin\output。
之前是使用批处理,但是一直没有转成功。键入cmd进入到dos环境下,
找到convert_cifar_data.exe所在路径,我的路径放在D:\CaffeProject\CaffeTest\bin
进入convert_cifar_data.exe所在路径,输入convert_cifar_data.exe input output leveldb,回车。
运行之后在output下生成两个文件:cifar10_test_leveldb、cifar10_train_leveldb,这两个文件里面的文件就是转换后的leveldb格式的数据。
数据库并发控制 1. 在数据库中为什么要并发控制? 答:数据库是共享资源,通常有许多个事务同时在运行。当多个事务并发地存取数据库时就会产生同时读取和/或修改同一数据的情况。若对并发操作不加控制就可能会存取和存储不正确的数据,破坏数据库的一致性。所以数据库管理系统必须提供并发控制机制。 2 .并发操作可能会产生哪几类数据不一致?用什么方法能避免各种不一致的情况? 答:并发操作带来的数据不一致性包括三类:丢失修改、不可重复读和读“脏’夕数据。 ( l )丢失修改(lost update ) 两个事务 Tl 和T2读入同一数据并修改,T2提交的结果破坏了(覆盖了) Tl 提交的结果,导致 Tl 的修改被丢失。 ( 2 )不可重复读( Non 一 Repeatable Read ) 不可重复读是指事务 Tl 读取数据后,事务几执行更新操作,使 Tl 无法再现前一次读取结果。( 3 )读“脏”数据( Dirty Read ) 读“脏’夕数据是指事务 Tl 修改某一数据,并将其写回磁盘,事务几读取同一数据后, Tl 由于某种原因被撤销,这时 Tl 已修改过的数据恢复原值,几读到的数据就与数据库中的数据不一致,则几读到的数据就为“脏”数据,即不正确的数据。避免不一致性的方法和技术就是并发控制。最常用的技术是封锁技术。也可以用其他技术,例如在分布式数据库系统中可以采用时间戳方法来进行并发控制。 3 .什么是封锁?基本的封锁类型有几种?试述它们的含义。 答:封锁就是事务 T 在对某个数据对象例如表、记录等操作之前,先向系统发出请求,对其加锁。加锁后事务 T 就对该数据对象有了一定的控制,在事务 T 释放它的锁之前,其他的事务不能更新此数据对象。封锁是实现并发控制的一个非常重要的技术。 基本的封锁类型有两种:排它锁( Exclusive Locks ,简称 x 锁)和共享锁 ( Share Locks,简称 S 锁)。排它锁又称为写锁。若事务 T 对数据对象 A 加上 X 锁,则只允许 T 读取和修改 A ,其他任何事务都不能再对 A 加任何类型的锁,直到 T 释放 A 上的锁。这就保证了其他事务在 T 释放 A 上的锁之前不能再读取和修改 A 。共享锁又称为读锁。若事务 T 对数据对象 A 加上 S 锁,则事务 T 可以读 A但不能修改 A ,其他事务只能再对 A 加 S 锁,而不能加 X 锁,直到 T 释放 A 上的 S 锁。这就保证了其他事务可以读 A ,但在 T 释放 A 上的 S 锁之前不能对 A 做任何修改。 4 .如何用封锁机制保证数据的一致性? 答: DBMS 在对数据进行读、写操作之前首先对该数据执行封锁操作,例如下图中事务 Tl 在对 A 进行修改之前先对 A 执行 xock ( A ) ,即对 A 加 x 锁。这样,当几请求对 A 加 x 锁时就被拒绝,几只能等待 Tl 释放 A 上的锁后才能获得对 A 的 x 锁,这时它读到的 A 是 Tl 更新后的值,再按此新的 A 值进行运算。这样就不会丢失 Tl 的更新。 DBMS 按照一定的封锁协议,对并发操作进行控制,使得多个并发操作有序地执行,就可以避免丢失修改、不可重复读和读“脏’夕数据等数据不一致性。 5 .什么是活锁?什么是死锁? 答: 如果事务 Tl 封锁了数据 R ,事务几又请求封锁 R ,于是几等待。几也请求封锁 R ,当 Tl 释放了 R 上的封锁之后系统首先批准了几的请求,几仍然等待。然后几又请求封锁 R ,当几释放了 R 上的封锁之后系统又批准了几的请求 … … 几有可能永远等待,这就是活锁的情形。活锁的含义是该等待事务等待时间太长,似乎被锁住了,实际上可能被激活。如果事务 Tl 封锁了数据 Rl ,几封锁了数据凡,然后 Tl 又请求封锁几,因几已封锁了几,于是 Tl 等待几释放几上的锁。接着几又申请封锁 Rl ,因 Tl 已封锁了 Rl ,几也只能等待 Tl 释放 Rl 上的锁。这样就出现了 Tl 在等待几,而几又在等待 T }的局面, T }和几两个事务永远不能结束,形成死锁。 6 .试述活锁的产生原因和解决方法。 答:活锁产生的原因:当一系列封锁不能按照其先后顺序执行时,就可能导致一些事务无限期等待某个封锁,从而导致活锁。避免活锁的简单方法是采用先来先服务的策略。当多个事务请求封锁同一数据对象时,封锁子系统按请求封锁的先后次序对事务排队,数据对象上的锁一旦释放就批准申请队列中第一个事务获得锁。 11 .请给出检测死锁发生的一种方法,当发生死锁后如何解除死锁? 答:数据库系统一般采用允许死锁发生, DBMS 检测到死锁后加以解除的方法。 DBMS 中诊断死锁的方法与操作系统类似,一般使用超时法或事务等待图法。超时法是:如果一个事务的等待时间超过了规定的时限,就认为发生了死锁。超时法实现简单,但有可能误判死锁,事务因其他原因长时间等待超过时限时,系统会误认为发生了死锁。若时限设置得太长,又不能及时发现死锁发生。 DBMS 并发控制子系统检测到死锁后,就要设法解除。通常采用的方法是选择一个处理死锁代价最小的事务,将其撤消,释放此事务持有的所有锁,使其他事务得以继续运行下去。当然,对撤销的事务所执行的数据修改操作必须加以恢复。 12 .什么样的并发调度是正确的调度? 答:可串行化( Serializable )的调度是正确的调度。可串行化的调度的定义:多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行执行它们时的结果相同,称这种调度策略为可串行化的调度。 9 .设 Tl ,几,几是如下的 3 个事务: Tl :A : = A + 2 ; T2:A : = A * 2 ; T3:A : = A **2 ; ( A <-A*A) 设 A 的初值为 0 。 ( l )若这 3 个事务允许并行执行,则有多少可能的正确结果,请一一列举出来。 答 :A 的最终结果可能有 2 、 4 、 8 、 16 。因为串行执行次序有 Tl T2T3、 Tl T3T2、T2T1T3、T2T3Tl 、T3T1T2、T3T2 Tl 。对应的执行结果是 16 、 8 · 4 · 2 · 4 · 2 。 ( 2 )请给出一个可串行化的调度,并给出执行结果 答: 最后结果 A 为 16 ,是可串行化的调度。 ( 3 )请给出一个非串行化的调度,并给出执行结果。 答:最后结果 A 为 0 ,为非串行化的调度。 ( 4 )若这 3 个事务都遵守两段锁协议,请给出一个不产生死锁的可串行化调度。 答: ( 5 )若这 3 个事务都遵守两段锁协议,请给出一个产生死锁的调度。 答: 11.试证明,若并发事务遵守两段锁协议,则对这些事务的并发调度是可串行化的。 证明:首先以两个并发事务 Tl 和T2为例,存在多个并发事务的情形可以类推。根据可串行化定义可知,事务不可串行化只可能发生在下列两种情况: ( l )事务 Tl 写某个数据对象 A ,T2读或写 A ; ( 2 )事务 Tl 读或写某个数据对象 A ,T2写 A 。 下面称 A 为潜在冲突对象。 设 Tl 和T2访问的潜在冲突的公共对象为{A1,A2 … , An }。不失一般性,假设这组潜在冲突对象中 X =(A 1 , A2 , … , Ai }均符合情况 1 。 Y ={A i + 1 , … , An }符合所情况( 2 )。 VX ∈ x , Tl 需要 XlockX ① T2 需要 Slockx 或 Xlockx ② 1 )如果操作 ① 先执行,则 Tl 获得锁,T2等待 由于遵守两段锁协议, Tl 在成功获得 x 和 Y 中全部对象及非潜在冲突对象的锁后,才会释放锁。 这时如果存在 w ∈ x 或 Y ,T2已获得 w 的锁,则出现死锁;否则, Tl 在对 x 、 Y 中对象全部处理完毕后,T2才能执行。这相当于按 Tl 、T2的顺序串行执行,根据可串行化定义, Tl 和几的调度是可串行化的。 2 )操作 ② 先执行的情况与( l )对称因此,若并发事务遵守两段锁协议,在不发生死锁的情况下,对这些事务的并发调度一定是可串行化的。证毕。 12 .举例说明,对并发事务的一个调度是可串行化的,而这些并发事务不一定遵守两段锁协议。 答: 13 .为什么要引进意向锁?意向锁的含义是什么? 答:引进意向锁是为了提高封锁子系统的效率。该封锁子系统支持多种封锁粒度。原因是:在多粒度封锁方法中一个数据对象可能以两种方式加锁 ― 显式封锁和隐式封锁。因此系统在对某一数据对象加锁时不仅要检查该数据对象上有无(显式和隐式)封锁与之冲突,还要检查其所有上级结点和所有下级结点,看申请的封锁是否与这些结点上的(显式和隐式)封锁冲突,显然,这样的检查方法效率很低。为此引进了意向锁。意向锁的含义是:对任一结点加锁时,必须先对它的上层结点加意向锁。例如事务 T 要对某个元组加 X 锁,则首先要对关系和数据库加 ix 锁。换言之,对关系和数据库加 ix 锁,表示它的后裔结点 ― 某个元组拟(意向)加 X 锁。引进意向锁后,系统对某一数据对象加锁时不必逐个检查与下一级结点的封锁冲突了。例如,事务 T 要对关系 R 加 X 锁时,系统只要检查根结点数据库和 R 本身是否已加了不相容的锁(如发现已经加了 ix ,则与 X 冲突),而不再需要搜索和检查 R 中的每一个元组是否加了 X 锁或 S 锁。 14 .试述常用的意向锁: IS 锁、 ix 锁、 SIX 锁,给出这些锁的相容矩阵。 答: IS锁:如果对一个数据对象加 IS 锁,表示它的后裔结点拟(意向)加 S 锁。例如,要对某个元组加 S 锁,则要首先对关系和数据库加 IS 锁 IX 锁:如果对一个数据对象加 ix 锁,表示它的后裔结点拟(意向功口 X 锁。例如,要对某个元组加 X 锁,则要首先对关系和数据库加 ix 锁。 SIX 锁:如果对一个数据对象加 SIX 锁,表示对它加 S 锁,再加 IX 锁,即 SIX = S + IX 。 相容矩阵: 15 .理解并解释下列术语的含义:封锁、活锁、死锁、排它锁、共享锁、并发事务的调度、可串行化的调度、两段锁协议。 答:(略,已经在上面有关习题中解答) 16 .试述你了解的某一个实际的 DBMS 产品的并发控制机制。 答:(略,参见简单介绍了有关 Oracle 的并发控制机制。 ======== 大数据量高并发的数据库优化 一、数据库结构的设计 如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,而且将会影响系统实际运行的性能。所以,在一个系统开始实施之前,完备的数据库模型的设计是必须的。 在一个系统分析、设计阶段,因为数据量较小,负荷较低。我们往往只注意到功能的实现,而很难注意到性能的薄弱之处,等到系统投入实际运行一段时间后,才发现系统的性能在降低,这时再来考虑提高系统性能则要花费更多的人力物力,而整个系统也不可避免的形成了一个打补丁工程。 所以在考虑整个系统的流程的时候,我们必须要考虑,在高并发大数据量的访问情况下,我们的系统会不会出现极端的情况。(例如:对外统计系统在7月16日出现的数据异常的情况,并发大数据量的的访问造成,数据库的响应时间不能跟上数据刷新的速度造成。具体情况是:在日期临界时(00:00:00),判断数据库中是否有当前日期的记录,没有则插入一条当前日期的记录。在低并发访问的情况下,不会发生问题,但是当日期临界时的访问量相当大的时候,在做这一判断的时候,会出现多次条件成立,则数据库里会被插入多条当前日期的记录,从而造成数据错误。),数据库的模型确定下来之后,我们有必要做一个系统内数据流向图,分析可能出现的瓶颈。 为了保证数据库的一致性和完整性,在逻辑设计的时候往往会设计过多的表间关联,尽可能的降低数据的冗余。(例如用户表的地区,我们可以把地区另外存放到一个地区表中)如果数据冗余低,数据的完整性容易得到保证,提高了数据吞吐速度,保证了数据的完整性,清楚地表达数据元素之间的关系。而对于多表之间的关联查询(尤其是大数据表)时,其性能将会降低,同时也提高了客户端程序的编程难度,因此,物理设计需折衷考虑,根据业务规则,确定对关联表的数据量大小、数据项的访问频度,对此类数据表频繁的关联查询应适当提高数据冗余设计但增加了表间连接查询的操作,也使得程序的变得复杂,为了提高系统的响应时间,合理的数据冗余也是必要的。设计人员在设计阶段应根据系统操作的类型、频度加以均衡考虑。 另外,最好不要用自增属性字段作为主键与子表关联。不便于系统的迁移和数据恢复。对外统计系统映射关系丢失(******************)。 原来的表格必须可以通过由它分离出去的表格重新构建。使用这个规定的好处是,你可以确保不会在分离的表格中引入多余的列,所有你创建的表格结构都与它们的实际需要一样大。应用这条规定是一个好习惯,不过除非你要处理一个非常大型的数据,否则你将不需要用到它。(例如一个通行证系统,我可以将USERID,USERNAME,USERPASSWORD,单独出来作个表,再把USERID作为其他表的外键) 表的设计具体注意的问题: 1、数据行的长度不要超过8020字节,如果超过这个长度的话在物理页中这条数据会占用两行从而造成存储碎片,降低查询效率。 2、能够用数字类型的字段尽量选择数字类型而不用字符串类型的(电话号码),这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接回逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。 3、对于不可变字符类型char和可变字符类型varchar 都是8000字节,char查询快,但是耗存储空间,varchar查询相对慢一些但是节省存储空间。在设计字段的时候可以灵活选择,例如用户名、密码等长度变化不大的字段可以选择CHAR,对于评论等长度变化大的字段可以选择VARCHAR。 4、字段的长度在最大限度的满足可能的需要的前提下,应该尽可能的设得短一些,这样可以提高查询的效率,而且在建立索引的时候也可以减少资源的消耗。 二、查询的优化 保证在实现功能的基础上,尽量减少对数据库的访问次数;通过搜索参数,尽量减少对表的访问行数,最小化结果集,从而减轻网络负担;能够分开的操作尽量分开处理,提高每次的响应速度;在数据窗口使用SQL时,尽量把使用的索引放在选择的首列;算法的结构尽量简单;在查询时,不要过多地使用通配符如SELECT * FROM T1语句,要用到几列就选择几列如:SELECT COL1,COL2 FROM T1;在可能的情况下尽量限制尽量结果集行数如:SELECT TOP 300 COL1,COL2,COL3 FROM T1,因为某些情况下用户是不需要那么多的数据的。 在没有建索引的情况下,数据库查找某一条数据,就必须进行全表扫描了,对所有数据进行一次遍历,查找出符合条件的记录。在数据量比较小的情况下,也许看不出明显的差别,但是当数据量大的情况下,这种情况就是极为糟糕的了。 SQL语句在SQL SERVER中是如何执行的,他们担心自己所写的SQL语句会被SQL SERVER误解。比如: select * from table1 where name='zhangsan' and tID > 10000 和执行: select * from table1 where tID > 10000 and name='zhangsan' 一些人不知道以上两条语句的执行效率是否一样,因为如果简单的从语句先后上看,这两个语句的确是不一样,如果tID是一个聚合索引,那么后一句仅仅从表的10000条以后的记录中查找就行了;而前一句则要先从全表中查找看有几个name='zhangsan'的,而后再根据限制条件条件tID>10000来提出查询结果。 事实上,这样的担心是不必要的。SQL SERVER中有一个“查询分析优化器”,它可以计算出where子句中的搜索条件并确定哪个索引能缩小表扫描的搜索空间,也就是说,它能实现自动优化。虽然查询优化器可以根据where子句自动的进行查询优化,但有时查询优化器就会不按照您的本意进行快速查询。 在查询分析阶段,查询优化器查看查询的每个阶段并决定限制需要扫描的数据量是否有用。如果一个阶段可以被用作一个扫描参数(SARG),那么就称之为可优化的,并且可以利用索引快速获得所需数据。 SARG的定义:用于限制搜索的一个操作,因为它通常是指一个特定的匹配,一个值的范围内的匹配或者两个以上条件的AND连接。形式如下: 列名 操作符 <常数 或 变量> 或 <常数 或 变量> 操作符 列名 列名可以出现在操作符的一边,而常数或变量出现在操作符的另一边。如: Name=’张三’ 价格>5000 5000<价格 Name=’张三’ and 价格>5000 如果一个表达式不能满足SARG的形式,那它就无法限制搜索的范围了,也就是SQL SERVER必须对每一行都判断它是否满足WHERE子句中的所有条件。所以一个索引对于不满足SARG形式的表达式来说是无用的。 所以,优化查询最重要的就是,尽量使语句符合查询优化器的规则避免全表扫描而使用索引查询。 具体要注意的: 1.
在Python开发(http://www.maiziedu.com/course/python-px/)编程语言中有种函数叫构造函数,在这个函数里面有一个关键词叫self,首先明确的是self只有在类的方法中才会有,独立的函数或方法是不必带有self的。下面就讲讲self关键词在构造函数中的使用方法。
构造
class FooBar:
def _int_(self):
self.somevar = 42
>>>f = FooBar()
>>>f.somevar42
重写
class A:
def hello(self):
print "Hello, I'm A"
class B(A):
def hello(self):
print "Hello, I'm B"
b = B()
b.Hello()
Hello, I'm B
属性
class Rectangle:
def _init_(self):
self.width = 0
self.height = 0
def setSize(sef, size):
self.width, self.height = size
def getSize(self):
return self.width, self.height
使用:
r = Rectangle()
r.width = 10
r.height = 5
打开vb 在左侧工具箱中找到command的图标,在窗体中适当位置创建图标,并在窗体command图标中修改为“排序”。
在左侧工具箱找到textbox的图标,在窗体中恰当位置创建图标。
在窗体中双击command图标,在弹出的对话框中输入下列代码:
Cls
me.font.size=50
Dim a As IntegerDim b As Integera = Int(Rnd * 1000)b = Int(Rnd * 1000)If a < b ThenMe.Text1.Text = "a<b"ElseIf a = b ThenMe.Text1.Text = "a=b"ElseMe.Text1.Text = "a>b"End IfEnd If在单机“运行”按钮,即可进行进行排序.
第一步:打开PhotoShop控制面板-->窗口-->动画。 (1)这时会出现最下边的动画帧一栏,可以设置动画帧的停留时间,创建和删除动画帧等。
(2)最右边的是图层面板,动画是由很多图片循环播放构成。所以每一个动画帧都会有对应的一个或更多图层。
第二步:调整动画:点击第一动画帧定位图层。 (1)点击动画帧,对应图层的前方会有小眼睛,如果两个图片都有小眼睛,说明该动画帧是由两个图层叠加构成。 第三步:存储GIF文件: 文件-->存储为WEB所用格式 (1)如果GIF文件大小有要求,可以通过缩放比例和图片像素来调整大小。 (2)点击存储按钮,存储为GIF格式,查看生成的动画。
前言 Percona XtraBackup(简称PXB)是 Percona 公司开发的一个用于 MySQL 数据库物理热备的备份工具,支持 MySQl(Oracle)、Percona Server 和 MariaDB,并且全部开源,真可谓是业界良心。我们 RDS MySQL 的物理备份就是基于这个工具做的。
项目的 blueprint 和 bug 讨论放在 Launchpad,代码之前也放在 Launchpad,现在已经迁移到 Github 啦,项目更新发布非常快,感兴趣的可以关注 :-)
本文会介绍下备份工具的工作原理,希望对大家有所帮助。
工具集 软件包安装完后一共有4个可执行文件,如下:
usr ├── bin │ ├── innobackupex │ ├── xbcrypt │ ├── xbstream │ └── xtrabackup 其中最主要的是 innobackupex 和 xtrabackup,前者是一个 perl 脚本,后者是 C/C++ 编译的二进制。
xtrabackup 是用来备份 InnoDB 表的,不能备份非 InnoDB 表,和 mysqld server 没有交互;innobackupex 脚本用来备份非 InnoDB 表,同时会调用 xtrabackup 命令来备份 InnoDB 表,还会和 mysqld server 发送命令进行交互,如加读锁(FTWRL)、获取位点(SHOW SLAVE STATUS)等。简单来说,innobackupex 在 xtrabackup 之上做了一层封装。
1 我们经常打开一个App会看到有广告图片轮播的效果,首先上效果图 2 实现的过程 2.1 轮播页面他是一个ViewPager
2.2 然后我们使用RelativeLayout来把小圆点放置在图片上,然后滑动时动态修改小圆点的背景,就产生了滑动的效果
2.3 自动滑动的效果,我们可以利用ScheduledExecutorService这个类来实现,他可以周期性的执行任务,这样就可以自动滑动了
3 要点说明 3.1 public void onPageScrollStateChanged(int arg0) {}
通过网上查找发现当ViewPager页面滑动时,arg0有三种不同的参数
①当arg0 =1使表示手势滑动
②当arg0 =2时表示页面自动滑动
④当arg0 =3,表示滑动到最后一页
3.2 通过这些参数,我们就可以然手动滑动的时候关闭自动滑动功能
3.3 当滑动到最后一面时,把ViewPager当前项设置到第一页
3.4 在写这个功能的时候,把高分辨率的图片放在了自定义的mipmap文件夹下,这样如果图片一些,就会引发内存溢出异常,当图片一大,这样程序就会需要很多的内存来加载,这在android中是不行,所以我们应该把图片放在对应的drawable文件下,就可避免这种情况,系统应该在后台自动处理了
4 下面填出实现的源代码,在最后会有完整源码的下载链接 4.1 MainActivity import android.app.ActionBar.LayoutParams; public class MainActivity extends Activity { private LayoutInflater inflater; private ViewPager mviewPager; private LinearLayout dotLayout;//底部Layout布局 private List<ImageView> dotViewList;//用于小圆点图片 private List<ImageView> list;//用于存放轮播效果图片 private int currentItem = 0;//当前页面 boolean isAutoPlay = true;//是否自动轮播 private ScheduledExecutorService scheduledExecutorService;//定时周期执行指定的任务 private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.
apache 更改默认网站目录:
1:我们测试把默认网站目录改到root家目录下 新建/root/website目录 #mkdir -p /root/website #echo "website page" >> /root/website/index.html #vi /etc/httpd/conf/httpd.conf 找到 DocumentRoot "/var/www/html" 这一段 //apache的根目录 把/var/www/html 这个目录改到 /root/website 在找到 <Directory "/var/www/html"> //定义apache /var/www/html这个区域 把 /var/www/html改成/root/website 这样我们就把apahce的默认路径改掉了 然后重启服务 #service httpd restart //这里在你重启服务的时候,可能会报错,说找不到目录,这个主要是由于selinux导致的 那怎么解决呢?有2个办法,关掉selinux #setenforce 0 或者更改/root/website这个文件的selinux属性,让它匹配httpd这个服务器的要求 怎么改?我们可以复制/var/www/html这个目录的selinux属性 #chcon -R --reference /var/www/html /root/website 然后在重启服务,之后你就看到它没有报错了 不过你去访问localhost的时候,会发现访问拒绝 这是为什么呢?主要是因为你的/root的权限是750,ahache这个用户没有权限访问,你需要更改掉权限,可以这样改 #chmod -R 755 /root 然后去访问 发现正常了
apache配置详解
要想在linux上实现网页服务器(www)需要Apache这个服务器软件,不过Apache仅能提供最基本的静态网站数据而已,想要实现动态网站的话,最好还是要PHP与MySQL的支持,所以下面我们将会以LAMP(linux+Apache+MySQL+PHP)作为安装与设置的介绍。
LAMP所需软件与其结构
httpd mysql mysql-Server php php-devel php-mysql
可以用rpm包安装,或者直接用yum安装
#yum install httpd mysql-server php php-devel php-mysql
1,
input= uid1 house: 1
uid1 car: 1 uid1 recruit: 2
uid1 house: 2
uid2 house: 1
uid2: car: 3
...
注:日志文件格式为:同一个uid的信息显示完了再显示下一个uid
用python编程实现reduce并按照如下进行输出:
output: uid1 house: 3 car: 1 recruit: 2
uid2 house: 1 car: 3
....
分析:输入为流式的,每个过程涉及两个uid变量,统计一个uid变量,并暂时存储,如果下一个变量不是这个uid变量,则将统计结果进行输出,释放该内存。开始统计下一个uid变量。
程序:
2, 二叉树的层序遍历
3,Map-Reduce框架的思想
shuffle: http://langyu.iteye.com/blog/992916
http://www.csdn.net/article/2013-01-07/2813477-confused-about-mapreduce
单词词频统计:http://www.tuicool.com/articles/uE7J7j
http://my.oschina.net/sanpeterguo/blog/215922
http://blog.csdn.net/jthink_/article/details/42745699
http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00141861202544241651579c69d4399a9aa135afef28c44000
为什么讲mapreduce时没有讲shuffle
以下是 ubutu 14.04 LTS X64 + hadoop 2.7.2 安装试用过程,不完全成功
04/13/2016
Ubuntu环境下单机模式安装hadoop,并用自带WordCount示例验证:
http://www.cnblogs.com/kinglau/p/3794433.html 已完成
注意用的例子是: bin/hadoop jar share/hadoop/mapreduce/sources/hadoop-mapreduce-examples-2.7.2-sources.jar org.apache.hadoop.examples.WordCount input output
通过cookie的getCookies()方法可获取所有cookie对象的集合;通过getName()方法可以获取指定的名称的cookie;通过getValue()方法获取到cookie对象的值。另外,将一个cookie对象发送到客户端,使用response对象的addCookie()方法。 下面通过cookie保存并读取用户登录信息的例子加深一下理解。 (1)创建index.jsp文件。在改文件中,首先获取cookie对象的集合,如果集合不为空,就通过for循环遍历cookie集合,从中找出设置的cookie(这里设置为lee),并从该cookie中提取出用户名和注册时间,再根据获取的结果显示不同的提示信息。 Java代码 <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@page import="java.net.URLDecoder" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>通过cookie保存并读取用户登陆信息</title> </head> <body> <% Cookie[] cookies=request.getCookies();//从request中获得cookie对象的集合 String user="";//登录用户 String date="";//注册时间 if(cookies!=null){ for(int i=0;i<cookies.length;i++){ if(cookies[i].getName().equals("lee")){ user=URLDecoder.decode(cookies[i].getValue().split("#")[0]);//获取用户名 date=cookies[i].getValue().split("#")[1];//获取注册时间 } } } if("".equals(user)&&"".equals(date)){ //如果没有注册 %> 游客你好,欢迎你初次光临! <form action="deal.jsp"method="post"> 请输入姓名:<input name="user"type="text"value=""> <input type="submit"value="确定"> </form> <% }else{ //已经注册 %> 欢迎[<b><%=user %><b>]再次光临<br> 你注册的时间是:<%=date %> <% } %> </body> </html> Java代码 <%@ page language="
有问题可以联系我zhangtiey@gmail.com
因为开发数据库集群,节点需要通信,必须构建基于socket的C++网络通信系统。多年前使用UPD写过P2P流媒体,但是现在需要TPC,首先使用了Nanomsg作为网络库,但是开发过程中发现其不靠谱(模式太单一,并且出了问题根本找不到解决办法)。于是又掉头回来使用原生的socket编程。发现目前比较流行的(C++)网络编程使用libevent或者libev,通过调研感觉libevent成熟一些,于是选择了libevent。
下面说一下在我们数据库集群中对网络通信的使用模式:
1. 每个节点既是客户端又是服务器
2. 每个节点互相简历长连接(短连接的话,每次通信都要建立连接代价太高)
3. 节点之间发送消息使用rpc方式,因此选用了google的protobuf
4. 多线程服务模式,即每个消息都由不同的线程处理,这样复杂的消息也不会阻塞后面的消息。
综上,我使用的是libevent+protobuf+pthread。libevent可以构建基于回调函数的socket网络库,protobuf提供rpc,pthread和libevent一起工作提供多线程方式。也可以使用std::thread,但是libevent默认支持的是pthread,你也可以在libevent中实现支持std::thread的函数,但是保险期间我还是用了pthread。下面举个具体的例子来说一下工作流程:
例如集群有10个节点,每一个节点都会和其他9个节点进行长连接,即每个节点都由9个socket,对应libevent有9个bufferevent,这9个bufferevent放入到一个eventbase里由主线程进行dispatch。每个bufferevent都有一个readcaback函数,主要这个bufferevent有消息到达,readcallback 就会被触发读取相应的消息,在read callback中把该消息丢到线程池中去处理:
线程池会分配一个线程解析消息内容,然后调用protobuf的rpc方法,rpc方法处理完会产生一个response消息,该线程再把该response消息发送回去。
客户端接收到response会触发read callback,因为客户端实际上也是服务端,所以处理流程也是一样的,read callback会把response消息丢给线程池,线程池在调用一个线程处理该response。
具体代码请见github:https://github.com/cmu-db/peloton/tree/master/src/backend/networking
对于imageview控件,如果使用layout_height=”wrap_content“ 表示高度的像素与图片的像素相同,无论scaleType使用什么都无法改变ImageView的高度
1. LVS 三种工作模式原理 1.1 LVS-DR: 通过直接路由实现虚拟服务器(VS/DR) 跟VS/TUN方法相同,VS/DR利用大多数Internet服务的非对称特点,负载调度器中只负责调度请求,而服务器直接将响应返回给客户,可以极大地提高整个集群系统的吞吐量。该方法与IBM的NetDispatcher产品中使用的方法类似,但IBM的NetDispatcher是非常昂贵的商品化产品,我们也不知道它内部所使用的机制,其中有些是IBM的专利。
VS/DR的体系结构如图3.6所示:调度器和服务器组都必须在物理上有一个网卡通过不分段的局域网相连,即通过交换机或者高速的HUB相连,中间没有隔有路由器。VIP地址为调度器和服务器组共享,调度器配置的VIP地址是对外可见的,用于接收虚拟服务的请求报文;所有的服务器把VIP地址配置在各自的Non-ARP网络设备上,它对外面是不可见的,只是用于处理目标地址为VIP的网络请求。
图3.6:VS/DR的体系结构 VS/DR的工作流程如图3.7所示:它的连接调度和管理与VS/NAT和VS/TUN中的一样,它的报文转发方法又有不同,将报文直接路由给目标服务器。在VS/DR中,调度器根据各个服务器的负载情况,动态地选择一台服务器,不修改也不封装IP报文,而是将数据帧的MAC地址改为选出服务器的MAC地址,再将修改后的数据帧在与服务器组的局域网上发送。因为数据帧的MAC地址是选出的服务器,所以服务器肯定可以收到这个数据帧,从中可以获得该IP报文。当服务器发现报文的目标地址VIP是在本地的网络设备上,服务器处理这个报文,然后根据路由表将响应报文直接返回给客户。
图3.7:VS/DR的工作流程 在VS/DR中,请求报文的目标地址为VIP,响应报文的源地址也为VIP,所以响应报文不需要作任何修改,可以直接返回给客户,客户认为得到正常的服务,而不会知道是哪一台服务器处理的。
VS/DR负载调度器也只处于从客户到服务器的半连接中,按照半连接的TCP有限状态机进行状态迁移。
1.2 LVS-NAT: 通过NAT实现虚拟服务器(VS/NAT) 由于IPv4中IP地址空间的日益紧张和安全方面的原因,很多网络使用保留IP地址(10.0.0.0/255.0.0.0、172.16.0.0/255.128.0.0和192.168.0.0/255.255.0.0)[64, 65, 66]。这些地址不在Internet上使用,而是专门为内部网络预留的。当内部网络中的主机要访问Internet或被Internet访问时,就需要采用网络地址转换(Network Address Translation, 以下简称NAT),将内部地址转化为Internets上可用的外部地址。NAT的工作原理是报文头(目标地址、源地址和端口等)被正确改写后,客户相信它们连接一个IP地址,而不同IP地址的服务器组也认为它们是与客户直接相连的。由此,可以用NAT方法将不同IP地址的并行网络服务变成在一个IP地址上的一个虚拟服务。
VS/NAT的体系结构如图3.1所示。在一组服务器前有一个调度器,它们是通过Switch/HUB相连接的。这些服务器提供相同的网络服务、相同的内容,即不管请求被发送到哪一台服务器,执行结果是一样的。服务的内容可以复制到每台服务器的本地硬盘上,可以通过网络文件系统(如NFS)共享,也可以通过一个分布式文件系统来提供。
图3.1:VS/NAT的体系结构 客户通过Virtual IP Address(虚拟服务的IP地址)访问网络服务时,请求报文到达调度器,调度器根据连接调度算法从一组真实服务器中选出一台服务器,将报文的目标地址Virtual IP Address改写成选定服务器的地址,报文的目标端口改写成选定服务器的相应端口,最后将修改后的报文发送给选出的服务器。同时,调度器在连接Hash表中记录这个连接,当这个连接的下一个报文到达时,从连接Hash表中可以得到原选定服务器的地址和端口,进行同样的改写操作,并将报文传给原选定的服务器。当来自真实服务器的响应报文经过调度器时,调度器将报文的源地址和源端口改为Virtual IP Address和相应的端口,再把报文发给用户。我们在连接上引入一个状态机,不同的报文会使得连接处于不同的状态,不同的状态有不同的超时值。在TCP连接中,根据标准的TCP有限状态机进行状态迁移;在UDP中,我们只设置一个UDP状态。不同状态的超时值是可以设置的,在缺省情况下,SYN状态的超时为1分钟,ESTABLISHED状态的超时为15分钟,FIN状态的超时为1分钟;UDP状态的超时为5分钟。当连接终止或超时,调度器将这个连接从连接Hash表中删除。
这样,客户所看到的只是在Virtual IP Address上提供的服务,而服务器集群的结构对用户是透明的。对改写后的报文,应用增量调整Checksum的算法调整TCP Checksum的值,避免了扫描整个报文来计算Checksum的开销。
在一些网络服务中,它们将IP地址或者端口号在报文的数据中传送,若我们只对报文头的IP地址和端口号作转换,这样就会出现不一致性,服务会中断。所以,针对这些服务,需要编写相应的应用模块来转换报文数据中的IP地址或者端口号。我们所知道有这个问题的网络服务有FTP、IRC、H.323、CUSeeMe、Real Audio、Real Video、Vxtreme / Vosiac、VDOLive、VIVOActive、True Speech、RSTP、PPTP、StreamWorks、NTT AudioLink、NTT SoftwareVision、Yamaha MIDPlug、iChat Pager、Quake和Diablo。
下面,举个例子来进一步说明VS/NAT,如图3.2所示:
图3.2:VS/NAT的例子 VS/NAT的配置如下表所示,所有到IP地址为202.103.106.5和端口为80的流量都被负载均衡地调度的真实服务器172.16.0.2:80和172.16.0.3:8000上。目标地址为202.103.106.5:21的报文被转移到172.16.0.3:21上。而到其他端口的报文将被拒绝。
Protocol Virtual IP Address Port Real IP Address Port Weight TCP 202.103.106.5 80 172.16.0.2 80 1 172.16.0.3 8000 2 TCP 202.103.106.5 21 172.