2011 年马上就要过去了,回顾过去的一年,我发现最正确的决定就是离开北京。北京的空气污染已经到了非常严重的程度,奉劝各位能不去北京就别去,别拿自己的身体健康开玩笑。在这个神奇的国度,能让自己健康地活着本身就是一种很大的成功!
在 2011 年中,中华民族已经到了最坑爹的时候,所以在 2012 年里,祝愿大家都能有新鲜的空气呼吸,能有正常的牛奶喝,能有健康的食用油吃,能有一所房子不被强拆,能有个孩子是亲生的,能扶起老太不被讹,最关键的是,能让自己不被活埋!
虽然你仍然不可能像对岸一样能投上一票,但是你能选择离开。所以,有钱有本事的还是尽早移民吧!没本事的就好好练习游泳,游到对岸去!要自由从来都不丢人,“我们这儿”才丢人!
说了那么多,我觉得,在所有的新年祝福辞里,“祝你幸运”是最好的,也是最现实的祝福了。所以,祝你 2012 年幸运!
最后祝愿所有的五毛,全家都搬到朝鲜去,早日体会到社会主义的优越性!
2012 年,要幸福,更要自由。
我们知道,在 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 了,组建盗版党了,我们这儿(张绍刚同志对此有贡献)还在热火朝天地搞 GFW 呢!
下面是几大网站今天的首页,最后一张截图最能说明问题!
gnu.org (标题变成了01000100010010010100011101001001010101000100000101001100)


wikipedia.org

fedoraproject.org

reddit.com

wordpress.org


这次骑车环洱海的时候天空多云,本以为不会看到太漂亮的景色,没想到正好看到阳光透过云层洒向湖面,犹如仙境一般。。。
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 特性。
可能你之前也见过这种程序:它是用两种以上的编程语言写成,可以不经修改作为两种语言编译/解释。今天在 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
最近在鼓捣 awesome 的时候看到这么一个脚本,可以在 gnome (或其它任何桌面) 的窗口中显示 X 桌面,这样以来测试 awesome 的配置就很方便了!Xephyr 真是个好东西啊!
BASH:
-
#!/bin/sh
-
##
-
## test.sh
-
## Login : <ctaf@ctaf-maptop>
-
## Started on Thu Sep 3 15:29:14 2009 Cedric GESTES
-
## $Id$
-
##
-
## Author(s):
-
## - Cedric GESTES <ctaf42@gmail.com>
-
##
-
## Copyright (C) 2009 Cedric GESTES
-
## This program is free software; you can redistribute it and/or modify
-
## it under the terms of the GNU General Public License as published by
-
## the Free Software Foundation; either version 3 of the License, or
-
## (at your option) any later version.
-
##
-
## This program is distributed in the hope that it will be useful,
-
## but WITHOUT ANY WARRANTY; without even the implied warranty of
-
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-
## GNU General Public License for more details.
-
##
-
## You should have received a copy of the GNU General Public License
-
## along with this program; if not, write to the Free Software
-
## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
##
-
-
Xephyr -ac -br -noreset -screen 800x600 :1 &
-
sleep 1
-
DISPLAY=:1.0 awesome -c ~/.config/awesome/rc.lua
最近在工作中再次遇到引号的问题,与以往不同,这次这个更加棘手。
问题是这样的:我要在某个 bash 脚本中调用某个命令,根据配置文件来决定应该传递哪些参数给调用的那个命令。而且,该命令的其中一个参数中带有空格,所以必须使用双引号把这一参数作为整体传递进去。你可以试一下,无论怎么使用引号都无法解决这个问题。
最后,我在 Bash FAQ 中找到了答案!解决方法是,把该命令的每一个参数作为 bash 数组的一个元素,最后用 "${args[@]}" 一起传递给该命令即可!
另,Bash FAQ 质量非常高,强烈推荐认真读一下。
我们知道在 bash/zsh 中可以用 "typeset -f" 来显示某个函数的定义。如果不用这个内置命令的话我们应该怎么显示函数定义呢?
下面这个技巧就可以用来显示函数定义:
BASH:
-
#!/bin/bash
-
-
def() {
-
eval "$1() $2"
-
eval "function_$1=\"\$1() \$2\""
-
}
-
-
def foo '{
-
echo bar
-
}'
其中 foo 是定义的函数,$function_foo 是函数 foo 的定义。不过缺点也很明显,每次定义函数必须使用"def",而且后面用的单引号也是个问题。