打开/关闭


2012 年祝你幸运

2012 年 January 22日 by 王 聪

2011 年马上就要过去了,回顾过去的一年,我发现最正确的决定就是离开北京。北京的空气污染已经到了非常严重的程度,奉劝各位能不去北京就别去,别拿自己的身体健康开玩笑。在这个神奇的国度,能让自己健康地活着本身就是一种很大的成功!

在 2011 年中,中华民族已经到了最坑爹的时候,所以在 2012 年里,祝愿大家都能有新鲜的空气呼吸,能有正常的牛奶喝,能有健康的食用油吃,能有一所房子不被强拆,能有个孩子是亲生的,能扶起老太不被讹,最关键的是,能让自己不被活埋!

虽然你仍然不可能像对岸一样能投上一票,但是你能选择离开。所以,有钱有本事的还是尽早移民吧!没本事的就好好练习游泳,游到对岸去!要自由从来都不丢人,“我们这儿”才丢人!

说了那么多,我觉得,在所有的新年祝福辞里,“祝你幸运”是最好的,也是最现实的祝福了。所以,祝你 2012 年幸运!

最后祝愿所有的五毛,全家都搬到朝鲜去,早日体会到社会主义的优越性!

2012 年,要幸福,更要自由。

扩展文件属性

2012 年 January 19日 by 王 聪

我们知道,在 Linux 上最基本的文件属性是,

# ls -l foo
-rw-r--r--. 1 root root 0 Jan 19 00:03 foo

可以通过chmod 命令来更改,ls -l 来查看。

除此之外,一些文件系统上还提供额外的属性,比如 ext4 提供了额外的属性,比如 append only (a), compressed (c), immutable (i) 等属性,这些属性可以通过 e2fsprogs 软件包提供的 chattr(1) 来改变,lsattr(1) 来查看。更多属性也可参考 chattr(1)。比如:

# chattr +i foo
# lsattr foo
----i--------e- foo

这个是和文件系统密切相关的,一是因为 chattr 来自 e2fsprogs,二是因为它调用的系统调用也是和文件系统相关的一个 ioctl,可以看下面 strace 的输出:

open("foo", O_RDONLY|O_NONBLOCK|O_LARGEFILE) = 3
ioctl(3, EXT2_IOC_SETFLAGS or EXT3_IOC_SETFLAGS or FIONCLEX, 0xfffc347335c) = 0
close(3)                                = 0

还有一种文件属性叫扩展文件属性,eXtended ATTRibutes,也就是通常所说的 xattr。和前一种相比,这个就不那么和文件系统密切相关了,但是仍然需要文件系统的支持。这个是通过系统调用 getxattr(2) 和 setxattr(2) 来实现的,对应的命令是 getfattr(1) 和 setfattr(1),来自 attr 软件包。看例子:

# mount -o remount,acl,user_xattr /home
# touch bar
# setfattr -n user.comment -v "this is a comment" bar
# getfattr bar
# file: bar
user.comment

# getfattr bar -n user.comment
# file: bar
user.comment="this is a comment"

需要注意两点:一,挂载时需要加 “user_xattr” 选项;二,name 是有命名空间的,并不是任何命名空间都可以,比如,

# setfattr -n my.comment -v "this is my comment" bar
setfattr: bar: Operation not supported

用户只能用 user.* 名字,而后面的 ACL 则会用 system.posix_acl_access。当然了,SELinux 也会用到 xattr,security.*。

基于此,ACL 实现了访问控制列表,也就是说,设置某些用户的文件权限不再依赖于用户所在的组了,省去了不少麻烦。对应的命令是 setfacl(1) 和 getfacl(1) ,来自 acl 软件包。从下面 strace 的输出,也可以看出它们确实是基于 xattr 的:

