2014年12月27日 星期六

活動:Tainan.py x MOSUT 2014 12 月聚會

用向量處理風水問題!



台南一姊調酒師工作中!




完成!歡迎參加 Tainan.py x MOSUT 聚會!


GNU ld linker script簡介

講者為經常主動投稿的 wen ,這次他投稿算是如願以償
台下坐著老師 *1 + 資安研究者(ㄏㄞˋㄎㄜˋ) *1 對演講內容進行補充





快快樂樂開發 IoT 作業系統核心

講者為 jserv,演講內容為下學期成大資訊系嵌入式作業系統的課程及教材簡介
關於此演講內容可參考 hackpad 上的共筆



Introduction to Fourier transform and signal analysis

講者為宗翰,我先承認我一下子就 GG 惹
演講素材如:python code、latex code 與投影片皆可在此 下載



介紹「風水好宅」

講者是 Ijs 邀請過來的學弟施信宇
他們團隊做的系統能讓使用者畫出房子的簡易室內平面圖後
利用程式自動化驗證其是否滿足各項風水規則
其中後端程式利用到了 tornado + numpy/scipy 以進行向量計算

此作品的相關 新聞








最後,則是由 kuku 對「大資料」進行介紹並且破除迷思 ...
會眾們就在鹽酥雞 + 超低酒精海尼根綠茶 + 自備的點心中
果然又到了快要九點才結束聚會 XDDDD





2014年12月14日 星期日

秘訣:[edX] FP101x Introduction to Functional Programming

圖為開課教師 Erik Meijer 正在講解手中的量子電腦(無誤)


一分鐘看懂真正的 Syllabus


  • 八週精心設計的課程  (幫助你白數根頭髮)
  • 以 Haskell 為主的 FP Introduction (少數實驗可以用其他語言寫)
  • 需要有 1 年以上程式經驗(以便上課時自行對照 FP 與 imperative 的差異)
  • workload 4 -6 小時 (除非你說英語 + 數學好,不然請 * 2)



誰不該修這門課

  • 平常工作下班超過晚上九點的人 (別再進修折磨自己了,不如換工作先?)
  • 初踏入社會做未滿一年的資訊人 (你還有很多要學,這個技能點數可以晚一點再點)
  • 想學一個好上手的 FP ,且要馬上拿來用的人 (請跳過 Haskell)
  • 排斥閱讀英文課外素材的人 (這門課需要看很多資料)
  • 閒暇時間不多的人 (建議有花掉 100 ~ 150 小時的心理準備)



誰適合修這門課

  • 閒暇時間夠多的人(學生、魯蛇、放長假者、正常上下班且想進修者 ...)
  • 數學強的人(不是算數強的人)
  • 有認真寫過 javascript, python, perl, php, ruby 之一的人(學習的門檻較底)
  • 想拿 PhD 但是沒有題目的人 (無誤)



案例

某魯對 FP 一直很有興趣,據說去年的新年新希望是學 scala  ... (而且還沒達成)
今年心想放長假卻不學一門 FP 實在太遜惹
男子漢要學就學「純」的,而且越難越好(誤)

最後該魯花了 150+ 小時修課跟閱讀課外資料
而且到現在還是不會寫 Haskell
但是對 FP 倒是真的有初步認識 ...

#備註:該魯旁聽最後 92 分 pass



歷程

開課的學校是荷蘭的代爾夫特理工大學,世界排名在 100 附近
授課老師是強者 Erik Meijer,之前在微軟
他說話略有口音,但速度不快,很容易跟上
為了讓課程有趣,老師正式上課前常常會安排有趣的橋段
用以譬喻或銜接的課程內容,會使人莞爾一笑(或是覺得他很煩  XD)

這門課的影片時間不算長,一個子單元大約只有 30~40 分鐘的影片
一週最多兩個子單元,共有 14 個子單元

我的經驗是前四週,每週大約花費 12 hours 完成課程
之所以多花了一點時間,是因為我盡可能維持作業的正確性、並且嘗試玩玩各種 lab
由於有 Python 的使用經驗及或多或少有看過別人介紹 FP
我在前四週的學習算是非常順利
也不太需要閱讀課外素材

But 就是這個 but
咻~滑進去課程後,會遇到很大的一個坑 - Monad
在第五週,我花費了 40+ hours 才結束該週的課程
這門課設計得很巧妙,老師沒有正式教 Monad
而是介紹完了 Functional Parsers 以後才告訴你這是 Monad
要不要深入探討則是課後閱讀及學生自己的事

