2022年12月17日 星期六

活動:Tainan.py 2022 12 月聚會

 


PAIA 贊助的場地超棒啊!

上一次舉辦 Tainan.py 已經是 2020 年了,此次的聚會與以往不同的地方在於:「活動主辦人已經交接給 Jesse 了!」,所以這次我算是帶著半旅遊半期待的心情來參加活動。


活動前先吃一鍋牛肉湯應該不為過:

趣事:我太白目讓小鈞心碎惹 XDDD


在這次活動的一開始,我先簡單講了一下當年成立 Tainan.py 的故事,以及對未來活動的展望(咦?):



接著就是 Mosky 的 Get Power From Command Line 了:


覺得有趣的是,同事 Boen 幾個月前也在公司內部分享 Command Line 的許多 Tips,看到 Mosky pipe 了許多 commands 快速完成任務很有既視感,不過 Boen 分享的完整度遠不及 Mosky 版本全面。


--
這幾個月我跟 Jesse 討論了許多籌辦這次活動的事情,最終看到的這場活動,讓我覺得相當驚艷。除了 PAIA 提供的場地寬敞、舒適、有音樂以外,現場的工作人員(PAIA 員工 + 青年就業領航計畫的現役及畢業生)皆很熱心協助,加上中場休息竟然還發放仙草芋圓點心。(讚讚!台南傳統啊 XDDD)

再考慮到說話流暢的主持人、完善的雙投影幕 + 麥克風,以及演講後的小型座談規劃,我都覺得這場活動的品質都高過大部分我自己過往舉辦過的活動!

如果之後分享能夠活絡起來,有更多的大小講題可以聽,那就更讚了!

--
活動結束後與講者及工作人員吃了一頓神奇而溫馨的晚餐(素食鹽酥雞 + 白飯),也很久違的跟許多特別的(對我來講)小朋友們聊聊天,受益頗多。

希望下次的 Tainan.py 可以早點到來!哈哈


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年11月2日 星期三

閒聊:使用 Vim 編輯器的第五年


哼哼,都用 Vim 那麼久惹
寫個 Plugin 來說嘴也只是剛好而已 XDDD




記得前陣子才寫了一篇「心得:使用 Vim 編輯器的第一年
結果一覺醒來又過了四年 Orz

仔細想想,這幾年我其實沒什麼長進 ...
到了最近半年,我才覺得自己對 Vim 的掌握真的有變多一點
也難怪會想提筆碎碎念一下

#本文純粹就是閒聊 #沒什麼組織 #想到什麼寫什麼 


前情提要

對,我仍然還是一個用 ijkl 做移動的 Vimer ,而且活得好好的

我仍然用 ;; 離開 insert mode
我仍然還是裝一大堆 plugins
我仍然還是以 Vim 作為主要的程式碼編輯器
我仍然還是同事裡的少數派

我仍然每隔一陣子就覺得自己已經覺會了 Vim 大部分的指令 😏
然後下一秒會在 Vim Tips Wiki 查到整頁都沒看過的指令來解決我日常生活會遇到的問題
是的,我已經習以為常了



說到使用 Plugin 這件事情

儘管 Vundle 沒什麼不好,我還是衝著能平行化安裝 or 更新套件這點,跳槽到 Plug
Plug 支援使用一些 lazy loading 的寫法,可以減緩一下安裝太多套件的 overhead

但是事實上,主要會拖累速度的 plugin 就那幾隻
一般的套件幾乎不會佔用多少載入時間
而套件本身如果架構上有採用 lazy loading 的設計,更加不需要用 Plug 的 hook 再加一層

近期改變我使用習慣最大的套件,大概就是渾身充滿暗黑力量的 Shougo 所寫的 Unite
讓我戒掉了 minibufexplorer ,改用搜尋的方式在數十個 buffers 中切換
同時,我透過各種 unite source 來解決找檔案、剪貼簿管理、Mark 之間跳耀 ... 等等問題

好吧,我承認我其實沒有完全戒掉 minibufexplorer 帶來的體驗
我使用 vim-airline 並且開啟下列參數

