Wednesday, December 29, 2010

vim tab 快捷键配置

[cc lang="text"]
map th :tabnext
map tl :tabprev
map tn :tabnew
map td :tabclose[/cc]

Wednesday, December 22, 2010

Nginx上ETag支持

[cc lang="text"]
location ~* ^.+.(gif|jpg|css|js|png)$ {
root /var/web/static;
FileETag on;
etag_format \"%X%X\";
add_header Cache-Control max-age=0;
}
[/cc]
这样就可以返回304啦。

Saturday, November 27, 2010

PHP二维数组排序函数

[cc lang="php"]
// 二维数组排序函数
function sysSortArray($ArrayData,$KeyName1,$SortOrder1 = "SORT_ASC",$SortType1 = "SORT_REGULAR")
{
if(!is_array($ArrayData))
{
return $ArrayData;
}
// Get args number.
$ArgCount = func_num_args();
// Get keys to sort by and put them to SortRule array.
for($I = 1;$I < $ArgCount;$I ++)
{
$Arg = func_get_arg($I);
if(!eregi("SORT",$Arg))
{
$KeyNameList[] = $Arg;
$SortRule[] = '$'.$Arg;
}
else
{
$SortRule[] = $Arg;
}
}
// Get the values according to the keys and put them to array.
foreach($ArrayData AS $Key => $Info)
{
foreach($KeyNameList AS $KeyName)
{
${$KeyName}[$Key] = $Info[$KeyName];
}
}

// Create the eval string and eval it.
$EvalString = 'array_multisort('.join(",",$SortRule).',$ArrayData);';
eval ($EvalString);
return $ArrayData;
} [/cc]

PHP组合排列数组函数

[cc lang="php"]
private function combination($ar, $num) {
$control = range(0, $num-1);
$k = false;
$total = count($ar);
while($control[0] < $total-($num-1)) {
$t = array();
for($i=0; $i <$num; $i++) $t[] = $ar[$control[$i]];
$r[] = $t;

for($i=$num-1; $i>=0; $i--) {
$control[$i]++;
for($j=$i; $j <$num-1; $j++) $control[$j+1] = $control[$j]+1;
if($control[$i] < $total-($num-$i-1)) break;
}
}
return $r;
} private function combination($ar, $num) {
$control = range(0, $num-1);
$k = false;
$total = count($ar);
while($control[0] < $total-($num-1)) {
$t = array();
for($i=0; $i <$num; $i++) $t[] = $ar[$control[$i]];
$r[] = $t;

for($i=$num-1; $i>=0; $i--) {
$control[$i]++;
for($j=$i; $j <$num-1; $j++) $control[$j+1] = $control[$j]+1;
if($control[$i] < $total-($num-$i-1)) break;
}
}
return $r;
}[/cc]

Thursday, November 25, 2010

Vim去掉utf-8的BOM

[cc lang="text"]'去掉utf-8 BOM
:set nobomb
'保留utf-8 BOM
:set bomb[/cc]

用的Javascript函数var_dump(),implode()

[cc lang="javascript"]
// 检测是否为整数
function isInteger( str ){
var regu = /^[-]{0,1}[0-9]{1,}$/;
return regu.test(str);
}

function implode (glue, pieces) {
var i = '', retVal='', tGlue='';
if (arguments.length === 1) {
pieces = glue;
glue = '';
}
if (typeof(pieces) === 'object') {
if (pieces instanceof Array) {
return pieces.join(glue);
}
else {
for (i in pieces) {
retVal += tGlue + pieces[i];
tGlue = glue;
}
return retVal;
}
}
else {
return pieces;
}
}

function print_r(x, max, sep, l) {

l = l || 0;
max = max || 10;
sep = sep || ' ';

if (l > max) {
return "[WARNING: Too much recursion]\n";
}

var
i,
r = '',
t = typeof x,
tab = '';

if (x === null) {
r += "(null)\n";
} else if (t == 'object') {

l++;

for (i = 0; i < l; i++) {
tab += sep;
}

if (x && x.length) {
t = 'array';
}

r += '(' + t + ") :\n";

for (i in x) {
try {
r += tab + '[' + i + '] : ' + print_r(x[i], max, sep, (l + 1));
} catch(e) {
return "[ERROR: " + e + "]\n";
}
}

} else {

if (t == 'string') {
if (x == '') {
x = '(empty)';
}
}

r += '(' + t + ') ' + x + "\n";

}

return r;

};
var_dump = print_r;
[/cc]

Thursday, November 18, 2010

Javascript 组合算法

