使用js动态添加点击事件时,click与onclick的区别

今天在做项目的时候遇到了一个问题,就是通过js动态绑定事件的问题。在网上收索了下,然后自己写了一个个很简单的DOM实验了一下! 1、jsp代码 <body> <p>定义第一个添加按钮</p> <input type="button" value="第一个按钮" id="oneAdd"/> </br> </br> </br> <p>定义一个DIV</p> <div style="width: 400px;height: 150px;border:1px solid #000;" id="div"> </div> </body> 2、js代码 <script type="text/javascript" src="js/jquery-2.1.1.min.js"></script> <script type="text/javascript"> $(function(){ //给添加按钮,首先使用click的方式 $("#oneAdd").click(function(){ //在div里面添加第二个按钮 console.log("点击了第一个按钮") $("#div").html("<input type='button' value='第二个按钮' id='twoAdd' />"); }) //给第二个按钮一个添加事件,同样是使用click的方式 //第一个方法 /*$("#twoAdd").click(function(){ console.log("点击了第二个按钮") }) //第二个方法 $("#twoAdd").on("click",function(){ console.log("点击了第二个按钮") })*/ //第三个方法 $("#div").on("click","#twoAdd",function(){ console.log($(this).attr("type")) //取消按钮一的点击事件 $("#oneAdd").off("click"); }) }) </script> 3、结果 点击第一个按钮可以正常触发cilck事件, 当启用方法一时,按钮无法正常触发click事件 当启用方法二时,按钮无法正常触发click事件 当启用方法三时,按钮可以正常触发click事件 4、总结 1、在页面初始化的时候已经给定固定的id时,cilck和onclick都可以正常使用; 2、当页面动态加载一个id时,使用click将失去作用,必须使用onclick才可以正常运行; 3、element.click()这种写法不支持给动态元素或样式绑定事件。支持给动态元素绑定事件的是.live()和.on()。live在jQquery1.7后就不推荐使用了。使用.on()时注意,on前面的元素必须在页面初始化的时候就存在静态页里面,这也是为什么方法而不能正常使用的原因。 5、参考 一、 http://blog.csdn.net/webzhuce/article/details/53981556 二、 http://blog.csdn.net/jalon2015/article/details/46535777

Apache Http 服务器安装教程

我在学习网络开发的时候需要从服务器上获得json数据,所以在自己的电脑上安装了一个本地服务器,其中遇到的一些问题,在这里都写出来。 首先,我们需要访问apache http服务器的下载网页,地址是:http://httpd.apache.org/ 我们点击最新版本2.4.25的Download,进入下一个页面 点击2.4.25中的Files For Microsoft Windows,进入下一个页面 这时我们点击第一项ApacheHaus 一般我们会点击第一项,这时会跳出一个界面,如果缺少运行环境,在这个列表的下面有VC14 Redistributable,点击这个下载运行环境。我们点击Apache 2.4 VC 14进入下一个页面。 这时注意,我们需要点击上面两个下载项,这两个分别是32位系统和64位系统,这个大家应该可以区别(下面两个可能是库),具体的点击位置在国旗左边的那个图标,点击进入会新跳转页面,就可以下载了。(真是有够曲折的) 接下来进入安装步骤,将下载下来的压缩包解压,应该是一个名叫Apache24le的文件夹和一个html文件,将Apache24le这个文件夹放到你想要放的地方,记住,这个路径一定不能有中文字符。 接着使用cmd,进入到这个文件夹的bin目录下,执行httpd -k install 应该显示下载成功。 正常情况下,我们可以通过bin目录下的ApacheMonitor.exe来启动这个服务,然后桌面任务栏会弹出小图标,点击它,start就可以了。 最终我们可以通过在浏览器中输入http://localhost或者http://127.0.0.1/来检测是否成功,成功了浏览器就会显示Apache的网页。正常情况下,如果正确启动了apache,访问网页是没有问题的。 接下来,我们讨论可能出现的问题。 1.大多数启动不成功的问题在于端口占用,默认的端口是80端口,这个我们可以在cmd中输入这样的命令来检测端口是否被占用 netstat -aon|findstr “80”(共有两个空格) 我这里显示已经被占用,那么我们需要在配置文件更改端口。 打开安装目录下的conf文件夹,其中有一个httpd.conf文件,使用记事本方式打开它(不要任意更改其中的任何一个字)。 在箭头所指的地方,将80改为其他例如8088,8081等等,如果不放心,可以使用cmd检查你所替换的端口号是否被占用。命令上面已提供。 2.配置文件中的路径 在配置文件中,是配置了相对应的安装位置的,但是我们需要对其进行更改(如果这个路径不正确,会在系统日志中显示无法找到文件) 我这里给出配置的位置,配置文件的目录上面已经说过,在conf文件夹下的httpd.conf,在这个文件中寻找ServerRoot,将其更改位你的安装目录 依照上图,更改你的安装目录就行。 3.还有一个问题是较少产生的,这里只提一下。我在第一次安装出错的时候,将安装的文件夹整个都删除了,再次安装过后,启动服务器出错,无法找到文件。这里是由于我的服务仍然存在,然而第二次安装的目录和第一次不同,然后,我将安装文件夹再次删除,再按照第一次安装的方法,将Apache24le文件夹放在第一次的那个位置,然后启动服务器就成功了。

Jquery ajax的常用方法 前后端

Ajax常用参数 <script type = "text/javascript"> $.ajax({ type: 'GET', // 这是请求的方式 可以是GET方式也可以是POST方式, 默认是GET url: ' xxx.php ', // 这是请求的连接地址 一般情况下这个地址是后台给前端的一个连接,直接写就可以 dataType: 'json', //预期后端返回的数据类型。如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息来智能判断 async: true, // 默认为true,默认为true时,所有请求均为异步请求,如果需要发送同步请求,需设置为false, timeout: 8000, // 设置请求超时时间(毫秒)。此设置将覆盖全局设置 data: { // 要传递的参数 'xxx': 'xxx', ...... }, beforeSend: function(XHR) { // 在发送请求前就开始执行 (一般用来显示loading图) }, success: function(data) { // 发送请求成功后开始执行,data是请求成功后,返回的数据 }, complete: function(XHR, TS) { //当请求完成后开始执行,无论成功或是失败都会执行 (一般用来隐藏loading图) }, error: function(xhr, textStatus, errorThrown) { // 请求失败后就开始执行,请求超时后,在这里执行请求超时后要执行的函数 } }).

Hive设置连接用户名和密码

Hive设置连接用户名和密码,操作相关步骤如下: Hive-site.xml,缺省为NONE。此处改为CUSTOM <property> <name>hive.server2.authentication</name> <value>CUSTOM</value> <description> Expects one of [nosasl, none, ldap, kerberos, pam, custom]. Client authentication types. NONE: no authentication check LDAP: LDAP/AD based authentication KERBEROS: Kerberos/GSSAPI authentication CUSTOM: Custom authentication provider (Use with property hive.server2.custom.authentication.class) PAM: Pluggable authentication module NOSASL: Raw transport </description> </property> 配置自定义验证类 hive-site.xml <property> <name>hive.server2.custom.authentication.class</name> <value>org.apache.hadoop.hive.contrib.auth.CustomPasswdAuthenticator</value> </property> 自定义验证类代码: package org.apache.hadoop.hive.contrib.auth; import javax.security.sasl.AuthenticationException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hive.conf.HiveConf; import org.slf4j.Logger; public class CustomPasswdAuthenticator implements org.apache.hive.service.auth.PasswdAuthenticationProvider{ private Logger LOG = org.

MySQL数据库知识点总结

MySQL属于关系型数据库,关系型数据库是指采用了关系模型来组织数据的数据库,而关系模型就是指二维表格模型,所以,关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。 1.mysql数据库中常用的概念有: (1)字段:表中的一列,(也叫属性); (2)记录:表中的一行,(也叫元组); (3)关键字:一组可以唯一标识记录的字段,(能根据它快速分类,检索到目的数据的关键词); (4)域:字段的取值范围,(即某一列的取值限制); (5)关系:就是数据库的表,(即数据库的表名); (6)关系模式:定义关系的描述叫关系模式,通常表示为:表名(字段1,字段2,……),(也叫表结构); (7)事务:是作为单个逻辑单元执行的一系列操作,(也就是一组不可分割的sql语句); (8)ACID:事务必须具备ACID特性, A ——>Atomic(原子性),事务必须是原子工作单位,对于数据的修改,要么全部执行,要么全部不执行。 C ——>Consistency(一致性),事务在完成时,必须使所用的数据都保持一致状态。 I ——>Isolation(隔离性),由并发事务所作的修改必须与任何其他并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态。 D ——>Durability(持久性),事务完成后,对系统的影响是永久的。 (数据库采用日志的方式来保证原子性,一致性,持久性,用锁机制来保证隔离性); (9)索引:索引是对数据库表中一列或多列的值进行排序的一种结构,(类似于书籍的目录)。 2.mysql数据库的瓶颈: (1)高并发读写性能低 由于网站的用户并发性高,往往是每秒上万次的读写请求,虽然mysql等关系型数据库勉强可以应付上万次SQL查询,但硬盘I/O往往无法承担上万次的SQL写数据请求。 (2)海量数据读写效率低 网站每天产生的数据量非常大,但是对于mysql等关系型数据库来说,对海量数据的查询和更改,效率非常低。 (3)可扩展性和可用性低 当数据量剧增的时候,无法简单的添加硬件等方法扩展性能,而是需要停机维护和数据迁移。 3.关系型数据库和非关系型数据库: (补充: 问:什么是非关系型数据库? 答:非关系型数据库也叫NoSQL,它的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。由于不可能用一种数据结构化存储应付所有的新的需求,因此,非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合。 ) (1)由于关系型数据库的一致性,使得关系型数据库可以用于所有对一致性有要求的系统中,如银行系统;但是还是由于关系型数据库的一致性,在网页应用中,一致性也不是很重要,相反,对于高并发性要求比较高,因此,非关系型数据库的地位就凸显出来了。 (2)关系型数据库通常是基于行的形式存储,而关系型数据库包括列式存储、键值对存储、文档存储、图形存储。 4.数据库的引擎: 数据库引擎是用于存储、处理和保护数据的核心服务。利用数据库引擎可控制访问权限并快速处理事务。 mysql数据库常用的引擎有:innodb和berkleydb(bdb)。 5.sql语句: (1)添加、删除用户,给权限 添加用户 insert into mysql.user(Host,User,Password) values("localhost","test",password("123456")); 删除用户 delete from user where User='test' and Host='localhost'; flush privileges; //刷新系统权限表 给予用户权限 grant all privileges on testdb.* to test@localhost identified by '123456';//把testdb数据库的所有权限给test flush privileges;//刷新系统权限表 (2)DDL:数据定义语言 Data Definition Language

sql查询使用BETWEEN ... AND()

这些值可以是数值、文本或者日期,除了日期特殊外,在sqlserver中都是左右包含! 例: select*from 表名 where 字段 between 1 and 10 相当于>=1 <=10 如果日期是长型 (2016-04-01 18:12:49.923) 用select*from 表名 where 日期列 between '2017-5-16' and '2017-5-17 ' 则只查出 16号(左包含,右不包含),因为数据库默认2017-5-17 00:00:00 想用左右包含可使用 select*from 表名 where convert(varchar,日期列,102) between '2017.05.16' and '2017.05.17' (左右包含)

如何刷pat(想要在pat甲级拿80到90分)

从去年9月份开始刷pat,第一次刷pat乙级,20分,心拔凉拔凉,但是自己考的分,再低也得咽下去!转眼快一年了,刷pat给我最大的感受就是又爱又恨,我常常疾呼:“我待代码如初恋,代码虐我千百遍!”今天百度一圈,找了些技术大佬的指点,咬着牙,告诉自己,革命尚未成功,自己仍需努力。也愿与同在pat坑里苦苦徘徊的各位小伙伴们一起打个气。 想要在pat甲级拿80到90分?陈越姥姥给出的建议如下: 首先有十分钟拿下乙级15分题的本事。 然后要能在半小时内完成乙级20分题1道。 接下来训练自己45分钟完成乙级25分题。 这时你有了2.5小时满乙级的本事! 下面改做甲级英文题。 要有用十分钟读完4题的本事。 20分钟写完20分题并至少过样例。 1小时内写完2道25分题并至少过样例。 1小时写完最难题并至少过样例。 此时你应该有70分左右了, 最后半小时拚命过90吧! 最后补充一句:其实乙级60分就有很多企业要了,乙级90分都有接到BAT级企业电话的!所以不是非要甲级才有机会哈~ 遇到不会的题或者交N次都过不了某个测试点,先自己尝试着解决,很长时间没有想法(比如一个小时)后,再去网上搜题解。并且不要直接看代码,看下人家的思路。自己再来做,再做不来就去看代码,也不要直接把代码copy下来改了就交,最好看懂代码自己写。我个人觉得这样才能把别人的东西变成自己的。(MOOC数据结构的题有问题的话,善用讨论区,姥姥都会很耐心地提供帮助 另外找个大腿抱还是挺重要的(比你强就行),N天AC不了一个题有时候也挺打击人的,问题也许超出了你的知识范围而你并不知道,这个时候就需要一个大腿来节约时间,避免信心受损严重了。 代码可以背,思维是突击不来的。强烈建议每天都敲一些代码。 举个例子,甲级练习题里的基础数据结构题。 题目有1004,1020,1021,1028,1032,1107等。 涉及到的有队列,栈,链表,二叉树,并查集。 如果你发现自己并不熟悉这些,那么应该花几天的时间学习c++STL相关操作,二叉树前中后遍历。 由于PAT考试不能够携带纸质资料,我假设你会针对结构体使用algorithm头文件的排序,对STL的向量,栈,队列,map,set相关操作和迭代器足够熟悉,否则强烈建议你花上一些时间学习。 然后可以试着做一些模拟题目。 模拟题范围较广,可以锻炼思维,增强码代码能力。 题目有但不限于这些:1005,1006,1008,1009,1011,1015,1024,1035,1042,1043,1048,1065。 你需要学会贪心思想,深度优先搜索和广度优先搜索,进制转换,筛素数,字符串处理,二分查找。 之后的题目涉及到一些算法,更高级一点的数据结构,数学,动态规划知识。 动态规划较为晦涩,初学者需要较多时间才能掌握。 例如1007,最大子串和就是经典的一题。 另外建议你学习LIS最长上升子序列的O(n^2)做法,LCS最长公共子序列,01背包,这些建议去hduoj,讨论版有详细解析。 数据结构方面学习优美的树状数组,AVL。 例如1057需要用到树状数组的快速求和进行二分查找,1066使用AVL进行模拟。 AVL的旋转思想对Splay这样飘逸数据结构的学习是必不可少的。 算法方面在题库里主要涉及到图论算法。 如1003,1046,1106,主要是最短路算法和深度优先搜索的应用。 1053有多叉树的储存和遍历。 图的储存学会使用矩阵和vector两种方式。 最短路算法较多,不建议全都学会,但一定要对其中一种足够熟悉,并且对矩阵图和vector图都会写。 数学方面主要是学会筛素数,求gcd,lcm,O(sqrt(n))的找约数,素因子,会用约数和定理,约数个数定理,c++的话还有大数的模拟。

如何通过手机访问本地编写的html页面

如何通过手机访问本地编写的html页面? 确保电脑上已经安装node.js 因为咱们需要用到npm来安装服务 安装http-server npm install http-server -g 这里我们全局安装http-server,这个时候启动http-server服务,默认访问的跟目录是public,我们需要修改成本地编写页面的跟目录,我的目录:/Users/barry-yang/Documents/webworkspace cd /Users/barry-yang/Documents/webworkspace 然后终端输入http-server 手机访问 手机地址输入电脑的ip加端口号8080即可访问本地编写的html页面(确保手机跟电脑在同一个局域网下)

css使用checkbox来打造switch开关按钮

这是基础篇,所以要讲得仔细点,首先,我们有时候会看到这么一个需求: 这是一个很常见的控件,所以很有必要去掌握他,而我们需要的就是用到最常用的input标签, <input type="checkbox"> 因为他有“切换”功能,可是又有一个问题,我们怎么把那个带有√号的框框改造成一个带有圆圈的,高大上的方块呢? 显然不能在他上面动手脚,这时候就要想到另外一个常和input一起使用的label标签了,因为他有“for”属性,可以实现将焦点转移到input标签上,而且他本身就是一个“空白”,可以很容易改造成我们所需要的类型,然后,对于checkbox的选中状态,又是我们事件处理的好方法,所以checkbox是特佳的选择,思路讲完了,希望大家能整理成自己的代码: <!DOCTYPE html> <head> <meta charset="UTF-8"> <title></title> <link rel="stylesheet" href="css/style_all.css" /> <style> </style> </head> <body> <input type="checkbox" class="widget_switch_checkbox" id="widget_switch_checkbox"> <label for="widget_switch_checkbox" class="widget_switch_label"> <span class="widget_switch_circle"></span> </label> <script> document.querySelector("input.widget_switch_checkbox").addEventListener("click", function() { if(document.querySelector("input.widget_switch_checkbox").checked) { console.log(new Date().getTime()); console.log("选中状态"); } }); </script> </body> </html> css文件如下: /*开关按钮:模板 * * 注意:此处尺寸设置死的 * * <div id="container"> <input type="checkbox" class="widget_switch_checkbox" id="widget_switch_checkbox"> <label for="widget_switch_checkbox" class="widget_switch_label"> <span class="widget_switch_circle"></span> </label> </div> */ /*点击事件则是使用: * document.querySelector("input.widget_switch_checkbox").addEventListener("click", function() {

C函数调用过程解析(x86-64 )

C函数调用过程解析(x86-64 ) 函数栈保存了一个函数调用所需的维护信息,一般包括: - 函数的参数和返回值 - 临时变量:包括函数的非静态局部变量以及编译器自动生成的其他临时变量 - 保存的上下文:包括在函数调用前后需要保持不变的寄存器 下图显示了,在Linux操作系统中一个进程的虚拟地址布局(本图来自 《深入理解计算机系统》),从图中可以看出,栈总是向下增长的, 在x86-64下, 栈顶由栈顶寄存器rsp 进行定位。 栈底有基址寄存器rbp进行定位, 也就是说一个函数的整个活动过程由这两个寄存器划定范围。 1,代码示例: #include <stdio.h> int add(int a, int b) { int c = a + b; return c; } void strcopy(char * dst, char * src){ } int main(int argc, char *argv[]) { int tmp = 10; int tmp1 = 11; char str1[60]; char str2[100]; strcopy(str2, str1); int result = add(2, 3); printf("result=%d\n", result); return 0; } 2, 函数调用过程 (x86-64) 编译:gcc -m64 -o test test.

SQLite中的内连接简化技巧

2019独角兽企业重金招聘Python工程师标准>>> SQLite中的内连接简化技巧 在SQLite中,通过内连接可以将两个表通过条件表达式关联起来,构成一个新记录集或视图。形式如下: SELECT ... FROM t1 JOIN t2 ON t1.c1=t2.c2 如果表t1的列c1和表t2的列c2名称相同,则可以使用USING表达式进行简化。形式如下: SELECT ... FORM t1 JOIN t2 USING(c1) 其中,列c1在表t1和t2均存在。 如果c1是两个表中唯一相同的列,或者使用两个表所有同名列作为条件,则可以使用NATURAL JOIN进行简化。形式如下: SELECT ... FROM t1 NATURAL JOIN t2 这样,SQLite会自动以t1和t2同名的列作为条件来构建内连接。 转载于:https://my.oschina.net/u/1585857/blog/897533

如何使用Office Deployment Tool离线安装office 365

office 365客户都知道,office 365的安装方法与常规的office软件不同。常规的office软件有软件包或光盘,双击安装文件即可启动安装程序,而office 365因为更新速率快,没有对外发布的即点即用的软件包,普通用户只能通过在线安装程序,边下载边安装,以确保用户安装的office程序永远是最新的。 相信许多用户发现,在线安装的效果受网络环境影响大,网络不稳定或者并发请求数量大的时候,安装速度非常慢,甚至数个小时都无法安装完毕,影响工作效率。 那么,是否有效率更高的安装方式呢?有,用office deployment tool(简称ODT)来安装office 365。 Office deployment tool(ODT)下载地址: https://www.microsoft.com/en-us/download/details.aspx?id=49117 使用方法: ODT 包含两个文件:setup.exe 和 configuration.xml。若要使用该工具,请编辑xml配置文件以定义你想要使用的选项,然后通过cmd命令行运行 setup.exe。 Xml中的language:在国内常用zh-cn和en-us,前者代表中文,后者代表英文 Office 部署工具支持以下 Office 365 Product ID: O365ProPlusRetail O365Busine***etail VisioProRetail ProjectProRetail SPDRetail (SharePoint 设计器 2013) Office 365常见计划对应的产品ID: Office 365 计划 产品 ID Office 365 ProPlus Office 365 企业版 E3 O365ProPlusRetail Office 365 商业版 Office 365 商业高级版 O365Busine***etail ODT有两种运行模式: 1.下载模式:从Office 365的CDN网络下载安装源文件。 命令行:setup.exe /download configuration.xml 2.安装模式:在客户端计算机上安装已下载的 Office 365产品和语言包。 命令行:setup.exe /configure configuration.xml 从office365 CDN下载office 365源文件 步骤 1:创建配置文件

使用threejs点云秀出酷炫的图片效果(二)

上一次使用粒子系统,通过改变每一个粒子的位置和颜色构成了一副图片,这次我们使用批量操作粒子移动构成放映机的效果。 首先需要控制每一个粒子移动,每一个粒子就需要两套位置,第一个位置是起始时粒子所在的位置,第二个位置时结束时粒子所在的位置。为了能使每一个粒子单独进行移动这里还给每个粒子设置了scale速率,当到达1.0时结束移动。 function createPotCloud() { //创建点云 console.log(imgDate); particles = canvas.width * canvas.height; geometry = new THREE.BufferGeometry(); positions = new Float32Array( particles * 3 ); positions_af = new Float32Array( particles * 3 ); scale = new Float32Array( particles); var colors = new Float32Array( particles * 3 ); for ( var i = 0; i < scale.length; i ++ ) { // positions scale[ i ] = 0; } for ( var i = 0; i < positions.

UnityPC端打包参数设置

主要设置都在PlayerSettings里面 Company Name:设置公司名称 Product Name:设置项目名称,这个获取窗体句柄的时候用的到 Default Icon:默认的exe图标,更改打包好的exe文件的icon Default Cursor:默认的鼠标图标,就是更改鼠标样式 Cursor Hotspot:鼠标热点坐标?what's the fuck?查也查不到啥 Resolution and Presentation:分辨率和演示 Default Is Full Screen:默认是否全屏。 Default is Native Resolution:是否自动设置分辨率,如果勾上就是自动匹配分辨率, 没有勾上则会弹出两个参数设置窗体的高度和宽度。 Run in BackGround:当程序失去焦点后是否继续运行。 Standalone Player Options:独立 播放 选项 Capture Single Screen:捕获单屏,如果开启,在全屏模式下单机游戏不会在多显示器设置的第二显示器变暗。这个应该是是否只在主屏显示,还是可以再分屏中显示 Display Resolution Dialog:是否显示分辨率对话框,Disabled 禁用 Enabled 启用 Hidden by default默认隐藏 Use player Log:写入带有调试信息的日志。 Resizable Window:打成窗口模式后是否可以拖动窗体边界。 Mac App Store Validation:开启Mac应用商店验证。 // Visible In Background:如果Visible In Background这个选项不挑勾的话,那每当打开文件,或者我切换到别的窗口时,U3D程序会自动最小化。 // 但是如果这个选项挑勾的话,则U3D程序就会像一个Windows窗口一样置后,但不会最小化。 这里有一个很坑的问题就是unity写的程序在win8和win10系统上开机自启时有时会直接最小化,这个问题困扰了好久,突然发现设置里面 有这个选项我马上就试试.希望能解决233. Force single Instance:同时只允许打开一个程序。

Gx接口diameter信令CER消息结构分析

因为工作需要最近在学习调试Gx接口diameter信令相关的一些东西,将学到的东西写出来分享给大家,如有不足请指正,欢迎交流。 正常Gx接口信令是由9个AVP构成,在此例中,DRA是客户端,由DRA发起CER请求。 第一个AVP是发起CER请求方的主机名。 第二个AVP是发起CER请求方的域名。 第三个AVP是发起CER请求方的IP地址。 第四个AVP是发起CER请求方的IP地址。(一般来讲DRA会有两个IP同时对外服务,注意是同时,而不是主备) 第五个AVP是发起CER请求方的设备制造商标示。 第六个AVP是发起CER请求方的产品名称。 第七个AVP用于通告应用对安全部分的支持。 第八个AVP用于通告厂商定义的Diameter应用。惟一的Auth-Applicadon-Id与多个Vendor- Specific-Application-Id可能同时出现。此AVP必须为厂商自定义的应用中所有试验性指令的第一个AVP。 第九个AVP用于通告厂商定义的Diameter应用。惟一的Auth-Applicadon-Id与多个Vendor- Specific-Application-Id可能同时出现。此AVP必须为厂商自定义的应用中所有试验性指令的第一个AVP。

App 为什么收不到推送?

OK,我们分析下这个问题 首先,要知道 Android 分为两种类型的系统机型 轻度定制系统(也可称为原生态) Nexus、Pixel、三星,这些严格按照 Googlle 系统规范来做定制rom的深度定制系统 小米、魅族、锤子,这些是在 Google 的初版系统上修改了很多东西,比如说权限管理,通知栏样式等 推送为什么会收不到 因为推送后台服务被手机Kill,服务都被干掉了,试想如何能够收到推送 导致推送被Kill掉的原因 由于room被深度定制,各大厂商都有自己的权限管理,在一定时间内会被各大厂商Kill掉后台服务,尤其是内存不够用时会更快的被Kill掉;除非你的 App 被第三方厂商加入了白名单,后台服务畅通无阻,也就不存在推送收不到,例如微信 如何解决这个问题 根据不同的系统集成不同的推送,小米就用小米推送,华为就用华为推送,其他厂商用第三方推送(友盟、极光、个推等),这样一来基本上没啥问题了,就是比较麻烦 做一些保活方式,例如相互唤醒,内部去引导用户将 App 加入自启动列表,或者有些手机有加入『白名单』功能,在我看来除了加入白名单,其余的也只不过是增大保活率,而且其实也没啥屌用,最终都会被 Kill 掉 一个小白的一些理解,如有更好的做法或者看法欢迎讨论(=^ ^=)

AMESim数据导出方法

将AMEPlot中的曲线导出数据到excel中。 一、保存图片。 在AMEPlot界面中,file- Expot plot to picture.. 二、导出数据 1、在AMEPlot界面中,选择Save data,先保存为.data格式。 2、在记事本中打开.data文件。 (接着,用替换功能,将空格替换为tap键。这步也可以省略。) 然后将数据复制到excel中,更改下单元格格式就可以了。

C语言中如何定义动态二维数组并输出

可以按照下面步骤进行定义二维数组并输出: 1 定义二维指针。 2 确定数组维数,即行数和列数。 3 申请行数个一维指针大小空间,并赋值给二维指针。 4 对于每个一维指,申请列数个元素的空间,并赋值给对应的一维指针。 5 输入或赋值数据。 6 使用双重循环,逐个范围存储单元并输出。 7 逐个释放一维指针上的内存。 8 释放二维指针上的内存。 以整型二维数组为例: 下面的代码,实现先输入二维数组的行数m和列数n,并再输入m*n个整型数据存到动态二维数组中。最后输出所有二维数组的元素值。 int main() { int **p; //定义二维指针。 int m, n; //行数和列数。 int i,j; scanf ( "%d%d" , &m, &n); //输入行数和列数。 if (m <= 0 || n <= 0) return -1; //行数或列数非法。 p = ( int **) malloc ( sizeof ( int *) *m); //申请一组一维指针空间。 for (i = 0; i < m; i ++) p[i] = ( int *) malloc ( sizeof ( int ) * n); //对于每个一维指针,申请一行数据的空间。 for (i = 0; i < m; i ++) for (j = 0; j < n; j ++) scanf ( "

无需启动项目测试spring RunWith ContextConfiguration

import java.util.List; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.transaction.TransactionConfiguration; import javax.annotation.Resource; import junit.framework.TestCase; import com.sinopec.carlife.model.Region; import com.sinopec.carlife.service.api.RegionService; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations ={"classpath:spring/spring.xml"}) @Transactional public class RegionServiceTest extends TestCase { @Resource(name="regionService") private RegionService regionService; @Test public void testFindRegions() { try { List<Region> regions = regionService.findRegions(); System.out.println(regions.size()); } catch (Exception e) { e.printStackTrace(); } }

linux使用top命令跟踪进程的CPU占用率、内存使用率

top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器 可以直接使用top命令查看整体情况,如图: 但是这样虽然看的东西多,但是闲的比较乱,并且从如此多的内容中找到我们所需要的也较为困难,故此可以增加一些参数来优化显示结果,使之更清晰。 例如,通过ps命令我们找到所要跟踪的进程的名字和ID 在确认进程信息之后我们就可以使用top命令来进程跟踪了。这里我们要学习下top命令的参数(此处为简述,有兴趣的同学可以找专门的材料进行学习) -b:以批处理模式操作; -c:显示完整的治命令; -d:屏幕刷新间隔时间; -I:忽略失效过程; -s:保密模式; -S:累积模式; -i<时间>:设置间隔时间; -u<用户名>:指定用户名; -p<进程号>:指定进程; -n<次数>:循环显示的次数。 以上就是可选参数,可以根据自己的需求进行组合。我们本次要使用的参数为d和p,使用d设置一个刷新时间,使用p来确定要看那些进程。 命令结果如下: 现在看到的结果就比较清晰了。 同学们学会了么。 欢迎交流。

SpringBoot非官方教程 | 第七篇:springboot开启声明式事务

转载请标明出处: http://blog.csdn.net/forezp/article/details/70833629 本文出自方志朋的博客 springboot开启事务很简单,只需要一个注解@Transactional 就可以了。因为在springboot中已经默认对jpa、jdbc、mybatis开启了事事务,引入它们依赖的时候,事物就默认开启。当然,如果你需要用其他的orm,比如beatlsql,就需要自己配置相关的事物管理器。 准备阶段 以上一篇文章的代码为例子,即springboot整合mybatis,上一篇文章是基于注解来实现mybatis的数据访问层,这篇文章基于xml的来实现,并开启声明式事务。 环境依赖 在pom文件中引入mybatis启动依赖: <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.0</version> </dependency> 引入mysql 依赖 <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.29</version> </dependency> 初始化数据库脚本 -- create table `account` # DROP TABLE `account` IF EXISTS CREATE TABLE `account` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `money` double DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; INSERT INTO `account` VALUES ('1', 'aaa', '1000'); INSERT INTO `account` VALUES ('2', 'bbb', '1000'); INSERT INTO `account` VALUES ('3', 'ccc', '1000'); 配置数据源 spring.

petalinux-package qspi启动镜像的问题

一段复制官方的解释 http://www.wiki.xilinx.com/Prepare+boot+image Example: FSBL pre-loads Linux images This example contains - next to the obligatory boot loaders - images to boot Linux. In this case the FSBL loads those iamges to the address given by the load attribute in the .bif file. That way U-Boot would not have to load any images and would simply boot by directly issuing a matching bootm command. image : { [bootloader]fsbl.elf u-boot.elf [load=0x2a00000]devicetree.dtb [load=0x2000000]uramdisk.

ArcGIS API for Javascript最方便的部署方式(懒人部署方式)

关于ArcGIS API for Javascript 的部署,网上有很多资料,官方也有。很简单 第1步、下载ArcGIS APIfor Javascript,好像现在官网的下载不了。网上很多资源,可以去下载。 这里我下载的是3.17 说明:最好下载稍新一点的,以适应当前新的浏览器。(例3.5对ie11不兼容,鼠标滚轮放大缩小失控。) 第2步、以IIS为例,将下载下来的api放到想要的路径中。注意下载下来的api可以路径很深,可以只取api有用的文件夹。 IIS路径: 第3步:打开3.17下的install_win.html页面(以windows为例)。查看js文件路径配置说明。 官方的说明中都说的很清楚了,就是修改4个js文件中的路径。 问题:依官方的说法,我们只是给api固定1个访问路径。如果访问路径有变化,域名更替什么的。你只能乖乖再改一次路径。或者需要同时兼容内外网不同路径访问时。这现起来比较困难,可能需要部署两个api。再是api部署服务器迁移时,每次都要去改这4个路径。很麻烦。 (最新有个项目,一会部署到这个服务器、一会部署到另一个服务器;客户服务器为政务网,而具需要内外网两种模式兼容,内外网完全隔离的;按原方法部署可能要部署两个) 解决:这里有个方法可以实现一次性解决所有以上问题。 首先我们在这4个js文件的前面都加上以下代码: (代码摘自: https://github.com/fsjohnhuang/getCurrAbsPath/blob/master/lib/getCurrAbsPath.js ) (function(exports) { var doc = exports.document, a = {}, expose = +new Date(), rExtractUri = /((?:http|https|file):\/\/.*?\/[^:]+)(?::\d+)?:\d+/, isLtIE8 = ('' + doc.querySelector).indexOf('[native code]') === -1; exports.getCurrAbsPath = function() { // FF,Chrome if (doc.currentScript) { returndoc.currentScript.src; } var stack; try { a.b(); } catch (e) { stack =e.fileName || e.sourceURL || e.

Modal模态框的防穿透问题,模态框弹出后,禁止body滑动事件

我封装的模态框生成是这种结构的 代码插入: <div class="wx-dialog"> <div class="dialog-content" id="pageinfo"> <p class="pop-title">温馨提示</p> <div class="pop-content">网络不给力哦,请重新进入~</div> <p class="btn"><span class="confirmbtn" style="width:100%;">知道了</span></p> </div> </div>$('.pop-content')的max-height是200px,当内容超过200px时,会有滚动条。 需要判断①手指touch的位置是否为.pop-content或者.pop-content的内容,若不是则阻止滚动; ②判断滚动条是否在.pop-content的最上方或者最下方,若是则阻止滚动。 于是有了下面的代码: var popCnt = $(".pop-content"); // 获取滚动条最高高度(内容总高度-显示的高度) var maxScrollTop = popCnt[0].scrollHeight - popCnt.height(), touchStartY = 0; // pop-content $("body").on("touchstart", function(e) { touchStartY = e.originalEvent.targetTouches[0].pageY; }).on("touchmove",function(e) { // 值是负数为往上滑,说明还在往下滚 // 正数为往下滑,说明还在往上滚 var moveLength = e.originalEvent.targetTouches[0].pageY- touchStartY; if (e.target.className != "pop-content"&& $(e.target).parents(".pop-content").length == 0) { e.preventDefault(); } else { var scrollTop = popCnt.

简单选择排序及其改进算法

1、未改进的简单选择排序 public static void main(String[] args) { int[] s={9,1,5,8,3,7,4,6,2}; SimpleSelectSort(s); } private static void SimpleSelectSort(int[] s) { for(int i=0;i<s.length;i++){ int min=i; for(int j=i+1;j<s.length;j++){ if(s[min]>s[j]) min=j; } if(min!=i){ int a=s[min]; s[min]=s[i]; s[i]=a; } for(int k=0;k<s.length;k++){ System.out.print(s[k]+" "); } System.out.println(); } } } 排序的结果如下: 1 9 5 8 3 7 4 6 2 1 2 5 8 3 7 4 6 9 1 2 3 8 5 7 4 6 9 1 2 3 4 5 7 8 6 9 1 2 3 4 5 7 8 6 9 1 2 3 4 5 6 8 7 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 2、改进之后的简单选择排序

金蝶Apusic中间件中部署 SuperMap iServer

作者:MR 一、系统配置要求 本文使用软件版本为 iServer 8.1.1 、金蝶9.0;64位操作系统为 Windows 10_1607 和 Ubuntu 14.04_server。 文件如下: supermap_iserver_8.1.1a_war.zip AAS-V9.0_20170309.zip Windows和Linux下安装部署过程相同。 二、安装金蝶 金蝶中间件需要jdk环境,所以需要先安装jdk,jdk版本应同时高于金蝶、iServer要求的版本。本文使用的金蝶要求jdk1.6及以上、iServer 8.1.1要求jre1.8及以上,所以这里使用JDK1.8(64位)。 安装JDK 可以使用安装包也可以使用解压包,这里省略。 安装金蝶 解压 AAS-V9.0_20170309.zip 文件即可,本文解压到以下目录: Windows: F:\WORK\AAS Linux: /opt/AAS 配置金蝶许可 将收到的许可文件重命名为 license.xml 放到金蝶解压目录即可,本文放到以下目录: Windows: F:\WORK\AAS Linux: /opt/AAS 启动、关闭&管理金蝶服务 可以通过脚本启动金蝶中间件。脚本位置: Windows下:{金蝶安装目录}\domains{域}\bin\startapusic.cmd、stopapusic.cmd (双击或cmd窗口运行) Linux下:{金蝶安装目录}/domains/{域}/bin/startapusic、stopapusic (bash或sh startapusic或stopapusic) 默认域是mydomain,所以本文的启动关闭脚本路径是: Windows: F:\WORK\AAS\domains\mydomain\bin\startapusic.cmd、stopapusic.cmd Linux: /opt/AAS/domains/mydomain/bin/startapusic、stopapusic 首次启动验证许可通过后,会提示设置管理员密码,管理员用户名是:admin 管理金蝶服务 浏览器访问: http://{hostname}:6888/admin 本机访问可以将{hostname}替换成localhost或127.0.0.1;非本机访问则使用域名或IP。 其他可以参考金蝶安装目录下的readme.html。 部署iServer 解压 supermap_iserver_8.1.1a_war.zip 得到以下文件: support_win_x64.zip (Windows下iServer依赖的SuperMap iObjects Java包) support_linux_x64.tar.gz (Linux下iServer依赖的SuperMap iObjects Java包) iserver.war (iServer部署包) iserver#iClient.war (iServer自带iClient示范程序部署包)

内存泄漏和内存溢出的区别和联系

1、内存泄漏memory leak :是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。 2、内存溢出 out of memory :指程序申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型数据的存储空间,但是你却存储long类型的数据,那么结果就是内存不够用,此时就会报错OOM,即所谓的内存溢出。 3、二者的关系 内存泄漏的堆积最终会导致内存溢出内存溢出就是你要的内存空间超过了系统实际分配给你的空间,此时系统相当于没法满足你的需求,就会报内存溢出的错误。内存泄漏是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序。就相当于你租了个带钥匙的柜子,你存完东西之后把柜子锁上之后,把钥匙丢了或者没有将钥匙还回去,那么结果就是这个柜子将无法供给任何人使用,也无法被垃圾回收器回收,因为找不到他的任何信息。内存溢出:一个盘子用尽各种方法只能装4个果子,你装了5个,结果掉倒地上不能吃了。这就是溢出。比方说栈,栈满时再做进栈必定产生空间溢出,叫上溢,栈空时再做退栈也产生空间溢出,称为下溢。就是分配的内存不足以放下数据项序列,称为内存溢出。说白了就是我承受不了那么多,那我就报错, 4、内存泄漏的分类(按发生方式来分类) 常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。 一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块仅且一块内存发生泄漏。比如,在类的构造函数中分配内存,在析构函数中却没有释放该内存,所以内存泄漏只会发生一次。 隐式内存泄漏。程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。 5、内存溢出的原因及解决方法: 内存溢出原因: 1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据; 2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收; 3.代码中存在死循环或循环产生过多重复的对象实体; 4.使用的第三方软件中的BUG; 5.启动参数内存值设定的过小内存溢出的解决方案: 第一步,修改JVM启动参数,直接增加内存。(-Xms,-Xmx参数一定不要忘记加。) 第二步,检查错误日志,查看“OutOfMemory”错误前是否有其 它异常或错误。 第三步,对代码进行走查和分析,找出可能发生内存溢出的位置。 重点排查以下几点: 1.检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。 2.检查代码中是否有死循环或递归调用。 3.检查是否有大循环重复产生新对象实体。 4.检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。 5.检查List、MAP等集合对象是否有使用完后,未清除的问题。List、MAP等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收。 第四步,使用内存查看工具动态查看内存使用情况

numa,numa node 和物理内存

[root@rac2 ~]# lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 12 On-line CPU(s) list: 0-11 Thread(s) per core: 1 Core(s) per socket: 6 Socket(s): 2 NUMA node(s): 2 Vendor ID: GenuineIntel CPU family: 6 Model: 63 Model name: Intel(R) Xeon(R) CPU E5-2603 v3 @ 1.60GHz Stepping: 2 CPU MHz: 1398.625 BogoMIPS: 3205.07 Virtualization: VT-x L1d cache: 32K L1i cache: 32K L2 cache: 256K L3 cache: 15360K NUMA node0 CPU(s): 0-5 NUMA node1 CPU(s): 6-11 [root@rac2 ~]# numastat node0 node1 numa_hit 2815615 2618359 numa_miss 0 0 numa_foreign 0 0 interleave_hit 34872 34865 local_node 2815015 2580218 other_node 600 38141 [root@rac2 ~]# numactl --hardware available: 2 nodes (0-1) node 0 cpus: 0 1 2 3 4 5 node 0 size: 65425 MB ----->>numa node 0的内存大小 node 0 free: 62868 MB node 1 cpus: 6 7 8 9 10 11 node 1 size: 65536 MB ----->>numa node 1的内存大小,看这个结果貌似是numa的各个node瓜分物理内存.

Vue和D3.js构建图表

Vue 和D3.js构建简单曲线图 1.说明 采用Vue-cli脚手架; 采用原生D3.js; 曲线图。 分析 <template> <div id="line"></div> </template> <script> export default { name: 'vue-line-chart',//名称 data() { //数据 return { data: [[ {x: 0, y: 5}, {x: 1, y: 9}, {x: 2, y: 7}, {x: 3, y: 5}, {x: 4, y: 3}, {x: 6, y: 4}, {x: 7, y: 2}, {x: 8, y: 3}, {x: 9, y: 2} ]] }; }, mounted() { this.render(this.data); //渲染图表 }, props:{ width:500, height:500, margin:50 }, methods: { getScales(){ //定义x坐标轴和y坐标轴的尺度 let width = 500, height = 500, margin = 50, x = d3.

python3+PyQt5 使用数据库表视图

上文提到窗体可以一次性呈现出来自同一记录的各个域,但是对于用户希望能看到多条记录的表来说,就需要使用表格化的视图了。本文通过python3+pyqt5改写实现了python Qt gui 快速变成15章的例子,用户能够一次看到多条记录。 #!/usr/bin/env python3 import os import sys from PyQt5.QtCore import (PYQT_VERSION_STR, QDate, QFile, QRegExp, QVariant, QModelIndex,Qt) from PyQt5.QtWidgets import (QApplication,QComboBox, QDateTimeEdit, QDialog, QGridLayout, QHBoxLayout, QLabel, QLineEdit, QDateEdit,QMessageBox, QPushButton, QStyleOptionViewItem, QTableView,QVBoxLayout) from PyQt5.QtGui import QPixmap,QCursor,QRegExpValidator from PyQt5.QtSql import (QSqlDatabase, QSqlQuery, QSqlRelation, QSqlRelationalDelegate, QSqlRelationalTableModel,QSqlTableModel) import qrc_resources MAC = True try: from PyQt5.QtGui import qt_mac_set_native_menubar except ImportError: MAC = False ID = 0 NAME = ASSETID = 1 CATEGORYID = DATE = DESCRIPTION = 2 ROOM = ACTIONID = 3 ACQUIRED = 1 def createFakeData(): import random print("

程序员4月书讯:Angular来了!

3月书讯中奖名单: 小棒棒《学习敏捷:构建高效团队》 镇屌的技术之路《学习敏捷:构建高效团队》 阿基米东《Scratch少儿趣味编程2》 民团司令《追踪引力波》 JOHNEW《算法图解》 中奖通知由CSDN官方发布站内消息,请关注消息通知~ 好书推荐,在图灵书讯中选出你认为值得推荐的好书加自己写的推荐理由,在文末评论里回复。下期书讯更新时,会在本期的书讯评论中选出若干优秀评论,获奖者可任选图灵书讯中的图书一本。 本月新书11本,有一套数学经典科普书,一套东京大学访谈集,3本前端开发,1本iOS性能优化,1本Docker,还有1本Unity畅销书升级。 特别推荐:数学万花筒套装Angular权威教程高性能iOS应用开发Meteor实战客户端存储技术【有电子版】Docker开发指南【有电子版】Unity游戏设计与实现:南梦宫一线程序员的开发实例(修订版)如何思考:东京大学思维素养访谈集设计思维:东京大学思维素养访谈集2 0. 特别推荐:数学万花筒套装 作者:伊恩·斯图尔特 译者:张云(1)(2),何生(3) 定价:39.00元 知名数学科普作家、华威大学数学系荣退教授Ian Stewart作品 五十多年收藏精选,汇集趣味数学游戏、谜题、故事和八卦适合各种程度的数学爱好者阅读,深入培养数学学习兴趣 《数学万花筒》系列是知名数学科普作家、华威大学数学系荣退教授伊恩·斯图尔特(Ian Stewart)五十多年收藏精选,是数学科普畅销经典。《数学万花筒(修订版)》和《数学万花筒2(修订版)》 对旧版译文进行了全面整理提升。《数学万花筒3:夏尔摩斯探案集》为最新出版。 通过本书,读者可以:透彻了解数学有趣而迷人的一面,激发想像力;亲自参与到数学中,体验发现带来的兴奋;了解数学的重要发展,不管来自四千年前还是上一周。 1. Angular权威教程 ng-book 2: The Complete Book on Angular 2 作者:Ari Lerner,Felipe Coury,Nate Murray,Carlos Taborda 译者:Nice Angular社区 定价:109.00元 Angular领域里程碑式著作,资深全栈开发工程师经验汇集 雪狼带领的Nice Angular社区主力倾情翻译 GoogleAngular项目经理兼主管Naomi Black、Google开发技术推广部大中华区主管栾跃推荐阅读 《Angular权威教程》堪称Angular领域里程碑式著作,涵盖了关于Angular的几乎所有内容。 对于没有经验的人,本书平实、通俗的讲解,递进、严密的组织,可以让人毫无压力地登堂入室,迅速领悟新一代Web应用开发的精髓。 如果你有相关经验,那本书对Angular概念和技术细节的全面剖析,以及引人入胜、切中肯綮的讲解,将帮助你彻底掌握这个框架,在自己职业技术修炼之路上更进一步。 2. 高性能iOS应用开发 High Performance iOS Apps: Optimize Your Code for Better Apps 作者:Gaurav Vaish 译者:梁士兴 郝田田 陈作君 定价:89.00元 全面展示构建优异应用移动性能所需技能,Objective-C与iOS开发人员进阶必备 强调从工程学角度编写最优代码,解决常见性能问题让App飞起来的软硬件解决之道 《高性能iOS应用开发》介绍了对用户体验产生负面影响的各个方面,并概述如何优化iOS应用的性能。全书共5个部分,主要从性能的衡量标准、对应用至关重要的核心优化点、iOS应用开发特有的性能优化技术以及性能的非代码方面,讲解了应用性能的优化问题。

Web前端Table中的tr和td按百分比设定宽度和高度,当内容超出时Table变型解决

如果table按照百分比设定宽度和高度,当表格内部任意内容超出所在元素的百分比值时就会使得表格变形。 <table width='80%'> <tr> <td width='50%'>内容超过50%</td> </tr> </table> 当内容超过50%时,就会使Table变形。此时只需在table标签上设置style=''的table-layout:fixed。 表示:固定布局的算法。在这算法中,水平布局是仅仅基于表格的宽度,表格边框的宽度,单元格间距,列的宽度,而和表格内容无关。

spring cloud 学习笔记-Eureka

最近在慢慢学习cloud的相关知识,会把碰见的一些问题记录下来。 对照学习的参考链接:【程序猿DD】Spring Cloud构建微服务架构系列,持续更新~](http://bbs.springcloud.com.cn/d/1-dd-spring-cloud) 1、在默认设置下,Eureka服务注册中心也会将自己作为客户端来尝试注册它自己,所以我们需要禁用它的客户端注册行为。 禁止方式如下: eureka.client.register-with-eureka=false eureka.client.fetch-registry=false 如果不禁止的话,会得到如下错误: com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect 2017-04-16 22:16:12.943 WARN 6864 --- [ main] c.n.d.s.t.d.RetryableEurekaHttpClient : Request execution failure 2017-04-16 22:16:12.951 ERROR 6864 --- [ main] com.netflix.discovery.DiscoveryClient : DiscoveryClient_UNKNOWN/DESKTOP-MQ8D0C9:8761 - was unable to refresh its cache! status = Cannot execute request on any known server 应该是因为当注册中心将自己作为客户端注册的时候,发现在server上的端口被自己占据了,然后就挂了。 如果要开启自动注册的话,可以启动两个server,互相注册 A:eureka.client.serviceUrl.defaultZone=http://localhost:1112/eureka/ B:eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/ 2、启动服务注册中心的时候,如果没在application.properties中显示指定端口的话,我的机子上默认是8761端口,然后虽然启动没问题,但是访问local host:8761/的时候就访问不了,但是如果指定端口server.port = 8761,就一切正常了。不知道为什么,如果有人知道的话请指点一下。 3、启动两个client,过了一会,停了其中一个,访问注册中心时,界面上显示了红色粗体警告信息: EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT.

nginx屏蔽指定接口(URL)

一、前言 有时候,web平台上线后,需要屏蔽某个服务接口,但又不想重新上线,可以采用nginx屏蔽指定平台接口的办法。 二、具体操作 在nginx的配置文件nginx.conf文件的server节点中,添加一个location,示例如下: location /your url { return 403; } 这里具体以nginx自带nginx.conf为例,屏蔽根URL路径/: 屏蔽前 location / { root html; index index.html index.htm; } 访问nginx index.html页面结果如下: 屏蔽后 location / { return 403; root html; index index.html index.htm; } 访问nginx index.html页面结果如下: 修改完nginx.conf配置文件后,不用重启nginx,执行命令nginx -s reload重新加载配置文件,修改的规则即可生效。

浅析数据库(DB)、操作数据存储(ODS)和数据仓库(DW)的区别与联系

文章背景: 相信大部分刚接触上面三个概念的同学,都多多少少会有些迷惑,现在我就给大家简单分析下这三者的关系,希望大家对这三者的概念理解有所帮助吧。 本文主要从下面两类关系来叙述上面三者的关系: 数据库(DB)和数据仓库(DW)的区别与联系操作数据存储(ODS)和数据仓库(DW)的区别与联系 数据库与数据仓库的区别与联系 数据库与数据仓库基础概念: 数据库:传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易。 数据仓库:数据仓库系统的主要应用主要是OLAP(On-Line Analytical Processing),支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。 OLTP和OLAP概念补充: 数据处理大致可以分成两大类:联机事务处理OLTP(on-line transaction processing)、联机分析处理OLAP(On-Line Analytical Processing)。 OLTP是传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易。 OLAP是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。 OLTP 系统强调数据库内存效率,强调内存各种指标的命令率,强调绑定变量,强调并发操作; OLAP 系统则强调数据分析,强调SQL执行市场,强调磁盘I/O,强调分区等。 举一个具体的例子:(转自知乎作者:陈诚),个人觉得例子描述的很清晰 举个最常见的例子,拿电商行业来说好了。 基本每家电商公司都会经历,从只需要业务数据库到要数据仓库的阶段。 第一阶段,电商早期启动非常容易,入行门槛低。找个外包团队,做了一个可以下单的网页前端 + 几台服务器 + 一个MySQL,就能开门迎客了。这好比手工作坊时期。 第二阶段,流量来了,客户和订单都多起来了,普通查询已经有压力了,这个时候就需要升级架构变成多台服务器和多个业务数据库(量大+分库分表),这个阶段的业务数字和指标还可以勉强从业务数据库里查询。初步进入工业化。 第三阶段,一般需要 3-5 年左右的时间,随着业务指数级的增长,数据量的会陡增,公司角色也开始多了起来,开始有了 CEO、CMO、CIO,大家需要面临的问题越来越复杂,越来越深入。高管们关心的问题,从最初非常粗放的:“昨天的收入是多少”、“上个月的 PV、UV 是多少”,逐渐演化到非常精细化和具体的用户的集群分析,特定用户在某种使用场景中,例如“20~30岁女性用户在过去五年的第一季度化妆品类商品的购买行为与公司进行的促销活动方案之间的关系”。 这类非常具体,且能够对公司决策起到关键性作用的问题,基本很难从业务数据库从调取出来。原因在于: 业务数据库中的数据结构是为了完成交易而设计的,不是为了而查询和分析的便利设计的。业务数据库大多是读写优化的,即又要读(查看商品信息),也要写(产生订单,完成支付)。因此对于大量数据的读(查询指标,一般是复杂的只读类型查询)是支持不足的。 而怎么解决这个问题,此时我们就需要建立一个数据仓库了,公司也算开始进入信息化阶段了。数据仓库的作用在于: 数据结构为了分析和查询的便利;只读优化的数据库,即不需要它写入速度多么快,只要做大量数据的复杂查询的速度足够快就行了。 那么在这里前一种业务数据库(读写都优化)的是业务性数据库,后一种是分析性数据库,即数据仓库。 常见产品: 数据库比较流行的有:MySQL,Oracle,SqlServer,DB2等 数据仓库比较流行的有:AWS Redshift,Greenplum,Hive等 操作数据存储与数据仓库的区别与联系 基础概念:(抓住重点:DW是反映历史变化,ODS是反映当前变化) 数据仓库(Data Warehouse):是一个面向主题的(Subject Oriented)、集成的(Integrated)、相对稳定的(Non-Volatile)、反映历史变化(Time Variant)的数据集合,用于支持管理决策(Decision Making Support)。 时效:T+1 操作数据存储(ODS):是一个面向主题的、集成的、可变的、当前的细节数据集合,用于支持企业对于即时性的、操作性的、集成的全体信息的需求。 ODS是数据仓库体系结构中的一个可选部分,是DB与DW之间的中间层,ODS具备数据仓库的部分特征和OLTP系统的部分特征。 时效:实时 ODS概念的由来 ODS存储了运营系统(如OLTP(联机事务处理)系统)近实时的详细数据。ODS的概念最早是由“数据仓库之父”——Bill Inmon提出的。ODS最初引入是为了寻找能满足快速加载和数据整合的性能要求,并且减少面向分析需求的变更和扩充对生产系统影响的解决方案,这一解决方案便是在生产系统和EDW之间增加一个数据整合层(也叫做数据缓冲层)即ODS。具有数据整合层的作用,是提出ODS概念的主要出发点。随着技术的发展,近年来ODS被赋予的功能和作用也得到了延伸,目前业界普遍认同的观点是:ODS为企业原始运营数据存储提供了一个整合平台,它的信息来自于不同的运营型应用系统。通过数据接口,在数据整合业务规则作用下,进入ODS的信息是可靠的、可信的。 ODS的工作过程 生产系统中的运营数据通过ETL(抽取、转换、装载)过程进人到ODS中,生产系统之间准实时的数据交换由ODS系统完成,ODS系统同时还将整合好的生产系统下的运营数据通过ETL等方式传送到EDW中,完成运营数据从操作环境进人到分析环境的过程。 ODS是EDW的一个有益的补充和扩展。 两者相同点: ODS与EDW都是企业数据架构中的独立系统,两个系统都不是直接产生运营数据的系统,两个系统中的数据都是由操作环境的数据经过抽取、转换、加载(ETL)的过程而来,还要进行进一步的清理、整合等工作(EDW的数据可由ODS加载装入)。 ODS与EDW一样都既有细粒度的数据。也有根据不同维度汇总的汇总数据。 ODS与EDW上均提供基于跨系统整合后数据的报表类应用。 两者不同之处:(主要从10个方面来叙述)

CSDN要求必须绑定手机号

以下均为个人见解,说错了,就是故意的 首先,绑定手机号也可以,但至少要提前通知一下嘛 提前一个月,至少提前一个星期通知用户,需要绑定手机号 或者至少发封邮件来提醒 结果,今天突然就来了个必须绑定手机号 否则无法登陆,无法查看编辑自己的博客 这未免有点唐突了吧。。。 其实,博客就是给人清晰明了的地方 越简明越清晰,越会有人来这里 我想很多人都喜欢直接、简明、一目了然 拿来即用的理念是吸引人的,也是给人已方便 不要等到人家来到这住上一阵子,然后开始谈规矩 而且规矩中总是会道出各种不想让人停留了 说回现实,任何产品,都是需要客流量 用户越多,产品越有价值,越有价值,就要更好的满足更多客户需求 不能价值产生了,体验扔走了 总会有人有意见,就像我。。。 为啥现在都要这样搞 百思不得解 另外,我确实没找到解绑手机的地方,不知道你们找到没有

鼠标右键没有新建按钮怎么办

电脑鼠标右键菜单中没有新建怎么办? 我们的电脑鼠标右键一般都有新建功能,但有时或因为清理多余的右键或其他原因使新建功能消失,鼠标右键没有了新建有时候有些麻烦,所以右键的新建是必备的。 现在我我在我的电脑桌面进行演示来介绍两种方法来恢复鼠标右键菜单新建。(方法仅供参考,如果你有其他方法,可以联系我,我给予补充) 工具/原料 电脑 鼠标 方法一 1 点击“开始”菜单,“记事本”,或“所有程序”—>“附件”—>“记事本”。 2 在记事本中输入以下代码。(支持者有条件可以试试哈) Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\Directory\Background\shellex\ContextMenuHandlers\New] @="{D969A300-E7FF-11d0-A93B-00A0C90F2719}" 3 然后点击右上角的“╳”的关闭图标,在弹出的有关是否保存的窗口选择“保存”,然后选择保存位置(我这里选择桌面),文件名填“右键没有新建的解决方法.reg”,文件类型选择“所有文件”,点击“保存”。这时桌面就有我们刚才建的文件 4 这时桌面就有我们刚才建的reg注册表文件,双击,期间会出现警告提示,点击”是“允许导入。 5 如果你的电脑安装有360之类的安全卫士,会出现如下的提醒,选择“允许操作”,之后会弹出已成功添加的窗口,点击确定即可。 6 我们来看看结果,如图,有了“新建”。 原文地址:http://jingyan.baidu.com/article/fec4bce220cd6ef2608d8b4e.html 转载于:https://www.cnblogs.com/sunxiaolongblog/p/6686188.html

HBASE 常用shell命令,增删改查

首先给出本次操作的数据 create 'student','info','address' put 'student','1','info:age','20' put 'student','1','info:name','wang' put 'student','1','info:class','1' put 'student','1','address:city','zhengzhou' put 'student','1','address:area','High-tech zone' put 'student','2','info:age','21' put 'student','2','info:name','yang' put 'student','2','info:class','1' put 'student','2','address:city','beijing' put 'student','2','address:area','CBD' put 'student','3','info:age','22' put 'student','3','info:name','zhao' put 'student','3','info:class','2' put 'student','3','address:city','shanghai' put 'student','3','address:area','pudong' scan 'student' 2.首先执行,创建表,增加数据操作,执行脚本 /bin/hbase shell ./student.txt,然后查看内容 scan ‘student’ hbase(main):001:0> scan 'student' ROW COLUMN+CELL 1 column=address:area, timestamp=1491533426260, value=High-tech zone 1 column=address:city, timestamp=1491533426239, value=zhengzhou 1 column=info:age, timestamp=1491533426179, value=20 1 column=info:class, timestamp=1491533426218, value=1 1 column=info:name, timestamp=1491533426211, value=wang 2 column=address:area, timestamp=1491533426297, value=CBD 2 column=address:city, timestamp=1491533426292, value=beijing 2 column=info:age, timestamp=1491533426269, value=21 2 column=info:class, timestamp=1491533426287, value=1 2 column=info:name, timestamp=1491533426277, value=yang 3 column=address:area, timestamp=1491533426329, value=pudong 3 column=address:city, timestamp=1491533426323, value=shanghai 3 column=info:age, timestamp=1491533426305, value=22 3 column=info:class, timestamp=1491533426317, value=2 3 column=info:name, timestamp=1491533426311, value=zhao 3 row(s) in 0.

vs中输入输出流重定向到文件

在vs中,有的时候我们在输入的时候需要输入很多东西,然后输出结果后,发现出现问题了,之后调试又得输入大量的东西,这是很让人头疼的事情,为此我们可以将输入重定向到文件中,将我们需要的输入存储到一个文件中,在运行vs时会自动读取文件里的东西取代dos窗口的输入,这样就为我们省去了很多的麻烦。 下面看一具体的过程(很简单的过程): 在vs的窗口中,点击项目-》属性,如下图所示: 点击属性后,在命令参数中填写“<data.txt”,注意,其中“<”是不可变的,后面的data.txt是文件名,存放输入的数据。 在点击确定后,然后运行相应的程序,便可以成功从文件中读取数据了。 对于将cmd窗口中的输出数据重定向到文件也是一样的道理,只需要将命令参数修改为“>data.txt”,如下图: 好了,这是一个使用的小技巧,就讲到这里了。

使用gparted修改ubuntu分区大小

环境:ubuntu14.04 LTS 起初安装系统时只给 / (根目录)分配了10G空间,结果因为装了一大堆相关库、软件。根目录只剩下90M左右。。 然后上网查增加分区的方法,发现gparted这个软件。 等打开软件之后才发现,这几个分区前面都有一把钥匙。。。根本无法修改 于是我尝试用U盘启动系统,再使用这个软件,发现没有钥匙了。 这样就可以增加根目录的容量了。 分区的方式见这篇文章:http://worldant.blog.sohu.com/100113405.html “ 首先需要注意的一点是:gparted中对一个分区的操作,只能影响到最邻近的两个其他分区,也只有邻近的这两个分区能影响到该分区。即,如果一个分区划出一小块出来,成了空闲区,那么该空闲区生成后肯定临着该分区。自然,如果一个分区要扩大,就必须保证这个分区的上下两个区有一个是空间的,未分配的。只有这样才可以对该分区进行扩容调整!在gparted中,一个分区要扩大,需要的前后空闲区的大小至少有一个不为0。” 因为我的电脑与根目录相邻的分区正好有多余的容量,所以直接分出一部分给了根目录。 如果相邻的分区没有多余容量,就需要像上面那篇文章说的,将多余的容量依次移动到相邻分区。

解决中文字符乱码问题,如何将gbk格式转换utf-8格式

中文乱码的原因是因为编码格式是gbk的,而显示的时候是utf-8格式的,所以需要将其utf-8格式,才能正常显示出来。 1.gbk生成utf8程序需要经过两次转化。 1.gbk->unicode 2.unicode->utf8 2.gbkuni30_gen.h是gbk转化的unicode的数组,只有unicode部分,通过另一个文件程序可生成。gbk是索引(此文件可在我的下载资源中找到) 源码如下: #include "gbkuni30_gen.h" int gbk_to_unicode(unsigned short int* unicode, const char* gbk, int len) { int i,j; i = 0; unsigned char* gb_temp = (unsigned char *)gbk; for(j = 0; i < len; j++) { if (gb_temp[i] <= 0x80) { unicode[j] = gb_temp[i]; i++; } else { unsigned short int temp; temp = (gb_temp[i] << 8) + gb_temp[i+1]; unicode[j] = gbkuni30[temp]; i += 2; }

GitHub Gist 指南

Github作为代码分享平台在开发者中非常流行。此平台托管了包括游戏、书籍以至于字体在内的一千两百多万个项目(现在更多),这使其成为互联网上最大的代码库。 Github还提供另一个非常有用的功能,就是Gist。开发人员常常使用Gist记录他们的代码片段,但是Gist不仅仅是为极客和码农开发的,每个人都可以用到它。如果您听说过类似Pastebin或者 Pastie这样的web应用的话,那您就可以看到它们和Gist很像,但是Gist比它们要更优雅。因为这些免费应用一般含有广告,而且带有很多其他杂 七杂八的功能。 Gist – 任何人都能用得着 如果您不是极客您可以按照如下方式使用Gist: 1. 匿名张贴 您不需要拥有Github账号就可以使用Gist。用浏览器打开http://gist.github.com,在窗口中写下你想说的就可以创建一个Gist。您可以发布一个私密的Gist,也就是说这个Gist将不能被他人搜索到而只对直接在浏览器中输入其URL的人可见。 2. 能像wiki一样记录历史 如果您修改了已经发布了的Gist的话,之前的所有版本都将被保存。您可以点击Revisions按钮按时间浏览,而且您可以通过内置的diff引擎查看任意两个版本间的差异。 这也可以用于比较文本文件。 3. 发布富文本内容 虽然Gist只能用纯文本来写,但是您可以用markdown来发布html格式的Gist。您可以添加列表、图片(已有图床上的)和表格。当您用markdown的时候不要忘了文件名要以.md为后缀。 4. 把Gist当作一个写作平台 虽然现在有很多写作引擎,比如Blogger、Medium、Tumblr,但您还可以用Gist来快速发布您的作品。您可以用纯文本或者markdown等文档标记语言些一个Gist然后用http://roughdraft.io来把它作为一个独立的网页发布。 5. 托管gist上的单个页面 Bl.ocks 是一个非常有趣的专为Gist开发的应用。 您可以用纯文本把HTML、CSS、JavaScript代码写下来以index.html为文件名保存为Gist,然后用http://bl.ocks.org把渲染好的结果在浏览器中展示出来。比如,这个gist展示出来就是这样。 显然宽带限制是一个问题,但是http://bl.ock.org作为一个通过Gist托管HTML的工具仍然是相当不错的。 当然您也可以用Google Drive。 6. 制作任务列表 您可以用Gist跟踪待处理任务(举个栗子)。这是用纯文本的特殊语法写的但是你可以任意勾选。 - [x] Pick the flowers - [ ] Call John 9303032332 - [x] Cancel cable subscription - [ ] Book the flight tickets 您可以勾选或者勾去任意选项,源文本将会自动变更。如果您的Gist是公有的的话,任何人都可以看到您的列表,但是只有您(拥有者)可以改变其勾选状态。 备注:其实任务列表也可以在issue中建立,所有拥有写权限的人都可以uncheck/check。 7. 把Gist作为一个网页收藏夹 在Chrome浏览器您可以找到一个叫GistBox的插件,通过这个插件您可以在浏览网页时选择保存网页内容为Gist。您甚至可以添加标注或者话题标签以易于以后更容易找到它们。 8. 把Gist嵌入网页中 您用一行js代码就可以把任何一条Gist嵌入到网页中。嵌入的Gist格式不发生任何变化,而且访问者可以非常方便的把它们fork到他们的Github中。要嵌入wordpress的话有这个插件和这个短代码可以使用。 9. 测量访问量 您可以使用Google Analytics查看您的Gist的访问量。因为Gist纯文本中不允许运行js代码,所以我们可以用GA Beacon来记录实时访问Gist的情况。 把如下代码添加到Gist中,用markdown格式保存,这样就在这个Gist中添加了一个透明追踪图像了。

JAVA8 十大新特性详解

一、接口的默认方法 在接口中新增了default方法和static方法,这两种方法可以有方法体 1、static方法 示例代码: public interface DefalutTest { static int a =5; default void defaultMethod(){ System.out.println("DefalutTest defalut 方法"); } int sub(int a,int b); static void staticMethod() { System.out.println("DefalutTest static 方法"); } } 接口里的静态方法,即static修饰的有方法体的方法不会被继承或者实现,但是静态变量会被继承 例如:我们添加一个接口DefalutTest的实现类DefaultTestImpl public class DefaultTestImpl implements DefalutTest{ @Override public int sub(int a, int b) { // TODO Auto-generated method stub return a-b; } } 如下图所示是这个实现类中所有可调用的方法: 在这些方法里面我们无法找到staticMethod方法,则说明接口中的static方法不能被它的实现类直接使用。但是我们看到了defaultMethod,说明实现类可以直接调用接口中的default方法; 那么如何使用接口中的static方法呢??? 接口.static方法调用,如:DefalutTest.staticMethod(); public static void main(String[] args) { DefaultTestImpl dtl = new DefaultTestImpl(); DefalutTest.

StrictMode.setThreadPolicy StrictMode.setVmPolicy

StrictMode严苛模式,检测应用是否有异常警告等。两种使用方法,如下。一个针对线程,一个针对虚拟机 1.StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build()); detectDiskReads().detectDiskWrites()检测硬盘读写,detectNetwork()检测网络。penaltyLog()将警告或者错误信息显示到logcat。 2.StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build()); detectLeakedSqlLiteObjects()检测数据操作对象,detectLeakedClosableObjects()检测对象关闭,penaltyLog()将警告或者错误信息显示到logcat。penaltyDeath()有警告或者错误发生,停止应用。 详细解释请看博文:http://blog.csdn.net/brokge/article/details/8543145/#comments

优达学城自动驾驶汽车-Project 1: Finding Lane Lines 学习笔记1

根据像素的亮度来识别车 车道识别对于Computer vision 来说是一个相对简单的任务。原因是车道一般是白色或黄色 并且很容易和图片中其他的像素区别开来。 在RGB 三信道 的图片中, 白色有很高的R, G, B 的像素值。 所以我们就可以根据这个来threshold并且把低于threshold的像素给filter out 掉。 这里用Python来做演示: #import necessary libraries import matplotlib.pyplot as plt import matplotlib.image as mpimg import numpy as np # Read in the image image = mpimg.imread('test.jpg') # Grab the x and y size and make a copy of the image ysize = image.shape[0] xsize = image.shape[1] # Note: always make a copy rather than simply using "

Pandas 对Dataframe结构排序

Dataframe结构放在numpy来看应该是二维矩阵的形式,每一列是一个特征,上面会有个列标题,每一行是一个样本。 对Dataframe结构的某一列进行排序方法如下: # 对df表中的user_id这一列进行排序,默认是从小到大排 df = df.sort_index(by='user_id') 对多列进行排序方法如下: # 对user_id,sku_id这两列进行排序 df = df.sort_index(by=['user_id', 'sku_id'])

长连接的定义及其优缺点

HTTP长连接(持久化连接): 在一个TCP连接的基础之上,发送多个HTTP请求以及接收多个HTTP响应,这是为了避免每一次请求都去打开一个新的连接。 以下是一张连接与接连接的区别 在HTTP 1.1标准中,所有的请求都认为是长连接,这个时候HTTP长连接的建立不再需要标识单独的长连接信息。然而,在apache2.0中默认的连接超时时间是15秒,而2.2中默认是5秒,减少超时时间是为了服务器能够响更多的请求。 长连接的优点: 1、减少CPU及内存的使用,因为不需要经常的建立及关闭连接,当然高峰并发时CPU及内存也是比较多的; 2、允许HTTP pipelining(HTTP 1.1中支持)的请求及响应模式: 为了便于理解HTTP pipelining,参见下图: 3、减少网络的堵塞,因为减少了TCP请求; 根据RFC 2616 (page 46)的标准定义,单个客户端不允许开启2个以上的长连接,这个标准的目的是减少HTTP响应的时候,减少网络堵塞 4、减少后续请求的响应时间,因为此时不需要建立TCP,也不需要TCP握手等过程; 5、当发生错误时,可以在不关闭连接的情况下进行提示; 长连接的缺点:可能会损害服务器的整体性能,如apache的长连接时间的长短,直接影响到服务器的并发数。 长连接在浏览器中的使用情况: Netscape从4.05开始支持,Netscape不是通过timeout来关闭长连接,它是将空闲连接放置到一个队列中,当有需要向其它服务端建立长连接时,这个时候,它根据LRU(Least Recently Used)算法进行处理,即将最使少使用的空闲连接KILL掉; IE从4.0.1开始支持,IE6、7只支持两个长连接,IE8支持6个,IE 60秒为默认的超时时间,这个值可以在注册表中修改; FF类似IE通过timeout管理长连接,不过,默的是115秒,这个是可能通过配置进行更改的; Opera从4.0开始支持长连接,长连接数可以自定义;

Java使用阿里云OSS对象存储上传图片

示例说明 该案例是OSS Java SDK的示例程序,您可以修改endpoint、accessKeyId、accessKeySecret、bucketName后直接运行。 本示例中的并不包括OSS Java SDK的所有功能,详细功能及使用方法,请参看“SDK手册 > Java-SDK”, 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/preface.html?spm=5176.docoss/sdk/java-sdk/ 调用OSS Java SDK的方法时,抛出异常表示有错误发生;没有抛出异常表示成功执行。 当错误发生时,OSS Java SDK的方法会抛出异常,异常中包括错误码、错误信息,详细请参看“SDK手册 > Java-SDK > 异常处理”, 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/exception.html?spm=5176.docoss/api-reference/error-response OSS控制台可以直观的看到您调用OSS Java SDK的结果,OSS控制台地址是:https://oss.console.aliyun.com/index#/ OSS控制台使用方法请参看文档中心的“控制台用户指南”指南的链接地址是: https://help.aliyun.com/document_detail/oss/getting-started/get-started.html?spm=5176.docoss/user_guide OSS的文档中心地址是:https://help.aliyun.com/document_detail/oss/user_guide/overview.html OSS Java SDK的文档地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/install.html?spm=5176.docoss/sdk/java-sdk OSS开发过程中常见问题链接地址:https://help.aliyun.com/document_detail/32024.html?spm=5176.product31815.6.665.JuvIOS 开发环境: 开发工具:eclipse4.4+jdk7 均64位 OSS Java SDK依赖下列包: aliyun-sdk-oss-2.2.1.jar hamcrest-core-1.1.jar jdom-1.1.jar commons-codec-1.9.jar httpclient-4.4.1.jar(重点) commons-logging-1.2.jar httpcore-4.4.1.jar(重点) log4j-1.2.15.jar 其中,log4j-1.2.15.jar是可选的,需要日志功能的时加入该包。其它包都是必不可少的。 解决办法:您的工程中在加入OSS Java SDK依赖的包,加入方法如下: 如果您的工程是Eclipse。请参考Java-SDK使用手册,”安装”-> “方式二:在Eclipse项目中导入工程依赖的包”; 如果您的工程是maven。则直接添加依赖即可如: <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>2.5.0</version> </dependency> 代码: 阿里云OSS对象存储常量: package com.qianjiang.util.aliyunoss; /** * @class:OSSClientConstants * @descript:阿里云注册用户基本常量 * @date:2017年3月16日 下午5:52:34 * @author sang */ public class OSSClientConstants { //阿里云API的外网域名 public static final String ENDPOINT = "

利用winhex在NTFS文件系统下定位文件,找到其目录项和簇号等等

软件安全的实验,记录一下,首先需要对NTFS文件系统有了解,有时间的推荐先看这篇博客 一、NTFS需要的基础 1、MFT:磁盘上的所有数据都是以文件的形式存储,其中包括元文件。 每个文件都有一个或多个文件记录,每个文件记录占用两个扇区 $MFT元文件就是专门记录每个文件的文件记录。 其中第五个目录是根目录的文件记录。 第一个目录是MFT本身的文件记录。 2、簇号: NTFS文件系统使用逻辑簇号(LCN)和虚拟簇号(VCN)对分区进行管理。 逻辑簇号:既对分区内的第一个簇到最后一个簇进行编号,NTFS使用逻辑簇号对簇进行定位。 虚拟簇号:既将文件所占用的簇从开头到尾进行编号的,虚拟簇号不要求在物理上是连续的。 3、索引项:每个文件在目录中有其索引项。结构如图:其中文件的MFT索引号(3个字节)是我们需要的,是虚拟索引号,是相对的。 4、属性(具体可以看博客): 文件记录由两部分构成,一部分是文件记录头,另一部分是属性列表 10H类型属性它包含文件的一些基本信息 20H类型属性既属性列表,当一个文件需要好几个文件记录时,才会用到20H属性。 30H类型属,该属性用于存储文件名 ,它总是常驻属性。 80H属性 80H属性是文件数据属性,该属性容纳着文件的内容 5、runlist(在80或者A0属性里面可以找到): 当属性不能存放完数据,系统就会在NTFS数据区域开辟一个空间存放,这个区域是以簇为单位的。 Run List就是记录这个数据区域的起始簇号和大小 举个栗子 31 0C 2C 22 45 其中3表示有3个字节表示这个数据流的开始簇号即 2C 22 45 1表示有1个字节描述这个数据流的大小即0C 当有多个Run List 的时候,都需要计算,并且相加,得到多个数据流。 二、具体实现(为了计算方便(懒),举例本机E盘上的一个140M左右的文件) (1)选取的是文件12345aa.pdf,大小约140M: (2)首先借助winhex工具打开可以直接得到其簇号,并且知道它直接位于E盘根目录之下(作为我们定位的验证)如下图: (3)大概的流程: (MFT的结构一般第五个目录就是根目录,并且其一个目录一般都是2个扇区即一个字节,MFT逻辑簇号不是连续的,根目录也是,需要runlist来计算出,它到底有几个数据流,数据流的起始位置和大小分别是多少!) 算出MFT中第五个目录即根目录的扇区位置,转到该扇区得到根目录的runlist 计算出根目录所在的扇区,打开根目录,即可以找到我们的文件pdf 根据它在根目录中的数据找到它在MTF中的索引号,得到MTF中的记录 在MTF中找到它真正的数据流,即可以看到真正的文件内容。(因为大于100M,肯定是非常驻) (4)用winhex打开我们的磁盘E盘(每个偏移的具体含义参见更加详细的博客) 分析boot文件可以在0DH中得到一个簇有8个扇区的大小。 030-037H是MFT的开始簇号0x00 00 00 00 00 0C 00 00 040-043H是每个MFT记录的大小为0x00 00 00 F6个簇 1C-1FH是隐藏扇区(MBR到DBR) 0x 00 00 10 00簇 (5)计算MFT本身的数据流情况 跳转到MFT的第一个扇区即6291456扇区,在80h属性处得到rundate 33 80 D1 00 00 00 0C 起始簇号786432 大小为53632簇 包括214528个目录项