【解决】无法载入 mcrypt 扩展,<br />请检查 PHP 配置 ...
Php/Js/Shell/Go jackxiang 2015-10-11 17:57
对于phpmyadmin“无法载入 mcrypt 扩展,<br />请检查 PHP 配置”的问题,我记得前段时间还有午饭提问过。
自己很长一段时间之前就遇过这个问题,但是也不知道怎么解决的,记得是安装过两个RPM包就搞定。
对于这个问题,可以发现网上发问的可是N多呀,普遍都经受这个折腾。
现在在自己的LNMP下重新进行了安装,也出现这个问题。当我再次尝试安装
libmcrypt-2.5.7-3.el5.remi.i386.rpm
php-mcrypt-5.1.6-1.el5.i386.rpm
不过得不到解决,于是我选择通过源码包编译安装libmcrypt-2.5.7.tar.gz ,并且重新编译到PHP中去,最终解决了
该问题。
#tar zxvf libmcrypt-2.5.7.tar.gz
#cd libmcrypt-2.5.7
#./configure --prefix=/usr/local/libmcrypt
#make && make install
重新编译php:
#./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --enable-fastcgi --enable-fpm --enable-mbstring --with-mcrypt=/usr/local/libmcrypt/
这里顺便编译php的配置文件php.ini
extension=php_mbstring.dll 把这行前面的;去掉
然后重启mysql、php-fpm、nginx
重新登录phpmyadmin就不显示了。
————————————————————————————————————————————————————————
来自:http://bbs.51cto.com/thread-821175-1.html
自己很长一段时间之前就遇过这个问题,但是也不知道怎么解决的,记得是安装过两个RPM包就搞定。
对于这个问题,可以发现网上发问的可是N多呀,普遍都经受这个折腾。
现在在自己的LNMP下重新进行了安装,也出现这个问题。当我再次尝试安装
libmcrypt-2.5.7-3.el5.remi.i386.rpm
php-mcrypt-5.1.6-1.el5.i386.rpm
不过得不到解决,于是我选择通过源码包编译安装libmcrypt-2.5.7.tar.gz ,并且重新编译到PHP中去,最终解决了
该问题。
#tar zxvf libmcrypt-2.5.7.tar.gz
#cd libmcrypt-2.5.7
#./configure --prefix=/usr/local/libmcrypt
#make && make install
重新编译php:
#./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --enable-fastcgi --enable-fpm --enable-mbstring --with-mcrypt=/usr/local/libmcrypt/
这里顺便编译php的配置文件php.ini
extension=php_mbstring.dll 把这行前面的;去掉
然后重启mysql、php-fpm、nginx
重新登录phpmyadmin就不显示了。
————————————————————————————————————————————————————————
来自:http://bbs.51cto.com/thread-821175-1.html
背景:有时一次清空所有日志文件很有必要。
cat clearUpAllServersLog.sh
for i in `find /data/logs -name "*.log"`; do cat /dev/null >$i; done
更简单的写法:
for i in `find . -name "*.log*"`;do echo $i; done
for i in `find . -name "*.log"`;do echo $i; done
for i in `find . -name "*.log"`;do echo $i; done
for i in `find . -name "*.log"`;do :>$i; done
一般是>文件清空,但是前面贴着数字和:也可以
cat txt
2018年 03月 14日 星期三 14:03:56 CST
#seq 5> txt
seq: 缺少操作数
Try 'seq --help' for more information.
#seq 5 >txt
cat txt
1
2
3
4
5
因为没空来前面还是数字会意想不到的结果,规范使用最好前面空开.
>重定向是先清空文件,再执行命令写入,这里的seq 5因为5贴着,所以执行的是seq,所以会抛出命令帮助。
是清空再执行写入呢,喔,明白了 > 有两个动作。
#每天晚上凌晨零点清空各种服务生成日志
0 0 * * * /bin/bash /usr/local/scripts/clearUpAllServersLog.sh
————————————————————————————————————
1)在当前目录下,键入如下命令:
for i in `find . -name "*.log"`; do cat /dev/null >$i; done
2)执行完毕后,当前目录下的所有log日志文件就被清空了。
Linux:批量清空当前目录下的日志文件
3)再把shell命令解释一下:
find . -name "*.log" ,就是在当前目录下查找后缀为log的文件。
cat /dev/null >$i ,就是将每次找到的log文件清空。
参考:http://jingyan.baidu.com/article/acf728fd23a1e9f8e510a331.html
cat clearUpAllServersLog.sh
for i in `find /data/logs -name "*.log"`; do cat /dev/null >$i; done
更简单的写法:
for i in `find . -name "*.log*"`;do echo $i; done
for i in `find . -name "*.log"`;do echo $i; done
for i in `find . -name "*.log"`;do echo $i; done
for i in `find . -name "*.log"`;do :>$i; done
一般是>文件清空,但是前面贴着数字和:也可以
cat txt
2018年 03月 14日 星期三 14:03:56 CST
#seq 5> txt
seq: 缺少操作数
Try 'seq --help' for more information.
#seq 5 >txt
cat txt
1
2
3
4
5
因为没空来前面还是数字会意想不到的结果,规范使用最好前面空开.
>重定向是先清空文件,再执行命令写入,这里的seq 5因为5贴着,所以执行的是seq,所以会抛出命令帮助。
是清空再执行写入呢,喔,明白了 > 有两个动作。
#每天晚上凌晨零点清空各种服务生成日志
0 0 * * * /bin/bash /usr/local/scripts/clearUpAllServersLog.sh
————————————————————————————————————
1)在当前目录下,键入如下命令:
for i in `find . -name "*.log"`; do cat /dev/null >$i; done
2)执行完毕后,当前目录下的所有log日志文件就被清空了。
Linux:批量清空当前目录下的日志文件
3)再把shell命令解释一下:
find . -name "*.log" ,就是在当前目录下查找后缀为log的文件。
cat /dev/null >$i ,就是将每次找到的log文件清空。
参考:http://jingyan.baidu.com/article/acf728fd23a1e9f8e510a331.html
Hint: Some lines were ellipsized, use -l to show in full. systemctl status slapd -l ,'journalctl -xn' for details. 看不清换行,先journalctl -xn > out.log,再vim看。
一)那个Service XXX start时,也是装入了内存活它的Service系统的,而用chkconfig -add memcached 就是装入这个Service系统,完全类似centos7 的systemctl daemon-reload,也就是说你改了/etc/init.d/memcached 如果不chkconfig -add memcached,service memcached start执行的还是旧的(尽管你替换了那个/etc/init.d/memcached文件), 同理/lib/systemd/system/memcached.service,也是一样的道理,修改后得 systemctl daemon-reload才会生效,直接运行systemctl start memcached会提示你systemctl daemon-reload,不让你运行,也就是说它会监控/etc/systemd/system/*.service外,发现它还会监控centos6的/etc/init.d/* 的修改。
二)在CentOS7里面,只有运行了service memcached start后,这个systemctl才行被注入,一上来就运行systemctl start memcached , 它是不认识这个memcached 的,再就是如果自己Kill掉,没有用 service memcached stop,这个sytemctl 也是不知道它关了,想用systemctl start memcached也无法启动的,因为systemctl 认为它还运行着呢,于是得用systemctl stop memcached 后,再运行systemctl start memcached,也就成功了,否则即使systemctl start memcached啥也不输出就退出了,但是那个进程还是没有启动,说白了,在CentOS7里面,那个启动和停止最好是经过service或systemctl,连service 也是被systemctl接管了的,都得向systemctl注册!!!,艹。
背景:conf里面有一个ssl的conf,scp过来抄时忘记删除,但nginx下的nginx.conf下是include *.conf,于是出问题了,但nginx不报这个conf有问题,而是说没有找到ssl的crt文件,怎么办?主要是学会看日志 cat /var/log/messages | grep nginx ,看日志才发现是多了一个conf文件。
service nginx reload
Reloading nginx configuration (via systemctl): Job for nginx.service failed. See 'systemctl status nginx.service' and 'journalctl -xn' for details.
——————————————————————————————————————————————————————————————————————
启动apache服务出现,或启动nginx时出现:
Starting nginx (via systemctl): Job for nginx.service failed. See 'systemctl status nginx.service' and 'journalctl -xn' for details.
查看错误提示
主要是学会看日志 cat /var/log/messages | grep nginx
Oct 10 14:34:12 iZ251vfc84kZ nginx: nginx: [emerg] BIO_new_file("/usr/local/nginx/conf/ssl/svn.justwinit.crt") failed (SSL: error:02001002:system library:fopen:No such file or directory:fopen('/usr/local/nginx/conf/ssl/svn.justwinit.crt','r') error:2006D080:BIO routines:BIO_new_file:no such file)
Oct 10 14:34:12 iZ251vfc84kZ nginx: nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed
Oct 10 14:34:12 iZ251vfc84kZ systemd: nginx.service: control process exited, code=exited status=1
[root@iZ251vfc84kZ vhost]# grep -r "svn.justwinit.crt" ./
./svn.justwinit.conf: ssl_certificate ssl/svn.justwinit.crt;
[root@iZ251vfc84kZ vhost]# rm -Rf svn.justwinit.conf
来自:http://wangsheng1.blog.51cto.com/29473/1550655
一)那个Service XXX start时,也是装入了内存活它的Service系统的,而用chkconfig -add memcached 就是装入这个Service系统,完全类似centos7 的systemctl daemon-reload,也就是说你改了/etc/init.d/memcached 如果不chkconfig -add memcached,service memcached start执行的还是旧的(尽管你替换了那个/etc/init.d/memcached文件), 同理/lib/systemd/system/memcached.service,也是一样的道理,修改后得 systemctl daemon-reload才会生效,直接运行systemctl start memcached会提示你systemctl daemon-reload,不让你运行,也就是说它会监控/etc/systemd/system/*.service外,发现它还会监控centos6的/etc/init.d/* 的修改。
二)在CentOS7里面,只有运行了service memcached start后,这个systemctl才行被注入,一上来就运行systemctl start memcached , 它是不认识这个memcached 的,再就是如果自己Kill掉,没有用 service memcached stop,这个sytemctl 也是不知道它关了,想用systemctl start memcached也无法启动的,因为systemctl 认为它还运行着呢,于是得用systemctl stop memcached 后,再运行systemctl start memcached,也就成功了,否则即使systemctl start memcached啥也不输出就退出了,但是那个进程还是没有启动,说白了,在CentOS7里面,那个启动和停止最好是经过service或systemctl,连service 也是被systemctl接管了的,都得向systemctl注册!!!,艹。
背景:conf里面有一个ssl的conf,scp过来抄时忘记删除,但nginx下的nginx.conf下是include *.conf,于是出问题了,但nginx不报这个conf有问题,而是说没有找到ssl的crt文件,怎么办?主要是学会看日志 cat /var/log/messages | grep nginx ,看日志才发现是多了一个conf文件。
service nginx reload
Reloading nginx configuration (via systemctl): Job for nginx.service failed. See 'systemctl status nginx.service' and 'journalctl -xn' for details.
——————————————————————————————————————————————————————————————————————
启动apache服务出现,或启动nginx时出现:
Starting nginx (via systemctl): Job for nginx.service failed. See 'systemctl status nginx.service' and 'journalctl -xn' for details.
查看错误提示
主要是学会看日志 cat /var/log/messages | grep nginx
Oct 10 14:34:12 iZ251vfc84kZ nginx: nginx: [emerg] BIO_new_file("/usr/local/nginx/conf/ssl/svn.justwinit.crt") failed (SSL: error:02001002:system library:fopen:No such file or directory:fopen('/usr/local/nginx/conf/ssl/svn.justwinit.crt','r') error:2006D080:BIO routines:BIO_new_file:no such file)
Oct 10 14:34:12 iZ251vfc84kZ nginx: nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed
Oct 10 14:34:12 iZ251vfc84kZ systemd: nginx.service: control process exited, code=exited status=1
[root@iZ251vfc84kZ vhost]# grep -r "svn.justwinit.crt" ./
./svn.justwinit.conf: ssl_certificate ssl/svn.justwinit.crt;
[root@iZ251vfc84kZ vhost]# rm -Rf svn.justwinit.conf
来自:http://wangsheng1.blog.51cto.com/29473/1550655
背景:最近搞Raspberry Pi下的ajax从串口里取数据,需要7X24Hour,3秒一次,用chrome下的js分析工具发现内存有不断增加的情况,Raspberry Pi 512M。
最近一哥们在做一个Ajax长连接的项目,页面需要和服务器保持长连接,而且在连接超时后需要重新请求连接,过程中他问我要用到什么,我也是想都没想就告诉他用jQuery。jQuery不是有ajaxSuccess ajaxError这些对象吗,在请求完成或者请求失败后重新请求不就好了。
但是后来他告诉我说没有用 jQuery,自己手工写的XMLhttprequest 。他告诉我说,开始是用jquery写的,而且在测试过程中也没有出现问题。但是在后来无意中发现,在页面开的时候久了之后,浏览器资源竟然占用非常高导致内存不足而崩溃了。后来抓包分析发现,每次jquery的Ajax请求都会创建一个xmlHttprequest对象,理论上讲,长连接的请求是一个无限递归,请求数量是非常大的,但是由于每次请求都会建立一个新的xmlhttprequest,而且jquery不会自动回收资源,所以导致了内存溢出。
通过查看jquery API,发现jquery还有一个 complete对象,是请求完成后回调函数 (请求成功或失败之后均调用)。 同时有两个参数XMLHttpRequest, textStatus。所以,我们只需要在请求完成后,将传回的XMLHttprequest对象手工回收即可,代码如下:
代码如下:
来自:http://www.jb51.net/article/30458.htm
原生态的写法如下:
最近一哥们在做一个Ajax长连接的项目,页面需要和服务器保持长连接,而且在连接超时后需要重新请求连接,过程中他问我要用到什么,我也是想都没想就告诉他用jQuery。jQuery不是有ajaxSuccess ajaxError这些对象吗,在请求完成或者请求失败后重新请求不就好了。
但是后来他告诉我说没有用 jQuery,自己手工写的XMLhttprequest 。他告诉我说,开始是用jquery写的,而且在测试过程中也没有出现问题。但是在后来无意中发现,在页面开的时候久了之后,浏览器资源竟然占用非常高导致内存不足而崩溃了。后来抓包分析发现,每次jquery的Ajax请求都会创建一个xmlHttprequest对象,理论上讲,长连接的请求是一个无限递归,请求数量是非常大的,但是由于每次请求都会建立一个新的xmlhttprequest,而且jquery不会自动回收资源,所以导致了内存溢出。
通过查看jquery API,发现jquery还有一个 complete对象,是请求完成后回调函数 (请求成功或失败之后均调用)。 同时有两个参数XMLHttpRequest, textStatus。所以,我们只需要在请求完成后,将传回的XMLHttprequest对象手工回收即可,代码如下:
代码如下:
来自:http://www.jb51.net/article/30458.htm
原生态的写法如下:
是一本杂志,网上可以下到这本书的pdf文档,以下节选自乔布斯在斯坦福大学上的演讲:
当我年轻的时候,有一本叫做“整个地球的目录”振聋发聩的杂志,它是我们那一代人的圣经之一。它是一个叫Stewart Brand的家伙在离这里不远的Menlo Park编辑的,他象诗一般神奇地将这本书带到了这个世界。那是六十年代后期, 在个人电脑出现之前, 所以这本书全部是用打字机,、剪刀还有偏光镜制造的。有点像用软皮包装的Google, 在Google出现三十五年之前:这是理想主义的,其中有许多灵巧的工具和伟大的想法。
Stewart和他的伙伴出版了几期的“整个地球的目录”,当它完成了自己使命的时候,他们做出了最后一期的目录。那是在七十年代的中期, 我正是你们的年纪。在最后一期的封底上是清晨乡村公路的照片(如果你有冒险精神的话,你可以自己找到这条路的),在照片之下有这样一段话:“求知若饥,虚心若愚。”这是他们停止了发刊的告别语。“求知若饥,虚心若愚。(stay hungry,stay foolish)”我总是希望自己能够那样,现在,在你们即将毕业,开始新的旅程的时候,我也希望你们能这样:求知若饥,虚心若愚。非常感谢你们!
在1968年至1972年是定期出版的,在1998年以前有零星出版,整个地球目录作为一个教育工具·:,“发现读者本身自己的灵感,与真正对他的冒险精神感兴趣的人分享自己的环境与创意,。”目录编辑各种工具和产品,除此之外还供供应商购买。通过这种方式目录就等同与灵感的源泉、教育和参考的结合。并有些前瞻性的对网络前景进行歌颂,整个地球目录一直赞扬保有雄心勃勃的理想主义者的精神。
这些是我看英文介绍自己写的,也许不是很全面,但是大概就是这些了
当我年轻的时候,有一本叫做“整个地球的目录”振聋发聩的杂志,它是我们那一代人的圣经之一。它是一个叫Stewart Brand的家伙在离这里不远的Menlo Park编辑的,他象诗一般神奇地将这本书带到了这个世界。那是六十年代后期, 在个人电脑出现之前, 所以这本书全部是用打字机,、剪刀还有偏光镜制造的。有点像用软皮包装的Google, 在Google出现三十五年之前:这是理想主义的,其中有许多灵巧的工具和伟大的想法。
Stewart和他的伙伴出版了几期的“整个地球的目录”,当它完成了自己使命的时候,他们做出了最后一期的目录。那是在七十年代的中期, 我正是你们的年纪。在最后一期的封底上是清晨乡村公路的照片(如果你有冒险精神的话,你可以自己找到这条路的),在照片之下有这样一段话:“求知若饥,虚心若愚。”这是他们停止了发刊的告别语。“求知若饥,虚心若愚。(stay hungry,stay foolish)”我总是希望自己能够那样,现在,在你们即将毕业,开始新的旅程的时候,我也希望你们能这样:求知若饥,虚心若愚。非常感谢你们!
在1968年至1972年是定期出版的,在1998年以前有零星出版,整个地球目录作为一个教育工具·:,“发现读者本身自己的灵感,与真正对他的冒险精神感兴趣的人分享自己的环境与创意,。”目录编辑各种工具和产品,除此之外还供供应商购买。通过这种方式目录就等同与灵感的源泉、教育和参考的结合。并有些前瞻性的对网络前景进行歌颂,整个地球目录一直赞扬保有雄心勃勃的理想主义者的精神。
这些是我看英文介绍自己写的,也许不是很全面,但是大概就是这些了
LINUX 手动建立SWAP文件及删除,Linux SWAP 分区建立及释放内存。
Unix/LinuxC技术 jackxiang 2015-10-2 14:29
[root@iZ25dcp92ckZ /]# find / -size +200M -exec du -h {} \;
1.1G /swapfile
————————————————————————————————————
一、查看系统当前的分区情况:
>free -m
二、创建用于交换分区的文件:
>dd if=/dev/zero of=/whatever/swap bs=block_size (10M)count=number_of_block(3000)
三、设置交换分区文件:
>mkswap /export/swap/swapfile
四、立即启用交换分区文件:
>swapon /whateever/swap
五、若要想使开机时自启用,则需修改文件/etc/fstab中的swap行:
/whatever/swap swap swap defaults 0 0
————————————————————————————————————
如何在红帽 企业版Linux系统中添加swap文件?
解决方法:
1. 确定swap文件的大小,单位为M。将该值乘以1024得到块大小。例如,64MB的swap文件的块大小是65536。
2. 在root提示符下,键入下面的命令,其中count大小等于所要求的块大小:
dd if=/dev/zero f=/swapfile bs=1024 count=65536
3. 建立swap文件:
mkswap /swapfile
4. 要立即打开swap文件而不是在启动时自动开启:
swapon /swapfile
5. 要想在启动时开启,需要在/etc/fstab中添加如下内容:
/swapfile swap swap defaults 0 0
当下一次系统启动时,新的swap文件就打开了。
6. 在添加新的swap文件并开启后,检查cat /proc/swaps 或者free命令的输出来查看swap是否已打开。
7.删除SWAP分区
swapoff /swapfile 修改/etc/fstab文件 rm -rf /swapfile
1 block = 512字节
来自:http://my.oschina.net/jccpp/blog/142980
来自:http://www.linuxidc.com/Linux/2013-03/81890.htm
删除SWAP:
swapon -s
swapoff /dev/dm-1
swapoff:/dev/dm-1: swapoff failed: Cannot allocate memory
kill -9 1503 #java killed
swapoff /dev/dm-1
free -m
1.1G /swapfile
————————————————————————————————————
一、查看系统当前的分区情况:
>free -m
二、创建用于交换分区的文件:
>dd if=/dev/zero of=/whatever/swap bs=block_size (10M)count=number_of_block(3000)
三、设置交换分区文件:
>mkswap /export/swap/swapfile
四、立即启用交换分区文件:
>swapon /whateever/swap
五、若要想使开机时自启用,则需修改文件/etc/fstab中的swap行:
/whatever/swap swap swap defaults 0 0
————————————————————————————————————
如何在红帽 企业版Linux系统中添加swap文件?
解决方法:
1. 确定swap文件的大小,单位为M。将该值乘以1024得到块大小。例如,64MB的swap文件的块大小是65536。
2. 在root提示符下,键入下面的命令,其中count大小等于所要求的块大小:
dd if=/dev/zero f=/swapfile bs=1024 count=65536
3. 建立swap文件:
mkswap /swapfile
4. 要立即打开swap文件而不是在启动时自动开启:
swapon /swapfile
5. 要想在启动时开启,需要在/etc/fstab中添加如下内容:
/swapfile swap swap defaults 0 0
当下一次系统启动时,新的swap文件就打开了。
6. 在添加新的swap文件并开启后,检查cat /proc/swaps 或者free命令的输出来查看swap是否已打开。
7.删除SWAP分区
swapoff /swapfile 修改/etc/fstab文件 rm -rf /swapfile
1 block = 512字节
来自:http://my.oschina.net/jccpp/blog/142980
来自:http://www.linuxidc.com/Linux/2013-03/81890.htm
删除SWAP:
swapon -s
swapoff /dev/dm-1
swapoff:/dev/dm-1: swapoff failed: Cannot allocate memory
kill -9 1503 #java killed
swapoff /dev/dm-1
free -m
JS邮箱正则判断,正则表达式验证邮箱。
Php/Js/Shell/Go jackxiang 2015-9-29 10:54
背景:正则是一门厚书啊,想写好也不容易,但日常中也就那些像电话、邮箱、手机,网上一堆,但真好验证好了,还得了解一点正则知识,再就是多测试了:-)
下面邮箱正则:
中划线:中划线域名就是米农口中说的扁担域名了,扁担域名由于输入比较麻烦,看起来也比较不正规,是没有多大的价值,目前投资的人是比较少的。按照DNS的标准,域名是不允许有下划线的。
下划线:一些人在注册用户名的喜欢使用下划线_,这种用户名在登录邮箱时很麻烦,给你发邮件的人也很不方便。
二级域名邮箱基本被消灭,这个哥们的正则可以写下划线,扩大了范围但问题不大,主要是起到提示用户就可以了。
com.cn域名支持:((\.[a-zA-Z0-9-]{2,3}){1,2} com.cn
——————————————————————————————————————————————————————————————
//emailpreg = /^[A-Za-zd]+([-_.][A-Za-zd]+)*@([A-Za-zd]+[-.])+[A-Za-zd]{2,5}$/; //这个对QQ号的邮箱验证不了。
emailpreg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$/; //dfdfd1212@dfdfd.abc.cn 都成二级邮箱。abc@12df1.com.cn
emailpreg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9-])+((\.[a-zA-Z0-9-]{2,3}){1,2})$/; //域名是不允许有下划线的 ,去掉下划线,这个就是最后的正则,发现其像afeng@staff.jackxiang.com 这样的匹配不了。至于还有啥首字母不能是下划线,要这样,这正则就还得加长...用户也不是sb,只是起到一定提示作用,别搞复杂了,还是做一下简单的验证,对后面的com,tv,com.cn啥的别验证太细了:
^[A-Za-z0-9]+((-|_|\.)[A-Za-z0-9]+)*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$
到此为止吧。
用正则猫可以分析一下:
^[A-Za-z0-9]+ :以大小写字母和数字开头, 并重复一次或多次。
(-|_|\.) :中间可夹杂- _ . ,注意是分组,这个分组里是或,也就是可没有这些也成。
[A-Za-z0-9]+ :分装后紧跟大小写字母及数字,这个可以重复一次或多次。(如果- _ .没有可以理解为全是匹配一次或多次的大小写字母和数字符)
((-|_|\.)[A-Za-z0-9]+)+ :小组里并成大组匹配一次或多次。
后面也是类似和前面的分组,最后加一个点再匹配一次或多次(点后的com,org,并没有作长度限定)!
============================================================================
<dd><input id="2" rel="邮箱" res='2' type="text" class="item-edit-txt" name="2" value="<{$user.email}>" ></dd>
}else if($(this).attr('res') == '2' && !emailpreg.test($(this).val())){//从QQ登录过来的用户大网接口获取不到邮箱,放开让其填写。
$(this).css("border","1px solid #f00");
$("#"+$(this).attr('res')+'span').remove();
$("#"+$(this).attr('res')).after("<span id="+$(this).attr('res')+'span'+"><br />"+$(this).attr("rel")+"格式不正确</span>");
$(this).focus();
res = false;
return false;
——————————————————————————————————————————————————————————————
JavaScript表单验证email,判断一个输入量是否为邮箱email,通过正则表达式实现。
//检查email邮箱
function isEmail(str){
var reg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$/;
return reg.test(str);
}
摘自:http://www.ijavascript.cn/yanzheng/validate-email-186.html
下面邮箱正则:
中划线:中划线域名就是米农口中说的扁担域名了,扁担域名由于输入比较麻烦,看起来也比较不正规,是没有多大的价值,目前投资的人是比较少的。按照DNS的标准,域名是不允许有下划线的。
下划线:一些人在注册用户名的喜欢使用下划线_,这种用户名在登录邮箱时很麻烦,给你发邮件的人也很不方便。
二级域名邮箱基本被消灭,这个哥们的正则可以写下划线,扩大了范围但问题不大,主要是起到提示用户就可以了。
com.cn域名支持:((\.[a-zA-Z0-9-]{2,3}){1,2} com.cn
——————————————————————————————————————————————————————————————
//emailpreg = /^[A-Za-zd]+([-_.][A-Za-zd]+)*@([A-Za-zd]+[-.])+[A-Za-zd]{2,5}$/; //这个对QQ号的邮箱验证不了。
emailpreg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$/; //dfdfd1212@dfdfd.abc.cn 都成二级邮箱。abc@12df1.com.cn
emailpreg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9-])+((\.[a-zA-Z0-9-]{2,3}){1,2})$/; //域名是不允许有下划线的 ,去掉下划线,这个就是最后的正则,发现其像afeng@staff.jackxiang.com 这样的匹配不了。至于还有啥首字母不能是下划线,要这样,这正则就还得加长...用户也不是sb,只是起到一定提示作用,别搞复杂了,还是做一下简单的验证,对后面的com,tv,com.cn啥的别验证太细了:
^[A-Za-z0-9]+((-|_|\.)[A-Za-z0-9]+)*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$
到此为止吧。
用正则猫可以分析一下:
^[A-Za-z0-9]+ :以大小写字母和数字开头, 并重复一次或多次。
(-|_|\.) :中间可夹杂- _ . ,注意是分组,这个分组里是或,也就是可没有这些也成。
[A-Za-z0-9]+ :分装后紧跟大小写字母及数字,这个可以重复一次或多次。(如果- _ .没有可以理解为全是匹配一次或多次的大小写字母和数字符)
((-|_|\.)[A-Za-z0-9]+)+ :小组里并成大组匹配一次或多次。
后面也是类似和前面的分组,最后加一个点再匹配一次或多次(点后的com,org,并没有作长度限定)!
============================================================================
<dd><input id="2" rel="邮箱" res='2' type="text" class="item-edit-txt" name="2" value="<{$user.email}>" ></dd>
}else if($(this).attr('res') == '2' && !emailpreg.test($(this).val())){//从QQ登录过来的用户大网接口获取不到邮箱,放开让其填写。
$(this).css("border","1px solid #f00");
$("#"+$(this).attr('res')+'span').remove();
$("#"+$(this).attr('res')).after("<span id="+$(this).attr('res')+'span'+"><br />"+$(this).attr("rel")+"格式不正确</span>");
$(this).focus();
res = false;
return false;
——————————————————————————————————————————————————————————————
JavaScript表单验证email,判断一个输入量是否为邮箱email,通过正则表达式实现。
//检查email邮箱
function isEmail(str){
var reg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$/;
return reg.test(str);
}
摘自:http://www.ijavascript.cn/yanzheng/validate-email-186.html
背景:想在Raspberry Pi下的chrome下播放声音,通过后台播放太慢了,于是想通过html直接调用后立即播放。
<audio src="/style/music.wav" controls="controls" id="play" style="display:none">
Your browser does not support the audio element.
</audio>
audio.play();
事实上Raspberry下的chrome并不能播放mp3和m4a:
________________________________________________________________________________
var audio = document.getElementById('play');
function neworder(){
$.post('/index.php/admin/order/neworder',
{id:112},
function(data,status){
if(data.status==1){
if(one){
one=false;
neworders=data.msg;
}else if(neworders==data.msg){
}else if(neworders<data.msg){
audio.play();
}
}else{}
},'json');
}
setInterval("neworder()",60000)
来自:http://www.ziqiangxuetang.com/jsref/met-audio-play.html
<audio src="/style/music.wav" controls="controls" id="play" style="display:none">
Your browser does not support the audio element.
</audio>
audio.play();
事实上Raspberry下的chrome并不能播放mp3和m4a:
________________________________________________________________________________
var audio = document.getElementById('play');
function neworder(){
$.post('/index.php/admin/order/neworder',
{id:112},
function(data,status){
if(data.status==1){
if(one){
one=false;
neworders=data.msg;
}else if(neworders==data.msg){
}else if(neworders<data.msg){
audio.play();
}
}else{}
},'json');
}
setInterval("neworder()",60000)
来自:http://www.ziqiangxuetang.com/jsref/met-audio-play.html
背景:线上生产环境的系统登录,一般会经过跳板机,而此时为了方便写成脚本里面有自动登录的密码,可能跳板机被攻陷,导致密码泄漏,此时有必要结合跳板机和自己的windows系统把密码和用户名、ip分开。而大一些的公司则是有secretID硬件卡来做这个事情,也主一分钟变一次密码,加上自己设置的前面6位,这样显然更安全,但咱没那钱,于是想了一个土办法简单分开即可。
1)跳板机上:
cat /root/bobwblogin.sh
ssh root@101.200.1.1**
2)windows机器上:
D:\script\bobwbautoenterpwd.vbs
把用户名、ip区分开:
跳板机上执行:
sh /root/bobwblogin.sh
[root@iZ25dcp92ckZ multepoolserver]# sh /root/bobwblogin.sh
root@101.200.1.1**'s password:
密码从步骤2)里面寻找出来即可,在secureCRT里这样操作:
alt+s R, 脚本、执行,找到该路径下的D:\script\bobwbautoenterpwd.vbs文件,即可输入密码进入生产ip。
从而达到了,密码和用户名区分开,不致于windows机或跳板机被拿下后全泄漏了,分开后安全性提高了。
1)跳板机上:
cat /root/bobwblogin.sh
ssh root@101.200.1.1**
2)windows机器上:
D:\script\bobwbautoenterpwd.vbs
把用户名、ip区分开:
跳板机上执行:
sh /root/bobwblogin.sh
[root@iZ25dcp92ckZ multepoolserver]# sh /root/bobwblogin.sh
root@101.200.1.1**'s password:
密码从步骤2)里面寻找出来即可,在secureCRT里这样操作:
alt+s R, 脚本、执行,找到该路径下的D:\script\bobwbautoenterpwd.vbs文件,即可输入密码进入生产ip。
从而达到了,密码和用户名区分开,不致于windows机或跳板机被拿下后全泄漏了,分开后安全性提高了。
[调试关掉]开启OPCache时注意一下关掉这块,否则会等一分钟才生效。
Php/Js/Shell/Go jackxiang 2015-9-22 17:26
背景:有一兄弟用sftp往线下的那个服务器传更改的文件,发现传上去不好使呢,于是重新传,到后来又好了,我当时一看浏览器头,发现也没有啥问题呀,今天我自己搞了一把,发现还真有这个问题,细查了一下,是opcache引起的,默认是60秒。于是我给关了,之前是ea加速,现在新版本的php好像用这个opcache了:
; 2s检查一次文件更新 注意:0是一直检查不是关闭
; 推荐 60
opcache.revalidate_freq=2
————————————————————————
调试先关了,后面没问题再打开:
—————————————————————————
以下是opcache的配置说明:
复制代码
[opcache]
zend_extension = "G:/PHP/php-5.5.6-Win32-VC11-x64/ext/php_opcache.dll"
; Zend Optimizer + 的开关, 关闭时代码不再优化.
opcache.enable=1
; Determines if Zend OPCache is enabled for the CLI version of PHP
opcache.enable_cli=1
; Zend Optimizer + 共享内存的大小, 总共能够存储多少预编译的 PHP 代码(单位:MB)
; 推荐 128
opcache.memory_consumption=64
; Zend Optimizer + 暂存池中字符串的占内存总量.(单位:MB)
; 推荐 8
opcache.interned_strings_buffer=4
; 最大缓存的文件数目 200 到 100000 之间
; 推荐 4000
opcache.max_accelerated_files=2000
; 内存“浪费”达到此值对应的百分比,就会发起一个重启调度.
opcache.max_wasted_percentage=5
; 开启这条指令, Zend Optimizer + 会自动将当前工作目录的名字追加到脚本键上,
; 以此消除同名文件间的键值命名冲突.关闭这条指令会提升性能,
; 但是会对已存在的应用造成破坏.
opcache.use_cwd=0
; 开启文件时间戳验证
opcache.validate_timestamps=1
; 2s检查一次文件更新 注意:0是一直检查不是关闭
; 推荐 60
opcache.revalidate_freq=2
; 允许或禁止在 include_path 中进行文件搜索的优化
;opcache.revalidate_path=0
; 是否保存文件/函数的注释 如果apigen、Doctrine、 ZF2、 PHPUnit需要文件注释
; 推荐 0
opcache.save_comments=1
; 是否加载文件/函数的注释
;opcache.load_comments=1
; 打开快速关闭, 打开这个在PHP Request Shutdown的时候会收内存的速度会提高
; 推荐 1
opcache.fast_shutdown=1
;允许覆盖文件存在(file_exists等)的优化特性。
;opcache.enable_file_override=0
; 定义启动多少个优化过程
;opcache.optimization_level=0xffffffff
; 启用此Hack可以暂时性的解决”can’t redeclare class”错误.
;opcache.inherited_hack=1
; 启用此Hack可以暂时性的解决”can’t redeclare class”错误.
;opcache.dups_fix=0
; 设置不缓存的黑名单
; 不缓存指定目录下cache_开头的PHP文件. /png/www/example.com/public_html/cache/cache_
;opcache.blacklist_filename=
; 通过文件大小屏除大文件的缓存.默认情况下所有的文件都会被缓存.
;opcache.max_file_size=0
; 每 N 次请求检查一次缓存校验.默认值0表示检查被禁用了.
; 由于计算校验值有损性能,这个指令应当紧紧在开发调试的时候开启.
;opcache.consistency_checks=0
; 从缓存不被访问后,等待多久后(单位为秒)调度重启
;opcache.force_restart_timeout=180
; 错误日志文件名.留空表示使用标准错误输出(stderr).
;opcache.error_log=
; 将错误信息写入到服务器(Apache等)日志
;opcache.log_verbosity_level=1
; 内存共享的首选后台.留空则是让系统选择.
;opcache.preferred_memory_model=
; 防止共享内存在脚本执行期间被意外写入, 仅用于内部调试.
;opcache.protect_memory=0
来自:http://www.cnblogs.com/HD/p/4554455.html
opcache.huge_code_pages=1 参数的内在关联:
http://www.laruence.com/2015/10/02/3069.html
; 2s检查一次文件更新 注意:0是一直检查不是关闭
; 推荐 60
opcache.revalidate_freq=2
————————————————————————
调试先关了,后面没问题再打开:
—————————————————————————
以下是opcache的配置说明:
复制代码
[opcache]
zend_extension = "G:/PHP/php-5.5.6-Win32-VC11-x64/ext/php_opcache.dll"
; Zend Optimizer + 的开关, 关闭时代码不再优化.
opcache.enable=1
; Determines if Zend OPCache is enabled for the CLI version of PHP
opcache.enable_cli=1
; Zend Optimizer + 共享内存的大小, 总共能够存储多少预编译的 PHP 代码(单位:MB)
; 推荐 128
opcache.memory_consumption=64
; Zend Optimizer + 暂存池中字符串的占内存总量.(单位:MB)
; 推荐 8
opcache.interned_strings_buffer=4
; 最大缓存的文件数目 200 到 100000 之间
; 推荐 4000
opcache.max_accelerated_files=2000
; 内存“浪费”达到此值对应的百分比,就会发起一个重启调度.
opcache.max_wasted_percentage=5
; 开启这条指令, Zend Optimizer + 会自动将当前工作目录的名字追加到脚本键上,
; 以此消除同名文件间的键值命名冲突.关闭这条指令会提升性能,
; 但是会对已存在的应用造成破坏.
opcache.use_cwd=0
; 开启文件时间戳验证
opcache.validate_timestamps=1
; 2s检查一次文件更新 注意:0是一直检查不是关闭
; 推荐 60
opcache.revalidate_freq=2
; 允许或禁止在 include_path 中进行文件搜索的优化
;opcache.revalidate_path=0
; 是否保存文件/函数的注释 如果apigen、Doctrine、 ZF2、 PHPUnit需要文件注释
; 推荐 0
opcache.save_comments=1
; 是否加载文件/函数的注释
;opcache.load_comments=1
; 打开快速关闭, 打开这个在PHP Request Shutdown的时候会收内存的速度会提高
; 推荐 1
opcache.fast_shutdown=1
;允许覆盖文件存在(file_exists等)的优化特性。
;opcache.enable_file_override=0
; 定义启动多少个优化过程
;opcache.optimization_level=0xffffffff
; 启用此Hack可以暂时性的解决”can’t redeclare class”错误.
;opcache.inherited_hack=1
; 启用此Hack可以暂时性的解决”can’t redeclare class”错误.
;opcache.dups_fix=0
; 设置不缓存的黑名单
; 不缓存指定目录下cache_开头的PHP文件. /png/www/example.com/public_html/cache/cache_
;opcache.blacklist_filename=
; 通过文件大小屏除大文件的缓存.默认情况下所有的文件都会被缓存.
;opcache.max_file_size=0
; 每 N 次请求检查一次缓存校验.默认值0表示检查被禁用了.
; 由于计算校验值有损性能,这个指令应当紧紧在开发调试的时候开启.
;opcache.consistency_checks=0
; 从缓存不被访问后,等待多久后(单位为秒)调度重启
;opcache.force_restart_timeout=180
; 错误日志文件名.留空表示使用标准错误输出(stderr).
;opcache.error_log=
; 将错误信息写入到服务器(Apache等)日志
;opcache.log_verbosity_level=1
; 内存共享的首选后台.留空则是让系统选择.
;opcache.preferred_memory_model=
; 防止共享内存在脚本执行期间被意外写入, 仅用于内部调试.
;opcache.protect_memory=0
来自:http://www.cnblogs.com/HD/p/4554455.html
opcache.huge_code_pages=1 参数的内在关联:
http://www.laruence.com/2015/10/02/3069.html
刘强东谈当下多疯狂:估值两亿美金的二手车应用交易量只有两辆!
我给大家讲一个真实故事,去年年底有个互联网公司业务模式发生变化,以前老的业务不想做了,老板不想开除这些兄弟们,要赔偿一笔钱,跟30多个兄弟们商量说,兄弟们,你们出去创业吧,我给你们投150万人民币。这帮兄弟真就信了,拿了150万人民币去创业了。
到今年3月份见面,本来以为这些兄弟和公司没关系了,从此算是解套了,结果3月份兄弟们告诉他,已经拿到了A轮500万美金的投资,他之前投的150万占了70%的股,最近B轮融资追过来,估值2个亿美金!
原来兄弟们在手机上做了个卖二手车的APP,我问卖了几辆车,他告诉我最多只卖了两辆车,还是员工自己买的。
......
任何一种互联网商业模式,如果不能够降低行业的交易成本,不能够提升行业交易效率的话,那么最后注定会失败的。
________________________________________________________________________________________
本文是京东CEO刘强东近日在京东内部的一场分享。在演讲中,刘强东透露有的估值两亿美元的二手车APP公司,其实交易量少得可怜,“只有两辆!还是员工自己买的”。而东哥也认为,当下互联网泡沫已到了一个顶峰,“在私募市场,估值过10亿美金的企业,中国已经超过50家企业”,疯狂的尽头同时也意味着行业到了谷底。
文 | 刘强东
京东涉足电商应该算是互联网行业里面比较晚的。2004年,中国互联网电商阵营已经很庞大,那时当当拿到C轮融资,卓越卖给了亚马逊,易迅、淘宝等公司都已经成立。
此前我们做了六年传统商业,带着对传统商业的思考进入了互联网。做了12年,我发现互联网并不是和传统行业无关,传统商业的价值和经济规律完全适用于互联网。
只卖了两辆车的二手车APP,居然估值两亿美金
这段时间中国经济有下行压力,再加上最近几年互联网很热门,大量的传统企业老板纷纷找我合作,尤其是我们投资了永辉超市之后,有一大堆的超市找我们,希望能跟京东合作,他们说一定要和互联网有关系。
我很好奇为什么一定要和互联网有关系?有个中欧的校友跟我说了实话,他们感觉跟互联网接上关系,连猪都可以飞起来。
互联网领域有个很普遍的说法,风来了,猪都会飞。我认为如果你是一头猪的话,就两种选择。
第一个选择你使劲吃,使劲睡,抓紧最后的日子,享享福得了。
第二条路,你就每天少吃,多走路,锻炼身体,把自己弄瘦一点儿,让养你的人晚杀你几天,你干嘛非要飞起来?猪飞起来有什么结果?你是头猪,飞到天上去,是疯狂了十几秒,但摔下来死得更快。
我给大家讲一个真实故事,去年年底有个互联网公司业务模式发生变化,以前老的业务不想做了,老板不想开除这些兄弟们,要赔偿一笔钱,跟30多个兄弟们商量说,兄弟们,你们出去创业吧,我给你们投150万人民币。这帮兄弟真就信了,拿了150万人民币去创业了。
到今年3月份见面,本来以为这些兄弟和公司没关系了,从此算是解套了,结果3月份兄弟们告诉他,已经拿到了A轮500万美金的投资,他之前投的150万占了70%的股,最近B轮融资追过来,估值2个亿美金!
原来兄弟们在手机上做了个卖二手车的APP,我问卖了几辆车,他告诉我最多只卖了两辆车,还是员工自己买的。
估值超过10亿美金,如果不能提升行业交易效率,然并卵
十二年以来,我在互联网经历过三次行业谷底,最近一年正在经历第三次行业谷底。整个中国互联网拿到5000万美金融资的几十家企业,估值超过10亿美金,到今天没有一家上市的,但在私募市场,估值过10亿美金的企业,中国已经超过50家企业。我认为,任何时候,行业一旦疯狂的时候就会出问题。
互联网没有违背经济规律,我们看到中国互联网行业发展到今天也就不到10家被记住。任何一个行业只要存在三家以上的巨头,这个行业都不健康,全世界互联网都是这样,全世界互联网第一名占了80%的利润。
其他互联网企业死掉了是什么原因?我们也琢磨了很长时间。最后结论就是任何一种商业模式都要符合传统经济规律,所以我们对互联网的看法,总结就是任何一种互联网商业模式,如果不能够降低行业的交易成本,不能够提升行业交易效率的话,那么最后注定会失败的。
到今天中国所有的互联网企业,能够连续五年市值超过50亿美金,大概只有3家。如果能够连续五年市值过2亿美金以上的规模,也就十来家。如果把他们视为成功者的话,今天所有活下来的互联网企业,都是给行业带来成本的下降和效率的提升。电商就是能带来便利,这种便利的背后,是交易成本的下降。是消费者对此付出更少的时间。
我给大家讲一个真实故事,去年年底有个互联网公司业务模式发生变化,以前老的业务不想做了,老板不想开除这些兄弟们,要赔偿一笔钱,跟30多个兄弟们商量说,兄弟们,你们出去创业吧,我给你们投150万人民币。这帮兄弟真就信了,拿了150万人民币去创业了。
到今年3月份见面,本来以为这些兄弟和公司没关系了,从此算是解套了,结果3月份兄弟们告诉他,已经拿到了A轮500万美金的投资,他之前投的150万占了70%的股,最近B轮融资追过来,估值2个亿美金!
原来兄弟们在手机上做了个卖二手车的APP,我问卖了几辆车,他告诉我最多只卖了两辆车,还是员工自己买的。
......
任何一种互联网商业模式,如果不能够降低行业的交易成本,不能够提升行业交易效率的话,那么最后注定会失败的。
________________________________________________________________________________________
本文是京东CEO刘强东近日在京东内部的一场分享。在演讲中,刘强东透露有的估值两亿美元的二手车APP公司,其实交易量少得可怜,“只有两辆!还是员工自己买的”。而东哥也认为,当下互联网泡沫已到了一个顶峰,“在私募市场,估值过10亿美金的企业,中国已经超过50家企业”,疯狂的尽头同时也意味着行业到了谷底。
文 | 刘强东
京东涉足电商应该算是互联网行业里面比较晚的。2004年,中国互联网电商阵营已经很庞大,那时当当拿到C轮融资,卓越卖给了亚马逊,易迅、淘宝等公司都已经成立。
此前我们做了六年传统商业,带着对传统商业的思考进入了互联网。做了12年,我发现互联网并不是和传统行业无关,传统商业的价值和经济规律完全适用于互联网。
只卖了两辆车的二手车APP,居然估值两亿美金
这段时间中国经济有下行压力,再加上最近几年互联网很热门,大量的传统企业老板纷纷找我合作,尤其是我们投资了永辉超市之后,有一大堆的超市找我们,希望能跟京东合作,他们说一定要和互联网有关系。
我很好奇为什么一定要和互联网有关系?有个中欧的校友跟我说了实话,他们感觉跟互联网接上关系,连猪都可以飞起来。
互联网领域有个很普遍的说法,风来了,猪都会飞。我认为如果你是一头猪的话,就两种选择。
第一个选择你使劲吃,使劲睡,抓紧最后的日子,享享福得了。
第二条路,你就每天少吃,多走路,锻炼身体,把自己弄瘦一点儿,让养你的人晚杀你几天,你干嘛非要飞起来?猪飞起来有什么结果?你是头猪,飞到天上去,是疯狂了十几秒,但摔下来死得更快。
我给大家讲一个真实故事,去年年底有个互联网公司业务模式发生变化,以前老的业务不想做了,老板不想开除这些兄弟们,要赔偿一笔钱,跟30多个兄弟们商量说,兄弟们,你们出去创业吧,我给你们投150万人民币。这帮兄弟真就信了,拿了150万人民币去创业了。
到今年3月份见面,本来以为这些兄弟和公司没关系了,从此算是解套了,结果3月份兄弟们告诉他,已经拿到了A轮500万美金的投资,他之前投的150万占了70%的股,最近B轮融资追过来,估值2个亿美金!
原来兄弟们在手机上做了个卖二手车的APP,我问卖了几辆车,他告诉我最多只卖了两辆车,还是员工自己买的。
估值超过10亿美金,如果不能提升行业交易效率,然并卵
十二年以来,我在互联网经历过三次行业谷底,最近一年正在经历第三次行业谷底。整个中国互联网拿到5000万美金融资的几十家企业,估值超过10亿美金,到今天没有一家上市的,但在私募市场,估值过10亿美金的企业,中国已经超过50家企业。我认为,任何时候,行业一旦疯狂的时候就会出问题。
互联网没有违背经济规律,我们看到中国互联网行业发展到今天也就不到10家被记住。任何一个行业只要存在三家以上的巨头,这个行业都不健康,全世界互联网都是这样,全世界互联网第一名占了80%的利润。
其他互联网企业死掉了是什么原因?我们也琢磨了很长时间。最后结论就是任何一种商业模式都要符合传统经济规律,所以我们对互联网的看法,总结就是任何一种互联网商业模式,如果不能够降低行业的交易成本,不能够提升行业交易效率的话,那么最后注定会失败的。
到今天中国所有的互联网企业,能够连续五年市值超过50亿美金,大概只有3家。如果能够连续五年市值过2亿美金以上的规模,也就十来家。如果把他们视为成功者的话,今天所有活下来的互联网企业,都是给行业带来成本的下降和效率的提升。电商就是能带来便利,这种便利的背后,是交易成本的下降。是消费者对此付出更少的时间。
背景:听说在微信上搞个服务号,怎么调试呢?微信上也是web做的服务号手机网站,在PC端有Firebug和chrome的F12调试,而用苹果的web端调试则是用苹果手机连接上苹果电脑,打开safari进行调试,相当有效果。
我们知道在 Mac/PC 上的浏览器都有 Web 检查器这类的工具(如最著名的 Firebug)对前端开发进行调试,而在 iPhone/iPad 由于限于屏幕的大小和触摸屏的使用习惯,直接对网页调试非常不方便,所以一直没有 Web 检查器这一类工具。
但是 iOS 6 的发布解决了这个问题。
iOS 6 给 Safari 带来了远程的 Web 检查器工具(Remote Web Inspector),你可以通过模拟器或者真实的设备(通过 USB 连上 Mac)进行调试。下面我讲讲详细的调试过程:
1. 要进行远程调试,首先要打开开启 iPhone/iPad 上的 Safari 的远程调试功能,“通过 设置 > Safari > 高级”开启:
2. 然后打开 Safari,开启你要调试的网页,当然原生应用中通过 WebView 开启的网页也是可以调试的。
3. 最后把 iPhone 或者 iPad 通过数据线连上 Mac 电脑,打开桌面版的 Safari(目前 iOS 6 的 Safari 远程调试只支持通过 Mac 上的桌面版的 Safari 进行,Safari for Windows 目前还没有此项功能),点击开发菜单,选择你调试的 iPhone/iPad 的设备名,选择调试的网页。
4. 最后就是调用桌面版的 Safari 的 Web 检查器对 iPhone/iPad 上的 Safari 应用进行调试:
这个调试过程和我们平常在 Mac/PC 上调试基本一样,比如可以对 HTML 和 CSS 做些实时的改动,查看修改后的效果。查看 cookie,本地存储,session 等一些数据。查看 WebApp 的性能,网络请求等,也可以查看所有错误和警告信息对程序进行修正。
当然我们可以通过它来调试 Javascript,设置断点,定义未捕获的意外等。也可以访问 Console,直接执行 Javascript 代码。
另外它还支持触摸检查(Touch to inspect):激活检查器上的手型图标,就可以通过在 iPhone/iPad 上触摸,就能立即找到检查器对应的 DOM 元素。
来自:http://www.leiphone.com/news/201406/ios-safari-remote-debugging.html
我们知道在 Mac/PC 上的浏览器都有 Web 检查器这类的工具(如最著名的 Firebug)对前端开发进行调试,而在 iPhone/iPad 由于限于屏幕的大小和触摸屏的使用习惯,直接对网页调试非常不方便,所以一直没有 Web 检查器这一类工具。
但是 iOS 6 的发布解决了这个问题。
iOS 6 给 Safari 带来了远程的 Web 检查器工具(Remote Web Inspector),你可以通过模拟器或者真实的设备(通过 USB 连上 Mac)进行调试。下面我讲讲详细的调试过程:
1. 要进行远程调试,首先要打开开启 iPhone/iPad 上的 Safari 的远程调试功能,“通过 设置 > Safari > 高级”开启:
2. 然后打开 Safari,开启你要调试的网页,当然原生应用中通过 WebView 开启的网页也是可以调试的。
3. 最后把 iPhone 或者 iPad 通过数据线连上 Mac 电脑,打开桌面版的 Safari(目前 iOS 6 的 Safari 远程调试只支持通过 Mac 上的桌面版的 Safari 进行,Safari for Windows 目前还没有此项功能),点击开发菜单,选择你调试的 iPhone/iPad 的设备名,选择调试的网页。
4. 最后就是调用桌面版的 Safari 的 Web 检查器对 iPhone/iPad 上的 Safari 应用进行调试:
这个调试过程和我们平常在 Mac/PC 上调试基本一样,比如可以对 HTML 和 CSS 做些实时的改动,查看修改后的效果。查看 cookie,本地存储,session 等一些数据。查看 WebApp 的性能,网络请求等,也可以查看所有错误和警告信息对程序进行修正。
当然我们可以通过它来调试 Javascript,设置断点,定义未捕获的意外等。也可以访问 Console,直接执行 Javascript 代码。
另外它还支持触摸检查(Touch to inspect):激活检查器上的手型图标,就可以通过在 iPhone/iPad 上触摸,就能立即找到检查器对应的 DOM 元素。
来自:http://www.leiphone.com/news/201406/ios-safari-remote-debugging.html
PHP不如C++ 吗?被swoole坑哭的PHP程序员。
Php/Js/Shell/Go jackxiang 2015-9-17 14:26
昨天和一个前同事聊天,各种吐槽PHP,吐槽Swoole,他认为PHP到处是坑,PHP局限很大。PHP+Swoole不适合做高并发服务器,C+Swoole才是最好的方案。C++有各种数据结构,C++可以开线程,C++可以共享对象。看来有必要好好得说明一下了。
PHP不如C++ 吗?
PHP比C/C++或Java少了什么?多线程,多线程,多线程……
是的。PHP比C/C++、Java少了多了多线程。PHP只有多进程的方案,所以PHP里的全局变量和对象不是共享的、数据结构也不能跨进程操作、Socket文件描述符不能共享等等。所以PHP有局限?
多线程看似比多进程要强大很多,实际上我可以负责任的告诉你,多线程带来的坑更多。
数据同步问题会让你崩溃的。要么就牺牲性能到处加锁,要么就用地狱难度的无锁并发编程,据我所知目前国内能掌握此项技能的人凤毛麟角。
不要以为加锁就万事大吉了,你会在死锁问题上栽个大跟头。当你的程序逻辑复杂后,锁越来越难控制了,一旦死锁你的程序基本上就完了。
某个线程挂了那所有线程都会退出
反而在看多进程,其实就简单的多了。
配合进程间通信,基本上你可以实现任意的数据共享。比如利用一个进程专门存数据结构和对象,其他进程的数据操作全部投递到此进程来
多进程不需要锁
多进程可以使用共享内存的数据结构实现一些多线程的功能。如Swoole提供的Table、Atomic可以实现数据共享,但成本很低。未来还会加入共享内存队列
所谓PHP限制了Swoole,这完全是无稽之谈。合理利用Swoole提供的Table、Atomic、SendMessage/PipeMessage、Task完全可以实现异步非阻塞的代码逻辑。
C++写出来的程序性能更好?
这完全是盲目的迷信,密集计算的程序C++确实是有优势的。而并发服务器核心是IO,并非大规模密集运算。C++从语言层面来看并没有什么优势。另外C++中的大部分数据结构在PHP中都有对应的实现,实在不行自己写个专门的扩展也能解决之。
高并发的服务器单机能维持10W连接、每秒可处理3-5W笔消息收发。这种性能水准已经可以应用在BAT的核心系统上了。
开发效率快的意义是什么?
这位同事还说PHP开发Server虽然比C++快了,但是追求性能的极致还是要用C++。我要告诉你效率高了究竟意义何在。开发一套好程序不是一 件容易的事情,需要程序员投入大量时间和精力。开发效率提升的意义并不是简单的我可以更少时间完工,而是剩下的时间你可以增加单元测试、修复BUG、提升 用户体验、完善细节、提供配套工具、优化性能、增加关键日志、增加监控报警、增加容灾方案。
被swoole坑哭的PHP程序员:
首先说一下对swoole的理解:披着PHP外衣的C程序。很多PHPer朋友看到swoole提供的强大功能、外界对其的崇拜便跃跃欲试的安装、调 试其demo、编写新功能,然后兴奋的奔走相告。没过几天当你按照自己的理解继续用swoole时,发现代码并没有按照自己的预期运行,然后开始破口大 骂,什么破东西呀,代码跟demo基本一样,为啥运行不通呢?什么狗屁work、task、共享内存、ipcs、异步,各种问题涌现,然后迅速去查官方文 档,发现文档中竟然对这些并没有提及,只是简单的介绍怎么使用,此时几乎对swoole丧失希望。
被swoole坑哭的PHP程序员
遇到的几点问题:
1:关于phper常用的全局变量(global)为什么在onRequest函数中不能使用。
因为swoole是多线程编程,global是不能在多个进程间共享的。例
global $i = 0;
function onRequest() {
echo $i++;
}
如果在swoole中写一个上面的程序,并不会每次访问输出一个递增的数字。如果要实现预期的效果,需要使用swoole_table的相关函数。
2:什么是异步、什么是回高
对于phper来说,对异步、回调的理解估计就是ajax。当看到swoole里面对异步、回调的解释,貌似很简单的样子,就这样在没有任何多线程编辑经验的时候贸然用了swoole,结果被坑的偷偷撸代码好几个通宵来填自己的坑。
3:为什么onReceive收到的数据这么大
客户端发送的多次请求,服务端是可以一次性接收的。并不是客户端发送一次,服务端接收一次
4:自制httpserve
写一个http服务端,然后通过浏览器访问这个自制的服务器,刷新一次浏览器,服务端为什么为接收到两次请求?这个问题估计困饶了好多初次用swoole写httpserver的朋友。因为浏览器会多发一个favicon.ico请求。
原因
出现这种情况的原因其实很简 单,大部分phper都只会php这一种语言,主要用途就是做web,写业务逻辑。很少去了解服务器程序的开发。有一次一个朋友用swoole写了一个简 单的服务端,一个客户端,跑过来问我为什么都启动了却都收不到数据,我简单看了下代码,所有连接确实都成功了,两端都设置了onReceive回调,代码 没问题,看到最后才发现他的服务端、客户端都设置了接到消息的回调函数,但是两端都没有向对方发消息,两端处于僵持状态。然后swoole官方对于这种常 识问题没有给出说明,只是说如何设置回调、如何发消息,如何这样,如何那样。对于有服务端开发经验的同学来说,肯定不会遇到这种问题,swoole文档也 不需要指明需要这样做,因为这是常识。但对于phper来说,指明这一点是非常重要的,因为如上面所说phper是没有这方面认知的,只有服务端开发经验 的程序员有才会有。
swoole的特色:网络通信 框架、异步、多线程。这些特性正是php所不完善的功能(虽然官方提供很多基础函数可以实现这些功能,然后缺少中文文档,很少有人用php来实现这部分功 能),普通的phper也不具备这些特性的基础认知,所以贸然使用swoole难免会遇到一些根本在swoole官方查不到的常识问题。
使用swoole必须要掌握的技能
多线程编程
进程间通信
网络协议TCP/UDP的认知
PHP的各项基本技能
个人学习swoole的经历
在很久之前我也是一个只会 php的程序员,后来一次偶然机会需要用httpsqs,用了一段时间后发现有一些个性的需求,于是就开始看源码。这真是不看不知道,一看吓一 跳,httpsqs只是一层简单的包装,内部是一个Tokyo Cabinet数据库,印象中封装的代码也就一百多行。主要思路就是用C语言的libevent做了一个http服务器,接收请求读写tokyo cabinet数据库,当时按照这种思路做出来的程序确实不少。后来我就突发奇想,既然C语言可以用libevent函数,那PHP肯定也可以用 libevent监听网络,接收请求后读写数据库做队列服务。后来经过查php官方文档,PHP确实提供一系统完整的函数来完成这些功能,甚至多线程的全 套函数都有提供,但中文文档太少,网上也很少搜索到成熟的代码。在逼不得已的情况下,补习了linux-C多线程开发的基本原理,进程间通信的常用方法, 也用来做了一些简单的demo。唯一的感觉就是写一个简单的功能,设计起来还真复杂。就在快要放弃的时候,swoole出现了。swoole所提供的功能 正是php所缺失的功能,简直是太棒了。swoole做为一种网络通信框架,只需要简单的几行设置,一个服务器就搭建起来了,以后就是不断的去完善业务代 码。之前在libevent交流群中得知swoole的设计在c\c++中并不是最好的框架设计,但其亮点就是把基本功能用C封装好,业务功能留给世界上 最好的语言PHP来编写。自此便开始了swoole的填坑之旅。
总结
swoole并不是一个简单的PHP框架,正如swoole官方首页的第一句话“重新定义PHP”,千万不要用旧有php的思想来写swoole代码!swoole重新激活了PHP,php成就了swoole!
PHP不如C++ 吗?
PHP比C/C++或Java少了什么?多线程,多线程,多线程……
是的。PHP比C/C++、Java少了多了多线程。PHP只有多进程的方案,所以PHP里的全局变量和对象不是共享的、数据结构也不能跨进程操作、Socket文件描述符不能共享等等。所以PHP有局限?
多线程看似比多进程要强大很多,实际上我可以负责任的告诉你,多线程带来的坑更多。
数据同步问题会让你崩溃的。要么就牺牲性能到处加锁,要么就用地狱难度的无锁并发编程,据我所知目前国内能掌握此项技能的人凤毛麟角。
不要以为加锁就万事大吉了,你会在死锁问题上栽个大跟头。当你的程序逻辑复杂后,锁越来越难控制了,一旦死锁你的程序基本上就完了。
某个线程挂了那所有线程都会退出
反而在看多进程,其实就简单的多了。
配合进程间通信,基本上你可以实现任意的数据共享。比如利用一个进程专门存数据结构和对象,其他进程的数据操作全部投递到此进程来
多进程不需要锁
多进程可以使用共享内存的数据结构实现一些多线程的功能。如Swoole提供的Table、Atomic可以实现数据共享,但成本很低。未来还会加入共享内存队列
所谓PHP限制了Swoole,这完全是无稽之谈。合理利用Swoole提供的Table、Atomic、SendMessage/PipeMessage、Task完全可以实现异步非阻塞的代码逻辑。
C++写出来的程序性能更好?
这完全是盲目的迷信,密集计算的程序C++确实是有优势的。而并发服务器核心是IO,并非大规模密集运算。C++从语言层面来看并没有什么优势。另外C++中的大部分数据结构在PHP中都有对应的实现,实在不行自己写个专门的扩展也能解决之。
高并发的服务器单机能维持10W连接、每秒可处理3-5W笔消息收发。这种性能水准已经可以应用在BAT的核心系统上了。
开发效率快的意义是什么?
这位同事还说PHP开发Server虽然比C++快了,但是追求性能的极致还是要用C++。我要告诉你效率高了究竟意义何在。开发一套好程序不是一 件容易的事情,需要程序员投入大量时间和精力。开发效率提升的意义并不是简单的我可以更少时间完工,而是剩下的时间你可以增加单元测试、修复BUG、提升 用户体验、完善细节、提供配套工具、优化性能、增加关键日志、增加监控报警、增加容灾方案。
被swoole坑哭的PHP程序员:
首先说一下对swoole的理解:披着PHP外衣的C程序。很多PHPer朋友看到swoole提供的强大功能、外界对其的崇拜便跃跃欲试的安装、调 试其demo、编写新功能,然后兴奋的奔走相告。没过几天当你按照自己的理解继续用swoole时,发现代码并没有按照自己的预期运行,然后开始破口大 骂,什么破东西呀,代码跟demo基本一样,为啥运行不通呢?什么狗屁work、task、共享内存、ipcs、异步,各种问题涌现,然后迅速去查官方文 档,发现文档中竟然对这些并没有提及,只是简单的介绍怎么使用,此时几乎对swoole丧失希望。
被swoole坑哭的PHP程序员
遇到的几点问题:
1:关于phper常用的全局变量(global)为什么在onRequest函数中不能使用。
因为swoole是多线程编程,global是不能在多个进程间共享的。例
global $i = 0;
function onRequest() {
echo $i++;
}
如果在swoole中写一个上面的程序,并不会每次访问输出一个递增的数字。如果要实现预期的效果,需要使用swoole_table的相关函数。
2:什么是异步、什么是回高
对于phper来说,对异步、回调的理解估计就是ajax。当看到swoole里面对异步、回调的解释,貌似很简单的样子,就这样在没有任何多线程编辑经验的时候贸然用了swoole,结果被坑的偷偷撸代码好几个通宵来填自己的坑。
3:为什么onReceive收到的数据这么大
客户端发送的多次请求,服务端是可以一次性接收的。并不是客户端发送一次,服务端接收一次
4:自制httpserve
写一个http服务端,然后通过浏览器访问这个自制的服务器,刷新一次浏览器,服务端为什么为接收到两次请求?这个问题估计困饶了好多初次用swoole写httpserver的朋友。因为浏览器会多发一个favicon.ico请求。
原因
出现这种情况的原因其实很简 单,大部分phper都只会php这一种语言,主要用途就是做web,写业务逻辑。很少去了解服务器程序的开发。有一次一个朋友用swoole写了一个简 单的服务端,一个客户端,跑过来问我为什么都启动了却都收不到数据,我简单看了下代码,所有连接确实都成功了,两端都设置了onReceive回调,代码 没问题,看到最后才发现他的服务端、客户端都设置了接到消息的回调函数,但是两端都没有向对方发消息,两端处于僵持状态。然后swoole官方对于这种常 识问题没有给出说明,只是说如何设置回调、如何发消息,如何这样,如何那样。对于有服务端开发经验的同学来说,肯定不会遇到这种问题,swoole文档也 不需要指明需要这样做,因为这是常识。但对于phper来说,指明这一点是非常重要的,因为如上面所说phper是没有这方面认知的,只有服务端开发经验 的程序员有才会有。
swoole的特色:网络通信 框架、异步、多线程。这些特性正是php所不完善的功能(虽然官方提供很多基础函数可以实现这些功能,然后缺少中文文档,很少有人用php来实现这部分功 能),普通的phper也不具备这些特性的基础认知,所以贸然使用swoole难免会遇到一些根本在swoole官方查不到的常识问题。
使用swoole必须要掌握的技能
多线程编程
进程间通信
网络协议TCP/UDP的认知
PHP的各项基本技能
个人学习swoole的经历
在很久之前我也是一个只会 php的程序员,后来一次偶然机会需要用httpsqs,用了一段时间后发现有一些个性的需求,于是就开始看源码。这真是不看不知道,一看吓一 跳,httpsqs只是一层简单的包装,内部是一个Tokyo Cabinet数据库,印象中封装的代码也就一百多行。主要思路就是用C语言的libevent做了一个http服务器,接收请求读写tokyo cabinet数据库,当时按照这种思路做出来的程序确实不少。后来我就突发奇想,既然C语言可以用libevent函数,那PHP肯定也可以用 libevent监听网络,接收请求后读写数据库做队列服务。后来经过查php官方文档,PHP确实提供一系统完整的函数来完成这些功能,甚至多线程的全 套函数都有提供,但中文文档太少,网上也很少搜索到成熟的代码。在逼不得已的情况下,补习了linux-C多线程开发的基本原理,进程间通信的常用方法, 也用来做了一些简单的demo。唯一的感觉就是写一个简单的功能,设计起来还真复杂。就在快要放弃的时候,swoole出现了。swoole所提供的功能 正是php所缺失的功能,简直是太棒了。swoole做为一种网络通信框架,只需要简单的几行设置,一个服务器就搭建起来了,以后就是不断的去完善业务代 码。之前在libevent交流群中得知swoole的设计在c\c++中并不是最好的框架设计,但其亮点就是把基本功能用C封装好,业务功能留给世界上 最好的语言PHP来编写。自此便开始了swoole的填坑之旅。
总结
swoole并不是一个简单的PHP框架,正如swoole官方首页的第一句话“重新定义PHP”,千万不要用旧有php的思想来写swoole代码!swoole重新激活了PHP,php成就了swoole!
保持简单,保持聪明
这个语言也有它的缺点。只有相对较少的程序员了解Erlang,它也不会百分百与如今互联网公司的代码相匹配。Facebook用Erlang语言开发了他们自己的聊天app,但最终他们还是重新用其他语言进行再次开发,以适配其他基础架构。 “Erlang是我们拥有的一座岛的话,我们很难建造出足够多的船可以停靠到岛上。”Facebook工程副总裁Jay Parikh说。
摘自:http://www.huxiu.com/article/126127/1.html?f=wangzhan
这个语言也有它的缺点。只有相对较少的程序员了解Erlang,它也不会百分百与如今互联网公司的代码相匹配。Facebook用Erlang语言开发了他们自己的聊天app,但最终他们还是重新用其他语言进行再次开发,以适配其他基础架构。 “Erlang是我们拥有的一座岛的话,我们很难建造出足够多的船可以停靠到岛上。”Facebook工程副总裁Jay Parikh说。
摘自:http://www.huxiu.com/article/126127/1.html?f=wangzhan
背景:个人喜欢直接回车,键盘操作,也有用鼠标的:回车搜索。也有没有必要回车的。
一定要注意是有form的表单,即:
<form> </form>
__________________________
我们有时候希望回车键敲在文本框(input element)里来提交表单(form),但有时候又不希望如此。比如搜索行为,希望输入完关键词之后直接按回车键立即提交表单,而有些复杂表单,可能要避免回车键误操作在未完成表单填写的时候就触发了表单提交。
要控制这些行为,不需要借助JS,浏览器已经帮我们做了这些处理,这里总结几条规则:
1. 如果表单里有一个type=”submit”的按钮,回车键生效。
2. 如果表单里只有一个type=”text”的input,不管按钮是什么type,回车键生效。
3. 如果按钮不是用input,而是用button,并且没有加type,IE下默认为type=button,FX默认为type=submit。
4. 其他表单元素如textarea、select不影响,radio checkbox不影响触发规则,但本身在FX下会响应回车键,在IE下不响应。
5. type=”image”的input,效果等同于type=”submit”,不知道为什么会设计这样一种type,不推荐使用,应该用CSS添加背景图合适些。
6.我们在处理表单的页面可以检验他是否点击了按钮来控制下面的程序。if($_POST['submit']){ 如果点击了按钮 程序继续}
实际应用的时候,要让表单响应回车键很容易,保证表单里有个type=”submit”的按钮就行。而当只有一个文本框又不希望响应回车键怎么办 呢?我的方法有点别扭,就是再写一个无意义的文本框,隐藏起来。根据第3条规则,我们在用button的时候,尽量显式声明type以使浏览器表现一致。
通过以上可知只要把type="submit"改成type="button"然后js提交, 在不要有一个type=”text”的input就行了。就不会发生回车跳转。
但实验发现,ie和火狐不一样,火狐的submit按钮有掩藏的(display:block)和显现的都不行,必须全改,但ie只要显现的没有submit就行了。
复制代码
<!DOCTYPE html>
<html>
<head>
<meta charset="gb18030" />
<meta http-equiv="Content-Type" content="text/html; charset=gb18030" />
<title>HTML 5 gb18030编码格式</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script>
</head>
<body>
<script type="text/javascript">
function doSubmit() {
alert("XXXXXXXXX");
return false;
}
//监听回车
/* $(document).ready(function() {
$(document).keydown(function(e) {
if (e.keyCode == 13) {
alert("xxxxNX");
}
});<input type="submit" value="submit" />
});*/
</script>
<form onsubmit="return doSubmit();" method="post" action="">
<input type="text" />
<input type="button" value="button" />
<input type="text" style="display:none" value="此处的input删掉然后回车按钮就会触发提交" />
</form>
</body>
</html>
复制代码
本文是看了http://yuanyuan7891.iteye.com/blog/567532之后晚上回家实验了总结的。感谢yuanyuan7891的博文的帮助。
一定要注意是有form的表单,即:
<form> </form>
__________________________
我们有时候希望回车键敲在文本框(input element)里来提交表单(form),但有时候又不希望如此。比如搜索行为,希望输入完关键词之后直接按回车键立即提交表单,而有些复杂表单,可能要避免回车键误操作在未完成表单填写的时候就触发了表单提交。
要控制这些行为,不需要借助JS,浏览器已经帮我们做了这些处理,这里总结几条规则:
1. 如果表单里有一个type=”submit”的按钮,回车键生效。
2. 如果表单里只有一个type=”text”的input,不管按钮是什么type,回车键生效。
3. 如果按钮不是用input,而是用button,并且没有加type,IE下默认为type=button,FX默认为type=submit。
4. 其他表单元素如textarea、select不影响,radio checkbox不影响触发规则,但本身在FX下会响应回车键,在IE下不响应。
5. type=”image”的input,效果等同于type=”submit”,不知道为什么会设计这样一种type,不推荐使用,应该用CSS添加背景图合适些。
6.我们在处理表单的页面可以检验他是否点击了按钮来控制下面的程序。if($_POST['submit']){ 如果点击了按钮 程序继续}
实际应用的时候,要让表单响应回车键很容易,保证表单里有个type=”submit”的按钮就行。而当只有一个文本框又不希望响应回车键怎么办 呢?我的方法有点别扭,就是再写一个无意义的文本框,隐藏起来。根据第3条规则,我们在用button的时候,尽量显式声明type以使浏览器表现一致。
通过以上可知只要把type="submit"改成type="button"然后js提交, 在不要有一个type=”text”的input就行了。就不会发生回车跳转。
但实验发现,ie和火狐不一样,火狐的submit按钮有掩藏的(display:block)和显现的都不行,必须全改,但ie只要显现的没有submit就行了。
复制代码
<!DOCTYPE html>
<html>
<head>
<meta charset="gb18030" />
<meta http-equiv="Content-Type" content="text/html; charset=gb18030" />
<title>HTML 5 gb18030编码格式</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script>
</head>
<body>
<script type="text/javascript">
function doSubmit() {
alert("XXXXXXXXX");
return false;
}
//监听回车
/* $(document).ready(function() {
$(document).keydown(function(e) {
if (e.keyCode == 13) {
alert("xxxxNX");
}
});<input type="submit" value="submit" />
});*/
</script>
<form onsubmit="return doSubmit();" method="post" action="">
<input type="text" />
<input type="button" value="button" />
<input type="text" style="display:none" value="此处的input删掉然后回车按钮就会触发提交" />
</form>
</body>
</html>
复制代码
本文是看了http://yuanyuan7891.iteye.com/blog/567532之后晚上回家实验了总结的。感谢yuanyuan7891的博文的帮助。
C语言读取二进制文件大小
Unix/LinuxC技术 jackxiang 2015-9-16 14:38
背景:如果获取一个二进制文件大小,可能用stat命令,也可能c函数ftell去转一圈,知道大小。
//把文件的位置指针移到文件尾
fseek(fp,OL,SEEK_END);
//获取文件长度;
length=ftell(fp);
printf("该文件的长度为%1d字节\n",length);
[root@iZ25dcp92ckZ multepoolserver]# ./getbinfilesize
binary file ./tianxia2.mp4 size=11827505
//把文件的位置指针移到文件尾
fseek(fp,OL,SEEK_END);
//获取文件长度;
length=ftell(fp);
printf("该文件的长度为%1d字节\n",length);
[root@iZ25dcp92ckZ multepoolserver]# ./getbinfilesize
binary file ./tianxia2.mp4 size=11827505
阿里有卖这玩意,有的是自己运维搞,放这儿备案下:
如何选择你的RDS:
http://help.aliyun.com/knowledge_detail.htm?knowledgeId=5989703
如何快速平稳的迁入RDS:
http://hidba.org/?p=899
http://hidba.org/?p=919
http://hidba.org/?p=929
http://hidba.org/?p=941
如何选择你的RDS:
http://help.aliyun.com/knowledge_detail.htm?knowledgeId=5989703
如何快速平稳的迁入RDS:
http://hidba.org/?p=899
http://hidba.org/?p=919
http://hidba.org/?p=929
http://hidba.org/?p=941