2013/03/27

Online Map Rectifying

New York Public Library Map Warper 提供地圖校正的線上服務,它將館藏的地圖,開放給使用者進行對應校正,成果就能搭配 Open Street Map 來顯示。

程式碼主體是 Ruby on Rails,在 Ubuntu 12.04 環境下,啟動前要安裝 cgi-mapserver,順利的話,連帶把 libgdal 裝好,想用 MySQL 的話,就執行 sudo apt-get install mysql-server mysql-common mysql-client libmysqlclient-dev。還有 curl 和 git,以及 libmagickcore-dev libmagickwand-dev。

身為 Rails 菜鳥,最簡單的安裝方式,當然還是 apt-get install ruby-rails,但這樣裝的版本會很舊,提示建議要先裝 nodejs (套件名稱不是 node 要小心) 和 RVM (Ruby Version Manager),在安裝 RVM 前,先確認 Ubuntu 已裝好下列套件:

$ sudo apt-get install build-essential libssl-dev libpcre3-dev libncurses5-dev libreadline6-dev。

執行 curl -L https://get.rvm.io | bash -s head --autolibs=3 --ruby 後,留意裝的 ruby 版本號碼,例如 2.0.0-p0 之類,如果不是自己想要的版本,就要再想法子更新。

按照訊息提示,執行 source /home/marr/.rvm/scripts/rvm 就可以使用了,終於可以 gem install rails 啦。

執行了 nypl-warper/script/server 後,出現訊息:

Missing the Rails 2.3.5 gem. Please `gem install -v=2.3.5 rails`,
 update your RAILS_GEM_VERSION setting in config/environment.rb
 for the Rails version you do have installed,
 or comment out RAILS_GEM_VERSION to use the latest version installed.

此處的 `gem install -v=2.3.5 rails` 對我而言,像是繞路的陷阱,執行到 Fetching: rails-2.3.5.gem 時,遇到:

rails's executable "rails" conflicts with railties
Overwrite the executable? [yN]

選 N 的話,會結束安裝:

ERROR:  Error installing rails:
        "rails" from rails conflicts with installed executable from railties

後來又遇到:

/home/marr/.rvm/rubies/ruby-2.0.0-p0/lib/ruby/site_ruby/2.0.0/
  rubygems/core_ext/kernel_require.rb:45:in `require':
  cannot load such file -- iconv (LoadError)

為了把干擾降到最低,決定把 Ubuntu 原本裝的 ruby 相關套件都 apt-get purge 移除,刪掉 $HOME/.rvm 重裝 ruby 1.9.3 rails 2.3.5。

Rails 2.3.5 application starting on http://0.0.0.0:3000
/home/marr/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/site_ruby/1.9.1/rubygems/dependency.rb:247:
in `to_specs': Could not find oauth (>= 0.3.5) amongst 
[actionmailer-2.3.5, actionpack-2.3.5, activerecord-2.3.5, activeresource-2.3.5,
 activesupport-2.3.5, bundler-1.3.4, rack-1.0.1, rails-2.3.5, rake-10.0.4,
 rubygems-bundler-1.1.1, rvm-1.11.3.6] (Gem::LoadError)

再 gem install oauth

Fetching: oauth-0.4.7.gem (100%)
Successfully installed oauth-0.4.7
1 gem installed
Installing ri documentation for oauth-0.4.7...
Installing RDoc documentation for oauth-0.4.7...

遇到 in `require': cannot load such file -- geo_ruby (LoadError) 使用 gem install geo_ruby 說「沒有 geo_ruby」,改用 gem install georuby 成功,遇到 in `require': cannot load such file -- pg (LoadError) 使用 apt-get install postgresql postgresql-contrib libpq-dev 和 gem install pg 成功。

接著是 invalid multibyte char (US-ASCII) (SyntaxError) 錯誤,在檔案前面加:

#!/bin/env ruby
# encoding: utf-8

至此,總算 ./server 跑起來了,新的訊息是:

The bundled mysql.rb driver has been removed from Rails 2.2.
Please install the mysql gem and try again: gem install mysql.
Status: 500 Internal Server Error
cannot load such file -- mysql

補了 sudo apt-get install libmysqlclient-dev 再 gem install mysql 應該是搞定了。

修改 config/database.yml 後,執行 rake db:migrate 遇到:

ERROR: 'rake/rdoctask' is obsolete and no longer supported.
Use 'rdoc/task' instead.

先修改 Rakefile 把 rake/rdoctask 換成 rdoc/task

再補 sudo apt-get install libgdal1-dev 雖然可以處理 gdal-config 找不到的問題,但 gem install gdal 還是出現 libgdal not found 問題。

遇到 Can not load gdal/gdal 改成 gdal 可過關。

找時間繼續...

2013/03/21

Open Source Economy

Open Source Economy
image from: http://www.dance-tech.net/profiles/blogs/1462368:BlogPost:20665

「免費軟體該怎樣賺錢?」

這算是老掉牙的題目,而且,很多朋友都知道「免費」跟「自由/開放」是不同的。不過,很少人能夠生動入裡地解釋這件事。

