Archive for the '工作' category

Google App engine遇到的第一個問題

November 11, 2009 12:58 pm

如果下載了appengine,按照google的入門文件想跑第一個helloword,會遇到一個莫名其妙的KeyError。

KeyError: "There is no item named 'simplejson\\\\_speedups.pyd' in the archive"

網路上找到解法,事實上我安裝的1.2.7版仍然有這個問題:
這是1.2.5版SDK的一個bug,原因是其混淆了simplejson的版本。可以在python的lib\site-packages刪除 simplejson對應的egg文件(比如simplejson-2.0.9-py2.5-win32.egg),dev_appserver.py就可以正常運行了。

比起問題本身,更令人訝異的是Google會犯下這種錯誤……

書摘網小更新

November 5, 2009 12:38 am

結果我今天還是手賤把ANSI色碼補完了,現在前景背景色都能呈現,高亮與閃爍也給他加進去,因為後來發現會在文章裡弄一堆控制碼的人其實也不多,先加上去觀察一陣子看看,不然老是覺得有個問題擱在那邊心裡覺得很矮油。現在在想要不要加個單鍵切換mobile/PC模式……

最近因為需要寫些C的小範例,結果發現我print會忘記加括號,敘述最後也會忘記補分號……

無三小鹿用網站系列之一

November 3, 2009 12:37 am

雖然不及某數字名人的程度(X小時,什麼網站基本上都能寫出來了),不過這次開發的時間比上次少很多,一來架構更簡單,再者對Django的摸索試誤時間也減少了。這次的功能著重在沒實作過的檔案上傳+PIL+AJAX,功能請看首頁Site Usage(這次我懶到連中文說明都不寫了)。

網站名稱:StampIt

基本功能就是上傳圖檔,然用小圖蓋在大圖上,概念像就像VeryXD,只是把文字換成圖,不過我有計畫再做一個Stamp Generator,因為不是每個人都有精神去製作含透明底色的印章圖檔,大多數使用者應該是有現成就用現成的吧…

原本的想法是蓋文字類印章
Ma

後來覺得蓋圖章比較有趣,像這張海綿寶寶與派大星出遊圖
Sponge

想叫某個人去吃屎的話也可以……
Yang

有興趣請來玩玩,圖檔會被resize,所以別傳太大張的圖,怕你等太久….

話說回來,python/Django社群感覺很不活躍啊~~

ptt書摘網

October 27, 2009 2:49 pm

之前提到拿來做python練習的第一個網站已經上線一個月了,不過幾乎只有我在用。使用說明都寫在首頁,就不在這裡講太多,僅列出幾個特點:

  1. 免註冊,從ptt上轉寄信件到 ptt@tyker.info 即可
  2. 閱讀界面分個人專屬列表與全體閱讀列表
  3. 簡單排版,保留部份ANSI色碼,目的是讓手持裝置容易閱讀
  4. 提供轉寄功能將文章備份到自己信箱
  5. 有撲浪機器人,加入好友後每小時會收到隨機推文

會寫這東西是因為我很常看bbs,尤其後來都只停在ptt上。換工作之後大部分的port都被封鎖住,衍生出在家裡看文章的時候會順手轉幾封文章到信箱,然後可以透過webmail登入閱讀,有時候從公司電腦,有時候在路上以手機閱讀。(如果你也有相同需求,也來玩一玩啊拜託,不需要註冊很方便的~)

如此一來出現的第一個問題就是大量的ANSI碼效果不見,反而變成郵件裡的垃圾字元,所以想說如果有個簡單的呈現介面,可以重現部份ANSI效果或者過濾掉多餘的特效,以bbs幾乎是文字訊息的特性其實很適合在手機上瀏覽。

把網站架構規劃好之後我就開始一步一步進行實做,在技術上並沒有特別困難的地方,雖然是第一次使用Django這個framework,不過看完四篇tutorial之後做起來倒也挺順利的。花比較多時間的反而是ANSI碼的處理跟UAO字碼轉換。

在實作的過程我本來就不打算完整還原ANSI效果,因為這跟我的原始方向不符,如果呈現過多的色彩效果,在小螢幕的閱讀上反而會是一種負擔。所以我把目標定在不讓多餘的控制碼出現,以及顯示部份前景顏色,至少要讓推文看起來有原本的視覺效果。如果很需要完整ANSI效果的建議使用BBS Forwardr,我覺得他的ANSI效果做的非常完整。

UAO的處理又是另一個歷史共業,一直到現在PTT的文章編碼仍然是Big5,搭配Big5使用的Unicode補完計畫也被大量使用在含有日文的文章內。因為要轉成網頁顯示,沒有理由繼續使用big5,因此一開始就要把所有資料轉成UTF-8,但使用python的轉碼器碰到UAO裡的日文就破功了,big5hkscs算是可以轉出大部分的日文,但中文部份反而又會掉字。還好後來有找到wini做的codec,之後就沒看過日文文章有掉字了。

