閱畢日期:2013/11/07

這本書記得是在去年年底買的,算是買了很久,到了現在才看完。買的版本是電子書,在 Kindle 上看完,比較特別一提的是:直排,在 Kindle 上看直排書,翻頁跟橫排截然不同,橫排是點右邊就翻下一頁,直排則是點左邊才是下一頁,所以常常不小心翻錯到上一頁去。

故事是講基因的故事 (廢話),在未來,人類已經可以控制基因。主角是一個基因設計師,這次幫 L&B 公司設計的稻米出了問題,部分的稻米出現缺陷,於是就跟 L&B 的黑川先生一起到越南進行調查。透過北川先生的幫忙跟蝗蟲的採樣,他們找到了真相,並且設法揭發了世界最大新聞集團的陰謀。

故事裡蠻大量的使用了所謂的虛擬擴充實境,這應該就是 Google glass 的進化版,我自己在閱讀的時候,還蠻難想像是怎麼一邊跟人對談又一邊開啟虛擬擴充實境的,是故,這造成我對後半段的故事有點理解困難。但故事本身蠻有意思的,而且不時提到 Google 、擴充實境,還刻意以未來人的心境去解釋一些現在的名詞,不得不說作者用心良苦。對黑川先生如何在現實裡活動,我猜想應該是用布魯斯威利主演的「Surrogates」裡的科技,人都是在家裡遙控在外的機器人活動,這樣解釋就能理解為什麼黑川先生明明是應該是不良於行,卻還能出國調查。大體來說,故事還算不錯。

更多有關 Gene Mapper 基因設計師 的事情
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

  • Nov 01 Fri 2013 11:05
  • 功夫

閱畢日期:2013/10/30

跟之前的「少林第八銅人」一樣,也是在手機上的「真九把刀全集」app 裡看完的。

故事發生在現代,主角阿淵遇到一個奇妙的老人,從他的身上學到武功,並且經歷了一段奇妙的旅程。
雖然主角是阿淵,但是故事卻是圍繞在老人黃駿身上,老人會武功並且來自三百年前這件事情,實在是令人難以置信。隨著故事的展開,阿淵慢慢才知道這一切都是由於一個名為 Hydra 的少年,這個少年精通催眠術,並且讀了許多的中醫典籍,在數年前去養老院時,遇到關先生,於是萌生了改造人生的想法。進而兩人一起進入催眠狀態,在極短的時間裡練出絕世武功,並且將關老先生原有的記憶禁錮起來,創造了新的人格。
最後黃駿跟藍金(少年的另一個人格,與黃駿共同修習武功)決戰之後,阿淵的好友死去,阿淵接受少年 Hydra 的安排,要展開對少年的復仇。仔細想想,故事是有點驚悚了。故事到最後都沒有交代少年的來歷,但顯然,這個少年可能是吸血鬼,這樣就合理解釋了他讀了許多中醫典籍與精通催眠、符屍的事情。可是少年阿淵其實是可以不用入局的,他可以放棄報仇,帶乙晶到另外一個無人的地方繼續正常的生活,當然,如果怕被追殺,可以採取避免在同一地方久住的策略。
我想這或許可以寫出第二個故事來講 Hydra 與阿淵如何報仇。

更多有關 功夫 的事情
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

2.1 split :字串原本的 split 只能認一個字元,改用 re.split 就可以依據多個字元來切割。例如: re.split(r'[;,\s]\s*', 'asdf fjdk; afed, fjek,asdf, foo')
2.2 starswith/endswith :只要前面或後面幾個字元符合指定字串就傳回 true。除了可以用在字串上,也可以用在 tuple 上。
2.3 用 shell 裡的萬用字元來判斷:利用 fnmatch 模組裡的 fnmatch, fnmatchcase 就可以辦到。要注意的是 fnmatch 會因為平台不同,而有可能判斷不同,Linux 上對大小寫判斷很嚴格,但 Windows 則否。因此 fnmatch('foo.txt', '*.TXT') 在 Linux 上會傳回 false,但在 Windows 則會傳回 true,這時候就得用 fnmatchcase 。
2.4 介紹 regular expression ,也就是 re 模組了,這部分可以講的實在很多。用 re 就可以用規則來判斷字串是否符合。
2.5 取代:字串一般就是用 replace,也可以用 re 模組來做,re.sub (substitude)

文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

