2007年3月30日星期五

我的126邮箱被禁用了

我有一个126邮箱,一直都在使用,不过不是用来手法正常的邮件,当然也不是发送垃圾邮件,更不是用来存放电影什么的,而是用在自己的一些程序中,比如discuz论坛,用来给注册用户发送激活邮件。毕竟现在discuz论坛的灌水机器人太多了,加上邮件激活能够有效的控制。不过,昨天从web界面登录126邮箱的时候,却发现"用户帐号处于禁用状态"。

刚开始还以为是密码错误或者是30天、60天没使用给强制休眠了,后来发现不是,而是怀疑违反了网易的邮件服务条款,强制禁用了,于是我不服,在 申诉页面申诉,今天收到了回信:

尊敬的用户:
你好!
经查询,你的帐号 fwolfcn@126.com 由于发送未经许可的邮件(垃圾邮件)或广
告信,或者曾经发生滥用行为(恶意上传或共享),违反了网易邮箱服务条款,已被系 统自动禁用,不予解禁。关于邮箱禁用的问题,我们在免费邮箱页面已有公告,如方便
,请你访问:http://mail.126.com/new/126news20060324.htm

网易客户服务中心:小曹

2007-03-30

显然是一封机器自动回复信,根本就不想给你解禁而已,你输入的大段申诉理由估计也没人看,但是我还没死心,想再次进行申诉,却发现:

您已于2007-03-29 23:02:49提交过本邮箱,请勿重复提交。

得,不允许重复上访,大门已经对我关闭了。可以我就想不明白了,禁用帐号的两个原因之一——发送垃圾邮件,难道就是禁用帐号就能解决的么?真想发送的话,再注册一个新的不就得了?至于另外一个原因——恶意上传,我倒还真佩服网易的程序能力,我其他的一个放了一些零碎的邮箱还是能够正常使用的,并且邮箱空间好像已经占满了 :(。

还有一点更糟糕,就是我根本就不知道邮箱什么时候被禁用的,这个邮箱偶尔进去检查一下邮件而已,更多的是用来发送注册邮件,而大家都知道,不管哪个习惯机器人注册或垃圾注册的情况都非常严重,他们大多也都不使用真实邮箱注册,所以注册邮件往往会发送到无效地址,并且产生一封退信。我这个被封的126邮箱里面倒是经常堆满了这种退信,不知道这是否网易判断邮箱是否应该禁用的原则,更不知道我这种对邮箱的使用方法是否违反了网易的政策——毕竟我的程序也是可以理解为一种邮件客户端嘛。

不管怎样,126邮箱还是国内仅存不多的、好用一些的免费邮箱之一,或许我会开个新号继续使用吧,就是它的广告恼人了一些,还是尽量使用客户端,不要使用web界面的好,多那几个钻石只是唬人的噱头而已。

不知道网易的1.9亿126邮箱用户当中,有多少被禁用了,我对这个数字非常感兴趣。

Source:http://www.fwolf.com/blog/post/307

2007年3月24日星期六

加速mutt打开文件夹的速度

选择mutt之前,总听别人说mutt如何如何强大,能够管理上千上万封邮件,自己使用之后,的确是强大,也能管理超量的邮件(maildir存储格式),可是每次打开有几千封邮件的文件夹的时候,都要花费时间建立索引、排序,硬盘呼哧呼哧响一阵才打开。mutt难道不会缓存文件夹的信息么?今天查询过才知道,不是不知道,而是我没有发现 :)

在muttrc中添加如下两句:

set header_cache="~/mail/.header_cache/"
set maildir_header_cache_verify=no

第一句是设置邮件头缓存文件保存的位置,我指定的是一个目录,这样每个邮件目录都会在这个目录下建立一个缓存文件,也可以直接指定一个独立的文件;第二句是禁止对已缓存内容的校验,因为除了mutt我想我应该不会再用另外一个程序去修改mail目录下的内容。

现在,再次启动mutt,所有的邮件目录浏览一遍,第二次再打开的时候,就能够很快打开了,读取每一封邮件、解析邮件header信息的过程已经被缓存了,mutt只需要对邮件进行排序就可以了。除了缓存邮件header以外,针对imap、pop这些访问可能会比较慢的邮箱,还可以对邮件本身进行缓存,不过我没有测试过。

现在,结合目录层次的搭配,我想mutt管理几万封邮件还是非常轻松的。如果邮件再多些,应该就需要在目录划分等其他措施上进行优化了。

参考:
* The Mutt E-Mail Client - version 1.5.14 (2007-02-12)
* Speed up folder loading in mutt
* Using mutt's header_cache feature
* maildir / imap header caching for mutt
* 15.1. Header caching(还介绍了缓存文件的默认命名规则)

Source:http://www.fwolf.com/blog/post/306

2007年3月23日星期五

保护眼睛的颜色

最近网上风传一种能夠保护眼睛的颜色,"色调设为85,饱和度设为90,亮度设为205",把浏览器和窗口背景调成这个颜色,据说对眼睛有好处,尤其是用计算机时间比较长的人。