getxattr("foo", "system.posix_acl_access", 0xfffe455cca0, 132) = -1 ENODATA (No data available)
stat("foo", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
setxattr("foo", "system.posix_acl_access", "\x02\x00\x00\x00\x01\x00\x06\x00\xff\xff\xff\xff\x02\x00\x06\x00\x00\x00\x00\x00\x04\x00\x04\x00\xff\xff\xff\xff\x10\x00\x06\x00\xff\xff\xff\xff \x00\x04\x00\xff\xff\xff\xff", 44, 0) = -1 EPERM (Operation not permitted)

之所以出现 ENODATA 是因为挂载文件系统时我没有指定”acl”,需要重新挂载:mount -o remount,acl /home 然后重新创建文件,因为旧的文件依旧是没有 ACL的。

抵制 SOPA

2012 年 January 18日 by 王 聪

世界上最遥远的距离不是生与死,而是人家那儿都开始抵制 SOPA 了,组建盗版党了,我们这儿(张绍刚同志对此有贡献)还在热火朝天地搞 GFW 呢!

下面是几大网站今天的首页,最后一张截图最能说明问题!

gnu.org (标题变成了01000100010010010100011101001001010101000100000101001100)

wikipedia.org

fedoraproject.org

reddit.com

wordpress.org

kindle 相关

2012 年 January 9日 by 王 聪

上周末在淘宝上拍了一个 Kindle DXG,今天终于拿到手了。买之前做了大量的功课,经过了N次纠结之后最终敲定买 DXG。一是因为,我个人认为看书嘛,屏幕好一点儿很重要,DX 系列是大屏幕;二是,我感觉 WIFI 可有可无,我又没打算拿它当 fire 用,而且自带的 3G 是免费的。所以最后选择了 Kindle DXG。

网上有很多写 kindle 的文章,我就不再啰嗦了,把我看的一些文章整理一下和大家分享。

1. 出手前对比:

Compare Kindles:www.amazon.com/gp/product/B002Y27P3M/ref=sv_kinh_0
Kindle 3 vs. Kindle DXG:http://www.conanblog.me/life/kindle-3-vs-kindle-dxg/
入手了个Kindle:http://www.xuwenhao.com/2011/06/08/bought-a-kindle-and-ideas-on-ebook/
入手Kindle Fire,简单评测:http://jayshao.com/kindle-fire/
关于入手kindle一记:http://blog.yousri.org/2011/12/07/something-about-buying-kindle.html
玩物不能丧志——Kindle Fire手记:http://www.baizhiheizi.com/archives/497
入手 Kindle:http://blog.solrex.org/articles/bought-a-kindle.html
没有3G的Kindle是残缺的,不推荐国人买纯WIFI版:http://www.v2ex.com/t/10062

2. 购买:

我是在老大推荐的一个淘宝店买的:http://5friends.taobao.com/

其它店铺请自行搜索。

3. 越狱和汉化:

Kindle DXG 完美中文支持:http://www.conanblog.me/it/kindle-dxg-perfect-font-hack/
Kindle DXG 汉化:http://hardywang.wordpress.com/2011/12/25/kindle-dxg-%E6%B1%89%E5%8C%96/
Kindle 全型号、全版本,汉化升级包 完全防呆 完美功能 终结版: http://is.gd/cFAy5A
Kindle Touch 5.0系统越狱:http://irising.me/2011/12/12591/

4. 各种折腾:

Kindle 3注册全过程:http://www.hiadmin.org/shares/kindle3/
Kindle-DXG升级到3.2.1的好处:http://laoyang.info/why-you-should-update-kindle-dxg-to-3-2-1/
如何用Kindle看RSS:http://laoyang.info/kindle-rss/
推荐多看系统 for Kindle DXG:http://zhiqiang.org/blog/it/duokan-for-kindle-dxg.html

5. Kindle 电子书:

Kindle电子书搜索:http://forfrigg.com/
kindle专用搜索工具:http://kindle.youliao.org/
Free Kindle Books:http://blog.booksontheknob.org/p/kindle-free-reads-list.html
iKindle:http://ikindle.mobi/
Kindle4RSS:http://kindle4rss.com/
读览天下:http://www.dooland.com/

6. Kindle 论坛:

豆瓣小组:http://www.douban.com/group/Kindle/
电子书论坛:http://bbs.mydoo.cn/forum.php?mod=forumdisplay&fid=28&page=1
多看论坛:http://bbs.duokan.com/forum/
Hi! PDA:http://www.hi-pda.com/forum/

洱海,2011年12月9日

2011 年 December 23日 by 王 聪

这次骑车环洱海的时候天空多云,本以为不会看到太漂亮的景色,没想到正好看到阳光透过云层洒向湖面,犹如仙境一般。。。

C 语言新标准——C11

2011 年 December 21日 by 王 聪

12月8号,ISO 发布了新的 C 语言的新标准——C11,之前被称为C1X,官方名称 ISO/IEC 9899:2011。新的标准可以这里下载。这个标准是基于今年4月发布的名为 N1570 的草稿,但据说并未做任何改动。

根据 wikipedia 记载,相比 C99,C11 做了以下重要的更新:

1. 对齐处理操作符 alignof,函数 aligned_alloc(),以及 头文件 <stdalign.h>。见 7.15 节。

2. _Noreturn 函数标记,类似于 gcc 的 __attribute__((noreturn))。例子:

	_Noreturn void thrd_exit(int res);

3. _Generic 关键词,有点儿类似于 gcc 的 typeof。例子:

#define cbrt(X) _Generic((X), long double: cbrtl, \
                              default: cbrt, \
                              float: cbrtf)(X)

4. 静态断言( static assertions),_Static_assert(),在解释 #if 和 #error 之后被处理。例子:

	_Static_assert(FOO > 0, "FOO has a wrong value");

5. 删除了 gets() 函数,C99中已经将此函数被标记为过时,推荐新的替代函数 gets_s()。

6. 新的 fopen() 模式,(“…x”)。类似 POSIX 中的 O_CREAT|O_EXCL,在文件锁中比较常用。

7. 匿名结构体/联合体,这个早已经在 gcc 中了,我们并不陌生,定义在 6.7.2.1 p13。

