写了个豆瓣 Gtalk/XMPP/Jabber 机器人玩

豆瓣是我每天要上很多次的网站,我是个八卦的人,所以看得最多的是友邻广播

我是个重度的 jabber 用户,一直希望有人开发一个机器人,这样就可以随时接收广播。但是等了很久都一直没人弄,写了一下,算做抛砖引玉吧。

我不懂 python ,但是一直对 python 的 twisted 很感兴趣,因此选用的 wokkel 来实现。花了两个晚上终于写好了一个可以接收豆瓣友邻广播,发广播的豆瓣 jabber 机器人出来了。

twisted 非常好玩,很好很强大,除了文档太少不好。wokkel 把 twisted 的 words 模块封装得非常好,用它来开发机器人很简单。

把代码扔 github 上了,大家可以来看,python 新手写的代码,很乱很烂,欢迎扔鸡蛋。

如果要支持大量用户的话,现在估计还得改成使用 xmpp component 的方式来跑,同时代码里面还有很多同步的操作,图省事的数据库使用方式,都得修改。

豆瓣的接口 很开放很强大,这个机器人还可以实现更多功能。不过根据我懒人的习性,估计兴趣过了之后就不会怎么再弄了了,所以欢迎大家去fork

机器人地址:[email protected] 直接将其加为好友即可使用

varnish 2.0 load balancing

varnish 是一个高效的 HTTP accelerator, 目前的稳定版本是 1.1.1 不过有个大 bug,预计下下周就会出 1.1.2

目前正在开发的 2.0 版本有一些非常有意思的改进,最重要的就是对 load balancing 的支持。 从目前的 trunk 里面可以看到,其功能已经基本实现,目前支持 round robinweighted random 两种算法对后端进行负载均衡,同时对后端服务器也有简单的健康检查机制

负载均衡的一组后端在 vcl 中也是一个 backend, 不过有较特殊的定义语法。

backend_round_robin rr {
set backend.set = {
{ "foo1.bar.com", "http" }
{ "foo2.bar.com", "http" }
{ "foo3.bar.com", "http" }
};
}

这就定义了一个名字为 rr 的 backend, 它对应的是一组使用 round robin 算法负载均衡的后端

backend_random rrr {
set backend.set = {
{ "foo1.bar.com", "http", 0.3 }
{ "foo2.bar.com", "http", 0.6 }
{ "foo3.bar.com", "http", 0.1 }
};
}

这则是定义了一个名字为 rrr 的backend, 它对应的是一组使用 weighted random 算法负载均衡的后端,花括号中的小数是每个后端的权重,可选,默认是每个后端分配相同的权重。

具体参见: #1931

找时间测了一下,功能已经基本可以用,不过测试的过程中 varnish 经常当掉,XD

Mephisto 和 Radiant CMS

前一阵花了好多时间把 blog 迁移到了 Mephisto 这个了 blog 发布系统上,因为我喜欢折腾,而这个貌似不错。后来我发现我的选择真的没错。

最近一直有人问我这个 blog 用的系统,所以说明一下吧。

Mephisto 是基于 ROR 的,它主页上写的是 the best blogging system ever. 作者 Rick Olson 也很有来历,是 Rails core team 的成员。

istefMephisto 不好装 ,不过我觉得挺容易的,跟其它的 ROR 程序的配置一样,用 gems 装好 tzinfo,配 database.yml,.htaccess 然后初始化数据库就好了。官网上也有详尽的教程

那有哪些特别的地方呢:

  1. 首先很简洁,大方,我喜欢这种风格。
  2. 分类叫做 section (这点像 TXP ),可以自由对每个 section 的界面进行不同的配置,所以很适合用作小型的 CMS
  3. 支持 tagging
  4. 文章编辑可以使用 textile, markdown, plain html, 文章还有 reveiosn 可以进行版本控制。
  5. 智能的 cache 系统,生成静态文件, 不过不像 mt 那么傻,必须一次把所有的页面生成,它是在对页面的第一次访问时自动生成静态页。另外修改模板,设置之后,它会清除相应的 cache,所以平时根本不用你去管它的 cache。
  6. 模板基于 liquid,很优雅,不过我觉得还不够强大。
  7. 内置的基于 Akismet 的 spam 过滤机制,这个当然很有效。
  8. 非常方便的附件 (assets) 管理,看这个
  9. plugins,liquid tags 之类的扩展也很容易,不过也要有点 ruby/ror 的知识就是了。
  10. 本身不支持 trackback,很多人说不喜欢 trackback,所以也算一个特点吧。
  11. 另外还有一个强大的功能就是支持多个不同站点,不过还不是很完善,在有的平台,如 lightty 上就不太好配,当然在 Apache 和 nginx 上没有问题,这个功能很爽的。详见:Hosting Multiple Sites 还可以看看它的官网:Mephistoblog配置文件