由于我用的是ubuntu linux和fierfox,在themes里没有找到如何修改窗口背景色和菜单颜色什么的,不过firefox倒是可以强制指定网页背景色,在选项preference的content选项卡,Fonts&Colors部分有一个colors按钮,打开就可以指定Text & Background的颜色了,不过要不勾选"Use system colors"和"Allow pages to choose their own colors, instead of my selection above"这两个选项才能生效。Background的颜色不能随意指定,只能从既有的那些颜色中选择,这个就要通过设置about: config中的browser.display.background_color这一项来完成了,默认值是#FFFFFF,修改成#CCE8CF就和上面那个颜色一样了,CCE8CF就是这个颜色的rgb数值,换算成十进制是rgb(204, 232, 207)。

通过这种方式强制指定了网页背景色之后,眼睛似乎是舒服了一些,但绝大多数网页都表现非常难看,我不知道这算不算是另外一种折磨。其实,如果能夠把窗口面板和菜单颜色调整为草绿,应该就能舒服多了,网页需要各种颜色搭配来体现出层次和各种效果,都用一个颜色替代让人很不习惯。如果把"Allow pages to choose their own colors, instead of my selection above"这个选项再选中,让设了背景色的网页显示它设置的,没设背景色的网页就用草绿,情况能好一些。

PS: 手机如果长期在外地用,想用呼叫转移的办法转到本地新手机号的方法不划算的,直接接电话是掏漫游费,呼叫转移是要掏转移费+长途费,相差应该不会很大的,颇有一种"伸头也是一刀,缩头还是一刀"的感觉,该死的漫游费啊。

Source:http://www.fwolf.com/blog/post/305

注意Mutt的reply-hook会被send-hook覆盖

一般经常上网的不会只有一个邮箱的,大多数人都会私人邮箱和工作邮箱一起用,我也是,不过我不愿意把他们混淆,我希望发到工作邮箱的邮件就用工作邮箱回复,其他的用私人邮箱回复。在mutt 中,只要我们设置了邮件的From,procmail在发信的时候就会根据这个From来选择相应的identity,所以,只要根据邮件是发送到哪个邮箱,设置相应的From即可。

要想实现上面所说的筛选,需要用到mutt的hook, mutt有很多种类型的hook,通过他们可以实现根据当前邮件的情况和用户所要作的操作,自动进行一些设置。hook的不同主要在于他们的触发时间,比如切换目录的时候会触发folder-hook,回复邮件的时候会触发reply-hook(触发时间大约是用户按下回复命令"r"的时候),发送邮件的时候会触发send-hook等等。

首先来介绍一下我的环境,我的私人邮箱为P@gmail.com,工作邮箱为W@gmail.com,那么为了设置在大多数情况下都使用私人邮箱发信,首先在muttrc中设置:

reply-hook . "my_hdr From: Fwolf

"
send-hook . "my_hdr From: Fwolf

"

这就定义了默认使用我的私人邮箱来回复和发送邮件,然后再在下面定义特殊情况下的处理。因为hook是按照定义的顺序来触发和执行的,所以如果没有特殊情况,就会使用刚才定义的设置,如果出现了特殊情况,就会执行特殊情况对应的设置,不过这并不意味这上面我们定义的默认情况下的设置就不会执行,而是默认情况下的设置的执行效果被"覆盖"了。

reply-hook "~t W@gmail" "unmy_hdr From:; my_hdr From: Fwolf "

这样就定义了一个特殊情况——当回复邮件时,如果要回复的邮件是发送到我的工作邮箱W@gmail.com的,就把我要写的回复邮件的From设置为我的工作邮箱。在实际执行的时候就是这样一种顺序:

  1. 首先,用户按"r"回复邮件
  2. reply-hook . 被触发,From被设置为P@gmail.com
  3. reply-hook "~t W@gmail" 被触发,From被设置为W@gmail.com,覆盖了上面一条reply-hook的效果

看起来并没有问题,思路也对,设置也对,可是一执行就不对了,回复发送到工作邮箱的邮件,发信人仍然是P@gmail,难道是reply-hook的条件没有设置对么?不是,仔细分析之后,我发现刚才的执行过程中漏掉了一条:

From被覆盖了两次,最终的结果还是P@gmail,所以看起来好像reply-hook没有正确触发似的。究其原因,mutt中是这样定义的:

  • 不管是reply-hook,还是send-hook,都是按照定义的顺序来触发的。
  • 但所有的reply-hook都将在send-hook之前被执行。

所以,我只顾着设置reply-hook的匹配和设置,却忘记了后面还有一条肯定会被执行的send-hook。要解决这个问题,可以使用unhook把已经定义了的hook关闭掉,刚才的设置调整为:

reply-hook "~t W@gmail" "unmy_hdr From:; my_hdr From: Fwolf ; unhook send-hook"

如果回复发送到工作邮箱W@gmail的邮件,不仅把From设置为W@gmail,而且还把所有的send-hook都关掉,这样就不会受前面定义的send-hook .的影响了,经测试执行正常,并且捎带脚把signature和pgp sign也给"unhook"掉了,正好。

