Uniqpass:一个为你生成安全密码的 Chrome 扩展
为了对抗腾讯/人人/新浪等等开放平台通过网站互联方式,联合登录帐号,CSDN突破创新的底线,一夜之间发布了开放平台,使得所有网站都可以迅速实现“使用CSDN帐号登录”功能
Twitter 上的 @kgen 调侃道
假设你在所有的网站都使用同样的密码,而恰巧又存在一个不坏好意的人,他只需 grep 一下名为”www.csdn.net.sql” 的文件,就可以轻松地找出你的密码,然后大大方方地查看你的相册,取走你银行卡里的钱,然后以你的名义向老板发一封邮件,主题是:“奶奶的,老子不干了”…
事实是在这次的密码泄露风波中上面的情况或多或少的已经发生了:许多人丢失了最重要的 Gmail, Amazon,帐号。
显然,如果我们为不同的网站启用不同的密就可以避免上述悲剧的发生,但这样记忆的负担实在太重。换一个思路就是我们可以只记住一个主密码,用它去生成一系列不同的密码,同时要保证不会由于其中一个密码的泄露导致其它的密码被反推出来。使用 MD5 Hash 函数对主密码与当前网站域名拼接后得到的字符串进行计算,就可以得到这样的密码。
发表于 2011-12-29 50 次浏览 留下你的评论
Brainfuck 编程指南
上个世纪 90 年代的时候,Urban Müller 打算为他新发明的语言写一个世界上最小的编译器。嗯,他做到了,编译器可执行文件的体积小到不可思议的 240 字节,几经优化,又减少到不足 200 字节。如你所料,这个编译器是为 Brainfuck 而写。
Brainfuck 基于一个简单的机器模型。这个机器模型仅有 8 条指令,但它与图灵机等价。理论上除”停机“这类问题外,任何一个可以计算的问题,都能用这几条指令的组合来解决。除了指令,这个机器模型还包括:两个以字节为单位、被初始化为零的数组(一个用于存放数据,另一个用于存放指令),两个指向数组的指针(一个指向数据数组,另一个指向指令数组)、以及用于输入输出的两个字节流。

