这本《一分钟经理人》不知是何时买的书,好像是大学里,放在我家很久,过年回家的时候又带来上海,最近闲暇的时候又回顾了一下。书很薄,32开,只有100多页。
令我惊讶的是,虽然书的内容几乎完全淡忘,但是书中阐述的道理似乎已经完全渗入我的思维之中,让我阅读的时候一直有戚戚焉。虽然我并不做管理,但是过去三年的工作,也让我意识到了工作中存在的管理问题。书中也若隐若现有一些GTD的方法以及敏捷开发的思想。让我隐隐感到一种符合我的哲学理念。
当然管理是关于人的问题,虽然书阐述了一些很简单的道理,但也并非总是适用于各种环境和背景——尤其是有中国特色的公司组织中。关键还是看人。对于书中描述那样高效的团队真是向往啊。
同时,今天正好看到这篇文章:哈佛经典:谁背上了猴子,也有类似的哲学在里面。
我应该对标题做一个更详细的解释:用C语言在SpiderMonkey中产生一个在JavaScript中可以当成函数被调用的对象,换句话说,就是一个非Function的对象,在JavaScript中可以被当成Function进行调用。例如,我有一个Hash对象,当我在var h = new Hash()之后,可以直接调用h(key),h并非一个函数对象,却可以以这种函数调用的方式来获取键key对应的值。
首先,必须要在创建这个Hash类的结构时,将JSClass中的”call”字段设置为相应的函数,如下:
static
JSBool call_hash(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
jsval *rval){
/* here the obj refers to the global object, not the callee itself */
*rval = JSVAL_NULL;
return JS_TRUE;
}
static
JSClass hash_class = {
“Hash”, JSCLASS_HAS_PRIVATE,
JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub,
finalize_hash,
0,
0,
call_hash,
0,
0,
0,
0,
0
};
现在,这里有一个很关键的问题便是如何在SpiderMonkey调用call_hash函数的时候,能够让call_hash函数知道被调用的对象(callee)是谁。然而,Mozilla的官方文档并没有对此作出任何解释。于是我在邮件列表中问了这个问题,有人给出了一个很特别的技巧——引擎调用call函数的时候,argv[-2]便是被调用者本身。
在把玩了Spidermonkey一段时间之后,我还是打算放弃spidermonkey,虽然这是一个很成熟很强大的脚本引擎,但是他的API还是有些混乱的,从本文的这个问题的解决方案就可以看得出来。
最近复习C/C++,今日用APR编写了一个生产/消费模型的小程序。结果出现了这样一个奇怪的警告:“提领类型双关的指针将破坏强重叠规则”,让我大惑不解,特此和大家讨论一下。
我用的是gcc 版本 4.2.3 (Ubuntu 4.2.3-2ubuntu7) 线程模型:posix。出现警告的这段是这样的:
apr_queue_t *queue = (apr_queue_t *) data;
int *d = NULL;
while(1){
apr_queue_pop(queue, (void **)(&d)); // -- 此处为出现警告的地方。
printf(“Consumed: %d\n”, *d);
}
虽然可以运行无误,但该警告还是让我比较无奈,最后我改成了如下:
[...]
在Rails中使用helper链接应用中的JavaScript和CSS文件的时候,会在文件的路径后面添加一个问号和一个数字,如:
<link href=”/stylesheets/application.css?1200155369″ media=”all” rel=”stylesheet” type=”text/css” />
问号后面的数字被称为asset id,目的是为了一些容易被缓存的目标如JavaScript和CSS文件,在文件被更改后不会被浏览器或代理服务器强制使用缓存,这也用于某些Ajax请求中。
但是这种asset id的行为比较怪异,他是一个查询字符串,但是没有键值对。我的一个部署方式是在一个已经架设了Wordpress的域名下,使用反向代理向用户暴露某个控制器。因为给Wordpress配置了mod_rewrite,并启用了.htaccess,将所有不存在的文件重写到wordpress的脚本处理。而这时我使用了Alias来将Rails的public目录下的javascripts和stylesheets目录绑定到相应的URL路径下,Apache却在处理这个asset id上有些问题,直接访问/javascripts/prototype.js可以得到,但/javascripts/prototype.js?11223344却会跑到WordPress中,并且说这个文件不存在。这可能和Apache处理URL的次序有关。当然,将DocumentRoot配置到Rails的Public目录,则不会出现这个问题。
无论如何,我要去掉这个asset id,根据Rails 2.0的代码,大家可以在actionpack/lib/action_view/helpers/asset_tag_helper.rb中找到生成asset id的方法rails_asset_id,如下:
# Use the RAILS_ASSET_ID environment variable or the source’s
# modification time as its cache-busting asset id.
def rails_asset_id(source)
[...]
PHP主要是设计于文本操作的,其实PHP不适合做数学运算,效率也不高,不过因为这次的项目中有个东西必须使用到二进制位移操作,在PHP上面遇到了一些麻烦。
因为PHP只有32位有符号整数,没有64位长整型,也没有无符号整数。其整型的范围是-231-1~231,超出这个范围的,将被解释为浮点数。因此,0xFFFFFFFF,直接打印,显示的是4294967295,及232:
>> 0xFFFFFFFFF
4294967295
>> gettype(0xFFFFFFFF)
‘double’
而在32位有符号整型中,0xFFFFFFFF应表示-1:
>> (int)0xFFFFFFFFF
-1
而PHP不支持浮点数的二进制位移操作,如果要进行,会先转换为整型,最后的结果,也将按照整型来返回:
>> 1 << 31
-2147483648
>> 1 << 30
1073741824
>> 1 << 32
1
>> 0xFFFFFFFF >> 1
-1
同时PHP的向右位移操作,高位会填充符号位,而且PHP没有提供类似Java的>>>来强制填充0:
>> 1 << 32
1
>> 0xFFFFFFFF >> 1
-1
>> 0xFFFFFFFF >> 2
-1
>> 0xFFFFFFFF >> 3
-1
>> 0xFFFFFFFF >> 31
-1
如何解决这个问题呢,我考虑过使用BCMath数学函数库,直接处理字符串表示的整数,或者是GMP/BigInt扩展等。不过我想既然使用字符串,那么我可以字符串地彻底一些,把数字转换成32个二进制的字符串,再手工填充0,最后转换回来。
不知道哪位有更好的方法,请告诉我。
代码如下:
直接下载代码:shift.php
(另外,其实代码可以扩展为任意位2进制的位移操作,这里我没有做)
<?php
/**
* 无符号32位右移
* @param mixed $x 要进行操作的数字,如果是字符串,必须是十进制形式
* @param string $bits 右移位数
* @return mixed 结果,如果超出整型范围将返回浮点数
*/
function shr32($x, $bits){
[...]
虽然前一段时间Ruby社区推出了很多重大的更新,如RubyGems发布了1.0,Rails发布了2.0,Ruby发布了1.9测试版。但是却潜藏了很多危险。比如在Windows平台下,升级了RubyGems之后,会导致我现有的Mongrel无法启动,原因在于RubyGems1.0修改了系统的识别,将mswin32改成了x86-mswin32,从而导致gem_plugin无法正确定位相应gem。
修复的方法也很简单,只需要先删除Mongrel再重新安装:
::先升级RubyGems到1.0
gem update –system
::卸载再重装Mongrel
gem uninstall mongrel
gem i mongrel
另外还在一些人的BLOG中发现Rails2.0刚发布时,是要求使用RubyGems0.9.5,也会出现一些问题。幸而我暂时没有迁移到Rails2.0上,也还没有遇到问题。
从这一个事件上也可以看出Ruby社区相对于Python/Perl的社区来说,还不是十分的成熟。
问题描述:
当使用memcached并将Model对象保存在其中时,若要取出这个缓存对象时,可能会找不到Model的类,并抛出“Undefined Class/Module SomeClass”的错误。
例如:
if not (genres = Cache.get(key))
genres = Genre.find(:all, :condition => “platform_id = 1″)
Cache.put(key, genres, 60*60*24) # cache for 1 day
end
解决方案
要解决这个问题,可以在引用到该对象之间,先引用其类。比如,在前面的代码前面加入要引用的类Genre:
Genre
if not (genres = Cache.get(key))
genres = Genre.find(:all, :condition => “platform_id = 1″)
Cache.put(key, genres, 60*60*24) # cache for 1 day
end
还有更好地方法是在Controller的before_filter中加载所依赖的所有Model:
before_filter :preload_models
def preload_models
Model1
Model2
[...]
今天将代码部署到服务器上之后出现了这个奇怪的错误,经过删除gems重装之后问题依旧,最后查找资料,发现可能是 require 和 class 之间的问题,最后在今天写的代码中发现了我在某个model的文件开头require了一个包。将require移入class定义内该问题解决。
原来代码如下:
require ‘faster_csv’
class Character < ActiveRecord::Base
…
end
修改后:
class Character < ActiveRecord::Base
require ‘faster_csv’
…
end
这个问题产生的原因我还不是非常清楚,难道和ruby的语法或者是内部运行机制和rails有冲突么?
这个问题在Rails的BUG列表中依然存在争议,目前还没有被彻底解决
2007-12-11更新
今天在我更新了服务器后,服务器上又出现了这个问题,但这次换了一个文件,变成了account.rb。这台服务器上装的是CentOS3,而另外一台同步更新的Windows2003服务器,则没有出现这个情况。多次修改找不出原因也不能解决问题,最后通过重启服务器解决了问题……
重新看了Rails Trac上的问题,发现情况并不是那么简单,很多条件可以造成这个错误,而问题的解决也是非常奇怪,比如有个人出现错误后,将某个设置从true改为了false,便正常了,然后他又把设置改回true,但是错误就没有了。