如果在unhook之后确实还需要使用send-hook定义进一步的设置,可以直接在后面再加上send-hook ....的设置,记得命令之间用;间隔就可以了。

Source:http://www.fwolf.com/blog/post/304

2007年3月22日星期四

超级纯文本转换为HTML的工具Markdown Extra

JunChen一样,我也不喜欢所见即所得的编辑器(WYSIWYG,What you see is what you got),虽然他们能够实现大部分"文字处理"工作,但是对于像我这样以技术性blog为主的人来说,经常要贴代码或者是一些特殊的文本,离开对 HTML代码的直接控制是不可能的。并且大部分WYSIWYG所生成的HTML代码可读性都比较差,所以就养成了直接些HTML代码的习惯,虽然麻烦些,但是我写的每一个字符都是按原样存储的,每个回车,每个

如果你曾经参与过WikiPedia的编写,肯定会被它简明的编辑方式所打动,[]就是链接,==就是标题等等,如果平时写文档也这么方便就好了,呵呵。开源世界的美妙就在于你的大部分需求都有人去解决, Markdown就是这样的一个工具,你按照特定的语法书写纯文本文件,它就可以将其转换为标准的html代码。虽然不一定能写出让领导满意的格式公文,用来写blog或者文档说明书还是足够而且方便的。最关键的是,即使不转换为html代码,这种标记形式的txt纯文本文件可读性也是非常好的。

Markdown官方网站上有它的 基本语法,我还找到了一份jjgod翻译的中文版 Wikipedia上也列出了各种语言的Markdown实现——由于 Markdown只是一种对格式的定义,所以不管用哪种语言都可以写出解析这种语法的工具。

但是相对于wikipedia的语法来说,markdown的功能相对少一些,所以Markdown Extra就出现了,它不仅用php语言实现了 Markdown语法的解析,而且还添加了一些额外的扩展,同样也可以方便的嵌入各种cms,比如wordpress。Markdown Extra的主要改进有:

  • 可以在行中任意地方嵌入任何HTML代码,只要行开头的缩进不超过3个空格。
  • 可以在table或者div等"块"元素中使用标记语言。
  • 可以为标题创建id,这些id可以像链接的id一样使用,方便在标题之间跳转。
  • 支持表格。
  • 支持定义列表。
  • 支持脚注,并且可以在脚注和正文之间来回跳转。
  • 支持缩写。
  • _在词中使用不再代表加重。
  • 可转义字符中增加了冒号:和管道符号|。

可以看出Markdown Extra相对于原版除了完全的兼容,还更加灵活和强大了一些。另外虽然 Wordpress官方不支持Markdown或者Textile标记语言Markdown Extra本身就是按照wp的插件方式设计的,安装非常简单,基本上就是三步:

  1. 下载,并把markdown拷贝到wp的wp-content/plugins/目录。
  2. 在管理页面激活Markdown插件。
  3. 在发帖时要关闭可视化编辑功能,有了Markdown,还要他们作甚。

现在,Markdown Extra就可以作用于wp的文章和留言啦。

通过简单的使用,我发现Markdown Extra发掘了txt文本的真正威力,简单、实用,无论是源文件还是生成的 HTML文档,格式和可读性都非常好,尤其是在*nix这些经常要用到字符界面的操作系统中,更能体现出纯文本的优越性来。

另注几点:

使用了*[HTML]: Hyper Text Markup Language之后,调用会出现Segmentation fault错误,已经向作者反映了,不过贴到blog里好像又可以了。

作为wp的plugin使用时,对于我原来使用纯HTML编写的文章,由于包含很多代码或者输出片段,格式会乱掉,要是能定义哪篇文章用Markdown语法,哪篇文章不用就好了。我目前的办法是手工修改markdown.php文件,把第88行的:

remove_filter('the_content', 'wpautop');

注释掉,恢复wp自己的段落划分功能,和markdown一起使用就没事了。当然在使用

贴代码的时候,

都要占用单独的一行才行。如果你发现还有其他文章格式乱了,请告诉我。

还发现了另外一个更强大的txt转HTML工具:texy,居然把css什么的功能也作进来了,不过好像刚刚起步,还不是很成熟,支持的应用和各种语言的实现也不多,对unicode的处理也不尽人意,暂时观望。

Source:http://www.fwolf.com/blog/post/303

2007年3月21日星期三

在mutt中使用gnupg

有的同学认为邮件、邮箱是很保密的东东,没有我的密码,别人怎么能够打开我的邮箱,或者查看我的邮件呢?这是非常错误的,我告诉你们,不管你们邮箱的密码有多复杂,邮件在服务器上一般都是明文存储的,在服务器上有文件读取权限的人一般都可以查看到。另外邮件在传输过程中要经过很多邮件服务器(邮件头中就有邮件经过的所有邮件服务器的记录),每个邮件服务器都是可以拷贝一份放在自己这里的,更不用说离你更近的采用sniffer嗅探器的黑客了。所以,要想邮件不泄密,就必须对邮件进行加密。

