# PyCon TW 2017 Collaborative Talk Notes <br> Day 3 - R0
> ### Quick Links
> - [Portal for Collobration Notes 共筆統整入口](http://beta.hackfoldr.org/pycontw2017/) (hosted by [betw.hackfoldr](http://beta.hackfoldr.org/) and [HackMD](https://hackmd.io/))
> - [Program Schedule 演講列表](https://tw.pycon.org/2017/events/talks/)
> - [PyCon TW 2017 Official Site 官網](https://tw.pycon.org/2017/)
>
> ### How to update this note?
> - Everyone can *freely* update this note. 任何人都能自由地更新內容。
> - Please respect all the participants and follow our [code of conduct](https://tw.pycon.org/2017/about/code-of-conduct/) during discussion. 討論、記錄時,請遵守大會的[行為準則](https://tw.pycon.org/2017/about/code-of-conduct/)
>
### 10:35-11:05 <br> Talk: [PyPy's approach to construct domain-specific language runtime](https://tw.pycon.org/2017/events/talk/347808212868661376/)
- Slides:
* [Part 1](https://www.slideshare.net/jserv/pypys-approach-to-construct-domainspecific-language-runtime)
* [Part 2](https://www.slideshare.net/star0217/pycon-tw-2017-pypys-approach-to-construct-domainspecific-language-runtime-part-2)
- Speaker: TsundereChen(夯) and Jim Huang
重點提示:
* Why is Python slow?
+ Interpretation overhead
+ Boxed arithmetic and automatic overflow handling Dynamic dispatch of operations
+ Dynamic lookup of methods and attributes Everything can change on runtime
+ Extreme introspective and reflective capabilities
* PyPy Translation Toolchain
+ Capable of compiling
+ (R)Python Garbage collection
+ Tracing just-in-time (JIT) compiler generator Software
+ transactional memory (STM)
* PyPy Interpreter
+ written in Rpython
+ Stack-based bytecode interpreter (like JVM)
* bytecode compiler → generates bytecode
* bytecode evaluator → interprets bytecode
* object space → handles operations on objects
* Parser: source -> lexer -(Token)-> parser -(AST)->
* Since 2014, PyPy development is diverse:
+ CPython 3 support
+ Improve compatibility with C
+ extensions NumPyPy
+ Multi-threading support
* Experiment Rep: [TsundereChen/bf_to_py](https://github.com/TsundereChen/bf_to_py)
* Notice that not every program should use PyPy/RPython
* How to compile PyPy
* Way to build Interpreter / Translator
延伸議程:
* [虛擬機器設計與實作](https://hackmd.io/s/SkBsZoReb)
* [jserv 與他愉快的小夥伴](https://www.facebook.com/JservFans/) 不定期會有系統軟體的線上講座直播,請注意公告
提問:
0. ==Q==
1. 請問PyPy應該怎麼唸呢?拍拍?皮皮?or...?
2. 建議圖表的部分,縱軸應該從零開始,如果大小差異太大的時候,可以取對數座標表示。
### 11:15-12:00 <br> Talk: [Write Elegant Concurrent Code in Python](https://tw.pycon.org/2017/events/talk/337380532511834208/)
- Slider: https://speakerdeck.com/mosky/elegant-concurrency
- Speaker: Mosky Liu
- [Github](http://bit.ly/econcurrency)
#### Outline
- Why concurrency?
- Concurrency is Hard?
- Communicating Sequential Processes (CSP)
- Channel-Based Concurrency
- Concurrent Units
- CSP vs X
####
- Parallel vs Concurrency
- Parallel 平行:一段時間
- Concurrency 並行:同一時間
- *Parallel 包含 Concurrency
- 如何讓 Concurrency 代碼好看?
- 通常不會用python解CPU bound的問題,而是解"I/O bound的問題",這個talk討論的也是I/O bound的問題!
- google後發現套件太多?
- threading + queue 足以完成大多數 Concurrency 的實作
- Comment: 這邊的 queue 不是傳統資料結構的queue,而是sync queue,所以是thread-safe
- Comment: 再複雜一點的也可以再加用process, coroutine, gevent
- Communicating Sequential Processes(CSP)
- 描述並行化系統的Formal languge
- processes communicate with "channel"
- [Go採用CSP](https://godoc.org/github.com/thomas11/csp)而可以寫出簡潔的Concurrency code
- 用溝通來傳遞 share memory,而不是使用 shared memory 來溝通
- "Use locks and shard memory to shoot your foot in parellel." - python wiki
- Channel-Based Concurrency (用 Channel(Queue) 來溝通的 Concurrency)
- 傳統、非channel-based的方法是不斷從queue拿task,並在完成task後要呼叫task_done通知大家你已經完成task了
- Python thread = OS thread, but there is evil GIL
- Daemon Thread
- 此 daemon 非 unix的daemon => interpreter關掉的時候會自動清掉 unfinished thread
- 3 layers
- 查詢atomic方法:盡可能用python內原本就是atomic的方法,不行的話再用channel解 (thread-safe](http://bit.ly/aoperations)
- 使用channel操作:參考下面範例
- graph視覺化:用紙筆畫就可以了
- 範例:爬pycon官網的爬蟲 (3個queue => text_q, url_q, run_q)
- f1: url-> text via channel
- f2: text -> url via channel
- break in the end
- atomic操作:每個函式都不存取自己以外的東西
- 用dict來記哪個網址已經造訪過,因為dict是thread-safe
- 在queue裡放TO_RETURN,其他queue收到就會一起結束,有廣播的效果
- 除錯建議用印log的方式,可以參考github上的印log的代碼
- channel的好處彈性擴充:遇到exception可以把exception丟到別的queue
- Concurrent Units
- threading.thread
- @asyncio.coroutine
- multiprocessing.Process
- gevent.Greenlet
- 不要混用,很可怕。你不知道會發生什麼事
- 根據David所說,Gevent是最快的,asyncio是最慢的 [benchmark](https://github.com/note35/echo_server)
- channel也可以用
- rabbitMQ
- redis
- kafka
#### 與其他方法比較
- Channel = Lock + message passing
- Channel 抽象化程度較高
- 先用Channel設計,在轉換更底層的
- parallel map
- 假如你的問題可以用parallel map,就用吧,channel比較低階
- CSP vs Actor Model
- 完全等價
- Actor Model強調
> 沒聽清楚 求補充
- CSP強調 channel
- Actor model tends to
- class
- private state
- CSP tends to
- function
- explicit channel
- CSP vs Reactive Programming
- mosky:想到reactive就森77,不知道在紅什麼 ・゚・(´Д⊂ヽ・゚・
- reactive名詞太多,observable之類的,CSP比較old school大家都會
- CSP vs MapReduce
- CSP比較輕量級,有彈性
- MapReduce需要你去follow他的workflow
- 總結
- CSP = Concurrent units + Channels
- CSP可以避免你踩雷,但Concurrency本身還是個很雷的東西,可能還是會踩到其他的雷
- 用logging來visualize,以方便debug
- 別硬用high level的東西,不必要
#### QA
- Q: Log Debug好方法
- A:
- 用內建的logger, time好用
- 有user time還有牆上時鐘跑了多久之類的資訊
- Q: pitfall 例子,channel deadlock
- A:
- 傳統上會遇到的問題都會遇到,這是怎麼設計的問題
- python 3 比較沒lock的問題了
### 13:00-13:45<br/>Talk: [Stranger in a Strange Land](https://tw.pycon.org/2017/events/talk/371495434037756045/)
- Slider:
- Speaker: Russell Keith-Magee
主軸:用一個語言完成所有事情?(One language to rule them all)
device 為什麼沒有 python?
- webapps: JavaScripts
- ios: Object C, Swift
- android: Java
如果你是個工程師,多語言主義已經成為主流,但如果你不是個工程師只是用特定語言解決特定問題的學者,這可能是個挑戰
Parallelized monolingualism
目的:特定語言 -> API -> 多語言完成的任務
到底什麼是Python?
- CPython嗎? No
- GIL 是 Cpython 實作的一部分,不是Python本身的feature
- 最簡單的Device想法? Embedding CPython
- Porting CPython
- 列出目前支援的平台:
> `$ ls -d Lib/plat-*`
- 直接編譯CPython成device的Python? No
- Cross-Compile
- ctypes: Accessing system libraries
- [ctypes](https://docs.python.org/3.6/library/ctypes.html) & FFI
- 用ctype讀取C的.so檔,不需要compile,python可以直接使用C的library
- 一個新的python(不同platform)面對的問題
- Parser, Compiler, Eval loop, Std Lib
- eval loop / std lib 兩者的根據不同provide有不同的解法。
- ios怎麼處理?
- 如果是C-based的情況,完全可以用ctypes解決,相對簡單。
- Android怎麼處理?
- Cpython不是python,讓python用不同的編譯器([PyPy.js](http://pypyjs.org/))達成這個目的
- [VOC](https://pybee.org/project/projects/bridges/voc/): parser / compiler
- Webapps
- Batavia (用js寫的)
- 反編譯成 bytecode
import dis
dis.dis(some_module)
- 為什麼webapp不用 Cross-Compile?
- 太複雜太麻煩,python跟javascript的closure概念不同,我們希望跑的是python,而不只是像python。
- [Webassembly](https://zh.wikipedia.org/wiki/WebAssembly): 還在進行式
- 個人的comment:
- 只用單一語言不健康
- 但我們可以解決它
[http://pybee.org](http://pybee.org)
[aosabook.org](http://aosabook.org)
Q. 用python寫的專案能夠被itunes, google play接受嗎?
A. 只要符合不從遠端下載script執行,基本上用python framework寫的是完全能被接受的。
Q. pybee做的東西能夠做出跟原本語言品質相同的專案嗎?
A.
目的如果是特定的(只在某個平台run),基本上是直接邏輯對應轉換。
目的是跨平台多元的,用system API。
### 13:55-14:25 <br> Talk: [enjoy type hinting and its benefits](https://tw.pycon.org/2017/events/talk/322835918492794965/)
- [Slider](https://www.slideshare.net/masahitojp/the-benefits-of-type-hintss)
- Speaker: masahito
- 什麼是type hints?
- 傳統寫法
- type hints寫法
- C code寫法
- type hints的歷史
- python2
- 沒有限制函式的arguments跟return values
- 一些工具會自己填滿它
- PEP (3107仍然可以繼續寫,但希望未來更多type hints的寫法,詳盡但仍簡潔比簡單但忽略更好)
- 3107(3.0)
- free text (沒有限制)
- 484(3.5)
- type hints現世
- 這寫法非必要(python仍保留動態型別特性)
- 讓code的可讀性,維護性更高
> example: child # 用註解寫型別是bool
- typing module (484開始的)
- 讓data structure更好讀
> a: List[int] = [1,2,3]
- NamedTuple
- 526(3.6)
- 向下相容
- 讓code可讀性更高(直接寫型別在變數上)
> example: child: bool
```python=
#3107
def greeting(xxx):
return "hello" + xxx
#484
待補
#526
待補
```
- 取得 type hints 的資訊
```python=
c: Car = Car() #有一個Car的Object
c.__annotations__
```
- 我們從type hints得到的Benefit
- Code Style: Simple, Explicit
- Code Completion
- Editor
- PyCharm
- 編譯器能夠透過type hints提供輔助訊息輔助開發者開發
- [mypy](https://github.com/python/mypy)
- CI
- 可以在CI系統上跑mypy
Q:是否真的用type hints預防了什麼問題?
??????%&*$^*&#^$#*^$#$
### 14:35-15:20 <br> Talk: [千百種面對 PDF 的方法](https://tw.pycon.org/2017/events/talk/347449930429759608/)
- Slider:
- Speaker: 廖偉涵 Adrian Liaw
adrianliaw是一個馬來西亞律師,找不到的話可以找adrianliaw2000
高二在家自學鋼琴小帥哥
- 剖析PDF
- 結論:能不處理就不要處理,真的很麻煩,用keyin就好
- 先想想看大眾向的格式資料
- JSON:直覺的dictionary格式
- CSV:輕易的當data frame處理
- XML/HTML:有結構化的資料
- 共通點:有架構、資訊明確,設計就是讓機器可讀的
- PDF?
- 投影片看不清楚沒關係,黑人問號比較重要
- 用regex抓不到東西,沒有巢狀結構
- portable: 在哪台電腦看起來都一樣
- 指令是用來指定哪個東西要放在哪個位置
- 常見物件:char, rect, line...
- pdf格式可參考 http://simpopdf.com
- PDFMINER (一個不難找到的python用的pdf parsing套件)
- 著重文字擷取、線條沒有處理非常好
1. parse (PDFParser, PDFDocument):圖像的架構
2. intepret(PDFInterpreter, PDFDevice):產生Object
- 重點是PDFDevice,處理各種parse後的資訊擷取(文字面效果較佳)
- get_pages(open('xxx.pdf')) 產生一個generator
- 好處
- 都python寫的
- pdf2txt
- lazy-loading
- 壞處
- 但只支援python2,需要裝pdfminer.six才支援python3
- 沒什麼有用的文件,常需要讀code
- 需要重複寫很多boilerplate
- 架構複雜難以理解
- 向量圖形的資訊不容易抓取
- 初始化步驟:
```python=
resources = PDFResourceManager()
device = PDFPageAggregator(resources)
interpreter = PDFPageInterpreter(resources, device)
# Then...extract
```
- Poppler(C++ library)
- Reducing Problem: 先把pdf轉成xml/html/json,再截取我們要的內容
- 沒有比較好用的python架接API
- pdftohtml
> $ pdftohtml -xml <input.pdf>
- pdftocairo
> $ pdftocairo -svg <input.pdf>
- 原始碼裡面會看不到讀到的文字,但SVG顯示時看得到文字。通常可以用他來得到每個物件的座標位置,再用pdfminer讀實際的文字內容
- 轉換成svg後,再用svgpathtools
- 文件超少
- 每個圖形視為一個path,用虛數代表x,y座標
```python=
from svgpathtools import svg2paths
paths, attribs = svg2paths("graphics.svg")
# Then...extract
```
- why so many choices?
- not choices, it's a combination
- 結果常常會不如預期
Q. 你怎麼處理PDF的?(遇過同行內,被視為同的東西的情況)
A. 先抓出輪廓,再抓輪廓內的內容