小巧的编辑器Geany

我对PHP编辑器的要求不高,不过很多软件却不合我意:

首先,最好是免费的,所以挺好用的Zend Studio落选了。并且我发现似乎Zend Studio与ibus或者ubuntu jaunty有点冲突,有时候中文就出不来了。

其次,小巧,java的最好不要,所以Eclipse也落选了。

最后,最小功能集:语法高亮(废话)以及类函数列表(可以帮助我快速定位)。就这两项功能,淘汰了gedit(支持得不好)、vim(无法列出类函数)等工具。

当然,隐含要求,支持中文输入法,所以gphpedit也不能用,正好也不喜欢它的颜色高亮模式(色彩搭配)。

所以,选来选去,今天才算碰到一个比较满意的────Geany,ubuntu源中有,目前版本0.14,看来开发历史并不长。使用gtk2,操作流畅。除了类函数列表以外,还有一些贴心的小功能,比如自动补齐文件末尾的空行、保存时自动删除行尾空格等。

geany screenshot

默认的,Geany的快捷键Complete Word与中文输入法冲突,还好,可以通过设置删掉:双击-->Del-->回车

geany-solve-conflict-with-input-method

可怜的gphpedit也是这种快捷键冲突,不过我没找到设置方法。

其实Geany不仅能够处理PHP文件,还能够编辑多种脚本文件,新建文件时有内置模板可选,能够自动生成文件头的copyright及GPL声明。

总之,到目前的感觉,挺好用的。

Update @ 2009-12-29

ubuntu 中 geany 的版本更新较慢,喜欢追新的可以自行添加它的 PPA源

好玩有趣又有用的Mockups

Balsamiq Mockups For Desktop

见过flash游戏中,鼠标画个圆就是球,画个方块就能站住,画条线就能成跑道(这个很经典了,滑雪橇的游戏),也见过一个视频,老师讲课的时候画个斜块、小车、轮子就能够产生物理动作,看到Mockups以后,就也有类似的感觉,不过这个是用来设计软件界面的。

以前设计界面的时候用什么?想过但用的相对比较少,笨办法就是文字描述,左边放什么,右边上面放什么,右边下面放什么等等,高手会用ps画,只要不嫌累,还有画在纸、黑板上的,这些手段都有个共同的缺点────不方便管理和变更。现在不易管理、不可变更的工具用起来太累了,Mockups正是很好的解决了这个问题。

就像上面这张图片一样,在Mockups里,提供了很多用户界面设计元素,拖过来调整、搭配就能形成一张设计示意图,在设计阶段、持续变更阶段应该都是很好的表达工具,毕竟一图胜千言嘛。风格上是手绘的草稿风格,让人感觉和在纸上没区标,估计打印出来蒙人也没问题。技术实现上,依赖Adobe AIR环境,所以也是跨平台的。从图上也能看到,只要选中了菜单里的View -> Use System Fonts,中文支持还是可以的,好像不能选字体,不过够用了。

缺点首先是没有我想像中的“手工画线”,毕竟直接画和使用预制物件的感觉和灵活性还是有区别;第二就是速度,2006年买的电脑用起来都不算十分流畅;第三就是技术平台,个人对AIR不感冒,当然这个也没得改了,呵呵。

为ThinkingRock报表添加字体

ThinkingRock是一款用Java编写的跨平台的GTD工具,我试用过很多GTD工具,在线的、单机的、自架服务器的,转了好几个圈,最后又转回来用它了,主要理由就是方便,该复杂的功能就要复杂,该简单的功能就要简单,可以用Project/Action来组织复杂事务,支持任务分配(当然只是给自己看的,没有协作功能),还算方便够用的报表功能。说到报表就到本文的主题了,软件自带的几个字体都无法显示中文,生成pdf报表之后里面的中文都会变成井字号#,所以需要自己安装中文字体。

参照官方的字体安装说明,核心意思是该软件的字体读取使用了FOP,而这个FOP需要Font Metrics文件才能工作。FOP是Apache中的一个项目,我没有深入去研究,不过网站上也有一篇比较清楚的文章教人如何生成这个Font Metrics文件

