2013年5月21日星期二

[总结] php 中验证电子邮箱地址是否合法

一上来很自然会想到正则,今天刚好有个同事遇到 phpmailer 的一个问题,就顺便翻了下其源码,发现原来除了正则,还有更好的方法.

源码摘抄如下:

function ValidateAddress($address

    if (
function_exists('filter_var')) { //Introduced in PHP 5.2 
      
if(filter_var($addressFILTER_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月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

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 后,可以这样同时下载多个文件:
  1. nohup wget http://116.255.139.240/software/db_must.tar.gz  &  
  2. nohup wget http://116.255.139.240/software/root_must.tar.gz &  
  3. 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: 老要查,索性收录了.

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    指定输出文件的行数

PS: sort 加上 -u 参数可以在排序的同时去重,或者通过管道交给 uniq 去重,以及做更多的动作.

-----另一个方案-----

大文件sort


先对文件按行split
1split -l 100000000 file #以一亿行分割,每行10个字符的文件,大约800M
然后sort
1#!/bin/sh
2for file in `ls x*`
3do
4        sort $file -T /home/xxx > $file.sort
5##重点在这的-T设置tmp参数,sort是会写缓存文件的工具,不会
6##一次性读取文件到内存,所以内存大小无所谓,但是默认会写系统区,可能造成系统区空间不够
7##所以找个比较大的地方放
8done
9sort -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
@implementation ClassName
@synthesize aProperty, bProperty;
@synthesize cProperty=instanceVariableName;
@dynamic anotherProperty;

// method implementations
@end

@defs

@defs 用于返回一个Objective-C类的struct结构,这个struct与原Objective-C类具有相同的内存布局。就象你所知的那样,Objective-C类可以理解成由基本的C struct加上额外的方法构成。
示例代码如下:
1
struct { @defs( NSObject) }
你可能会想,什么情况下才会需要使用这个关键字。答案是涉及非常底层的操作或优化的时候才会用到。像如这篇讨论Objective-C如何做缓存优化的文章中,就用到了该关键字。

@encode

@encode 是用于表示一个类型的字符串,对此,苹果有专门的介绍文档
示例如下:
1
2
3
4
5
6
7
8
9
10
-(void) aMethod
{
    char *enc1 = @encode(int);                 // enc1 = "i"
    char *enc2 = @encode(id);                  // enc2 = "@"
    char *enc3 = @encode(@selector(aMethod));  // enc3 = ":"

    // practical example:
    CGRect rect = CGRectMake(0, 0, 100, 100);
    NSValue *v = [NSValue value:&rect withObjCType:@encode(CGRect)];
}

@compatibility_alis

@compatibility_alis 是用于给一个类设置一个别名。这样就不用重构以前的类文件就可以用新的名字来替代原有名字。
示例如下:
1
@compatibility_alias AliasClassName ExistingClassName

@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