老實講,就算不花這麼多時間去理解 Monad ...
也是可以繼續進行之後的課程
不過,我想既然跳坑了,就學多一點吧!
胡亂看了些 google  到的補充素材,盡力去理解課後閱讀的資料 ...
最後我才知道對我來講這個坑真的無窮大,設個停損點後就繼續修課 XDDD


課程的後半段,影片難度比前半段僅略高一點
難度提升最多的地方是作業與 lab
有時候看到 2x 題的作業或是 lab 就覺得好累
以困難度來講,請留意 Poor Man's Concurrency Monad 這個 lab ... Orz
真的會讓人回憶到小時候寫程式作業去捶打棉被的過去



秘訣

0. 你想知道 Python 與 Haskell 有什麼關係?
https://wiki.python.org/moin/PythonVsHaskell


1. 如果你只想咬一口看看 Haskell 在幹嘛,恭喜!
剛好良葛格正在 CodeData 撰寫一系列的 文章
都是中文且淺顯易懂,推!


2. 沒錢買課本 or 不想買太硬的課本,這裡!
來讀 Haskell 趣學指南吧!圖文並茂且中入淺出 ...
Learn you a Haskell for Great Good
# 有中文版,但是建議閱讀英文版
# 強烈建議在 Functional Parser 子單元進行前讀過 本章
# 覺得這本書太棒了?那就買一本吧 : )


3. 到底什麼是 Monad?
搞不懂的話先來聽聽 stackoverflow 上的兩個回答 A B
需要圖解的話,這邊有 懶人包
有了基本概念後,再來繼續 fp101x 課程提供的閱讀素材吧!
http://www.cs.nott.ac.uk/~gmh/monads


4. 倒數第二個 Lab:Poor Man's Concurrency Monad 超難?
真的超難,建議(如果寫得出來的話)寫一題就去回答題目
以取得 feedback ,才知道自己寫的對不對
需要特別留意的是,題目測試的覆蓋度不足
所以有可能寫錯答案,可是前面的測試會對,回答最後面的整合性考題會錯 ... Orz
如何推理出 bind   題目出自這篇 paper



心得

透過 MOOC 自主學習,在本質上是最容易打破學習界線的
本課程的設計深入淺出,儘管在少數章節銜接處有小 gap 需要自行補上
但是透過兩個月能夠習得的知識量及老師的看法是非常有價值的

我個人認為,這門課讓我大大打開眼界,亦「升級了腦袋」。







2014年11月22日 星期六

活動:Tainan.py x MOSUT x FP 2014 11 月聚會

Sam 正在講解投影片!
這次聚會主題非常的 FP ,參加人數也非常的 FP (XDDDD)



用 Python 寫 FP

第一個講者是我!
我投個十分鐘的慢速閃電秀來幫大家暖場 XD

如同往常般,我運用了標題殺人的技巧讓人以為我想要聊 map, reduce, filter
想要用 Python 寫寫 FP (languages 的 interpreters) 的朋友
莫錯過投影片提及的參考資料喔!

(現場演講時有約 5 min 的 Video Demo,但我不想傳到 youtube )






Functional Reactive Programming on Android

講者為 sam ,本場演講強烈推薦寫 java or android 的朋友一觀

(什麼?自己看看不懂?唉~誰教尼沒來參加聚會 ˊ__ˋ)




Haskell Advance Components (by hychen)

講者為 hychen,他拿了一份「向大師學習系列」的投影片講解 haskell ...
到了約 monad 附近,就打開編輯器用 Python 概念性地寫些程式碼進行講解 ..

Reference: http://github.com/hychen/boliau






Responsive web design 的能與不能

此為閃電秀的投稿!
講者為一姊婉貞 ,她以企劃的角度來聊聊 RWD / AWD / SWD









2014年10月27日 星期一

演講:程式 x 設計 @ MOPCON 2014


此次 MOPCON 的議程與會眾數可以說是質量俱增,感謝工作人員的努力 Orz
圖片出處:MOPCON 粉絲團

噢噢~噢噢~噢噢~噢噢~
>////<"
第一日晚宴時,最讓我印象深刻故事是
(用詞不太一樣,大致上的語意如下)
「工程師參加社群聚會活動後跑出來創業很正常,結果某一群人參加活動後,最後出來創業的是設計師」
圖片出處:MOPCON 粉絲團