nginx + mongrel 差不多是目前测过的最快的 ROR 环境了,在很破的虚拟机上跑都比 dreamhost 的破 apache + fastcgi 快很多,而且非常稳定,不过似乎还是有点吃 cpu 。

哦,我发现我不会写 blog 了…… 这几个字就敲了这么久,而且似乎没有逻辑…… 不写了,喜欢折腾的自己去试吧。

  1. Mephisto Wiki
  2. Mailing List
  3. IRC: #mephisto on irc.freenode.net

另外 Radiant CMS 也很好用,可以看它的这个应用

Scuttle 的 Firefox 扩展

Scuttle 是一个类似 Del.icio.us 的书签程序,之前有过介绍

Scuttle 官方推出了一个 Firefox 的扩展: Scuttle Extension for Firefox 0.1

另外在 Kai’s blog 上也有一个在 del.icio.us post 上修改的 Scuttle 的 Firefox 扩展 Scuttlelicious,比上面官方的那个好用一些。

有了这些扩展使用自架的 Scuttle 就更方便了。

MySQL 4.0 数据导入到 MySQL 5.0 可能出现的问题

MySQL 4.1 和 5.0 的字符设置比 4.0 复杂很多,详见: Character Set Support

utf-8 的中文数据从 4.0 导入到 5.0 之后,PHP 读取似乎没什么异常,但是在 phpMyAdmin 里面看到的中文却都是乱码。这是因为一般 MySQL 5.0 的默认的 character_set_database 为 latin1 ,导入后的数据的 Collation 是 latin1_bin 或 latin1_swedish_ci 。这时候再用 phpMyAdmin 导出的数据也都是乱码,不能使用了。

Continue reading MySQL 4.0 数据导入到 MySQL 5.0 可能出现的问题

架设自己的 Del.icio.us

freshmeat 上看到了 Insipid 这个程序。

Insipid is a Delicious clone written in Perl and licensed under the GPL.

Perl 写的,单用户,支持 MySQL 和 PostgreSQL 两种数据库,主要功能有导入导出,utf-8 支持,保存网页快照,RSS,tag等。具体如下:

  • Support for both the MySQL and PostgreSQL databases
  • Private bookmarks that only the owner can see
  • Import and export, in a Del.icio.us compatible XML format
  • Full UTF-8 support
  • Snapshotting of pages (basically caching a page and it’s included content in the Insipid database)
  • Tags for categorization – you can view the bookmarks and RSS feeds by tag, as well as using addition to get more complex results (for example “Java + documentation”)

程序简洁,安装简便。不喜欢或者不方便使用 Del.icio.us 的话,可以用它自己架设一个。

Insipid 安装时在 insipid-config.cgi 里面配置好数据库和用户设置就行了。如果数据库主机地址不是 localhost 的话,得将 Database.pm 的第 49 行中的 localhost 改为相应地址。

PHP 也有类似的程序,叫 Scuttle,多用户的,功能差不多,不能抓取快照,界面较友好。SF 现在好像被 GFW 了,不过还可以下载,在 Scuttle.org 上可以看到它的样子。

Digital-NGP

Digital-NGP (Digital Northern Great Plains Project) 是一个在线的遥感图像存储及发布系统,是由美国的 North Dakota 大学 Upper Midwest Aerospace Consortium 开发的一套系统。用它可以查询,下载美国地区各种尺度的各种卫星遥感影像。

Digital-NGP or DNGP is an online GIS database system for archiving and delivering remote sensing images. NGP stands for Northern Great Plains, which defines the region of our interest. DNGP is developed by the Upper Midwest Aerospace Consortium at the University of North Dakota in an aim to better serve our community by providing an integrated web-based Geographic Information System.

