Mar 11

Phun 是一个 “2D physics sandbox”,是 Umeå 大学一个硕士生的毕业作品,使用了 C++ + boost + OpenGL + GLEW + SDL。这个东西最强悍的地方在于可以用鼠标画一个任意形状的物体参与计算。以下是官方的介绍视频:

以下两个是我做的~~ :-p

这个东西目前还未开源,不过作者说以后会开的~~

Mar 06

KDE 新出的 4.0.2 版changelog 的最后有

Icelandic has been added to KDE translations.

难道这就是传说中的只有几千人用的冰岛语??:-D

Dec 30

这几天重新看 The Matrix,发现在第二部的后面,Trinity crack 进电力系统的网络,准备关闭备用系统的时候,她用的居然是 SSH?!看截图

从这个截图里还可以推测出他们 crack 的过程:

  1. 使用 nmap 对主机 10.2.2.2 进行端口扫描,看到 SSH 端口开着。虽然这个命令行没有给出,不过可以想象大概为这个样子:
    # nmap -sT 10.2.2.2
  2. 使用 sshnuke 更改 10.2.2.2 的 root 密码。不用试了,你的机器里没有这个程序
  3. 以 root 登录 10.2.2.2

另外,我发现两个证据说明这是一个苹果机网络(起码都运行着苹果的操作系统)。一个是那个输入密码的对话框,窗口装饰很像是古老的 Mac OS,另一个是 nmap 的扫描过程。大家注意这行字:

The 1539 port scanned but not shown below are in state: closed

1539 端口貌似是一种叫作 Mac-net 的服务的端口…

补充(2008-03-06):sshnuke 的输出里有一句

Attempting to exploit SSHv1 CRC32 … successful.

也许使用 SSHv1 协议正是服务器这么轻易就被攻破的原因~~。所以在此提醒大家:一定要使用 v2 协议!^_^

Nov 19

CGH,计算机生成全息,就是可以把入射光的相位信息保存下来的东西。目前网上介绍这个东西的文章大多以论文(而且都是要钱的…)的形式出现,不利于我等民间人士访问。正好这几天由于学习上的需要写了一个二维 CGH 的程序。大家都知道光学的全息就是让物光通过一组透镜产生傅立叶变换,然后用一束参考光干涉来记录,所以在 CGH 里只要对物做傅立叶变换,然后记录变换结果就行了。具体步骤如下:

  1. 把物做成图片
  2. 对图片做 FFT,生成一组复数
  3. 把复数编码成图片并保存

要还原时只需要从生成的图片里导出频域信息,并做 FFT 逆变换。

我这个程序比较弱智,我自己写了一个读写 bmp 文件的类,只能操作 windows 格式的 24 bit bmp,编码用了类似 Lohmann 的,用开孔的位置表示相位,孔的深浅表示幅度。用法为

holo -i <inputfile> [-o <outputfile>] [-w <site width>]
    [-h <site height>] [-d <hole width>] [-r]

其中 site width 是每个孔能活动的宽度,site height 是孔的高度,hole width 是孔的宽度,site width - hole width 决定了相位的精度,而幅度的精度永远是 8 bit。

Oct 06

id Tech5 Logo

上个月的 QuakeCon 上,id 发布了使用 id Tech5 引擎制作的 Rage 的一段 demo,传说这是用 id Tech5 引擎实际渲染出来的。从这个 demo 里,我们可以大概看出新引擎的一些特性:

  1. 真实的景深效果,只有镜头焦点附近的东西是清晰的,其它东西按照离焦点的远近呈现不同半径的模糊。按照 John Carmack 的一贯作风,我怀疑离焦点的远近被简化成 z 轴坐标~~
  2. 真实的阴影。Doom3 引擎的阴影已经很好了,就缺少模糊的边缘。很多其他游戏里有边缘模糊的阴影,一般来说这可能是两种情况:
    • 阴影是 buffer shadow,精度不够所以模糊了
    • 先搞一个精确的阴影,然后对阴影整体模糊

    前面一种显然是错误的,后面一种则是对真实阴影的“零阶近似”。为什么?看看这张图就知道了,这是我用 Blender 渲染的。看到了么?真实的阴影在离物体近的地方是比较锐利的,离物体越远越模糊。而 id Tech5 似乎已经实现了真实阴影的“一阶近似”(也许是更高阶)。注意下面第三张截图的左边,人物肩膀上的盔甲在衣服上投下的阴影。

  3. 开放的户外场景,改进的 MegaTexture。
  4. 更先进的 shader。从截图上看,不仅是金属,其他各种材质在 id Tech5 里都有异常真实的表现,不像 Doom3 里只有金属… 那个人脸的特写,就像照片一样…
  5. HDR。这个是 Doom3 的一大缺憾…