從 MOPCON 2014 開始徵稿以後,就一直在想該聊些什麼?
恰好截稿前夕正在閱讀 諾曼先生的設計心理學一書 ...

該書當頭棒喝地把我敲醒!
之前所讀的幾本設計入門書籍的內容再度湧入腦中
彷彿可以重新組織架構這些知識

最後,儘管我處於才剛看懂設計領域中的「hello world」的狀態
卻斗膽投了「講個秘訣之: ooxx ...」一題(可以化簡為「程式 x 設計」)

投稿順利被接受後,我就有了「理由」放下手邊看不完的技術書籍
一頭栽進所謂互動設計 / 設計心理學的入門領域
讀書期間,感謝幾位設計師朋友的協助:

大宇人。小雨宙 - 借我兩本好書
十分設計工作室 - 從設計師角度解答許多問題




# 投影片高畫質 pdf 下載




我花了約整整三天準備好投影片,且內容高達 128 頁 ...
剛開始,我沒有很滿意自己的準備內容
這一系列的書給了我太多,而就我的理解程度與「輸出能力」卻只能淺聊到這一丁點的內容
有種愧對大師的心情 ... Orz


但是後來仔細想想,半個多小時的分享中
如果能夠讓碼農對「易用性」、「設計」、「人」感興趣
或反之,能讓設計師找到可以「說服」碼農的突破點(尤其是認知科學)
那麼便是功德圓滿


又,在準備演講內容查閱書籍的過程中
許多諾曼先生的看法與觀點亦再次觸發我的思考
我想,這一系列的書,絕對不是看個一次兩次就能吸收消化得了的


而,這一個多月以來的收穫
除了初窺設計領域與反思程式設計以外
大概就是某種程度的更加「了解自己」





這張演講照片被 MOPCON 官方粉絲團分享 XD
我要澄清我沒有強烈政治傾向也沒有台北市投票權,只是就事論事 ...
圖片出處:MOPCON 粉絲團


聽眾爆滿  T_T
圖片出處:hychen


最後一個秘訣:明年 PyConAPAC 仍然在台灣舉辦
敬請期待!!!







2014年10月20日 星期一

好課分享:更多的 OO, MIT 與 Python


看到了嗎?Unit 1 的第一個子項目是 Object-Oriented Programming


更多的 OO

上個月的 Tainan.py x MOSUT 聚會,我投稿了「OO x Python」的主題
準備資料的過程中,有點好奇國內外「物件導向」相關課程的開設情況
發現專講 OO 的課程真的是好少啊

不難發現,由於現在許多人學習程式入門的語言都已支援或立基於 OO paradigm
所以學校內的基礎課程,不太會刻意去開設 OO 相關的課程
又或以「物件導向程式設計」名義開設基礎 Java/C++ 入門課程,而並沒有深入探討 OO 議題

使得學生:
  • 僅能「見葉」(學會語法)
  • 無法「見樹」(理解單一語言層級上的 OO 概念)
  • 更遑論「見林」(更加廣泛深入地探討 OO 概念)

為何相關課程如此之少?
原因不外乎與行政因素、教師專長、教學意願、熱門程度及對軟體工程的重視與否有關
然而,學生大學畢業後若要到業界工作
恐怕有一半以上的工作內容都是以 C++/Java/C#/Objective-C/Python/Ruby ... 等擁抱 OO paradigm 的語言為開發主力


好,不再碎碎念,在此補上幾門開放課程 or 課程網頁:


面向對象技術高級課程 (北京大學 @ Coursera)
https://www.coursera.org/course/aoo
# 參考資料全部都有簡體翻譯本 or 有簡中書籍


物件導向程式設計 (台灣交通大學開放課程 - 電機系大一)
http://ocw.nctu.edu.tw/course_detail_4.php?bgid=8&gid=0&nid=343#.VB--zpOSw_M
# 參考資料乍看就是一本書 (c++)


物件導向軟體工程(成大資工研究所)
http://casd.csie.ncku.edu.tw/Object-Oriented_Software_Engineering.html
# 參考資料為 http://www.amazon.com/Object-Oriented-Software-Engineering-Practical-Development/dp/0077109082 (java)


Object Oriented Development (Telecom SubParis)
http://www-public.it-sudparis.eu/~gibson/Teaching/CSC7322/
# 參考資料極為廣泛而深入,強烈推薦看一下課程網頁