邮件加密方式有很多种,有人可能会把文件用压缩工具带密码压缩作为加密,虽然可行但仍然需要告诉别人密码,而基于对称密钥算法的pgp加密就方便多了,你公开你的公钥,别人给你发送邮件的时候用这个公钥加密,这样信件就只有用你自己持有的私钥才能打开了。pgp是一个商业软件,不过GNU为我们提供了它的免费替代品——gnupg。

另外pgp加密并不是每个邮箱或者邮件客户端软件都支持,比如web的gmail和客户端的foxmail就都不支持,不过在这种情况下,可以使用pgp加密所要传输的内容(文件形式),再把加密的结果用"明文"方式传输就可以了。本文中,我的使用环境是ubuntu edgy 6.06,客户端软件为Mutt 1.5.12 (2006-07-14)。

Gnupg

首先,我们要使用gnupg软件生成我们的密钥对:

root@fwolf:~/.gnupg$ gpg –gen-key
gpg (GnuPG) 1.4.2.2; Copyright (C) 2005 Free Software Foundation, Inc.
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions. See the file COPYING for details.

Please select what kind of key you want:(选择密钥的类型,2和5只能用来数字签名,不能用来加密)
(1) DSA and Elgamal (default)
(2) DSA (sign only)
(5) RSA (sign only)
Your selection? 1
DSA keypair will have 1024 bits. (DSA密钥的长度是固定的1024位)
ELG-E keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 4096 (ELG-E密钥的长度是可变的,这里我选择最长的,越长意味着越难以破解)
Requested keysize is 4096 bits
Please specify how long the key should be valid.
0 = key does not expire
= key expires in n days
w = key expires in n weeks
m = key expires in n months
y = key expires in n years
Key is valid for? (0) 0 (设置密钥不过期)
Is this correct? (y/N) y

You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and E-mail Address in this form:
"Heinrich Heine (Der Dichter) "
(下面要输入密钥所有人的信息,邮箱一定要输对,不然怎么签名啊,名字也不要输错,不然签名的时候签的是别人,comment就随意了)
Real name: Fwolf
E-mail address: fwolf's mailbox@gmail.com
Comment: Fwolf MaGod
You selected this USER-ID:
"Fwolf (Fwolf MaGod) "

Change (N)ame, (C)omment, (E)-mail or (O)kay/(Q)uit? o
You need a Passphrase to protect your secret key.
(为私钥再设置一个密码,双重保护,可以选择不用,除非你的电脑很"安全",還是建议设个密码的好)
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, use the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
++++++++++..++++++++++++++++++++++++++++++.+++++++++++++++++++++++++++++++++++.+++++..++++++++++++++++++++++++++++++.++++++++++..++++++++++>+++++…+++++…………………………………….+++++
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, use the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
..+++++…+++++++++++++++.+++++.+++++…+++++.+++++++++++++++.++++++++++.+++++.++++++++++…+++++..++++++++++..+++++..+++++++++++++++++++++++++++++++++++.+++++++++++++++++++++++++++++++++++>.+++++.++++++++++++++++++++.+++++.+++++++++++++++.+++++>+++++>..+++++>.+++++………………………………………………………………………..+++++^^^^
gpg: key B7D37EE7 marked as ultimately trusted
public and secret key created and signed.

gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u
pub 1024D/B7D37EE7 2007-01-08
Key fingerprint = 0C5F AD53 05B3 E1D8 8D33 B6A8 4970 34B8 B7D3 7EE7
uid Fwolf (Fwolf MaGod)
sub 4096g/D4CF3DF0 2007-01-08

现在密钥就生成好了,并且自动存为了你本机的可信任密钥(自己给自己发信当然是"信任"了),上面的1024D/B7D37EE7和4096g/D4CF3DF0分别是两种形式公钥的长度和号码,DSA公钥的Key fingerprint(就是那一长串像windows注册码的东东)是公钥的指纹,和号码一样可以用来下载你的公钥。从哪里下载?原来网上有很多gnupg的公钥存储服务器,很多人都把自己的公钥上传上去,让别人给自己发信的时候可以从那里下载,而不是直接向收信人索取。更好的是,这些公钥存储服务器是全球联网同步的,你只要上传到其中一个服务器,就可以在其他任何服务器上下载了。

要把我们刚才生成的公钥上传到公钥存储服务器,首先编辑一下$HOME/.gnupg/gpg.conf文件,增加一行:

keyserver wwwkeys.nl.pgp.net

这里我指定的是荷兰的服务器,不过不重要,反正会自动同步到其他服务器的,常用的keyserver还有:

有些keyserver上还可以用web界面来查询、下载别人的公钥。指定了keyserver之后,我们可以先查查上面有没有自己的公钥:

root@fwolf:~/.gnupg$ gpg –search-keys fwolf's mailbox@gmail.com
gpg: searching for "fwolf's mailbox@gmail.com" from hkp server wwwkeys.nl.pgp.net
gpg: key "fwolf's mailbox@gmail.com" not found on keyserver

没有找到,因为我们还没有上传嘛,现在上传:

root@fwolf:~/.gnupg$ gpg –keyserver hkp://wwwkeys.nl.pgp.net –send-keys B7D37EE7
gpg: sending key B7D37EE7 to hkp server wwwkeys.nl.pgp.net