let g:airline#extensions#tabline#enabled=1
let g:airline#extensions#tabline#buffer_idx_mode=1

nmap <space>1 <plug>AirlineSelectTab1
" ...
nmap <space>9 <plug>AirlineSelectTab9
nmap <space>j <plug>AirlineSelectPrevTab
nmap <space>l <plug>AirlineSelectNextTab

對,我是個拿空白鍵來當作第二 leader key 的魯蛇

值得一提的是, Unite 近期已經停止功能的開發
等作者用 Python3 寫的 Denite 功能更佳完善後,我應該會遷移過去

如果只能再提幾個套件(因為懶),那我會提這三個:

  • YouCompleteMe 
    • 很好很強大,不提到這個彷彿沒用過程式碼補齊一般 ...
    • 啟動時會吃個 0.x 人類可感的秒數,之後不知道會不會好一點
    • :YcmCompleter GoTo 是一個很容易被忽略的好用指令!
  • EasyMotion
    • 移動神器,就算你已經安裝了,還是值得再看一下他最新的文件
    • 目前主要負責開發的作者 haya14busa 大約三年前才摸 Vim,而且最近還手滑送了四個 patches 給 Vim 不小心也成為 Vim 的 Contributor,堪稱 Vim 生勝利組(咦?)
    • 目前我已經把 w 改成直接呼叫  nmap w <Plug>(easymotion-bd-w)
  • Tagbar
    • 看扣都會用到,雖然有點拖累畫面速度,希望之後改版速度會變好
    • 會特別提到是因為他的使用率實在太高,以及跟我手邊自己寫的另一個還沒釋出的套件在 updatetime 上有點相衝 Orz
      • 希望大家多貢獻開源專案,把 Tagbar 改好啊 XD

最後,對於使用套件這件事情,我想說的是

顯然地,目前我還是沒有成為那一個傳說中 ...
       使用 Vim 滿 N 年就返璞歸真把套件砍光的神人 ... 囧rz

將來可能也不會成為(吧?)



有空可以學個 VimScript 看看

如果你下一個十年還打算用 Vim 改點程式
那麼我認為花一個月的閒暇時間,有空就看一點笨方法學 VimScript
來學一下可愛又惱人的 VimScript 是很划算的
這麼做的好處有:

  • 邊學可以邊整理一下自己的 .vimrc 
  • 可以比較看懂自己的 .vimrc 
    • 我相信大多數的人的 .vimrc 多少都會有一些自己也看不懂的咒語
  • 累積足夠的 Vim 知識去解決打開 Vim 時出現的惱人錯誤之類的 ...
  • 可以順便達成你總是沒達成的年度計畫「一年學一個語言」

VimScript 有許多 function 都很有 Python 的味道
儘管如此,但還是不得不說,這個語言的行為非常的神妙啊(笑)

除了增加自動化一些事情的能力以外
其實,學 VimScript 的最大收穫是了解編輯器如何運作的概念模型
這使得在使用 Vim 及套件上,會有更加清楚的認識
也同時能帶來一些有趣的想像



寫一個 Plugin 玩玩

前陣子我看完笨方法學 VimScript 以後
我就帶著我的想像來寫了我自己的第一個套件:vim-codequery

簡單版 的故事我已經在 Taipei.py 分享過
完整版 的故事我也在 Tainan.py 分享過

要問我寫這個有什麼收穫
除了做出自己想要的東西的成就感以外,大概就是「了解更多」這四個字

要寫自己的套件前總是得看看範例,所以就跑去看看其他套件是怎麼實作的
當更認真的看其他人的套件時,才會真的了解他們在幹嘛
並領略他人程式碼的美妙(與不美妙)之處

同時,在認真向外看的時候,才會知道一些一般 User 不知道但是對套件開發者很重要的消息
例如,前陣子我才知道 Vim8 有哪些厲害的 features ,以及與 NeoVim 的 Async 愛恨情仇

自己進行比較大量的實作時,我才從學語言的狀態,前進為應用語言的狀態
雷還是要踩一踩,程式碼還是要打個上百上千行才會逐漸深刻 Orz



轉換觀點