但文章中的例子,使用库文件的位置和形式有点小问题,-cp后面是各个库文件,要能访问到才行,文中的路径显然不合适;文中各个库文件之间是用分号;间隔,这是在Windows中的写法,放nix下就错了,可以换成冒号:。所以,命令就变成了这个样子,注意所在路径的变化和相对路径:

$ cd /big2/tools/tr-2.0.1/tr/resource/fop
$ ln -s /big2/fonts/xpfonts/simsun.ttf
$ java -cp ../../modules/ext/fop-0.93.jar:../../modules/ext/avalon-framework-4.2.0.jar:../../modules/ext/commons-logging-1.0.4.jar:../../modules/ext/commons-io-1.1.jar org.apache.fop.fonts.apps.TTFReader -ttcname "SimSun" simsun.ttf simsun.xml

如果字体文件中包含多个字体,而你指定了错误的字体名称,系统会给出提示:

TTF Reader for Apache FOP 0.93

Parsing font...
Reading simsun.ttf...
This is a TrueType collection file with 2 fonts
Containing the following fonts: 
SimSun
NSimSun
Error while building XML font metrics file.
java.io.IOException: Name does not exist in the TrueType collection: Simsun

看到没,SimSun和NSimSun俨然就是宋体和新宋体啊。生成成功之后,simsun.xml就是我们得到的Font Metrics文件,所以接下来只需要再修改一下fop.xconf,把新字体的设置加进去就可以了:

<font metrics-url="simsun.xml" kerning="yes" embed-url="simsun.ttf">
  <font-triplet name="SimSun" style="normal" weight="normal"/>
</font>
<font metrics-url="simsun.xml" kerning="yes" embed-url="simsun.ttf">
  <font-triplet name="SimSun" style="normal" weight="bold"/>
</font>
<font metrics-url="simsun.xml" kerning="yes" embed-url="simsun.ttf">
  <font-triplet name="SimSun" style="italic" weight="normal"/>
</font>

好了,现在ThinkingRock的Tools -> Options -> Miscellaneous -> Action Screens中,就可以选择中文字体SimSun了,各种报表pdf中的中文也都会正常显示。

参考

发现fcitx也很不错嘛

scim使用了很长时间了,虽然其中有时候有些麻烦,总体来说也是不错的。不过我只用自然码风格的双拼,scim那丰富的输入法类型对我来说没用,今天心血来潮换fcitx用用,发现居然也是很不错的,比我刚开始在ubuntu 5.10下使用的感觉好多了。

我是直接安装源中的版本,apt安装即可,版本是1:3.4.3-1,输入法选字条上显示的版本是“GirlDog 3.4.3(新年版)”,更换输入法的时候,除了使用im-switch -s fcitx之外,还把/etc/X11/Xsession.d/95input的内容改成了下面这样:

export LC_CTYPE=zh_CN.UTF-8
export XMODIFIERS=@im=fcitx
export XIM=fcitx
export XIM_PROGRAM=fcitx
fcitx

然后重启X就能正常启动fcitx了。

fcitx的主要配置文件是$HOME/.fcitx/config,不过这个文件的编码是gb2312的,所以编辑之前要先更改一下shell环境的字符集(注意文件编码不能改,不然设置无效):

export LANG=zh_CN.utf-8
gedit config

更改设置之后,想立即生效就kill掉fcitx再重启(或者按Ctrl_5也行):

pkill -9 fcitx;fcitx

在我的安装中,或许是ubuntu改装的原因,反查拼音、删除拼音用户词组等快捷键好像无法使用,不过还好,自造词挺省事,直接编辑QuickPhrase.mb就可以了,不过这个文件也必须是gb2312编码才行。

总体fcitx给我的感觉是小巧、快速、够用,不过配置略微麻烦了一点点,需要修改配置文件,而不是像scim那样有图形界面的配置功能;另外就是很多地方,比如配置文件,使用gb2312内码,对于现在大多数utf8编码的linux来说,略微麻烦了一点点。

