Jan 4 2009

《万物简史》

很棒的一本科普读物,尤其是对我这种物理专业毕业,又对自己物理知识很惭愧希望有所补偿的人来说更是如此,之前的《时间简史》让我感觉我需要更科普一些的书才能看懂,有幸我发现这本书了。简装版比较便宜,但是省略了大量的插图,而在书店浏览插图本时,我发现那些省略的图片非常非常有趣,虽然插图本很贵,而且很多书店缺货 : )

一样的问题依然存在,就是翻译质量,有人在豆瓣上提了出来,确实让人很不爽,不过在目前的现状下,如果对翻译质量抱着宁缺勿滥的原则的话,这年头就没什么科技类的译书可买了。


Dec 27 2008

需要一段声音?

这个soundsnap是一个声音的素材库,就是可以提供很多各种各样的声音供你使用,比如动物、大自然,人声、多媒体等等、目前呢,免费用户每个月可以下载5段,而且使用上没有任何限制。

想起以前为了给一个字幕配上键盘的声音,还自己在敲键盘时录制了一段,反复录了几遍才满意,这里search一下,就大把了。


Dec 25 2008

mac软件列表

每次用一个新系统,都要整理出自己的一堆favorite software,这个mac osx也不例外,下面送上:

  • 浏览器,还是喜欢firefox多一点,safari也偶尔用用。
  • 即时通讯,Adium是个好用的全协议的即时通讯客户端。
  • 办公软件方面,苹果的Keynote可是名气非常的大,我还在瞻仰中。
  • 图像处理,还没有哪个软件能超越Photoshop。
  • 音频方面,我唯一的一个需求就是希望能打开我长期收集的GuitarPro文件,令人惊喜的是,GuitarPro有Mac版本,非常好用。
  • 多媒体播放,两个跨平台的软件Mplayer和vlc也在mac上相当好用,播放DVD的话,系统自带的iDVD就很好用了。
  • 虚拟机,不愿意用Bootcamp的话,VirtualBox还不错。
  • 工具方面,QuikSilver不可错过,用于程序或文档的快速启动。也许Windows下的utorrent给我太好的印象了,尽管Mac下的utorrent还比较简陋,我还是在用。Paragon可以让你在Mac下读写NTFS分区,让Mac和Windows共享数据文件不再有问题。The Unarchiver可以补充Mac系统很多不支持的压缩文件格式。

还有什么,想到了再加


Dec 22 2008

Hold Me, Use Me, Free Me

在被ObjectiveC的retain、release折磨了一阵子之后,这篇文章终于解释了我的疑问,很精确的名字,用来概括半自动内存回收。
http://www.stepwise.com/Articles/Technical/HoldMe.html

记住这几点:

  • 匹配原则:alloc或者copy得到的对象已经有计数器为1了,retain会使得计数器加1,这三种使用都要匹配对应的release或者autorelease。
  • 何时retain:得到一个返回的对象后,如果你想长期使用它,需要做retain。
  • 何时autorelease:当需要返回对象给上层,而自己又不想使用这个对象时,需要做autorelease,这样才能让调用者有机会去做retain,当然autorelease的开销比较大。
  • retain循环:仔细设计对象的owner关系,避免retain循环。
  • 特殊情况:在需要 release和retain的情况下(比如改变一个对象的owner),可能需要先额外做一个retain,否则可能release会造成对象失效,当然也要补一个release。

Dec 11 2008

2D物理引擎

2D物理引擎,我在前面一个帖子已经给出了一个Javascript的实现了,下面是c/c++的两个通用实现(作为库来使用):

  • box2d: 比较早,功能很全。
  • chipmunk: 衍生自box2d,c语言实现,在xmoto(我喜欢的一个摩托游戏)的新版本中就用了这个。

这里有一篇比较二者的文章,据说是box2d功能丰富一些,chipmunk性能高一些,我只有过chipmunk,遗憾不能发表自己的比较意见。

chipmunk中的基本概念

Space:这是Chipmunk中对“空间”的表述,在这个space中所有的刚体(下面介绍)发生相互作用,Space有两个重要的属性,一个是重力(gravity),一个是阻尼(damping),重力显然是有方向的,所以重力是用一个矢量来表达的,当然也可以为0,那就类似于太空了,阻尼显示是没有方向的,用一个浮点数表达就好。

刚体(rigid body):这是这类物理引擎最核心的概念了,他们和粒子(Particle)的区别是,除了质量、位置、速度外,刚体还是可以旋转的。刚体们都活跃在chipmunk的space中。很重要的是:它们本身并没有形状(shape),形状是通过一个Collision shape(简称shape)的概念加到刚体上去的。刚体具有几个非常重要的属性,比如m(质量),i(转动惯量),p(位置),v(速度)以及和转动相关的一些属性等。

Shape是表达一个刚体的形状的概念,它附加在刚体上,从而才能让刚体间发生碰撞,Chipmunk只支持三种形状:圆、线、多边形。所以像是弧这样的形状只能通过多线来拟合了。注意Chipmunk中的shape和一般意义的Spirit独立的,Spirit(精灵)表达的是一个物体是如何显示的,尽管大部分情况下Spirit和Collision shape都是一致的(这样看起来才合理),但在内部实现上,Spirit和Collision shape是完全不相干的。

Chipmunk的基本使用:

待续


Nov 25 2008

PHP性能测试

这是我的php代码的性能测试方法,记录之。

第一步是在客户端(浏览器一端)测试整个HTTP请求过程的耗时,使用我前面提过的瑞士军刀charles,这可以测出一个HTTP页面请求的几个关键数据 Latency + Data Transfer time,Data Transfer Time很好理解,取决于服务器端响应数据的大小,比如如果使用了过复杂的HTML,或者很多CSS/Javascript都会导致传输时间变长。