推薦這個影片 (via http://www.facebook.com/dongpo.deng/posts/545777462133601) --
The Future of the Open Source Economy by Paul Ramsey at FOSS4G 2009

簡報檔在 http://blog.cleverelephant.ca/2009/10/foss4g-2009-keynote.html

Paul Ramsey 以「商場競爭」和「生態演化」進行比擬,說明軟體演化的過程,競爭的是開發者的注意力,沒人用的軟體,進入滅絕狀態,沒人維護的軟體,則是走向衰危之路。進一步地看,軟體安全性也是軟體品質演化的一部份,越多人測試更新的軟體,就越有機會改善安全性。

剛好,前陣子施振榮先生在「談王道與共創共生」提到 Linux,他認為 Linux 雖然參與者眾,但對消費者的價值無法體現,因為沒有標準,參與者無利可圖,造成創新和持續的力量不足。他認為,在 Google Android 創造價值生態後,這現象有所改善了。

有趣的是,二十年前,Microsoft 對開發者的影響力算是相當大,現在競爭可多了,十年前,將 open source 視為威脅、病毒,抵抗那麼久之後,Microsoft 默默地接受和 open source 和解的事實。那麼,十年後又會是怎樣的光景呢? 且讓我們繼續看下去。

2013/03/17

Python Beginner Resources

今天參加的聚會,討論到初學 Python 的建議和學習資源。

有中文的教學文件嗎? google 會有線索,不過,新的資源通常還是英文內容較多。除了靜態的文件外,推薦參加線上群組或實體聚會,分享交流的效果通常比自己獨自學習來得更好。這些群組都是講中文的:Google+ CommunityFacebook GroupGoogle GroupPyHUGTaipei.py

最傳統的語法文件是 http://docs.python.org/2.7/tutorial/index.html,如果啃來覺得乏味,可以考慮 a byte of pythonDive Into PythonLearn Python The Hard Way

影片式的教學資源,也越來越多。例子包括:ShowMeDohttp://learnerstv.com/Free-Computer-Science-Video-lectures-ltv163-Page1.htmhttp://www.udacity.com/http://codeacademy.com/Coursera.orgGoogle Python Class。也有人在維護文件列表

著重程式概念建立的遊戲式網站有:PythonChallengeCheckIO,利用圖解強化學習效果的 Online Python Tutor

少不了的工具是 cheatsheet 文件:http://overapi.com/python/。等到想要進階時,可以參考 The Hitchhiker's Guide to Python

Android 環境的資源:http://python-for-android.readthedocs.org/http://kivy.org/#home

Windows Azuer 環境的資源:Tutorial for Python Web Sites with Django

2013/03/07

Set UID for Dexterity Type

When using collective.disqus in Plone, Disqus API by default looks for UID to identify the posts (comments). For the case to manually migrate Archetypes items, I need to set UID property for Dexterity items. Here is how it works:

$ bin/plonectl debug

>>> from plone.uuid.interfaces import IUUID
>>> IUUID(app.mysite.myfolder['a-sample-item'])
'870c668b918247ef89645a6e18007a96'
>>> from plone.uuid.interfaces import ATTRIBUTE_NAME
>>> setattr(app.mysite.myfolder['a-sample-item'], ATTRIBUTE_NAME, 'bc8a2fac032e4ae39c700730ac79df8f')
>>> IUUID(app.mysite.myfolder['a-sample-item'])
'bc8a2fac032e4ae39c700730ac79df8f'
>>> import transaction
>>> transaction.commit()

Of course, transmogrifer would be more decent way for such case.

2013/03/05

Why PyCon Taiwan

"First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack." -- George Carrette

在我的眼裡,程式員可以比擬很多種角色,是作家,演說家,是創作者,評論者,是魔術師,雕塑師,是江湖俠客,修練精道的智者。

走在前往程式員的修練之路,要有自知之明,不要妄自菲薄,更重要的是,去找尋那份程式員的快樂秘密

從團隊或產業的角度來看,我們還需要工程方法、框架工具、分工協作,達到現代軟體開發的規模與要求。軟體英雄可以號召起義,但我們知道,團隊協作的時代早已開始。

為了自己,還有下一代,我們真心期待,台灣的軟體產業能轉型,技術能茁壯,這份企盼,我們把它落實為 PyCon Taiwan,也就是說,Python 年會不只是個程式語言的同好會,它就該是轉型的促進器,技術交流的平台。

Python 語法,即使兩天沒學完,兩週的時間也一定足夠,但我們知道,語法的重要性,是不如心法的,獨自學習的收獲,遠不及交流切磋的豐富。我定位 PyCon 是欣賞 (認同?) Python Zen 的同好聚會,基於這樣的出發點,即使是 Java、Perl、Ruby、PHP 的朋友,也都是我們的目標族群,因為,追求編程之道,大家都走在這路上。

今年活動規模以超過 600 人為目標,邀請國外講者的過程,感受外國友人主動貢獻的熱忱。相信,關心軟體發展的朋友那麼多,今年的舞台那麼大,每位朋友的挺身貢獻,肯定能為台灣產業的蛻變,帶來一份力量,而上台分享則是最強有力的支持,現在就行動吧!