推荐大家看看fcitx官方网站上的中文PDF文档,挺不错的。

另外还有一个我不知道的问题,比如输入ubuntu,没按回车出英文,而是按空格出了个“手刹虐杀”的中文,以后就记住了,像这种“自造词”如何删除?Ctrl+Del不起作用呀。

Update @ 2007-07-11

刚换过来没几天,作者就由于别人的打击要放弃这个项目,真让人郁闷,Yuking一定要顶住恶势力的攻击啊~~

保存网页为单个文件/Save webpages All-in-one file

看到好的网页需要保存到本地的时候,有几种保存方式可选择,保存为网页文件(仅网页)的话,会得到一个html,但是不包含所有的图片等附加文件,保存为网页文件(全部)的话,会得到一个html文件和一个目录,图片等所有附加文件都在目录中,但是要想保存为一个文件并且所有的图片等附加文件还都完整的话,目前只有ie可以实现,那就是保存为mht文件,那么这个mht文件到底是什么呢?

mht其实是一种MHTML文件,MHTML是MIME HTML (Multipurpose Internet Mail Extension HTML)的简称,它的初衷是在邮件中嵌入HTML内容,RFC2557详细描述了文档定义。ie保存的mht文件、html格式的电子邮件、甚至chm文件都采用了MHTML或者相似的技术。

遗憾的是,不同的浏览器对mhtml的支持程度不尽相同,并且不同的浏览器保存的mhtml文件也不一定兼容(本部分内容主要参考自wikipedia):

IE: 自从1999年的ie5就支持保存为mht格式了,但在保存一些复杂页面的时候会出错。 Opera: 自从opera 9.0(build 8264, 发布于2006-3-10)起支持保存mhtml文件。 Firefox: mozilla、firefox系列浏览器到目前为止仍然不直接支持保存mhtml文件功能,虽然个人非常喜欢firefox,但是这的确是个缺点,甚至早在1999年就有人在Bugzilla上提出了这个问题,但没有得到开发人员的足够重视。不过倒是有个插件Mozilla Archive Format地址二)填补了这一空白,但是目前只支持到ff1.5,针对ff2只有一个非官方的build。据说MAF生成的mht文件和微软系列不全兼容。 Safari: 自动2005年4月29日的2.0版本,苹果上的safari支持保存网页为mhtml文件,但是却不支持显示mhtml文件。

由于浏览器对mhtml的支持相当的不统一,mhtml的使用受到了很大的限制,就我个人的感觉,还是以微软系列的mht为主流,甚至kde上还有一款kmhtConvert软件,可以把微软的mht格式转换为kde的mhtml格式——war文件。

由于mhtml的原理,所有支持mhtml的浏览器或插件采用的方式大多是变相的文件打包的方式,也就是相当于把网页完整保存下来,然后把html文件和目录下的图片等其他文件通过某种方法进行大包,并更改html文件中的链接,通过特殊的链接格式引用包中的资源文件。其实,除了mhtml以外,我们还有另外一个选择,那就是data: URI scheme


data: URI scheme和mhtml的不同之处在于,mhtml解决问题的方式是对多个文件打包,而data: URI则是直接把文件的内容包含在地址当中。比如我引用了一个图片文件http://www.fwolf.com/favorite.ico,mhtml的做法是把这个ico文件打包进去,而data: URI则是直接把地址http://www.fwolf.com/favorite.ico替换为诸如data: image/png; base64, iVBORw0KG…..这样的代码,从而实现所有的内容都在一个文件中的目的。

data: URI被大多数浏览器支持,并且语法由RFC2397定义,不同浏览器的处理效果基本一致,当然,和往常一样,不被ie系列支持。不过从我个人来讲,不管是windows平台还是linux平台,我都会选择firefox浏览器,所以可以无视掉ie。

