四月 6, 2013
» 如何批次下載教育廣播電台的教學節目有聲資料

(Jellyfish.Osaka.Japan)
去水族館看水母,已經成了到各地水族館既定的行程。在微光下,要拍攝出動人的水母照片,難度頗高。若是能拍攝到,當天的心情一定會特別好。

****
新版的教育廣播電台網站,把原先可以直接下載的連結全變成了網頁。有些課程只能線上收聽(而且得要特定的browser才行,我用firefox和chrome都不可以,在mac只能使用safari才聽得到)。對於這種限制,個人不知道是出於什麼樣的考量。如果是在沒有網路的環境下,那就沒辦法自學了。另一點是線上播放的player是固定的,無法提供快讀或是慢讀,或是A-B播放的功能,對於語言學習來說,很不好用。為此,決定把這些audio都下載下來,在自己的電腦上使用。

打開網頁原始碼來看,其實它javascript裡頭已經包含了錄音檔可以下載的URL,但是並非所有的教學節目都有把這個javascript function指定給一個button。有button的話,使用者就可以透過按button來下載該集的內容;有些節目故意不提供button的話,即使html source code中看得到,一般使用者還是無法很直接的下載。學過點html的人,倒是可以很簡單地把javascript中的relative URL,再加上教育廣播電台的網址,輕鬆組出完整網址,下載錄音檔。


如果還有一點點程式基礎的話,就可以像我這樣,觀察一下每一課的URL變化,歸納出URL最後面的28488,是會隨著課程集數,往上累加2的。這麼一來,就不用浪費人力,一課一課去組裝網址下載mp3,只需要寫個小script,就可以把某個節目的所有課程下載下來。

目前我想學習的是「開心學德語」,所以在此附上下載從第5課到第107課的python script(前幾課的我已經手動下載了)。有興趣的人可以拿去改一改,自行下載其他課程的語音內容。

****
現在網路上很流行網路教學,除了各種簡單容易上手的網頁呈現方式,語音、視訊的完美整合外,有的還加入與學習者的互動內容,務求使用者可以更有參與感,提高學習的效果。可是反觀教育廣播電台的改版和推出的app,似乎仍舊像是個大學生的專案,覺得有點痛心。明明有這麼好的教學內容,卻因為網站的呈現方式不好,大大地降低了它的實用性。期待未來它能夠朝更好的方向改善。

REF:
codes



十一月 10, 2010
» Simple Random Image Viewer in Python

P5055943
Nice.France

畫畫,是個人的事。
只要有心,人人都是個畫家。

*****

Usually, I use my flickrRandomImage python script to fetch some random images from my flickr account to amuse myself. However, it heavily depends on the internet access speed. When the network traffic is jammed, it takes a long time to generate 10 thumbnails for each run. Therefore, I decided to go for another way: create a simple image viewer which can randomly pick photos from a designated folder on local hard disk.

Once the decision is made, it won't take too much time to find a starting solution. By choosing python as the development programming language, I can easily find the samples I need on the internet. The first step is to find a workable image viewer written in python. This is not a difficult task because python's library set is very rich; image viewer is something people tend to write as a sample app.

Well, this's what I found:creating-a-simple-photo-viewer-with-wxpython/.
This sample basically provides most of the features I need:
1) pop up a directory dialog to choose a folder
2) to view images in forward/backward direction
3) to toggle Slide View

What's left is:
1) load image files recursively in a folder
2) show image randomly instead of in predefined sequence
3) rotate the image according to the exif orientation information
4) launch image file format associated application to do other actions
5) track the viewed sequence in order to view backward

solution:
1) this is easy part. Check out os.path.walk and search on the internet.
2) use "from random import choice"
3) import exif.py and check the value of "Image Orientation".
    use wxImage.Rotation90 to rotate image accordingly
4) use os.startfile()
5) use a list to keep track of viewed photos

SOURCE:
http://dl.dropbox.com/u/10576598/image_viewer3.py

四月 3, 2010
» Flickr Random Image Picker

P6216480
Annecy.France

It's a small tool written to randomly show my photos from flickr. I quite enjoy viewing photos in this way. It helped me to discover photos that I didn't notice before. However, there are some limitations to it:
1. in current configuration, 10 photos will be shown every time I launch it. it takes too much time to do so. I have to wait for tens of seconds or even longer.
2. in GUI version, no thread is implemented, so the UI is blocked after the button is pressed.

To make it better, I did some minor changes:
1. create a thread for fetching photos from flickr, and use wx events to post event to htmlwindow. Don't know how to use lock or mutex under python yet, though...

