OS X下获取当前Python的site-packages目录
13:29 , Qizhi
Mac OS 10.5下我安装了多个版本的Python,目录结构有些乱,安装一些库的时候如何确定site-packages目录呢?
from distutils.sysconfig import get_python_lib
print get_python_lib()
或者直接在终端中运行:
记录一下,自己编译/运行一些OpenSource的大型工程时,其脚本系统往往是Python或Lua写就,有很多库要安装,这段代码就很实用了.
from distutils.sysconfig import get_python_lib
print get_python_lib()
或者直接在终端中运行:
python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
记录一下,自己编译/运行一些OpenSource的大型工程时,其脚本系统往往是Python或Lua写就,有很多库要安装,这段代码就很实用了.
Jan
24
2010
Allegro库在OS X下的安装
15:48 , Qizhi
Allegro是著名的C开源游戏开发库,最初由Shawn Hargreaves设计,很多社区开发者后来为其添加了各种扩张.虽然有些功能在当前技术条件下已经过时,但是阅读Allegro的源代码仍然给我很多的提示.
MAC OS X已经预装了zlib包, 安装Allegro需要先安装libpng:http://www.libpng.org/pub/png/,下载源码包后解压编译并安装:
$ cd libpng
$ cp scripts/makefile.darwin makefile
$ make
$ make install
$ make clean
然后下载安装新版的CMake(2.6+)工具:http://www.cmake.org/. 在Allegro的源代码目录下新建并进入build目录,运行cmake命令自动创建makefiles:
$ cmake .. -DGRADE_DEBUG=on -DSHARED=off
..表示目标源文件加是当前目录的父目录.之后就是哗啦啦满屏飞字符.很快就过去了.然后依然是编译并安装命令:
$ make
$ make install
Configuring done.http://software.skoobalon.com/a5.php是最新版(Allegro5)的入门. Allegro5仍然处于开发中,是彻底重构后的一个版本.
编译并测试:
完成.
MAC OS X已经预装了zlib包, 安装Allegro需要先安装libpng:http://www.libpng.org/pub/png/,下载源码包后解压编译并安装:
$ cd libpng
$ cp scripts/makefile.darwin makefile
$ make
$ make install
$ make clean
然后下载安装新版的CMake(2.6+)工具:http://www.cmake.org/. 在Allegro的源代码目录下新建并进入build目录,运行cmake命令自动创建makefiles:
$ cmake .. -DGRADE_DEBUG=on -DSHARED=off
..表示目标源文件加是当前目录的父目录.之后就是哗啦啦满屏飞字符.很快就过去了.然后依然是编译并安装命令:
$ make
$ make install
Configuring done.http://software.skoobalon.com/a5.php是最新版(Allegro5)的入门. Allegro5仍然处于开发中,是彻底重构后的一个版本.
编译并测试:
gcc demo.c -o demo1 `allegro-config --libs`
完成.
Jan
23
2010
Tamarin笔记之一:内置常量的实现
23:24 , Qizhi
Tamarin很早就开源了,最近在读它的源代码,偶尔做做笔记.
As3中有很多顶级常量,比如NaN, Infinity等.Adobe的文档解释NaN依据IEEE-754定义,该值表示不是数值. Infinity表示正无穷大.那么究竟As3是如何实现这些定义的呢?
Tamarin中包含两部分代码实现,分别是C++和AS3(Python另有他用,几乎与语言实现无关).这些常量就是使用AS3实现的.
这些常量实现只有一句话:
public const NaN:Number = 0/0;
public const Infinity:Number = 1/0;
public const undefined = void 0;
很简单:)
Actionscript.lang.aa中定义了两个命名空间,"AS3"和"nativeHookNS".处于AS3命名空间下的代码就是我们平常见到的builtin代码,而nativeHookNS下的代码我们不可见.
比如Object.as中, isPrototypeOf是AS3中所有Object都有的方法:
AS3 function isPrototypeOf(V=void 0):Boolean
{
return _isPO(this,V)
}
而tostringHook则处于nativeHookNS命名空间下.
nativeHookNS function tostringHook():*
{
var s = this.public::toString()
if (!_isScriptObject(s))
return s
return this.public::valueOf()
}
最后,来看看Math.as的源代码就会知道为什么有的方法很慢了,因为他们压根也是用AS3实现滴,和我们自己去实现没有本质上的差别
public static function max(x:Number = CONFIG::NegInfinity, y:Number = CONFIG::NegInfinity, ...args:Array):Number
{
if (x !== x) return x
if (y !== y) return y
if (y > x) {
x = y
} else {
if (y === x)
if (y === 0)
if (1/y > 0)
x = y // -0
}
for each (y in args)
{
if (y !== y) return y // isNaN
if (y > x)
{
x = y;
}
else if (y === x && y === 0)
{
/*
Lars: "You can tell -0 from 0 by dividing 1 by the zero, -0 gives -Infinity
and 0 gives Infinity, so if you know x is a zero the test for negative
zero is (1/x < 0)."
*/
if ((1 / y) > 0)
x = y; // pick up negative zero when appropriate
}
}
return x;
}
除了Math.max和Math.min以及一些常量定义,其他算法都是C++实现.比如:
//C++
AVMPLUS_NATIVE_METHOD(double, Math_abs)
{
return MathUtils::abs(args->x);
}
MathClass.cpp中的源代码还告诉了我们一些有意思的小插曲,比如Tamarin AVM2实现ES3 15.8.2定义时,所有函数的参数都要Call一次ToNumber方法.他们没有这么做(所以标记为ISSUE)而是换了一种更有效的方法,看注释:
// ISSUE. ES3 15.8.2 says all these functions call ToNumber on its argument.
// this is more forgiving than declaring the args to be Number. We either
// have to declare these Object and to ToNumber internally, or add some special
// type support so compiler will have ToNumber.
//
// for E3 compatibility all args should be optional=NaN and rest args ignored,
// except for min, max where rest args are processed.
TO BE CONTINUED.
As3中有很多顶级常量,比如NaN, Infinity等.Adobe的文档解释NaN依据IEEE-754定义,该值表示不是数值. Infinity表示正无穷大.那么究竟As3是如何实现这些定义的呢?
Tamarin中包含两部分代码实现,分别是C++和AS3(Python另有他用,几乎与语言实现无关).这些常量就是使用AS3实现的.
这些常量实现只有一句话:
public const NaN:Number = 0/0;
public const Infinity:Number = 1/0;
public const undefined = void 0;
很简单:)
Actionscript.lang.aa中定义了两个命名空间,"AS3"和"nativeHookNS".处于AS3命名空间下的代码就是我们平常见到的builtin代码,而nativeHookNS下的代码我们不可见.
比如Object.as中, isPrototypeOf是AS3中所有Object都有的方法:
AS3 function isPrototypeOf(V=void 0):Boolean
{
return _isPO(this,V)
}
而tostringHook则处于nativeHookNS命名空间下.
nativeHookNS function tostringHook():*
{
var s = this.public::toString()
if (!_isScriptObject(s))
return s
return this.public::valueOf()
}
最后,来看看Math.as的源代码就会知道为什么有的方法很慢了,因为他们压根也是用AS3实现滴,和我们自己去实现没有本质上的差别

