背景:如果用前端的js去做比较两个小数点1位的温度谁高谁低,那么直接用大于符号小于符号会有点问题,这篇文章就是讲解这一块的事情。

var定义的变量应该是字符串,有时没有经过类型转换而进行比较的话,小于十的话还可以,如果大于十就会出错。
js提供了parseInt()和parseFloat()两个转换函数。前者把值转换成整数,后者把值转换成浮点数。只有对String类型调用这些方法,这两个函数才能正确运行;对其他类型返回的都是NaN(Not a Number)。

例:
var hour_select_begin=$('#hour_select_begin option:selected').text();
var hour_select_end=$('#hour_select_end option:selected').text();
if(hour_select_begin>hour_select_end){
alert("开始时间不能大于结束时间");
return false;
}

这时如果 hour_select_begin>=10 则判断会有问题;
修正方法1:
if(eval_r(hour_select_begin)>eval_r(hour_select_end)){
alert("开始时间不能大于结束时间");
return false;
}
修正方法2:
将String转为number类型: hour_select_begin=hour_select_begin-0;
hour_select_begin=hour_select_end -0;


补充:
js 字符串转换数字  
方法主要有三种

转换函数、强制类型转换、利用js变量弱类型转换。

1. 转换函数:

js提供了parseInt()和parseFloat()两个转换函数。前者把值转换成整数,后者把值转换成浮点数。只有对String类型调用这些方法,这两个函数才能正确运行;对其他类型返回的都是NaN(Not a Number)。



一些示例如下:

parseInt("1234blue"); //returns 1234
parseInt("0xA"); //returns 10
parseInt("22.5"); //returns 22
parseInt("blue"); //returns NaN



parseInt()方法还有基模式,可以把二进制、八进制、十六进制或其他任何进制的字符串转换成整数。基是由parseInt()方法的第二个参数指定的,示例如下:

parseInt("AF", 16); //returns 175
parseInt("10", 2); //returns 2
parseInt("10", 8); //returns 8
parseInt("10", 10); //returns 10
如果十进制数包含前导0,那么最好采用基数10,这样才不会意外地得到八进制的值。例如:
parseInt("010"); //returns 8
parseInt("010", 8); //returns 8
parseInt("010", 10); //returns 10



parseFloat()方法与parseInt()方法的处理方式相似。
使用parseFloat()方法的另一不同之处在于,字符串必须以十进制形式表示浮点数,parseFloat()没有基模式。

下面是使用parseFloat()方法的示例:
parseFloat("1234blue"); //returns 1234.0
parseFloat("0xA"); //returns NaN
parseFloat("22.5"); //returns 22.5
parseFloat("22.34.5"); //returns 22.34
parseFloat("0908"); //returns 908
parseFloat("blue"); //returns NaN

2. 强制类型转换

还可使用强制类型转换(type casting)处理转换值的类型。使用强制类型转换可以访问特定的值,即使它是另一种类型的。
ECMAScript中可用的3种强制类型转换如下:
Boolean(value)——把给定的值转换成Boolean型;
Number(value)——把给定的值转换成数字(可以是整数或浮点数);
String(value)——把给定的值转换成字符串。
用这三个函数之一转换值,将创建一个新值,存放由原始值直接转换成的值。这会造成意想不到的后果。
当要转换的值是至少有一个字符的字符串、非0数字或对象时,Boolean()函数将返回true。如果该值是空字符串、数字0、undefined或null,它将返回false。

可以用下面的代码段测试Boolean型的强制类型转换。

Boolean(""); //false – empty string
Boolean("hi"); //true – non-empty string
Boolean(100); //true – non-zero number
Boolean(null); //false - null
Boolean(0); //false - zero
Boolean(new Object()); //true – object

Number()的强制类型转换与parseInt()和parseFloat()方法的处理方式相似,只是它转换的是整个值,而不是部分值。示例如下:

用  法 结  果
Number(false) 0
Number(true) 1
Number(undefined) NaN
Number(null) 0
Number( "5.5 ") 5.5
Number( "56 ") 56
Number( "5.6.7 ") NaN
Number(new Object()) NaN
Number(100) 100  

最后一种强制类型转换方法String()是最简单的,示例如下:

var s1 = String(null); //"null"
var oNull = null;
var s2 = oNull.toString(); //won’t work, causes an error

3. 利用js变量弱类型转换

举个小例子,一看,就会明白了。
<script>
var str= '012.345 ';
var x = str-0;
x = x*1;
</script>

上例利用了js的弱类型的特点,只进行了算术运算,实现了字符串到数字的类型转换,不过这个方法还是不推荐的