import threading
from time import sleep

(FetchDoneEvent, EVT_FETCH_DONE) = wx.lib.newevent.NewEvent()

class FetchThread(threading.Thread):
def __init__(self,w):
threading.Thread.__init__(self)
# windows for posting events
self.w = w

def run (self):
fi = None
for x in range(10):
print x
if fi == None:
(content,fi) = fetch_photo()
else:
content = fetch_photo(fi)

evt = FetchDoneEvent(source=content)
while (self.w.loading):
sleep(0.5)
wx.PostEvent(self.w, evt)

class MyHtmlWindow(html.HtmlWindow):
def __init__(self, parent, id ):
html.HtmlWindow.__init__(self, parent, id, style=wx.NO_FULL_REPAINT_ON_RESIZE)
self.Bind(EVT_FETCH_DONE, self.OnFetchDone)
self.loading = 0

def OnLinkClicked(self, linkinfo):
import os
os.startfile(linkinfo.GetHref())

def OnFetchDone(self, e):
#self.LoadPage("myflickr.html")
self.loading = 1
if self.start_fetching != 1:
self.AppendToPage(e.source)
else:
self.SetPage(e.source)
self.start_fetching = 0
self.loading = 0

class SimpleFrame(wx.Frame):

def __init__(self, *args, **kwargs):
...