John Carmack

改写一段 Man in Black 的台词作为结尾吧:

After Quake, everybody knew that the world was a 3D one. After Quake II, everybody knew that lights could be colorful. After Quake III, everybody knew that a texture could be mapped onto a cylinder. After Doom3, everybody knew that without light, the world would be all black. Today, we know that shadows are fuzzy. Imagine what we will know, tomorrow.

Oct 03

在写完上一篇关于 CSS3 分栏的 post 以后,我查看分栏的效果,突然发现底下英文那一段中的 figure 比较诡异,放大以后发现 Firefox 居然支持字体中的 ligatures~~

关于 ligatures,简单的说就是把某些字母组合搞成一个字母,这样看起来更好看(一般来说是更紧凑)。还有三点补充:

  1. Ligatures 很神奇
  2. Windows 下的程序基本都不能识别 ligatures,除非是 Safari 3 和 Adobe 这样自己写字体引擎的
  3. X 的 Freetype 2 在 patch 之后支持 ligatures。

看截图,是在 Firefox 里放大到 4 倍的结果,字体是 Adobe 的 Gill Sans Std:

Ligatures in Firefox Normal i
连在一起的 f 和 i 普通的 i
Oct 03

CSS3 中增添了对分栏排版的支持,这个我很早就知道了,但是今天才发现 Firefox 和 Safari 3 已经实现了这个东西,真是惊天地泣鬼神… 测试一下~~

中文的:

从那以后,他的预感就不太灵了。那一天,乌苏娜在狱里探望他的时候,他经过长久思考得出结论,这一次,死神很可能不会马上来临,因为死神的来临取决于刽子手的意志,他被自己的脓疮弄得很苦,整夜都没睡着。黎明前不久,走廊上响起了脚步声。“他们来啦,”奥雷连诺自言自语地说,他不知为什么突然想起了霍⋅阿⋅布恩蒂亚;就在这一片刻,在黎明前的晦暗里,霍⋅阿⋅布恩蒂亚蜷缩在粟树下面的板凳上,大概也想到了他。奥雷连诺上校心里既没有留恋,也没有恐惧,只有深沉的恼怒,因他想到,由于这种过早的死亡,他看不到自己来不及完成的一切事情如何完成了……牢门打开,一个士兵拿着一杯咖啡走了进来。第二天,也在这个时刻,奥雷连诺上校腋下照旧痛得难受的时候,同样的情况又重复了一遍。星期四,他把乌苏娜带来的蜜饯分给了卫兵们,穿上了他觉得太紧的干净衣服和漆皮鞋。到了星期五,他们仍然没有枪毙他。

英文的:

A small figure gallops across the windswept ice slope. The bundled rider is mounted on a large gray snow lizard, a Tauntaun. Curving plumes of snow rise from beneath the speeding paws of the two-legged beast. The rider gallops up a slope and reins his lizard to a stop. Pulling off his protective goggles, Luke Skywalker notices something in the sky. He takes a pair of electrobinoculars from his utility belt and through them sees smoke rising from where the probe robot has crashed. The wind whips at Luke’s fur-lined cap and he activates a comlink transmitter. His Tauntaun shifts and moans nervously beneath him.
Sep 30