转换成数字
ECMAScript提供了两种把非数字的原始值转换成数字的方法,即parseInt()和parseFloat()。
注意:只有对String类型(Number除外)调用这些方法,才能正确运行对其他类型返回的都是NaN。
例如:
Js代码
var iNum1 = parseInt(“1234blue”);//returns 1234    var iNum2 = parseInt(“oxA”); //returns 10    var iNum3 = parseInt(“22.5″); //returns 22    var iNum4 = parseInt(“blue”); //returns NaN  
以下其他类型转换
一、类型转换
1.转换成字串
ECMAScript的Boolean值、数字和字串的原始值的有趣之处在于它们是伪对象,这意味着它们实际上具有属性和方法。
如:
Js代码
var sColor = “blue”;  
alert(sColor.length);//outputs “4″  
总而言之,3种主要的原始值Boolean值、数字和字串都有toString()方法。ECMAScript定义的所有对象都有toString()方法,无论它是伪对象,还是真的对象。
Boolean型的toString()方法只是输出”true”或”false”,结果由变量的值决定:
Js代码
var bFound = false;  
alert(bFound.toString());//outputs “false”  
Number类型的toString()方法比较特殊,它有两种模式,即默认模式和基模式,采用默认模式,toString()方法只是用相应的字符串输出数字值(无论是整数、浮点数还是科学记数法)。
Js代码
var iNum1 = 10;    var fNum2 = 10.0;    alert(iNum1.toString()); //outputs “10″    alert(fNum2.toString()); //outputs “10″  
采用Number类型的toString()方法的基模式,可以用不同的基(进制基数)输出数字。
Js代码
var iNum = 10;    alert(iNum.toString(2));  //outputs “1010″    alert(iNum.toString(8));  //outputs “12″    alert(iNum.toString(16)); //outputs “A”  
2.转换成数字
ECMAScript提供了两种把非数字的原始值转换成数字的方法,即parseInt()和parseFloat()。
注意:只有对String类型(Number除外)调用这些方法,才能正确运行对其他类型返回的都是NaN。
例如:
Js代码
var iNum1 = parseInt(“1234blue”);//returns 1234    var iNum2 = parseInt(“oxA”); //returns 10    var iNum3 = parseInt(“22.5″); //returns 22    var iNum4 = parseInt(“blue”); //returns NaN  
parseInt()方法还有基模式,可以把二进制、八进制、十六进制或者其他任何进制的字符串转换成十进制整数。第二个参数指定按哪一种进制来解析。
Js代码
var iNum1 = parseInt(“AF”,16);// returns 175    var iNum2 = parseInt(“10″,2); // returns 2    var iNum3 = parseInt(“10″,8); //returns 8    var iNum4 = parseInt(“10″,10); //returns 10  
说明:如果十进制数包含前导0,那么最好采用基数10,否则得到的是八进制的值。
Js代码
var iNum1 = parseInt(“010″);  // returns 8    var iNum2 = parseInt(“010″,8); //returns 8    var iNum3 = parseInt(“010″,10);//returns 10  
parseFloat()方法与parseInt()方法的处理方式相似,从位置0开始查看每个字符,直到找到第一个非有效的字符为止,然后把该字符之前的字串转换成数字。对于这个方法来说,第一个出现的小数点是有效字符。如果用两个小数点,第二个小数点将被看作无效的。使用该方法的另一个不同之处在于,字串必须以十进制形式表示浮点数。
Js代码
var fNum1 = parseFloat(“1234blue”); //returns 1234.0    var fNum2 = parseFloat(“0xA”); //returns NaN   var fNum3 = parseFloat(“22.5″); //returns 22.5    var fNum4 = parseFloat(“22.34.5″);//returns 22.34    var fNum5 = parseFloat(“0908″);//returns NaN    var fNum6 = parseFloat(“blue”);//returns NaN  
3.强制类型转换
ECMAScript中可用的3种强制类型转换如下:
(1).Boolean(value)
把给定的值转换成Boolean型。
当要转换的值是至少有一个字符的字符串、非0数字或对象时,Boolean()函数将返回true。如果该值是空字符串、数字0、undefined或null,它将返回false。
如:
Js代码
var b1 = Boolean(“”); // false;    var b2 = Boolean(“hi”);//true    var b3 = Boolean(100);//true    var b4 = Boolean(null);//false    var b5 = Boolean(0);//false    var b6 = Boolean(new Object());//true  
(2).Number(value)
把给定的值转换成数字(可以是整数或浮点数)。
还记得parseInt()和parseFloat()方法只转换第一个无效字符之前的字符串,因此”4.5.6″将被转换为”4.5″。用Number()进行强制类型转换,”4.5.6″将返回NaN,因为整个字符串值不能转换成数字。如果字符串能被完整地转换,Number()将判断是调用parseInt()方法还是调用parseFloat()方法。
如:
Js代码
Number(false);//0    Number(true);//1    Number(undefined);//NaN    Number(null);//0    Number(“5.5″);//5.5    Number(“56″);//56    Number(“5.6.7″);//NaN    Number(new Object());//NaN    Number(100);//100  
(3).String(value)
把给定的值转换成字串。
与调用toString()方法的唯一不同之处在于,对null或undefined值强制类型转换可以生成字符串而不引发错误:
Js代码
var s1 = String(null);//”null”    var oNull = null;    var s2 = oNull.toString();//causes an error  
二、引用类型
引用类型通常叫作类(class),也就是说,遇到引用值时,所处理的就是对象。ECMAScript定义了“对象定义”,逻辑上等价于其他程序设计语言中的类。
1.Object类
ECMAScript中的所有类都由这个类继承而来,Object类中的所有属性和方法都会出现在其他类中(被覆盖)。
Object类的属性:
(1).Constructor—-对创建对象的函数的引用(指针)。对于Object类,该指针指向原始的object()函数。
(2).Prototype—-对该对象的对象原型的引用。对于所有的类,它默认返回Object对象的一个实例。 一、类型转换
1.转换成字串
ECMAScript的Boolean值、数字和字串的原始值的有趣之处在于它们是伪对象,这意味着它们实际上具有属性和方法。
如:
Js代码
var sColor = “blue”;   alert(sColor.length);//outputs “4″  
总而言之,3种主要的原始值Boolean值、数字和字串都有toString()方法。ECMAScript定义的所有对象都有toString()方法,无论它是伪对象,还是真的对象。
Boolean型的toString()方法只是输出”true”或”false”,结果由变量的值决定:
Js代码
var bFound = false;   alert(bFound.toString());//outputs “false”  
Number类型的toString()方法比较特殊,它有两种模式,即默认模式和基模式,采用默认模式,toString()方法只是用相应的字符串输出数字值(无论是整数、浮点数还是科学记数法)。
Js代码var iNum1 = 10;   var fNum2 = 10.0;   alert(iNum1.toString()); //outputs “10″  alert(fNum2.toString()); //outputs “10″  
采用Number类型的toString()方法的基模式,可以用不同的基(进制基数)输出数字。
Js代码var iNum = 10;   alert(iNum.toString(2));  //outputs “1010″  alert(iNum.toString(8));  //outputs “12″  alert(iNum.toString(16)); //outputs “A”  
parseInt()方法还有基模式,可以把二进制、八进制、十六进制或者其他任何进制的字符串转换成十进制整数。第二个参数指定按哪一种进制来解析。
Js代码var iNum1 = parseInt(“AF”,16);// returns 175  var iNum2 = parseInt(“10″,2); // returns 2  var iNum3 = parseInt(“10″,8); //returns 8  var iNum4 = parseInt(“10″,10); //returns 10  
说明:如果十进制数包含前导0,那么最好采用基数10,否则得到的是八进制的值。
Js代码var iNum1 = parseInt(“010″);  // returns 8  var iNum2 = parseInt(“010″,8); //returns 8  var iNum3 = parseInt(“010″,10);//returns 10  
parseFloat()方法与parseInt()方法的处理方式相似,从位置0开始查看每个字符,直到找到第一个非有效的字符为止,然后把该字符之前的字串转换成数字。对于这个方法来说,第一个出现的小数点是有效字符。如果用两个小数点,第二个小数点将被看作无效的。使用该方法的另一个不同之处在于,字串必须以十进制形式表示浮点数。
Js代码var fNum1 = parseFloat(“1234blue”); //returns 1234.0  var fNum2 = parseFloat(“0xA”); //returns NaN  var fNum3 = parseFloat(“22.5″); //returns 22.5  var fNum4 = parseFloat(“22.34.5″);//returns 22.34  var fNum5 = parseFloat(“0908″);//returns NaN  var fNum6 = parseFloat(“blue”);//returns NaN  
3.强制类型转换
ECMAScript中可用的3种强制类型转换如下:
(1).Boolean(value)
把给定的值转换成Boolean型。
当要转换的值是至少有一个字符的字符串、非0数字或对象时,Boolean()函数将返回true。如果该值是空字符串、数字0、undefined或null,它将返回false。
如:
Js代码var b1 = Boolean(“”); // false;  var b2 = Boolean(“hi”);//true  var b3 = Boolean(100);//true  var b4 = Boolean(null);//false  var b5 = Boolean(0);//false  var b6 = Boolean(new Object());//true  
(2).Number(value)
把给定的值转换成数字(可以是整数或浮点数)。
还记得parseInt()和parseFloat()方法只转换第一个无效字符之前的字符串,因此”4.5.6″将被转换为”4.5″。用Number()进行强制类型转换,”4.5.6″将返回NaN,因为整个字符串值不能转换成数字。如果字符串能被完整地转换,Number()将判断是调用parseInt()方法还是调用parseFloat()方法。
如:
Js代码Number(false);//0  Number(true);//1  Number(undefined);//NaN  Number(null);//0  Number(“5.5″);//5.5  Number(“56″);//56  Number(“5.6.7″);//NaN  Number(new Object());//NaN  Number(100);//100  
(3).String(value)
把给定的值转换成字串。
与调用toString()方法的唯一不同之处在于,对null或undefined值强制类型转换可以生成字符串而不引发错误:
Js代码
var s1 = String(null);//”null”  var oNull = null;   var s2 = oNull.toString();//causes an error  
二、引用类型
引用类型通常叫作类(class),也就是说,遇到引用值时,所处理的就是对象。ECMAScript定义了“对象定义”,逻辑上等价于其他程序设计语言中的类。
1.Object类
ECMAScript中的所有类都由这个类继承而来,Object类中的所有属性和方法都会出现在其他类中(被覆盖)。
Object类的属性:
(1).Constructor—-对创建对象的函数的引用(指针)。对于Object类,该指针指向原始的object()函数。
(2).Prototype—-对该对象的对象原型的引用。对于所有的类,它默认返回Object对象的一个实例。