[cc lang="javascript"]
/**
* 递归排列
* 从 arr[1...n] 中任选 num(0 < num <= n) 个数的所有排列
*/
function recursion_permutate(arr, num) {
var r = [];
(function f(t, a, n) {
if (n == 0) return r.push(t);
for (var i = 0, l = a.length; i < l; i++) {
f(t.concat(a[i]), a.slice(0, i).concat(a.slice(i + 1)), n - 1);
}
})([], arr, num);
return r;
}

/**
* 递归组合
* 从 arr[1...n] 中任选 num(0 < num <= n) 个数的所有组合
*/
function recursion_combine(arr, num) {
var r = [];
(function f(t, a, n) {
if (n == 0) return r.push(t);
for (var i = 0, l = a.length; i <= l - n; i++) {
f(t.concat(a[i]), a.slice(i + 1), n - 1);
}
})([], arr, num);
return r;
}

/**
* 快速组合 - 字符串
*/
function quick_combine(n, m) {
var t = ((1 << n) - (1 << n - m)).toString(2),
r = [], s, p1, p2;

while((r.push(t), p1 = t.indexOf("10")) >= 0) {
s = t.slice(0, p1);
p2 = s.indexOf("1");

t = (p2 > 0 ? ((1 << p1) - (1 << p2)).toString(2) : s)
+ "01" + t.slice(p1 + 2);
}
return r;
}

/**
* 快速组合 - 纯位移
*/
function bit_quick_combine(n, m) {
var t = (1 << n + 1) - (1 << n - m), // 故意多留一个 1,免得补零
r = [], o, p1, p2;

while((o = t.toString(2).slice(1), r.push(o), p1 = o.indexOf("1"), p2 = o.indexOf("10")) >= 0){
t ^= ((p1 ? ((1 << p2) - (1 << p1) ^ (1 << p2 - p1) - 1) << 2 : 0) | 3) << n - p2 - 2;
}

return r;

}

/**
* 进位法
*/
function carry_combine(n, m) {
var r = [], t = [], i, p, max;

// seed
for(i = 0; i < m; i++) t.push(i);
r.push(t.concat());

while(p = m - 1, max = n - 1) {
// increase
while(t[p] < max) {
t[p]++;
r.push(t.concat());
}

// carry
while(t[--p] === --max){}
t[p]++;
for(i = p + 1; i < m; i++) t[i] = t[p] + i - p;
r.push(t.concat());

// done
if(t[0] === n - m) break;
}

return r;
}

/**
* 沙漏法
*/
function sandglass_combine(n, m) {
var p = [], r = [] , i, j;

for(i = m - 1, j = 0; i >= 0; i--, j++) {
p[j] = n - i - 1;
}

r.push(p.concat());
//5,4,3 5,4,2 5,4,1 5,4,0->5,3,2 5,3,1 5,3,0->5,2,1 5,2,0->5,1,0->5,0,0->4,3,2...

while (p[m - 1] >= m) {
if (--p[0] >= 0) {
r.push(p.concat());
}
else {
for (i = 1; i < m; i++) {
if (p[i] > i) {
p[i]--;
for (j = i - 1; j >= 0; j--) {
p[j] = p[j + 1] - 1;
}

r.push(p.concat());
break;
}
}
}
}
return r;
}

/**
* DP 组合
* @ref: http://bbs.51js.com/viewthread.php?tid=85574
* C(n, m) = C(n - 1, m) + C(n - 1, m - 1)
*/
function dp_combine(a, m) {
var t = [[]], r = [];

for (var i = 0, n = a.length; i < n; ++i) {
for (var j = 0, l = t.length; j < l; ++j) {
(t[j].length < m - 1 ? t : r).push(t[j].concat([a[i]]));
}
}
return r;
}
[/cc]

Friday, October 29, 2010

基于Nginx, lighttpd/apache上的OpenX高性能集群配置

本文英文原文地址:http://www.sherin.co.in/openxcluster121/

编者注:本文非常详细的描述了OpenX集群的配置方法,对于想通过OpenX做大规模服务的应用来说应该有比较大的帮助。原文是英文的,为了保证意思的表达就不翻译成中文了。

Wednesday, October 27, 2010

Dreamhost新办公室

Dreamhost这家著名的主机商因为业务的不断增长,最近计划搬往位于布里亚(Brea)市的新办公场所,这次他们请来大名鼎鼎的“Studio O+A”来设计办公场地,我非常喜欢这样的办公场地设计,太棒了!





Wednesday, October 13, 2010

精通php的十大要点

