# PyCon TW 2016 Collaborative Talk Notes <br> Day 1 - R0
> ### Quick Links
> - [Portal for Collobration Notes 共筆統整入口](https://hackfoldr.org/pycontw2016) (hosted by [hackfoldr](https://hackfoldr.org/about) and [HackMD](https://hackmd.io/))
> - [Program Schedule 議程時間表](https://tw.pycon.org/2016/events/talks/)
> - [PyCon TW 2016 Official Site 官網](https://tw.pycon.org/2016/)
>
> ### 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/2016/about/code-of-conduct/) during discussion. 討論、記錄時,請遵守大會的[行為準則](https://tw.pycon.org/2016/about/code-of-conduct/)。
## Talk: Essential TDD (Test-Driven Development) for Pythoners
- Info: https://tw.pycon.org/2016/events/talk/70169571679535177/
- Speaker: 曾君宇 [均一教育徵才中](http://www.junyiacademy.org/)
- Slides: http://www.slideshare.net/excusemejoe/essential-tdd-pycontw2016
- TDD (Test-Driven Development)
- Red, green, refactor cycle
- 預想好使用情境
- 一次只會專注一個目標,一次解決一個問題
- 避免過度設計
- 其他 *DD
- ATDD(驗收測試驅動開發):
- 聚焦在客戶的需求
- 按照spec做開發
- BDD
- TDD的八卦?!
- 2014就掛惹! by Rails創作者
- [懶人包:TDD is Dead 戰文總整理 ](http://joe-dev.blogspot.tw/2014/06/tdd-is-dead.html)
- PyCon結束再看 ^.< (不然PyCon就結束了)
- 結論?
Mindset:設計決策一次只聚焦在一個地方
好好評估環境適不適合TDD(連需求都不確定時,不建議使用TDD)
推薦書籍:[Test-Driven Development with Python](http://chimera.labs.oreilly.com/books/1234000000754) (O'RELLY)
## Talk: 那些年,我用 Django Admin 接的案子
- Info: https://tw.pycon.org/2016/events/talk/69827266518974528/
- Speaker: Michelle Leu
- 從美容床開始的故事...
- 實作範例:店家網站,有眾多分店,Account 和 branch之間有多對多的情形
- [Django Packages](https://www.djangopackages.com/):推薦許多好用的Packages
-- [Django Suit](http://djangosuit.com/)
## Talk: Reactive Programming in Python
- Info: https://tw.pycon.org/2016/events/talk/67738180727603248/
- Slides: http://keitheis.github.io/reactive-programming-in-python/
- PDF: https://speakerdeck.com/keitheis/reactive-programming-in-python
- Speaker: Keith Yang
#### What is reactive programming
>game is reactive.
- Programming PARADIGMS
- Declarative
- Imperative
#### Stream
> Everything can be a stream
##### Stream in `for in if`
* list comprehension
* generator expression
> 眼睛會痛XD
#### Why reactive programming
- Abstraction
- Focus on Business logic
- Concise code
- Performance
- asynchronous programming
#### PyFunctional
- `from functional import seq`
> core spirit: Stream
[most.js](https://github.com/cujojs/most): Monadic reactive streams
[Python reactive extension](https://github.com/ReactiveX/RxPY)
Handle for you:
- Thread-safty
- Syncronization
- etc ...
Implementation:
- RxPy
- RxJava
- RxCpp
- etc ...
> Asynchronous programming is HARD.
### RxPy
#### Observable
#### flat_map
複雜的 list 的扁平化(我要的值在 list 的每個event中)
```python
str_ls = [['6', '7'], ['42']]
```
### books
* Python Reactive Programming
* Reactive Programming with Scala and Akka
* Reactive Programing with
## Talk: 大型互動展覽的 Python 應用
- Info: https://tw.pycon.org/2016/events/talk/68743273514008626/
- Speaker: 陳炯廷
互動業 (?)
常用工具:OpenFramework / PureData / Kinect ...etc
#### 互動科技案例:
- 簽名自動雷雕成名牌
HTML canvas => Django server => jpg file => 工讀生
- 解密科技寶藏
- 3D掃描
#### ID機
用Raspberry Pi 3
- Autoupdate要寫好
- Django (因為有admin所以非熟悉程式的人也可以用)
- zeroconf + avahi 自己找主機
- 使用 QRCode 設定機器 (ex. reboot 逼一下就重開)
- 全區開機、全區關機卡(實用! pip install wakeonlan)
- 運用redis指令,可以摹擬很多人一起使用系統
- socket.io emitter 可以和場內server聯絡
#### 文件
因為不同公司有不同權限,Django和nginx串接來解決
去一個展場,需要安裝一個 App ,然後可能還沒看完,就離開了, App 又需要送審,相對於網頁,網頁打開就可以 work。
## Talk: Boost Maintainability
- Info: https://tw.pycon.org/2016/events/talk/58446570282024986/
- Speaker: Mosky Liu
- 投影片: https://speakerdeck.com/mosky/boost-maintainbility
我們在開發程式的時候,都是 "read lines randomly" 的,不像電腦會逐行讀取。
> [Making wrong code look wrong](http://www.joelonsoftware.com/articles/Wrong.html) - Joel on software
#### Maintainability
用人讀 code 的方式來定義 Maintainability
> To understand a random line, the lines you need to read back.
相對於programmer的時間,運算資源比較不值錢。
把時間專注於想要做的事情,而不是 debug 上面。
#### Boost Maintainability
- Define our "Maintainability"
- Making it zero
- progressive from zero
##### Maintainability
Be exact & consistent (命名要精準且有一致性)
##### 舉個例子
```python
result = ...
result = ...
```
以這種方式來命名不夠準確所以很容易混亂
##### 命名的好方法
常常用 dictionary,對一個領域不熟悉的話可以多查字典來找到更好的名字哦!
#### Ops Hint
命名具有提示的作用,提示有怎樣的operation可以用
```python
page_no = ...
page_html = ...
```
這樣就可以知道 `page_no` 是一個數字,而 `page_html` 是一個字串
```python
allowed_field_set = set(requested_field)
```
這樣能清楚知道他是一個集合(set)
##### consistent問題
用d來標示dictionary
```python
user = User(...)
user_d = {}
```
>Hint: func 的命名如果沒有取名好,那發現問題還需要查 document,這個更耗時
建議:func都用動詞開頭,就會記得加上()
不要把 `is_secure = True` 與 `req.is_secure()` 混用
以 `形容詞`、`介係詞` 來當 boolean 會比較好
或者用簡單的句子來表示 boolean: `req_is_secure = True`
#### Ops Hint (Mosky 使用的習慣)
- Hint which ops you should use
- _no: numeric
- <plural>: sequence, usually is mutable sequence(list).
- _<type>: if no intuitive way
- (這邊好像有缺漏,求有筆記到的幫補充)
- <verb>_: imperative sentence
- <yes-no question>: return boolean
- to_<thing>: thing
- boolean: <adj>, <prep>, <simple sentence>
##### return value
- get_page_no -> numeric >= 1
- query_user -> user object
- parse_to_tree -> tree object
##### avoid `None`
Consider:
```python=
user = query_user(uid)
user.is_valid()
```
如果查不到 user 就 ret None 的話,就會噴 Error 囉!
Accept an exception ?
- N: user dummy object like an empty string.
- Y: just raise when you wanna assign to None.
#### 如果沒有檢查好做好處理
```python=
tmpl = '<p>{}</p>'.format(name)
name = '<script> ... </script>'
#XSS
```
```python=
tmpl_html = ... .format(
escape_to_html(name)
)
```
這種不是 python 的東西,對 Python 而言就只是 str,所以要去處理
#### Structure Hint
```python=
uid_email_map = {
'mosky': 'mosky@email'
}
```
這樣子的命名方式能夠更直覺
##### for dict & tuple
- <key>_<value>_map
- tuple
- _pair: 2-tuple
- _pairs: 3-tuple
#### Private Hint
- _<name>
- Dont use out of class, function
#### Performance Hint
- get: memory op (記憶體的操作)
- parse_ / cale_: CPU-bound op
- query_ : IO-bound op
- query_or_get_: IO-bound op with cache
#### Progressive from zero
- 不要自己自創縮寫,可以去[網站](http://www.abbreviations.com/)上查
- 如果只是要在一個 func 裡面用而已,可以用註解來解釋縮寫定義
(目前著重於讓人能夠更快讀懂 code,所以才這樣說)
- 把程式分段跟分節
- 把做一系列事情的分段及分節
- 用 `空行` 來把不同的事情分隔開
- 用 `section` 的方式來切開(Title comment 來區隔開不同的區塊)
#### Line Function up(把程式連線起來)
> Func A call Func U, Func B call Func U
可以從連線的方式來慢慢切開變成函式的模組化
>Hint: 最好把箭頭指向的方向全統一到同個方向
#### Face Bad Smell(察覺程式碼中的壞東西)
>不要為了克服心理上的潔癖而造成開發上時間的損失
>就是不要因為覺得 code 很醜就浪費一下午改好又不能動 XD
- 用 comment 來解決痛點而不是改寫
- 放很多 TODO,不是不改是時候未到 XD
- Seal it:把他封起來就對了,或是用更好的名稱把他包起來
- def good_name(): bad_name()
- Stay focused:認真寫 code,舊的東西先放著!
#### Summary
> Use hints to boost maintainability !
#### QA
1、如何影響同事在 co-working 上使用較好的命名?
絕對不要有 guild line,可是可以用 `I will prefer` 這種方式來慢慢改變同事的風格,當他們發現這麼做的好處就會漸漸跟著改變。
但是真的碰到沒有按照規則走的同事也不要太生氣,可以 comment 他(幫他補一堆 comment),幫他 wrapper,然後讓自己的工作更順利。
2、你會參考 google 的 programming guildline 嗎?
會參考唷!