更多的 MIT 與 Python

查找上述 OO 相關的課程資料時,看到 MIT 的開放課程心頭不禁一震:


6.01
Introduction to EE and CS (MIT OPEN COURSEWARE)
Unit 1-1 Object-Oriented Programming
# 有影音等課程資料可下載


對,物件導向只是入門課程中的一個單元中的子單元!
好奇之下,索性就把該單元的錄影、文件翻一翻 ...

在此子單元內,OO 的部份沒有講得很多
因為老師必須先 overview 課程大綱
然後再把學生帶到軟體工程的世界,及透過使用 python interpreter 傳授 programming 概念

以專業魯蛇的角度來看,此上課的投影片與課後素材的設計非常優異
以 Primitives – Combination – Abstraction – Patterns (PCAP) 的概念為主軸
課堂上雖然在各方面都只是點到為止
但有強調 environment 的概念,使學生對其建立概念模型
當學生閱讀課後素材時,自然就能克服許多障礙

更甚者,課後素材的最後一部分
是引導學生利用 Python 實作帶有 Scheme 風格的半成品 interpreter:Spy
能夠這麼做,是因為教材設計具有連貫性且事先灌輸 environment 的概念模型
(連我都忍不住打開 vim 跟著寫寫看)





等等!入門課怎麼可能上這麼快?
第一堂課上完,就已經直達 OOP  ... 這哪招 XD
6.01 的課程進度大概是國內的 N 倍了吧 



其實在正式課程之前,有一門只有三禮拜的先修課程可以上  
內容大概是「溫和」地讀完「How to Think Like a Computer Scientist: Learning with Python」
然後寫寫作業、考考試 ...



6.189
A Gentle Introduction to Programming Using Python
# 無影音但有課程資料可下載(含 How to think ... 一書)




您發現了嗎?6.01 其實是 EECS 的入門課
要軟一點,有下面這門課可以修:


課程大綱如下:


上面的課程大綱完全就是我夢想中的第一門程式設計課(流口水)



更多的碎碎念


自從三年前我第一次接觸到 Python 後
我常常會思考,是否能拿此一優雅的思想介質來協助新手學習 CS 的課程?
又或者,數學類型的課程若能透過 Python 計算、實作以為輔助
是否數學概念能夠更加紮實地深植於我的腦中?
(或是以程式碼的形式放置在程式作業的資料夾內亦可)


約耳在接近十年前,撰寫了「爪哇學校的危害」一文,頗推薦一觀
文中反映該時代背景下,他所見到的問題


這幾年以來 MIT 的 CS 入門課程,也投奔到使用 Python 語言
以上述 MIT 開放課程的優秀內容看來
我倒不擔心「拍桑學校的危害」會傷害到 MIT ...
更何況,入門後還有多采多姿的 其他課程 可以深入學習


對於 MIT 的開放課程而言
我看不到最聰明的一群學生如何學習
但是看得到有智慧的教授如何教書
之所以這麼說,是從教材與談吐可以得知開課教授具有深厚的 CS 涵養


仔細想想,CS 入門課程才是最難教的
絕對不是僅用單一觀點與狹隘的經驗,就能引導學生順利踏入 CS 的世界



更多更多的 MIT 與 Python
edX 上面有這門課:
Introduction to Computer Science and Programming Using Python及其後續課程:
Introduction to Computational Thinking and Data Science






2014年9月27日 星期六

活動:Tainan.py x MOSUT x FP 2014 9 月聚會

會眾正在專心聽 wen 分享!


淺談 Debian 套件打包

講者為好久不見的  wen
wen 透過分享自己嘗試打包的經驗,想要吊出 hychen 過來蒞臨指導 XD
不過很可惜 hychen 有事情沒有到場 Orz






C & CPU

講者為現居台北特地過來分享的 fea
這場分享的強度 ... 呃 ... 非常非常的強大(本魯已陣亡)
硬派男子漢請自取(誠如 fea 所言,其實某些角度來講這算軟)





OO x Python

標題詐欺!講者是我!
內容其實是講一點點你很有可能沒聽過的 OO 的故事,以及工商服務 Python





另外由於此次聚會是第一次  x FP
所以演講過程我有提到一些有趣的資料(但是我講得不有趣 Orz)

On the criteria to be used in decomposing systems into modules
重量級歷史名作,不單對 OO ,對 FP 也有重大影響