幾年前我開始讀諾曼先生的設計心理學相關書籍,近期則花了不少時間研究跟寫套件
開始對於 Vim 有跟自己初學的時候比較不一樣的觀點
我現在的看法如下:


  • 套件不是裝越多越好
    • 被遺忘的套件就等於沒有用
    • 但我也沒有嚴格到沒用到的就全刪,建議不妨設一個「觀察區」來管理新加入的套件吧!
  • 快捷鍵要小心且用心設定
    • 同上,忘記用的就等於沒有用
    • 更糟糕的是,既有的設定會排擠未來能使用的快捷鍵組合,所以真的要小心設定
    • 設定的要點在於:「增加容易記憶的程度」與「提高敲擊上的便利性」。舉例來講,我一律使用相當好敲到的 <space> 加上其他鍵來進行頁面相關的移動,這使得大腦以及肌肉記憶的負擔降到最低。
  • 用滑鼠不會死
    • 打開讓滑鼠捲動生效的選項其實也沒什麼不好,有時候進入輕鬆瀏覽模式時,看扣的心智負擔反而比較小
    • 跟同事 Code Review 或是一起看 Code 的時候,至少對方還可以用滑鼠移動 XD
  • 用上上上上上下下下下移動也不會死
    • 認真!非反串 👻
    • 重點是其實是當一個人在做這件事情的「心智狀態」,當你在做這件事情的時候,目的是要進行移動呢?還是只是一邊看 Code 一邊移動,而把游標當做一個「視覺提示」來使用呢?還是其實你只是想要移動到螢幕兩端進行進行捲動?
      • 合理而有效率地達成你真正的目的,才是重點!
      • 不用因為按了上上上上下下下下而感到羞恥,重點是認清你自己在幹嘛!
    • 千萬記得要把鍵盤的連續輸入速度調高,不然我會為被你浪費掉的時間感到羞恥 Orz
    • 我自己的做法是把上下改為維持游標位置但是上下捲動一格,所以要看上面或下面一點的程式碼都很方便。有 Code 有真相:(以下程式碼不負任何維護責任)
      " 用 i,k,j,l 進行上下左右移動
      nnoremap k gj
      nnoremap i gk
      nnoremap j h
      function! s:move_up_and_down()
          if line("$") > winheight('%')
              nnoremap <buffer> k gj<C-E>
              nnoremap <buffer> i gk<C-Y>
          endif
      endfunction
      augroup MoveGroup
          autocmd!
          autocmd BufEnter * :call s:move_up_and_down()
      augroup END
      
      
  • 背景主題也有重要性
    • 對!這關係到可讀性與情感上用得爽不爽,所以調整好用色、字體、間距及版面是有必要的
    • 我會喜歡開 Tagbar 有一個原因就是可以把程式碼區塊往右靠一些,眼睛的重心可移到比較接近螢幕中間的部分
    • 有時候我甚至會用 :Goyo (或 vimroom)之類的套件來讓畫面只顯示必要的程式碼
  • 回饋很重要
    • 為什麼很多人覺得手邊的編輯器用起來很爽快?因為強者我朋友就是你只要快速甩幾個按鈕,Vim 就會串起一堆指令,然後把事情做好。達成你的目的這一件事情,就是編輯器給你的一個回饋
    • 然而,「如何達成的」這一件事情也頗重要,這往往是一個會讓人覺得這個東西好不好用的原因。例如,許多人會用 Ack.vim 之類的套件來取代 vimgrep,而當搜索時,畫面會一閃,block 住並且進入搜尋畫面,一個一個印出找到的資料,結束後畫面又會重新 render 出來並且將結果顯示在 quickfix 內。在剛剛的例子裡,假設總共花了 0.8 秒,那麼時間的回饋就是 0.8 秒,而「一閃」、「block」、「重新 render」、「顯示結果在 quickfix」也都是各種視覺或操作回饋,都會對使用者造成一些影響
      • 因此,在製作套件時並不一定只是採用最新的技術就可以達到最好的效果。例如,剛剛的 Ack.vim 假設直接套用了 Vim8 最新的 Async 功能而不做回饋的調整,那麼就可能會變成這樣:發出搜尋的指令,什麼事情都沒有發生,0.8 秒後突然跳出了一個 quickfix 出現了搜尋結果。這是一個由於回饋不足,使得行為有點出乎使用者意料的情況,而使用者就可能會覺得這個套件怪怪的
    • 在對回饋機制有更多了解以後,就更加能夠「了解」一個編輯器/套件的優劣與否,甚至有比較高的機會做出好用的東西
  • 讓 Vim 擁有 IDE 般的功能也沒什麼不好
    • 別緊張,我並不是贊成要把 Vim 變成 Visual Studio,然而,如果 VS 有好用的功能能夠有效增加生產力,那麼為什麼不用某種形式讓他能夠在 Vim 上面實現呢?
    • 當有人在說「Vim 並不是 IDE 時」,其實往往是在指「用了不那麼 Vim 的方法做事情」或是「這不是 Vim 原生該支援的功能」(沒說出來的是:「但是套件可以支援」)
    • 從我的角度來看,Vim 是一個 UI 受限,但是彈性無窮的編輯器。要讓他變得如同受歡迎的 IDE 一樣強大(或更強大),我是雙手贊成的。然而,根據 The Law of Leaky Abstraction,顯而易見的是,我們得懂更多。



