Doom 的呐喊

Crying in the Day of Doom

今日十大

今天小百合十大的前三条是这样的:

shot

第二条的内容是这样的:

Top ten no.2

RPN Calculator for iPhone

从拿到 iPhone 的第一天起,我就在不断地寻找好用的 RPN 计算器。我的要求是

  1. 类似 Emacs Calc 的进栈出栈方式
  2. 无限大的堆栈
  3. 要牛逼

iPhone RPN Icon

我一直使用的都是一个 HP i41CX 模拟器。它基本符合第一条,但是不符合第二条:它的堆栈只有四层,而且最顶层还就是你正在输入的这个。不过它非常非常得符合第三条,看看这个计算器的像板砖一样的手册就知道了。这个计算器也有一些不便,它实在是太复杂了。比如他默认的键盘配置上没有切换弧度和角度的键。键绑定是可以设的,但是我一直没有搞明白怎么设…  同样因为这个原因,我一直不知道怎么算双曲三角函数。其他的 RPN 计算器要不就是操作方式诡异,要不就是功能太少。所以昨天我终于决定自己写一个计算器。

奋斗了两天以后把四则运算都搞定了… -_-  在 iPhone 上开发程序还是很方便的,和在 Mac 上差不多,熟练了以后写界面用不了太多的时间,而且 Interface Builder 做 prototyping 也非常得爽。我的时间主要都浪费在用 UITableView 显示一个堆栈上。UITableView 就是一个和菜单差不多的可选择的列表,几乎每一个 iPhone 程序里都能看到。但是这个东西必须要有一个符合某种特定协议的数据源…  我曾经一度都想自己用 label 和 UIScrollView 实现一个这种列表了…  不过最后搞定以后发现这个东西还是挺爽的,并且附赠动画效果~~

在 iPhone 上开发程序需要花 $99 买一个许可证。… … …… 噢,不对,说错了,是苹果声称你需要买一个,实际上你不需要。免费开发程序的代价就是开发出来的程序只能在 jailbreak 过的 iPhone 上运行。当然这其实没什么,因为各种迹象表明,没有 jailbreak 过的 iPhone 的使用价值其实就和一个板砖差不多。默认情况下,如果你没买这个许可证,Xcode 是不会让你把程序往 iPhone 上传的,只能在模拟器里运行。要想在 iPhone 里运行,

  1. 当然要先 jailbreak
  2. 照着 Compiling 一节
  3. Replacing codesign with ldid,这一节貌似没什么用,我从来没有成功的运行过 ldid,不过我还是做了。
  4. 给 iPhone 装 AppSync 补丁。很多 Cydia 源里都有,比如 hackulo.us 源。
  5. 编译时使用自己生成的那个许可证。

关于调试,在开始使用 Linux 之后,我就再也没有使用过任何调试器,只使用 printf(及各种语言里的等效的函数)。Objective-c 里是有 printf 的,但是比较方便的做法是使用 NSLog()。运行的时候在 Xcode 里选择 Run -> Console,可以看到输出。顺便提一下,Objective-c 的标准库还是很牛逼的,嗯,NSString, NSNumber, NSArray, …

Typescripts Rearranged

今天好好看了一下 ConTeXt 的新文档 co-fonts,然后把平时常用的字体都写成 typescript 放到 texmf-local 里。这样以后写作业就不会出现字体定义比文档内容还长的情况了-_-…

首先定义几个 feature sets

\definefontfeature[latin-smallcaps][smallcaps][script=latn]
\definefontfeature
  [fancy]
  [language=dflt, script=latn, method=node, pnum=yes, onum=no,
    kern=yes, liga=yes, dlig=no, zero=no, tlig=yes, trep=yes,
    protrusion=quality, expansion=quality, mapping=tex-text]

然后定义单个字体的 typescript

\starttypescript[myCaslon]
  \definefontsynonym[proserif][name:ACaslonPro-Regular]
  \definefontsynonym[proserifit][name:ACaslonPro-Italic]
  \definefontsynonym[proserifbf][name:ACaslonPro-Bold]
  \definefontsynonym[proserifbi][name:ACaslonPro-BoldItalic]
  \definefontsynonym[Serif][proserif][features=fancy]
  \definefontsynonym[SerifItalic][proserifit][features=fancy]
  \definefontsynonym[SerifBold][proserifbf][features=fancy]
  \definefontsynonym[SerifBoldItalic][proserifbi][features=fancy]
  \definefontsynonym[SerifCaps][Serif][features=latin-smallcaps]
\stoptypescript
 