Why Functional Programming Matters (中文翻譯)
從未真正學習過 FP 的我,看完這篇才覺得有入門的感覺

The Early History of Smalltalk
對 OO 歷史有興趣可以一讀,讀完請至 MOSUT 社群分享
以下為摘錄的一小段話:

For the first time I thought of the whole as the entire computer and wondered why anyone would want to divide it up into weaker things called data structures and procedures.Why not divide it up into little computers, as time sharing was starting to? But not in dozens. Why not thousands of them, each simulating a useful structure?

我本來很想對 FP 能有摘要性的介紹,無奈對其道行實在太淺
後來仔細想想,本次聚會我連對 OO 摘要性的介紹都做不到
只能挖出一點歷史,看能不能讓大家想想 OO 在幹嘛 ....
等等,我認識台南有在寫 FP 的 hychen / sam 怎麼都沒有來 XD?

SICP Metacircular Evaluator

- 用 scheme 來寫出一個 scheme


講者為超久不見的 descent
近期他正在研究 SICP,寫了一系列的文章放在他的 部落格
由於時間有限,本次聚會他只有講完 part1...


對 SICP 課程有興趣可到此 MIT OCW 的 網頁 瞧瞧


工商服務

- 自由軟體開發與社群發展

本次聚會成大資工的楊老師亦到場參加
並且宣傳了他在系上開設的課程


成大有這個課真好啊~



事實上,這次聚會前一天
我心甘情願地到該課程去介紹 MOSUT 與 Tainan.py 的聚會
呃 ... 如果您是在學學生,不妨可以瞧瞧這份投影片












2014年8月28日 星期四

活動:Taipei.py 2014 8 月聚會

自由交流時間
對!您沒看錯,Taipei.py 的聚會場地有三螢幕投影


恰巧路過台北幾天,於是便興高采烈地參加 Taipei.py 的活動
竟然還看到 kuku 也剛好路過,非常有 Tainan.py 的感覺 XD


把 R 和 Python 串起來

講者今年四月其實也有到台南推廣 R 語言!
大致上這是一場 Py 皮 R 骨,大量運用 C++ 的技術分享 XDDD

講者:Wush Wu



TimSort

是的!講者是高中生,講的是 TimSort
這也是 python & java 有使用到的 sorting algorithm

講者:rilak 投影片

補充:wiki 、 作者自己的介紹



SPA with Python Django and CoffeeScript

講者為 KELP,本場演講主要是介紹實作簡易 error report server 時用到的技術堆疊
話說當講者 Live Demo 打開編輯器時,我差點跪下了  Orz

Photo from Taipei.py
其實書寫體真的比較好看,可是對於英文閱讀苦手的我來說,看到會哭 ...
另外,對齊也的確是問題 ...
補充:這是講者的 github 專案


pytest 還有他的快樂夥伴

講者是  ... 我





原本只想快點帶過,結果多嘴講了 30 分鐘  XDDD


補充:如果想了解更多 pytest 可以參考 這篇文章

2014年8月23日 星期六

活動:Tainan.py x MOSUT 2014 8 月聚會

會眾非常開心的參與這次的活動!


近幾次 Tainan.py x MOSUT 聚會參加人數皆達 30 人以上
本月聚會則因上午 jserv 糾團,晚上又剛好是若渴計畫
您若全程參與,則將達成 12+ hours 的技術聚會饗宴(特訓)



GNU Radio

為了紀念(?)823 砲戰,此次講者 Albert Huang 特地南下
演講內容由淺入深,會眾亦積極參與,發問不斷電 ...
(事實上,後來 Sam 在演講時也有向 Albert 發問 XDDD)


reactjs

為了參加大食團,此次講者 Ly 路過台南
向各位介紹了 facebook 的 open source project: reactjs
身為很久以前曾寫過很爛的 angularjs 的後端魯蛇
我只能說 reactjs 真是有意思!

觀看投影片
補充:virtual dom


在物聯網跟穿戴式裝置正夯的時代,身為App Developer不能不了解的BLE

為了研究創業,此次講者 Sam 住在台南
向大家進行一個很全面的演講, 從技術堆疊、相關應用到 Live demo 所有願望一次滿足!



淺入淺出 pytest 還有他的快樂夥伴們

為了有更多 Python 的講題,此次我自投題目 Orz
pytest 是我個人認為較為 pythonic 的 testing framework
由於易理解且容易上手,能讓寫 testing 的門檻降低許多 ...