上传很简单也很快的,传完之后再查询一下:

root@fwolf:~/.gnupg$ gpg –search-keys fwolf's mailbox@gmail.com
gpg: searching for "fwolf's mailbox@gmail.com" from hkp server wwwkeys.nl.pgp.net
(1) Fwolf (Fwolf MaGod)
1024 bit DSA key B7D37EE7, created: 2007-01-08
Keys 1-1 of 1 for "fwolf's mailbox@gmail.com". Enter number(s), N)ext, or Q)uit > 1
gpg: requesting key B7D37EE7 from hkp server wwwkeys.nl.pgp.net
gpg: key B7D37EE7: "Fwolf (Fwolf MaGod) " not changed
gpg: Total number processed: 1
gpg: unchanged: 1

服务器会先查出有几个符合条件的key,然后选择显示哪一个。在本机管理key的主要命令有:

列出我的私钥(可以多于一个)
$gpg –list-secret-keys

私钥文件为:~/.gnupg/secring.gpg
公钥文件为:~/.gnupg/pubring.gpg

导出公钥
$ gpg –export –armor Fwolf
导出私钥
$ gpg –export-secret-keys –armor Fwolf

–armor参数是把密钥内容用ascii形式显示出来,不然屏幕上会全是怪字符的。

导入私钥:
gpg –allow-secret-key-import –import [filename]
–allow-secret-key-import 参数在文档中已经说明为过时,应该可以去掉,gpg自动判断是否私钥的导入。

Mutt

gnupg这边基本上就搞好了,下面来配置mutt,首先把gpg的例子配置拷贝一份到自己的mutt配置目录:

cp /usr/share/doc/mutt/examples/gpg.rc ~/.mutt/

然后在mutt的配置文件~/.muttrc中添加引用这个gpg.rc的命令:

source ~/.mutt/gpg.rc

最后编辑gpg.rc,添加如下内容:

# Signature every outgoing mail by pgp
set pgp_autosign=yes
set pgp_sign_as=0xB7D37EE7
# During these time you will not needed to enter passparse again
set pgp_timeout=1800
# Let you see pgp signature infomation
set pgp_verify_sig=yes

这样,再次启动mutt,在发信的时候,在显示发信人、主题等信息的那个界面,按"p"就可以打开pgp菜单了,内容大体为:

PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (c)lear?

e代表加密,s代表签名,a代表使用非默认的签名,b说明又加密又签名,i指定加密或者签名是直接嵌入正文(inline)还是以附件形式(mime)的,推荐使用兼容性比较好的mime形式,c则是取消加密和签名状态,明文发送。

管理公钥

要给别人发送加密邮件的话,要先下载并导入别人的公钥,并用pgpewrap来管理,不过有些系统上pgpewrap的路径不对,手工ln一下就可以了:

sh: pgpewrap: command not found
sudo ln -s /usr/lib/mutt/pgpewrap /usr/bin/pgpewrap

gnupg有一套本机的公钥管理机制,可以对所有导入的公钥设置信任级别,还有一套相关的规则,比如如果一个公钥被3个人信任,那么就把他也设置为信任状态什么的,不过下面只简单演示一下设置已导入公钥的简单功能,更复杂的估计一般很少用到了:

$ gpg –edit-key Justin (指定要编辑哪个公钥)
gpg (GnuPG) 1.4.2.2; Copyright (C) 2005 Free Software Foundation, Inc.
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions. See the file COPYING for details.

pub 1024D/C9C40C31 created: 2001-05-25 expires: never usage: CSA
trust: unknown validity: unknown
sub 1024g/59FAB546 created: 2001-05-25 expires: never usage: E
[ unknown] (1). Justin R. Miller
[ revoked] (2) Justin R. Miller
[ revoked] (3) Justin R. Miller

Command> 1 (选择1号公钥,2和3都是Justin以前的,现在不用了)

pub 1024D/C9C40C31 created: 2001-05-25 expires: never usage: CSA
trust: unknown validity: unknown
sub 1024g/59FAB546 created: 2001-05-25 expires: never usage: E
[ unknown] (1)* Justin R. Miller
[ revoked] (2) Justin R. Miller
[ revoked] (3) Justin R. Miller

Command> sign (签署这个公钥?我也不知道是什么意思)

pub 1024D/C9C40C31 created: 2001-05-25 expires: never usage: CSA
trust: unknown validity: unknown
Primary key fingerprint: 2231 DFF0 869E E3A5 885A E7D4 F787 7A2B C9C4 0C31

Justin R. Miller

Are you sure that you want to sign this key with your
key "Fwolf (Fwolf MaGod) " (B7D37EE7)

Really sign? (y/N) y (确认,并输入自己私钥的密码)

You need a passphrase to unlock the secret key for
user: "Fwolf (Fwolf MaGod) "
1024-bit DSA key, ID B7D37EE7, created 2007-01-08

Command> trust (设置Justin为我"信任"的人,他的公钥会在可能的情况下默认使用)
pub 1024D/C9C40C31 created: 2001-05-25 expires: never usage: CSA
trust: unknown validity: unknown
sub 1024g/59FAB546 created: 2001-05-25 expires: never usage: E
[ unknown] (1). Justin R. Miller
[ revoked] (2) Justin R. Miller
[ revoked] (3) Justin R. Miller