发表于 2011-10-09 110 次浏览 留下你的评论
触碰上帝的指纹
Swift . J ——1773
等等,我引用这几行诗,并不是说右边的曼德布罗特分形就是大跳蚤在咬小跳蚤。但….它们确实很像。
曼德布罗特分形(Mandelbrot Fractal)的不可思议之处在于它具有无限的复杂度。每次将它放大,你都会看到更多的细节,这些细节与最初的形状相似,却不完全相同。这种无限的复杂度已经远远超出人类可以理解的范围,人们只能将其与上帝联系起来,猜测或许这就是他的指纹。
曼德布罗特分形的另外一个让人惊叹的地方在于,它的数学表示出奇地简单。
Z0 = 0
Zn+1 = Zn2 + C
假设复平面上的点 C 按上面的公式进行迭代,得到一个数列 {0, Z1, Z2…Zn },且 Zn 收敛一个有限的半径的话,那么这个点 C 就属于曼德布罗特集合(Mandelbrot Set)。将这个集合用图形的方式表示出来,就成为了我们所说的曼德布罗特分形
发表于 2011-09-26 309 次浏览 8 条评论
P versus NP
概述
P versus NP 问题是一个许多数学家、科学家,和程序员们都希望能够回答的问题。P 和 NP 代表两类数学问题。P 问题被认为是容易用计算机解决的,而 NP 问题仅仅是结果容易验证。比方说,你有一个 NP 问题,某个人说 “你那个问题的答案是 1234”,计算机可以迅速地算出这个答案是否正确,但要让它自己得出 1234 这个答案,可能要花很长时间。
所有的 P 问题都属于 NP 问题,因为很容易通过计算这个问题,并与之前的结果比较来判定结果是否正确。不过,人们想知道相反的情况:即是否存在不属于 P 问题的 NP 问题,亦或所有的 NP 问题都不是 P 问题,再或者所有的 NP 问题都是 P 问题?如果 NP 问题真的和 P 问题不是一类问题,那么意味着不论我们多么努力地去寻找,都不存在快速且简便的方法来解决 NP 问题,可如果所有的 NP 问题都是 P 问题,则意味着新的且快速的解决方法的确存在,只是我们还没有发现而已。
尽管付出大量努力,科学家和数学还没有找到解决 NP 问题的简单方法,许多人相信 NP 问题根本就不是 P 问题。大多数数学家也认同这一观点,但目前也没有人能够通过严密的数学分析证明这一点。假如真的证明 NP 和 P 问题是一样的,它会对我们生活的方方面面产生巨大影响。正是出于这个原因,P versus NP 问题成为一个重要且被广泛研究的课题。
发表于 2011-09-20 393 次浏览 4 条评论
神秘的 –> 运算符
StackOverflow 作为最大的编程问答社区,各种有趣的提问层出不穷,最近上面就有人问了这样一个问题:“这个运算符(–>)的名字是什么?”
读完《C++/STL中的隐藏特性与陷阱》后,我完全惊呆了,下面这段代码在 Visual Studio 2008 和 G++ 4.4 中都能编译通过。
#include <stdio.h> int main() { int x = 10; while( x --> 0 ) // x goes to 0 { printf("%d ", x); } }这个运算符来在哪个标准中提到了,它来自哪里?
我猜这是C语言中的,因为它在GCC中也能编译,客观地说我从来没有听说过它,有其它人听说过吗?它值得使用吗?
发表于 2011-09-18 200 次浏览 4 条评论
Godaddy 经典的 403 Error
昨天我决定将自己在 App Engine 上架设的博客迁移至 Godaddy 上的空间,重新上传图片,更新引用图片的URL,重新设置DNS解析,加上 GFW 从中作梗,整个过程颇费精力。
这些办妥之后,发现 Feed 地址不是 www.igeeks.me/feed,而是 www.igeeks.me/?feed=rss。Google 一番后得之,如果想使用前面那种美观的 URL 就需要在 WordPress 的控制面板中更改固定链接的格式。再次按指示操作。这次操作的时间似乎有点长。预示不祥的事要发生。果然重新刷新页面后,见到了下面情形
发表于 2011-09-18 147 次浏览 2 条评论
用Shell脚本实现划词翻译
Mac OS X 中有一项令人惊艳的特性—— “Services”,通过它你可以对选中内容进行各种操作。比如,你可以选中一段文字,将其添加到 Evernote 中;选中一个URL,用 Safari 打开它;再比如选中一个邮件地址,将其添加到联系人中去。
Linux 中没有与之直接对应的特性。但通过编程还是可以部分模拟出 Mac OS X 中的效果。直观的思路是 : 运行一个后台进程,它在桌面环境中创建“Services” 菜单,当用户从文档中选中一段文字,并点击 “Services“菜单时,后台进程分析出可用于处理选中内容的程序,以子菜单的形式将其展示出来,用户进一步点击子菜单时,后台进程负责将剪切板中的内容传递给指定的应用程序进行进一步处理。
为了验证这个思路,我用 shell 在Gnome3桌面环境中做了一个原型。功能很简单,当用户选中文档中一个单词后,以系统通知的方式显示该单词的释义。
来张效果图,看起来蛮不错。
发表于 2011-08-28 203 次浏览 2 条评论
上帝用Lisp书写世界
发表于 2011-08-14 125 次浏览 留下你的评论
ack:一个更好的 grep
grep 是个恪职尽守的好程序,只是有时它知道的太多了,它会报告 .svn 目录下发现1000+ 个匹配,100+ 个二进制文件内含有目标字符串,还有 … 还有5个文件无法成功读取 …
幸好世界上还有另外一个程序叫 ack。它可以解决程序员们的烦恼。在搜索字符串时它会跳过.svn目录,忽略二进制文件。按其作者的说法,99% 的情况下,你都不需要再碰 grep了。

发表于 2011-07-20 138 次浏览 留下你的评论
寻找延迟最小的IP地址
我们都知道使用用ping命令可以获取自己的机器与目的地址之间的延迟,但ping命令一次只能测试一个IP地址,如果手头有许多IP地址,想将它们按延迟大小进行排序,就得自己动手写脚本了。
下面是名为rankip.sh的bash脚本,实现了按延迟大小排序IP地址的功能。
#!/bin/bash
dir=/dev/shm/rank
if [ -e $dir ]; then
rm -rf $dir
fi
mkdir $dir
while read ip
do
if [ $ip ]; then
ping -q -c 5 $ip > $dir/$ip &
fi
shift
# 防止同时启动过多进程
sleep 0.1
done
wait
for ip in $(ls $dir)
do
fullpath=$dir/$ip
avg=$(tail -n1 $fullpath | sed 's#(.*/){4}(.*)/.*/.*#2#g')
echo -e "${ip} t ${avg}ms" >> $dir/result.txt
done
sort -k2n $dir/result.txt
使用方法超级很简单:
cat <file-contain-ips> | rankip.sh
PS:
对于完成如此简单的功能来说,上面的代码似乎太多了。于是我又试着将其改写了一下,这次只有一行代码。
#!/bin/bash
cat | xargs -n1 -P10 ping -q -c 5 | awk 'BEGIN{RS="PING"; FS="n"} { print gensub(/^ (.*) (.*$/, "\1", 1, $1), "t", gensub("^.*= .*/(.*)/.*/.*", "\1", 1, $5), "ms"}' | sort -k2n
发表于 2011-07-13 73 次浏览 留下你的评论



