function moveEnd(obj){ obj.focus(); var len = obj.value.length; if (document.selection) {//IE var sel = obj.createTextRange(); sel.moveStart('character',len); sel.collapse(); sel.select(); } else if (typeof obj.selectionStart == 'number' && typeof obj.selectionEnd == 'number') {//非IE obj.selectionStart = obj.selectionEnd = len; } }
作者:一然
linux的ubuntu版本中后台执行node,aws的ec2为例
通过pageant将秘钥aws.pem转换为ppk后缀,存为私钥
然后通过pageant添加秘钥
在通过putty以ubuntu@ec2-54-179-150-61.ap-southeast-1.compute.amazonaws.com登录远程linux
然后可以通过
sudo apt-get update //先更新
sudo apt-get install nodejs //安装node
sudo apt-get install npm //安装node的包管理器 git clone 地址 //克隆git对应的项目 cd 项目目录 npm install //安装项目依赖包 npm run start //运行项目,此时如果关闭putty,node也将退出运行 nonup npm run start & //后台运行命令,这样只要putty通过exit退出,node即可在后台一直运行 ps -aux //查看进程;-a显示其他用户启动的进程;-x查看系统中属于自己的进程;-u启动这个进程的用户和它启动的时间 kill pid对应进程编号 //停止对应pid的进程 ls -la //查看当前目录下文件及状态;-l长格式列出;-a显示所有文件 rm -rf 目录名字 //-r 就是向下递归,不管有多少级目录,一并删除;-f就是直接强行删除,不作任何提示的意思
//以下是查看文件内容命令
cat //由第一行开始显示内容,并将所有内容输出
tac // 从最后一行倒序显示内容,并将所有内容输出
more // 根据窗口大小,一页一页的现实文件内容
less //和more类似,但其优点可以往前翻页,而且进行可以搜索字符
head // 只显示头几行
tail //只显示最后几行
nl //类似于cat -n,显示时输出行号
tailf //类似于tail -f
javascript的归并排序
function merge(left,right){ var re=[]; while(left.length>0 && right.length>0) { if(left[0]<right[0]){ re.push(left.shift()); } else{ re.push(right.shift()); } } return re.concat(left).concat(right); } function mergeSort(array){ if(array.length==1) return array; var mid=Math.floor(array.length/2); var left=array.slice(0,mid); var right=array.slice(mid); return merge(mergeSort(left),mergeSort(right)); } var array=[234,123,1,23,123,2,11]; console.log(mergeSort(array)); /* mergeSort([234,123,1,23,123,2,11]) | V merge( mergeSort([234,123,1]), mergeSort([23,123,2,11]) ); | V merge( merge( mergeSort([234]), mergeSort([123,1]) ), merge( mergeSort([23,123]), mergeSort([2,11]) ) ); | V merge( merge( mergeSort([234]),//arr=[234], merge([123],[1]);//arr=[1,123] ),//arr=[1],left=[234],right=[123] => arr=[1,123,234] merge( merge([23],[123]),//arr=[23,123] merge([2],[11])//arr=[2,11] )//arr=[2],left=[23,123],right=[11] //arr[2,11],left=[23,123],right=[] //arr=[2,11,23,123] ); | V merge([1,123,234],[2,11,23,123]); | V arr=[1],left=[123,234],right=[2,11,23,123] | V arr=[1,2],left=[123,234],right=[11,23,123] | V arr=[1,2,11],left=[123,234],right=[23,123] | V arr=[1,2,11,23],left=[123,234],right=[123] | V arr=[1,2,11,23,123],left=[123,234],right=[] | V arr=[1,2,11,23,123,123,234] */
input等在浏览器中的默认黄色
其实只要设置autocomplete=”off”属性即可去掉
设置如下代码是无效的
input:-webkit-autofill, textarea:-webkit-autofill, select:-webkit-autofill{ background:white !important; }
不过如果一定需要用样式解决可以用(用阴影变相解决)
input:-webkit-autofill, textarea:-webkit-autofill, select:-webkit-autofill{ -webkit-box-shadow: 0 0 0 1000px white inset; }
npm install安装包出错”ERR windows_NT”
淘宝的镜像地址https://npm.taobao.org/
此问题应该是:npm在国内被墙了
其实可以用cnpm解决
npm install -g cnpm
之后通过cnpm安装各类包
一些命令
npm -g install npm@2.9.1 //安装npm到某个版本 npm -g install nv0.12.2 //安装node到某个版本
npm config set strict-ssl false
npm镜像(包下载地址)
npm config set registry "https://registry.npm.taobao.org"
一般这样运气的好的话,速度就会快许多,可能会安装成功。如果你还脸黑,这样设置还是一直卡住无法下载依赖,那就只能使用proxy代理方式来解决了,命令如下:
设置npm获取的代理服务器地址:
npm config set proxy=https://代理服务器ip:代理服务器端口
npm config delete http-proxy npm config delete https-proxy
也可以试试
npm cache clean//清除缓存 npm install
初步使用Node连接Mysql数据库
使用Node做Web页面开发,基本上是连接非关系型数据库mongodb,而这里我还是先尝试连接了一下mysql数据库,因为相对于mysql来说mongodb过于生疏,想着快速出来页面,所以选择相对熟悉一些的mysql。
1. 安装mysql
下载MySQL :MySQL Downloads,并进行安装。安装完,会引导你对数据库进行配置,设置root密码以及创建普通用户以及密码。
2. 安装Node-mysql
通过npm安装mysql的软件包,通过它方便快速调用函数连接mysql数据库。进入项目文件夹,执行npm install mysql –save就行了。
安装完,在项目文件夹的node_modules目录下会生成mysql的目录。
3. 查看readme文档
如果你认真读了README文档,接下来的步骤就不用再看了,避免由于版本不一致而误导你。
4. 连接mysql数据库
进入项目文档,新建TestMysql.js示例,编写如下代码:
var mysql = require('mysql'); var connection = mysql.createConnection({ host : 'localhost', user : 'me', password : 'secret', database : 'my_db' }); connection.connect(); connection.query('SELECT 1 + 1 AS solution', function(err, rows, fields) { if (err) throw err; console.log('The solution is: ', rows[0].solution); }); connection.end();
连接基本参数
- host 主机名,localhost代表本地
- user Mysql用户
- password 密码
- database 连接的数据库
client.connect()连接数据库
client.query()执行SQL语句
client.end()关闭连接。
然后通过node TestMysql.js执行程序,确保你在执行之前已经启动了Mysql服务。
5. 增删改查
使用数据库无外乎增删改查,下面示例可能会对你有些帮助。
var mysql = require('mysql'); var connection = mysql.createConnection({ host : 'localhost', user : 'me', password : 'secret', database : 'my_db' }); connection.connect(); // 增加记录 client.query('insert into test (username ,password) values ("lupeng" , "123456")'); // 删除记录 client.query('delete from test where username = "lupeng"'); // 修改记录 client.query('update test set username = "pengloo53" where username = "lupeng"'); // 查询记录 client.query("select * from test" , function selectTable(err, rows, fields){ if (err){ throw err; } if (rows){ for(var i = 0 ; i < rows.length ; i++){ console.log("%d\t%s\t%s", rows[i].id,rows[i].username,rows[i].password); } } }); connection.end();
在开发web应用程序时,连接池是一个很重要的概念。建立一个数据库连接所消耗的性能成本是很高的。在服务器应用程序中,如果为每一个接收到的客户端请求都建立一个或多个数据库连接,将严重降低应用程序性能。
因此在服务器应用程序中通常需要为多个数据库连接创建并维护一个连接池,当连接不再需要时,这些连接可以缓存在连接池中,当接收到下一个客户端请求时,从连接池中取出连接并重新利用,而不需要再重新建立连接。
var mysql = require('mysql'); var pool = mysql.createPool({ host : 'localhost', port : 3306, database : 'node', user : 'root', password : 'root' }); pool.getConnection(function(err,connection) { if(err) { console.log("建立连接失败"); }else{ console.log("建立连接成功"); console.log(pool._allConnections.length);//1 connection.query('select * from user',function(err,rows) { if(err) { console.log("查询失败"); }else{ console.log(rows); } //connection.destroy(); console.log(pool._allConnections.length);//0 }); } pool.end(); })
angular之service与factory的用法
angular之service与factory的用法
直接上代码
<!DOCTYPE html> <html> <head> <title>Angular JS Forms</title> </head> <body> <h2>AngularJS Sample Application</h2> <div ng-app="mainApp" ng-controller="CalcController"> <p>Enter a number: <input type="number" ng-model="number" /> <button ng-click="square()">X<sup>2</sup></button> <p>Result: {{result}}</p> </div> <script src="http://libs.useso.com/js/angular.js/1.2.9/angular.js"></script> <script> var mainApp = angular.module("mainApp", []); mainApp.factory('MathService', function() { var factory = {}; factory.multiply = function(a, b) { return a * b } return factory; }); mainApp.service('CalcService', function(MathService){ this.square = function(a) { return MathService.multiply(a,a); } }); mainApp.controller('CalcController', function($scope, CalcService) { $scope.square = function() { $scope.result = CalcService.square($scope.number); } }); </script> </body> </html>
AngularJS笔记之directive——scope选项与绑定策略
开门见山地说,scope:{}使指令与外界隔离开来,使其模板(template)处于non-inheriting(无继承)的状态,当然除非你在其中使用了transclude嵌入,这点之后的笔记会再详细记录的。但是这显然不符合实际开发中的需求,因为实际上,我们经常想要我们的指令能够在特定的情况下与外界进行数据上的交互,这就需要借助绑定策略之手了。
大家知道,当scope选项写为scope:{}这种形式的时候,就已经为指令生成了隔离作用域,现在,我们来看看绑定策略的三种形式:& 、= 、@。
首先是@,它将本地作用域和DOM中的属性值绑定起来(且这个属性的值必须是父级作用域中的),什么意思呢?说的简单一点就是假设你在模板中有个双花括号表达式,然后我们把表达式里的内容和html中指令里特定名字的属性绑定起来,还是不懂?看看下面的代码:
<body ng-app="test"> <div ng-controller="ngs"> <input type="text" ng-model="haha" /> <abc for-name="{{ haha }}" for-tem="{{ tem }}"></abc> </div> <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script> <script> var app=angular.module("test",[]); app.directive('abc',function(){ return { restrict:'E', replace:true, template:'<div class="header">冷{{name}}<input type="text" ng-model="name" />{{ aa }}</div>', scope:{ name:'@forName',//属性是传入到template中的值,引号中值是在指令绑定的属性;@是找到的意思(用于字符串) aa:"@forTem"//如上解释(限用于字符串) } } }) .controller('ngs',function($scope){ $scope.tem="呵呵";//仅限字符串 }); </script> </body>
运行结果可想而知,{{ name }}成功地与父控制器中的Name绑定起来了。当然这里也可以这样写
name:’@’ 这样写的话,就默认DOM中的属性名为name了意即 for-name=”{{ Name }}”可简写为name=”{{ Name }}”;其实,另外两个符号=和&也有这样的简写规则,方便起见接下来都使用这种写法。
@到此为止,接下来就是’=’了。=与@的不同点在于,@是针对字符串而用,但=是针对某个对象的引用,
这么说可能不太专业,但就拿上边的例子而言,我们在html中,把Name这个字符串通过一对双花括号传递给for-name属性,但如果我们用了=,这里传入的Name就不应该是一个字符串,而是一个对象的引用。这不是一个很一目了然的概念,所以我用接下来的两个例子诠释它的含义。
<body ng-app="test"> <div ng-controller="ngs"> <input type="text" ng-model="haha" /> <abc for-name="haha" aa="tem"></abc> </div> <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script> <script> var app=angular.module("test",[]); app.directive('abc',function(){ return { restrict:'E', replace:true, template:'<div class="header">冷{{forName}}<input type="text" ng-model="forName" />{{aa[0].name}}</div>', scope:{ forName:'=',//属性是指令绑定的属性,且此属性可以传入到template中去;=是等价的意思(用于对象) aa:'='//跟上解释 } } }) .controller('ngs',function($scope){ $scope.tem=[{name:"哈哈"},{name:"呵呵"}];//类型都可 }); </script> </body>
这就完成了,其实只不过是加了一点小把戏,把ng-model换成了model而已。
注意到,这个例子中,都是使用对象的引用,而不是单纯的字符串,这也是=可以进行双向绑定的关键。
最后是&符号。它的含义是:对父级作用域进行绑定,并将其中的属性包装成一个函数,注意,是属性,意即,任何类型的属性都会被包装成一个函数,比如一个单纯的字符串,或是一个对象数组,或是一个函数方法,如果是字符串、对象数组和无参的函数,那么可想而知,它们都会被包装成一个无参的函数,若是有参的函数方法则反之,并且我们需要为其传入一个对象。
<body ng-app="test"> <div ng-controller="ngs"> <abc for-name="fun()"></abc> </div> <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script> <script> var app=angular.module("test",[]); app.directive('abc',function(){ return { restrict:'E', replace:true, template:'<div class="header">冷<input type="button" ng-click="forName()" value="按钮" /></div>', scope:{ forName:'&'//属性是指令绑定的属性,且此属性可以传入到template中去;&(任何类型的属性都会被包装成一个函数) } } }) .controller('ngs',function($scope){ $scope.fun=function(){ alert(123); } }); </script> </body>
记录angular之directive指令的用法
1.实例1:从最简单的开始
<html ng-app='app'> <body> <hello></hello> </body> <script src="../angular-1.0.3/angular.min.js"> </script> <script src="HelloDirect.js"></script> </html>
对于以上代码里面的<hello>标签,浏览器显然是不认识的,它唯一能做的事情就是无视这个标签。那么,为了让浏览器能够认识这个标签,我们需要使用Angular来定义一个hello指令(本质上说就是自己来把<hello>这种玩意儿替换成浏览器能识别的那些标准HTML标签)。
来看这段温馨的JS代码:
var appModule = angular.module('app', []); appModule.directive('hello', function() { return { restrict: 'E', template: '<div>Hi there</div>', replace: true }; });
以上代码大概看两眼就可以了,不要太在意细节。
然后我们就可以在浏览器里面看到这样的内容:
实际产生的标签结构是这样的:
可以看到,<hello>这个东东已经被<div>Hi there</div>这个标签替换掉了,这也是以上JS代码里面replace:true这行配置的作用,代码里面的template配置 项当然就是我们要的div标签啦,至于restrict:’E’这个配置项的含义,请看下表:
ok,看完上面的表格,对于restrict这个属性相信你已经秒懂了,那么我们来玩儿点花样吧。如果我们需要替换的HTML标签很长,显然不能用 拼接字符串的方式来写,这时候我们可以用templateUrl来替代template,从而可以把模板写到一个独立的HTML文件中。
2.实例2:transclude(变换)
//先看例子,JS代码: var appModule = angular.module('app', []); appModule.directive('hello', function() { return { restrict: 'E', template: '<div>Hi there <span ng-transclude></span></div>', transclude: true }; });
//HTML代码: <html ng-app='app'> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> </head> <body> <hello> <br/> <span>原始的内容,</span> <br/> <span>还会在这里。</span> </hello> <hello> </hello> </body> <script src="../angular-1.0.3/angular.min.js"></script> <script src="Transclude.js"></script> </html>
运行效果如下:
生成的HTML标签结构如下:
和第一个例子对比,这个例子的JS和HTML代码都略有不同,JS代码里面多了一个transclude: true,HTML代码里面在<hello>内部出现了子标签。
按照我们在第一个例子中的说法,指令的作用是把我们自定义的语义化标签替换成浏览器能够认识的HTML标签。那好,如果我们自定义的标签内部出现了子标签,应该如何去处理呢?很显然,transclude就是用来处理这种情况的。
对于当前这个例子,transclude的作用可以简化地理解成:把<hello>标签替换成我们所编写的HTML模板,但是<hello>标签内部的内容保持不变。
很显然,由于我们没有加replace:true选项,所以<hello>标签还在,没有被替换掉。同时,通过这个例子你还还会发现一 个暗藏的属性,那就是浏览器实际上非常智能,虽然它并不认识<hello>这个标签,但是页面没有出错,它只是默默地把这个标签忽略掉了!怎 么样?是不是碉堡了?
你可以自己在上面的JS代码里面加上replace:true,然后再看生成的HTML结构。
php历遍json对象
//直接上例子: $string={"文字1":{"link":"链接","son":{"文字11":"链接","文字12":"链接"}},"文字2":{"link":"链接"}}; $json=json_decode($string,true); foreach($json as $key=>$arr) { echo "[$key]=".$arr['son']." *****<br />";//前者是key后者是值(值可能还是数组) foreach($arr as $keyChild=>$arrChild) { echo “[$keyChild]=$arrChild —–<br />”; } }