而Latency可以分为三部分,一部分是网络时延,一部分是Web Server响应的时延,最后一部分就是服务器端的代码执行时间了,这三部分的和构成了客户端感觉到的Latency。

第二步自然就是优化了,所有优化的前提都是找瓶颈,上面的三个部分中代码执行时间相对比较容易控制,可以在PHP代码中加时标来精确测量,直到发现引发性能瓶颈的代码,比如可能是数据库的相关操作,或是一些不恰当的循环等,可以针对对应的代码相应的做改善,当然如果是数据库的话,可能需要调整数据库,比如加索引等。

如果瓶颈是Web Server的响应时延,我就没有多少经验了,还没有做过,希望能有机会可以做这方面的优化,比如做服务器的负载均衡什么的,感觉应该蛮酷。


Nov 22 2008

Netbeans 6与Tomcat

Netbeans 6.1下已经带有一个Tomcat了,因此用起来很方便,记录几点注意事项:

1. Configuration files下的context.xml中在Context后加上reloadable="true" 就可以让servlet自动重新加载了。

2. 在配置Tomcat server时的那个密码,应该在第一次做开发前就配好(否则如果不改的话,是一个随机生成的密码),因为这个密码会被存到用户的tomcat配置中,以后如果改这个密码,因为已经有了tomcat的用户配置,Netbeans就不会将新的密码生效,反而会导致Netbeans使用错误的密码去连接Tomcat。


Nov 21 2008

PHP的strtotime

PHP易用是大家的共识,体现在了很多方面,尤其是其丰富而好用的内置函数库,最近一次见识是因为strtotime函数。

为了获取一个三个月前的时间的字符串表达式,在其他语言中可能要耗费点代码,而在php中,使用这样一个表达式就可以了:date('Y-m-d', strtotime("-3 month")) ,date是为了将时间格式化,'Y-m-d'就是可以得到诸如2008-11-19这样的表达式了,而strtotime就是用来得到一个三个月前这样的时间了。

PHP的strtotime遵循GNU Data input format,看了文档才发现这个非常强大,可以支持时区、相对时间、绝对时间、星期、秒计时等多种方法来表达一个时间。

很遗憾,在Python中我没有找到能和strtotime一样好用的库函数。


Nov 18 2008

xajax

不用我解释了,xajax官网上的一句话很好的解释了xajax:“the gift of ajax to your php apps with xajax”。 我用下来,此言不虚,是我目前用过的最简单的ajax库了,网站上给出了单独使用的教程,但要和codeigniter集成的话,还需要点别的东西,分享一下我的使用过程(我用的版本是codeigniter 0.4.2/xajax 0.5)。

1. 下载xajax 的完整包,解开后可以得到两个最重要的目录xajax_core和xajax_js,分别是php代码和javascript代码,将这两个目录安家到web应用的system/application/libraries下(也可以放在其他目录,这只是我的习惯),下面要用到。

2.  在controller的代码中需要用到xajax的地方,加入下面两行,就可以加载xajax了:

include_once (APPPATH."libraries/xajax_core/xajax.inc.php");
$this->xajax = new xajax();

3. 在准备加载View前,需要注册ajax函数和准备一些js代码送给view:

$this->xajax->registerFunction(array('validate_can_create', &$this, 'xajax_validate_can_create'));
$this->xajax->processRequest();
$data['xajax_js'] = $this->xajax->getJavascript($this->config->item('base_url')."system/application/libraries");

这里的data['xajax_js']就是送给view的,这样我们在view里面就不用写一行Javascript代码了。

3. 实现你需要的ajax函数的功能,比如下面的:

function xajax_validate_can_create($value, $id)
{
$objResponse = new xajaxResponse();
if ($id === "name")
{
$this->db->where('name',$value);
$query = $this->db->get('candidate');
if ($query->num_rows() > 0)
{
$objResponse->assign("ajaxMsg","innerHTML", "同名啦!");
}
else
{
$objResponse->clear("ajaxMsg","innerHTML");
}
}
return $objResponse;
}

4.  在View的<head>部分,加入<?php if(isset($xajax_js)) echo $xajax_js; ?> 就可以引入xajax所需要的javascript代码了。

5. 在适当的地方调用ajax函数即可,比如在某些input控件上做校验可以加上onblur="xajax_validate(this.value, this.id);"这样的属性。

哦,就这么多了,真的很简单清晰。。。


Nov 10 2008

PHP Magic Quote

这个是php中的一个很有意思的设置,也许是为了安全性的考虑,又或是方便与数据库的互操作,php在Get/Post/Cookie(简称GPC)值的读入时缺省会自动加入特殊符号(比如引号和反斜杠)的转义,这就使得一些不需要这些转义的场合会得到一些错误或不合适的字符串,通常我们只能用stripslashes来反转义了。

这个“智能”的转义是可在php.ini中配置是否使能的,不能运行时修改,所以代码在做stripslashes时还要先读取一下这个设置,一般用get_magic_quotes_gpc就可以了。可以参考php官方的文档,它还给出了一个递归的函数用来转换一个数组。同样可以看到,在以后php的版本中(6.0),这个选项会被废弃掉,毕竟这么“强制”的转换不太符合程序员的习惯,而且也造成效率低下。

PHP很易用,不过要用好,象magic_quote这样的概念必须要理解,有一篇PHP best practices可以参考一下,写的不错,总觉得PHP界少了一些象<<Effective C++>>这样的书。