public static function max(x:Number = CONFIG::NegInfinity, y:Number = CONFIG::NegInfinity, ...args:Array):Number
{
if (x !== x) return x
if (y !== y) return y
if (y > x) {
x = y
} else {
if (y === x)
if (y === 0)
if (1/y > 0)
x = y // -0
}
for each (y in args)
{
if (y !== y) return y // isNaN
if (y > x)
{
x = y;
}
else if (y === x && y === 0)
{
/*
Lars: "You can tell -0 from 0 by dividing 1 by the zero, -0 gives -Infinity
and 0 gives Infinity, so if you know x is a zero the test for negative
zero is (1/x < 0)."
*/
if ((1 / y) > 0)
x = y; // pick up negative zero when appropriate
}
}
return x;
}
除了Math.max和Math.min以及一些常量定义,其他算法都是C++实现.比如:
//C++
AVMPLUS_NATIVE_METHOD(double, Math_abs)
{
return MathUtils::abs(args->x);
}
MathClass.cpp中的源代码还告诉了我们一些有意思的小插曲,比如Tamarin AVM2实现ES3 15.8.2定义时,所有函数的参数都要Call一次ToNumber方法.他们没有这么做(所以标记为ISSUE)而是换了一种更有效的方法,看注释:
// ISSUE. ES3 15.8.2 says all these functions call ToNumber on its argument.
// this is more forgiving than declaring the args to be Number. We either
// have to declare these Object and to ToNumber internally, or add some special
// type support so compiler will have ToNumber.
//
// for E3 compatibility all args should be optional=NaN and rest args ignored,
// except for min, max where rest args are processed.
TO BE CONTINUED.
Jan
10
2010
昨天参加了Adobe博客日,在南锣鼓巷过客酒吧。很多都是熟人,终于有幸见到了Kenshin活人。Adobe很有诚意的在推广自己的平台、自己的技术,对各种社区都很支持。与微软相比,推广产品的风格只是过于nice了些。
说起Flash Plantform,重复我自己的话就是其技术想比较其他RIA平台而言已经比较成熟了,但是国内仍然处于四处推广的阶段。一些高端性质的技术交流会议都比较少,国外要成熟一些,如flash on the beach,也纯属于民间性质,但他们的Speakers和Sessions都要优秀很多。当然,国内如D2、RIAmeeting也逐渐有了影响。
尽管Flash Plantform是一个非常非常优秀的平台,我有一些想法:
1、硬件加速。这是海内外多少人多年的呼声,Flash Player 10才遮遮掩掩露个面,作用不大。尽管Flash Player的渲染速度在同类插件中出类拔萃,缺了硬件加速,我们写游戏时就是很痛苦。迫不得已才使用各种处理矢量到位图的缓存手段,这毕竟抛弃了矢量的很多优点。
2、多线程。也许这会和打开潘多拉的盒子一样,让网络上的各种Flash应用变的更加具备毁灭性。没有多线程,用时间片我们也能做一些事情,但是性能低下,不易维护。或许要等到AIR10才有希望。
3、3D支持。不是Fp10的一些简单的API,AWAY3D Fp10版也只能缓存成2D性能也才说的过去。从我们做游戏的角度讲,尽管3D未必就好,毕竟能让设计师们轻松一些,不然NPC换个装扮,几十套动作下来设计师们要画到手抽经了。
4、为什么编译后的SWF, const常量没有被优化?比如定义const A:int = 10, 使用到常量A的地方仍然是引用?什么时候才有inline关键字?什么时候有Enum?等等等等。我自己的答案是Haxe有这些,语言的进化需要时间,我们这样安慰自己,但看不到时间表,也没人站出来透露几句。
5、LLVM,Alchemy这些相关的技术仍然在Lab阶段,如果有时间表的话大家会很开心。
6、如果Flash CS5的运行速度还和安装速度一样慢的话,我想我们该考虑购买超级计算机了。
对于有些人关心的HTML5是不是会kill了Flash,SilverLight是不是会打败Flash,AJAX与Flash,这些都不是我关心的话题。即便真有一天SilverLight占有率到了90%,我们只不过是换一种开发语言而已,程序员不该成为某个语言的粉丝,用户也不会在意我们的产品是使用什么语言开发的。只要吃肉就可以了,何必亲自去养猪呢?
说起Flash Plantform,重复我自己的话就是其技术想比较其他RIA平台而言已经比较成熟了,但是国内仍然处于四处推广的阶段。一些高端性质的技术交流会议都比较少,国外要成熟一些,如flash on the beach,也纯属于民间性质,但他们的Speakers和Sessions都要优秀很多。当然,国内如D2、RIAmeeting也逐渐有了影响。
尽管Flash Plantform是一个非常非常优秀的平台,我有一些想法:
1、硬件加速。这是海内外多少人多年的呼声,Flash Player 10才遮遮掩掩露个面,作用不大。尽管Flash Player的渲染速度在同类插件中出类拔萃,缺了硬件加速,我们写游戏时就是很痛苦。迫不得已才使用各种处理矢量到位图的缓存手段,这毕竟抛弃了矢量的很多优点。
2、多线程。也许这会和打开潘多拉的盒子一样,让网络上的各种Flash应用变的更加具备毁灭性。没有多线程,用时间片我们也能做一些事情,但是性能低下,不易维护。或许要等到AIR10才有希望。
3、3D支持。不是Fp10的一些简单的API,AWAY3D Fp10版也只能缓存成2D性能也才说的过去。从我们做游戏的角度讲,尽管3D未必就好,毕竟能让设计师们轻松一些,不然NPC换个装扮,几十套动作下来设计师们要画到手抽经了。
4、为什么编译后的SWF, const常量没有被优化?比如定义const A:int = 10, 使用到常量A的地方仍然是引用?什么时候才有inline关键字?什么时候有Enum?等等等等。我自己的答案是Haxe有这些,语言的进化需要时间,我们这样安慰自己,但看不到时间表,也没人站出来透露几句。
5、LLVM,Alchemy这些相关的技术仍然在Lab阶段,如果有时间表的话大家会很开心。
6、如果Flash CS5的运行速度还和安装速度一样慢的话,我想我们该考虑购买超级计算机了。
对于有些人关心的HTML5是不是会kill了Flash,SilverLight是不是会打败Flash,AJAX与Flash,这些都不是我关心的话题。即便真有一天SilverLight占有率到了90%,我们只不过是换一种开发语言而已,程序员不该成为某个语言的粉丝,用户也不会在意我们的产品是使用什么语言开发的。只要吃肉就可以了,何必亲自去养猪呢?
Jan
9
2010
PHP使用HTTP 301重定向网址
17:07 , Qizhi
最近把Blog换到了godaddy.com, 直接刷信用卡就可以,比较方便.原有的域名是新网的,不支持URL转接,所以只能在代码里设置跳转.
域名改变后常用的重定向方式有: 301 redirect, 302 redirect.
301 redirect: 301代表永久性转移(Permanently Moved),301重定向是网页更改地址后对搜索引擎友好的最好方法,只要不是暂时搬移的情况,都建议使用301来做转址。
302 redirect: 302代表暂时性转移(Temporarily Moved ).
$the_host = $_SERVER['HTTP_HOST'];
$request_uri = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '';
if($the_host != "www.qizhi.me")
{
Header( "HTTP/1.1 301 Moved Permanently" );
Header( "Location: http://www.qizhi.me".$request_uri );
}
"Header( "HTTP/1.1 301 Moved Permanently" )"这一句一定要加上,不然跳转时Http Code是302,表示临时跳转.
域名改变后常用的重定向方式有: 301 redirect, 302 redirect.
301 redirect: 301代表永久性转移(Permanently Moved),301重定向是网页更改地址后对搜索引擎友好的最好方法,只要不是暂时搬移的情况,都建议使用301来做转址。
302 redirect: 302代表暂时性转移(Temporarily Moved ).
$the_host = $_SERVER['HTTP_HOST'];
$request_uri = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '';
if($the_host != "www.qizhi.me")
{
Header( "HTTP/1.1 301 Moved Permanently" );
Header( "Location: http://www.qizhi.me".$request_uri );
}
"Header( "HTTP/1.1 301 Moved Permanently" )"这一句一定要加上,不然跳转时Http Code是302,表示临时跳转.
Dec
26
2009