def OnButtonClicked(self,e):
FetchThread(w=self.html).start()
self.html.SetPage("

Fetching......

")
self.html.start_fetching = 1
2. add a function to only return a photo info at a time, instead of returning a html file with 10 photo infos.
def fetch_photo(fi=None):
print 'fetch_photo'
if fi == None:
fi = FlickrIndex(API_KEY, SECRET_KEY, MY_USER_ID)
return fi.print_random_photos(10),fi
else:
return fi.print_random_photos(10)

三月 24, 2010
» onlinedict線上版小改進

PB124666
lac d'Anncey.France

在這邊看到,透過點小設定,可以讓Chrome的網址列充當搜尋引擎,自訂想要的搜尋。之前用Google App Enginen包裝出來的OnlineDict,只有吃由form餵入的資料,也就是只支援post的方式。為了要讓它也可以做為Chrome搜尋用的引擎,就得要為它做點小改變,讓它也支援get方式的查詢才可以。

所以,我改了一下程式碼。有多簡單呢?就copy paste一行程式碼而已。
原本def get(self)底下是直接呼叫OutputHtml(),現在改成呼叫post(self),就可以跟post做一模一樣的處理了。

#/usr/bin/env python

import cgi

from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app

import os
from google.appengine.ext.webapp import template

import Dict

class OnlineDic(webapp.RequestHandler):
def __init__(self):
self.fren_dic = Dict.collins_fren_dict()
self.ench_dic = Dict.yahoo_dict()
self.eijiro_dic = Dict.eijiro_dict()

def get(self):
self.post()

def post(self):
word = self.request.get('word')
dic = self.request.get('dic')
if dic == 'Fr-En':
content = self.fren_dic.doSearch(word)
content = content // handling
elif dic == 'Ja-En':
content = self.eijiro_dic.doSearch(word)
else:
content = self.ench_dic.doSearch(word)
self.OutputHtml(content,dic)


def OutputHtml(self, content="", dic=""):
template_values = { 'content': content,
'dic': dic,
}
path = os.path.join(os.path.dirname(__file__), 'index.html')
self.response.out.write(template.render(path, template_values))

application = webapp.WSGIApplication(
[('/', OnlineDic)],
debug=True)

def main():
run_wsgi_app(application)

if __name__ == "__main__":
main()

# vim:set nu et ts=4 sw=4 cino=>4:

網站在此:http://onlinedict.appspot.com/
目前支援法翻英,範例如下:
http://onlinedict.appspot.com/?dic=Fr-En&word=%s
英翻中
http://onlinedict.appspot.com/?dic=En-Ch&word=%s
日翻英
http://onlinedict.appspot.com/?dic=Ja-En&word=%s

為了貼上面的程式碼,特別去找了一個透過javascript的syntax highlighter,路徑如下:
http://alexgorbatchev.com/wiki/SyntaxHighlighter
使用方式可以參考下面這個網址:
http://www.craftyfella.com/2010/01/syntax-highlighting-with-blogger-engine.html

三月 6, 2010
» onlinedict by google app engine

PB173371
Central Station.NYC.US

I posted an article about using Google App Engine in last June, and the experiment target is the onlinedict. Everything goes well and since onlinedict is originally written in python, the porting task is without any efforts.

However, there's one limitation of using Google App Engine: You can get your codes back from the server. You have to keep your codes somewhere. That's quite strange as a policy. I know it may be easier to control the whole system on google side, but as a user, it's troublesome ofr me because I am too lazy to my stuff in another source control website.

As a consequence, I lost my codes after re-installing OS on my nb for several times. Although my original work still runs well, it looks bad on all mobile devices. The words are too small to read. However, I don't have original codes anymore! no way to improve it at all!

Finally, I decided to rewrite it again,since this website should help me most on mobile devices. If the outlook on devices are bad, then it is somehow useless to me. Well, the first thing to do is study again how to apply the google app engine framework into my dictionaries. With the help of the tutorial, I quickly achieved what I have done last time: a working fr-en, ch-en dictionary, and, plus eijiro dictionary!

The most difficult part (not really difficult at all, I just don't know how to do) is to adopt some css style to make it look great on mobile devices. Well, I found a good refernce site: http://building-iphone-apps.labs.oreilly.com/. And, it's free!

Okay, after several hours of work, I am happy with my new dictionary now. The font size is good, the input control is at the right position, with some hints in the box. Three online dictionaries are available. It's time to go to sleep again~~

二月 23, 2010
» Development on android

PB124730
Annecy.France

看了點文件,想說就來寫寫東西吧,從最簡單的開始。

之前在國外時,為了學法文,幫onlinedic寫了個Vocabulary Review的小程式在Windows Mobile上。讓自己可以用當時帶出去的dopod818加減看一下查過的單字。現在,當時的code已經都不見了,所以想說在android上也寫一個好了。反正onlinedic的export機制都還是okay的。

在寫程式時,也可以順便練習到android上的一些基本觀念,比方說:如何透過intent來叫起另一個activity;如果在叫起別的activity時,帶想要的參數給它;透過xml的UI建置方式,畫面橫轉正轉的處理;UI元件的動作指派;目錄結構的讀取,文字檔的讀取;簡單的webview應用;activity暫存狀態的記錄;功能權限的開啟;androidManifest.xml的基本設定;eclipse開發環境的熟悉等。

真的寫下去了,明明是個很簡單的程式,但也弄了一天多才寫好,花了許多時間在小細節上。如果不把除錯、追臭蟲方式弄熟,接下來的日子應該會很痛苦吧。

= = =
如果有空的話,乾脆一不做二不休,把onlinedict也搬到android,這樣子就不用每次都要裝一堆字典了。在網路上找到open source,可以讀取stardict字典檔的程式,有空再研究吧。先記下link:
http://code.google.com/p/toolkits/wiki/YAStarDict

另外,沒想到有人替eblib包了個python wrapper!!
當初在onlinedict裡亂寫的鄨腳command line程式,應該可以用這個wrapper把它換掉吧,省下暫存文字檔輸入輸出的廢工。
也是…改天有空再試吧。
Link: http://code.google.com/p/pyeb/

二月 17, 2010
» plurkmonitor

photo
Marbourg.Allemagne

又在亂寫東西了。
目前的噗浪,可能是為了有效地節省傳輸的頻寬,提高使用者操作時的response,
雖然它會定期的檢查是不是有新的回應,
但是使用者還是要再按一下才可以切到最新回應的模式。
時間軸的方式在大部分情況下很方便,
但是在看回應時,就顯得不是那麼重要了,
因為,這時使用者在意的是別人的回覆,
而不是這條噗是在什麼時候發出的,或是跟其他噗的前後關係。
所以,如果在看最新回應時,所有的噗可以更集中的話,
應該會更一目瞭然才是。

於是乎,自己寫了一個小小的script,
讓我可以在不開browser或是不開plurk website的情況下,
可以知道目前是不是有新的回應,而這些回應又是屬於哪些使用者的噗。
畢竟,有些時候,並不是所有最新回應自己都有興趣,
但又懶得一一去關成靜音。

= = = =

為了怕自己會一直改來改去,所以去google code開了個project
方便之後的source code control。
網址在:https://code.google.com/p/plurkmonitor/

系統需求:python + wxpython

一月 3, 2010
» 連兩天加班

P6182020
Nagoya.Japan

今天加班時,同事分我們吃由台中"糖村"買來的牛軋糖。
好好吃啊!
看起來跟這根欄杆的形狀很像。
雖然我拿了一堆,還是被我吃光了。
不知道可不可以郵購呢?

****

好累。
希望農曆過年時,已經解脫。

之前寫的random display flickr photo,由於flikrapi改版,所以不行用了。
再加上epc重灌,一時還來不及灌wxpython;
所以臨時改了一版可以直接用command line產生html再叫system開啟的script。
雖然還很陽春,但總比都沒有來得好。

六月 16, 2009
» Unofficial Plurk API in Python : A Plurk client in wxpython - Plurkao

PB124783 (by plateaukao)
Des feuilles.Annecy

Originally, I wanna study how to write a small plug-in for Windows Live Messenger, so that every time a plurk alert comes, I can easily input the plurk id and username to reply the message. However, it turns out it's a hard work to do and there's no high-level wrappers for this task (please refer to CodeProject: Windows Live Messenger Plug-in Development Bible. Free source code and programming help). Moreover, I don't even have Visual Studio installed on my home computers. How can I compile my codes without a compiler.

After searching for a while, I gave up the idea of tweaking with Windows Live Messenger. Instead, I turned to search for plurk clients for desktop. Still, in vain. What I can only find is some air clients that use plurk mobile link internally, which I can already find a firefox extension for it. That interface is not intuitive enough for me. I need something more user friendly and not so error-prone as msn plurk alerts.

Well, the unofficial Plurk API in Python is what I found so far. On its website, the demo only shows how to display user's karma value and how to list your plurks. Hm.... it's not so attractive isn't it? But!!! indeed, the module does more than these two simple not so useful demonstrations!! You can send plurks, respond to existing plurks, get plurk permemant links, and etc. That's powerful enough to let me write my own plurk client. Yeah. You bet. I am gonna write one for myself if I have enough time.

Currently, there's only one API to get plurks which is called getPlurks( ). This API will get plurks no matter they are already read or not. I did a little modification now so that it can let you choose if you only want to list unread messages only.

Update (20090617)
I wrote a small app with this python library. Currently it can merely work. The speed is slow, but it works somehow.

And~~ the screenshots!

1. Login UI: well, that's almost you need to login your account
plurkao_login (by plateaukao)

2. Main Window: you can click on RealAll or UnRead to see the plurks.  Send button allows you to post a new plurk. There's no auto update mechanism so far; you have to manually click on them when you want to see updates. And...the data fetch is done in the same thread so the UI will be a bit lagged when the button is pressed.
plurkao_plurks (by plateaukao)

plurkao_plurks2 (by plateaukao)

3. Response Window:You can click on Inside to open up a new window which shows you the responses of the plurk. Refresh button will refresh the plurk for you (cause there's no auto update now); and the Send button will post a response to this plurk.
plurk_responses (by plateaukao)

The UI is done by wxpython, so you have to install wxpython on your system if you want to test this program. And thanks for python's portability, I think it can run well under Linux too.

DOWNLOAD:
http://daniel.kao.googlepages.com/plurkao.zip

REF:
David - The Unofficial Plurk API in Python
Boa Constructor Download
http://plurkapi.com/http/methods

六月 14, 2009
» Python再起,誰與爭鋒:無名小站相簿備份軟體

PB124784 (by plateaukao)
Autumn.Annecy

這篇雖然是電腦文,不過因為國外連進來的,可能對這篇也不會感興趣,所以破例用中文寫囉。無名小站前陣子因為取消一些服務,搞得民怨四起(好像不是一直都這樣?),鬧得很多人都要出走。要搬家的話,問題就來了:經年累月留下來的文章和照片,要怎樣搬到其他部落格去呢?關於文章、留言的部分,各家部落格其實都有提出類似的服務,可以讓使用者無痛搬家;但是對於相簿這塊,目前網路上找得到的軟體大都是專門設計來下載正妹照片用的,對於相簿中的標題和詳細描述,都沒有另外處理。也就是說,你搬得了照片,搬不了照片的字。

所以,昨晚我研究了一下網路上關於無名小站相簿原始檔格式的說明和網頁間的關連,寫了一小支程式可以把單一個相簿的相片抓下來,並且把照片和文字同時放進一個html檔。這麼一來,至少自己可以有一份相片和說明在一起的備份,就算不行匯到別的部落格去,也可以在自己的電腦上看爽的。等哪天有哪個部落格支援匯入照片和文字說明時,要再匯入也不會是件難事。

接下來是在寫這支python script時,需要注意的一些問題,和特別查到的資詢:
1. URL request時的Referer:無名小站從以前就一直被人垢病相簿不行外連,因為在抓圖時,它會檢查這個request是從哪發來的。為了要順利抓到照片,在程式裡必須塞一個假的,可以通過它檢查的網址給它。如此一來,就不行用單純的urllib完成,而得改用urllib2才行。

def GetURLContent(u):
req=urllib2.Request(url=u)
#req.add_header('User-Agent','Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.6) Gecko/20040113')
req.add_header('User-Agent','Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.9.0.11) Gecko/2009060215')
req.add_header('Referer','http://www.wretch.cc')
return urllib2.urlopen(req)

如上,先在request中加上Referer的header就可以了。

2. 在網頁的原始碼中,主要有三個tag是我們要抓的:DisplayTitle, DisplayImage, DisplayDesc;然後還有一個id="next"要抓。DisplayTitle是使用者設定的照片標題;DisplayImage該行有照片的真正路徑;DisplayDesc就是使用者可以寫得落落長的照片描述;id="next"則是用來檢查還有沒有下一張圖片,有的話,程式得要一路再抓下去,直到沒有下一張。

3. 抓的時候,記得要設一下sleep,不然抓太頻繁好像會被擋掉。所以每抓一張就加個sleep(10)或sleep(20)讓它休息一下。

4. 原本有打算把描述和標題塞到jpeg的exif裡頭的,可是編碼問題一直搞不定,所以算了。因為加了,一般的image viewer也看不到。

5. 用urllib2抓下image後,可以用read()讀出image的內容;存檔時記得開檔要用"wb"的flag,這樣子存出來的照片才能看。

6. 沒了。就這麼簡單。真想不通我怎麼搞了那麼久才寫好。

下載 DOWNLOAD:
http://daniel.kao.googlepages.com/WretchGrabPhoto.py

使用方式:
0. 先在電腦上裝好Python
1. 把WretchGrabPhoto.py下載下來,放在隨便一個目錄
2. 用cmd開啟一個Dos視窗,進到該目錄,然後執行下面這行 (python執行檔的位置要看你灌的是哪一版而定)
c:\Python24\python.exe WretchGrabPhoto.py "the_url_to_the_first_photo_in_the_album" html_to_be_saved.html
3. 等它執行完,用IE或Firefox開啟你自己設定的html檔就行了

參考:
Read & Write JPEG COM and EXIF metadata [jpeg] [python] [image] [metadata] [exif]
fetidcascade.com - Python Exif Utilities
Team Programming Dragon.編程龍 » Blog Archive » 用 wget 抓無名單一相簿
下載無名Blog文章裡的圖片 | 無為閣

破解無名小站下載相簿照片作者: 井民全前言



一月 9, 2009
» Sending SMS thourgh Skype under Linux


Zao.Japan

Out of my surprise, The SMS sending feature of Skype under Linux is not supported by its GUI client. I don't know why this feature is left off from the official release. It's quite strange because in its core library, this feature is included. As a consequence, some intelligent hackers use the Skype library interface to write some useful tools for this purpose. At least, I found two softwares that sovle this problem. One is with GUI interface, and another one is a command line tool. What a wonderful world under Linux. You can find what you need and ... multiple choices as always.


https://developer.skype.com/wiki/Skype4Py

http://www.kolmann.at/philipp/linux/skysentials/

http://www.oberle.org/skype_linux_tools/

八月 20, 2008
» 螢之光

RIMG0078 (by plateaukao)
Ricoh GRD
Semnoz.France
2008.03.08

滑雪還有個好處,看的景跟平常看到的都不大一樣。
右邊是一群小朋友在學習滑雪。
很慶幸自己學習得還算快,不用交大錢或是和一堆人跟著教練的屁股走。
當然,得付出不少跌倒的代價。

****

看片名可能不知道這是怎樣的一部日劇,
不過提到“千物女”的話,相信聽過的人就比較多了。
在上班時,打扮的光鮮亮麗;
可是下了班,卻喜歡一個人窩在家裡,
穿著破舊的運動服,頭髮紮到一束沖天炮,
躺在地板上喝啤酒看漫畫,享受屬於一個人的時間。

綾賴遙在這部片中的表現,個人覺得比鹿男那部挑戰性要高些,
因為形象的犧牲比較大。
至於藤木直人的演出,沒想到現在他已經老到飾演主管的角色。
看了一兩集後,就會有股衝動想要一次看到完。

下次,還是別在非週末的時候看日劇才好。

***

之前寫的pyFlickrRandomImage最近操作時覺得怪怪的。
明明是要產生十張隨機的照片出來,
怎麼老是會有五六張以上是同一張。
今天晚上花了點時間做小測試,
發現flickr的API  flickr.photos.search 只支援參數page = 最多到10000

原本的作法是,每個page一張。
目前我有5萬多張照片,所以總共有5萬多個page,
我每次隨機挑十個page出來。

不過flickr不知道做了什麼更新,目前page設定超過10000的話,
都會被自動改為10000。
也就是說我有4萬多張照片是不會被選到的。

這樣子的話還得了!
所以我只好改一下script,讓它每個page有10張照片,
這樣子page數目前可以控制在6000以內。
等選好page後,我再產生一個亂數去從10張照片中選一張。
雖然多了一個步驟,不過好歹可以暫時解決目前的問題。


random_page = random.randint(1,self.count/10+1)
random_image = random.randint(0,9)
try:
   photo =  self.flickr.photos_search   = self.my_user_id, per_page=10, page = random_page).photos[0].photo[random_image]

六月 16, 2008
» improvement of "Random Flickr Photos" in C#

img_4028
Canon S30
2004.04.15
Keukenhof tuin

荷蘭的庫肯霍夫花園,除了有各式各樣的鬱金香外,
其實還有許多特別的花可以欣賞。

****

Added features:
1. modified the output html codes so that the title and the taken date of the photo will be shown when mouse is hovered over the photo.
2. moved interactions with flickr service into a thread so that it won't hang the whole application
3. every time the photo search is done, display the html results correspondingly, so that it won't take too long to show the results

A new class is created to do the time-consuming job. webbrowser is passed to it as a reference, so that it can set up DocumentText when it wants. To use pass by reference feature in C#, a "ref" keyword should be added in the function declaration and when being used.

****

The launch look-up in the web browser function in onlinedic is broken for a while. Since I don't use this feature often, I did not care about it. The other day, I found that there's a good module in emesene just for the purpose as I want! It's called desktop.py. emesene uses it to determine the current system and choose the right web browser for you. With this module, what I need to do is nothing but copy the desktop.py and call a method!


import desktop
desktop.open('url_name')

六月 7, 2008
» GIMP avec Python

P2223287 (by plateaukao)
Olympus E510
Florence, Italy
Flowers

米開朗基羅廣場繞一圈,發現到的。

****

Originally, Gimp only supports script-fu plugins which are written in lisp. From some day that I don't know exactly, Gimp started to support plugins written in python. As a python programmer, I can easily write something for my own purpose. By reading the instructions of the following links, a simple plugin can be written within minutes. However, I do not find many useful examples on the internet. If there's a place on internet to store all the plugins, that would be wonderful.

HOW TO WRITE YOUR OWN PYTHON-FU PLUGIN
1. copy one script from the second link
2. modify the contents as you want, by following the API documentation
3. try out in Gimp
4. add more stuff by referencing PDB browser

REF:
Basi Python-fu API Documentation
Templates

五月 29, 2008
» 寫網誌的工具加強版

PA221341 (by plateaukao)
(坪林,台灣 2006.10.21)

剛寫好的python script有兩個缺點:
1. 只能看到public的照片。我有很多沒整理的照片都是private的,如果連自己也不行看,那不是白費工。
2. 執行程式之後,firefox會開啟網頁,如果想要再來一次,就要手動關掉已經開啟的畫面,來來回回的很麻煩。

趁還沒睡覺,又趕出了一版。這一版依照Python Flickr API Documentation中關於Authentication的部分做了加強,讓它可以取得token。這麼一來,第一個問題就解決了。不論是公開還是隱藏起來的照片,都列在隨機選取的範圍內。

另外,還利用wxpython加了視窗。視窗很簡單,只有一個按鈕和一個html視窗。只要按一下按鈕,照片就會更新,顯示新取得的照片。如果有看中意的照片,可以點選它,這時才會開啟firefox網頁,帶你到fickr的網站去。

以後閒閒沒事,也可以開著這支程式隨意瀏覽自己的照片了。

***
將下面兩個檔拷到同樣的目錄中,然後照前一篇文章做修改。最後執行wxGUI.py就行了。

REF:
myflickr2.py
wxGUI.py

» 寫網誌的工具

p1011738 (by plateaukao)
(Wakkanai, Hokkaido, Japan 2006.01.01)

2006年一月一日,我在日本北海道的最北端-稚內-迎接初日。照片中的大石頭不是藝術品,而是化石。牌子上寫著:
干貝化石群
發現地點:中頓別鐘乳洞附近
石齡:新生代第三期(約四千萬年前)
重量:約40噸

****

目前Flickr的照片已經累績到四萬八千多張了。上傳了這麼多照片,其實有很多都還沒有好好地看過或整理過。有些甚至還沒有建立個別的set。這麼一來,那些沒有建立set或加上tag的照片,可能就這樣石沉大海,永不見天日了吧。

平常在寫網誌時,標準程序是先到flickr看看自己的舊相簿(或是剛上傳的照片),一方面回憶當時的情況,一方面看看有什麼特別的照片可以提出來放在網誌中。選定之後,透過Firefox extension Greasemonkey裡的AllSize+,直接拷貝所需資訊,貼到正在寫的網誌中,然後繼續完成還沒寫完的廢話。所以,每天都會花很多時間在開Flickr的set網頁,然後點進某個set後,再花時間瀏覽一下縮圖。

今天晚上手癢,決定自己寫一個可以根據使用者隨機選出照片的小程式。這麼一來,我只要呼叫一下自己寫的程式,就可以看到亂數為我選出來的照片。如果不喜歡的話,再執行一次就行了。這麼一來,就不用花時間想說要進哪個set,只要呆呆地等電腦幫我選就行了,我自己再做最後的決定。而且沒有建立set或tag的照片,也跟其他照片一樣,有機會被選出來。

基本上我沒有web server可以用,所以還是傾向於寫單機版的。至於用什麼語言,當然是用可以不花大腦的python。在網路上關於用python呼叫flickr API的資訊並不多。最著名的應該就是我下面第一個REF: Beej的Python Flickr API吧。Flickr API來來往往都是用XML的格式,所以他的Python Flickr API把這一層稍微包了一下,還加了幾個比較常用的function:比方說photo_search, getSetList, upload。相較於Flickr網站上洋洋灑灑一大堆API,似乎是少了點。不過對於我今天要寫的東西,倒是綽綽有餘。

有了基本的函式庫後,再來就是找如何撰寫的例子。下面第二個連結"myflickr“是個不錯的起點,裡頭示範了如何利用Python Flickr API跟Flickr連線,取得Set的list,取得最新上傳的照片資訊list,最後產生一個html檔。

set list我就直接跳過了,因為我並不想透過set來取得照片資訊。取得照片list的api如下:

self.flickr.photos_search(user_id, per_page, page)

這個API可能還有其他的參數,不過我只列出我有用得到的。
user_id: flickr為你產生的id,這在profile或是哪裡應該找得到。
per_page: 一次要取出多少張照片。
page: 從第幾頁開始取。

有需要的人可以拿回去,然後改一下第9行的API_KEY(上Flickr去申請);第10行,MY_USER_ID的值,和修改一下74行,啟動哪個browser來顯示該網頁。

REF:
Beej's Python Flickr API
myflickr original sample

Flickr Services: Official Site

下面這是我改過的:
myflickr.py

五月 28, 2008
» 寫網誌的工具

p1011738 (by plateaukao)
(Wakkanai, Hokkaido, Japan 2006.01.01)

2006年一月一日,我在日本北海道的最北端-稚內-迎接初日。照片中的大石頭不是藝術品,而是化石。牌子上寫著:
干貝化石群
發現地點:中頓別鐘乳洞附近
石齡:新生代第三期(約四千萬年前)
重量:約40噸

****

目前Flickr的照片已經累績到四萬八千多張了。上傳了這麼多照片,其實有很多都還沒有好好地看過或整理過。有些甚至還沒有建立個別的set。這麼一來,那些沒有建立set或加上tag的照片,可能就這樣石沉大海,永不見天日了吧。

平常在寫網誌時,標準程序是先到flickr看看自己的舊相簿(或是剛上傳的照片),一方面回憶當時的情況,一方面看看有什麼特別的照片可以提出來放在網誌中。選定之後,透過Firefox extension Greasemonkey裡的AllSize+,直接拷貝所需資訊,貼到正在寫的網誌中,然後繼續完成還沒寫完的廢話。所以,每天都會花很多時間在開Flickr的set網頁,然後點進某個set後,再花時間瀏覽一下縮圖。

今天晚上手癢,決定自己寫一個可以根據使用者隨機選出照片的小程式。這麼一來,我只要呼叫一下自己寫的程式,就可以看到亂數為我選出來的照片。如果不喜歡的話,再執行一次就行了。這麼一來,就不用花時間想說要進哪個set,只要呆呆地等電腦幫我選就行了,我自己再做最後的決定。而且沒有建立set或tag的照片,也跟其他照片一樣,有機會被選出來。

基本上我沒有web server可以用,所以還是傾向於寫單機版的。至於用什麼語言,當然是用可以不花大腦的python。在網路上關於用python呼叫flickr API的資訊並不多。最著名的應該就是我下面第一個REF: Beej的Python Flickr API吧。Flickr API來來往往都是用XML的格式,所以他的Python Flickr API把這一層稍微包了一下,還加了幾個比較常用的function:比方說photo_search, getSetList, upload。相較於Flickr網站上洋洋灑灑一大堆API,似乎是少了點。不過對於我今天要寫的東西,倒是綽綽有餘。

有了基本的函式庫後,再來就是找如何撰寫的例子。下面第二個連結"myflickr“是個不錯的起點,裡頭示範了如何利用Python Flickr API跟Flickr連線,取得Set的list,取得最新上傳的照片資訊list,最後產生一個html檔。

set list我就直接跳過了,因為我並不想透過set來取得照片資訊。取得照片list的api如下:

self.flickr.photos_search(user_id, per_page, page)

這個API可能還有其他的參數,不過我只列出我有用得到的。
user_id: flickr為你產生的id,這在profile或是哪裡應該找得到。
per_page: 一次要取出多少張照片。
page: 從第幾頁開始取。

有需要的人可以拿回去,然後改一下第10行,MY_USER_ID的值,
和修改一下74行,啟動哪個browser來顯示該網頁。

REF:
Beej's Python Flickr API
myflickr original sample

Flickr Services: Official Site

下面這是我改過的:
myflickr.py

五月 26, 2008
» compilation of ebmodule succeeded!!


(Ricoh GRD Morbihan Tour 2008, Annecy du 21 au 24 mai)

一連好幾天,在Courrier和學校中間的大廣場有法國西北部旅遊推廣活動。除了很普通的旅遊簡介、講解和美食品嚐外;還有三十場的免費concert可以聽。這種好事法國人自然不會錯過。週六下午在臨時搭起的表演台前,坐滿也站滿了觀眾。有沒有發現?表演台看起來很像是台灣廟會搭的台子。

****

Last time, I said that ebmodule is not compatible with current eb library, so I turned to modify the sample code of eb library and use a separate execution file for both linux and windows. Though it works smoothly for me, putting an extra program in the package is not what I really want it to be. Several days ago, I thought: since ebmodule couldn't work with current eb library, why not try using the old eb library with which it says it compiles.

I downloaded eb library 0.3.1 from internet and compiled it. And then, I spent some time figuring out where to put eb headers / library in order to compile ebmodule module; and I modified ebmodule.c too because there're some errors about the static char arrays. Finally, the native python ebmodule module is GENERATED!! Well, what a success!! The README says it compiles with Python 1.5.2; however with Python 2.5, it can be compiled too.

After some simple tests of the ebmodule, I am quite happy with it. From now on, I think I can provide more support for EPWING files (to start with, maybe I can put in "strict match", "prefix match", and "postfix"; and ... word list too).



五月 13, 2008
» WxPython in Action

P4194684

花了一天,把這本書翻了一下。裡頭總共有快二十章的內容,一開始先概念性的介紹wxpython的好處以及最簡單的寫法,接下來則針對wxPython提供的主要UI元件做介紹。如果對python和GUI程式設計有點基礎,而且事前已經大致玩過wxpython提供的demo,那麼看不看這本書似乎就沒有那麼重要。

五月 12, 2008
» Psyco

R8070920 (by plateaukao)
(Ricoh GRD Cannes, France. 坎城小火車)

南部每個鎮都會有逛市區的小火車,帶著你穿街過巷,在較短的時間內一覽當地名勝和景點。價錢大都落在5歐到10歐之間。車上一般會提供英文和法文的解說,可以帶上耳機或是由司機直接口頭介紹景點。行程則大概是二十分鐘到三十分鐘之間。

我只有在馬賽突然心血來潮坐了一次,登上了馬賽著名的教堂,俯看整個馬賽港。一路上車子緩縱上坡,和兩旁的行人擦肩而過,吹著微風。

****
Psyco,一個號稱可以加速python程式執行速度的module。只要加個兩行code就可以見效。雖然我看不大出來效果,不過還是在onlinedic中加入了這個功能。Psyco需要從其官網另外下載套件才行,目前支援linux和Windows。

REF:
IBM網站上的介紹
Psyco官網

biggo.com.tw

A Django site.