登录 |

循环几次?

2010年07月27日 下午 04:11 | 作者:hemon

  1. $array = array(1,2,3);
  2. foreach($array as $key => $value){
  3. $array[] = 1;
  4. }
  1. // JavaScript
  2. var array = [1,2,3];
  3. for(key in array){
  4. array.push(1);
  5. }

答案是3!PS: IE那个变态除外,IE会陷入无限循环!

无论在php,还是js中,使用foreach/forin在遍历一个(对象/数组)时,都是即时创建一个(对象/数组)的拷贝
所以:循环中对原遍历(对象/数组)的改变,不会影响循环次数

以任意x/y概率执行某段代码

2010年07月26日 下午 27:14 | 作者:hemon

100%

if( true )

1/2

if( rand(0,1) === 0 )

1/3

if( rand(0,2) === 0 )

1/4

if( rand(0,3) === 0 )

1/x

if( rand(0,x) === 0 )

x%

if( rand(0,99) < x )

x‰

if( rand(0,999) < x )

x‱

if( rand(0,9999) < x )

  1. /**
  2. * 以$x/$y的概率返回true
  3. *
  4. * @param int $x
  5. * @param int $y
  6. * @return bool
  7. *
  8. * prob(1,2) = 1/2
  9. * prob(1,100) = 1/100
  10. *
  11. */
  12. function prob($x, $y){
  13. return ( mt_rand(0, $y-1) < $x );
  14. }

《把时间当作朋友》

2010年07月22日 下午 32:24 | 作者:hemon

好书一本,作者提供免费电子版:

http://www.lixiaolai.com/index.php/archives/9456.html

使用php-fastcgi,进程数设置多少合适呢?

2010年07月21日 下午 08:44 | 作者:hemon

1.能够启动的进程数,完全取决于内存大小
2.但是启动的进程到底有多少被执行,取决于cpu
如果php程序非常耗cpu,可能50个cgi进程就导致cpu占用100%,即使你打开再多的fastcgi进程,只是白费内存,而不会提高性能。

方法:

1.设置一个绝对大的进程数(内存要吃的消,一般一个php-cgi进程占4Mb),比如1024
2.运行压力测试,达到load>10,cpu占用100%,观察有多少进程正在运行(空闲的占用 0%,运行的就是>0%)。ps aux | grep ‘php-fpm’
3.ok,在那个正在运行的数量上,再加一定的空闲进程(比如30%)

答谭问

2010年07月21日 下午 21:39 | 作者:hemon

  1. 一个页面处理慢,怎么解决?
    基准测试1:测试一个空脚本 <?php phpinfo();  得到一个基准qps,看是不是服务器本身有问题
    XDEBUG,看看到底是哪里响应慢。
    ps:基准测试2,新建一个php脚本,require基本的系统文件,ab一下,得到一个基准qps。
  2. 接上一个问题,请从系统的角度,全方位的考虑这个问题?
    客户端:1.firebug,httpwatch得到一个准确的各个处理环节需要的时间(DNS,建立TCP,接收总耗时,渲染页面耗时),2.在客户端使用js发起向服务器的一个空页面,发起连接,看客户端真实延时多少
    ps:服务端:网络延时/磁盘读写/内部DNS/缓存失效
  3. 一般会用php的什么扩展?
    opcode的缓存扩展(ea,apc,xcahe),调试(xdebug)
    ps:curl,mysql,pdo,ssh,……
  4. 缓存扩展遇到过什么问题没有?
    ea会导致core dump
  5. 有没有跟踪一下core dump原因?
    没,我知道ea有这个问题,我直接用xcache,避免这个问题。
  6. 有没有用过缓存扩展提供的共享缓存?
    用过xcache,apc
  7. 之间有什么区别?
    apc支持批量获取键get($array),xcache只支持一次请求单个键get($key)
  8. 共享缓存的优点,缺点?//ps:我拿这个与memcache比较
    优点:无需建立tcp连接,无需启动服务
    缺点:单机缓存,无法共享
  9. 假设一个memcache集群,其中一台挂了,缓存会不会失效?
    物理上将,数据还是存在其他几台机器上的,但是由于memcache去中心化的取模算法,会导致客户端无法得到缓存所在的服务器,相当于失效;有一个改进的环形算法,可以让这个挂了机器,不影响其他正常机器的缓存。
    http://blog.csdn.net/sparkliang/archive/2010/02/02/5279393.aspx
  10. 用什么web服务器,遇到什么问题没有?
    nginx,没有。
  11. nginx一般配合fast-cgi运行,有什么问题,经验?
    我使用php-fpm管理fast-cgi进程,fastcgi进程数的大小设置多少合适呢?
    1.能够启动的进程数,完全取决于内存大小
    2.但是启动的进程到底有多少被执行,取决于cpu
    如果php程序非常耗cpu,可能50个cgi进程就导致cpu占用100%,即使你打开再多的fastcgi进程,只是白费内存,而不会提高性能。
  12. mysql喜欢用什么版本?
    我喜欢用最新版本,因为最新版本的innodb引擎性能更高。
    ps:如果用MyISAM,更低版本的性能更高,因为功能少,系统负担低……
  13. 在一张表的a,b字段上建一个复合索引,现在条件查询where b=1,会不会使用到索引?
    不会。建立a+b的复合索引,可以理解为把a+b合并成一个字段再建立索引,索引都是从头建立的,现在用字段中的b查询,相当于like “%b”

