<?xml version="1.0" encoding="UTF-8"?><!-- generator="WordPress/2.7.1" -->
<rss version="0.92">
<channel>
	<title>N.S thoughts</title>
	<link>http://nightsailer.com</link>
	<description>...silent is golden...</description>
	<lastBuildDate>Tue, 09 Mar 2010 15:40:17 +0000</lastBuildDate>
	<docs>http://backend.userland.com/rss092</docs>
	<language>en</language>
	
	<item>
		<title>令我发狂IE cookie的问题</title>
		<description>这个问题基本上可以令人发狂。在 6.0 sp3 091208-2036以后的版本（其他版本也可能有问题）。
如果使用php的set_cookie 如果设置的过期时间比较短，比如180秒后过期，那么cookie将无法创建。
而之前的IE版本以及如Firefox,Chrome,Safari等均没有这个现象。

发现这个原因，是我折腾了一晚上，并且特意弄了台windows，用QQ远程在一个网友的机器上反复折腾，
当临近崩溃的最后一秒发现的。

血泪的教训。 cookie的过期时间最好在1个小时以上，通过将过期时间写入值存入cookie，然后判断，不要依赖浏览器，尤其是
狗屎的IE6. 


听说国外有人给IE6举办了葬礼，什么时候国内能有呢，那对于web开发真是个福音。不过，IE7/8对于网银的支持实在
是糟糕透顶，对于我这种mac用户，IE乃至windows的唯一用途就是上网银。。。所以，我的虚拟机用的还是IE6.。。
天大的讽刺！

还好，招商银行支持iphone，方便多了。 </description>
		<link>http://nightsailer.com/2010/03/09/685.html</link>
			</item>
	<item>
		<title>PHP:call_user_func_array 导致的诡异事件</title>
		<description>最近，在升级原创榜时，发现了Doggy中Dt模版的一个诡异现象。当访问某些页面时，不定期出现Gateway timeout.
PHP没有报任何错误，也没有任何错误日志或者信息输出。我一度认为是模版的Tag有问题，因为当尝试
删除某些Tag后会解决这个问题。好景不长，更多的页面也冒出此类错误，然而当我把模版内部解析缓存关闭后，则不会出现此类错误。 于是转头跟踪Dt模版的内部调用。Dt模版的设计中，当模版第一次被解析后，将模版转换成Doggy_Dt_NodeList对象，并将它缓存到内部cache中。当模版下次被调用时，如果模版没有变动，则直接调用NodeList的render方法，这样可以减少模版解析的时间。然后，当从缓存中被反序列的Doggy_Dt_NodeList，却无法正确执行filter。看下面的一段代码：