转自:http://blog.sina.com.cn/s/blog_4b7b2fc501010xar.html
背景:做温控,存在小数位数设置到整数时,没有小数后一位,需要补齐,于是格式化势在必行,像c有sprintf,javascript还不清楚,于是查了下,也有类似的函数来实现这样的功能:i1.toFixed(1),也就是:$("#controlTempValue").html(toFixed(setTempRature,1));。
——————————————————————————————————————————————————————————


如果出现:ToFixed() Is Not A Function?
TypeError: setTempRature.toFixed is not a function  
var setTempRatureDisplay = setTempRature.toFixed(1);
使用toFixed对小数四舍五入的时候,弹出以下错误提示:

toFixed() is not a function
后来还是在stackoverflow上找到了答案

toFixed isn’t a property of non-numeric variable types. In other words, Low and High can’t be fixed because when you get the value of something in Javascript, it automatically is set to a string type. Using parseFloat() (or parseInt() with a radix, if it’s an integer) will allow you to convert different variable types to numbers which will enable the toFixed() function to work.
var Low = parseFloat($SliderValFrom.val()),
var High = parseFloat($SliderValTo.val());
原来toFixed只能针对数字类型才能使用,所以对于字符类型的要用parseFloat或者parseInt函数先转一下再调用
摘自:http://www.jason-z.com/tofixed-is-not-a-function/
——————————————————————————————————————————————————————————
在客户js中,我们时常会碰到处理这样的小数类型(转换为字符串):

var i = 1234.8700

document.write("i")  //结果:1234.87   我们想要的结果是1234.8700

也就是小数的有效位数为4位.js中有一个处理这种情况的函数,toFixed(小数有效位数).

如:

var i1 = 3456.244280;
alert(i1.toFixed(2)); // 输出 1024.24

var i2 = 3456.24558;
alert(i2.toFixed(2)); // 输出 1024.25