江西电信,如狗天翼!

2010年07月5日 下午 21:17 | 作者:hemon

江西电信资费陷阱,本人挨过刀的:

  1. 17909(漫游拨打当地电话是0.60元/分钟
    谎言:加拨“17909”,省内漫游拨打(不含港澳台)所有费用0.29元/分钟;
    他妈:在漫游时则只能拨打漫游地以外的国内长途,否则提示空号!比如我南昌号,漫游到宜春,加拨17909打宜春的号码,提示空号,只能直接拨打漫游地号码,按标准资费(0.60元/分钟)收取
  2. 3G标准资费(按时长计费0.10元/分钟
    谎言:有两个标准资费:时长(0.10元/分钟),流量(0.0005元/kb)计费;
    他妈:如果你未办理任何套餐,或者已办理套餐但尚未生效(套餐都他妈下月一日生效,业务是24小时后生效
    ),都按时长计费(0.10元/分钟),只要手机连上网就开始计费,不管你有没有流量。老子挂QQ,113分钟,产生657kb流量,花了11.3元。
  3. 变更套餐(只能在同品牌内向上升级
    比如我这个月办了46的商旅套餐,用的不爽,想换是吧?你只能选择在“商旅套餐”内的66,96,……向上,火箭升级。
  4. 11808(IP话费+市话费
    IP话费:6分钟内按照IP标准资费收取(0.30元/分钟),通话时长在45 分钟以内(1.99元),超出45分钟部分按照IP标准资费加收(0.30元/分钟);
    市话费:0.10元/分钟。
    6分钟以内,就是0.40元/分钟;就算你打满45分钟,折合人民币6.49元(4.5+1.99),享受最低资费:0.144元/分钟,真的狠便宜!
  5. CDMA信号(
    经常他妈的断,家住25楼都要找信号,10分钟内必断;移动GSM信号很强,从来不断。
  6. 宽带绑定固话,外地身份证(交500元押金
    请妥善留存押金收据,一旦遗失,押金就没了!相当于你存了500元钱,非但没有利息,存折丢了,不挂失不补办!
  7. 协议期有多长(固话+手机e6-b套餐,捆绑18个月
    买东西还能7天无条件退换货,你上了电信的贼船,还能逃掉吗?宽带还能过户,手机就不知道行不行了……
    可怜买了台CDMA的手机,CDMA网独此一家,网都没处转……

能不办电话就不办吧,他妈老老实实做个原始人,远离辐射困扰,珍爱生命,拒绝电信。

电信运营商都他妈黑心肝,啥时候开放民营,让国企见鬼去吧!

剪切为什么比复制快?

2010年07月3日 下午 59:42 | 作者:hemon

在同一磁盘分区,剪切只是修改文件系统  目录结构 中存储的文件路径;复制是真正的read&write读取并写入数据。

文件系统实现:http://www.zjtcm.net/wljx/Computer/OS/2009/12.ppt

ActiveSync用蓝牙接口PC与WM6同步

2010年06月30日 上午 39:27 | 作者:hemon

一般步骤:http://blog.csdn.net/yefanqiu/archive/2008/05/04/2382876.aspx

注意事项:http://www.diypda.com/viewthread.php?tid=21863

要点:

  1. 删除手机和电脑的配对关系;
  2. 由手机发起ActiveSync请求:附件-同步
    1. 手机和电脑必须使用USB同步过,否则手机同步软件只有帮助提示
    2. 菜单-通过蓝牙进行连接(提示没有合作关系,进入蓝牙设备)
      1. 添加新设备(找到你的电脑)
      2. 配对
      3. 选择服务(串口服务/activesync)
      4. 不要在蓝牙设备界面使用“连接”,会报错:“连接失败或密码不正确”
  3. 返回同步程序,执行:菜单-通过蓝牙进行连接

腾讯php程序员面试题目——设计任务(答)

2010年06月7日 下午 53:00 | 作者:hemon

设计任务:
1、最近总有人骚扰我们的投票模块,需要你来设计一个投票限制的东东
要求如下:
1)要求每个QQ号码(假设此QQ号码在UNIT32 内可以表示)10分钟这内只能投5票。
2)我们的用户很踊跃,平均每天要有2000万人左右通过此程序投票。
说明:
1)无需写代码,只需要图跟文字即可。
2)对于关键逻辑,请用图加代码表示出来,这也是对你文字表达能力的一个考验。
3)对你能想到的所有的边界条件列出来,这是对你逻辑思维全面与敏捷性的考验。
4)存储部分,尽你所能吧。如果,你需要一个自己设计的存储层,那么把这个存储层的实现,用文字+图片方式描述清楚,要是设计合理,你会获得华丽的奖分。

——————————————————————————————————
核心问题:如何统计10分钟之内投了5票?

首先:以分钟为键切分数据集,
然后:每个数据集内,以qq号码为键,vote次数为值
OK,已经成功转换为key-value方式存储,2000万的日投票,除以86400秒,并发231.48rps,使用memcache能够轻松胜任。

数据集ID:201006072134
【QQ号码:Vote次数】

201006072134 | 201006072135 | 201006072136
【12345:3】  | 【12345:3】  | 【12345:3】
【88888:2】  | 【88888:3】  | 【88888:3】

数据模型:
$data[ 201006072134时间分钟 ][ qq号码 ] = vote次数;

A.统计10分钟内投了多少票
$votes = 0;
for($i = 0; $i < 10; $i++ ){
$votes += $data[ $minute-$i ][ $qq ];
}

B.桶内投票数+1
$data[ $minute ][ $qq ]++;

C.过期统计数据,垃圾清理
unset($data[ $minute ]);

腾讯php程序员面试题目——编程任务(答)

2010年06月7日 下午 08:56 | 作者:hemon

编程任务:
1、 我们碰到了大麻烦,一个新来的传教士惹恼了上帝,上帝很愤怒,要求我们把圣经(bbe.txt)背熟,直至他说哪个单词,我们就要飞快的回答出这个单词在 第几行第几个单词位置。听说你是个优秀的程序员,那么髟助我们完成这个不可能的任务吧。
要求如下:
1)/myworks /example/bbe.txt,98版本英文圣经一本
2)输入部分要求如下:php ./example.php [单词]
3)输出部分如下:[单词] 1,2 2,4 5,6 表示:此单词在1行2列(第二个单词),2行4列…
说明:
1)此文本 4MB之巨…
2)单词的含义:由英文字母(大小写),数字(0-9)组成的串
3)提供给你的机器OS为ubuntu 9.10,内存只有1G,而且,很不幸的,其中700M用来做了别的
4)上机考试不允许上网,但我装了man文档以及读取CHM以及PDF的 阅读器,在电脑的桌面的CHM文件夹中,有相应的PHP参考手册
5)算法复杂度要求不能大于O(N^2)(就是N的平方)
6)什 么?PHP低效且用起来不顺手,好的,你可以用别的语言来实现。但注意:提供给你的机器上只有python 2.4/perl 5.8/gcc[g++]