这是以前写的 texpng 程序的图形界面版,我把以前的 texpng.py 改写了一下(这是好听的说法,其实是剪切粘贴了一下),把转换过程抽象了一下,方便在图形界面里调用。和 texpng.py 一样,这个东西需要一个正常的 LaTeX 系统、dvipng 和 Imagemagick,除此之外,图形库使用了 wxpython。用法就不废话了,GUI 啊同志们… 最后,那三个图标是 oslo 图标集中的,版权属于原作者。

对了,过几天大家可能会看到一个更牛逼的转换 TeX 的程序,不过不是在我这里~~ :-p

最后的最后,说点感想~~

  1. 在 Linux 下写程序太方便了,感觉 Linux 就是写程序用的~~。这两天狂用了 Mac OS X 之后,隆重宣布:宇宙里最好用的 PC 操作系统是配置好的 Linux~~
  2. 现在写个图形界面太方便了!这个小破程序是我三个小时攒的…
  3. 还没想好…

PS:这个程序在运行的的时候会覆盖当前目录下的 temp.png 文件(如果有的话),退出的时候把这个文件删除。

Sep 27

安上了 MacTeX,这是运行在 Mac OS X 下的基于 TeXLive 的发行版,比 CTeX 还大… 不过像 CTeX 一样,装起来很方便,不用配置,而且一上来就可以排中文~~,不过据我的试验,编码只能为 utf-8,而且可以用的简体字体只有一个 gbsn,这个字体比 M$ 的那个 simsun 好看多了~~。

\\documentclass[12pt]{article}
\\usepackage{CJK}
\\begin{document}
\\begin{CJK}{UTF8}{gbsn}
This is a test. 中文测试。

\\textbf{粗体}\\textit{斜体}\\texttt{等宽字体}\\ldots
\\end{CJK}
\\end{document}

%%% Local Variables:
%%% mode: latex
%%% TeX-master: t
%%% End: 

Font gbsn

Sep 26

可能是由于安在 x86 上的缘故,Safari 不太稳定,一打开某些中文网页就崩溃… 真不知道为啥在中国大家都不遵守 HTML 4 和 XHTML 1.0 呢~~~ 于是还是用 Firefox… 但是 Firefox 似乎对 OS X 的 Type1 字体有强烈的不满,不是显示一堆火星文就是显示成脚标/上标状… 搞得我看中文像看公式一样… 后来听说还有个 Camino,也是 Mozilla 的,会好一点,赶快安上,发现确实好一点,基本没有火星文,公式也比较少… 看截图:

Firefox 截图 Camino 截图
Firefox Camino

我想出现这种鸟事是因为 Mozilla 们为了跨平台,搞了自己的字体引擎,不肯使用各操作系统自带的 API,但是对 Type1 支持又不好,不能正确读取字体中的某些信息,于是就出现了火星文和公式…

Sep 21

Google 了无数次,也找到了一些安装显卡驱动的方法,但在我的机器上就是不管用… 所以到现在还没有硬件加速,这个本来没什么,少一些特效而已,但是发现 OS X 里播放视频是需要硬件加速的…

大概研究了一下 OS X 下的程序,标准的 OS X 程序都是一个名字以 .app 结尾的文件夹,里边一般只有一个文件夹叫 Contents,这个程序的一切都在这个文件夹里,包括图标,配置(有些比较底层的会在 /Library/System 里面放配制)语言文件等等。比较爽的是,OS X 和它里面的程序都是极端脚本化的,不仅配置一律是 xml,而且控件的摆放(!),图片的位置,dock 图标,甚至部分逻辑都是 xml,对于我们这些喜欢没事瞎改的人来说,这样的系统基本上就是天堂了~~。举个简单的例子,无论在什么操作系统里,只要有一个图形界面的文件管理器,你在里面新建一个目录的时候都有一个默认的目录名,比如在 Windows 里叫“新建文件夹”,这是被硬编码的,没有源代码的人改不了;在 OS X 里叫 untitled name,这个可以在 /System/Library/CoreServices/Contents/Resources/English.lproj 中修改,这个 .lproj 是一个语言文件,会被其他的 xml 调用。貌似现在达到这种境界的基本上就只有 wxWindow 了(用 xml 来摆控件)。