然後咧

其實也沒有然後了,就只是一篇五年的心得文 XD

要我再說幾句話廢話的話,大概就是:

  • 請愛用 :help ooxx 閱讀 Vim 的文件,我超後悔到了今年才比較有用讀文件的習慣
  • Vim8 Async 功能對於整個套件系統的影響,可能要半年一年後才會發酵,敬請期待
    • 話說這個年代 VimScript 都開始有 Lambda 支援 Closure 是哪招 XDDD 
  • 如果想要看看大神是怎麼用 Vim 的,除了到 Github 看 dot files 以外,我強烈推薦 howivim 這個網站,裡面有許多很有意思的訪談,能夠聽到一些知名的作者的看法,對於開拓自己的想法非常有幫助
  • 最後 Vim8 與 NeoVim 該怎麼辦?我也不知道 T_T


以上,歡迎試用 vim-codequery 或向我報名 Tainan.py 演講(咦)
下一篇心得文十年後見!😉



2016年9月10日 星期六

Re: 從零開始的魯蛇部落格再度開張!


Hello World !



打開這個部落格,看到自己當時學 Haskell 的心得文,才赫然發現竟然已經快過兩年了!

對啊,這段時間還真的發生許多事情,生命中最喜悅的、最悲傷的 ...



偶爾還是會因為聽到有朋友有看過我之前寫的文章(雖然大多數只是流水帳)而覺得開心,而身為一個魯蛇所寫且沒再更新的部落格,其瀏覽次數竟然也能超過十萬 ... Orz  應該都是網路爬蟲貢獻的吧


無論如何,打聲招呼後,就得繼續前進了!



#呃,我是不是得先還一下這兩年以來有關台南拍聚會 + PyCon + 其他活動的記錄債 Orz

#2016/09/16 補充:花了一天補了 13 場活動紀錄 ... 😑


2016年8月27日 星期六

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


許多好久不見的朋友們!



「能寫智能契約的區塊鏈Ethereum 的介紹」by 梁智程

投影片


除了感謝講者專業的介紹以外,更感謝在場的許多黑黑的人的提問,使得內容變得更加精彩而發人省思 ... 話說 ETC 與 ETH 實在有點恐怖 ... Orz





「哎哎呀呀 Vim Plugin 慢速上手心得」by 魯蛇喬



附上在台北拍講的 Story 版本的 投影片





晚餐喝府城牛肉湯後,續攤的若渴計畫則有果凍、彥文、Miaoski、牆壁的分享,一如往常的專業、充實、黑黑 der ...

對我這種資安外行來講,參加一晚若渴資訊量大概等於 2/3 天的 HitCon

最後,有關寫 Vim 的使用心得,擇日再補一篇專文來講吧! ㄎㄎ





2016年6月3日 星期五

演講:Essential TDD for Pythoners @ PyConTW2016



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

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



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