题目链接:http://www.xhttp.cn/2010/05/2

——————————————————————————————————————————————
1、使用ascii码,判断字符所在范围
2、只要扫描一遍字符即可,复杂度为O(N)
3、利用了php string{$i} 的特性,取字符串内任一字符
4、todo:改为fgetc版本,可以完全不需要使用以上php特性
5、字符串匹配算法:http://wendell07.blog.hexun.com/14112681_d.html,目前看来最快的方法:Sunday,由于本题是单词匹配,问题更简单,只要找到头尾……

  1. <?php
  2.  
  3. $word = $argv[1];
  4. $lines = 0;
  5.  
  6. $handle = @fopen("bbe.txt", "r");
  7. if ($handle) {
  8.     while (!feof($handle)) {
  9.         $line = fgets($handle, 4096);
  10.         $local = local_word($line, $word);
  11.         $lines++;
  12.         if( !empty($local) ){
  13.             echo "$lines,".implode(' ',$local)."\n";
  14.         }
  15.     }
  16.     fclose($handle);
  17. }
  18.  
  19. function local_word($line, $word){
  20.     $local = array();
  21.     $local_length = 1;
  22.     $word_length = strlen($word);
  23.    
  24.     for($i = 0; ( $char = $line{$i} ) !== ''; $i++ ){
  25.         // 单词最后一个字符必定不是符号,且必有一个符号结尾,此计为一个新词
  26.         if( !is_symbel( $line{ $i-1 } ) && is_symbel($char) ){
  27.             $local_length++;
  28.         }   
  29.        
  30.         if( $char === $word[0] && // 如果第一个字符相同
  31.             is_symbel( $line{ $i-1 } ) && // 且为单词开始
  32.             is_symbel( $line{ $i+$word_length }) // 单词结尾应该为符号
  33.         ){
  34.             // 进入验证单词模式,一个一个字符比对
  35.             for($j = 1; ($w_char = $word{$j}) !== ''; $j++ ){
  36.                 // 遇到单词字符不匹配
  37.                 if( $w_char != $line{ $i+$j } ){
  38.                     $i += $j;
  39.                     break;
  40.                 }
  41.                 // 如果单词比对完全正确
  42.                 if( $j == ($word_length-1) ){
  43.                     //echo "$line_length, $word_length\n";
  44.                     $local[] = $local_length;
  45.                 }
  46.             }
  47.         }
  48.     }
  49.     return $local;
  50. }
  51.  
  52. function is_symbel($char){
  53.     $asc = ord($char);
  54.     return !( (48 <= $asc && $asc <= 57) ||
  55.               (65 <= $asc && $asc <= 90) ||
  56.               (97 <= $asc && $asc <= 122) );
  57. }

附件:bbe.txt《圣经》
http://www.hemono.com/wp-content/uploads/2010/06/bbe.rar