显示标签为“自由自在”的博文。显示所有博文
显示标签为“自由自在”的博文。显示所有博文

2008年11月19日星期三

有关WingIDE和非自由软件

我用Python写的程序往往都很短,其实我觉得多数Python程序都很短吧。所以我就是在Vim中编辑,在命令行下运行Python程序,调试就靠print。在写4digits的过程中,代码越来越长,调试工作量增大,我考虑要用一个IDE。

Python的IDE第一个看点就是代码补全。也试过一些(号称)有代码补全功能的IDE,但都不是拿来就立刻见到补全功能的。WingIDE的代码补全却很赞,随敲随出。

我在Python主页的维基上看到WingIDE有免费的开源许可,就是说如果只用来开发开源软件,那么就可以获得免费的许可码。我按照要求,把开源许可的申请下载、打印,用手签名,然后电邮给公司。之后,他们就给了我注册码。我申请的是双操作系统的许可,这样我在家的Ubuntu和我在办公室的Windows上都可以用WingIDE。而且如果我再签一份保密协议,甚至可以获得WingIDE的源代码,真是太慷慨了。

除了代码补全功能外,WingIDE用起来很方便的功能还有调试。设置断点调试,程序暂停后,用鼠标指到代码中的任意名字,都会用气球方式的提示显示出该名字的值,非常方便。在调试中,可以在Debug Probe窗口中介入暂停的程序,其实就是一个保持了程序暂停时的执行状态的shell。有内置的Python shell,可以进行方便的交互操作。另外光标所在处的变量的类型、文档等相关信息,都可以自动在相关窗口中显示。

先不说WingIDE的强大和方便。这个软件是商业软件,并不是自由软件。我只有在实在没有满意的自由软件时,才会用非自由软件。Python是自由软件,但是最好的(我认为最好的,但不少人就喜欢折腾Emacs)Python开发环境却不是自由软件。其实,自由软件和非自由软件,不可能有哪个可以完全取代另一个,它们会动态地共存。我的Ubuntu下面,除了WingIDE,还有一些商业软件,如Picasa(非常棒的照片管理和润色软件),Google Earth(好玩的地图),Skype(可以跨平台地语音聊天),Adobe Reader(备用的PDF查看软件),Opera(备用的浏览器),腾讯QQ(备用的QQ软件),微软的若干TTF字体(并不侵权)等。

有个叫vrms (Virtual Richard M. Stallman) 的程序,可以列出计算机中的非自由软件。我的目前是这样的结果(并不全):
tux@Paradise:~/docs $ vrms
Non-free packages installed on Paradise

