“Web开发”分类下文章 »

七月 31

《Head First Design Patterns》的作者很推崇 Scheme 这门“古老”的语言,而 GNU Emacs 本身也使用了 LISP 作为粘合剂,都说 Scheme 很优美,决定开始学习 Scheme。

Scheme 的资源非常丰富,最让我感兴趣的莫过于 Scsh ,一个内嵌了 Scheme 的 Unix Shell,FreeBSD Ports 位于 /usr/ports/lang/scsh 。可以使用 Scsh 编写系统管理脚本,这样,再也不用看到丑陋的 Shell 代码了,既能实现系统管理,又可以体验 Scheme 的优美。事实上,Python 的作者应该很喜欢 Lisp/Scheme,因为 Python 中有很多特性来自 Lisp/Scheme。 一些资源汇总:

dirk 发表于 2009-07-31 星期五
七月 31

一直以来, Perl 都是以特强的文字处理功能著称,其实 Python 在这方面也相当不错。最近在项目中用到不少Python可圈可点的东西,在这里大概列一下,权当自己的Python Tips。

1、如何获取邮件地址?

我们分析邮件的时候,从From和To头信息中会提取到类似“DIrk Ye ”的邮件地址,如果我们需要只保留完整的EMail地址,可能需要正则表达式来提取,由于邮件格式的多样性,可能比较麻烦。Python提供了一个工具函数,可以方便的使用:

import email.Utils

def getCleanMailAddress(strAddr):
    emails = email.Utils.parseaddr(strAddr.lower())
    return emails[1]

2、利用Mimetypes确定文件的扩展名:

在邮件分析中,经常会碰到没有指定文件名或者扩展名的附件,我们可以根据附件的MimeType来猜测其应有的扩展名:

import mimetypes

def getFileExtension(strContentType):
    guessmimes = mimetypes.guess_all_extensions(strContentType)
    if guessmimes:
        return guessmimes[-1]
    else:
        return ''

另外,mimetypes.types_map中包含了所有运行系统可识别的MimeType,如果没有你期望的类型,可以通过mimetypes.add_type(‘audio/midi’, ’.mid’)方法来添加自己的东西,甚至可以作出修改。

3、使用正则表达式从字符串中提取指定的模式: Python的正则表达式也是非常强大的,有搜索、匹配、抽取等。有时候抽取是有点麻烦但非常有用的功能。假设我们会有大量的文本类似:

abcd@mypdx.com
aaaa@mypdx.com
n234f@mypdx.com

其中前半部分的名称都是数字和字母的组合,现在我们使用正则表达式抽取名字部分:

import re

def getUserName(strAddr):
    addr_re = re.compile('^([0-9a-z]+)@(.*)')
    unames = addr_re.search(strAddr)
    if unames is not None:
        return mptos.group(1)
    else:
        return ''

Python在文字处理方面还有很多特点,我只能把用到的东西列一下。有不少专门讲解Python相关东西的书籍,有的还是免费的;比如专门讲解Python文本处理的 Text Processing in Python ,实用而精彩,而另外一本 Python Cookbook 也是相当不错的读物,现在已经有第二版了,覆盖了Python2.3、2.4的新特性;去Python主站看看有什么适合你的书: http://wiki.python.org/moin/PythonBooks

Python Cookbook相关的两篇文章:

dirk 发表于 2009-07-31 星期五
七月 31

日常开发工作中使用的是 Emacs + ECB 环境, ECB 是建立在 CEDET 的基础上,CEDET 使用 Semantic 作为代码分析工具,所以在 Emacs 编辑目录中会生成类似“semantic.cache”这样的缓存文件,在我的 LinCVS (新版本叫 CrossVC )中会显示在“Non-controlled files”中,比较影响正常的使用,因此可以使用 CVS 的 ignore 机制将不需要的文件隐藏起来。但这些临时文件分散在各个子目录中,想要在每个子目录中创建一个 .cvsignore 文件是不太现实的,幸好 CVS 支持全局设置,可以在个人用户的 Home 目录设置一个全局生效的 .cvsignore 文件,比如我现在的 ~/.cvsignore 文件内容如下:

.cvsignore
semantic.cache

第一行是将 CVS ignore 文件本身隐藏起来,第二行是隐藏 Semantic 生成的临时文件。这样设置后,不需要在 CVS 的各个子目录中重复设置,全局生效。

事实上,CVS 支持多种 ignore 机制,具体方式如下:

  • 服务器端 CVS 仓库的 $CVSROOT/CVSROOT/cvsignore 文件,这个文件控制着所有用户的操作;
  • 每个用户 Home 目录中 .cvsignore 文件;
  • 环境变量 $CVSIGNORE 的设置;
  • 任何 cvs 命令中 -I 选项;
  • cvs 遍历目录时子目录中的 .cvsignore 文件;

CVS ignore 文件中可以包含多行,每行可以设置多个文件,文件名之间使用空格分开。因此,如果你的文件名中包含空格,在 CVS ignore 文件中将被区别对待,忽略功能就会失效,不过我们可以使用 foo?bar 来匹配“foo bar”。

dirk 发表于 2009-07-31 星期五
十二月 07

邮件开发中非常重要的一些 RFC 文档,标记一下,方便以后检索:

电子邮件相关的 RFC 文档
RFC描述状态
RFC 1939POP3 protocolUpdated by RFC 2449
RFC 2449POP3 Extension Mechanism 
RFC 822STANDARD FOR THE FORMAT OF ARPA INTERNET TEXT MESSAGESObsoleted by RFC 2822
RFC 2822Internet Message Format 
RFC 2045MIME Part One: Format of Internet Message BodiesUpdated by RFC 2231
RFC 2046MIME Part Two: Media Types 
RFC 2047MIME Part Three: Message Header Extensions for Non-ASCII TextUpdated by RFC 2231
RFC 2183The Content-Disposition Header FieldUpdated by RFC 2231
RFC 2231MIME Parameter Value and Encoded Word Extensions: Character Sets,... 
RFC 2387The MIME Multipart/Related Content-type 
RFC 3462The MIME Multipart/Report Content-type 
RFC 2111Content-ID and Message-ID Uniform Resource Locators 
RFC 2632S/MIME Version 3 Certificate Handling 
RFC 2633S/MIME Version 3 Message Specification 
RFC 2821Simple Mail Transfer Protocol 
dirk 发表于 2007-12-07 星期五
九月 27

距上次在 Windows 下编译 Magickwand for PHP 差不多过去快一年了, ImageMagick 升级到了 6.3.x 系列, Magickwand for PHP 也发布了最终的 1.0.5 版本,原先的 DLL 已经不能使用了。这期间,不断有人写信过来索要新版本,而 ImageMagick 官方论坛却始终没有人更新。

说实话,我现在完全在 Linux/FreeBSD 下开发,所以已经彻底不再使用 Magickwand for Windows 了;而且这个编译工作比较费时间,不太愿意做了;今天又花费了我一整天时间生成了一个最新(也是最后的)版本,使用 PHP 5.2.4 + ImageMagick 6.3.5 + MagickWand 1.0.5 + VC6 编译生成。

»» 最终文件请到此页面下载 ««

  • 编译环境:Windows 2000,Visual Studio 6.0,PHP-5.2.4,ImageMagick-6.3.5,Magickwand-1.0.5;
  • 测试环境:在 Windows 2000 + Apache 2.0.59 + PHP 5.2.4 环境下测试通过;

在此郑重申明:这将是我提供的最后一个版本,以后不再花费无谓的时间在这上面(感觉官方论坛对 MagickWand for Windows 没有任何兴趣)。我建议,需要做 MagickWand 开发的朋友,尽量转到 Linux/FreeBSD 下开发,软件的编译和安装更加方便,相关资料也更好找。

Update@2007-09-27 22:03