1.14 跟 1.13 也是應用 operator 模組,這次用的是 attrgetter。應用這個,就可以方便的進行排序而無需自行寫比較函數了。 sorted(users, key=attrgetter('user_id'))
1.15 講的是 group,依據元素裡的某屬性來做分類。除了使用前面提到的 itemgetter 之外,還使用了 itertools.groupby 函式。
1.16 篩選:這可以用 comprehension 輕易達成,像是 [n for n in mylist if n>0] 這樣,或者也可以利用 filter() 函式達成。在討論裡有提到 itertools.compress 函式,這個函式可以根據第二個 list 裡的 boolean 來決定要取出第一個 list 裡的哪些元素,例如 list(compress(['a', 'b', 'c', 'd'], [False, True, False True])) 會得到 ['b', 'd']。
1.17 從 dict 提取所需的部分:這也是應用 comprehension 來達成, p2 = { key:value for key,value in prices.items() if key in tech_names }
1.18 namedtuple :介紹 collections.namedtuple ,這個很方便,可以簡易的做出一個簡單的類別,又具有 tuple 的特性,而不用寫 class,例如: Animal = namedtuple('Animal', ['name', 'description']) : animal = Animal('Bird', 'Can fly')
1.19 介紹 generator expression,說真的,我快搞不清楚 comprehension 跟 generator expression 的差別了,這篇 python - Generator Expressions vs. List Comprehension - Stack Overflow 有說明,大致上的差異就是在於 generator expression 傳回的結果無法以 indexer 存取,也就是不能用 [0] 這樣的形式來存取。實際上 generator expression 傳回的形態是 generator,而 list comprehension 傳回的形態是 list。
1.20 介紹 collections.ChainMap ,這可以把兩個 dict 結合在一起,看起來像是一個 dict ,實際上在存取時,會去真正的 dict 拿。另外一個是用 dict 原本的 update method 來做,但這速度上就會比 ChainMap 來的慢了,因為需要做複製的動作。
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

1.11 介紹 slice(),slice 函式傳回來的是一個 slice 形態的變數,藉著這個,可以把一些東西固定下來,例如 a=slice(10,20): print s[a] ,這樣就不用每次都繁瑣地輸入 s[10:20] 。 slice 型別的變數還有一個 indices() 函式,可以避免存取超出陣列限制。
1.12 偵測串列裡最常出現的元素,這可以用 Collections.Counter 來做到。Counter 會幫你統計每個元素出現的次數,也會告訴你最常出現的元素是誰。
1.13 排序,這個很方便啊,就可以不用寫 lambda 了。假設 rows 是一個 list,元素則是 dictionary,就類似 JSON ,那可以這樣排序:sorted(rows, operator.itemgetattr('fname'))
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

閱畢日期:2013/10/26

故事背景設定在元末,元末該出現的人,像劉伯溫、張君寶、朱重八(元璋)、徐達、常遇春、施耐庵...等人都出現了。故事講的是一個傻小子七索上少林學藝,卻發現少林跟想像中不一樣,在少林遇到君寶,兩人鑽研出慢拳。後來七索被迫當少林十八銅人,君寶代替他出外闖蕩,揚名立萬。七索立下決心,要讓少林出去的弟子都是真材實料,就不收賄賂,嚴格把關,闖蕩出少林第八銅人的名號。響當當的當了5年銅人,之後也下山去闖蕩了。然後就遇到不少事情,像是發現少林寺的師兄都是裝腐爛,避免被不殺發現;丐幫幫主只會兩招降龍掌;娥眉派的起源;太極拳名字由來...。最後就是打大魔王「不殺」成功,就收掉了。

打大魔王這邊,算是草草收掉,很多事情很快的交代完畢就結束,我覺得這邊其實還有蠻多可以寫的,算是相當可惜的地方。不過這樣也好,我喜歡不拖戲。

更多有關 少林寺第八銅人 的事情
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

1.6 是介紹 collections.defaultdict ,如果你希望預先指定 dict 裡元素的形態的話,就可以用這個。例如 d = defaultdict(list): d['a'].append('hello') ,d 裡的元素會預先宣告為 list ,後續就可以直接用,不需要額外作。
1.7 collections.OrderedDict 會保證裡面的順序跟你放進去的順序一致,比如你先放 d, c, b, a,那麼印出來時,就會是一樣的順序。如果是預設的 dict ,那就不一定了。
1.8 取 dict 裡的最大值跟最小值,作者一開始使用 zip() 來組,但因為 zip() 傳回的是 iterable,無法做第二次使用,所以作者建議直接用 dict.values()。要再額外取得 key 的話,就得用 min()/max() 的第二個參數,例如:min_value = prices[min(prices, key=lambda k: prices[k])] 。也可以繼續用 zip,但就不要二次運用 zip() 傳回的值: min(zip(prices.values(), prices.keys()))
1.9 取兩個 dict 的交集,這可以運用 keys() 來做,例如 new_dict = {key:a[key] for key in set(a.keys()) & set(b.keys())}
1.10 在保持原來元素的排序情況下移除 list 裡的重覆元素:作者自己寫了一個 dedupe() 函數來做,主要原理是利用 set 的特性。
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