1. 在合适的时候使用PHP - Rasmus Lerdorf

没有谁比PHP的创建者Rasmus Lerdorf明白PHP用在什么地方是更合理的, 他于1995年发布了PHP这门语言,从那时起,PHP就像燎原之火,烧遍了整个开发阵营,改变了互联网的世界。 可是, Rasmus并不是因此而创建PHP的 PHP是为了解决web开发者的实际问题而诞生的。
和许多开源项目一样,PHP变得流行,流行的动机并不能用正常的哲学来进行解释,甚至流行得有些孤芳自赏。它完全可以作为一个案例,一个解决各种web问题的工具需求所引起的案例,因此当PHP刚出现的时候,这种工具需求全部聚焦到PHP的身上。

但是,你不能奢望PHP可以解决所有问题。Lerdorf是第一个承认PHP只是一种工具的人,并且PHP也有很多力所不能及的情况。
根据工作的不同来选择合适的工具。我跑了很多家公司,为了说服他们部署和使用PHP,但是这并不意味着PHP对所有问题都适用。它只是可以一个解决大部分问题的front-end脚步语言。

作为一个web开发者,尝试用PHP解决所有问题是不科学的,同时也会浪费你的时间。当PHP玩不转的时候,不要犹豫,试用一下其他的语言吧。

服务器端PHP多进程编程实战

最近比较PHP跟python, Erlang 的特性,发现PHP有很多人们不常用到的特性。用PHP CLI可以实现很多不错的应用。比如做爬虫, 长期运行的计算脚本, 完全可以取代其他语言来做 服务器的运维。这对于熟悉PHP的人来说如虎添翼。

为什么PHP多进程很好? 网游服务器大部分都使用多线程而不是多进程的原因也在于进程比线程更加稳定。而且多线程适合现在多核服务器的应用场景,更能发挥多核运算的能力。进程的维护可以用很多操作系统级别的工具。Message Queue解决了多大部分线程通信问题。所以PHP多进程很适合做服务器端的计算密集型的应用。

据一家越南IT公司介绍,他们成功的把PHP后台多进程用在法律文件的分发、处理银行账户的金额这样的企业级的应用上。

PHP加Shell实现多进程

看到这个标题,大家可能要说我没常识,php根本不支持多线程啊,没错,php本身是不支持多线程,但是别忘了php的好搭档,apache和linux可是支持的,呵呵,lamp才是最佳组合,还在使用win服务器的现在知道为什么要用linux吧?好久没在phpchina说教了,今天水一帖,写个简单的代码演示下如何借助shell脚本实现多线程。

先写个简单的php代码,这里为了让脚本执行时间更长,方便看效果,sleep一下,呵呵!先看下test.php的代码:

[cc lang='php' line_numbers='false']
for ($i=0;$i<10;$i++) {
echo $i;
sleep(10);
}
[/cc]
在看下shell脚本的代码,非常简单

[cc lang='bash' line_numbers='false']#!/bin/bash
for i in 1 2 3 4 5 6 7 8 9 10
do
/usr/bin/php -q /var/www/html/test.php &
done[/cc]
注意到在请求php代码的那行有一个&符号吗,这个是关键,不加的话是不能进行多线程的,&表示讲服务推送到后台执行,因此,在shell的每次的循环中不必等php的代码全部执行完在请求下一个文件,而是同时进行的,这样就实现了多线程,下面运行下shell看下效果,这里你将看到10个test.php进程再跑,再利用linux的定时器,定时请求这个shell,在处理一些需要多线程的任务,例如,批量下载时,非常好用!

Tuesday, October 12, 2010

Emacs PHP 数组缩进问题解决

[cc lang='lisp' ]
(add-hook 'php-mode-hook
(lambda ()
(c-set-style "bsd")
(setq c-indent-level 4)
(setq c-continued-statement-offset 4)
(setq c-brace-offset -4)
(setq c-argdecl-indent 0)
(setq c-label-offset -4)
(setq c-basic-offset 4)
(setq tab-width 4)
(setq indent-tabs-mode nil)
(c-set-offset 'case-label '+)
(c-set-offset 'arglist-close 'c-lineup-arglist-operators)
(c-set-offset 'arglist-intro '+)
(c-set-offset 'arglist-cont-nonempty 'c-lineup-math)))

[/cc]

新书试发布:敏捷项目开发管理实践