一个叫 Cully 的新西兰朋友下载我生成的 DLL 后,发现处理上传图片会产生一个错误:

Fatal error: magickreadimage(): C API cannot read the format "D:\PHP5\tempupload\0704I02C0681.jpg" (reason: UnableToOpenBlob `D:E:\PHP5\tempupload\0704I02C0681.jpg':  Invalid argument) [on C source line 217]

研究了一下 MagickWand 的源代码,同时也对比了一下 0.1.9 的旧代码,发现 MagickWand 作者将原先针对 Win32 平台的代码删除了,Windows 下的文件路径带有盘符(冒号),这个和 ImageMagick 辨认图片格式发生冲突,致使新的 MagickWand 会错误的处理文件路径为图像格式,引起读取失败。我将部分旧代码合并到新版本后发现可以修正 Cully 的问题,但我没有把握里面有多少东西需要修正。暂时放弃吧。

我现在不敢断言,但怀疑 MagickWand 的作者可能想要放弃 Windows 平台,或者说,他们就没有在 Windows 下进行测试。That’s bad news.

Update@2007-09-28 09:31

经过排查,发现只有在 read_image 的时候做了特殊处理,所以我直接制作了一个 补丁 ,重新编译后,发给 Cully 测试通过。OK,发布最后一次更新,所有下载文件更新到最新补丁版本。

另外,我也将自己制作的 MSVC6 的工程文件也放到了下载目录中,有兴趣的朋友可以自己拿回去自己编译(自己制作一个工程文件真的那么难么?呵呵)。

dirk 发表于 2007-09-27 星期四
九月 11

rfc2387 描述了 Multipart/Related 类型的 MIME 格式,通过在 EMail 中使用这种格式,可以创建丰富的内包含邮件内容,比如漂亮的信纸,比如特色的电子贺卡等等,最大的特色就是把所需要的资源文件直接包含在邮件中,不需要从远程服务器下载,这样既避免了下载网速的限制,又防止某些垃圾过滤程序默认拒绝显示远程资源的问题。

这种格式在Outlook和Thunderbird中都可以创建和显示,因此大部分终端用户都没有问题。但令我奇怪的是 Gmail 却没有支持这种格式,也许是出于安全性考虑吧。在开发 http://asweb.cn 手机邮箱过程中,也碰到需要针对这种邮件的解码,虽然确实存在安全隐患,但这种安全问题存在于所有 Html 格式邮件中,目前还没有特别好的方法解决。

利用 Python 的制作这种内包含的邮件,可以轻松实现漂亮的信纸和电子贺卡。

dirk 发表于 2007-09-11 星期二
五月 07
Rectangle command in Emacs
KeystrokesCommand nameAction
C-x r kkill-rectangleDelete a rectangle and store it.
C-x r ddelete-rectangleDelete a rectangle and do not store it.
C-x r yyank-rectangleInsert the last rectangle killed.
C-x r cclear-rectangle,Using spacesblank out the area marked as a rectangle and do not store it."
C-x r oopen-rectangleInsert a blank rectangle in the area marked.
C-x r r rcopy-rectangle-to-registerCopy rectangle to register r (where r is any character) .
C-x r i rinsert-registerInsert rectangle from register r (where r is any character).
(none)delete-whitespace-rectangleIf a rectangle includes initial whitespace, deletes it, narrowing rectangle.
C-x r t string Enterstring-rectangleChange contents of marked rectangle to string (if string is narrower or wider than rectangle, dimensions change accordingly).
(none)string-insert-rectanglePrompts for string and inserts rectangle.

如果你曾经用过 UltraEdit 的 Column 编辑模式,应该会很喜欢 Emacs 的这个功能。

dirk 发表于 2007-05-07 星期一
三月 18

3月刊的《程序员》杂志有一个“久违了,代码大全”的专题,提到曾经非常经典的书籍, 《代码大全》 马上就要出第二版的中译了。该书第一版中译好像是93年出版的,可惜我一直不知道这本书,看到有这么多人推崇,实在想找来看看。搜索了一下,第一版中译93年出版后没有再版,所以在我求学的当时市面上并没有这本书在流通。一直到大概2001年左右,有一批热心的网友将第一版中译整理成电子书,当时公开的网站是:http://www.delphidevelopers.com/,现在已经无法登录(我在北京,找不到服务器错误)。(非常感谢这批同好,具体名单电子书末尾有公布)

说实话,我为了下载这唯一的可用版本,找了很多地方,国内的下载站点实在有点让人恶心,哎!!!最后还是让我找到了,而且是最好的1.01版本,考虑到大家的辛苦,我也把这本书放在这里供大家下载:(请手动拷贝网址到浏览器下载;本站所在服务器配置比较低,下载的时候请尽量考虑服务器负载,谢谢!)

codecomplete_101.rar(4.0 MB)

注意:

  • 如果有人认为公开提供此电子书下载侵犯了你的权益,请告知,我会撤除;
  • 感谢王洋的朋友zhouzheng(抱歉,我不知道具体名字是什么)赠送此《程序员》杂志给我;
  • 感谢 Ubuntu Linux ,让我结识了一些未曾谋面的开源朋友。
dirk 发表于 2006-03-18 星期六
七月 31

6月份开始挂上Google Adsense的广告条,一个多月来,效果非常不理想,对于小型个人站点来说,真正想要靠这个挣钱简直是遥遥无期的。

想要从Google Adsense获得收入(Earn Money)并不容易,收益的多少和很多因素都有关系,比如展示次数( Page impressions)、点击率( Page CTR)、广告价格( Page eCPM)等等,而这些因素又取决于网站的访问量、网站内容的组织(搜索引擎优化,search engine optimization)、网站页面中广告位置布局、内容相关的广告关键字(Google Adwords)等等,另外,如果你挣钱的速度太慢,真不知道猴年马月才能达到100美金(Google Adsense的支付底线)。所以说,完全可以把Google Adsense当作一个业务去做,需要潜心研究。比如有人专门做Google Top Paying Keywords 业务,靠这个卖钱;也有人根据自己的经历和经验 出书 讲解如何从Google Adsense挣巨额财富;而 国内一家公司 更是提供了Google Adsense点击统计服务业务。

在众多复杂技巧的后面,需要大量的学习和实践(可能还需要经济投入),相对而言,一些简单的Tips值得参考和改进:

  • 展示次数越大越好,也就是网站的流量越大越好;
  • 点击率要适中(1 ~ 5%?),站长可能无法控制它,但可以适当的通过控制展示次数来间接调整;
  • 网站的内容要有针对性,如果可能最好突出高价格的关键字;
  • 尽量展示英文广告;(对于这一点,Wordpress似乎有优势,因为Wordpress使用UTF-8编码)
  • 在页面布局上合理、有效的展示广告;

对于流量不大的站长来说,短时间增大流量是不太可能的,但可以适当的增加高附加值的关键字相关的内容,比如比较早的一份High Paying Google Adsense Keywords清单中,关键词 mesothelioma 的每次点击价值竟然高达$84.08。(为什么会有人出这么高的价格来利用这个关键词做广告呢?当然是利益的驱使,因为在美国有很多律师愿意出高价寻找得了间皮瘤(mesothelioma)或者石棉癌(asbestos cancer)等类似疾病的客户,因为代理这些人进行索赔诉讼所得的律师费将会非常之高。)如果你愿意失却Blogging的乐趣,可以有针对性的组织网站的内容。事实上情况可能要复杂得多,Google的每次点击价格都不太相同,和各种因素都有关系。

归根结底,最重要的还是做好自己,内容精彩了,流量自然上去了。而对于一个Blogger来说,不仅仅需要精彩的内容,还需要勤快!而所有这一切,又与Blogging乐趣背道而驰,所以,重点的重点,就是你自己想要什么了(make money or enjoy blogging)!

dirk 发表于 2005-07-31 星期日