本「向大師學習系列」投影片使用 Prezi 製作

補充:
本次 Tainan.py 後,我恰好路過 Taipei.py
有對此講題重做一次介紹, 錄影在此 (約 30 分)



2014年7月31日 星期四

筆記:小型 Web Crawler/Automator 個人工具箱

許多 (browser) automation 的工具都用「鬼」命名 XDDDD
phantomjs, slimerjs, casperjs, ghost.py ...
圖片來自:手滑背單字 的懶惰鬼


#以下為我撰寫小型 web crawler / automator 時常使用的工具與思路


觀察 & 分析

釐清要什麼以後,宜先人工操作網頁,並透過以下方式進行初步觀察:
  • chrome 開發人員工具 => network => 勾選 preserve log => 進行操作
    • 觀察 http 封包的發送
  • chrome 開發人員工具 => 點選左上角搜尋圖示 => 直接點擊欲觀察的網頁元素
    • 在該網頁元素的程式碼部分,可以使用右鍵直接取得 xpath / csspath 的資訊
  • 使用 visual event 觀察頁面上 javascript event 與 UI 的 binding 情況


個人工具箱

我慣用的工具有:(程式執行成本由低到高)
  • requests 函式庫,從 http 的層級解決問題
    • 執行效率最佳
    • 雖然位於底層,但最後不一定會是最繁雜的 solution
      • 可無視許多 application UI 的操作邏輯
    • 若上層的 application 過於複雜,會難以找出合法 http request 的格式
      • 要處理的參數過多會導致需要花費很多時間測試
      • 參數值越依賴 application  的運算,越難生成
      • 隨著頁面跳轉、ajax 呼叫 ... 複雜度會上升
      • 需要自行維持  headers / cookies 的值 ... 手動模仿部分瀏覽器行為
  • mechanize / twill / mechanicalSoup 之類的函式庫,用精簡版的瀏覽器解決問題
    • 執行效率次佳
    • 部分瀏覽器的功能已經被實作,能帶來很大的方便
      • 但是不能執行 javascript ,使得適用範圍小很多
    • 函式庫會附帶一些便捷的 API ,協助填寫表單、點擊連結 ...
    • 適合拿來跑簡單的 functional testing
      • 至少可以不用擔心如何維持瀏覽器的狀態
      • 拿來測 API 也並無不可
  • 使用 phantomjs 等等內嵌 webkit 的工具,透過無視窗介面的瀏覽器解決問題
    • 執行效率欠佳
    • 能執行 javascript ,可高度模擬使用真實瀏覽器的情境
    • 有廣大的社群以此為基礎,開發相關的 testing / automation ... tools
      • casperjs 是高階,極為好用的封裝
        • resurrectio 提供了 chrome plugin,可以人工錄製欲自動化的步驟以後,自動生成以 casperjs 寫的測試程式碼
          • 還在開發初期,頗有機會測試程式碼會出錯,需要人工修改
      • ghost.py 是 python 版本仿 casperjs 的函式庫
        • 依賴 pySlide or pyQT ... 安裝得花功夫
        • 能夠使用的 API 仍比 casperjs 少很多,文件亦不足
        • 優點為:使用 python 寫出的程式碼架構,可讀性比 js 版本高非常多
  • 使用 selenium 驅動瀏覽器,直接人工錄製欲自動化的步驟或進而匯出程式碼
    • 執行效率欠佳,且大都需要視窗環境
      • 驅動真實瀏覽器時,會顯示出視窗,好處是較容易除錯
      • 亦可驅動以 phantomjs 為核心的 ghostdriver,不需顯示出視窗
    • Selenium 的 Python 及各語言 binding,能夠讓開發者在習慣的環境下開發程式
    • 直接使用錄製功能時,記錄下來的動作不一定具備正確重現性
      • 亦即播放時仍可能出錯


使用策略、心得

對於簡單的網頁,特別是無須登入那種,requests 可以說是最佳解
甚至直接使用 pyquery 就能快速完成 crawling + parsing 的工作

但是對於較複雜的網頁,常常會陷入 requests vs. casperjs 的抉擇
當評估用 requests 實作要太多時間,而能接受較慢的執行速度時
casperjs 算是一個比較快速的解法

換言之,以下可能是不錯的使用策略:
  • 需要執行頻率高的 crawling 時,推薦用 requests 
  • 需要執行頻率低或有複雜 application 操作的 automation 時,推薦用 casperjs


