1月 312012
 

将 1/998001 用小数表示,会得到 000001002… 这样的序列。我是从网上看到的,更原始的出处在此

下面是用 bc(1) 这个计算器重现的记录,其中前两行是输入,后面是输出:

scale=6000
1/998001
.0000010020030040050060070080090100110120130140150160170180190200210\
22023024025026027028029030031032033034035036037038039040041042043044\
04504604704804905005105205305405505605705805906006106206306406506606\
70680690700710720730740750760770780790800810820830840850860870880890\
90091092093094095096097098099100101102103104105106107108109110111112\
11311411511611711811912012112212312412512612712812913013113213313413\
51361371381391401411421431441451461471481491501511521531541551561571\
58159160161162163164165166167168169170171172173174175176177178179180\
18118218318418518618718818919019119219319419519619719819920020120220\
32042052062072082092102112122132142152162172182192202212222232242252\
26227228229230231232233234235236237238239240241242243244245246247248\
24925025125225325425525625725825926026126226326426526626726826927027\
12722732742752762772782792802812822832842852862872882892902912922932\
94295296297298299300301302303304305306307308309310311312313314315316\
31731831932032132232332432532632732832933033133233333433533633733833\
93403413423433443453463473483493503513523533543553563573583593603613\
62363364365366367368369370371372373374375376377378379380381382383384\
38538638738838939039139239339439539639739839940040140240340440540640\
74084094104114124134144154164174184194204214224234244254264274284294\
30431432433434435436437438439440441442443444445446447448449450451452\
45345445545645745845946046146246346446546646746846947047147247347447\
54764774784794804814824834844854864874884894904914924934944954964974\
98499500501502503504505506507508509510511512513514515516517518519520\
52152252352452552652752852953053153253353453553653753853954054154254\
35445455465475485495505515525535545555565575585595605615625635645655\
66567568569570571572573574575576577578579580581582583584585586587588\
58959059159259359459559659759859960060160260360460560660760860961061\
16126136146156166176186196206216226236246256266276286296306316326336\
34635636637638639640641642643644645646647648649650651652653654655656\
65765865966066166266366466566666766866967067167267367467567667767867\
96806816826836846856866876886896906916926936946956966976986997007017\
02703704705706707708709710711712713714715716717718719720721722723724\
72572672772872973073173273373473573673773873974074174274374474574674\
77487497507517527537547557567577587597607617627637647657667677687697\
70771772773774775776777778779780781782783784785786787788789790791792\
79379479579679779879980080180280380480580680780880981081181281381481\
58168178188198208218228238248258268278288298308318328338348358368378\
38839840841842843844845846847848849850851852853854855856857858859860\
86186286386486586686786886987087187287387487587687787887988088188288\
38848858868878888898908918928938948958968978988999009019029039049059\
06907908909910911912913914915916917918919920921922923924925926927928\
92993093193293393493593693793893994094194294394494594694794894995095\
19529539549559569579589599609619629639649659669679689699709719729739\
74975976977978979980981982983984985986987988989990991992993994995996\
99799900000100200300400500600700800901001101201301401501601701801902\
00210220230240250260270280290300310320330340350360370380390400410420\
43044045046047048049050051052053054055056057058059060061062063064065\
06606706806907007107207307407507607707807908008108208308408508608708\
80890900910920930940950960970980991001011021031041051061071081091101\
11112113114115116117118119120121122123124125126127128129130131132133\
13413513613713813914014114214314414514614714814915015115215315415515\
61571581591601611621631641651661671681691701711721731741751761771781\
79180181182183184185186187188189190191192193194195196197198199200201\
20220320420520620720820921021121221321421521621721821922022122222322\
42252262272282292302312322332342352362372382392402412422432442452462\
47248249250251252253254255256257258259260261262263264265266267268269\
27027127227327427527627727827928028128228328428528628728828929029129\
22932942952962972982993003013023033043053063073083093103113123133143\
15316317318319320321322323324325326327328329330331332333334335336337\
33833934034134234334434534634734834935035135235335435535635735835936\
03613623633643653663673683693703713723733743753763773783793803813823\
83384385386387388389390391392393394395396397398399400401402403404405\
40640740840941041141241341441541641741841942042142242342442542642742\
84294304314324334344354364374384394404414424434444454464474484494504\
51452453454455456457458459460461462463464465466467468469470471472473\
47447547647747847948048148248348448548648748848949049149249349449549\
64974984995005015025035045055065075085095105115125135145155165175185\
19520521522523524525526527528529530531532533534535536537538539540541\
54254354454554654754854955055155255355455555655755855956056156256356\
45655665675685695705715725735745755765775785795805815825835845855865\
87588589590591592593594595596597598599600601602603604605606607608609\
61061161261361461561661761861962062162262362462562662762862963063163\
26336346356366376386396406416426436446456466476486496506516526536546\
55656657658659660661662663664665666667668669670671672673674675676677\
67867968068168268368468568668768868969069169269369469569669769869970\
07017027037047057067077087097107117127137147157167177187197207217227\
23724725726727728729730731732733734735736737738739740741742743744745\
74674774874975075175275375475575675775875976076176276376476576676776\
87697707717727737747757767777787797807817827837847857867877887897907\
91792793794795796797798799800801802803804805806807808809810811812813\
81481581681781881982082182282382482582682782882983083183283383483583\
68378388398408418428438448458468478488498508518528538548558568578588\
59860861862863864865866867868869870871872873874875876877878879880881\
88288388488588688788888989089189289389489589689789889990090190290390\
49059069079089099109119129139149159169179189199209219229239249259269\
27928929930931932933934935936937938939940941942943944945946947948949\
95095195295395495595695795895996096196296396496596696796896997097197\
29739749759769779789799809819829839849859869879889899909919929939949\
95996997999000001