1.1 Unpack a sequence: 還蠻常用的技巧, p = (1, 2): x, y = p ,也可以拿來作 swap,x, y = (y, x)
1.2 這是 1.1 的延伸應用,Unpack 可以 unpack 成 list,也就是 x, *y, z = range(10) ,但很不幸,這在 3.x 才能使用。說真的,我沒想過可以這樣用,這真的很方便。
1.3 留住最近的 5 個值:介紹 collections.deque ,這裡舉的例子是讀檔,假定你需要參考當前讀取位置的前五行,例子就巧妙地建立了 search() 函式,傳回當前行跟前五行。前五行的歷史就利用 deque 的特性-先進先出而一直保留住最近的五行。
1.4 找出最大的 5 個值或最小的 5 個值:介紹 heapq,heapq 有提供 nlargest() 與 nsmallest() 函式,可以很方便的取得。
1.5 Priority Queue: 這也是利用 heapq 模組,heapq 模組裡有 heappush/heappop 。
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

7.8 這就是講 currying ,一般在用函式的時候,參數都要帶足才能用,currying 允許你,可以先給部分參數就好,然後回傳另外一個函式出來,你需要的時候,再把剩下的參數帶進去呼叫。Python 裡不需要另外自己實作,只要引用 functools 模組裡的 partial 即可。

除了舉出這個例子外,還提供其他應用作為參考,像是也可以應用在類別的建構子上,或是簡化函數所帶的參數等等。

7.9 把只有一個方法的類別改寫為函式:因為類別都要先初始化才能使用,這裡舉的例子,就是把這樣的類別改寫為函式,而函式裡再隱藏了一個函式,藉著這樣的機制,避免掉類別初始化的繁瑣。

7.10 讓 callback 函式多點變化:大部分情況下,callback 函式就只是傳參數進去呼叫;在某些時候會想要多輸出一些額外的資訊,但 callback 函式沒辦法記錄,這時候可以利用類別或是 7.9 提到的 closure 函式來記錄額外的資訊,就可以了。
另外也可以搭配 partial 來做更多的應用。

7.11 舉的例子有點複雜,我想他的意思應該是可以應用 functools.wraps 把函式包成 decorator 之後來使用。不過我還是看不太懂。

7.12 這個很妙,利用函數也是一個 first-class object 的特性,把函式指派為函式物件裡的 Method。藉著這個,就可以搭配 closure 做出一些應用。


補充:剛剛找了解說 wraps 的文章,講的很清楚,原來使用 decorator 的時候,你得到的函式資訊是 decorate 過的,functools.wraps 就是用來解決這問題,他會保留原來函式的資訊。
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

7.1 不定參數,就是在函式參數前加上 * ,例如 def foo(*arg) ,這樣 arg 會是 tuple 形態。
7.2 keyword arguments,就是可以用指定名稱來直指參數值,參數前面加上 ** 即可,例如 def foo(**kwargs) ,這樣 kwargs 會是 dict 形態。
7.3 說可以幫函式或參數加上 annotation,像是 def foo(i:int) -> int ,可是我試的結果卻不行。Annotation 的部分是定義在 PEP 3107 ,後來想到要在 Python 3 上面測試,果然,這是 3 才有的。
7.4 原來 return tuple 時可以省略括號,return 1, 2, 3 ,Python 會認定為 return (1, 2, 3)
7.5 default argument ,預先指定函式參數直,例如 def foo(arg=100) ,這一節有特別指出 default argument 的值是在函式宣告時就決定的了。
7.6 anonymous function :這就只能用 lambda 來替代了,但 lambda 有其限制在,要注意。
7.7 anonymous function 裡的變數值,依照執行時的前文來決定,而不是在宣告函式時決定。


文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

閱畢日期:2013/9/8

這本書不能說有趣,但對於喜愛史學的人來說,是一本不錯的書。我必須承認,在介紹 Sierra online 之前的章節還蠻枯燥的,Sierra online 之後的部分開始有了些趣味,可能是因為我也愛玩遊戲的關係吧。整本書從早期的佔滿整個房間的電腦,到後來的個人 PC、遊戲,都介紹到了,最後介紹了 Richard Stallman,說他是最後一個捍衛軟體自由的駭客。附錄有收錄一些訪談,可以參考看看,但其實並不算是記述當代的駭客,後續的 Linus、Mark ...等等都只有略為帶過。

看完整本書,可以歸納出駭客的特質就是專注,他們會專注在自己有興趣的東西上,例如很純粹的想要讓畫面不閃爍,就很認真的去研究系統內部的運作、組合語言等等來試圖達到不閃爍的目的。關於這點,最近也看到這篇「Hacker 精神,就是一種認真過活的精神」,正好可以對照來看。

更多有關 黑客列傳 的事情
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

  • Aug 12 Mon 2013 17:59
  • 分身