提供的影像类型包括:MODIS,ETM,TM,QuickBird,MSS,ASTER,ETM+,SRTM 等,并能查看指定日期的各地区的各种类型的影像。并对于多光谱影像可以选择特定波段,生成RGB图像。然后还可以选择生成特定的图层的内容,如 Boundaries,Transportation,Water,Geology,Raster Layer,Agriculture等分类下的特定图层。同时也可进行 NDVI 等指数的分析。生成的影像均为 png 格式,可以自由打印和下载。

这是今天上午被老师叫去听一个 North Dakota 来的张老师的讲座了解到的。他是该项目的 Team leader 。系统数据库用的是 Oracle spatial ,底层影像的处理主要是依靠开源的 Mapserver 来完成。影像数据通过 GeoTIFF 存储,然后通过 Mapserver 根据用户的请求生成 png 图像。其 web 界面早期用的是java ,后来转而使用了 PHP 。他介绍说当时数据库之所以使用 Oracle 是因为早期只有 Oracle 有对空间数据的支持,不过现在的 MySQL 4.1 也有了对空间数据的支持,以后可以好好研究一下。PostgreSQL 现在也有 Spatial Extension:PostGIS ,相信现在开源的数据库应该也能完成这方面的应用了。

听那老师的讲述,在科研领域使用 java 很多时候都是不合适的,因为太慢的速度,内存占用对于很大数据量的遥感影像处理完全不合适。而且使用 java 容易出现各种问题,一般较适用于有快速开发要求的商业应用,然后还可以因为容易出问题而使开发者可以实现提供长期的升级,修补等服务。呵呵。

PHPMailer:Featured email transfer class for PHP

PHPMailer 是一个很有用的 PHP 发送邮件的类。它支持使用 smtp 服务器发送邮件,同时支持 Sendmail, qmail, Postfix, Imail, Exchange, Mercury, Courier 等邮件服务器。SMTP服务器的话还支持验证,多SMTP发送(不过不太清楚有什么用).邮件发送可以包括多个TO, CC, BCC and REPLY-TO,支持text和HTML两种邮件格式,可以自动换行,支持各种格式的附件及图片,自定义邮件头等基本的邮件功能。

由于 PHP 中只包含了一个 mail 函数,所以 PHPMailer 是对其很大的增强,相信是可以满足很多人的需求的,呵呵。其主要包括两个类文件:用于实现发送邮件功能的 class.phpmailer.php 和 smtp 实现的 class.smtp.php 。然后还有可以实现多种错误输出的文件,以及很详细的文档。软件发布遵循 LGPL 协议。

使用也很简单,看下面的例子就明白了:

  1. require(“class.phpmailer.php”);
  2. $mail = new PHPMailer();
  3. $mail->IsSMTP(); // send via SMTP
  4. $mail->Host = “smtp1.site.com;smtp2.site.com”; // SMTP servers
  5. $mail->SMTPAuth = true; // turn on SMTP authentication
  6. $mail->Username = “jswan”; // SMTP username
  7. $mail->Password = “secret”; // SMTP password
  8. $mail->From = “[email protected]”;
  9. $mail->FromName = “Mailer”;
  10. $mail->AddAddress(“[email protected]”,”Josh Adams”);
  11. $mail->AddAddress(“[email protected]”); // optional name
  12. $mail->AddReplyTo(“[email protected]”,”Information”);
  13. $mail->WordWrap = 50; // set word wrap
  14. $mail->AddAttachment(“/var/tmp/file.tar.gz”); // attachment
  15. $mail->AddAttachment(“/tmp/image.jpg”, “new.jpg”);
  16. $mail->IsHTML(true); // send as HTML
  17. $mail->Subject = “Here is the subject”;
  18. $mail->Body = “This is the <b>HTML body</b>”;
  19. $mail->AltBody = “This is the text-only body”;
  20. if(!$mail->Send())
  21. {
  22. echo “Message was not sent <p>”;
  23. echo “Mailer Error: ” . $mail->ErrorInfo;
  24. exit;
  25. }
  26. echo “Message has been sent”;

详见 PHPMailer 的主页