var i3 = 3456.2;
alert(i3.toFixed(2)); // 输出 1024.20

摘自:http://www.cnblogs.com/rainnight/archive/2009/02/10/1387483.html
    简单就是最终极的复杂。


—Leonardo da Vinci

    发现您爱做的事情是弥足珍贵的,我鼓励您继续下去。忠诚于您的天赋并对其价值保持自信。


—Jonathan Ive

    越快得到真实数据越好,这将会让您看到您的努力是否起作用了。


—Luke Wroblewski

    忘掉那些漂亮的图片吧,帮助人们做他们想做的事情。


—Dirk Knemeyer

    原型不是终点,它们是手段。


—Dirk Knemeyer

    每个行为都是一种沟通方式。


—Paul Watzlawick

    如果每件事都很重要的话,那就没有什么是重要的了。


—Andrei Herasimchuk

    满足需求是平庸之为,引领需求才是高手之道。


—Jobs

    凡墙总是门


—禅语

    设计要打动别人,首先须打动自己


—路人

    设计就是在约束之内寻找解决方案,若无约束,就不是设计,是艺术。


Matias Duarte
背景:【总理到访中关村创业大街 问“你们都用什么手机啊?”】今日,总理李克强到访中关村创业大街,众多员工都拿出手机拍照,总理见状,询问众人“你们都用什么手机啊?”“苹果”、“三星”、“小米”、“中兴”、“华为”,众人争相回答。李克强感慨了一句“还是苹果跟三星的多啊。”是不是挺有深意的!

回顾历史,假如潘金莲家里有一部国产手机:
假如潘金莲家里有手机,她在家里就不会闷,会在家安安静静的玩手机,也不会开窗吹风。那么就不会遇到西门庆,不遇到西门庆金莲就不会出轨,不出轨,武松就不会被逼上梁山,武松不上梁山,方腊就不会被擒,可取得大宋江山,就不会有靖康之耻,也没有金兵入关,更不会有大清朝,不会闭关锁国,不会有鸦片战争八国联军。中国将是世界上唯一的超级大国!总而言之,原来有手机真的是太重要了!

如果潘金莲家里有手机
首先得有移动通信网络和电网
移动通信是起源于战争的技术
也就是说那时候中国不仅已经进行了工业革命还打过大型战争
领先世界几百年有了电子技术
本来就已经是超级大国了
于是就会变成一排宋军拿着重机枪在长城上扫射蒙古骑兵
一)他怎么知道缓存在那个目录呢?
You can add a line in wp-config.php like below:
define( 'RT_WP_NGINX_HELPER_CACHE_PATH','/var/run/nginx-cache');

root@101.200.228.135:/data/htdocs/jackxiang.com# grep -r "RT_WP_NGINX_HELPER_CACHE_PATH" ./
./wp-content/plugins/nginx-helper/nginx-helper.php:        define('RT_WP_NGINX_HELPER_CACHE_PATH', '/var/run/nginx-cache');
./wp-content/plugins/nginx-helper/purger.php:                   if (!defined('RT_WP_NGINX_HELPER_CACHE_PATH')) {
./wp-content/plugins/nginx-helper/readme.txt:`define('RT_WP_NGINX_HELPER_CACHE_PATH','/var/run/nginx-cache/');`

vim打开上面文件替换:
%s/\/var\/run\/nginx-cache/\/data\/cache\/ngx_fcgi_cache2/g
二)总配置:/conf/nginx.conf


三)分配置:/conf/vhost/jackxiang.conf 阅读全文
背景:Newest 'owncloud' Questions - Stack Overflow Track down PHP error “Comments starting with '#' are deprecated in Unknown on line 1 at Unknown#0” I've just set up a RPi 2 with the latest ...

PHP Deprecated: Comments starting with '#' are deprecated in *.ini 警告解决办法

新装的CentOS7 64系统,使用新立得装的PHP 版本,但是每次我在命令行下执行php脚本时都会出如下的警告信息:

PHP Deprecated:  Comments starting with '#' are deprecated in /etc/php5/cli/conf.d/mcrypt.ini on line 1 in Unknown on line 0

上网查了一下,原来是新版本的PHP不赞成用'#'号作为注释符号,需要用分号';'。打开这个文件,把里面的#替换成;号,问题解决!

摘自:http://blog.csdn.net/rainday0310/article/details/6330115

Shell脚本风格的单行注释

  这种注释方式使用"#"的形式实现,它的用法与C++语言风格注释方式相似。使用Shell脚本风格进行单行注释的PHP示例代码如下:



参考:http://jackxiang.com/post/6532/
wget -c http://www.itkb.ro/userfiles/file/libiconv-glibc-2.16.patch.gz
cd libiconv-1.14/srclib
patch -p1 stdio.in.h
俺运行patch后好久都没有反应 :( 最后人肉修改
这个补丁的内容如上,用unzip包解压后rz上CentOS7上去,修改成下面这样:
/data/software/libiconv-1.14/srclib/stdio.in.h


参考来自:http://forum.z27315.com/topic/15662-%E8%A7%A3%E5%86%B3%E7%BC%96%E8%AF%91libiconv%E6%97%B6%E7%9A%84gets-undeclared-here%E9%94%99%E8%AF%AF/
背景:在centos7上安装hhvm包遇到这个Supervisor安装的问题,   hhvm速度很快,但由于与网站程序兼容性或hhvm本身不成熟,跑一段时间后会出现hhvm宕掉,使前台页面出现502 bad gateway。为了防止hhvm进程自动宕掉,我们可以用Supervisor来管理hhvm进程,它会在hhvm宕掉后自动启动hhvm进程。
Supervisor已经加到《lnmp一键安装包》,欢迎测试。
http://ju.outofmemory.cn/entry/236584

1.hhvm是不是不支持缩略图啊,我用hhvm就没缩略图,转换成php就有了,用timthumb.php生成缩略图(hhvm 好像 timthumb兼容性有问题):
环境是HHVM NGINX
timthumb有些图能截取,大部分都截取不了了。但是去掉 最后的&h=图片高度&w=图片宽度&zc=1 这个参数又能打开
解决办法:http://www.cmhello.com/timthumb.html

2.Hhvm配置memcached加速wordpress运行:
http://www.wordpressnote.com/hhvm-memcached-wordpress/

ps -ef | grep super supervisord 这个进程在吗?
service supervisord restart
现在hhvm交给supervisord管理了

HHVM相关教程请参考如下:
CentOS 7下hhvm Nginx环境搭建:http://blog.linuxeye.com/402.html
CentOS 6下hhvm Nginx环境搭建:http://blog.linuxeye.com/396.html

Supervisor简介
Supervisor是一个Python开发的client/server系统,可以管理和监控*nix上面的进程。

部件
Supervisor有不同的部件组成,部件分别负责不同的功能,对进程进行监控和管理。

supervisord
Supervisor的server部分称为supervisord。主要负责管理子进程,响应客户端的命令,log子进程的输出,创建和处理不同的事件

supervisorctl
Supervisor的命令行客户端。它可以与不同的supervisord进程进行通信,获取子进程信息,管理子进程

Web Server
Supervisor的web server,用户可以通过web对子进程进行监控,管理等等,作用与supervisorctl一致。

XML-RPC interface
XML-RPC接口,提供XML-RPC服务来对子进程进行管理,监控

安装Supervisor
安装supervisor很简单,通过easy_install就可以安装

yum -y install python-setuptools

easy_install supervisor
安装完成之后,就可以用echo_supervisord_conf命令来生成配置文件

echo_supervisord_conf > /etc/supervisord.conf
配置supervisor管理hhvm进程
vi /etc/supervisord.conf
pidfile=/tmp/supervisord.pid 改成
pidfile=/var/run/supervisord.pid
#并在/etc/supervisord.conf后面追加如下内容:


supervisor开机脚本

wget https://github.com/Supervisor/initscripts/raw/master/redhat-init-mingalevme
/bin/mv redhat-init-mingalevme /etc/init.d/supervisord
chmod +x /etc/init.d/supervisord
chkconfig supervisord on
service supervisord restart
测试Supervistor

摘自:http://blog.linuxeye.com/408.html
参考:http://www.cnblogs.com/yjf512/archive/2012/03/05/2380496.html

本站参考:http://jackxiang.com/post/7693/
监控php的守护进程(没实践), 可以开多个,并同时监控:
关于Worker守护进程的启动和监控
上面例子中直接启动worker脚本作为守护进程,无法监控到worker进程是否存活.
使用Unix进程监控supervisord则可轻松解决这个问题.
将如下配置添加到supervisord的配置中,即可实现由supervisord来启动和监控myworker.
背景:整了一把hhvm,发现其对wordpress支持还不错,对bo-blog也还成,但是bo-blog里的验证码好像就不行了,对owncloud直接就歇菜了出现内部服务器错误。那就还回常规的php吧,出现:
[root@jackxiang vhost]# service nginx start
Starting nginx... Enter PEM pass phrase:
Enter PEM pass phrase:
Enter PEM pass phrase:
nginx: [alert] mmap(MAP_ANON|MAP_SHARED, 134217728) failed (12: Cannot allocate memory)


——————————————————————————————————————————————————
按照以往的设置,直接设定fastcgi_cache:
fastcgi_cache_path /data/nginx/fastcgi_cache levels=1:2 keys_zone=ngx_fcgi_cache:150m inactive=1d max_size=40g;

但是,出现错误:
nginx: [alert] mmap(MAP_ANON|MAP_SHARED, 536870912) failed (12: Cannot allocate memory)

原因是共享内存空间设置过大,系统已没有足够的内存分配,导致无法启动nginx,可以将上面的keys_zone=ngx_fcgi_cache:150m,设置小一些,例如keys_zone=ngx_fcgi_cache:50m,即可。

最后,
为何没有足够的内存分配?是因为我在虚拟机里面又装了一个virtual box,里面装了一个windows 2003,它里面装了一个Rtx Server,于是没啥内存了。

后记,
有兄弟建议:HHVM对GD支持OK么,现在研究hhvm。。不如耐心等10月phpng。
我的回复是:不清楚呢,我也是昨天才安成功了hhvm,用的群里兄弟贴的链接地址。
提前体验一下,这块我觉得这块是智能化还是傻瓜化:
我发现这个hhvm某个链接访问后,一段时间再访问好像又重新编译了。
但如果访问频率很快呢,就会发现性能的确还不错...这块新版PHP得规避。
http://jingyan.baidu.com/article/4b52d70250e7f5fc5d774b7d.html
背景:开发web程序来讲,凡是用户输入都不可信的原则,加强web应用的安全性培训笔记,主要是有这个安全的意识至关重要,形成梯队、纵深、层层防御体系至关重要。

1=1注入,主要是输入过滤:
数字型:?ID=120 and 1=1
字符型:单引号保障其完整性,闭合,形成完整查询。
搜索型:模糊搜索,like,test=adb%abc%。

信息泄漏
拖库
执行恶意代码获取administrator。
如何杜绝sql inject:参数化,检测非法字符,安全api。

身份认证,会话管理(放服务器验证别放前台)。
提升用户不存在,密码错误(弱密码)。撞库。
验证码饶过:网站回退,验证码名称和图片名一致;把验证码放session验证。

xss攻击:网站用户。输入js代码盗取cookie。javascript 尖括号过滤。跨站脚本主要是对用户的攻击,对服务器没有用。

越权漏洞:我可以修改你的资料。
春秋航空,update?id=xxx xxx变yyy。
垂直越权:访问更高级别的用户权限。
test 访问到了管理界面,发现按钮是灰色,F12 直接修改去disable,可点击,后没添加按钮,div disable=none,打开后就可以修改了(输入必填项),成功后再次登录,成功越权。

不安全的直接对象引用(xia z):
任意文件引用~下载路径:.. 上一路径。
查看到系统的路径,网站源码。修复:只让输入.xml的,下源码%00终结符号:password=a.php%00download.xml
Ngnix在遇到%00空字节时与后端FastCGI处理不一致,导致可以在图片中嵌入PHP代码然后通过访问xxx.jpg%00.php来执行其中的代码
影响版本:
nginx 0.5.*
nginx 0.6.*
nginx 0.7 <= 0.7.65
nginx 0.8 <= 0.8.37

而新漏洞的利用方式是:
/test.jpg%00.php
对应fastcgi_script_name的匹配正则,我们会发现是匹不到这个漏洞的,所以非常杯具,以前被老nginx漏洞黑过的肉鸡还能被重新黑一次。
一般这个漏洞需要在能够上传文件的应用中才能被利用,所以论坛首当其冲,象discuz论坛的两个文件就能非常方便的识别这个漏洞。
解决方法:升级Nginx
摘录自:http://www.unhonker.com/bug/153.html
——————————————————————————————————————————————————————————————————
重定向漏洞:
redirect 检验refer。

上传漏洞:
只前台校验后缀。
可以用工具干掉那块校验的js,截包工具,fiddler2,再查查。传shell啥的,控制主机。

未验证的访问重定向:
?url=http://api.开放平台网址.cn/gettoken?code=xxxx  对跳转地址输入处(浏览器参数)做验证(用户填写的申请的网站回调获取code的url地址),其它地址不让他跳转。
借来GPRS模块试了一下,http.get方法还是很容易的,估计POST也简单,就不试了.

查了一下,貌似没有任何资料有关SIM900a模块HTTP 1.1长链接的事情,如果不支持长链接,需要上位机给下位机实时发消息,就只能用TCP了。。



正常的话 返回200

来自:http://www.ysgh.net/archives/601
背景:写PHP时特别是调试页面时,不想有额外输出,于是相应的的调试插件出现了。
以前寫PHP都用var_dump來debug
現在改用ChromePHP來debug
ChromePHP是Chrome上的套件
在Firefox上也有Firephp
ChromePHP使用上也非常簡單
先到chrome web store
安裝ChromePHP套件
在去ChromePHP官網下載ChromePhp.php檔案
chromephp官網:http://www.chromephp.com/
接著只有在需要用的時後
include 'ChromePhp.php';
ChromePhp::log('需要輸出的var');
這樣一來就可以在Chrome控制台上的console看到輸出的訊息
如果要在CodeIgniter上使用
需要修改一下ChromePhp.php
把用本的private function __construct()
修改為public function __construct()
$this->load->library('ChromePhp');
$this->chromephp->log('需要輸出的var');
来自:http://blog.ipushs.com/codeigniter%E7%94%A8chromephp%E4%BE%86debugphp/?replytocom=78
最近研究安全性时,偶尔发现php.ini上并没有开启open_basedir,于是搜索了下,有人说开启后有性能影响,于是测试了一下。

首先,交代一下环境:centos + nginx + php-fpm + php + mysql,典型的lnmp了。

测试代码如下:
Php代码  收藏代码

执行100次,实测结果是未开启open_basedir时大约是0.00001秒。
开启后:0.001秒。
性能相差100倍。

在安全性和性能上,该怎么取舍呢。。。还是安全性吧?哈哈。。。

来自:http://exvision.iteye.com/blog/830506
背景:今天一链接测试机,执行ls时出现:Input/output error,-bash: /bin/df: Input/output error,-bash: /usr/bin/uptime: Input/output error......

   今天在linux下执行umount时无意用了远程目录而不是本地目录,结果悲剧了,当前用户出错,直接进入bash,不管输入什么命令都提示:input/output error。-bash: /home/myhome/.bash_profile: Input/output error
-bash-3.2$


用root账户进去,发现自己的目录变成这样:
d?????????  ? ?           ?              ?                ? myhome


在网上一搜都说可能是硬盘错误,一身汗~~


最后想起之前umount命令好像有问题,在root下重新执行:
# umount /home/myhome
unmount error 16 = Device or resource busy
Refer to the umount.cifs(8) manual page (man 8 umount.cifs)
unmount error 16 = Device or resource busy
Refer to the umount.cifs(8) manual page (man 8 umount.cifs)





以前也经常出现" Device or resource busy"这种问题,到网上再搜,查到一段话:




“有些时候,可能某些设备(通常是 CD-ROM)正忙或无法响应。此时,大多数用户的解决办法是重新启动计算机。我们大可不必这么做。例如,如果 umount /dev/hdc 失败的话,您可以试试“lazy” umount。语法十分简单:
umount -l <挂载点|设备>
此命令将会断开设备并关闭打开该设备的全部句柄。通常,您可以使用 eject <挂载点|设备>命令弹出碟片。所以,如果 eject 命令失效而您又不想重新启动,请使用 lazy umount。”


再次执行后搞定,谢天谢地!!记下以备忘!

转:http://bbs.c114.net/thread-564376-1-1.html
背景:想在树莓派上插上Arduion Uno的串口,进而两者进行通讯,后根据数据进一步判断并通过另一个Raspberry Pi的usb接口接上SIM900打电话的功能。
实践OK,如下:

输入minicom后,想退出怎么办,帮助:Ctrl+a,退出:x(eXit and reset.....X ),清屏:c(Clear Screen.......C)

用c语言读取的代码如下:
http://jackxiang.com/post/8003/

1.安装python(安装过的请跳到下一步):  sudo aptitude install python-dev
2.安装python的GPIO模块,用于控制LED、电机等(安装过的请跳到下一步)
  命令行下 输入(一行一个命令)
wget http://raspberry-gpio-python.googlecode.com/files/RPi.GPIO-0.3.1a.tar.gz    (下载GPIO库)
  tar xvzf RPi.GPIO-0.3.1a.tar.gz  (tar解压)
  cd RPi.GPIO-0.3.1a               (进入解压后的文件夹)
  sudo python setup.py install     (安装GPIO库文件)
复制代码 要是看不懂上面的两点请移步到这http://www.shumeipai.net/forum.php?mod=viewthread&tid=939

  3.安装serial,用于串口通信及USB通信:
sudo apt-get install python-serial
复制代码 4.当然你要是想在树莓派装串口调试工具就装:
sudo apt-get install minicom  
配置minicom:
sudo minicom -s    
启动出现配置菜单:选serial port setup
进入串口配置
输入A 配置串口驱动为/dev/ttyAMA0
输入E 配置速率为9600 8N1
输入F 将 Hardware Flow Control 设 为 NO
回车 退出      
由于我们使用minicom作为超级终端控制路由器等设备, 而不是控制modem, 所以需要修改Modem and dialing, 将Init string, Reset string, Hang-up string设置为空. 设置完成后选择Save setup as dfl将当前设置保存为默认设置.    在配置菜单 选Save setup as df1保存(一定要记得这一步)   选Exit退出下次在输入minicon 即可直接进入。
命令minicom是进入串口超级终端画面,而minicom -s为配置minicom。说明/dev/ttyAMA0 对应为串口0 为你连接开发板的端口
。(如何更详细使用说明移步到这http://www.shumeipai.net/forum.php?mod=viewthread&tid=550)

接下来测一下环境是否都OK
sudo nano test.py
或用xwindow下用python IDE打开一个空的文件
    输入内容
import serial
import RPi.GPIO
保存退出,
    然后运行代码:
python test.py
(如果没有报错那就说明RPi.GPIO与serial两个库安装成功)上面环境说完了,重点部份来了

USB对接方式:
  1.插上两个Arduion Uno与树莓派 的USB 然后 在树莓派输入:
ls /dev/tty*
查看有没有ttyACM0 这个文件(注只有在两个硬件USB互连的情况下才会有这个。如果两者没有连接是不会有的) 最新的系统一般都会自动生成。看到ttyACMO就说明二者可以通讯了 接下来上测试代码
  Arduino代码:
  byte number = 0;
  void setup(){
     Serial.begin(9600);
  }

  void loop(){
    if (Serial.available())  {
       number = Serial.read();
       Serial.print("character recieved: ");
       Serial.println(number, DEC);
   }
   }
先把上面的代码下载的Arduino上然后再把两者USB互接

树莓派python代码:
import serial
ser = serial.Serial('/dev/ttyACM0', 9600, timeout=1)
ser.open()

ser.write("testing")
try:
    while 1:
             response = ser.readline()
             print response
except KeyboardInterrupt:
    ser.close()
保存xxx.py 退出

注:树莓派下的serial与GPIO库都要在root帐户下才能运行
Python脚本报错AttributeError: ‘module’ object has no attribute’xxx’解决方法:
http://lovesoo.org/python-script-error-attributeerror-module-object-has-no-attribute-solve-method.html

然后运行树莓派代码 python xxx.py(这里的xxx就是你保存的树莓派代码)看到
character recieved: 116
character recieved: 101
character recieved: 115
...
character recieved: 103
说明两者USB通迅成功了

摘自:http://forum.eepw.com.cn/thread/258770/1



摘自:http://www.arduino123.com/a/jiaocheng/jichu/2013/0817/26398.html

Arduino的扩展库:
http://wenku.baidu.com/link?url=g1ilpiUc7MRP6sJ69J1oFCkk5JMH9JthfzzClH482SsiYcMn2hIpdzGd0mJc_7QdQZuUXMZIwZdaxPta_XL5QvSUYoqHkXNUUG6gL9WJYEa
http://www.arduino.cn/thread-1009-1-1.html


C:\Users\Administrator\Documents\Arduino\libraries\tsic/tsic.h:17:22: fatal error: WProgram.h: No such file or directory

Arduino1.0无法使用以前的库文件(WProgram.h) :
查看原文:http://elitezhe.sinaapp.com/wprogram-loss/
刚才使用自己以前编写的一个库文件,总是编译不通过,在0021上就没有问题。仔细看了看这个问题,发现原因是Arduino+1.0的版本里面没有了WProgram.h文件。
我找到的解决办法是把文件中的WProgram.h替换为Arduino.h
这个问题真心是坑爹,困扰好久.官网上居然也不给解释!!!


串口发数据调试:
Arduino不但有14个数字接口和6个模拟接口外,还有1个更为常用的串口接口。在实际应用中串口以只需要少量的几根线就能和其他串口设备通讯优势被广应用。
        串行接口按标准被分为RS-232、RS-422、RS-485。RS-232是在1962年发布的,也是目前PC机与通信工业中应用最广泛的一种串行接口,RS-232采取不平衡传输方式,即所谓单端通讯。典型的RS-232信号在正负电平之间摆动,在发送数据时,发送端驱动器输出正电平在+5~+15V,负电平在-5~-15V电平。我们的单片机使用的是TTL电平的串行协议,因此单片机与pc通讯时需要进行RS-232电平和TTL电平的转换,单片机与单片机通讯时则可以直接连接。
        USB版本的Arduino则是通过USB转成TTL串口下载程序的,数字接口0和1就是TTL串口RX和TX。
        串口通讯中最重要的一点就的通讯协议,一般串口通讯协议都会有波特率、数据位、停止位、校验位等参数。大家不会设置也不用怕,Arduino语言中Serial.begin()函数就能使大家轻松完成设置,我们只需要改变该函数的参数即可,例如Serial.begin(9600),则表示波特率为9600bit/s(每秒比特数bps),其余参数默认即可。
        Arduino语言中还提供了Serial.available() 判断串口缓冲器状态、Serial.read()读串口、Serial.print()串口发送及Serial.println()带换行符串口发送四个函数。
        下面我们用一段代码来演示这些函数的用途。实验无须外围电路,只需要将下载的USB线连接即可。
————————————————————————————————————————

摘自:http://blog.csdn.net/daditao/article/details/20408949


Arduino 串口通讯:
http://blog.sina.com.cn/s/blog_624e2b450100l7p8.html
http://www.geekfans.com/thread-57780-1-1.html
核心:由于我们将使用arduino自带的USB转串口,因此我们必须给raspberry pi安装其驱动,而驱动就在arduino提供的软件上。所以我们必须在 raspberry pi安装arduino软件。
阅读全文
https://www.mockplus.cn/blog/post/73
背景:生成唯一编码的uuid值,标识一个资源是很有必要的。
1.执行uuidgen命令,可以生成一个uuid数

2.sudo apt-get install uuid-dev,调用uuid_generate函数

来自:http://blog.csdn.net/sruru/article/details/8137871


Linux & Windows上生成UUID/GUID:
http://blog.csdn.net/ghlfllz/article/details/17128393
背景:有时像硬件测试,比如SIM900a,如果你有一台公网ip服务器,想开一个tcp上的ip端口,在Windows下有tcp/ip的调试助手的界面软件,而linux下没有这样的玩意,怎么办呢?shell有这个功能,好像nc也有类似的模拟client去连接服务器的功能,咱就先找个shell的,Linux 下有兄弟好像写了一个debian下的的deb包:http://blog.chinaunix.net/uid-21977056-id-4310527.html 如下。
bash socket 编程 :
在bash环境中,你可以打开一个socket,并通过它发送数据. 并不需要安装curl或者lynx等程序.

通过两个特殊的设备文件, 可以打开网络socket

/dev/tcp/host/port

如果 host是一个有效的主机名或者IP地址, 端口号是一个整数或者常见的服务名(如dns, http), 那么bash将打开一个TCP连接
/dev/udp/host/port

打开到host:port的UDP连接

(echo >/dev/tcp/localhost/80) &>/dev/null && echo “TCP port 80 open” || echo “TCP port 80 close”
/dev/[tcp|upd]/host/port 只要读取或者写入这个文件,相当于系统会尝试连接:host 这台机器,对应port端口。如果主机以及端口存在,就建立一个socket 连接。将在,/proc/self/fd目录下面,有对应的文件出现。
用来判断本机的80端口是否打开

另外, 一段crontab脚本

!/bin/bash
exec 8<>/dev/tcp/zhiwei.li/80

if [ $? -eq 0 ] ; then

    printf "GET /status HTTP/1.0rn" >&8
    printf "Host: zhiwei.lirn" >&8
    printf "User-Agent: Mozilla/5.0rn" >&8
    printf "rn" >&8

    while read -u 8 -r -t 2 block;
    do
            echo $block
            echo "$(date) - web server is running."
            while read -u 8 line ;
            do
                    echo $line
            done
            exec 8&-
            exit
    done
fi

echo “need reboot”
….
来自:http://my.oschina.net/panzhc/blog/182843#OSC_h1_1
参考资料:
http://xpt.sourceforge.net/techdocs/nix/shell/gsh05-ShBash/ar01s28.html
http://www.cyberciti.biz/tips/spice-up-your-unix-linux-shell-scripts.html
————————————————————————————————————————————
一)如果出于效率的话还是选择工具的好shell不怎么合适做这个^_^,但作测试足够了:
直接在交互shell下
exec 3</dev/tcp/localhost/80
exec 3</dev/tcp/localhost/25
lsof -p $$
我开了httpd和sendmail服务,因此80和25端口有响应。
可以看到当前shell只打开了25这个端口。

二)如何查看这个shell是否真正打开了这个80端口?
一、安装nmap
yum install nmap #输入y安装
二、使用nmap
nmap localhost #查看主机当前开放的端口
nmap -p 1024-65535 localhost#查看主机端口(1024-65535)中开放的端口
nmap -PS 192.168.21.163 #探测目标主机开放的端口
nmap -PS22,80,3306 192.168.21.163 #探测所列出的目标主机端口
nmap -O 192.168.21.163 #探测目标主机操作系统类型
nmap -A 192.168.21.163 #探测目标主机操作系统类型
nmap --help #更多nmap参数请查询帮助信息
三、关闭或者打开主机端口
1、nmap localhost #查看主机当前开放端口
2、ntsysv #打开系统服务器管理器(需要先安装yum install ntsysv),选择要关闭或者打开的服务
摘自:http://www.dedecms.com/knowledge/servers/linux-bsd/2012/0819/8442.html
nmap localhost  

Starting Nmap 5.51 ( http://nmap.org ) at 2015-04-26 18:07 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000026s latency).
Other addresses for localhost (not scanned): 127.0.0.1
Not shown: 992 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
25/tcp   open  smtp
80/tcp   open  http
111/tcp  open  rpcbind
443/tcp  open  https
5901/tcp open  vnc-1
6001/tcp open  X11:1
8080/tcp open  http-proxy

三)测试:用telnet就行了。
——————————————————————————————————————————————————————————
http://www.csdn.net/article/2012-02-28/312483
时间 2014-03-17 22:04:04  向东博客
原文  http://jackxiang.com/post/7098/
阅读全文
分页: 29/249 第一页 上页 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 下页 最后页 [ 显示模式: 摘要 | 列表 ]