经过国庆长假,终于可以试发布我的新书《敏捷项目开发管理实践》了。这是一本免费书,你可以自由获取、转载。但你必须遵循“
署名-非商业性使用-禁止演绎”许可协议。本书用简洁的语言和案例帮助管理人员和开发人员选择适合自己的敏捷开发方式,当然我想这一定与其他关于敏捷开发的书有所不同。

Wednesday, October 6, 2010

互联网创业的葵花宝典

http://blog.sina.com.cn/s/blog_4b0e23c90100c1ok.html

从大公司离职出来创业,首先要“挥刀自宫”,干掉大公司这套做法,控制成本尽量少花钱,集中精力和资源解决核心的一两个问题就足够了。

不要想太多,不做太长时间的计划,尤其是计划不能太复杂!创业成功需要的是发现机会和快速突破的能力,再加一点运气。大公司的工作经验太多,有时候反而会限制自己的做法。 互联网创业,越简单越单纯,越容易成功!

1.专注:解决用户一个迫切的需求,解决的问题一句话就可以说清楚。

(1) 一个明确而且用户迫切需要的产品,很容易找到明确的用户群。这样,产品研发出来后,不容易走偏。(2) 选择的用户需求要有一定的普遍性,这点决定这个产品的未来市场前景。(3) 解决的问题少,开发速度快,也容易控制初期的研发成本和风险。(4) 解决明确问题的产品,容易给用户说清楚,推广也会相对简单。

2.极致:要在这个功能点上做到所有同类产品的极致,做到最好才能赢。

(1) 极致是互联网产品的核心,只要极致才能超出用户的口碑,形成口口相传的效应,给后期的推广带来了很大的便利。(2) 专注才能做到极致,做到极致才能击败竞争对手。

3.快:开发周期一定要控制在三到六个月的时间,一定要快。

(1) 互联网时代,用户需求变化比较快,而且竞争也比较激烈。快速的开发,容易适应整个市场的节奏,并且节约成本。(2) 用户试用过程中,如果发现问题,反应速度也要快,尽快改善尽快更新。初期,我认为要保持在一两周的更新速度。

4.口碑:初期市场营销坚持少花钱甚至不花钱,才能看出产品对用户真正的吸引力。

(1) 产品完成后,不要着急,先坚持在一个小规模的用户群中试用,听听用户反馈。(2) 大规模的推广会带来如下的两个问题:一、投入大量市场费用后,用户期望值很高,如果产品不完善,很容易引起负面的口碑,为以后的推广留下了隐患。二、大规模市场推广得到的测试效果不准确。如果产品不完善,甚至需求选择有问题,会被数字掩盖。当推广费用停止后,用户量不增长甚至下滑,再改就来不及了。过去几年成功的互联网创业公司,其实在市场营销上花的钱都非常少,但这些公司在市场营销上花的精力并不少。(3) 刚开始最重要的推广技巧是搜索引擎优化和病毒式营销。
互联网创业的葵花宝典就是“专注”、“极致”、“快”和“口碑”!

一次完美的互联网创业,最好是技术、产品高手搭配的两三人创业,三到六个月内完成产品,再用半年到一年的时间测试完善产品,达成初步成功的门槛,再寻求融资,摸索成功的商业模式,然后投入大量的市场资源推广,形成规模化业务。

初步成功的标准,不同的业务要求不同。我有一个简单的标准供大家参考,就是产品推出半年到一年时间,网站页面过一百万PV,或者客户端产品日净增安装量1万次,而且用户数还在持续增长。达成这个目标之后,需要琢磨的事情,就是在保持增长速度的同时,如何探索好的商业模式。

Thursday, September 30, 2010

让Google Chrome模拟各种手机浏览器


  • 谷歌Android:
    [cc lang='text' ]google-chrome --user-agent="Mozilla/5.0 (Linux; U; Android 2.2; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"[/cc]

  • 苹果iPhone:
    [cc lang='text' ]google-chrome --user-agent="Mozilla/5.0 (iPad; U; CPU OS 3_2_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B500 Safari/531.21.10"[/cc]

  • 诺基亚N97:
    [cc lang='text' ]google-chrome --user-agent="Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaN97-1/20.0.019; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/525 (KHTML, like Gecko) BrowserNG/7.1.18124"[/cc]

Tuesday, September 28, 2010

Python类例子

[cc lang="python"]class Message:
def __init__(self, aString):
self.text = aString
def printIt(self):
print self.text

m1 = Message("Hello world")
m2 = Message("So long, it was short but sweet")

note = [m1, m2] # put the objects in a list
for msg in note:
msg.printIt() # print each message in turn
[/cc]

详细指南

新手指导:jQuery提交表单

[cc lang="javascript"]