實務上,要使用 requests 自幹時
千萬記得到 google / github 找找看有沒有人有做過同樣的事情
即便語言不同,只要能夠看懂 http 相關的操作
也很容易可以寫出自己的版本


反之,即便要走 casperjs 路線
也並不代表會一路順遂,因為仍然有一定的學習成本
  • 高階的 resurrectio 能夠自動產生 casperjs  的  code ,但是不一定 work
  • casperjs 有乍看醜醜,但是其實蠻完善的文件(建議讀完他)
  • 分享幾個使用上的經驗:
    • 網頁會有 popup 視窗的行為,要特別注意
    • 使用 evaluate API 之前,盡可能看看其他 API 是否有提供包好的功能
    • 可以關掉讀取圖片的功能,大幅加速程式速度
    • 我個人會透過擷取圖片功能,事後看各個步驟的執行結果

原本我以為若使用casperjs ,就可以在幾個小時之內馬上完成工作
結果一邊撞 javascript / casperjs 的牆,一邊讀文件後
最後還是花費了超過一天才完成工作 ...
當然,熟悉這個工具以後,會認為付出是划算的


歡迎補完

本文沒有探討 parsing 或是  crawling 的深入議題,僅只是介紹寫寫小 scripts 時的工具
若有朋友知道有什麼好物,請推薦給我啊啊啊!





2014年7月26日 星期六

活動:Tainan.py x MOSUT 2014 7 月聚會



Tainan.py x MOSUT 2014 7 月聚會 - kuku

Tainan.py x MOSUT 2014 7 月聚會 - jserv



因為走錯路而遲到,在緊張的心情下(人好多)
我拿出輸出 VGA 有點接觸不良的 ipad 開始了這次的聚會 ... Orz


開場:新 Logo + 把玩 supervisord + Python 報報

(此次開場試用  evernote 簡報功能,開場簡報下載

活動開始後我先投稿做好許久,但是忘了拿出來的 MOSUT Logo ...
原圖下載svg)designed by nao


接著怕整場活動 Python 太少
所以快速介紹一下一個用 python 寫的好用程序管理工具:supervisord
接下來我進行簡短的 Python 工商服務後,就是講者的分享時間了!



跟大師學習:講講瀏覽器渲染 - 當內容遇上裝置



等等,第一位上場的講者難道不是 kuku 嗎?
怎麼投影片是第二位講者 jim Huang (jserv) 的?


是的,這就是 kuku 的「跟大師學習」系列演講,詳情請見下圖:

圖片來自 仁傑

以下為 Isrlab 對當天分享的補充:
昨天 Tainan.py X MOSUT,我們分享了最近研究的課題,主標題是 "向大師學習 - 講講瀏覽器渲染",副標題是 "當數位內容遇上裝置"。
這是一個有趣的年代,數位內容的生產者必須多方考慮眾多裝置差異及各家瀏覽器的渲染能力,我們正在嘗試幫數位內容的開發工具,加一些獨家功能,像是 Flash 編譯器的修改;也考慮深度挖掘瀏覽器的優化可能性,像是 Firefox Gecko 層的擴展。
分享給前端工程師,瀏覽器工程師,系統工程師。

kuku 使用的第二份投影片:Rendering Performance Case Studies (強力推薦一看)



一定會扯到 Python 的「情感運算學習網」上線

第二位講者小均這次為我們介紹 情感運算學習網
並且 demo 一個 辨識情感的小程式 (by python)
( jserv 已玩過改過,且說明其辨識能力不佳)


身為「我要征服台南牛肉湯」的作者,小均「順便」分享一下最近做的研究:

點此觀看研究報告
偷渡一下牛肉湯回報:
民生路那間無名牛肉湯,老闆每天都是自己到善化屠宰場選肉再拿回店面 ... 推!


Build A Lightweight Hypervisor for Realtime Linux

伴隨著隔壁在換招牌的陣陣轟聲
jserv 帥(爆)氣登場,為我們介紹 realtime linux:




工商服務


PyConAPAC 後,各地 Python 社群蓬勃揪團,依開台順序排序:


More info: 


Python 台灣使用者群組 


Or


Python Taiwan @ Facebook 
https://www.facebook.com/groups/pythontw/




筆記:把玩 supervisord


本文是從 evernote 筆記中轉存出來的文章,分享於 Tainan.py x MOSUT 2014.07 