\starttypescript[myPalatino]
  \definefontsynonym[palarm][name:PalatinoLTStd-Roman]
  \definefontsynonym[palait][name:PalatinoLTStd-Italic]
  \definefontsynonym[palabf][name:PalatinoLTStd-Bold]
  \definefontsynonym[palabi][name:PalatinoLTStd-BoldItalic]
  \definefontsynonym[Serif][palarm][features=fancy]
  \definefontsynonym[SerifItalic][palait][features=fancy]
  \definefontsynonym[SerifBold][palabf][features=fancy]
  \definefontsynonym[SerifBoldItalic][palabi][features=fancy]
  \definefontsynonym[SerifCaps][Serif][features=latin-smallcaps]
\stoptypescript
 
\starttypescript[myOptima]
  \definefontsynonym[prosans][name:OptimaLTStd]
  \definefontsynonym[prosansit][name:OptimaLTStd-Italic]
  \definefontsynonym[prosansbf][name:OptimaLTStd-Bold]
  \definefontsynonym[prosansbi][name:OptimaLTStd-BoldItalic]
  \definefontsynonym[Sans][prosans][features=fancy]
  \definefontsynonym[SansItalic][prosansit][features=fancy]
  \definefontsynonym[SansBold][prosansbf][features=fancy]
  \definefontsynonym[SansBoldItalic][prosansbi][features=fancy]
  \definefontsynonym[SansCaps][Sans][features=latin-smallcaps]
\stoptypescript
 
\starttypescript[myFutura]
  \definefontsynonym[prosans][name:FuturaStd-Medium]
  \definefontsynonym[prosansit][name:FuturaStd-MediumOblique]
  \definefontsynonym[prosansbf][name:FuturaStd-Bold]
  \definefontsynonym[prosansbi][name:FuturaStd-BoldOblique]
  \definefontsynonym[Sans][prosans][features=fancy]
  \definefontsynonym[SansItalic][prosansit][features=fancy]
  \definefontsynonym[SansBold][prosansbf][features=fancy]
  \definefontsynonym[SansBoldItalic][prosansbi][features=fancy]
  \definefontsynonym[SansCaps][Sans][features=latin-smallcaps]
\stoptypescript
 
\starttypescript[myMyriad]
  \definefontsynonym[prosans][name:MyriadPro-Regular]
  \definefontsynonym[prosansit][name:MyriadPro-It]
  \definefontsynonym[prosansbf][name:MyriadPro-Bold]
  \definefontsynonym[prosansbi][name:MyriadPro-BoldIt]
  \definefontsynonym[Sans][prosans][features=fancy]
  \definefontsynonym[SansItalic][prosansit][features=fancy]
  \definefontsynonym[SansBold][prosansbf][features=fancy]
  \definefontsynonym[SansBoldItalic][prosansbi][features=fancy]
  % No smallcaps
%  \definefontsynonym[SansCaps][Sans][features=latin-smallcaps]
\stoptypescript
 
\starttypescript[myMonaco]
  \definefontsynonym[promono][name:Monaco_Linux]
  \definefontsynonym[Mono][promono][features=default]
\stoptypescript

ConTeXt Minimals 自带的 px-math 也定义一个

% The internal px-math
\starttypescript[myPxMath]
  \loadfontgoodies[px-math]
  \definefontsynonym[MathRoman][pxmath@px-math]
\stoptypescript

最后写几个常用组合

\starttypescript[PalatinoOptima]
  \usetypescript[myPalatino]
  \usetypescript[myOptima]
  \usetypescript[myMonaco]
  \usetypescript[myPxMath]
  \definetypeface[PalatinoOptima][rm][serif][myPalatino][default]
  \definetypeface[PalatinoOptima][ss][sans][myOptima][default]
  \definetypeface[PalatinoOptima][tt][mono][myMonaco][default][rscale=0.8]
  \definetypeface[PalatinoOptima][mm][math][myPxMath][default]
\stoptypescript
 
\starttypescript[PalatinoMyriad]
  \usetypescript[myPalatino]
  \usetypescript[myMyriad]
  \usetypescript[myMonaco]
  \usetypescript[myPxMath]
  \definetypeface[PalatinoMyriad][rm][serif][myPalatino][default]
  \definetypeface[PalatinoMyriad][ss][sans][myMyriad][default]
  \definetypeface[PalatinoMyriad][tt][mono][myMonaco][default][rscale=0.8]
  \definetypeface[PalatinoMyriad][mm][math][myPxMath][default]
\stoptypescript
 