我用 Vim 做一些简单的处理,只保留小数点后部分,得到每三个数字一行的格式:

:%s/\\\n//g
:s/\(\d\d\d\)/\1\r/g

用下面的 Ex 命令(Vimscript) 可以验证序列的连续递增性:

let i = 1
while i < 1000
    if (i - 1) != str2nr(getline(i), 10)
        echo i
    endif
    let i = i + 1
endwhile

你会发现中间缺少且只缺少一个 998…

一般的计算器会截断小数结果。Octave 里直接 printf 格式化输出也得不到这么长的结果。如果你使用其他工具可以得到足够长的结果,不妨把方法告诉我。

1月 262012
 

CSS 是 web 设计中非常重要的一部分。CSS 也非常的强大,通过指定 media 类型,可以为不同的显示设备指定不同的显示样式。CSS2 可以识别的 media 类型中有屏幕显示(screen)、打印版本(print)、投影仪(projection) 等, 而且不止这些,参见这里。 可以期望 CSS3 会引入更多的 media 类型(比如 3D 眼镜?)。如果 media 类型是 all,则意味着 CSS 文件适合各种设备。这也是缺省设置,未指定特定 media 类型的样式规则会适用于所有设备。

可以在 HTML 文件中指定 CSS 文件适合的 media 类型:

<link href="style1.css" rel="stylesheet" media="all" type="text/css" />
<link href="print.css" rel="stylesheet" media="print" type="text/css" />

不过这样浏览器需要请求多个 CSS 文件,有人担心可能引起性能问题。 我们还有另外一种方式在一个 CSS 文件中为不同的 media 指定不同的样式规则。 例如下面的 CSS 代码使得页面字体无衬线且比较大,适合如今的电脑屏幕; 而打印版本使用 12pt 的带衬线字体,且指定白底黑字,适于打印。

@media screen {
    body {
        font-family: sans-serif;
        font-size: 16px;
    }
}
@media print {
    body {
        font-family: serif;
        font-size: 12pt;
        background-color: white;
        color: black;
    }
}

关于适合打印的 CSS 设计,alistapartmeyerweb 有不错的介绍。

CSS 指定 media 类型时还支持带逻辑运算的高级选择, 通过它可以更精细地为不同屏幕大小指定不同的样式,以更好地设计网页。 下面是一个来自 CSS-Tricks 的例子:

@media all and (max-width: 699px) and (min-width: 520px), (min-width: 1151px) {
  body {
    background: #ccc;
  }
}

其中 and 是逻辑与,逗号代表逻辑或。此外 not 也可以使用。更多的介绍参见 CSS-Tricks,事实上我还没有用到这个高级功能。

CSS 标准中有关于分页媒质特有属性和选择器 (selector) 的介绍, 然而我试图使用 :first 选择器时发现在 Firefox 9 中并不好使,原因不详。

