Browsed by
Author: Max Lai

[閱讀週記] 20180804-0810

[閱讀週記] 20180804-0810

Source: http://bit.ly/2MBOQP4

閱讀週記第2期, 記錄過去一週閱讀中覺得值得分享的資訊…

[Python]

  • Python Names and Values
    這是 Ned Batchelder 在Pycon 2015 的 talk, 說明了 python 變數名稱跟儲存記憶體的關係.
  • Modern Face Recognition with Deep Learning
    最近開始進行 Face Recognition 相關的專案, 網路上很多文章都提到github上 face recgnition  這個專案. 本文是作者自己寫的簡介, 可以作為人臉辨識研究的起始點.
    編案:我在 Window 7 安裝相關套件時, 踩了一些坑, 會再整理專文分享.

Read More Read More

[閱讀週記] 20180730-0803

[閱讀週記] 20180730-0803

記錄過去一週的閱讀中覺得值得分享的資訊…

[Python]

Read More Read More

使用 Python3 進行物件導向程式設計(1)

使用 Python3 進行物件導向程式設計(1)

簡介

物件導向程式設計(Object-oriented programming, OOP)是一種具有物件概念的程式編程典範(programming paradigm)[1]。

OOP 透過把系統視為由許多彼此互動的物件所組成,使用OO技術所設計的系統一般來說可提高可了解性可修改性

舉一個例子,我們可以將一家公司的人員建模(modeling) 成為一個 Person 的物件,一個 Person 可以有‘ID’, ‘Name’, ‘Address’, ‘Salary’ 等屬性;另外還可能有 ‘Raise_Salary’ (調薪) 的動作,會去更改底薪的數值。

Read More Read More

設定 Flask 中 SQLAlchemy SQL log on/off

設定 Flask 中 SQLAlchemy SQL log on/off

在 Flask-SQLAlchemy 中有一個 configuration key ‘SQLALCHEMY_ECHO’ 可以開關 SQLAlchemy Engine執行SQL 指令時是否 log 到 stderr[1]

但由於我程式中也用了以下指令設定 ‘sqlalchemy.engine’ 的 log level [2]

logging.getLogger(‘sqlalchemy.engine’).setLevel(log.INFO)

因此當我將 SQLALCHEMY_ECHO設為 False 時,程式還是會持續 log SQL指令,找了一下才發現是以上的log level 的設定問題。

另外還發現了將 logger ‘sqlalchemy.engine’ 設為 ‘log.INFO’ 所 log 的訊息會比僅將 SQLALCHEMY_ECHO設為 True 時會要多,因此這二者還是有一些細微的差別

[1]http://flask-sqlalchemy.pocoo.org/2.2/config/
[2]http://docs.sqlalchemy.org/en/latest/core/engines.html

[閱讀筆記]目標:簡單而有效的常識管理

[閱讀筆記]目標:簡單而有效的常識管理

這一本「目標」是高德拉特介紹「限制理論」四部曲的第一本。
全書以小說的形式來介紹「持續改善的流程」,故事發生在一間工廠,廠長及其主要幹部為主角,劇情以廠長羅哥接收到 BU Head 皮區的最後通碟–若三個月工廠的虧損沒有改善,就要關掉整間工廠!
書中以羅哥為第一人稱針對工廠生產流程,分析問題、找出關鍵(瓶頸)、帶領全工廠的幹部逐漸發展出「持續改善」的系統性思考及方法。
記得剛出社會的時候也閱讀了高德拉特這一系列書籍,但當時並没有辦法了解其中的精髓。在經過了十多年軟體專案開發經驗以及學習了 “Kanban” 方法,重新看這一本經典,書中的許多場景在在都引起心中的共鳴。
書中有一場描述羅哥擔任兒子童子軍健行領隊,觀察個別小朋友速度的變動如何影響整個隊伍行進速度的因果推論,真是非常生動而且精準地描寫專案開發當中不同工作階段人員個別的工作變動不可避免地造成整體專案進度的延後
自己延伸的想法:一般專案的時程預估通常都是用平均速率來規畫專案的開發時程,但是每個人的真正開發速率是會有變動的 (個人因素如生病、家裡有事;外在因素:插件、颱風…),而這些的變動會慢慢的遞延到 之後的開發人員,若後面的開發人員想要追上一開始訂定的專案時程就必須要付出近乎兩倍的趕工速度,這不是一個可以持續(sustainable)的工作方式。因此用平均速度來預估專案時程一定是會落後的。
書中提到了聚焦五步驟:
步驟一、找出系統的瓶頸。
步驟二、決定如何利用瓶頸。
步驟三、根據上述的決定,調整其他的一切。
步驟四、把系統的的瓶頸鬆綁。(就是解決它)
步驟五、假如步驟四打破了系統原有的瓶頸,那麼就回到步驟一。
要有能回答三個問題的能力:
  • 應該改變哪些事情?
  • 要什麼方向改變?
  • 要如何改變?