Please decide how far you trust this user to correctly verify other users' keys
(by looking at passports, checking fingerprints from different sources, etc.)

1 = I don't know or won't say
2 = I do NOT trust
3 = I trust marginally
4 = I trust fully
5 = I trust ultimately
m = back to the main menu

Your decision? 3 (信任的程度或者级别)

pub 1024D/C9C40C31 created: 2001-05-25 expires: never usage: CSA
trust: marginal validity: unknown
sub 1024g/59FAB546 created: 2001-05-25 expires: never usage: E
[ unknown] (1). Justin R. Miller
[ revoked] (2) Justin R. Miller
[ revoked] (3) Justin R. Miller
Please note that the shown key validity is not necessarily correct
unless you restart the program.

Command>save (保存)

Then, when send mail and select PGP encrypt option, mutt will automatic select pubkey according recipient or give you a select menu, select the currect key and press enter, mail will be send out. One more question, if I didn't want to select any pub keys, or want to abort this mail send, how do I exit from the select-pubkey menu ?

现在,如果你发信对方的公钥在本地存储中有的话,就会自动调出来并用上了。

局限性

我已经使用gnupg有一段时间了,大部分情况都是作签名,也有加密发送的,感觉效果还行,就是在mutt中收到又加密又签名的邮件的时候,界面上的显示会比较乱而已。还有一个损失就是,如果再像以前那样把要保密的内容用gnupg加密发送到自己的gmail邮箱中的话,gmail中只能显示一堆乱码——加密了嘛,但是搜索是肯定搜索不出来的了,除了按标题搜索,gnupg一般是不对标题进行加密的。

参考:

Everything You Need To Know To Start Using GnuPG with Mutt,非常好的说明,还重点讲了gpg加密的原理,为什么要使用签名和加密等等。

mutt+gnupg实战

Source:http://www.fwolf.com/blog/post/302

寻找合适的文档管理系统

已经不止一次有这种想法了,文档管理系统(document management system,简称DMS)或者数字资产管理系统(digital asset management system,简称DAM),主要是用来管理我们常用的一些文档、照片等东东。

从几年前,大概2001年开始我就在想如何管理自己的文档才好?那时候主要是wps,doc等文件什么的比较多,还没有数码相机,所以只有几张网友的照片,而随着时间的推移,无论是照片,还是文档都在增加,我现在只能是每年建一个目录,然后下面大致分上几个子目录,把文件名尽可能的写长一些,方便以后查找,最后每年的文档一打包就扔到角落里面去了。但是这样作的直接结果就是旧文档很少被用到,能不用就不用,因为使用的时候找要找半天,解压也麻烦。

还有,现在联网方便了,我要从家里直接连上公司的电脑,或者反过来,无论是在公司还是在家办公,调用以前的文档都非常方便才行。gmail和groups出现之后我也尝试过把文件放在邮箱里(自己给自己发信),不过gmail中文搜索并不理想,尤其是不太常用的行业词汇,很难搜出来,结果还是要找半天才能找到。所以,要想通过互联网管理或者共享文档的话,还是要专门的文档管理系统才行。

所幸,除了一些商业的DMS之外,还是有一些免费的文档管理系统,不过在挑选之前,先考虑一下我期望的DMS应当具有的特性:

  • web方式在线使用,这样可以方便自己或者同事调用。
  • 具备完善的用户权限控制,可以对每个节点进行授权,但也要能选择无需登录就可查看的文档;如果能够支持按ip或其他条件来定制游客权限就更好了。
  • 服务器运行环境要是nix平台,讨厌windows;apache或类似服务器,php或类似语言,java的不要,块头太大。
  • 支持多种类型的文件,比如支持pdf预览,支持图像exif信息查询等等。
  • 完美支持中文等字符集。
  • 文档仓库要按照时间或分类建立目录树,不要强制修改文档在仓库中保存时的文件名,这样即使暂时脱离DMS,直接在文件系统中查找也不会太麻烦。
  • 支持文档的版本,支持文档之间的关联。
  • 支持批量导入,我把目录拷贝到仓库中,可以快速批量进行设置,导入进来。
  • 最好能夠支持多个"文档仓库",这样现在的工作文档和以前的历史文档就都能夠管理起来了。

应该说我的要求不算高吧,可是找了一个上午,仍然没有满意的结果,有些是以前就试用过的,有些则是不适合我。当然肯定不止我一个人在寻找,很多人都在找呢,比如 这个这个,下面说说这些系统都怎么让我不满意的吧:

DocMgr

这大概是在功能上我最满意的DMS了,但是他使用的是postgresql数据库,这个我可以克服,但是它的文件居然也都是存储在数据库中的,我可不想动辄备份几个G的数据库,放弃。

KnowledgeTree Document Management

KTDMS是比较成熟的一款了,除了开源的版本,还有商业版本可用,不过以前试用过,更偏重文章而不是文件的管理,靠近知识管理更近一些,不太适应数字资产管理的需要。