1月 252012
 

我曾经在 Ubuntu 系统上听到过(很响亮的) 终端响铃,但并没有在 Fedora 下听到过,无论是 GNOME 2(Metacity), Compiz, Fvwm 还是 Gnome Shell。今天由于想实验这里的程序, 我着实希望终端响铃可以工作。

无奈的是,最初 Google "linux terminal bell" 相关内容,大多是介绍关闭终端响铃 的文章。不过,后面终于看到了相关的帖子:列表讨论Bugzilla 讨论

最终,我根据 Bugzilla 讨论中第 34 楼 Paul Egan 的描述,(部分)解决了问题。 (感谢他!)下面是简要描述:

在终端下执行

pactl upload-sample /usr/share/sounds/gnome/default/alerts/glass.ogg bell
pactl load-module module-x11-bell sample=bell

然后测试

echo -e "\a"

正常的话,可以听到 glass.ogg 的玻璃声了。在终端 Tab 有不唯一的补全结果时, 在 Vim 中一行行尾处按 l 企图向右移动时,都有同样的报警声。注意这里的报警声 并非旧式的终端响铃(单音beep),而是用 glass.ogg 替代。

讨论内容很有意义,事实上最开始很难相信这是和 PulseAudio、窗口管理器/桌面环境有关的问题。具体是谁的 bug?呃,PulseAudio 开发者表示这应该是在客户端(桌面环境)做(类似 Metacity 的做法),Xfce 开发者则认为这不是他们的问题 ╮(╯_╰)╭

我用的是 Fvwm 窗口管理器,作为窗口管理器用户,解决问题最好的方式还是自己来了。Fvwm 用户可以在配置文件 (~/.fvwm/config) 中的 InitFunction 中添加两行,以在初始时自动执行上面两条命令,基本解决没有响铃的问题。

DestroyFunc InitFunction
AddToFunc InitFunction
# others
+ I Exec exec pactl upload-sample /usr/share/sounds/gnome/default/alerts/glass.ogg bell
+ I Exec exec pactl load-module module-x11-bell sample=bell
# others

事实上,在之前我搜索中,看到有人提到在 Debian 上启用 pcspkr 模块 即可解决问题。然后在我的 Fedora 16 这里,着实没有效果。

另外,在控制台终端 (Ctrl+Alt+F2) 下同样的测试则听不到报警声音,不知为何。

1月 242012
 

LWN 新闻时看到了 Linux 内核的一个本地提权漏洞。zx2c4 博客有详细介绍,强烈建议阅读。

源代码见这里,适合 Fedora 的版本在此。如果你只是想试试,下载下来源代码保存为 mempodipper.c,然后:

gcc mempodipper.c -o mempodipper
./mempodipper

然后在得到的新 shell 里:

sh-4.2# whoami
root

如果输出如上所示是 root,那么表明已经中枪了 😀

这个漏洞已经在 1 月 17 号被 Linus 在内核代码树修复,参见这里

Fedora 已经有新的内核更新解决这个问题,截止现在 (date -d "1970-01-01 1327392894 sec UTC") 已经出现在 testing 仓库, 但还没推送到 updates 仓库中。

1月 232012
 

有一本书叫 "Open Sources: Voices from the Open Source Revolution", 是一些开源界人士写的散文的集合,内容涉及社区精神、GNU 和 FSF、Linux 历史、 商业模式等等。我曾经在图书馆借阅出过一个影印版。 它在清华图书馆的逸夫馆外文图书借阅区,索书号是 TP31 FO61 2003

后来发现,书中文章都可以在 Oreilly 网站上看到,如这里是简介。

借助于 Gooogle,各篇文章也可以通过搜索得到。如想看 Larry Wall 有关 Perl 的 文章,使用如下去搜索即可:

perl site:http://oreilly.com/catalog/opensources/book/

然后你就可以发现,链接是 http://oreilly.com/catalog/opensources/book/larry.html

1月 222012
 

折腾 readline 时发现了几个问题。

当使用到上下左右箭头、PageUp/PageDown 等特殊键时,只能考虑用其 key sequence。怎么知道这个 sequence 呢?有两种方式,一是先按 Ctrl-v,然后按下未知sequence的键或键组合,如 Ctrl+UpArrow,这时对应的 sequence 会显示出来,