若想要更了解聚焦五步驟,google 一下, David Ko  、 Rudy 老師 、 Project UpWilliam Yeh 都有更深入的介紹,就不在此文中再細談。
接下來摘錄一些自己很有共鳴的句子:
  • 根據我的觀察,這個工廠的訂單可以區分為四種優先次序級別:緊急, 非常緊急, 緊急得不得了, 以及立刻完成!總之,我們就是没有辦法依進度完成訂單.  [P2]
    • 相信大家在執行專案的經驗中,常聽到主管都是這樣的心情及表達吧
  • 工廠要賺錢的衡量指標:有效產出(throughput), 存貨(inventory), 營運成本(operational expense) [P93]
  • 我們一定要把眼光放在整個組織上, 而不是只談製造部門, 或是一家工廠, 或是工廠裡的一個部門. 我們不著眼於局部效益(local optimum) [95]
  • 有效產出是我們收進來的錢, 存貨是目前積壓在系統中的錢, 而營運費用則是為了讓有效產出能夠發生, 我們必須付出去的錢.[P114]
    • 在傳統的工作場域,主管會很在乎個人員工是否有在做事,反而没能注意到團隊真正對外的有效產出,對一個軟體團隊而言就是用戶喜歡的功能,以真正為公司賺到錢為考量。
  • 每個人都時時刻刻都在工作的工廠, 是非常没有效率的工廠. [P132]
  • 大多數的廠長都傾向於盡可能地調節產能, 不要有任何資源閒一旁, 讓每個人的手上都有工作做[P135]
  • 啟動資源( activating)並不等於有效利用資源( utilizing )[P331]
  • 絕對不可以試圖把系統中的每一種資源都發揮到極致。追求局部效益的系統絕對不是好的系統,而是非常没有效率的系統[P331]
    • 軟體專案有時工程師在學習新技術、重構、撰寫測試,就主管的角度來看可能没有實際產出,但卻有很大的價值。反過來說工程師要讓自己看起來很忙似乎也不是太難就是了。
  • 每個工廠都並存著兩個現象: 依存關係(dependent events) & 統計波動(statistical fluctuations)[P137]
  • 一個事件(例如作業程序)或一系列的事件必須等待其他事件發生之後,才能發生。[P137]
  • 當這些相關事件都和另外一個叫「統計波動」的理象結合起來,事情就變大了。
    • 個別成員的波動和相依性相結合就會讓事情更為複雜,因此專案管理需要系統性的全局思考。
  • 假如工廠裡出現了一個瓶頸, 那裡就可能會有堆積如山的在製品存貨[P229]
  • 在零件到達瓶頸之前,就先作品管[P250]
    • 如果測試人員已經是瓶頸,那工程師若能經由單元測試提升品質可以讓產出效率更高
    • 其實若從需求進來時品質是很好的,那開發人員的產出也是會提高啊
這本書的情節緊湊,快則一天慢則三天就可以閱讀完畢,若有朋友對 TOC、Kanban等理論有興趣,這本是一定要閱讀的經典。
Python的學習資源

Python的學習資源

線上

First Python Notebook

書籍

Think Python 2e

Think Python 2e 簡中版

Flask

The Flask Mega-Tutorial : 這是個作者的Flask教材是經典,想學Flask看這個一定不會錯!

Flask 入门教程:Pallets Team 成員李輝(Grey Li)所編的入門教學,他也是《Flask Web 开发实战》的作者。

Refactoring

PyCon.DE 2017 Yenny Cheung – Technical Lessons Learned from Pythonic Refactoring

Brett Slatkin – Refactoring Python: Why and how to restructure your code – PyCon 2016

Online Video Tutorial

The Ultimate List of Python YouTube Channels

MicroPython: how to upload program and run code

MicroPython: how to upload program and run code

之前的文章 (MicroPython Lab1: Blink LED) 介紹是使用互動模式在 serial REPL 鍵入在NodeMCU上執行的 python code。

這個方法很適合作即時的小實驗,但要開發比較複雜的程式時在IDE上是比較方便的。如果ESP8266開發板有1MB以上的Flash,MicroPython 啟動後會配置一個內部的 file system,可以將程式碼儲存在file system 中。

當ESP8266啟動時會自行載入特定名稱的程式執行 (就像是 Arduino 執行 Arduino sketch一樣),開機之後系統預設會先執行 boot.py 然後再執行 main.py 。

本文將介紹如何使用 Adafruit MicroPython tool (AMPY) upload 程式碼以及如何執行

第一步要安裝AMPY

可以用 pip 來安裝 Adafruit MicroPython tool (AMPY),需要 Python 2.7.x或3.x的版本。

 $ pip install adafruit-ampy

要確認是否安裝成功可以執行以下執令

$ ampy --help

執行MicroPython程式碼

我們可以使用 run 指令來將一份MicroPython程式上傳到NodeMCU去執行。例如以下的程式若儲存為 “blink10times.py