OS X 里面是有 python 的,不过是 2.3 版,严重不爽,于是装了一个 2.5(装好以后还要手动做符号连接…),开始考虑有什么程序可以写~~。想了半天,决定写一个批量删除语言文件的东西,把机器里的那些非人类语言都删掉,可以节省数百 MB 的硬盘~~,代码(用法看开头的注释):

#!/usr/bin/env python
#
# Usage:
#     kill-lang.py app_list
#
# eg: kill-lang.py mail.app aquamacs.app
#     ls -1 | awk '{print "\""$0"\""}' | xargs kill-lang.py

import os
import sys
import re
import shutil
ReservedLang = ["English", "zh_CN"]

if len(sys.argv) == 1:
    usage()
    sys.exit(1)

def usage():
    print(' '.join(["Usage:", sys.argv[0],
                    "application_names (with \".app\")"]))
    return

def handleRmError(function, path, excinfo):
    sys.stderr.write(''.join(["Error deleting ", path, ", err:\n", str(excinfo), "\n"]))

def killLang(app):
    # Get the path where language files are located.
    AppResource = '/'.join([app, "Contents", "Resources"])

    if not os.path.isdir(AppResource):
        sys.stderr.write("This program dose not have a standard app structure.\n")
        sys.exit(2)

    AppSubs = os.listdir(AppResource)
    Langs = []
    for Sub in AppSubs:
        if re.match(".*\.lproj$", Sub) != None:
            Langs.append(Sub)

FullLangs = ['/'.join([AppResource, Lang]) for Lang in Langs]
    for i in range(len(FullLangs)):
        if not Langs[i][:-6] in ReservedLang:
            print("".join(["Deleting ", Langs[i], "..."]))
            shutil.rmtree(FullLangs[i], False, handleRmError)
    return 0

def main():
    for App in sys.argv[1:]:
        App = os.path.abspath(App)
        print App + ':'

        if not os.path.isdir(App) or len(App) - App.rfind(".app") != 4:
            print "Not an app, skipped"
            continue
        killLang(App)
    return 0

sys.exit(main())
Sep 19

终于按耐不住,把 Windows 删了,装了一个苹果的操作系统,安装的道路上布满荆棘…

我的硬盘上分区众多,主分区和扩展分区相间而生,而且前后历经 Windows 的 parted,Powerquest Magic,和 cfdisk 的多重折磨,估计 MBR 已经变的像我的宿舍一样乱糟糟的,OS X 的安装程序能读出来已经很让我满意了,试了数次之后发现用那个 Disk Utility 只能读,连格式化都不行… 那时 Windows 已经光荣牺牲,所以决定把整个硬盘重新分区。在备份了 30 多 G 的重要数据以后,一闭眼,打了 cfdisk -z /dev/hda,面对空荡荡的 MBR,心中感慨万千~~

在 cfdisk 里划了一个 15G 的主分区,然后兴奋的跑到 OS X 安装程序里,发现还是不行,这个比较奇怪,到现在也不知道为什么… 最后经过数次尝试发现只有在 Windows(的安装程序)里分区,Disk Utility 才能正确的格式化。安装过程倒是挺快的,和 Ubuntu 差不多,就是要打个 SSE2 的补丁。

如果平时只是上上网,处理一下 routine stuff 的话,OS X 在安完之后就已经是一个非常全面的系统。浏览器、终端、文件管理器、邮件客户端、日程管理、播放器等等一应俱全(想想 Windows 吧…)。不过自带的那个 iChat 只能使用自己的协议,要是需要类似 Pidgin 的那种多协议 IM 的话,可以下载 Adium,这是宇宙里最漂亮,最好用的 IM,而且是开源的。BT 客户端可以用 BitRocket,也是开源的。OS X 的软件资源非常丰富,而且基本上都比 Windows 的同类软件好用。