if (isset(Doggy_Dt::$filters[$name])) {
                 
                foreach ($args as $i => $argument) {
       ...</description>
		<link>http://nightsailer.com/2010/03/04/681.html</link>
			</item>
	<item>
		<title>MongoDB practice:基于MongoDB的好友消息动态的实现思路（How to build activity-streaming with MongoDb）</title>
		<description>好友动态是SNS最常见的功能。在设计“视觉中国原创榜”的好友动态时，也遇到如何实现的问题。和普通的SNS不同，
视觉中国原创榜用户不仅仅关注好友的动态，而且也要关注自己的作品和自己曾经关注过的作品的动态。
这样，就需要给用户分别push 3种不同的动态： 我的作品的动态，我关注过的作品（包括收藏过，评论过，评分过）的动态，
以及我关注的人（followed）的动态，未来还有好友的动态。这些动态，用户都应该可以取消关注。如何实现？
使用传统的数据库会面临很多问题，比如如何sharding。 幸运的是，我们用的MongoDB，这给我们解决问题带来了极大的方便。

首先，对每个用户，分别设计以下 collection

//by nightsailer.com
activity_streaming.feed, 属性分别为：
$schema = array(
  _id,  用户id
  followed_art => array(), 用户关注的作品id列表
  followed_people=>array(), 用户关注的人id列表
  my_art => array() 用户的作品id 列表
)
//by nightsailer.com
activity_stream.user:
   _id
   type=> 动态steam的类型（我关注的作品，我的作品，我关注的人）
   stream_target =>  对应动态stream的对象（作品id，人id）
   stream => array()  FIFO数组，存放activity的DBRef
   ...</description>
		<link>http://nightsailer.com/2010/02/21/675.html</link>
			</item>
	<item>
		<title>MongoDB practice: My Perl GridFS Wrapper</title>
		<description>简单写了一个Perl版本的GriFS的wrapper：

package CZone::GridFS;
use strict;
use MongoDB::GridFS;
use Path::Class;
use Digest::file qw(digest_file_hex);
use Digest::MD5 qw(md5_hex);
use IO::File;
use Data::Dumper;
use Any::Moose;

has database => (   
    isa => 'MongoDB::Database',
    is  => 'ro', 
    required => 1
    );

has _gridfs => (   
   ...</description>
		<link>http://nightsailer.com/2010/02/18/671.html</link>
			</item>
	<item>
		<title>I&#8217;m back.</title>
		<description>域名转移完毕. 现在是新域名 nightsailer.com了.

wordpress中需要更新settings中的WordPress address (URL)和Blog URL.
然后使用301将night9.cn 重新定向到 nightsailer.com.
 </description>
		<link>http://nightsailer.com/2010/01/30/659.html</link>
			</item>
	<item>
		<title>重新启用nightsailer.com,转移中</title>
		<description>一直比较纠结要不要转移到godaddy中, 今天看到张宴的godaddy域名转移过程, 痛下决心
重新启用我原来的域名 nightsailer.com

这是我99年-2000年左右使用的个人域名,万网注册的,
当时用的mt3架的blog. 后来工作忙,不知道过期(可见万网的服务),当时连要自己设置ns记录都要收费!
索性就放弃了.

早上找了$7.49 的优惠码,注册2年,用支付宝付款,全部下来105.04RMB, 比起国内,真的很便宜了.

手里的几个cn域名马上也过期了,再也不续费了, .com的域名也准备转移走.



 </description>
		<link>http://nightsailer.com/2010/01/30/653.html</link>
			</item>
	<item>
		<title>Notes: CentOS5.4编译Perl IO::Tty的处理</title>
		<description>直接编译IO::Tty,会导致:

Can't load '/root/.cpan/build/IO-Tty-1.08-PWZkbn/blib/arch/auto/IO/Tty/Tty.so' for module IO::Tty:
 undefined symbol: strlcpy at .....


快速修正, 打开Makefile
DEFINE = -DHAVE_DEV_PTMX -DHAVE_GETPT -DHAVE_GRANTPT -DHAVE_OPENPTY -DHAVE_POSIX_OPENPT -DHAVE_PTSNAME -DHAVE_PTSNAME_R -DHAVE_PTY_H -DHAV
E_SIGACTION -DHAVE_STRLCPY -DHAVE_SYS_STROPTS_H -DHAVE_TERMIOS_H -DHAVE_TERMIO_H -DHAVE_TTYNAME -DHAVE_UNLOCKPT -DHAVE__GETPTY

去掉 中间的-DHAVE_STRLCPY和最后的-DHAVE__GETPTY

重新编译, make test.

ok! </description>
		<link>http://nightsailer.com/2010/01/29/649.html</link>
			</item>
	<item>
		<title>PHP编写命令行脚本和后台运行程序的注意事项</title>
		<description>在一些场合(如开发,测试), 可能需要使用PHP编写一些命令行的处理脚本,或者是长时间
后台运行的任务, 需要注意以下准则:

准则1. 尽量避免使用PHP编写后台运行程序, 尤其是类似while(true){....} 这种循环的处理脚本.

比如,有时候我们需要定期检查数据库,然后有数据进行处理,没有数据等待.
我强烈建议不要使用PHP编写这样的类似service的脚本. php的gc并不稳定, 当运行到一定时候,
会异常退出. 另外, PHP也不擅长做命令行脚本. 看看Phing, 号称PHP port的Ant, 但是性能
糟糕的一塌糊涂, 远不如使用几个unix工具+shell来的快捷. (更别提windows,那基本是不可用).

使用Perl,Python来完成相应的任务吧, 那会让你很愉快, 或者,Ruby也不错.

准则2 编译特殊版本的php
如果一定要沉迷于PHP解决, 那么首先, 重新编译PHP,去掉所有不实用的模块. 增加PHP的稳定性.

准则3 不要直接使用fork 或者 nohup
不要在PHP中直接使用fork来进入后台运行, 也不要直接使用nohup来运行直接运行php 循环脚本.

准则4 使用 shell guard 来完成PHP的后台循环运行
php的脚本只需要处理一次数据后马上退出,不要使用任何while(true) 这样的脚本来挂起等待.
相反的, 可以使用以下的shell gurad 来完成上述工作:
night9.cn# cat guard.sh
DIR=`pwd`
while true; do
    echo "start php script .."
    ...</description>
		<link>http://nightsailer.com/2010/01/29/641.html</link>
			</item>
	<item>
		<title>Mouse,Moose和MooseX::Declare</title>
		<description>如果你是一个Perl的开发者, 现在还不知道Moose那么你对Perl的了解基本上还停留在10年前了.
虽然国内Perl的开发者寥寥无几, 但Perl的强大远远超越一般人的想象空间.

我使用Perl是让自己更愉快,因为很多事情变得很简单.

Perl的OO一般人很难理解, 但是却用了最简单和巧妙的方式实现了,想想, 一个bless搞定, 再看看
PHP之类的,多么臃肿.

有了Moose,你会发现, 不仅仅OO,AOP这些东西实现起来是多么的轻松.
当看到MooseX::Declare, 你更会惊叹, "这还是Perl么?".

use MooseX::Declare;

class BankAccount {
    has 'balance' => ( isa => 'Num', is => 'rw', default => 0 );

    method deposit (Num $amount) {
        $self->balance( $self->balance + $amount );
  ...</description>
		<link>http://nightsailer.com/2010/01/28/637.html</link>
			</item>
	<item>
		<title>几个很有用的TextMate bundle</title>
		<description>TextMate的这几个bundle对我来说非常有用:

1. CTags
和vim中的类似,可以ctrl+] 可以快速列出和跳转到symbol所在的文件位置. 有点遗憾的是不能想vim那样返回.
适合多数的编程语言.

2. Devel::IntelliPerl
Perl的自动解析和语法提示,能够根据指定变量的上下文给出语法提示,主要是列出可以调用的方法. 很cool.
除了TextMate,还支持vim. 由于使用Moose进行反射分析,可以显示出继承的方法. 比单纯的正则分析
要准确的多.

3. Act
可以使用正则表达式快速搜索项目中的文件. 使用Perl编写, 是一个快速和强大的grep 替代品.
TextMate中的search in project可以休息了. 如果你用TextMate,就知道在大的项目中使用search in project是
一种煎熬. 我很多次不长记性的调用,看着高起的CPU和风扇声,被迫kill掉textmate. 使用Act可以省去find+grep
的诸多不便. 而且, 由于是Perl编写,你可以使用完整的PCRE, 而不是GNU的精简版, 甚至你可以只搜索某种
编程语言的.很不错的.

其他如project plus,git bundle这些都是标配了.

 </description>
		<link>http://nightsailer.com/2010/01/26/631.html</link>
			</item>
</channel>
</rss>
