昨天想起介紹 Kobo eBooks 的那篇文章說 Kobo eBooks 可以吃 epub 格式的電子書,可是一直都忘記試,今天早上上班時,就試了一下,發現閱讀的效果真的比 FBReader 好很多。fbreader用來對付一般的小說是綽綽有餘,但遇到有程式碼的epub,整個就爛給你看,而且是爛的可怕。Kobo eBooks 的處理就好很多,網站上有提供免費電子書可下載,也有像類似 foursquare 的打怪機制,讓你讀書跟打怪一樣,讀的愈多,拿的勳章愈多。
拿 Kobo eBooks 跟 Kindle 比的話,在記憶體少的機器上運行ok。每次開 Kindle,就常讓我的Asus A50重開機,重開機之後再去開啟程式才能正常進入,常常讓我不知道該不該賭一下,我想這應該是Linux Kernel 發現記憶體不足而砍應用程式的關係。
要說 Kobo eBooks 缺點的話,大概就是沒辦法查字典,Kindle是可以查的。Kindle 在長按單字時,他會自動去查英英字典,第一次查的時候,程式會告訴你要額外送你一本英英字典,下載以後,就可以有自動查單字的功能,畫面是以 pop window 的方式呈現,再點選,會進到英英字典,顯示更多資訊。
如果沒意外的話,我想我以後都會拿 Kobo eBooks 來讀 epub。
除了上面的3個電子書以外,我還有試過 iReader,是同事推薦我的,Market 裡的評價不錯,但iReader網站上的書太多,一時不知道要下載什麼,大多都是簡體中文,又考慮到翻譯品質良莠不齊,所以乾脆就移除掉了。
我還有額外下載獨立電子書的 app:明朝的那些事儿-全集跟黄河鬼棺-全集,這兩個也不錯,作者是同一個,作者有在積極改版,可是我覺得最早用的那版還不錯用,不太需要改。目前明朝的那些事儿-全集還沒看完,才看到第五集,等看完才會看黄河鬼棺-全集。這兩本雖說是免費,但實際上應該算是盜版吧~
語言治療(8)
這次實際上是第十一次,下次一上課會有一個小測驗,老師會根據這個來決定是否要繼續上課,雖然老師已經有跟我們說過他應該不用來上課了。
老師似乎忘記了上次上什麼,不過我也不知道,因為上次是太座帶大公子來的。反正將錯就錯,老師就繼續講,主要是拿出一組卡片,共兩張,一張是因,一張是果,讓大公子練習描述人事地物與前後的因果關係,這樣的圖片之後陸陸續續講了六組。簡單的說,主題就是加強他描述的能力以及教導他在遇到圖片時該怎麼去說裏面有什麼。
圖片上有,但大公子不知道怎麼講的東西:滅火器、打火機、消防隊員、客廳。回去要記得再跟他加強描述,因為這幾次上課的關係,讓我明白到大公子對很多東西還是不知道該怎麼說。
這次上課,老師有以畫圖輔助說明,跟他說這是什麼東西。
發音問題還是老樣子,這些音還是不太能擺脫慣性:火,多,對,拼圖,風,戒掉用奶瓶喝奶會不會比較好呢? 有跟大公子講過用杯子喝奶,可是他很妙,他覺得牛奶就是要泡在奶瓶裡,所以我決定要買奶粉回來泡給他看,讓他知道也可以用杯子喝奶。
Windows 上的 python + virtualenv + django
安裝上並不難,只是最後有卡到一個問題,特別提出來分享一下。
- 下載python 2.7安裝檔,然後安裝
- 下載setuptools安裝檔,然後安裝
- 打開命令提示字元,先 cd /d c:\python27\scripts ,再 easy_install virtualenv,你公司有 proxy 的話,記得先 set http_proxy=http://your_proxy:port
- 安裝好 virtualenv 以後,就可以去創建環境了,假設你的環境都在 c:\envs,那就先 cd /d c:\envs ,再 virtualenv –no-site-packages myenv ,這樣就建好環境了
- 啟動你的環境,要先 cd /d c:\envs\myenv ,再輸入 scripts\activate 。Linux 下的activate 是放在 bin 下,這是比較大的不同。
- 安裝 django:scripts\pip install django
- 使用 django 指令:scripts\django-admin.py startproject myproject ,嗶嗶嗶,卡住了。
哈,我就卡在這裡。django-admin.py 會說找不到 django.core ,我苦思了好久,終於才想到,Windows 下是不鳥 python script 第1行的 sha-bang 的啊,所以雖然 django-admin.py 的第1行指定了說要用 c:\envs\myenv\scripts\python.exe 來處理,可是實際上卻是 .py 註冊在 registry 裡的 c:\python27\python.exe 在處理。因此會有找不到 django.core 的情況,改用 scripts\python scripts\django-admin.py 就可以順利找到 django.core 了。
語言治療(7)
語言治療,這次實際上是第九次,上完還有三次。
這次上課有點匆忙,父親載我跟大公子去慈濟醫院的途中,去市場買了葡萄,耽擱了一點時間。
進慈濟醫院,打算走樓梯上去,可是門卻被鎖了起來,打不開,只好等電梯,一等之下,就等了快十分鐘,真是很讓人挫折。幸好,還是及時掛完號、上完廁所,並且準時上了課。
一上課,我就跟老師說,我要拿東西上去一下再回來。上去是要拿葡萄給嬸婆,這一上去,就又花了十分鐘左右。等到回來,前面都沒有聽到。
這次上課的內容是講小蛇散步的故事,就有一個晴天,小蛇覺得天氣很好就出去散步,散步的途中遇到了一個水坑,突然他聽到一個聲音說,可不可以搭橋讓我過去啊?他回頭一看,原來是螞蟻,於是他很好心的就搭了一座橋,讓螞蟻過去。沒想到,螞蟻過去了,老鼠過去了,獅子也過去了。更令人驚訝的在後頭,大象,他也過去了。小蛇這下可是累到暈倒了,等到它醒過來,它就一口氣把水坑的水給喝光了,繼續上路。
基本上還是跟上次一樣,主要在於矯正發音,並且引導大公子說出故事。我發現大公子在上課到沒興趣的地方時,會開始東摸摸西摸摸,失去專注力,這邊之後要注意。
老師說要去作聽知覺檢查,還沒去做。但有問了常去的診所,醫生表示診所沒有,需要去比較專門的耳鼻喉科做才行。
下次換媽媽帶去,別忘了。
語言治療(6)
語言治療,這次算第7次了。
上次是太座帶大公子去的,是講貓咪的故事,就有一棟大樓,大樓的每一層都有貓咪隱藏在不同的場景裡,這次就是延續上次的故事。
大公子這幾次下來已經可以表達的不錯了,要說有問題,一個就是發音,另一個就是比較沒自信。發音的話,實際上他有記住正確發音的,但就是講的時候常會忘記,然後他又不喜歡被更正的感覺。像是’蛋’念成’幹’、’對’念成’貴’、’花’念成’瓜’…,目前有注意到的是ㄌㄏㄉ這幾個音。沒自信可以從老師問他事情,講話小聲,或是盲從而看出來。
老師在講故事的過程裡,常矯正大公子的發音,此外,也藉由小遊戲來讓他認識正確的發音,老師先念’蛋’跟’幹’,問他說這好不好聽,然後會顛倒’蛋’跟’幹’的順序,讓他來判斷,答對五次就有小饅頭。看的出來,大公子不是很樂意玩這遊戲,因為他分辨不太出來。除了小遊戲,也讓大公子看老師怎麼去發’蛋’的音,並且告訴他舌頭要伸出來。
發音之外,也加強對句子意義的了解,像是”只要x,不要y或是相反”、”先找x再找y”、如果有x就y”等等的。再來就是空間與位置的表達,大公子太常用”這邊”、”那邊”,容易讓人不知道東西在哪裡,加強這部份,對於以後講東西在哪兒會很有用。
老師最後說,他上完這期,也就是再五次,應該就不用再來上課。另外建議我們帶他去檢查聽知覺,看是否有問題。老師相當肯定他仿畫、組織空間的能力,我跟老師說,可能是上學期有上繪畫課,然後有教他看圖去組合積木有關係。
好吧,等上完語言治療的課,接下來就是靠我們自己平常要多注意並且跟學校老師配合了。
速率即斜率
今天早上騎車的時候想到昨天在看的斜率,然後又想到速率,速率=距離/時間,這公式不就跟斜率是一樣的嗎?
斜率 = (y2-y1)/(x2-x1),假定 y 軸是距離,x軸是時間,以幾何圖形來表示,就很清楚。在愈短的時間裡,經過的距離愈長,表示速度愈快,在圖形上的表示,就是斜率愈陡峭,代表速度愈快。
是說自己把觀念連通的時間也太晚了點,現在才發現。
台哥大Catch上網費率試算
就試算一下,然後作圖。
| 方案 | Catch98 | Catch198 | Catch398 |
| 收費 | 98 | 198 | 398 |
| 傳輸量 | 15 | 50 | 150 |
| 超過以後費率(元/KB) | 0.025 | 0.015 | 0.0048 |
| 費率 | 6.533333 | 3.96 | 2.653333 |
| Cost if over/MB | 25.6 | 15.36 | 4.9152 |
從 Catch 98 升到 Catch 198 時,看起來最划算,因為圖形上的斜率較陡峭,很明顯可以感覺到下降很多,從 6.53 下降到 3.96。
currying
前兩天看Wikipedia上的Currying時,突然頓悟了(可見之前都沒認真)。這個不看英文Wikipedia的說明,還真的是不容易看懂。簡單的說,假設有個 function 是 f( x, y, z ),currying 就是令 f1=f(1),當呼叫 f1( 2, 3 ) 時,就等於是呼叫 f( 1, 2, 3 )。
目前想到可以應用在 c/c# 沒辦法帶預設參數的情況上,像:[c]void func( int x, int y, int z ) { }
void new_func1( int y, int z ) { return func( 1, y, z ); }
void new_func2( int y, int z ) { return func( 2, y, z ); }
[/c]
你可以想像到,這是一項複製、貼上的體力活,用 currying 的話,可以很快創造出新函數:[c]/* 以下為虛擬碼 */
void func( int x, int y, int z ) { }
new_func1 = func(1); /* new_func1 仍是函數 */
new_func2 = func(2); /* new_func2 仍是函數 */
[/c]
在 python 裡,透過 *arg、**kwargs 可以很容易實現,文章可以參考 Currying and Python, a practical example,裏面有點複雜,其實只要看 curry 類別的部份,下面就是直接摘錄出來的實例:[python]class curry:
def __init__(self, fun, *args, **kwargs):
self.fun = fun
self.pending = args[:]
self.kwargs = kwargs.copy()
def __call__(self, *args, **kwargs):
if kwargs and self.kwargs:
kw = self.kwargs.copy()
kw.update(kwargs)
else:
kw = kwargs or self.kwargs
return self.fun(*(self.pending + args), **kw)
def func( a, b, c ):
print( a, b, c )
return (a+b+c)
func1 = curry( func, 1, 100 )
func2 = curry( func, 2 )
print( func1( 200 ), func2( 300, 400 ) )
[/python]
原理就是利用類別的特殊方法 __call__ ,呼叫 func2=curry( func, 2 ) 時,實際上是得到 curry 類別的實體。curry 類別的 __init__ 裡去做參數的判斷跟預存,等到把 func2 當函數執行時,就會執行到 __call__,這裡再去呼叫真正的函數。
Python 2 與 3 之字串與檔案
Python 3 裡,很多常用的 package 名稱都變更了,這個倒還好,在 python 2.x 的文件裡,都已經可以看到說 3 的時候,名稱會是什麼,以及要注意什麼,甚至也有 2to3 的工具來輔助轉換。
最近遇到比較麻煩的是字串與檔案的處理,Python 3 裡的字串都是以 unicode 處理,好處當然是不用轉來轉去了,比較麻煩就是讀取檔案跟寫檔案的時候。我的程式有同時用到 subprocess、urllib/urllib2與一般檔案操作,以下是整理:
- 進行 subprocess pipe 操作時,讀出時,都是 bytes
- 使用 urllib/urllib2 讀取時,都是 bytes
- 使用一般檔案操作,沒特別指定的話,檔案編碼會以你當前的環境編碼來讀取,預定是讀取文字檔。
所以在讀取時,為了後續能用一樣的邏輯來讀取,我統一以 binary 來讀取,避掉 encoding 問題(對於 python 3 在 binary mode時,也能正確分行、tokenize這件事上,真的是深感佩服)。是說剛好之後也不需要做精確的內容判斷,所以也不用硬轉成 string(unicode),在 python3 時,都以 bytes 存在。在 python 2,讀出來就都是一般的 string (無 unicode),不是 bytes。
寫入時,也儘量使用 bytes 去寫入,避免encoding轉來轉去的問題。
儲存空間即將不足(續)
- 想用 statfs 去看 /data 到底是剩多少可用,結果要自己弄 jni,一整個懶惰,就…
- SL4A的python應該可以用吧,查了 python 文件,得知要用 os.statvfs,但是 SL4A 的 os.statvfs 被閹割掉… 囧
- 查 threshold,這個應該是可以的,只是要把 Settings.Secure.SYS_STORAGE_THRESHOLD_PERCENTAGE 改成 “sys_storage_threshold_percentage”,這個沒真的下去寫程式驗證。
- 用 terminal+busybox df 去查 /data 的,total bytes 是 162529280,心一橫,就拿這數字設到 debug.freemem (sudo setprop debug.freemem 162529280),真的,那個討厭的”儲存空間即將不足”的通知就消失了。
以上。但是要裝比較大的app的時候,還是沒辦法裝,可惡!!