这其实是调用 bash readline 的 quote-insert 功能/命令。另一种方式是使用 read 命令(shell built-in),然后输入位置的键组合,然后其 sequence 也会打印出来。之后就可以写到 ~/.inputrc 里面了。这个要感谢这里的介绍

Ctrl-u 不能被可靠地重新绑定。因为它是底层 TTY 的编辑字符,bash 会将其绑定到对应的 readline 操作 unix-line-discard 上。参考 这个缓存。当初想重新绑定它是因为 bash 的手册页里示例将其绑定到了 universal-argument 自己也想这样做。后来想曲线救国,绑定到 Ctrl-i 上,然而 Ctrl-i 即 TAB,容易引起干扰。后面又试了 Ctrl-Meta-u,还是不行,于是作罢,安安心心用 Alt+数字的方式给 readline 命令输数字参数得了。

折腾下来的自定义 ~/.inputrc 文件,于是乎也没多少内容:

$ cat .inputrc
# Prev PageUp
"\e[5~": history-search-backward
# Next PageDown
"\e[6~": history-search-forward
# Write the string.
"\C-o": "> output"

# SEE ALSO
# http://code.google.com/p/iterm2/wiki/Keybindings#Escape_sequence_exploration
# You will learn that to get the key sequences of particular key stroke,
# use Ctrl+V (quoted insert) or read shell built-in.
# <Ctrl>+<Left arrow>
"\e[1;5D": backward-word
# <Ctrl>+<Right arrow>
"\e[1;5C": forward-word

# kill backward to the beginning
"\C-j": unix-line-discard

其实,有一些(许多?) readline 内置的键绑定也挺有趣,可能还很有用。例如 C-t, M-t 用来转置(翻转)两个字符或单词的前后位置。不过能否记住且熟练,实在不好说。

1月 072012
 

话说这篇貌似应该做第一篇的,但是被拖了好久。

新建 OpenShift 帐号时没有什么问题。之后是看指南创建域名(如我的就是 awesome)、应用(我这个叫 wp)。指南时给的是命令行的步骤,然而我发现 web 界面里有对应功能就直接在 web 界面做了,连 SSH 公钥上传也是在 web 界面弄的。这反而引出一个问题,默认命令行下建应用是会自动新建一对 SSH 密钥供 git push 使用的,但我直接复用了已有的密钥。所以,后来我需要查文档 express.conf(5),手写配置文件 ~/.openshift/express.conf 指定密钥文件。还好这不是个大问题。

之后我基本上就是参照 Blog moved to wordpress on openshift 这篇文章来下载 WordPress,捣鼓到 openshift 本地仓库,然后用 git 推送到云上。期间我还参考了一个 GitHub 上的示例,其中的 wp-config.php 文件对我很有帮助,直接使用 OPENSHIFT 定义了的环境变量看起来很不错。

这之后其实和 OpenShift 相关的事情就不多了,主要就是配置 WordPress 了。然而期间我发现了值得一提的是,本地的 git push 会把本地仓库推送到远端的 bare 仓库里(这一点很自然),同时还会重写远端应用目录下的 repo 目录(就是 www 服务的根目录)。似乎是覆盖式的重写,如果里面有不在仓库里的文件或目录,之后也会丢失。我是在 WordPress 管理里面更新插件安装中文包,然后经过 push 后发现这些都没了后,才怀疑并最终证实的。这也意味着,这个博客的更新,主题安装等都需要先在本地搞好、提交到本地的 git 仓库之后,通过 push 上去,才算可以使用,直接在 WordPress 管理界面更新、安装主题等都不可行(会被以后的 push 灭掉的)。更新:感谢 JunkFood 向我指出人们还提出了其他一些解决方案,如把插件主题目录做成到 $OPENSHIFT_DATA_DIR 中的软链接,或者在本地仓库里开 HTTP 服务更新后提交更改等,参见下方评论Github

1月 072012
 

上了(官方)中文版 WordPress。

主题换成了 Suffusion。这个主题缺省配置下竟然导航菜单是不显示的,得自定义去。还好这个主题用户貌似比较多,搜索到了一篇讲基本配置的文章。感谢它,现在有个正常的导航菜单了。温馨提示:在 “WordPress 外观 –> 菜单” 里自定义的菜单的名称不能是中文,否则显示不出来……