8. 多线程支持,包括:_Thread_local,头文件 <threads.h>,里面包含线程的创建和管理函数(比如 thrd_create(),thrd_exit()),mutex (比如 mtx_lock(),mtx_unlock())等等,更多内容清参考 7.26 节。

9. _Atomic类型修饰符和 头文件 <stdatomic.h>,见 7.17 节。

10. 带边界检查(Bounds-checking)的函数接口,定义了新的安全的函数,例如 fopen_s(),strcat_s() 等等。更多参考 Annex K。

11. 改进的 Unicode 支持,新的头文件 <uchar.h> 等。

12. 新增 quick_exit() 函数,作为第三种终止程序的方式,当 exit() 失败时可以做最少的清理工作(deinitializition),具体见 7.22.4.7。

13. 创建复数的宏, CMPLX(),见 7.3.9.3。

14. 更多浮点数处理的宏 (More macros for querying the characteristics of floating point types, concerning subnormal floating point numbers and the number of decimal digits the type is able to store)。

15. struct timespec 成为 time.h 的一部分,以及宏 TIME_UTC,函数 timespec_get()。

gcc 4.6 中新增了新的选项 -std=c1x 来支持这一标准,更多支持参考这里。但是 glibc 相关的部分尚未实现,所以你还不能马上在 Linux 上体验最新的 C11 特性。

Polyglot

2011 年 December 17日 by 王 聪

可能你之前也见过这种程序:它是用两种以上的编程语言写成,可以不经修改作为两种语言编译/解释。今天在 wikipedia 上看到了它的定义

In computing, a polyglot is a computer program or script written in a valid form of multiple programming languages, which performs the same operations or output independent of the programming language used to compile or interpret it.

之前见过的用2种语言写的 Polyglot 简直弱爆了,这里有用至少6种语言写成的 Polyglot:

http://ideology.com.au/polyglot/ (8种语言)
http://mauke.dyndns.org/stuff/poly.poly (16种语言!原链接不能用,我备份了一下。)

更多的 Polyglot:

http://www.nyx.net/~gthompso/poly/polyglot.htm

在窗口中显示X桌面

2011 年 December 16日 by 王 聪

最近在鼓捣 awesome 的时候看到这么一个脚本,可以在 gnome (或其它任何桌面) 的窗口中显示 X 桌面,这样以来测试 awesome 的配置就很方便了!Xephyr 真是个好东西啊!

BASH:
  1. #!/bin/sh
  2. ##
  3. ## test.sh
  4. ## Login : <ctaf@ctaf-maptop>
  5. ## Started on  Thu Sep  3 15:29:14 2009 Cedric GESTES
  6. ## $Id$
  7. ##
  8. ## Author(s):
  9. ##  - Cedric GESTES <ctaf42@gmail.com>
  10. ##
  11. ## Copyright (C) 2009 Cedric GESTES
  12. ## This program is free software; you can redistribute it and/or modify
  13. ## it under the terms of the GNU General Public License as published by
  14. ## the Free Software Foundation; either version 3 of the License, or
  15. ## (at your option) any later version.
  16. ##
  17. ## This program is distributed in the hope that it will be useful,
  18. ## but WITHOUT ANY WARRANTY; without even the implied warranty of
  19. ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  20. ## GNU General Public License for more details.
  21. ##
  22. ## You should have received a copy of the GNU General Public License
  23. ## along with this program; if not, write to the Free Software
  24. ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  25. ##
  26.  
  27. Xephyr -ac -br -noreset -screen 800x600 :1 &
  28. sleep 1
  29. DISPLAY=:1.0 awesome -c ~/.config/awesome/rc.lua

再遇 bash 引号问题

2011 年 December 8日 by 王 聪

最近在工作中再次遇到引号的问题,与以往不同,这次这个更加棘手。

问题是这样的:我要在某个 bash 脚本中调用某个命令,根据配置文件来决定应该传递哪些参数给调用的那个命令。而且,该命令的其中一个参数中带有空格,所以必须使用双引号把这一参数作为整体传递进去。你可以试一下,无论怎么使用引号都无法解决这个问题。

最后,我在 Bash FAQ 中找到了答案!解决方法是,把该命令的每一个参数作为 bash 数组的一个元素,最后用 "${args[@]}" 一起传递给该命令即可!

另,Bash FAQ 质量非常高,强烈推荐认真读一下。

显示 shell 函数定义

2011 年 December 1日 by 王 聪

我们知道在 bash/zsh 中可以用 "typeset -f" 来显示某个函数的定义。如果不用这个内置命令的话我们应该怎么显示函数定义呢?

下面这个技巧就可以用来显示函数定义:

BASH:
  1. #!/bin/bash
  2.  
  3. def() {
  4.   eval "$1() $2"
  5.   eval "function_$1=\"\$1() \$2\""
  6. }
  7.  
  8. def foo '{
  9.  echo bar
  10. }'

其中 foo 是定义的函数,$function_foo 是函数 foo 的定义。不过缺点也很明显,每次定义函数必须使用"def",而且后面用的单引号也是个问题。