閱畢日期:2013/8/12

書的故事是分別以兩個人的角色去進行故事,兩個人到了最後才碰面,並且解開謎團,很有意思的講故事方式。

小林雙葉跟氏家鞠子兩人互不相識,小林因為上了電視導致母親遇害,開始進行調查;而氏家則是因為母親的縱火而開始進行調查。調查的過程裡慢慢把謎團釐清,也發現了彼此的存在。原來兩人都是宮城晶子的複製人,藉由代理孕母生出來,而這兩人的成功存活,是一個很重大的突破。北斗大學背後的勢力打算讓一個有地位的人藉著骨髓移植能延續生命,需要藉助她們二人身上的卵子來製作複製人,小林母親拒絕協助,因此被殺,而氏家父親無法坦然對女兒說出真相,讓女兒陷入危險。

最後,鞠子被抓住,透過父親的密信,才逃出研究所,在薰衣草田遇到了小林。在鞠子逃出後,氏家清為了贖罪,利用之前偷藏的硝酸甘油讓研究所爆炸了。故事就這樣結束。

更多有關 分身 的事情
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

書是從好讀網站來的。

整本書斷斷續續的看,應該有看了快一年吧。不,這並不是說書很厚,相反的,書並不厚,而且裏面是很多個描寫人的小故事,像耳熟能詳的「金大班的最後一夜」就是從這裡出來的。除了描寫從大陸來台北的人之外,對於場景、人物的刻化都很到位,還蠻值得一看。

有幾個故事都蠻讓人動容,不知道為什麼,我印象比較深刻是一個老師的故事,故事是由一個餐廳的老闆娘描述的,這老闆娘跟這老師是鄰居。老師在大陸有個未婚妻,但沒逃到台北來,他就一邊在學校教書,一邊攢錢,像是平時養雞,節日到市場賣等等的,平日就盼啊盼的,總期望未來能重回到大陸跟未婚妻團員。到了有一年,他親戚跟他說有機會可以把他未婚妻接來台北,就跟他要了他大半生攢的錢,結果可想而知是騙他的。他後來就因為這樣整個崩潰,甚至後來瘋掉,被帶走之後,不知所蹤。

更多有關 臺北人 的事情
文章標籤

elleryq 發表在 痞客邦 留言(1) 人氣()

閱畢日期:2013/7/12

應該是部落格轉成書本,書裡的文字不多,大多都是彩頁+圖片,很快就可以翻完,不過我還是花了蠻多天才翻完。

書本裡有不少東西可以參考:
  1. 每日行走路程、住宿跟花費,這是很具價值的參考數據。
  2. 可以在廟宇寄宿,令我驚訝的是,有些廟宇竟然建有香客大樓供進香的香客居住,平日也提供住宿給背包客。
  3. 阿塱壹古道不好走,有一段需要高繞,依靠繩索攀爬。可以走 199 號道到旭海,再問路。
  4. 作者本身性格蠻外向的,這對他旅途的幫助很大。
  5. 很多地方的行動網路仍然不暢通,最好還是帶 GPS 裝置會比較好。


書本裡沒有提到他如何搜索到便宜住宿的方法,我想他或許是去背包客棧找到的,平常很少逛背包客棧,之後來逛逛。

更多有關 放下百萬年薪也要做的事 的事情
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

第一章是 setup python 環境,以及安裝 numpy, networkx。
作者是用 easy_install 來安裝,我個人會建議使用 virtualenv + pip 來安裝,一來是因為 virtualenv 可以方便的構建出測試環境,二來是因為 easy_install 在未來會以 pip 來替代。

指令:
  1. virtualenv mining_the_social_web
  2. cd mining_the_social_web && source bin/activate
  3. pip install numpy
  4. pip install networkx
  5. pip install twitter
  6. sudo apt-get install libyaml-dev
  7. pip install nltk
  8. pip install pygraphviz


照著第一個範例要去取得 trends 時,會發生錯誤,說 "The Twitter REST API v1 is no longer active. Please migrate to API v1.1."
新的 twitter API 的變動不少,v1 已經都淘汰,我試的結果是,現在必須都要經過 oauth 驗證以後才能使用 API。
Trend 現在也需要指定 WOEID 才能使用:

第二個是搜索關鍵字,但現在已經沒有 page 參數了(GET search/tweets),搜索關鍵字的範例:

NLTK 不支援中文,要中文斷詞的話,得花另外一番工夫,可以參考 LACC - NLTK中文化處理及文字筆畫音調剖析工具整合套件

結果看這本書所花的時間多半是在試範例上,Twitter API 改版為 1.1,必須都要驗證過才可以使用。作者在 github 上有開 repository 來放範例程式碼,也都有隨著更新,之前應該先上那邊去看的,可以省許多時間。

更多有關 Mining the Social Web 的事情
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()