MyDMS owl

这两个是一系列类似系统中稍微好一些的了,特点是侧重于文件的管理,甚至作的和资源管理器一样。其实我要是想自己建目录管理文件,还费劲上什么DMS啊?另外对仓库中的文件都进行了重命名,不便于脱离DMS在文件系统中直接查询,也只能放弃了。

至于其他flickr、yupoo等在线图片管理网站就不说了,只能管理图片,不能管理其他类型的文件。

今天的搜索就到此为止了,还是没有找到最合适的,以后有时间我会继续查找,补充在这里。或许,闲得无聊的时候我会自己写一个?

Source:http://www.fwolf.com/blog/post/301

2007年3月15日星期四

Web服务器内容的压缩输出

还在使用工具压缩js和css文件么?已经有些落伍啦,其实web服务器本身就具备压缩功能,可以把客户端所需要的内容压缩后再传输。当然这需要客户端浏览器支持压缩(通常是gzip方式),不过现在的主流浏览器比如ie、firefox、opera、safari都是支持滴。

首先可以用Real-Time Compression Check检查一下你现有的网站是否启用了压缩输出,如果没有,而且你使用的是iis系列web服务器的话,可以购买商业软件比如 ZipEnable来实现;如果使用的是apache服务器,那你有福了,使用mod_deflate就可以了。

mod_deflate的前身是mod_gunzip和mod_gzip,他们大多用于Apache 1.3分支,现在的Apache 2.x系列中,就被mod_deflate替代了,并且功能更加丰富。mod_gunzip和mod_gzip的区别在于:

mod_gunzip需要服务器上的文件本身就是压缩存储的,如果浏览器不支持压缩的话,再由web服务器解压后传输给客户端,否则直接读取压缩文件传给客户端。这样作的好处就是不占用cpu,并且大多数浏览器支持压缩,需要web服务器解压的不大。不过,碰到不支持压缩的机器人的话可就不好半喽。另外现在网站的内容大多是由程序动态生成的,在这种情况下mod_gunzip就没有用武之地了。

mod_gzip则不需要文件预先压缩存储,而是在浏览器支持压缩的情况下,把数据压缩之后再传给客户端。这样会牺牲一些cpu代价,但是适用于网站内容由程序动态生成的情况,并且gzip的速度也是非常得快,每次web请求的数据量也都不大,所以实际的cpu占用并不会太多。并且如果文件本身就是压缩了的,比如index.html.gz,那么这些文件会被直接输出,不用再压缩了(这样并不代表有了index.html.gz,就能替代index.html作为目录索引页) 。所以mod_gzip实际上覆盖和超越了mod_gunzip的功能。

mod_deflate的启用在ubuntu中很简单,"a2enmod deflate"就可以了,其他系统可以在httpd.conf中添加:

LoadModule deflate_module /usr/lib/apache2/modules/mod_deflate.so

mod_deflate还需要配置一下,比如在httpd.conf中:


AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-httpd-php application/x-javascript text/css

指定对html、txt、xml、php、js、css等mime类型的文件进行压缩,application/x-httpd-php和application/x-javascript是我加上的,不知道能否起作用。也可以按照文件扩展名或者浏览器类型进行压缩,还有更复杂的配置,可以查询 官方的手册

参考:
Compressed delivery
*.gz files shouldn't get "Content-Encoding: gzip" header
How To Save Traffic With Apache2's mod_deflate
Apache Module mod_deflate

Source:http://www.fwolf.com/blog/post/299

2007年3月12日星期一

Cisco路由器菜鸟更改ip地址备忘

近期网通在大规模调整ip地址,从原来的218地址调整到121地址,原因据说是优化服务,不知真正的居心何在。我这里使用的是cisco 2621的路由器,原先已经由别人配置好了,我虽然是个路由器菜鸟,但是更改一下ip地址还是可以的,顺便把要用到的几个命令记录在这里。

通过控制端口连接上路由器之后,默认的是

Router>

提示符,这个状态下只能查看,不能进行配置,输入命令"en"就进入管理模式了,提示符也会有相应改变:

Router>en
Router#

然后就可以配置了,首先是配置ip地址,就像这样:

Router#conf t
Enter configuration commands, one per line. End with CNTL/Z.
Router(config)#interface fastEthernet 0/0
Router(config-if)#ip address 121.38.148.58 255.255.255.252
Router(config-if)#exit
Router(config)#interface fastEthernet 0/1
Router(config-if)#ip address 121.38.148.49 255.255.255.248
Router(config-if)#exit
Router(config)#no ip route 0.0.0.0 0.0.0.0
Router(config)#ip route 0.0.0.0 0.0.0.0 121.38.148.57
Router(config)#exit
Router#sh run
Building configuration…
……

