一上来很自然会想到正则,今天刚好有个同事遇到 phpmailer 的一个问题,就顺便翻了下其源码,发现原来除了正则,还有更好的方法.
源码摘抄如下:
function ValidateAddress($address)
{
if (function_exists('filter_var')) { //Introduced in PHP 5.2
if(filter_var($address, FILTER_VALIDATE_EMAIL) === FALSE) {
return false;
} else {
return true;
}
} else {
return preg_match('/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!\.)){0,61}[a-zA-Z0-9_-]?\.)+[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!$)){0,61}[a-zA-Z0-9_]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/', $address);
}
}
2013年5月21日星期二
2013年5月17日星期五
[总结] mysql 先排序再分组
src: http://www.oschina.net/question/123890_35887
比如一个评论表:
id uid title content ctime
取出最近的 10 条评论, 一条人发的多条评论的只取一条
SELECT MAX(id) AS max_id
FROM table1
GROUP BY uid
ORDER BY max_id DESC
比如一个评论表:
id uid title content ctime
取出最近的 10 条评论, 一条人发的多条评论的只取一条
SELECT MAX(id) AS max_id
FROM table1
GROUP BY uid
ORDER BY max_id DESC
2013年5月15日星期三
[转] scp, wget 断点续传
scp断点续传,wget自动断点续传的方法
一:scp 断点续传 [暂时没有使用过]
scp 一旦出错中断就只能重新开始,不过可以利用rsync实现scp的断点续传
1、在~/.bashrc中加入一个alias:
$vim ~/.bashrc
alias rscp='rsync -v -P -e ssh'
2、重新载入 .bashrc 配置
$source ~/.bashrc
二:wget自动断点续传的方法
有时候我们使用 wget 下载东西被迫打断, 比如网络故障, 终端意外断开, 忘了加 & 放入该台等等.
沉稳的人或许会想到重新开启 wget, 并使用 -c 断点续传, 可是有时候, 因为 N 个 G 的东西突然断了, 一冲动就晕了, 就纠结了, 可能就会就重新跑 wget 了, 甚至截止到本文还有人不知道 -c.
那么为了杯具不再发生, 我们可以让wget每次运行的时候自动加上 -c 参数, 那样就万事大吉了嘛. 方法如下:
在家目录下新建文件".wgetrc", 内容如下:
continue = on
写入 wget.sh 后,可以这样同时下载多个文件:
如果想不用IP,但有两个相同的域名,则需要配置 /etc/hosts 加和IP对应的域名,再 wget 即可。
保存退出, 以后再使用 wget 就会自动断点续传了
一:scp 断点续传 [暂时没有使用过]
scp 一旦出错中断就只能重新开始,不过可以利用rsync实现scp的断点续传
1、在~/.bashrc中加入一个alias:
$vim ~/.bashrc
alias rscp='rsync -v -P -e ssh'
2、重新载入 .bashrc 配置
$source ~/.bashrc
二:wget自动断点续传的方法
有时候我们使用 wget 下载东西被迫打断, 比如网络故障, 终端意外断开, 忘了加 & 放入该台等等.
沉稳的人或许会想到重新开启 wget, 并使用 -c 断点续传, 可是有时候, 因为 N 个 G 的东西突然断了, 一冲动就晕了, 就纠结了, 可能就会就重新跑 wget 了, 甚至截止到本文还有人不知道 -c.
那么为了杯具不再发生, 我们可以让wget每次运行的时候自动加上 -c 参数, 那样就万事大吉了嘛. 方法如下:
在家目录下新建文件".wgetrc", 内容如下:
continue = on
写入 wget.sh 后,可以这样同时下载多个文件:
- nohup wget http://116.255.139.240/software/db_must.tar.gz &
- nohup wget http://116.255.139.240/software/root_must.tar.gz &
- nohup wget http://116.255.139.240/software/webserver_must.tar.gz &
如果想不用IP,但有两个相同的域名,则需要配置 /etc/hosts 加和IP对应的域名,再 wget 即可。
保存退出, 以后再使用 wget 就会自动断点续传了
2013年5月9日星期四
[转] 正则表达式-合法变量名
正则表达式-合法变量名
^[_a-zA-Z][_a-zA-Z0-9]*$
^是以什么什么开始的意思,接后面的内容
[_a-zA-Z]代表第一个字符是:以_或者a到z之间的小写字母,或者A到Z之间的大写字母。
[a-zA-Z0-9]代表第二个字符是:以_或者a到z之间的小写字母,或者A到Z之间的大写字母,或者0到9之间的数字
*代表重复前面的这种匹配N次
$是结尾的意思
PS: 用来作 JSONP 的回调函数检验,防止 XSS 攻击,十分有效.相比白名单配置,正则校验要灵活的多.
2013年5月8日星期三
[转] mysql 数据库字段发现
mysql 数据库字段发现
1. mysql里的sql文件:tinyint字段不设置长度,则数据库默认是tinyint(4) 注:此长度是显示长度,比如:tinyint(4),我存储5,那么数据库就是0005 它的存储长度是固定不变的。
2. 未指定UNSIGNED类型的TINYINT 型的字段存储-127到128的整数。指定了UNSIGNED类型的TINYINT 型的字段用来存储0-255的整数。 通常,为了节省空间,应该尽可能的使用最小的整型数据。 一个TINYINT型数据只占用一个字节;一个INT型数据占用四个字节。 这看起来似乎差别不大,但是在比较大的表中,字节数的增长是很快的。 另一方面,一旦你已经创建了一个字段,要修改它是很困难的。 因此,为安全起见,你应该预测一下,一个字段所需要存储的数值最大有可能是多大,然后选择适当的数据类型。
3.boolean字段反应到数据库是tinyint(1),boolean -32786到 32767 tinyint是有正负的:-128到127 如果设置unsigned那么从0到255
4.选择zerofill则会默认选择unsigned一项 选择unsigned不会默认选择zerofill一项
5.boolean型---boolean tinyint----short…… numeric----long smallint----short int----Interger
6.字符串类型的后面括号是存储长度 CHAR(n)、CHARACTER(n) 包含固定长度的字符串,用空格填充到长度n。 VARCHAR(n)、CHARACTER VARYING(n)、CHARACTER VARYING 存储长度可变的字符串, 最大长度由n指定。末尾的空格不存储 数值类型的后面是显示长度 tinyint(4)、int(4)
7.NUMERIC、decimal类型的字段不能使用auto_increment属性 int 可以,但是映射到java实体类的时候是Integer型 bigint也可以,映射到java实体类的时候是long型
8.如果在方法里不添加事务,那么会有插入提交,但是没有提交事务,所以,结果是:消耗掉了一个id,但是,数据库没有记录
ps: 老要查,索性收录了.
1. mysql里的sql文件:tinyint字段不设置长度,则数据库默认是tinyint(4) 注:此长度是显示长度,比如:tinyint(4),我存储5,那么数据库就是0005 它的存储长度是固定不变的。
2. 未指定UNSIGNED类型的TINYINT 型的字段存储-127到128的整数。指定了UNSIGNED类型的TINYINT 型的字段用来存储0-255的整数。 通常,为了节省空间,应该尽可能的使用最小的整型数据。 一个TINYINT型数据只占用一个字节;一个INT型数据占用四个字节。 这看起来似乎差别不大,但是在比较大的表中,字节数的增长是很快的。 另一方面,一旦你已经创建了一个字段,要修改它是很困难的。 因此,为安全起见,你应该预测一下,一个字段所需要存储的数值最大有可能是多大,然后选择适当的数据类型。
3.boolean字段反应到数据库是tinyint(1),boolean -32786到 32767 tinyint是有正负的:-128到127 如果设置unsigned那么从0到255
4.选择zerofill则会默认选择unsigned一项 选择unsigned不会默认选择zerofill一项
5.boolean型---boolean tinyint----short…… numeric----long smallint----short int----Interger
6.字符串类型的后面括号是存储长度 CHAR(n)、CHARACTER(n) 包含固定长度的字符串,用空格填充到长度n。 VARCHAR(n)、CHARACTER VARYING(n)、CHARACTER VARYING 存储长度可变的字符串, 最大长度由n指定。末尾的空格不存储 数值类型的后面是显示长度 tinyint(4)、int(4)
7.NUMERIC、decimal类型的字段不能使用auto_increment属性 int 可以,但是映射到java实体类的时候是Integer型 bigint也可以,映射到java实体类的时候是long型
8.如果在方法里不添加事务,那么会有插入提交,但是没有提交事务,所以,结果是:消耗掉了一个id,但是,数据库没有记录
ps: 老要查,索性收录了.
2013年5月7日星期二
[整理] linux 大文件排序
sort大文件时,内存不足的解决方法
sort一个大文件时,容易造成内存不够的情况,解决方案:
1:split bigFileName -l 按行分割
-b 按大小分割 M K
2:再所有的子文件sort: sort -u subFileName > subFileName.tmp
3:合并所有的子文件: sort -m allSubFileName.tmp -u > resultFileName
注意:
1: “split:Output file suffixes exhausted”的解决方案:
分割文件时,默认的子文件是以两个字母组合的,当你要分割的大文件过大,即切割的子文件过多时,
已经超过26*26个,就会提示以上错误。split在提示我们输出的文件名后缀被用光了。这时加上-a参数即可,
表示用几个后缀,默认是2个。
split fileName -l $lines -a 3 "tempfile"
"tempfile"是切割后的子文件名的前缀。
2:split 的用法:
split 参数:
-a, --suffix-length=N 指定输出文件名的后缀,默认为2个
-b, --bytes=SIZE 指定输出文件的字节数,可跟K M;eg split file -b 10k
-C, --line-bytes=SIZE 每一输出档中,单行的最大 byte 数
-d, --numeric-suffixes 使用数字代替字母做后缀
-l, --lines=NUMBER 指定输出文件的行数
-a, --suffix-length=N 指定输出文件名的后缀,默认为2个
-b, --bytes=SIZE 指定输出文件的字节数,可跟K M;eg split file -b 10k
-C, --line-bytes=SIZE 每一输出档中,单行的最大 byte 数
-d, --numeric-suffixes 使用数字代替字母做后缀
-l, --lines=NUMBER 指定输出文件的行数
PS: sort 加上 -u 参数可以在排序的同时去重,或者通过管道交给 uniq 去重,以及做更多的动作.
-----另一个方案-----
大文件sort
先对文件按行split
1 | split -l 100000000 file #以一亿行分割,每行10个字符的文件,大约800M |
1 | #!/bin/sh |
2 | for file in ` ls x*` |
3 | do |
4 | sort $ file -T /home/xxx > $ file . sort |
5 | ##重点在这的-T设置tmp参数,sort是会写缓存文件的工具,不会 |
6 | ##一次性读取文件到内存,所以内存大小无所谓,但是默认会写系统区,可能造成系统区空间不够 |
7 | ##所以找个比较大的地方放 |
8 | done |
9 | sort -m ` ls *. sort ` > result |
其实直接sort也是可以的,有-T就行了对付上G的文件没问题,会跑满cpu但是内存占用只有0.几
sort之后的文件可以直接uniq,uniq的速度是极其快的,一亿行的文件sort需时40分钟,uniq只需不到2分钟
2013年5月3日星期五
[编译出错] 记一次 XML_Parser 出错的解决
有台机器的 git 有问题,而重新源码编译安装时报如下错:
http-push.c:14:19: error: expat.h: No such file or directory
http-push.c:856: warning: type defaults to ‘int’ in declaration of ‘XML_Char’
http-push.c:856: error: expected ‘;’, ‘,’ or ‘)’ before ‘*’ token
http-push.c: In function ‘lock_remote’:
http-push.c:927: error: ‘XML_Parser’ undeclared (first use in this function)
http-push.c:927: error: (Each undeclared identifier is reported only once
http-push.c:927: error: for each function it appears in.)
http-push.c:927: error: expected ‘;’ before ‘parser’
http-push.c:934: warning: implicit declaration of function ‘XML_SetUserData’
http-push.c:934: error: ‘parser’ undeclared (first use in this function)
http-push.c:935: warning: implicit declaration of function ‘XML_SetElementHandler’
http-push.c:937: warning: implicit declaration of function ‘XML_SetCharacterDataHandler’
http-push.c:937: error: ‘xml_cdata’ undeclared (first use in this function)
http-push.c:938: warning: implicit declaration of function ‘XML_Parse’
http-push.c:943: warning: implicit declaration of function ‘XML_ErrorString’
http-push.c:944: warning: implicit declaration of function ‘XML_GetErrorCode’
http-push.c:947: warning: implicit declaration of function ‘XML_ParserFree’
http-push.c: In function ‘remote_ls’:
http-push.c:1171: error: ‘XML_Parser’ undeclared (first use in this function)
http-push.c:1171: error: expected ‘;’ before ‘parser’
http-push.c:1178: error: ‘parser’ undeclared (first use in this function)
http-push.c:1181: error: ‘xml_cdata’ undeclared (first use in this function)
http-push.c: In function ‘locking_available’:
http-push.c:1245: error: ‘XML_Parser’ undeclared (first use in this function)
http-push.c:1245: error: expected ‘;’ before ‘parser’
http-push.c:1252: error: ‘parser’ undeclared (first use in this function)
make: *** [http-push.o] Error 1
google 了一下说需要安装 XML_Parser http://search.cpan.org/~toddr/XML-Parser-2.41/Parser.pm
下载安装的时候发现,它还依赖 expat http://sourceforge.net/projects/expat/
那就老老实实一步步来吧:
$ cd expat-2.1.0
$ ./configure --prefix=/home/work/local
$ make && make install
$ cd XML-Parser-2.41
$ perl Makefile.PL PREFIX=/home/work/local INSTALLDIRS=perl EXPATLIBPATH=/home/work/local/lib EXPATINCPATH=/home/work/local/include
$ make && make install
$ vi ~/.bashrc 加入新内容
export LD_LIBRARY_PATH=/home/work/local/lib
export C_INCLUDE_PATH=/home/work/local/include
export LIBRARY_PATH=/home/work/local/lib
然后再编译,就没有再报错了.
[转] 那些被遗漏的 Objective-C 保留字
原始链接: http://blog.devtang.com/blog/2013/04/29/the-missing-objc-keywords/
今天翻到很久以前自己在网易博客上写的这篇文章,惊奇地发现自己都忘记了里面的一些内容。所以我又重新学习了一下,然后改了改内容,挪到这里。
前言
Steffen Itterheim是《Learn Iphone and Ipad Cocos2d Game Development》作者。cocos2d和cocos2d-x现在已成为著名的游戏开发引擎。在AppStore上有超过100个游戏是基于Cocos2D。
Steffen Itterheim在他的博客中总结了 Objective-C 2.0 所有的编译器保留字,并且对这些保留字做了介绍和使用示例。这些保留字如下:
@class @defs @protocol @required @optional @end @interface @public @package @protected @private @property @end @implementation @synthesize @dynamic @end @throw @try @catch @finally @synchronized @autoreleasepool @selector @encode @compatibility_alias @”string”
我把这些保留字过了一遍,发现很少用到的有 @dynamic @defs @encode @compatibility_alis,所以就给大家介绍一下这几个关键字吧。
@dynamic
@dynamic 是相对于 @synthesize的,它们用样用于修饰 @property,用于生成对应的的getter和setter方法。但是@ dynamic表示这个成员变量的getter和setter方法并不是直接由编译器生成,而是手工生成或者运行时生成。
示例如下:
1 2 3 4 5 6 7 |
|
@defs
@defs 用于返回一个Objective-C类的struct结构,这个struct与原Objective-C类具有相同的内存布局。就象你所知的那样,Objective-C类可以理解成由基本的C struct加上额外的方法构成。
示例代码如下:
1
|
|
你可能会想,什么情况下才会需要使用这个关键字。答案是涉及非常底层的操作或优化的时候才会用到。像如这篇讨论Objective-C如何做缓存优化的文章中,就用到了该关键字。
@encode
@encode 是用于表示一个类型的字符串,对此,苹果有专门的介绍文档
示例如下:
1 2 3 4 5 6 7 8 9 10 |
|
@compatibility_alis
@compatibility_alis 是用于给一个类设置一个别名。这样就不用重构以前的类文件就可以用新的名字来替代原有名字。
示例如下:
1
|
|
@autoreleasepool
@autoreleasepool 是用于ARC下代替 NSAutoreleasePool的保留字,我把它写在这里,是想告诉那些以为ARC慢的同学,在苹果的这篇官方文档中有提到, @autoreleasepool 比 NSAutoreleasePool快6倍。当然,文档中也提到,ARC下不止Autorelease Pool的实现变快了,retain和release也快很多。如果你还没有在工程中使用ARC,推荐看看我的《是否应该使用ARC》。
Cheat Sheet
有一个热心者根据他的博文,制作了一张《Objective-C 2.0保留字速查表》,对于新手来说,把这张速查表打印出来,对于熟悉现在的保留字还是很有用的,它的下载地址是:http://maniacdev.com/cheatsheetobjccd.pdf
订阅:
博文 (Atom)