# 看完了 wen 分享的文章以後 …




# 也來試看看用 python 寫的 [老字號] supervisor 吧 (推薦用來管理自己的 process)






# 安裝(盡量在 virtualenv 之外裝) 
pip install supervisor --pre


# 建立 config sample file

echo_supervisord_conf  >  /etc/supervisord.conf


# 修改 config file

[program:foo]
command=/bin/cat


# 建議啟動時讀取自己的 config file

supervisord -c supervisord.conf


# 使用 supervisorctl 來管理自己的 process (使用範例)

[tainanpy etc]$ supervisorctl

backup                           RUNNING    pid 26703, uptime 26 days, 18:18:33
main                               RUNNING    pid 26702, uptime 26 days, 18:18:33
sentry-web                    RUNNING    pid 26701, uptime 26 days, 18:18:33



supervisor> ?

default commands (type help <topic>):
=====================================
add    clear  fg        open  quit    remove  restart   start   stop  update
avail  exit   maintail  pid   reload  reread  shutdown  status  tail  version



supervisor> restart sentry-web

sentry-web: stopped
sentry-web: started



supervisor> status main

main                             RUNNING    pid 26702, uptime 26 days, 18:19:42
supervisor>


# 其實啟動時可以帶很多參數,config 檔支援 *更多* 設置方式


-c FILE, --configuration=FILE
  The path to a supervisord configuration file.
-n, --nodaemon Run supervisord in the foreground.
-h, --help Show supervisord command help.
-u USER, --user=USER
  UNIX username or numeric user id. If supervisord is started as the root user, setuid to this user as soon as possible during startup.
-m OCTAL, --umask=OCTAL
  Octal number (e.g. 022) representing the umask that should be used by supervisord after it starts.
-d PATH, --directory=PATH
  When supervisord is run as a daemon, cd to this directory before daemonizing.
-l FILE, --logfile=FILE
  Filename path to use as the supervisord activity log.
-y BYTES, --logfile_maxbytes=BYTES
  Max size of the supervisord activity log file before a rotation occurs. The value is suffix-multiplied, e.g “1” is one byte, “1MB” is 1 megabyte, “1GB” is 1 gigabyte.
-y NUM, --logfile_backups=NUM
  Number of backup copies of the supervisord activity log to keep around. Each logfile will be of size logfile_maxbytes.
-e LEVEL, --loglevel=LEVEL
  The logging level at which supervisor should write to the activity log. Valid levels are tracedebuginfowarnerror, and critical.
-j FILE, --pidfile=FILE
  The filename to which supervisord should write its pid file.
-i STRING, --identifier=STRING
  Arbitrary string identifier exposed by various client UIs for this instance of supervisor.
-q PATH, --childlogdir=PATH
  A path to a directory (it must already exist) where supervisor will write its AUTO -mode child process logs.
-k, --nocleanup
  Prevent supervisord from performing cleanup (removal of old AUTO process log files) at startup.
-a NUM, --minfds=NUM
  The minimum number of file descriptors that must be available to the supervisord process before it will start successfully.
-t, --strip_ansi
  Strip ANSI escape sequences from all child log process.
-v, --version Print the supervisord version number out to stdout and exit.
--profile_options=LIST
  Comma-separated options list for profiling. Causes supervisord to run under a profiler, and output results based on the options, which is a comma-separated list of the following: cumulativecallscallers. E.g. cumulative,callers.
--minprocs=NUM The minimum number of OS process slots that must be available to the supervisord process before it will start successfully.
supervisorctl Command-Line Options

-c, --configuration
  Configuration file path (default /etc/supervisord.conf)
-h, --help Print usage message and exit
-i, --interactive
  Start an interactive shell after executing commands
-s, --serverurl URL
  URL on which supervisord server is listening (default “http://localhost:9001”).
-u, --username Username to use for authentication with server
-p, --password Password to use for authentication with server
-r, --history-file
  Keep a readline history (if readline is available) 





autorestart
May be one of falseunexpected, or true. If false, the process will never be autorestarted. Ifunexpected, the process will be restart when the program exits with an exit code that is not one of the exit codes associated with this process’ configuration (see exitcodes). If true, the process will be unconditionally restarted when it exits, without regard to its exit code.
Default: unexpected
Required: No.
Introduced: 3.0


# 官網


Try it !


(文件 Host 在 Readthedocs <- 三月份若渴:來分享的外國朋友創辦的服務)