解释一下:
首先"conf t"到底是什么我也不太清楚,或许t是配置的名称,或许是某个命令的简写,反正这么配就是了:);
然后用interface命令指定要配置的网卡,选定之后ip address命令就是设定网卡地址,如果设置2个地址的话,掩码后面要跟上个secondary;
ip地址设定完之后用exit退出网卡设置的"子过程",继续配置静态路由,先用"no ip route"清除以前的路由表,然后再用"ip route"设置新的;
最后exit退出设置,"sh run"这个命令也许是运行配置,也许是检查配置,反正执行一下就是了,你会看到所有的配置情况,检查其中的ip地址设置、nat设置、访问权限设置、路由设置等等。
没有什么问题的话应该就可以生效了,但测试成功之后别忘记把配置保存起来,不然路由器一重启配置就恢复成原来的了:

Router#write

有的时候配置完不生效,需要重启一下光电转换器,或者切换一下光电转换器的模式然后再换回来,只要配置好了能够正常ping上端路由器的互联地址,应该就是没有问题的。不过我配置的时候总是怪怪的,明明配置好了,路由转发就是不成功,后来实在没办法打到网通光纤机房请教,居然是个女孩子在值夜班,服务态度当然是A+了,她那边检查一下居然什么问题都没有了,残念。。。

Source:http://www.fwolf.com/blog/post/297

2007年3月1日星期四

Wordpress插件编写简例

虽然市面上有很多wordpress的插件,但未必能够满足我们那些稍微"变态"一些的需求,所以,参照wp官方的插件编写指南,写下这个简单的说明和小例子,希望对大家有所帮助。

插件编写需要php的基础知识,并且本说明的内容大多只适用于wp1.5以后版本。

插件程序建议放置在wp-content/plugins/目录,如果有多个程序文件的话,可以在这个目录下建立子目录,程序所需的资源文件建议也放在这个目录下,便于更新和管理。

wp插件主要分为两种:
Action 对wp的行为事件进行修改,比如修改数据库,发送邮件或者修改显示结构等。
Filter 对wp的输入输出内容进行修改。

在本例中,我们将建立一个简单的Filter插件,替换wp本来的文章摘要生成功能,把以前手工修改代码实现的内容,用插件来替代。

wp推荐在插件程序中加入这样的文件头,便于wp辨认插件的信息,就像下面这样:

/*
Plugin Name: 插件名称
Plugin URI: http://插件网址
Description: 插件说明
Version: 插件版本
Author: 插件作者
Author URI: http://作者网址
*/

插件的代码风格主要是基于过程方式的,所以要尽力避免函数重名,可以在函数名之前加上自己的名称前缀,也可以把自己的类包含在一个类当中,不过小型插件还不至于复杂到要使用类的程度吧?

函数的编写就是php代码了,注意Filter一定要返回数据,即使没有修改也要返回,不然后续的其他函数就没法干活了。更多的信息可以看官方的插件api

编写完成之后,函数是不会自动执行的,wp为插件函数的执行提供了一种hook机制,就是在原始的wp程序中,预置了一些hook或者叫挂载点,通过把插件函数挂在这些hook上,就可以被执行,目前wp提供的挂载点一览见 Hooks列表。

针对我编写的函数,是要挂在生成文章摘要的地方,查找了一下Hooks列表,发现和摘要(excerpt)相关的有:

default_excerpt
excerpt_edit_pre
excerpt_save_pre
get_the_excerpt
the_excerpt

从名称可以看出,default_excerpt是文章的默认摘要,excerpt_edit_pre和excerpt_save_pre是编辑文章是对摘要进行的预处理,get_the_excerpt是取摘要,the_excerpt是返回摘要。我编写的是生成摘要的功能,应该挂在get_the_excerpt或者是the_excerpt上,考虑the_excerpt可能更"底层"一些,挂在这里。

挂载的语法也是一个php函数调用,格式如下:

add_filter('hook_name', 'your_filter', [priority], [accepted_args]);

priority为优先级,默认为10,数字小的会先执行;accepted_args为参数个数,默认值为1,如果插件函数需要多个参数的话需要自行设定。这两个参数在使用默认值的时候都可省略。

基本上有这些就够了,我的插件程序完整代码如下:

/*
Plugin Name: Excerpt Trimmer
Plugin URI: http://www.fwolf.com/
Description: 替换wp本身的"摘要"生成功能,用于在列表或者查询页面显示文章部分内
容。
Version: 1.0
Author: Fwolf
Author URI: http://www.fwolf.com/
*/

function fw_excerpt($text)
{
$excerpt_length = 4;
$words = explode("\n", $text, $excerpt_length + 1);
if (count($words) > $excerpt_length) {
array_pop($words);
array_push($words, '

……ID) . '">[阅读全文]');
$text = implode("\n", $words);
}
return $text;
} // end of func fw_excerpt

add_filter('the_excerpt', 'fw_excerpt');
?>

可以看出插件程序也就是由上面介绍的3部分组成:文件头,函数体,挂载声明。

其实就简单插件来讲,最关键的是找对相应的hook,这就要靠经验和摸索了,wp官方文档好像也没有对每个hook作出详细的解释。

现在,把我这个插件程序保存为wp-contents/plugin/excerpt.php,登录wp,进入plugin设置,就能够看到"Excerpt Trimmer"插件了,启用之就大功告成了。我还存了一份在 这里,方便下载。

Source:http://www.fwolf.com/blog/post/296