顯示具有 python 標籤的文章。 顯示所有文章
顯示具有 python 標籤的文章。 顯示所有文章

2021年12月25日 星期六

考古:再訪物件導向


Simula 的兩位創造者 (source)



呃,這份投影片已經是七年前做的了 ... 真是充滿著資訊量與中二

近幾個月同事們進行著一個名為「再想一下」,每週半小時的公司內部技術分享會,討論的講題從 CSS Tricks、React 18、H264 ... 到這兩週都在討論 Monad 跟 Y Combinator(我到底聽了什麼 😨),其中有前端同事寫了幾篇初探 Python OOP 的文章,引起了許多討論,也勾起了我當年考古 OO 的回憶,於是便翻出了這份投影片,並且再稍微考古一下。

依稀記得最初的物件導向,其實是希望每個物件就像 micro computer 般能夠自動運作,然後透過建立成千上萬的物件,讓他們自動進行互動,就能夠(爽快地)完成任務。在這次的考古過程中,很幸運地發現了這篇寫於 2019 的優質考古文:OOP Before OOP with Simula。(點了連結以後,不回來繼續看本文也無所謂了)

當年的考古,我著重在「原來五六十年前就已經有物件導向的概念」、「看看這些語法跟現在根本沒差多少」、「噢噢,古早的人在寫程式解這些問題(核子反應爐模擬)」,雖然想要快速掌握 OO 發展的脈絡,在有限的時間與經驗之下,也只能看一些簡略的介紹,或是去設法咀嚼一些指標人物說過的話,當下並不真的全然理解。

再次的考古,由於已經有了以前(殘缺)的大局觀,所以已經不再需要迫切地看很多東西,可以細看自己覺得有興趣的一小部分就好。對於 Simula 來講,我覺得有體悟的是「simulation」這一個 context,在需要做 simulation 的情況下,你會怎麼去設計一個程式語言或者說是框架,來協助你執行任務?根據 Simula 的創造者 Ole-Johan Dahl (OJD) 的 The Birth of Object Orientation: the Simula Languages 一文,有提到許多有趣的事情:
  • 其實 Simula 的另一位創造者  Kristen Nygaard (KN) 當年在 Simula Project 時負責的事情比較偏向 operation research,且他也是蒙地卡羅演算法的發明人,這很有「simulation」的味道對吧!這也是他創造新語言的動機
  • 語言的設計跟實作主要是 OJD 負責的
  • 他們發表了兩版 Simula:Simula I 與 Simula 67。前者為 simulation 與教學用途,後者其實已經希望是 general purpose 的 language
  • Simula I 就已經有類似 co-routine 的概念以協助做模擬

從現在的角度來看,SImula 67 已經非常的物件導向了。它具有的特性我也無須贅述,我比較在意的是 Simula I 作為一個模擬器語言的完成度,以及他能夠如何優雅地完成任務。我認為 OOP Before OOP with Simula 這篇文章作者給的 例子 很好,就簡單定義了這些物件,然後建立後就讓他們自己去跑。這似乎解釋了為什麼我會對 OO 有印象是「一個一個的 micro computers」😼

近年工作下來,我發現我對 OO 設計的關注度下降非常多,因為怎麼弄好 dependency、怎麼分離關注點、怎麼測試、怎麼封裝抽象概念、如何設計演算法、如何決定服務架構、如何維運系統 ...,依據外部商業需求及內部產品技術發展需求,把一些基本 concerns 處理好並且配合願意改進的心態,其實程式寫起來就往往夠好了。

就這樣,如果近年有 OO 方面必讀的好書,或是值得 follow 的觀念,也歡迎大家推薦給我 ✋

難道下一篇是再訪 Haskell 嗎 XDDDD



2016年6月3日 星期五

演講:Essential TDD for Pythoners @ PyConTW2016



此演講於 PyConTW2016 官方的 介紹網頁
本場演講的 錄影 (高清無碼,推薦一看!)

補充:
去年的測試入門演講
TDD is Dead 戰文總整理



這次的分享是給自己的一個挑戰,要在極短的時間內闡述一些稍微進階的概念給中階的聽眾,整體來講還算滿意自己的的表現。由於此主題也講完,加上之前講過的測試框架與測試基本概念,這樣 ... 以後演講就可以爽爽講自己覺得有趣味的內容了(吧?)














2016年1月9日 星期六

演講:Half Hour of Code 從蟒蛇到神龍 - 從 1 接關繼續打造爬蟲程式 @ Taichung.py







範例程式碼:Gist
台中拍的 meetup 頁面



這個分享算是 PyCon 的 Hour of Code 活動「從魯蛇到蟒蛇」的進階版後續。
講起來,我跟 Crawler 還蠻有緣分的,好像沒隔幾年都會認真研究一陣子 =皿=

(有文有真相: 2009 年還是小屁孩的時候寫的文章、2014 年的整理、2015 年在均一內部的不公開分享 ... )


話說 ... 台中拍的氛圍挺好的、微程式贊助的聚會場地不錯,與會眾(好多前輩)的問答也蠻熱絡的。果然還是台北拍的氣氛太冷靜了嗎 XD
















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年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 trace, debug, info, warn, error, 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: cumulative, calls, callers. 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 false, unexpected, 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 <- 三月份若渴:來分享的外國朋友創辦的服務)