操作系统本身基本上是完美的,配置也非常简单,都集中在 System Preferences 里,不像 Windows 要到处找。还有那个 Dock,以前用 Windows 的时候用过一个模仿 dock 的软件叫 RocketDock,手感很好,但是安上 OS X 之后才发现 dock 有一些不可能在 Windows 里模仿出的功能,它可以与其它程序交换信息,比如那个 Adium,你在里面设置自己的状态为 away 以后,Adium 就会告诉 dock,于是 dock 里的那个小鸭子图标就会举个牌子,上面写着 Away~~ 其它的就不说了,只有在用过之后才能体会到它的方便…

下面是截图:


About this MAC~~

Adium 聊天

安装 Aquamacs,一拖动就行了

安装 Firefox,我们要开源~~

用 Safari 上网

桌面,注意底下的 dock,鼠标在的位置是 BitRocket,可以实时地显示下载速度
Sep 13

今天在网上乱逛,不小心看到一个自动代理配置脚本(就是传说中的 pac 文件),发现语法怎么就和 Java 那么像呢~~?Google 一番之后发现其实 pac 就是一个 Javascript 函数,名叫 FindProxyForURL。它接收两个参数,urlhost,都是字符串。url 是浏览器将要进入的地址,host 就是地址中 :// 和第一个 / 之间的部分。返回值为一个字符串,有三种情况:

  1. 直接连接,不经过代理,返回 "DIRECT"
  2. 经过代理,返回 "PROXY host:port
  3. 经过 socks 服务器,返回 "SOCKS host:port

有了这些规则,我们就可以随意加入逻辑,一劳永逸地解决是否使用代理,何时使用代理,使用什么代理等一系列重大问题。比如,我要对 blogspot 使用72.14.219.190,其他某些倒霉的地址使用 Tor,剩下的碌碌无为的地址不使用代理,就可以用下面这个 pac。

function FindProxyForURL(url, host)
{
    url = url.toLowerCase();
    host = host.toLowerCase();

    if(dnsDomainIs(host, ".blogspot.com"))
        return "PROXY 72.14.219.190:80";

    if(dnsDomainIs(host, ".wikipedia.org") ||
       dnsDomainIs(host, ".technorati.com")
       )
        return "SOCKS 127.0.0.1:9050";

    return "DIRECT";
}

Reference: http://wp.netscape.com/eng/mozilla/2.0/relnotes/demo/proxy-live.html#dnsDomainIs。Netscape 真是有长者风范啊~~

Aug 06

写了一个用来搞笑的 python 程序,可以随机地按照一定的语法生成句子。若干时间前写过一个功能差不多的程序,但是比较傻逼。

这个程序使用了 recursive transition networks 来表示一些简单的语法,目前可以递归地生成主语从句和宾语从句,并组合成完整的句子。看一些例子:

  • The fool which reluctantly rocks unwillingly eats a book.
  • The silly man that is silly unwillingly kicks a book which finally pisses.
  • A book reluctantly eats a bug that is red.
  • A man unwillingly sucks.
  • The piece of shit that happily runs reluctantly kicks a bug.

:-p 词表里本来还有一个 fucking 的,考虑到这里的都是文化人,删了。代码在最后。

另外,Vincent 在 The slow downfall of Emacs 里写道 Emacs 在编辑器中的 popularity 排名正在降低。在几年前,编辑器的 top two 永远是 Vi/Vim 和 Emacs,但是现在 Emacs 竟然落在了 GEdit 和 Kite 之后(这帮傻逼都是怎么想的?!),到底是为什么?Vincent 在最后写道:“Why is that? Not pretty enough? Too powerful for the simple needs of the new users that Ubuntu brought to the Linux world?”

Continue reading »

Jul 28

看到了 Cheng Meng 的那个 Youtube downloader,由于对 Ruby 的无知,一点也看不懂,所以就参考 DownloadYoutube video with GAWK 用 python 自己写了一个。与 Cheng Meng 那个不同,我这个只负责把视频文件 url 打印出来。用法是 youtube-url.py video-id 所以要下载 id为 qNKtKm3SXvs 的视频,可以用这个命令

wget -O video.flv `youtube-url.py qNKtKm3SXvs`

youtube-url.py 的代码:

Continue reading »

Close
E-mail It