delphij's Chaos
选择chaos这个词是因为~~实在很难找到一个更合适的词来形容这儿了……
Ruby 从下一个版本,也就是 1.9.3 开始,从原先的 GPLv2 许可证换成了 2-clause BSD 许可证(大体上相当于 MIT 许可证)。
早期 Ruby 采用的是自由软件基金会推荐的 GPLv2 or later 许可证方式。在实际操作中这种许可方式十分常见,这种许可证方式包含两层意思:
这其中 (*) 的部分实际上是开给自由软件基金会的一张空白支票,并且可能导致各式各样的法律问题。据我个人的了解,湾区企业的法务部门通常不允许公司以这种方式发布软件,因而,商业公司在使用 GPLv2 or later 许可证的软件时,通常会在发布代码的同时明确说明自己在使用这个软件时只遵循某个特定版本的GPL,以规避潜在的法律风险:
/*
* [company] elects to have and use the contents of [filename] under and governed
* by the GNU General Public License (GPL) Version 2, only. However, the following
* notice accompanied the original version of this file:
*/
然而,实际上这样使用代码也是有风险的。例如,如此这家厂商便无法同时使用 GPLv3 许可证的代码。因为GPLv2 中规定:
Read more...最近改一个用到 OpenSSL 的程序,顺手用 valgrind 抓了一下,发现很多"Conditional jump or move depends on uninitialised value(s)“的错误。发现 OpenSSL 的 FAQ 提到,在生成随机数时会将输入缓冲区(未初始化)的内容直接混入 entropy pool,使用 valgrind 时便会导致警告。
如果这种警告对调试产生困扰,则可以定义 PURIFY 来消除(从代码来看,PURIFY一共影响三处代码:crypto/rand/md_rand.c中,定义PURIFY会去掉将未初始化缓冲区作为输入参数追加到摘要中的过程;crypto/rand/randfile.c中一处在定义了 PURIFY 时会对 stat(2) 结构先进行清零初始化【这个对 FreeBSD 不是问题,FreeBSD的 stat(2) 覆盖整个返回缓冲区】,另一处则是不用缓冲区中未初始化的部分参与摘要追加。
理论上,定义了PURIFY会降低随机数生成过程的随机性,但会消除事先通过特定输入来影响某些内存内容导致对随机数发生结果的影响;不过因为有其他输入,因此这种影响导致的结果应该并不严重。不过,原则上安全程序应该尽量使用更多的 entropy 输入,而不是依赖这种不确定性吧?
Read more...今天同事跑来问我为什么没办法checkout一个子目录,发现svn提示说某个目录已有既有的、未有版本的副本(这是一个新的checkout)。
删除重新checkout,问题依旧。
检查之前的commit log,发现另外有人 svn rm 掉了 .svn 目录(看起来那个目录的内容是从其它地方复制过来)。
因为没有 svn 库本身的操作权限,也没有联系到事主(正规的做法是想办法干掉这个revision),所以尝试了下面的方法:
这样一来就可以checkout和正常操作了。不过,为什么 svn 会允许导入或删除 .svn 目录呢?哪位大牛帮忙解释一下?
Read more...intron 因任满卸任,现水木社区的 FreeBSD 版需要一名版主。哪位去申请一下?
Read more...长久不做 SA,所以有些事情变得没有以前那么敏感。昨天终于还是出事了,不过幸亏不是商业系统,如果是的话,我觉得绝对够得上是重大事故。记一笔,留个教训。
简而言之,我自己的一个有邮件服务的域名,在通过 GoDaddy 的系统修改授权域名服务器的时候出了问题。这个问题应该是 GoDaddy 的 bug 导致的,但结果很严重,那个域名的 glue 记录被全部清空了。事后检查 whois 记录看到的状态如此:
Domain ID:D104XXXXXX-LROR
Domain Name:XXXXXXXXXX
Created On:XX-XX-XXXX XX:XX:XX UTC
Last Updated On:07-Jul-2011 XX:XX:XX UTC
Expiration Date:XX-XXX-XXXX XX:XX:XX UTC
Sponsoring Registrar:GoDaddy.com, Inc. (R91-LROR)
Status:CLIENT DELETE PROHIBITED
Status:CLIENT RENEW PROHIBITED
Status:CLIENT TRANSFER PROHIBITED
Status:CLIENT UPDATE PROHIBITED
Registrant ID:CR29XXXXX
Registrant Name:Xin LI
[...]
Tech FAX:
Tech FAX Ext.:
Tech Email:XXXXXXXXXXXXXXXXXXX
__Name Server:Name Server:Name Server:Name Server:Name Server:Name Server:Name Server:Name Server:Name Server:Name Server:Name Server:Name Server:Name Server:__
DNSSEC:Unsigned
对邮件系统来说,发生这种情况的后果是极其严重的。根据 RFC 5321,邮件系统对于停机问题的容忍时间至少是数个小时,然而当域名解析出现问题时,通常系统有理由立即以 4yz 回应来拒绝未进入邮件队列的邮件。所幸的是这个问题持续的时间不算太久,而且这个域名只是一个备用的邮件域名。
Read more...在 /etc/sysctl.conf 中加入:
kern.sched.preempt_thresh=224
然后用 /etc/rc.d/sysctl start 或重启系统令其生效。
系统默认的值是 80,表示只有新优先级 < 80 时才允许抢占;224 表示非空闲线程均可以进行抢占。这样做的结果是系统会产生更多的切换,从而改善响应时间(牺牲吞吐量)。对桌面系统来说,这种设置是很有用的。
Read more...基于 LLVM 的一个 小检查器。如果代码经手人很多,或者经过了大规模的改写,这个工具就很有用了。使用说明 在此。
Read more...在开始创建 git 代码库的时候,应使用 –bare 参数。举例:
git init --bare [repo_path]
或者,如果多人开发的话:
git init --bare --shared [repo_path]
将现有代码库转换为中心式代码库:
cd /path/to/repo
mv .git ../repo.git
cd ../repo.git
git config core.bare true
rm -fr ../repo
注意,已有的克隆需要修改配置以适应新的路径。
UPDATE: 有同学问为什么不用 clone –bare,答案是为了偷懒保留配置的内容,比如 hook 等等,另一方面这样做会导致已有的其他clone失效。
Read more...syslogd 的 -8 参数可以让汉字通过。以下摘自 manual page:
-8 Tells syslogd not to interfere with 8-bit data. Normally syslogd
will replace C1 control characters (ISO 8859 and Unicode
characters) with their "M-x" equivalent. Note, this option does
not change the way syslogd alters control characters (see
iscntrl(3)). They will always be replaced with their "^x" equiv‐
alent.
不过这事有点坑人,为啥默认不 -8 呢?出于安全方面的原因吗?差点就开始改代码了……
Read more...今天 强迫症 朱小瘦同学提到一个非常有意思的问题,一个32bit的无符号整数算术右移32个bit应该得多少?
我们知道算术右移一个bit相当于除2,所以一个32bit无符号整数除以 2^32,理论上,应该得0。
然而事实不是这样。测试显示在 x86 系统上,一个32bit无符号整数算术右移32个bit之后得到的是原数。例如下面这个测试程序:
#include <stdio.h>
int
main(void /* int argc, char **argv */)
{
unsigned int a = 0x5a5a5a5a;
a >>= 32;
printf("%x\n", a);
return 0;
}
不启用任何优化的话,编译出来的程序得到的结果是:
5a5a5a5a
更进一步,我们将上面的测试改写为:
#include <stdio.h>
int
main(void /* int argc, char **argv */)
{
unsigned int a = 0x5a5a5a5a;
int i;
for (i=0; i<33; i++)
printf("%x\n", a >> i);
return 0;
}