\starttypescript[CaslonMyriad]
  \usetypescript[myCaslon]
  \usetypescript[myMyriad]
  \usetypescript[myMonaco]
  \usetypescript[myPxMath]
  \definetypeface[CaslonMyriad][rm][serif][myCaslon][default]
  \definetypeface[CaslonMyriad][ss][sans][myMyriad][default]
  \definetypeface[CaslonMyriad][tt][mono][myMonaco][default][rscale=0.8]
\stoptypescript

把这些写成一个文件扔到 textmf-local/tex/context/base 里,然后
luatools --generate; context --make。测试:

\input type-mine
\usetypescript[PalatinoOptima]
\setupbodyfont[PalatinoOptima, roman, 12pt]
 
\setuppapersize[B5][B5]
\setupinterlinespace[line=1.4em]
 
\starttext
Serif test 1234567890.  {\ss Sans test}.  {\tt Typewriter test.}
 
{\it Serif test 1234567890.  {\ss Sans test}.}
 
{\bf Serif test 1234567890.  {\ss Sans test}.}
 
$M_{ath} \times t^{est} = 1234567890.$ \placeformula
\startformula
  \widetilde{G}(\vec k, \omega) = \int_{-\infty}^{+\infty} e^{i(\vec
    k\cdot \vec x - \omega t)} G(\vec x, t)\, {\rm d}^3 \vec x\, {\rm d}t
\stopformula
\stoptext

效果如图

Palatino + Optima Caslon + Myriad
Palatino Caslon

Code Hilighting in ConTeXt

今天需要排一个带 Scheme 代码的文档,里面还有点数学公式,所以决定用 ConTeXt。正好前几天 Steamedfish 同学跟我说过 ConTeXt 可以读取 Vim 的语法加亮,决定看一看。

Google 了一下之后发现 ConTeXt 是使用一个叫做 t-vim 的 module 来干这件事的,我使用的 ConTeXt 发行是 ConTeXt Minimal,于是进入 ConTeXt 的安装目录,更新

./first-setup.sh --extras=t-vim

然后随便排了一个代码。ConTeXt 报错

VIM - Vi IMproved 7.2 (2008 Aug 9, compiled Mar  8 2010 22:56:09)
Garbage after option argument: "-u NONE -e -C -n -c "set tabstop=8" -c
"syntax on" -c "set syntax=scheme" -c "let contextstartline=1" -c "let
contextstopline=0" -c "source 2context.vim" -c "wqa"
"009-vimsyntax.tmp" "

哭了… 这不是要整死我这个 Vim 白痴么… 经过无穷多小时的 google,我终于认识到“Garbage after option argument”错误表示 Vim 的参数有错… 看来要改 t-vim 的代码了。于是打开 t-vim.tex,一看又哭了… 一个 macro 都不认识,这不是要整死我这个 TeX 白痴么… 经过 3000+ ms 的搜索,我终于认识到问题出在 t-vim.tex 的第 344 行:

330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
   {\executesystemcommand
      {mtxrun --verbose --noquote bin:vim
          "-u NONE  % No need to read unnessary configurations
           -e       % run in ex mode
           -C       % Set compatibile
           -n       % No swap
%          -V10log  % For debugging only, will go away later.
           -c \shellescapedquote set tabstop=\@@vstab \shellescapedquote\space    
           -c \shellescapedquote syntax on\shellescapedquote\space 
           -c \shellescapedquote set syntax=\@@vssyntax\shellescapedquote\space
           -c \shellescapedquote let contextstartline=\@@vsstart\shellescapedquote\space
           -c \shellescapedquote let contextstopline=\@@vsstop\shellescapedquote  \space
           -c \shellescapedquote source kpse:2context.vim\shellescapedquote\space
           -c \shellescapedquote wqa\shellescapedquote\space    
            \shellescapedquote#1\shellescapedquote\space "}}

Macro \shellescapedquote 后面的 \space 会在文件名(#1)的后面加上一个空格。而 mtxrun 会把这个空格当作参数的一部分??!!!于是 vim 就会收到一个很诡异的参数而报错。所以我首先想到的解决方法就是把最后那个 \space 去掉。然后发现编译时最后的那个引号(\shellescapedquote)居然就没了,还是出错… 于是我怒了,毅然决定把 mtxrun 换成无敌的 Bash。

\def\runvimsyntax#1
   {\executesystemcommand
      {bash -c "vim -u NONE -e -C -n -c \shellescapedquote set tabstop=\@@vstab \shellescapedquote\space -c \shellescapedquote syntax on\shellescapedquote\space -c \shellescapedquote set syntax=\@@vssyntax\shellescapedquote\space -c \shellescapedquote let contextstartline=\@@vsstart\shellescapedquote\space -c \shellescapedquote let contextstopline=\@@vsstop\shellescapedquote  \space -c \shellescapedquote source /home/corsair/software/context/tex/texmf-context/tex/context/third/vim/2context.vim\shellescapedquote\space -c \shellescapedquote wqa\shellescapedquote\space \shellescapedquote#1\shellescapedquote\space "}}

宇宙终于又开始正常运行了。

关于 Photoshop

这几天我给一个同学看我的照片,他听说我用了 PS 以后大喊:“You ruined your photos man!  Don’t do it!”

本来我想以中学作文的形式来写这个东西的。写了一半发现没必要,因为有些东西太显然了。所以我决定这么写:

  1. 摄影是一种艺术,我的目标是艺术(有没有达到是另一回事哈)
  2. 艺术是用来让人(别人)深思的
  3. 制作艺术的过程不能让人(别人)深思
  4. 艺术品的艺术价值与制作过程无关,只与内容有关

另外

  1. 暗房和 PS 都是 post-processing
  2. 胶片机和 DC 都是照相机
  3. 刻活字和 Fontforge 都是字体设计
  4. 排活字和 TeX 都是排版
  5. 用笔写和用计算机写都是写作
  6. 手算和 Mathematica 算都是计算
  7. 乱摸和在网上使用挑逗性言论都是性骚扰
  8. 还用再举例么?
Four

Four

最后

老子就是要 PS,老子就是要狂 PS,老子的 PS 水平巨高,老子能把照片 PS 得巨贱,怎么着吧你~~?

D40 Test

Just bought a Nikon D40 DSLR.  Since today I had an exam, I just did one test to it: night shooting in my very dim room.

My Room

Shot with the lens in package, under 18mm, aperture-priority, f/3.5, 1/6s, ISO1600.  And white-balanced in Photoshop, because I only have two light bubbles that emit yellow white lights.   A portion of the 100% image is here.  I’m more than satisfied with this photo because

  1. My room is very dim, very very dim.
  2. This was shot under ISO1600, which means D40’s high ISO is awesome.
  3. I can hold this camera steadily enough.

IPhone Jailbreak

正在 Dev-team 忙着整 3.1 jailbreak 的时候,惊闻某大牛已经搞出了 3.1 和 3.1.2 都能用的 jailbreak,Blackra1n。遂装,成功。然后第一件事就是装了个 MobileTerminal 和 OpenSSH,呵呵。不过 jailbreak 了以后还是不能运行自己写的代码,有两个问题:

  1. Xcode 只能编译在 simulator 运行的代码,编译 iPhone 上运行的代码还需要 sign。
  2. IPhone 还是需要检查 SHA1 hash。

第一个问题很好解决,编辑文件 /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.sdk/SDKSettings.plist,把 CODE_SIGNING_REQUIRED 下面的 YES 改成 NO,然后在 Xcode 里设置项目的 certificate identity 为不需要签名。第二个问题比较麻烦。Cydia 的网站里提到可以在 iPhone 里运行一条命令

sysctl -w security.mac.proc_enforce=0 \
security.mac.vnode_enforce=0

就搞定了。我这里执行以后的确可以运行没有签名的程序了,但是副作用是一旦重启 SpringBoard 就连不上 wifi。不过这个倒是不麻烦,把这两个值都恢复成原来的就行了。其实最好的解决办法是 self-signing。但是我用 codesign 老是出错… 嗯。不废话了,上 pp~~

IPhone Jailbreak

误人子弟记

今天上完电动力学课,我去某指定地点答疑。进去时已经有三个小孩在了。其中两个在激烈讨论(这两个好像都比我大…),还有一个闷头做题。然后我自我介绍说我是 lab TA。过了一会儿,那个闷头做题的过来问一道很弱智的电磁学问题。我想我虽然不是电磁学的 TA,但是应付一下也是没问题的,于是就看题目。题目是这样的

两个电荷都是 -q 相距 10cm。求空间中总电场为零的点。

于是我就很认真的告诉那个小孩,设两电荷之间的一点,距其中一个电荷为 r。这点的总电场为两个电荷的电场之和

\displaystyle E = \frac{-q}{4\pi\epsilon_0}\left[\frac{1}{r^2} + \frac{1}{(10 - r)^2}\right]

E=0 也就是 r^2 + (10 - r)^2 = 0,鉴于这是两个平方之和,所以 r = 10 - r = 0,所以这道题出错了。

下午上数理的时候才反应过来,下课后想去找该小孩,未遂。

郑重告诫各位,刚上完电动量子广相或场论之后不宜思考。思考必死。