import machine
import time 
ledD2 = machine.Pin(4, machine.Pin.OUT)
for i in range(10):
    ledD2.high()
    time.sleep(0.5)
    ledD2.low()
    time.sleep(0.5)

那可以執行以下的 shell command

$ ampy --port COM15 run blink10times.py

這樣 ampy 會上傳 blink10times.py 到 NodeMCU 並且執行它,其中的COM port # 要看自己的usb-ttl是接到哪一個Port 而作調整。

Copy 程式到開發板

我們也可以直接將 blink10times.py copy 到 NodeMCU 的根目錄命名為 main.py

$ ampy --port COM15 put blink10times.py main.py

這樣 Reset NodeMCU之後,它就會自動執行 main.py

其它ampy 指令

ampy還有提供其他的指令, 詳情可以參考 https://github.com/adafruit/ampy

get: Retrieve a file from the board.
ls: List contents of a directory on the board.
mkdir: create a folder
rm: Remove a file from the board.

設計思考相關的影片

設計思考相關的影片

ABC: The Deep Dive, IDEO the shopping cart project (中文字幕)

 

IDEO the shopping cart project (21分鐘版)

 

IDEO TED talk, 改善醫療經驗的設計(中文)

 

讓人快樂的好設計Don Norman(中文)

MicroPython Lab1: Blink LED

MicroPython Lab1: Blink LED

燒錄 MicroPython firmware 之後的下一件事當然就是–來點亮LED.

當我們連上NodeMCU的 serial REPL 之後應該會出現 “>>>” 提示號
1. import “machine” module

import machine

2. NodeMCU內建的LED GPIO pin number 是2, 利用 machine.Pin 建立一個GPIO物件 led 並設定作為輸出.

led = machine.Pin(2, machine.Pin.OUT) 

3. NodeMCU 內建LED pin value=HIG 是閉, value=LOW 是亮.

led.high() #關閉LED
led.low()  #點亮LED

接著測試外接LED (LED 正極接在 pin D2), 底下的程式碼能讓LED閃爍十遍

import machine
import time 
ledD2 = machine.Pin(4, machine.Pin.OUT)
for i in range(10):
    ledD2.high()
    time.sleep(0.5)
    ledD2.low()
    time.sleep(0.5)

MicroPython Lab1-LED

在 NodeMCU 上執行 MicroPython

在 NodeMCU 上執行 MicroPython

本文記錄一下我燒錄 MicroPython 到 ESP8266 上的經驗.

市面有不同 8266 開發板, 我試了

  1. Arduino UNO R3 ESP8266 Web Sever串口WiFi擴展板shiled(ESP-13)
  2. NodeMcu Lua v2 (2版) WIFI 物聯網開發板

第二個開發板燒錄比較方便, 不需要另外按其它的 button 即可進行燒錄.

要使用 NodeMcu 必須安裝  CP210x USB to UART Bridge Virtual COM Port (VCP) drivers, 裝完 driver 將NodeMCU 插上USB, 應該可以在裝置管理員看到新增了一個COM port

cp210x-usb-2-uart-bridge

在 Python 的環境下要燒錄 MicroPython 的 firmware 需要使用到 epstool. 在安裝 esptool 之前要先將它使用到的程式環境安裝好. 有以下三項:

  • Python 2.7 – esptool 目前只能執行在 Python 2.7 的環境, 我是安裝 miniconda 的套件.
  • PySerial Library –  建議是在一個 virtual environment 下利用 pip install pyserial 來安裝.
  • Git – 利用 git 來下載最新版本的 esptool script.
git clone https://github.com/themadinventor/esptool.git
cd esptool

然後下載 MicroPython 的 firmware http://micropython.org/download/#esp8266

可以使用以下命令來上傳 firmware

esptool.py --port <serial-port-of-ESP8266> --baud 115200 write_flash --flash_size=<size> 0x00000 <firmware>.bin

我的環境為:

  • COM port : 15
  • flash size: 32m bit (4M byte)
  • firmware: esp8266-20160909-v1.8.4.bin

執行結果如下

$ python esptool.py --port COM15 --baud 115200 write_flash --flash_size=32m 0 esp8266-20160909-v1.8.4.bin
esptool.py v1.2-dev
Connecting...
Running Cesanta flasher stub...
Flash params set to 0x0040
Writing 565248 @ 0x0... 565248 (100 %)
Wrote 565248 bytes at 0x0 in 49.0 seconds (92.3 kbit/s)...
Leaving...

接下來可以用 putty 來連結 MicroPython REPL (read-evaluate-print loop), putty 的設定如下:

putty-to-serial-repl

然後就可以就可使用python語法來在 ESP8266 開發板開發程式了.

 

參考資料

  1. 燒錄firmware, https://learn.adafruit.com/building-and-running-micropython-on-the-esp8266/flash-firmware
  2. 連接 REPL, https://learn.adafruit.com/micropython-basics-how-to-load-micropython-on-a-board/serial-terminal
  3. NodeMcu 開發板各版本說明, http://frightanic.com/iot/comparison-of-esp8266-nodemcu-development-boards/