当然data: URI也不是万能药水,它也有自己的优缺点:(本部分参考自wikipedia优点:

  • 增加了web访问的请求次数,比如一个包含2个图片引用的网页文件,一共会产生3次web请求——一次是文件本身,另外两次分别是那两个图片。这样会节省一些网络资源,因为http协议是无状态协议,每次请求都一定的系统开销。
  • 一般的浏览器默认配置都是最多同时使用2个连接访问服务器,所以请求次数的减少也节省了连接资源。有些web服务器从服务端也可以作类似的配置。
  • 浏览器缓存中的文件数目减少了。
  • 在一些访问受限制的场合可以使用,比如一个web界面的超文本编辑器,就可以通过这种方式在编辑区中插入图片。(不明白它在说什么)
  • 我想这同样适用于需要隐藏图片地址的场合,因为图片的地址就是它的数据,而不是到你服务器上某个文件的链接,所以这一点对付图片盗链者来说简直太有效了。
  • 可以避免页面采用https连接,图片等文件采用普通http连接所产生的“本页即包括安全内容,又包含不安全的内容”这样的情况。
  • 最重要的一点,通过它可以实现把网页保存为一个单独的文件 :)。

缺点:

  • 嵌入的内容在客户端要重新进行编码和显示,增加了一点点客户端系统开销。
  • 如果同一项资源被多次引用,也只能重复嵌入它的数据,没有“重复利用”这一说,如果网页中同一个图片被显示了100次的话,数据量的增加是惊人的。
  • 浏览器对URI长度通常都有限制,比如opera限制为4k,不过这只影响你把date: URI写到地址栏或者<a>标记中的情况。
  • 不支持数据压缩,采用base64编码的数据体积会增加1/3,采用url-encode编码的数据体积会增加2倍。不过如果web服务器启用了压缩,这一点的影响就可以抵消了。
  • 不被微软的IE支持。

data: URI的基本使用格式如下:

data:[<MIME-type>][;base64|charset=some_charset],<data>

mime-type是嵌入数据的mime类型,比如png图片就是image/png。 如果后面跟base64,说明后面的data是采用base64方式进行编码的,毕竟数据都需要编码以免和其他的网页内容相冲突。所以如果不采用base64编码,就必须使用urlencode把数据进行转换,在这种情况下可以使用charset=来指定内容的字符集。

下面贴几个data: URI实际应用的例子,先看效果,再贴源码,注意我贴的源码中英文引号会被WP替换为中文引号,另外为了显示方便会增加一些回车换行,如果要复制到本地实验的话最好直接查看本页面的源代码。

首先是一个图片的例子,我的图片也许大了些,不过用来作qq自定义表情发给朋友还是不错滴。 这个图片用来作qq表情传给别人不错哦 注意这可是很“长”的一行哦,源代码:

<img src=”data:image/gif;base64, R0lGODlhIwGVAPecAHmCwQAA/yBKv+P1//z+/7zo/6De/9Hv/1FOhMbj+I2x7SBd1IGAlur4//7/ /0hGh9Tw/+by/HiX3Vh4y3iW28nt/5/e/zVjzUJruzVmzyA9ryA5qzhSteb2//X8//f8/93z/6jh ……(省略若干行) RT3asYpVxKLsEujHwTGxjqh8pTRp1zruHGEQX5CCEZhwgzj2cpSDzCErxThAQq5tfMEk5Sq/B8xX LlF/8FSm/6b5xynaUD3zTFwpa/cixHbu05BWfCcwT+lCfZJPn148nyfniEzRCbSVoKwWMRUWEAA7 ” alt=”这个图片用来作qq表情传给别人不错哦” />

下面是一个在inline css中嵌入背景图的例子: data: URI 源代码:

<span style=”padding-right: 20px; background: url(data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD///+l2Z/dAAAAM0lE QVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4Ug9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQ AAAAAElFTkSuQmCC) top right no-repeat;”> data: URI</span>

再来一个嵌入javascript代码的例子,注意不同于上面两个例子,这次使用的是urlencode编码方式: 点一下这里–>Fwolf作品 源代码:

<script type=”text/javascript” src=”data:text/javascript;charset=utf-8,function%20test_urlencode_js%28%29%7Balert%28%27%E8%BF%99%E7%AE%97%E6%98%AF%E4%B8%80%E7%A7%8D%E5%8A%A0%E5%AF%86%E4%B9%88%EF%BC%9F%27%29%3B%7D”></script> <span onclick=”javascript:test_urlencode_js();”>点一下这里–&gt;Fwolf作品</span>

参考: MHTML on wikipedia Maf extension project for mozilla & firefox Mozilla Archive Format on Firefox Addons RFC2557: MIME Encapsulation of Aggregate Documents, such as HTML (MHTML) Bugzilla: Full rfc2557 MHTML multipart/related support in BROWSER(from 1999) Using HTML in E-mail kmhtConvert data: URI scheme RFC2397: The “data” URL scheme Using Data URLs Effectively with Cascading Style Sheets HTML as media container format

后记 @ 2008-01-12

opera也支持mht格式了,包括它的linux版本,不知道从什么时候开始的。

其实这篇文章在2007年6月就写好了,当时就想着写一个小工具,利用data:URI这个特性,能够把网页都保存到一个文件当中去,然后再发表文章,可这一等就是半年多,终于利用2008年春节的空档时间,把这个工具已经写好了,有兴趣的可以试一试,还不知道我的服务器能否支撑得住呢 :-)。

个人信息管理软件——todo/任务/日程表

Tomboy算是不错的便签软件了,但我还是觉得不够好用,我希望有一个这样的软件:

  • 能够记下我想要作的事情。
  • 能够在我作的时候,记下笔记。
  • 完成的不删除,存档起来供日后查看。
  • 有大的任务能够拆成小的,一项一项来完成。
  • 最好能够和日历结合起来,知道今天该作什么。
  • 有优先级和重要程度标记,紧急的、重要的要先作。
  • 离线使用,不依赖网络,便于管理,效率高。

但找了一大圈,始终没有十分满意的,下面是一些我试过的,以及一点感受,希望对有同等需要的朋友有帮助。

最开始是在便签软件中探索:

knotes 太简单了,只有条目,没有保存历史功能,无法记录笔记。

note 命令行界面,简单小巧,能写东西(vi),但时间的字体有些暗,命令行用起来也不方便。

notebook-gtk2 根本就没法用,点什么都没有反应。

notecase 纯记录东西来说,比tomboy方便,但是无法记录富格式文本,删除(完成)的note仍然无法管理。

rhinote 只能记一个,别的什么也干不了。

xfce4-notes-plugin 过于简单,同样是只能记录的小纸条

然后转向todo任务管理软件:

devtodo 字符界面,带优先级,可查看已删除项,但无法记录详细笔记。

gpe-todo: 总是莫名其妙得退出。

Segmentation fault

gtodo 优先级、查看已完成项都有,就是详细记录(comment)太小了,记不下太多东西,也不支持富文本。已删除的项管理方式也不是很理想。

又从wikipedia上扒出来几个综合的pim软件:

Chandler 侧重于calendar管理,整个一google calendar的离线版。

OpenSync 同步工具,虽然也可以在pim软件之间同步数据,但相信更多的是用于手机、PDA等设备。

Task Coach 侧重于任务管理,尤其适用于需要对大型任务进行分解,逐项管理子人物的情况。需要

python-wxversion python-wxgtk2.8

的支持。 个人觉得比较理想,但似乎在Ubuntu 7.04下安装不能运行,总提示No module named taskcoachlib

其他的像ThunderBird、Evolution什么的就不考虑了,太笨重,继续寻找ing。

Update @ 2007-11-21

Ubuntu Gutsy 7.10下运行Task Coach成功,需要安装python-wxgtk2.8包,中文输入的问题在Edit->Preference, Language中选择Simplified Chinese后,重启应用,换成中文界面之后顺利解决。参考