原本還列了一些todo,不過看起來不是那麼緊急,如果有人反應再來看看吧,現在先把心思放在製作無用的小網站來做各種練習,第一個已經做的差不多(書摘網至少我都有在用,所以不算無用小網站 XD),過幾天應該就會上線。至於第二個的題目為第一個的衍伸,應該可以讓我再玩上一段時間,目標是要熟練到”只要「四堂課、三小時」,「什麼網站基本上都能寫出來了」” 這樣的程度,這是理想,可不是要戳誰啊~

開發者的辛酸

October 8, 2009 5:24 pm

說起來這個月還真是忙,雖然公司方面沒什麼正事可以做,不過把心力放在自己真正想寫的東西上面,每天專心寫幾個小時,下班以後確實能感受到疲勞啊。

幾個月前我開始學一直有想玩的python,一開始是去抓了免費的Dive Into Python電子書來看,這本書前面都在講語法,讀起來實在是味同嚼蠟。不是說這本書寫的不好,我的意思是在自學語言的過程,如果沒有一個可以提起興趣的目標,又沒有他人的鞭策(像是學校會把你當掉或者老闆會開除你這樣),我相信很多人會寧可躺在沙發上盯著時鐘的秒針直到睡著。

至於我的目標,上禮拜已經寫好了,不過我現在只想碎碎念。

剛剛說到Dive Into Python,我大概斷斷續續看到第六章的Exceptions and File Handling,翻了一下目錄才三分之一不到,而且目錄裡乍看之下找不到關於我要進行計畫的主題。好樣的,我已經不是時間多到用不完的死小孩了,於是當下決定去找一本對我有立即用處的實體書。幾天後,我拿到一本同學贊助的Programming Python 2nd Ed.

python
Programming Python 2nd Ed.

這本書不從基礎語法而是以開發主題切入,所以其實適合已經有點Python語法與概念的人使用,於是我便以”Dive Into Python前六個章節”為基礎開始從裡面找我要的東西。在之前的空想階段我已經先規劃好我需要什麼樣功能的元件,針對需求下去找這本書的相關章節,一下就把我要的第一個功能 - 從POP3 server上讀信存檔 - 給寫出來了(說穿了就是抄書上的範例)。因為實際coding下去發現python其實很好上手,便確立了「邊做邊學,急用先學」的方針,經過一個月邊刻邊改邊找資料,網站終於在上禮拜虛晃一招的芭瑪颱風天裡上線了。

上線之後的固定使用者也只有我自己,雖然我有去ptt某版小小的廣告一下,但實驗後血淋淋的數據顯示出你自以為的好點子其實也不見得是大家都需要的東西。這時候我堅持的「要做自己想用的產品」的中心思想就有作用了,因為再怎麼爛再怎麼沒共鳴,至少都還有一個使用者就是你自己。只要有人持續使用就還算活著,即使只是一息尚存。
hallway (by ykhuang)

使用者少還有一個意想不到的好處,就是之前規劃的效能調校都不用做了,幹!

未來幾個月大概就是持續的使用然後不斷的除錯(我覺得已經沒什麼臭蟲了),巴望著有幾個人來光顧一下。本來還在想是不是要開始做下一個題目了,但後來頓悟到其實好點子跟政客的嘴炮不一樣,不是那麼容易就能生出來的,所以說還是安分的修改現有的程式,以現有的東西為基礎多開發一些週邊的小玩具,一邊磨練還不太熟悉的python,現在世道這麼艱難,多學點東西有備無患,就算只是丟球雜耍那也要拿得出球來啊。

Django筆記:取得物件在Queryset中的索引

September 22, 2009 10:06 pm

今天在實作使用者界面的時候遇到了一個效能上的問題:在取得queryset中的目標物件後,打算在template留下前一個物件跟後一個物件的連結,這時候就需要前後的index或id。由於id並不是以固定的值在遞增或遞減,所以必須把前後的id在render的時候一併傳進template之中,也就是id需要在對應的view先計算好。

由於Queryset是動態產生的資料集合,所以不提供index()這樣的API。最接近的做法是利用Django的queryset API中的list(),將queryset強制轉成list,如此一來就有索引值可以使用了。但是很明顯的這樣非常浪費運算資源,官方文件也提到:

Be warned, though, that this could have a large memory overhead, because Django will load each element of the list into memory. In contrast, iterating over a QuerySet will take advantage of your database to load data and instantiate objects only as you need them.

另一個比較沒那麼耗資源的做法是使用loop或iterator做傻瓜比對法,不過當資料量大的時候這種做法看起來還蠻傻的,也就是越到後面的物件就要掃越久。今天我是暫時用這個方法解決……

剛剛在google找相關解法,目前看來比較好的做法是用其他的條件去縮小queryset,比方說在我的例子就可以用頁碼去縮小搜尋範圍,之後我想用方法一或二都可以減輕負擔。


>> qs=Data.objects().filter(keyword=’xxx’)
>> for data in qs[page*page_item_num : (page+1)*page_item_num]
>> ….if data.id=target.id: break

同樣的也可以只轉有限數量的queryset成為list,不過我覺得還是不要這樣做比較好。

9/23:
剛到公司把程式拿出來看,發現我並沒有傳遞頁碼啊啊啊啊~