autobook GNU Autoconf, Automake and Libtool Book
Reason: Modifications limited
cmap-adobe-cns1 CMaps for Adobe-CNS1
human-icon-theme Human Icon theme
latex2html LaTeX to HTML translator
linux-restricted-modules Generic Linux restricted modules.
linux-restricted-modules- Non-free Linux 2.6.27 modules helper script
linux-restricted-modules- Restricted Linux modules for generic kernels
opera The Opera Web Browser
picasa Image management application from Google
stardict-langdao-ce-gb langdao-ce-gb dictionary data files for StarDict2
stardict-langdao-ec-gb langdao-ec-gb dictionary data files for StarDict2
stardict-oxford-gb oxford-gb dictionary data files for StarDict2
sun-java6-bin Sun Java(TM) Runtime Environment (JRE) 6 (architecture
sun-java6-jre Sun Java(TM) Runtime Environment (JRE) 6 (architecture
sun-java6-plugin The Java(TM) Plug-in, Java SE 6
tangerine-icon-theme Tangerine Icon theme
tango-icon-theme Tango Icon theme
Reason: Creative Commons Attribution-ShareAlike 2.5 License
unrar Unarchiver for .rar files (non-free version)
Reason: Modifications problematic
wingide3.1 A commercial development environment for Python

Contrib packages installed on Paradise

dosemu The Linux DOS Emulator
msttcorefonts Installer for Microsoft TrueType core fonts

Contrib packages with status other than installed on Paradise

nvidia-kernel-common ( dei) NVIDIA binary kernel module common files

19 non-free packages, 1.0% of 1827 installed packages.
3 contrib packages, 0.2% of 1827 installed packages.
以前觉得安装这些软件会让计算机变得不够纯洁,现在已经没法避免它不纯洁了:D。

2008年11月8日星期六

一点点慈善

记得还在上大学时候,我在水木清华BBS的LinuxApp版面一个主题中发帖说,等我毕业工作后就向Debian捐款,JulyClyde回帖说,你那点工资,把自己养活了就不错了。他这么说是因为他知道我未来从事的职业。

2004年,我办了一张招商银行的信用卡,之后又在PayPal注册。当时是为了能在因特网上无国界地交易,但我忘了是不是为了给自由软件捐款。我注册了PayPal后,在账户得到认证前试了一下Send Money的功能,账户就被限制了。之后一只没有解限,直到今天依旧。这完全是他们愚蠢的系统造成的,而且还白白扣除了我1.95美元。

如果我的PayPal账户是好的,这几年我肯定兑现了我给Debian捐款的诺言,也就几百块了。时过境迁,如今我已是一个Ubuntu用户了,和Debian的关系也弱了,但我也没必要给Ubuntu这个用钱砸出来的发行版捐款。

这几天看到维基百科页面顶部有捐款的链接,那就给这个伟大的项目捐款吧,但是需要PayPal的。我刚注册了一个新的PayPal账户,本以为要经过若干认证之类的过程才能捐出去,没想到一注册好就把钱捐出去了,30美元。

我作为自由软件坚定而不乏理性的支持者,每每在内心会感谢我用过的那些方便、优雅、跨平台的自由软件,以及这些软件背后的人。我坚持使用自由软件,不时向不了解的人解释、介绍和宣传自由软件,开发自己的自由软件,就已经是对自由软件的支持了。但如果认为捐献了时间就不必要捐献金钱的话,那么这只是不舍得付出一点点的借口。

说到维基百科,比上传统百科全书最大的优点就是条目覆盖面广、条目释义丰富、更新频率高,但是文章质量良莠不齐,不正确、不准确、不一贯的条目很多。但这正是其特点,因为维基百科始终处于一个动态的发展过程中,永远不要指望它的条目都整齐划一。维基百科并不能取代普通百科,不同的场合选择不同的百科全书是个明智的选择。

2008年3月21日星期五

如何从Word文档里取出图片

我在办公场所只能用Windows,而且要经常用Word。有时候想从Word文档里面拷贝出一张图片出来,可是Office (2003) 却没有办法完成这个简单的功能。这里介绍两个方法,可以从Word文档中取出图片来。

一种是用OpenOffice (2.3.0)打开Word文档,另存为开放的ODT格式。ODT文件其实是个Zip压缩包。用7-Zip可以直接解压开,解压出来的文件中有一个Pictures目录,该文档里的所有图片就在这个Pictures目录下。

另一种还是用OpenOffice打开Word档,可以直接输出成PDF档。然后用Adobe Reader打开PDF文档,选中图片后复制,在GIMP里面粘贴为新图像即可。当然,也可以用PDFCreator把Word档打印成PDF再操作。

上面提到的OpenOffice,7-Zip,GIMP和PDFCreator都是自由软件

2008年3月10日星期一

巧取附件

让刘梅帮我从IEEE下载了一篇文章,MSN传太慢,就发到我的Gmail里面。谁知网络太卡,那个一兆多的PDF附件存一半就断了。wget应该可以通过HTTPS验证后来下载附件的,可我弄了两下不成功就罢休了。唉,懒得研究man去折腾了。不过最终我还是巧妙地把文件得到了。

虽然附件下载慢,但是点击回复菜单的Afficher l'original(显示原始邮件之意,这是法语界面的显示),可以用文本形式打开原始的邮件内容,而且速度很快,将近两兆的文本很快就打开了。保存下来之后,把里面附件那部分拷贝到一个新文件,这个文件就是附件的base64编码结果。又是可爱的python:import base64后,base64.decode(file('encoded'), file('decoded','w'))即可得到附件了!encoded是要附件编码后的文件,即附件的base64编码文件;decoded是目标文件,即解码后的结果,就是要的PDF文献了!

多亏Gmail显示原始邮件内容很快,不会像附件那么慢。其实Google还有其他一些类似的特点,比如搜索出PDF或者PPT文件,点击View as HTML会立刻打开;类似的Gmail附件按HTML显示也很快。

2008年1月13日星期日

Firefox使用技巧之三——用Gmail作邮件发送程序



自从用了Gmail,就慢慢不用Thunderbird了,因为网页界面的Gmail用起来很棒,现在我已经完全不用Thunderbird了。但是要把Gmail设置成默认的邮件发送程序却似乎比较麻烦。有这样的Firefox插件,但我没有找到满意的。我只好把gnome的邮件程序设置为Gmail的页面,但我弄不清Gmail发送邮件用的URL,所以结果也不满意。

今天发现,安装了Firefox的谷歌工具条之后,在网页里面点击电邮链接,Firefox就会问是否以后点击电邮链接时打开Gmail页面。选择是,以后Gmail就成默认的邮件程序了。或者在谷歌工具条的设置里面启用此功能,如图。

该技巧只限于Firefox里面的电邮地址,并没有设置系统的默认邮件程序。

* 技巧一、二在胖鸭子之家

2007年11月21日星期三

懊悔的感覺

11月的下載統計
現在心里哇涼哇涼的,唉!話要從前天晚上說起。

前天晚上我把我寫的猜數字游戲4digits的0.8版放到Sourceforge上后,發現沒一會儿就開始有下載了,可是以往一個月最多下載也就十來次。第二天看,還有人不停地下載。我以為是什么人用机器人下載呢,但是也不像机器人下載的,因為除了下載,還有网頁瀏覽統計。這兩天總共下載了200多次,而在這之前一年的下載總共才110來次。

今天晚上回來,我看到0.8發布的新聞標體寫的是"4digits Puzzle Game: 0.8 Released",而我本來想寫的是"4digits 0.8 Released",是我不小心粘貼成那樣的。我這個人喜歡追求完美,所以就把新聞標體改了回去。

用雅虎搜索4digits這個關鍵詞,發現有一條結果來自Sourceforge的首頁。我很好奇4digits怎么會跑到首頁,我覺得只是暫時出現,現在應該沒有了,就直接點開网頁快照一看:這條新聞竟然被放到了SF的首頁,怪不得這兩天會有那么多“瘋狂”的下載,原來直接從SF首頁跑過來的!


我后悔的事情是:我剛剛改動了這條新聞!SF有這樣的規定:
If this item is on the SourceForge.net home page and you edit it, it will be removed from the home page.
如果一條新聞放到首頁之后被編輯,就會從首頁刪去。所以4digits的這條新聞就從首頁拿下了。

我在改標體的時候想到過這事,但我根本不會想到4digits的新聞會被放到首頁,當然就改了。要知道放到首頁的新聞都是人工挑選的,工作人員覺得值得放到首頁宣傳的新聞才會上去。我這個游戲那么簡單,平均一天不到一次下載-_-,我寫的英文又不地道,我根本沒指望被放到首頁去。所以前天晚上這條新聞都是胡亂寫的:
4digits is a guess-the-number puzzle game. It's also called Bulls and Cows, and in China people simply call it Guess-the-Number. The game's objective is to guess a four-digit number in 8 times.

Hi all,

Eight months after 0.4, 4digits 0.8 is released today. This version features high score function, a hint table for marking and many improvements. Just download and enjoy it!
你看看,Hi all竟然放到了第二段。以前按照文檔里面的指示,我也把新聞寫詳細點,這次我都懶得了,隨便介紹兩句完事。命運真是喜歡捉弄人,認真寫的不會上去,不認真寫的偏偏又上去了;上去了呢,又給我拿了下來。也許正是因為原來題目里面的"Puzzle Game"吸引了編輯,給我加上去了呢,否則"4digits 0.8 Released"也看不出是個什么樣的程序。

唉,這么難得的一次宣傳机會竟然被我自己葬送了。我現在好后悔,好想找個能听懂我這個故事的人傾訴一下,可是周圍一個人也沒有。鬱悶啊。:( 剛才發信息打電話給千里之外的某人傾訴了一番,哈哈。

2007年7月10日星期二

一隻兔子引發的血案

Plan 9的圖標上周末心血來潮,想裝一個Plan 9。起因是看到剪風的小兔子豆瓣頭像,讓我想到了Plan 9的圖標,于是去它的主頁逛,然后就想裝一個。裝它的原因主要是其圖標太可愛了。一個學院式的操作系統,能夠用一個超級可愛小兔子作圖標,作者也必是可愛之人,因此就該玩玩。Plan 9的文件系統叫Fossil,這是第二個讓我覺得有趣的地方。于是我下載了安裝文件,讓同屋林幫我刻盤。從光盤進去玩了不過癮,就划了分區從硬盤安裝。

正在安裝Plan 9安裝過程很簡單,也很順利。在拷貝光盤內容時候花時間較長,我就給它照了相,不過這也是它唯一的存留了。

安裝好后我重啟進入Ubuntu發現:擴展分區hda2的四個邏輯分區都認不出來了,而Plan 9正安裝在硬盤開頭的hda1分區。我本來想在第二塊硬盤上安裝Plan 9的,這塊硬盤上的東西丟了也沒什么。一念之差,結果卻是災難。丟了的四個分區中,一個是我應急用的1G大的Debian,一個是交換分區,這兩個丟了沒關系。還有一個是我用了近三年的家目錄,這是最可惜的。在GNU/Linux下,用戶使用程序的偏好和數据都保存在家目錄下,即使重裝系統了,使用原來的家目錄,那么程序仍和以前一樣的設置。另一個是文檔分區,里面是我的照片、圖像、程序、參考文檔等等,這也是很大損失。

后來試圖恢复這些分區,但自己技能有限,只好作罷,把它們刪了。不過重要的東西我以前都備份在了第二塊硬盤上。慶幸前不久開了4digitsSVN倉庫,直接抓下來就可以了。個人主頁從服務器下載到本地即可,還從上面恢复了我的.vimrc ^_^。備份東西應該越遠越好,最好是在外地的電腦上。

這次的教訓很多,最重要的就是要重視備份。所以我開始用rsync備份整個家目錄到另一個硬盤。不過我們不該過度依賴外物,電腦上的東西也是身外之物,能做到丟了就丟了,那是更好的狀態。

2007年6月5日星期二

在Openoffice图形里插入EMF图像

OpenOffice的绘图程序画示意图很方便。我喜欢用OO输出PDF,然后把PDF插入文件中用pdfLaTeX处理,这样生成的文档中用的是矢量图,要比位图清晰。看惯了清晰的图,看到模糊的图就不爽想重画。我在OO里面摞着一幅位图临摹这幅图,其它部分都是在OO里面画的,但是图中有一个飞机,用OO似乎不好画,但是用Ipe的样条曲线画起来非常方便,所以我是用Ipe画的飞机,然后保存成EPS格式。

我把这个EPS文件插入OO画的图里面后输出成PDF,用Adobe Reader放大到64倍(Evince, KPDF和xpdf都不能放那么大,我这才发现放很大的好处)后发现飞机线条的边缘竟然有灰色,这在正常大小下看不到。这说明OO对EPS的输出结果不是很好,虽然应该也算“矢量化”。可是我从网上搜索的EMF格式的清华校徽,用OO输出为PDF放大到64倍后,边缘仍然是清晰锐利的,没有丝毫模糊。我得出的结论就是:OO(2.2.0)从EPS输出的PDF质量没有从EMF输出的好。

于是,我就需要把EPS转换为EMF再插入OO了。我在pstoedit的手册页里面明明看到支持EMF的,但是用的时候却说未知格式。无奈的我只好用pstoedit把EPS转换成xfig格式,再从xfig里面输出为emf(天哪!)。可是pstoedit输出的xfig比较丑陋,曲线都是一段一段接起来的,无法满足我挑剔的要求。

我搜索到了一位叫Jan的于2003年(四年前!)在Redhat 9下用pstoedit把EPS转换为EMF,要编译libEMF来让pstoedit支持EMF。于是我在其Sourceforge主页下载了源码,结果编译不过,一堆C++的错误。我很纳闷四年前都能实现的功能,现在的pstoedit竟然不能,为什么Ubuntu发行的pstoedit不加入EMF支持,还要用户自己编译呢?我就发电子邮件请教人家。之后我下载了Windows下的pstoedit,在楼下同学安装后,总算把我的EPS转换为EMF了。不过结果仍然没有原初的EPS完美,放大足够大之后,飞机的轮子就成了八边形……

今天早上收到Jan回复,他说还是要编译libEMF。我也发现pstoedit的EMF支持正是通过libEMF实现的,于是我去pstoedit的Soureforge主页,发现那里可以下载libEMF-1.0.3,有别于前面我在libEMF主页下载到的。然后编译libEMF,再编译pstoedit。虽然pstoedi的checkinstall失败了(它竟然要安装/usr/bin/ld!),但是直接用make出来的pstoedit运行就可以,支持EMF,然后把我的文件转换了。结果和Windows下转换的一样,也是八边形,但只能这样将就了。

折腾一番,算是长了点插图的经验,记在这里供以后回忆参考。

2007年5月31日星期四

记谷歌开发者日


Guido van Rossum

今天我参加了谷歌2007开发者日。要不是水木的mirror怂恿,我大概就不会来的。因为我俩都喜欢Python语言,他让我去瞻仰Python的发明者Guido van Rossum日程安排在此处,同时进行的会总有两个,一个关于谷歌应用程序编程接口,另一个关于Linux和开源,我只感兴趣后者。Guido演讲的主题是Python语言的历史、现状和未来,内容都是关于Python的基本的东西,Guido的语气也比较平淡。

大家的提问很多,都写下来交上去的。最后一个问题是我的,念到我的问题时Guido露出了一点惊奇的微笑,我的问题是"I am sorry, but what's the official pronunciation of your name? |'gaidəu|, |'gidəu| or |'gwidəu|?",因为我听到主持人念作|'gwidəu|时觉得很别扭。他回答说,他父母叫他|'ridəu|,在荷兰语里面是这么发音的,也可以叫|'raidəu|,但是汉语里面没有|r|这个音;美国人一般叫他|'gwidəu|或者|'gaidəu|,不过他对什么样的发音都会答应。这里我用|r|表示他发的“喝”这个音,因为它和英语的|h|不同,倒是像法语的|r|。我不知道荷兰语里面他说的这个音怎么发,有谁知道告诉我一声。演讲后我发给他听,他表示认可。

Guido比我想象的要高,因为以在照片里看不出来身高。演讲之后我问他多高,他说是186cm,啧啧,比我高10cm啊。我和他照像时候他坐着我站着,照出来不好看,后来又照了一张,就是上面的,但因为没有打闪光灯,所以黑黑的,尤其是把Guido弄得比我黑,对不起啊。

我又问了两个问题。一个是python的交互外壳功能比较少,以后会不会用ipython作外壳。他说不会,因为ipython发布新版很快,而python发布较慢,而且要让核心语言尽可能小。另一个问题是会不会用wxPython或者PyGTK来替代Tk作为Python的默认图形界面工具包。他说不会,因为wxPython和PyGTK都没有Tk稳定,wxPython如何如何初始化会崩溃,而Tk很稳定,但由于基于网页的应用越来越重要,客户端软件就显得不那么重要了,以后有可能把Tk从Python中去掉,即默认的Python不包含图形界面工具包。

吃饭后我才发现我把发的T恤拉在二楼了,里面可放着Guido的签名呢。赶紧下去找,可惜早就被收拾掉了,真是对不起他:-(。晚饭中间,女主持让大家畅所欲言,发表感想。上去说话的都是国人,都讲中文。我看到Guido趴在桌子上休息,大概因为累了,而且听不懂中文,所以很没劲。后来上去一学生讲英语,Guido就起来了,最后竟然还鼓掌了。看到他这样子,偶像级别的人物开会时候也要应付,就觉得有意思。

其他人

在Linux和Open Source分会场第一个演讲的是Jon Trowbridge,语言和动作比较随和,演讲起来很有激情,以至有人问他“Why are you so exciting?"。第二个是Mike Schroepfer,介绍了Firefox开发相关的情况。他的幻灯片是在Mac下做的,深蓝底色上的白字,在会场的灯光下看起来很清楚,每页的字少所以足狗打,算是所有幻灯片里面做得最好的。下来就是Guido了。最后是苏哲,他的演讲稍有些偏技术,介绍编码系统、wchar, locale, gettext等,用了不少代码。我觉得听众比较多的时候,往往大家水平差异较大,这时讲通俗点效果更好。我问了苏哲两个问题。一个是scim何时能有按句输入功能,因为苏哲曾经说按句输入要比按词输入先进。他的回答是scim有这个功能,但是正确率很低,所以大家都不用,想用这个功能可以等待谷歌输入法的Linux版。另一个问题是智能拼音的繁体输入为什么没有词组,他说因为他没有繁体词库。

总结

今天见到Guido是我最开心的事情,另外能听到四场精采的演讲也很不错。这是一次成功的会议,Google和开源社区都会受益不少。

2007年4月23日星期一

4digits进入Debian unstable了

4digits截图
今天早上,收到4digits ITP bug关闭的信,标志着4digits正式进入Debian unstable。

4digits 0.4写好后,我在freenode的#ubuntu-cn频道里问有没有人可以给我的游戏打包。Huahua看了我的程序后让我联系freeflying,他是Ubuntu维护人员。

后来有一天,caiqian在频道里问有没有好的国产软件,好久没有打包了。原来他是Debian的维护人员。Huahua告诉他我有东西要打包,于是caiqian打算给4digits打包。同一天晚上,caiqain让我提交了WNNP的bug。从三月二十二日提交这个bug到今天deb包上传到FTP并关闭这个bug,正好一个月,应该说是蛮快的。

那天后不久的某一天,在频道里谈到Blogspot,Huahua顺口说让我在blog上写一篇关于提交4digits给Debian的事情,说让更多的国产软件进入Debian。我答应了他,但是要在4digits进入后我才能写,也就是今天。

要让软件进入Debian,软件功能不一定多全,主要是不要有大的bug。开源软件开发模式就是"Release early, release often",所以软件有更新就可发布。在写4digits之前我只写过两个PyGTK程序,第一个只有几个按钮,用来看上海交通大学的电视直播(需要IPv6访问),第二个就是摄像机标定程序了。4digits的glade文件不到600行,python文件不到200行,实在是简单得很。

最后希望各位自由软件爱好者,积极地向Debian, Ubuntu等发行版提交自己的软件,让更多国人的软件进入GNU/Linux发行版。

2007年4月4日星期三

选择:PyGTK

从我第一次接触电脑至今都有十年多了,可是一直没有学习图形界面编程。因为一是没有迫切的需求,二是后来已经习惯了GNU/Linux下的命令行程序。后来我老师看我写的都是命令行程序,他说没有“界面”怎么行。没办法,我得认真地学习图形界面编程了。

Linux下的图形界面编程有很多种库,对我可选的有GTK, PyGTK, wxWidgets, wxPython, Qt, PyQt等,甚至Java。因为我一直用的GNOME,而且喜欢GNOME胜过KDE,所以Qt和PyQt很快就被排除了。学过一点GTK编程,但是每次修改后要编译较费时间。而wxWidgets一点也没有接触,对那些语句比较陌生,所以排除了wxWidgets。Java程序比较慢,而且以前Java不是自由软件,所以我没有去学习,没有经验。Python倒是学过一些,希望能用在图形界面编程上,这样起步比较容易。下面就是二选一了:wxPython还是PyGTK呢?wxPython的程序在Linux下是GTK风格,在Windows和 Mac下的外观和操作系统风格一致,而PyGTK在哪都是GTK的外观。

尽管如此,我最终选择了PyGTK。因为我的操作系统是Linux,而且也不会用Windows和Mac(都不是自由软件),所以不必过于追求外观的跨平台一致性。

现在看来,我的选择没有让我后悔。

2007年3月12日星期一

Windows下安装PyGTK


因为我的老师喜欢图形界面程序,周末我又学PyGTK,写出了我的第二个图形界面程序。这个程序就是上次说的OpenCV摄像机标定程序的图形前端。虽然我平时不用Windows,但是为了给老师演示我写的程序的跨平台性,我打算在Windows下也运行一下这个程序,所以需要在Windows下安装PyGTK。

PyGTK的首页有一个某人做的多合一的安装包,下载安装,然后双击一个简单的文件选择对话框的Python文件,界面就出来了,非常的简单。我又双击我的标定程序,这次没有出来。进入命令行一看,原来没有找到gtk.glade模块。看来这个多合一安装包里面还没有python-glade。我找了一上午竟然没有找到,主要是不知道在哪个包里面。中午回来在Freenode的#python频道里面问到了。根据PyGTK FAQ上的指示,到gladewin32下载libglade-bin,把其中bin目录的内容释放到gtk安装目录的bin目录即可。下午趁师妹还没来(怕影响她用电脑),在她电脑上装好了。之后双击我的程序,图形界面就出来了。在Ubuntu下写的程序,一字未改就能在Windows下运行了。虽然这是我预想的,但是亲自动手实现,还是让我佩服了这些程序一把。这些自由/开源软件的跨平台性,可绝不是浪得虚名。我也又体会了一次小小的成就感。

2007年3月7日星期三

不要放弃


从这周开始我要学习用OpenCV标定摄像机。从周一开始研究OpenCV,主要看如何用其标定功能。OpenCV的程序里面一大堆cv,CvPoint3D32f、cvFindChessboardCorners、CV_32FC1……看得人头晕。我稍微看了看就开始搜索网上的例程,我可不想自己从头编,因为没有必要重新发明轮子。搜到过几个例子,但每个都在编译时候有问题,即使改动程序,让其能够运行,可是还是得不到让我信服的结果。还有的程序是Windows下用了Visual C++的,这样的程序我是不会去下载的。因为我要在Linux下程序这样折腾了两天,到昨天晚上时我都快要崩溃了。晚上就堕落了,玩了很久的Supertux。

今天早上又要硬着头皮去啃了。我用昨天刚注册的雅虎账号在OpenCV的雅虎讨论组里面搜索,点开了一个链接,正是OpenCV的源里面的标定例程。可是我昨天下载的OpenCV 1.0里面没有标定的例程,但是CVS里面恰恰有。

这个例程不用修改就可成功编译,并且提供了足够的命令参数,不必修改代码即可对各种情况的靶标图像进行处理。我用例程处理了几组下载的图片例子,发现结果和例子中提供的一致。我不用再找别的例子了,就从这个程序开始研究。我以前用软件几乎不下CVS里的代码,因为我觉得没有必要用那么新的。没有想到我踏破铁鞋寻找的东西,正在OpenCV的CVS仓库里。

学OpenCV两天,几乎要崩溃的我,正是因为第三天没有放弃,继续去寻找,才得到我要的东西。以前也有过类似的情况,有时困难很难克服,我告诉自己要坚持,结果往往是成功。成功和失败有时只差一步,但这一步是最难跨越的一步。如果坚持迈出这最后一步,成功也许就到面前了。

我想起了初中时候也在我的英语词典上的一首叫Don't Quit的小诗,就是照片中的这首诗。今天重读这首诗,发现对这首诗有了切身的体会。我会在后面的文章里面写出这首诗。

2006年10月18日星期三

恢复dpkg包管理系统

今天把Ubuntu下/var/lib/dpkg/和/var/cache/apt/里面的东西都删了,然后包管理系统就坏了,折腾了两个钟头才恢复。其实只要新建与删掉的目录和文件同名的目录和文件,基本就能弄好了。

事情的经过是这样的。我把源列表里面的breezy改成dapper,update之后又想改回breezy了。我不想用dapper,因为里面的tetex是3.0,breezy里面是2.0,升级到3.0后配置好的cjk就不能用了。但是debian并不提供系统的降级,在aptitude里面仍然显示所有要升级的软件包。于是我在/var/lib/dpkg/和/var/cache/apt/里面都执行了rm -rf *,清空前一个目录时本想备份一下,但觉得不会出什么大问题就直接删除了,这样dpkg包管理系统的信息就都没有了。

之后我在aptitude里面安装新软件时出错:
debconf: apt-extracttemplates failed: Bad file descriptor
E: Cannot get debconf version. Is debconf installed?
debconf是安装了的,只是包管理系统里面没有关于debconf的信息。于是我新建了/var/lib/dpkg/status这个文件,在里面添加了debconf的信息。这个错误没有了,但是还有下面的错误:
unable to create updated files list file for package ....
不知道怎么解决,后来找到了一个恢复包管理系统的脚本,运行了一下有错,出错的地方正好是建目录的一段,那里正是新建我删掉的目录的地方。于是我手动创建了删掉的目录:
/var/cache/apt/archives
/var/cache/apt/archives/partial
/var/lib/dpkg/info
/var/lib/dpkg/parts
/var/lib/dpkg/alternatives
/var/lib/dpkg/methods
/var/lib/dpkg/updates
另外/var/lib/dpkg/status和available这两个文件我之前已经创建了。之后在aptitude里面就可以安装包了。不过aptitude里面显示所有包都是未安装的,包括之前已经安装的,不过这并不影响这些程序的使用。

今天是心情比较急,删了明明知道不能删除的东西,但愿这样的蠢事以后不会发生了。

2006年10月9日星期一

给Gnome Robots制作新图片(二):强大的Imagemagick

今天用Imagemagick的montage实现了命令行的图片组合,上图就是得到的图片。我再次体会到了Imagemagick的强大,上次是用Imagemagick来缩小JPEG图片的。

昨天得到的图片只是第一个版本,每个小图片还需要改进,如果用GIMP 一个一个挪动的方法就会很麻烦,所以我研究了一下montage的命令行参数,得到了生成Gnome Robots图像的方法,就是一行montage命令:
montage -geometry 16x16 tux1.png tux2.png tux3.png tux4.png tux5.png gates1.png gates2.png gates3.png gates4.png gates-v1.png gates-v2.png gates-v3.png gates-v4.png dead.png -tile 14x1 -background transparent bill.png
tux1.png到tux5.png是从左到右的五张小企鹅图片,其它也是按从左到右的顺序命名的。

这种方法比用GIMP容易多了,而且可以很容易地重复操作。我把用montage得到的图片和用GIMP得到的对比了一下,发现用montage得到的图片比用GIMP得到的更精确,因为用GIMP的方法要挪动14张图片,容易出错,而montage的tile参数已经指定了按14行1列的布局排列图片,不用指定每个图片的偏移了。

2006年10月8日星期日

给Gnome Robots制作新图片(一):用GIMP的实现

今晚要弄个Gnome Robots的新图片,用GIMP不知道如何精确排列图片,就用Inkscape,但是Inkscape(0.44版)的Object -> Grid Arrange根本不能用,行和列自动变为1,而且按了Apply后没反应。然后想用Scribus,但是Scribus(1.2.5)的File -> Import -> Get Text/Picture是灰色的,也不能用。我又用Imagemagick的montage命令,但是不带参数地执行后得到的图片不是由输入图片紧挨着从左到右排列生成的,而那些选项我也看不出眉目来。最后用GIMP比较麻烦地完成了,怕下次忘了,就简单记下来。

首先准备tux.png,gates.png,gates-v.png,dead.png,每张图片都是16x16的背景透明png图片。然后新建224x16的背景透明图片bill.png。把tux.png复制后粘贴进bill.png,然后菜单Layer -> Layer to Image Size,然后Layer -> Transform -> Offset,在X偏移值里面填入-114,确认,这样把第一个小企鹅左移114像素,正好在bill.png最左边。然后Layer -> Duplicate Layer,对新复制的层进行X方向16的偏移。然后再复制刚刚移动过的层,再偏移16,直到得到5个企鹅。用类似的方法再从左向右依次加入4个gates.png,4个gates-v.png,1个dead.png,即可得到最终的bill.png。将其复制到/usr/share/pixmaps/gnobots2里面,打开Gnome Robots即可选择新的图像bill了。

2006年9月28日星期四

在Linux下用Windows下的共享打印机

终于可以在我的Ubuntu下面用实验室Windows下的共享打印机了。下面总结一下,供我以后查阅。

首先要安装以下的包:
sudo aptitude update
sudo aptitude-get install cupsys cupsys-bsd cupsys-client samba smbclient
如果共享打印机HPLaserJ位于mea工作组的zheng电脑下,型号是HP LaserJet 1200系列,那么执行如下命令来添加该打印机[1]
lpadmin -p zhengprinter -v smb://mea/guest@zheng/HPLaserJ -P /usr/share/cups/model/hplip/HP_LaserJet_1200.ppd
enable zhengprinter
accept zhengprinter
lpadmin -d zhengprinter
上面的命令首先增加打印机zhengprinter,然后让其可用并可以接收打印任务,最后把它设置为默认打印机。上面的命令在/etc/cups/printers.conf中增加相关内容。

然后要打开cupsys和samba服务:
sudo /etc/init.d/cupsys restart
sudo /etc/init.d/samba restart
这两个服务都是必需的,缺一不可。上面的步骤如果都没有错误,那么就应该可以在Linux下使用Windows下的共享打印机了,可以用
lp testfile
来测试是否成功,用相应的文件替换testfile。

以前曾经试着用gnome-cups-manager配置过这台打印机,但是没成功。下面总结一些问题以及解决方法。

1. 用lpadmin增加打印机时,如果出现lpadmin: add-printer (set model) failed: client-error-not-found这样的错误,看看ppd文件是否存在。如果没有需要的ppd文件,就需要安装相应的包。

2. 开始lpadmin添加打印机时,我用smb://zheng/HPLaserJ指定打印机地址,在打印时总是出现下面的错误:
Unable to connect to SAMBA host, will retry in 60 seconds...ERROR: Connection failed with error NT_STATUS_ACCESS_DENIED
错误消息可以用tail /var/log/cups/error_log查看。在搜索了一些网页后,还是不知道怎么解决,不经意中看到这么一个类似问题的回复[2]
Change the URI format to DeviceURI smb://WKGRP/guest@server/printer
due to a recent security update to CUPS.
我于是把打印机地址改为smb://mea/guest@zheng/HPLaserJ,重新运行了lpadmin,然后打印机马上吱吱响了起来,打出了队列中的测试页。要不是偶然看到这个,我真不知道什么时候才会弄好。

3. 如果仅仅是使用Windows下的打印机,不需要对samba进行任何配置,即不需要改动/etc/samba/smb.conf。

4. Ubuntu里面我的用户在lpadmin这个组里面,所以上面添加打印机的操作无需root权限。

5. 在这里命令行比图像界面好。虽然gnome-cups-manager也可以设置打印机,但是添加打印机时选择Windows打印机后,不停弹出局域网电 脑的认证对话框,而且总是跳 到最前面,很烦人。不同发行版的图形界面配置程序往往有差异,甚至同一发行版不同版本程序的界面都不同,而命令行方法在Linux下都是通用的。用命令 行知道每一步在做什么,而且失败了有更多的出错信息。

6. 如果要多次测试打印机,可执行不带任何参数的lp,lp将从标准输入(stdin)读取内容,输入一个空行后按Ctrl-D,就可以让打印机走一张白纸了。这样可节约纸张。

2006年8月21日星期一

如何创建一个C语言库

今天终于学会了如何创建一个C语言的库,就是把自己写的函数不放在主程序里面,而是放在独立的头文件和其他C文件中。这样可使主程序清晰,而且代码维护起来更容易。

比如写了个求中位数的函数median(),希望在主程序中调用median()但不出现它的代码,可以在主程序头部写上#include "median.h",median.h要和主程序放在一个目录下。median.h中的内容就只一行,是median()这个函数的原型声明,例如 extern int median(int [], int);,而median()函数的代码写在另一个文件median.c中。

编译和连接主程序时,需要多加一个文件median.c,即要用gcc -o main main.c median.c 。用上面说的方法,就可把自己写的函数作成C语言的库了。

另 一种方法是把所有东西都写到一个头文件median.h中,前面是函数原型声明int median(int[], int);,接着是函数的代码。这样编译和连接时,就无须增加median.c,只需 gcc -o main main.c。这样虽然只有一个文件,但是如果代码较多就会让头文件比较乱,所以把头文件和真正的代码分开是创建库的更合理的方法。

上面的总结主要参考了How C Programming WorksEasyBMP的源代码。记下此笔记,供以后查询。