顯示具有 程式 標籤的文章。 顯示所有文章
顯示具有 程式 標籤的文章。 顯示所有文章

用 RxPermissions 處理 Android 6.0 Permission

Android 6(API level 23) 之後,開發者會被要求者處理 APP 權限問題(針對 Run),程式碼要撰寫相關邏輯:檢查有沒有權限、處理取得權限後的行為...等。官方範例碼大概就是畫面跳轉類似用 Listener Pattern 的方式來處理,另外還要處理當使用者選取"不要再跳出權限對話框"的特殊狀況。總覺得應該就是一個 yes 或 no 就該解決的事情,但每次寫出來都不一樣,各別提不同人寫出來的流程都是天差地遠了。
這次改用 RxPermissions 來重寫,RxPermissions 封裝邏輯後寫出來的程式碼順序很直覺:

  • 路徑1:要求權限 > 都有權限 > 執行需要權限的程式碼。
  • 路徑2:要求權限 > 有權限被拒絕會自動跳出對話框 > 還是有權限被拒絕(對話框沒勾選不再詢問) > 再重新要求權限 或 執行當沒有權限還是可以執行的程式碼。
  • 路徑3:要求權限 > 有權限被拒絕而且曾在對話框勾選不再訊問 > 提示有用訊息並引導使用者到設定頁面打開權限 > onActivityResult 處理設定頁面跳轉回來的事件再重新要求權限。
廢話不多說,上扣!

JBoss 的推播方案 - Unified Push Server(現在叫 AeroGearPush)

前言

2016年獨立開發者最慘痛的第一個消息,大概就是臉書併購的 Parse 要收起來不玩了,我手上的專案用到 Parse 的推播功能也中鏢了,想到要自己把 GCM 接起來真的是一個頭兩個大。

簡單說明一下 Parse 是一個 BaaS(Back end as Service) 服務,可以想成臉書幫你養了一台提供資料庫/會員註冊/排程工作/推播的雲端主機,對開發者來說省去了架設/部署的工作,能夠專注於開發。

Parse 預計明年一月要收掉,整個 Parse 也已經開源出來,如果你本身也熟悉 Node.js 的開發生態,基本上可以整包拿下來架站。我最終選擇是改用 JBoss 提供的推播方案,下文大概介紹一下架構、功能,詳細實作的程式碼因為會隨著改版而失效,這邊就不會寫上程式碼。

JBoss Unified Push 架構

JBoss 的推播方案一開始叫做 Unified Push,現在就整進 AeroGearPush 裡頭(算是其中一個子專案),整個程式碼也有開源出來,其實是一個跑在 JAVA EE Server 上的 war 檔。

因為我只有實作 Android Push 這一塊,以下就用 GCM 為例說明。Push Server 封裝了 GCM,如果沒有 Push Server,我們就必須自己去管理手機從 GCM 取得的註冊資訊。當有跨手機平台的推播需求的話,我們也只需與 Push Server 介接,Push Server 負責實作推播至不同手機平台的功能。

以下說明上圖每個元件的作用:

  • Push Server:收集所有手機傳回的註冊資訊。發送訊息給各平台的推播系統,再推播至手機上。
  • Application Backend Server:實作 APP 的後台邏輯,當有推播需求(ex:商品上架、有新事件)時透過 SDK 將訊息傳給 Push Server。
  • Push Networks:就是指 Android / iOS 原生的推播系統。
  • 手機:除了接收訊息外,最重要的將從原生推播系統取得註冊資訊傳給 Push Server。以 Android 來說,透過 SDK 將從 GCM 取得的 token 傳給 Push Server。


環境架設

除了把 Push Server 架起來外,上面可以看到手機 APP 和後台 Server 還會需要用到以下 SDK:
  • aerogear-android-push (用來跟 PushServer 註冊裝置)
  • unifiedpush-java-client (包裹 Web API 用來將要傳送的訊息交給 PushServer 推播)。
很多程式碼,名字變來變去,版號很多,這就代表有很多雷可以踩,建議先裝好 Push Server,裝好以後在 Web GUI 把推播相關的參數設定好,在 Web GUI 上有自動產生樣本程式碼的功能,這時候再來去抓最新 SDK,如果找不到類別或錯誤就降一版 SDK 試看看。我也是花了一點時間才找出來可以動的組合。

建議的步驟如下:

  1. 安裝 Push Server。
  2. 在 Push Server 上建立 Application。
  3. Application 下設定 variant,variant 主要用來介接 iOS/Android 推播系統,介接的資料欄位需要從 iOS/Android 推播系統後台得到。
  4. 此時,你 Push Server 上應該有一個 Application,一個以上的 variant。
  5. 利用 Push Server > Application > variant 產生回傳註冊資訊至 Push Server 的範例程式碼,整合至手機 APP 程式碼,看看與下載的 aerogear-android-push 相不相容,不相容就找別的版本。
    1. 開啟手機 APP,利用 Push Server 的 WEB GUI 觀察手機有無註冊成功。
    2. 利用 Push Server 的 WEB GUI 發送訊息,驗證 Push Server 可以將訊息推到手機上。
  6. 利用 Push Server > Application 產生推播訊息至 Push Server 的範例程式碼,整合 APP 後台程式碼,看看與下載的 unifiedpush-java-client 相不相容,不相容就找別的版本。
    1. APP 後台發訊息給 Push Server,驗證可以透過 Push Server 將訊息推到手機上。


其他

關於 Push Server 的註冊部分,看到的寫法是每次打開 APP 或是某個頁面就重新註冊,這部分觀察資料庫,除非重新安裝 APP 否則上傳的註冊資料(GCM token)都是一樣的。解除註冊部分,看到的寫法可能寫在使用者勾選的開關上(讓使用者決定要不要收到推播),或是離開某個頁面就解除註冊。以 GCM 來說,唯一知道這裝置已經解除 GCM 註冊的時機點是在推播的時候,然後如果是自己寫的 Push Server 就可以將這些裝置清掉,但 JBoss (我用的版本是1.0.0 beta 2)的做法是沒寫這塊邏輯,所以必須自己處理,我自己的做法是定時下 SQL 去清除一個月以上沒有向 Push Server 回傳註冊資訊的裝置。

最後還是想唸一下,紅帽的文件不是寫不好寫不夠多,是整理的很沒系統,這次找文件找 SDK 的時間大概比寫扣的時間還要多,只能說免費的最貴。

Spark - Java 輕量級的 Web 框架

這跟處理巨量資料的 apache spark 無關!

如果有時候只是要寫個沒幾個人用的 Restful API,或只是想要有個 HTTP 接口(透過 get/post)來呼叫我們寫好的 Java SE 程式,如果對架設 tomcat / Java EE Server 又不熟悉,那可以考慮用 Spark!

Hello World

Spark 2 以後需要用到 lambda 語法,需要安裝 Java 8。如果只有 Java 7,請找 Spark 1 或是去玩 play

以 Eclipse 為例,安裝 Spark 方法有兩種:

第一種比較簡單,直接建立 Maven 專案,在 pom.xml 加入對 spark 的 dependency 就好了。

第二種就到 github clone 下來,不過實際建立時,我還是得把這專案轉成 maven 專案,才能利用 pom.xml 把其他要用的 jar 檔抓回來...也可能我太笨沒抓到官方給的提示...

寫一個 HelloWorld.java 包含一個 main 如下:

import static spark.Spark.*;

public class HelloWorld {
    public static void main(String[] args) {
        get("/hello", (req, res) -> "Hello World");
    }
}

直接執行 HelloWorld.java,無需安裝另外的 Web Container,無需任何設定,在瀏覽器打開 http://localhost:4567/hello 就可以看到結果。

螢幕快照 2015-03-26 下午1.49.01

Spark 提供的功能

大部份 Restful API 需要的功能都有:
  • 指定 URL 路徑。
  • 存取 request 標頭/參數/...。
  • 回寫 response。
  • 處理 session。
  • 處理每個 request 前後插入 filter 做前置/後置處理。
除了單純回傳資料,也可以介接 Freemarker 這類的 HTML Template Engine,將要顯示的值以類似 JSP EL 的方式,填到預先寫好的 HTML Template 上。

也可以介接 AngularJS 做出類似 Gmail 這種只有一頁的 Web 網站。

部署

官網上沒有特別寫部屬的方式,試了一下。就直接在 Eclipse 上匯出一個可執行的 jar,執行的目標就指向有 main 的那支 java。

執行匯出的 jar 就會在本機上開啟 Web Server 了(參考下圖)!開發到使用完全就像執行一般 jar 一樣!

螢幕快照 2015-03-26 下午1.51.17

參考

Jenkins 兩個月心得

寫一下這一兩個月使用 Jenkins Server 的心得,我目前使用的狀況如下:

  • Android APP 專案 * 1
    • 自動定期查詢 SVN Server,若有更新就開始建構流程。
    • 在 Jenkins Server 上安裝 Android SDK,搭配 Android 產生出來的 build.xml 建構 APK。
    • 搭配 ANTS 用廠商提供的 jar 簽署 APK。
    • 封存最終的 APK(只保留最新10筆),可直接從 Jenkins Server 上下載。
  • ASP.Net 專案 * 1
    • 手動去 SVN Server 抓 Code,開始建構流程。
    • 搭配 Linux Script 針對測試環境 / 正式環境去改關鍵設定檔內容。
    • 將 Project 排除掉不需要的資料夾(.git, .svn ...etc)打包成 zip 檔。
    • 將 Project / zip 檔上傳至測試環境 / 正式環境。
  • Java SE 專案 * 1
    • 自動定期查詢 git Server,若有更新就開始建構流程。
    • 在 Jenkins Server 上專裝 Java SDK,搭配 ANTS 產生 jar 檔。
    • 封存最終的 jar 檔(只保留最新10筆),可直接從 Jenkins Server 上下載。
螢幕快照 2015-01-27 下午12.25.21

流水線的建置

基本上所有行為都還是要 Jenkins Server 要先安裝好工具,再找 Jenkins 上有無別人開發好的 Plug-in 去介接這些工具,簡化設定流程。真的都沒有才會考慮用 linux / windows command 的方式去接。

比如要導入 Selenium 進行瀏覽器做自動化測試,那 CI Server 就要先安裝 Selenium 和 Firefox 等,像我目前的 CI Server 只是一台沒有 GUI Shell 的 Linux ,想要用 Selenium 就 GG 了!

方便

一鍵產出檔案,然後網頁上就可以直接下載。我就不用自己包好然後才 mail 寄給大家,之後還要考慮到其他人到底是用哪個版本的問題,直接就丟 URL 請對方下載就好!

一鍵就發佈網站。明明只是改幾行,但部署到主機上有很多眉眉角角(主機位址帳號密碼,哪些檔案不能覆蓋...etc),一定要翻文件才能一步步做,現在一鍵就完成了,若發佈有問題,馬上拉上一版的 Code 一鍵 rollback。

目前這台 Jenkins Server 也只是台 VM,VM 備份出來在其他實體機器上還原就又可以 build code 了,接手的人只要會改 Code 會上版本控管就夠了,這可比寫文件來得實用多了。

陣痛期

痛的點大概就是:

先搞懂什麼是 CI > 搞懂 Jenkins 怎麼使用 > 搞懂 Jenkins 可以做哪些事情 > 搞懂各種專案怎麼建置

考量到現在 IDE 太強大了,很多人(包括我)都只會利用 IDE 產出檔案。但導 Jenkins 就必須要自己跳下來弄懂 Build Code Command,流程和背後的原理,這的確是有心要精進自己軟體開發能力的人不得不去碰的,要不然就會被 IDE 綁定,明明都是 Java Web 專案卻只能用 NetBean 某一版開發?

此外,你做出來的成果是可以被重用的,因為 Jenkins 也不過就是台會做事的主機,而且提供 Web 介面,其他人只要上去按的鈕就開始跑了。這樣的改變,比你拿一個 build.xml 讓其他人去用來的讓人接受...

目前結論

如果你已經有了自己的建構流程(ANTS,Grandle,Script...etc),可以重新把這些東西整合進 Jenkins,其他人也就在不知不覺中用到這些成果。如果你連自動化建構還不了解,那還是先從寫寫 ANTS 開始。

以 Java 來說,寫桌面程式就包一個 jar,寫網頁程式不就包一個 war 然後 FTP 上傳,寫 Android APP 就包一個 apk,初期沒有要導 unit test,code style 檢查這些東西,其實要弄懂的東西也就是如何擺脫 IDE 自己包檔案出來罷了,對很多以前 筆記本 + 命令列 的前輩應該都是一片蛋糕。

對於團隊來說,至少我覺得導入 CI Tool 會減少人員請假或是離職交接所帶來的衝擊。再來考慮到補上單元測試,整合測試,程式碼風格檢查這些東西,能夠大大增加專案發佈的信心和品質。


參考:CI Server 30 - Jenkins總回顧

Jenkins 初用心得

這本來算是我在前公司要弄的項目,種種原因下搞到最近我才敢講我有玩過一輪。實務部分,大概從 jenkins 建立到整合 git / svn ,成功 build 完一個 jar / android apk。理論的部分則是翻完了下面這本名字落落長的書(有機會在寫心得)。

本文記錄一下,我在 jenkins 建構完這兩個專案的想法。


Continuous Delivery中文版:利用自動化的建置、測試與部署完美創造出可信賴的軟體發佈

如果你是主管,我建議要強迫導入。

原因很簡單,下面人放假了或是人跑了,只要其他人有能力拉 code 下來修改重新 commit 回 Version Control Server,jenkins 就能直接從 Version Control Server 拉下來建立要部署的檔案。

寫的很夢幻,前面該做的苦工還是要做,比如怎麼在 linux 上包出 apk(所有 IDE 幫你做的事情你都要自己搞一次)...

如果你已經懂 ant / maven / gradle,可以看情況。

會這樣說是因為,如果專案只有你在寫,也沒 Q 要測你的東西,那我覺得只要 unit test / 整合測試在開發環境做好一套即可,多在 jenkins 搞一套,除非你時間多想多學習,要不之後對專案幫助不大。

如果別人有要測你的東西,導入 jenkins 讓大家都是在同一個地方抓檔案,不會有搞不清楚再測哪一版的狀況(我是測你昨天下午五點半給我的那一版 --> 有沒有很熟悉的感覺)。
如果有人跟你一起開發,加上單元測試,每次整合完就能知道初步結果,你的主管也能在 jenkins 上看到專案最近幾次的整合結果,大家對於整合完的結果也會有更多信心,而不是憑感覺發佈。

接下來的工作

目前已經是來當作發佈檔案(war / jar / apk)的網站使用,接下來會加入單元測試來加強整合後的驗證工作,後續會試看看整合 asp.net 和自動發佈的功能,有機會的話會寫第二篇。

[讀書心得] 例外處理設計的逆襲



書中幾乎所有的程式碼都是以 Java 作為例子,所以寫 Java,C# 的人看起來會比較輕鬆。太深入的內容就不寫了,簡單寫幾句看完自己覺得的有印象的(寫程式可以先當作身體反應的準則),有興趣的還是買書去支持一下 Teddy 大大

  • HTC One X 被婊很大。 XD
  • 接到 Exception 的程式碼,若沒有能力去處理,就先往上丟,最後讓 main 發生例外,或是 GUI 顯示比較白話的訊息。
  • Java 7 後新增的功能
    • Multi-catch exceptions:若收到不同的例外都是做同樣的處理(ex:印 log),就可以合併成一個 catch,減少重複的程式碼。
    • try-with-resource:從 C# 的 using 借過來的概念(最近剛好也碰到),直接把產生的資源寫在 try(...這裡頭...){},執行完就會自動釋放資源,可以少寫 finally,也不會忘記釋放資源。
  • Checked Exception v.s. Unchecked Exception
    • Checked Exception:Java 設計概念認為 Checked Exception 代表可以回復的錯誤,Compiler 會強迫開發者去處理 Checked Exception(catch 或是再丟出去)。不過我好像都沒有回復過 Checked Exception,要碼不是印 log,再往上丟,了不起就寫個 re-try 機制來想辦法衝過去。
    • Unchecked Exception:程式碼內不應該出現的錯誤,就使用 Unchecked Exception,若別人收到此錯誤,代表要去檢查為什麼發生,然後去修正程式碼。
    • C# 都是 Unchecked Exception,所以一開始寫發現都沒有 try catch,但最後又被 exception 炸到,很不習慣。
  • 若實在對例外處理沒有想法,那就是一直往上丟就對了,至少炸掉會知道,而不是被 catch 吃掉,提早在設計階段就炸掉趕快處理,比在上線才炸掉來的風險小。

最後壞味道和重構壞味道的部分,實用度很高,去買來翻看看吧。

圖片的縮放參數 android:scaleType

本文內容同步更新到我之前寫的 Android UI 屬性筆記(持續更新)

scaleType 屬性,決定了圖片如何在 ImageView 中被顯示,下方用兩張圖說明。為了避免圖片跟 ImageView 的顯示範圍搞不清楚,所以我程式碼將

  • ImageView 的長寬設為 match_parent ,也就是填滿上層的 LinerLayout。
  • ImageView 的底色設成橘色。

所以下圖中的橘色也就是 ImageView 會塞滿整個手機顯示範圍。

ScaleType_02

ScaleType_01

觀察後的結論:

  • 填入圖片之前,先決定好 ImageView 的長寬。若 ImageView 長寬設為 wrap_content ,也就是 ImageView 跟圖片一樣大,以小圖就例子,不管你怎麼改 scaleType,圖片都不會有變化,因為 ImageView 已經跟圖片一樣大了。
  • 開發階段,可以設定每個元件的底色,方便 debug。
  • 在確定了 ImageView 的長寬後,若我有可能同時放比 ImageView 大或小的圖片,又希望能完整呈現原本的圖片,大小又都要看起來差不多大小(比如 Line 裡頭選擇聊天圖案的畫面),最好的選擇是使用 fitCenter。

台灣 上市|上櫃|加權指數 爬蟲程式

前言

去年用Ruby寫的程式,主要是爬以下三個網頁:

你一定會問都有網頁查詢了,你還爬個屁阿!主要是他提供的資料都是以月份為最單位,若你要抓X年的資料你就要點12*X次,你若要抓Y檔股票,那你總共要點12*X*Y次,所以在父親大人的督促之下,就寫了這三隻爬蟲給他用,修改程式裡頭的時間範圍跟代號,就會去網頁爬一輪回來產生一隻CSV檔案(可用excel開啟)給使用者。

產生檔案範例可參考:

安裝及使用方法

  1. 安裝Ruby
  2. 到命令提示字元,執行以下指令:gem install mechanize,這是為了安裝一個用Ruby寫的函式庫。
  3. 下載檔案,解壓縮到到任意路徑。
  4. 直接編輯程式碼最下面的參數,儲存後點兩下執行即可。

修改查詢參數

可執行且需要使用者重新編輯的檔案,根據網頁連結命名分別為:

  • otc_daily_trading_info.rb
  • twse_mi5_mins_hist.rb
  • twse_stock_day.rb

需要重新編輯的程式碼大概都長得像這樣:

後話

東西寫出來沒再用也是浪費,好一陣子沒用RUBY了,遇到問題請自己上網查或買書看,不要輸給我五十幾歲的老爸。

像個技客寫部落格 - jekyll

早上看到這篇Jekyll: A Ruby-Powered Static Site Generator,就順手安裝測試來玩,此為無聊筆記紀錄一下我有作過這些事。

jekyll

是由Tom Preston-Werner(Github的編寫者?)所編寫的OpenSource。jekyll是一個很簡單使用的部落格文章內容生產器,傳入TextileMarkdown這類的Lightweight Markup Language,它便會根據你建立好的設定檔案(網頁的基本版型'、CSS…),最終產出一個架構完整的資料夾(內含html檔案、css檔案及其他會引用到的資料夾)。而我們最後所要做的只要把這個資料夾到網站主機上(例如:Apache)就可以了。

使用流程

建立環境

首先你要有安裝Ruby,接下來只是簡單把jekyll給gem回來即可。

參考:http://wiki.github.com/mojombo/jekyll/install

檔案架構

我沒有仔細看有無可以快速建立一個專案架構的script,所以我是參考原作者的jekyll專案,一個一個慢慢自己建立的,如下圖所示:

_config.yml檔案

主要是用來設定jekyll啟動相關的參數。

參考:http://wiki.github.com/mojombo/jekyll/configuration

_layouts資料夾

基本上裡頭要建立的是HTML檔案,主要用來架構Blog版面的骨架。

檔案最上面是YAML Front Matter用來設定變數,比如說我這邊就指定在這之前,必須先通過同是在_layouts資料夾下的default.html,藉此可以排除掉不斷DRY的html語法。

_posts資料夾

這也是我們放置文章的地方,檔名要符合”年-月-日-標題.副檔名”這樣的格式,檔案格式就是上面所提的Lightweight Mackup Language。這些檔案最後都會被轉成html。

_site資料夾

根據設定(外貌)及_posts資料夾下的文字檔案(內容),最終產生的所有html檔案都會放在此處,這就是最後可以直接放在網站主機上的檔案結構。

index.html

首頁檔案。

參考:http://wiki.github.com/mojombo/jekyll/usage

執行

把上述步驟完成,執行

jekyll –server

jekyll就會把產生_site資料夾,所有靜態的網頁檔案都放在其中,同時也可以在瀏覽器透過 http://localhost:4000 預覽網頁的效果。

部屬

就是把_site資料夾底下的所有檔案上傳到網頁主機上。

參考:http://wiki.github.com/mojombo/jekyll/deployment

重構-改善既有程式的設計

重構:狹義的解釋是重新整理已經寫好的程式碼。

重構:更廣義地解釋是不斷地整理正在寫的程式碼。

對於有重構思維的程序員來說,不論程式碼是否已經被完成,重構其實在編程過程中是不斷地在同步進行的。重構不在是笨重的黃金鎚!重構已經是一種內化行為!

三年前,剛考了一張號稱全民都有的SCJP,寫著自己都不知道有沒有OOP程式碼的菜鳥。還記得上班後第一次參加JAVA研討會,SDK的API都還不能算是熟捻的程度(現在也不熟XD),更何況大部分的議題都是不同應用領域的技術,兩天下來真的有萬念俱灰想死的念頭


(照片出處:http://www.flickr.com/photos/swanky-hsiao

當時侯捷老師的議題是Design Pattern相關的主題,當時我還很開心想說中於是跟「寫程式概念」有相關的主題,此行終於能學到些可以用的技術。依稀記得走出會場我的臉是呆滯的,侯老師這堂課也是壓垮我編程信心的最後一根稻草。當時還不能夠體會編程之美的我,回到新竹的路上,腦裡都在想轉行的事情。從此到書店看到侯老師翻譯的書,眼光都不自主地飄開,跟勇九可以在地圖上選擇不遇敵一樣。

超愛看中文程式輸的我,寧願上網看英文的重構相關文章。一半的原因是當年揮之不去的心魔。另一半的原因也是我一直在等歐萊里,看它們會不會出一本無腦的深入淺出重構。三年過去了,沒盼到深入淺出重構的問世,也只好硬著頭皮買了這本重構聖經的中文版。

書花了一兩個星期就完食了,看完一整個是相見恨晚真的是恨自己怎麼硬撐那麼久才買。書裡頭得重點我就不花時間寫心得了(最近也沒時間寫),直接把值得推薦的原因寫上。

作者的文筆和翻譯品質都在水準之上。我最怕的程式書就是API的說明狂貼,要不然就是文筆不順,明明都是中文但整句看完卻完全看不懂作者想要表示什麼。

內容完全與編程技巧相關。沒有太多抽象空泛的長篇大論,每道手法的使用時機、詳細步驟和範例都一應俱全。

程式碼範例皆用JAVA與簡單的UML來說明。我不需要在花時間在思考語法轉換或語義的問題上。

文章編排簡潔,行距也夠寬,眼睛不會看到很吃力。

每個技巧是一個獨立章節,第一次看當觀念書看,整本看完以後,將來透過索引快速參照就變成一本實用的工具書。

自己的編程水準是找不太出這本書的缺點,唯一硬要挑毛病的話,大概是程式碼範例如果能使等寬字型會更好(果然水準不夠的人都是從外觀開始找問題XD)。

這本書最棒的地方在於,藉由範例讀者可以知道什麼樣的程式碼是糟糕的程式碼,而這原本可能是你需要犯上大量的錯誤代價才能學到的經驗。更棒的是,不僅教你釣魚連釣魚竿都幫你買好了,範例的後面就是解決問題的答案(XD)。

花上幾百元再加上認真讀個一兩個星期,而光譜的另一端是犯下已知錯誤不得不加班修改的爆肝生活,真的會想的研發都應該知道要選擇哪一種未來!

RssPlurker

一直以來都是GoogleReader來分享文章,自從越來越多朋友玩噗浪之後,分享文章慢慢變成一種很DRY(Don’t Repeat Yourself)的事,在GoogleReader看到不錯的文章,一下忙著按下分享,一下忙著貼上噗浪,最後還要想看看是否要msn還是轉寄給家人。

不知道是不是有現成的軟體下,就直接開使用ruby開始寫工具了!不是我愛重造輪子,是我很慘每次學東就忘西,寫些程式好讓我喚回我對ruby的記憶。邊程相關應該沒啥人有興趣,我最直接寫在最後了。

使用對象

  • 想把rss直接噗上噗浪的人。
  • 電腦有裝ruby。
  • 知道ruby不是紅寶石的人。

使用方法

  1. http://gist.github.com/157918 下載,或是直接剪貼下方程式碼。
  2. 編輯程式碼貼上噗浪帳號、密碼和rss連結。
  3. 點兩下執行。

PS: 此程式需要用到simple-rss和mechanize,使用者必須要gem回來。

使用效果

  1. 程式一開始會去找rss的所有文章,但並不會把這些文章噗上噗浪。
  2. 程式開啟之後,rss若有新增文章程式才會把這些文章貼上噗浪。

關於噗浪這部份都是參考XDite大的Unofficial Plurk API in Ruby,最後發現自己用不到那麼多方法,所以只把有需要的部份加入到自己的程式碼中,順便從XDite的程式碼中得知mechanize這個跟網站互動的API。rss的部份因為GoogleReader輸出的是atom格式,所以沒有用內建的API改用simple-rss來讀取。

心得就是雙修的下場是兩邊技能都不太強,我英文跟日文的學習進度也有一樣的情況。然後不要玩太兇,要不然下場就跟我一樣(如下圖),暗!

程序員修煉之道 (The Pragmatic Programmer From Journeyman to Master) 第八章讀書心得

續上一章 程序員修煉之道 (The Pragmatic Programmer From Journeyman to Master) 第七章讀書心得.

此為讀後重點筆記,好書值得大家購買閱讀.

本章是本書的最後一章,我終於 K 完這本書了,雖然頁數不多,但看原文速度真的慢很多啊!

注重效率的團隊 將之前章節強調的觀念,以套用在團隊的立場在強調一次. 成員間要多交流,大家互相學習及成長,把好的開發流程或概念帶進團隊來,整個團隊不斷往前邁進,公司對外才會更有競爭力.

無所不在的自動化 告訴我們電腦是處理重覆性工作的專家,懶惰則是好的工程師需要具備的特性之一,利用工具或自己開發程式,把需要浪費時間的工作交給電腦處理,省下來的時間再去學新的東西.

無情的測試 強調測試並不是用完即丟,或是寫完就不用去修改它的. 測試程式應該是不斷被執行,並且會隨著程式碼演化的.

代碼文檔不分家. 註解是程式設計師最好的朋友,多花一點時間到離職都可以受用無窮,大腦就應該拿去裝一些需要思考運轉的東西,而不是用來挖掘當初為何自己要這樣寫的理由. 另外,每一份印出的文件都只是當時專案的快照,並不代表其永久有效,透過使用開放編輯的方式,讓文件跟程式碼同步演化,文件才有其存在的價值.

巨大的期望 需要與客戶持續互動,才能確保專案是朝著客戶想要的方向邁進. 回饋的頻率拉得越長,其修改所需的代價也會越高.

傲慢與偏見 - 很日劇式熱血的一小章. 反正就是要激發讀者身為職人的自尊,我以我的程式碼為榮,別人看到作者是我就知道這是品質保證. 因為自尊所以更認真保證品質,品質提高別人對自己的 Credit 變高,如此便是一個良性的循環.

第七章 Pragmatic Projects

Pragmatic Teams

  • 開發團隊必須重視程式碼的品質.
  • 開發團隊必須察覺不論是專案內(ex:新需求)或專案外(新技術)的變化.
  • 鼓勵團隊內的成員互相交流.
  • 建立成員對開發團隊的認同感.
  • 在一個專案中,給予每個人負責不同面向的責任,以免多個人都在做一樣的事情.
  • 不要看完書就急著要求團隊開始實行,維持夠好的規範和風格即可,而不是將額外的負擔加諸在開發團隊上.

Ubiquitous Automation

  • 當你發現自己不斷在重複某些步驟時,那就是該自動化的時候到了.
  • 電腦本來就適合用來處理重複性的工作.

Ruthless Testing

  • 透過測試能盡早發現問題.
  • 發現問題後,將該問題建立成測試條件.
  • 程式本身沒有問題,但給個不是使用者想要的東西,那還是有問題.
  • 使用者不好上手的操作流程,也算是有問題.
  • 越解耦的程式碼,若容易做模組測試.
  • 測試覆蓋範圍的重點,不在於有測到所有程式碼,在於有測到所有的狀態.

It’s All Writing

  • 再強的記憶力也抵不過一支筆.
  • 註解說明為什麼要做這件事,動機和目的. 而程式碼本身會說明如果做這件事.
  • 良好的變數/方法命名習慣,讓程式碼更容易被閱讀.
  • 雖然這段程式碼你可能只會寫這麼一次,但它可能之後要被閱讀好幾百次.
  • 比”沒有意義命名”還糟的是 – “讓人產生誤解的命名”.
  • 利用工具或自寫程式,將文件的表現方式(ex: PDF, HTML …)從內容中獨立出來.

Great Exceptions

  • 寫出來的東西不符合使用者的期待,那就是失敗.
  • 藉由不斷與客戶互動(ex: 展示雛型),來確保成品是客戶所預期的.
  • 試著超出使用者所預期,只要超出一些些,讓使用者覺得我們真的是想做一個很好的系統.

Pride and Prejudice

  • 在自己的程式碼上署名以示負責.
  • 尊重夥伴所寫的程式碼,你怎麼對他們,他們就怎麼對你.

程序員修煉之道 (The Pragmatic Programmer From Journeyman to Master) 第七章讀書心得

續上一章 程序員修煉之道 (The Pragmatic Programmer From Journeyman to Master) 第六章讀書心得.

此為讀後重點筆記,好書值得大家購買閱讀.

本章重點放在開始寫碼之前應該有的準備工作 - 收集需求,解決臭蟲,確認可行性,製訂規格 和 開發流程.

需求之坑 在於使用者很可能自己都不知道自己的需求為何的情況下,其實很多需求是在回饋的過程中,不斷地被挖掘出來的. 個人的經驗通常是,通過層層的關卡後,我做出來的東西,通常變的不會是終端使用者所想的功能,以至於後續會不斷上演砍掉重練的情況發生.

解決不可解的謎題 和之前提過的”靠巧合編碼”一樣,都是要求程式設計師要真正了解問題,把發生問題的原因解決,而不是掩飾表面或後續衍生的問題.

直到準備好 要求在寫碼之前要先規劃藍圖,房子不會邊蓋邊想要改幾層,但寫程式時常會被要求這要搞,但無腦之開寫的下場,辛運一點就是可運行但很難維護的程式碼,最衰的就是寫到一半才發現根本此路不通準備黑掉…

規範陷阱 相對於不規劃就編碼,它位於光譜的另外一端(凡事太過或是不及都不會是好事 XD),嚐試著一次完成所有的規格是件不可能的事,再加上客戶不斷增加或變化的需求,規格與實作往往會漸行漸遠. 做人腦筋不要太死板,規格也是一樣,且戰且走,邊做邊改,最後才不會拿到一本根本過時的兩千頁規格書.

圓圈與箭頭 要程式設計師對於各種開發方式採取開放的態度. 個人覺得這可以套用在各種地方,不排斥學習新知,好的學起來,不好的也了解壞在哪裡. 井底之蛙,以管窺天. 海納百川,有容乃大.

第七章 Before the Project

The Requirements Pit

  • 將會變動的部份從需求中分離出來.
  • 找出客戶為何需要此需求的原因,如此當你實作時才會更貼近其需求.
  • 實際到使用者工作環境,觀察使用者會採取的行為操作.
  • 利用工具紀錄新增的需求,好讓自己能夠知道目前到底增加了多少需求,以求通盤了解整體狀況.
  • 從專案開始,就維護一份詞彙表,用來讓客戶,程式設計師以及其它人對照參考,確定彼此指的是同一個東西,而這份表格也能應用於使用者介面以及程式變數名稱上.
  • 將文件放上內部網頁上,可供參與者觀看或編輯. 而非印出一份沒人會看也辦法即時更新的文件.

Solving Impossible Puzzles

  • 跳脫既有的框架來思考問題.
  • 遇到難題時,不要明知不可為而為之. 反之,列出所有可能的原因,然後一一去驗證,直到找到真正的問題來源為止.
  • 靜下心來思考,哪些是真正的問題? 哪些只是衍生或是使人誤解的問題?

Not Until You’re Ready

  • 準備好了再開始寫程式碼! 坐下來啥都沒想,邊寫邊想,那只能叫做敲鍵盤而已.
  • 分辨你只是 想拖台錢 還是 真的覺得還沒準備好 的方法: 找出需求中你認為最困難的部份,開始寫一些 Prototype 的程式碼,若你發現你寫的很順,甚至開始覺得這樣下去只是浪費時間,那代表你已經準備好實作這個需求了.
  • 正式編碼前先撰寫 Prototype ,就像大軍出動前會先派斥候去偵查敵方實力一樣.

The Specification Trap

  • 不用想一次就補捉出系統的所有細節.
  • 長篇大論讓人很好入睡.
  • 取代先定規格再編碼的方式,讓 編碼 和 規格 同時進行. 這種開發流程鼓勵我們不斷從實作中得到回饋,然後將其轉換成最適合的規格. 編碼跟規格是同步在進化的,規格不在是一灘死水.
  • 有經驗的程式設計師,在編碼時腦中應該會浮現最適合當前情況的設計抉擇.
  • 在沒有考慮技術層面下,很容易定出沒有辦法實作出來的規格.

Circles and Arrows

  • 對於各種開發流程,不要太過拘泥於形式.
  • 客戶喜歡看到實際的產品,而非文件及圖表.
  • 對各種開發流程採取開放的態度,學習並融合其優點,不斷改進自己的開發流程.

程序員修煉之道 (The Pragmatic Programmer From Journeyman to Master) 第六章讀書心得

續上一章 程序員修煉之道 (The Pragmatic Programmer From Journeyman to Master) 第五章讀書心得.

此為讀後重點筆記,好書值得大家購買閱讀.

本章主要強調的重點是 – 程式設計師是否真的了解自己在寫什麼. 而 程式黑手 與 程式設計師 的最大差別我想也在於此 - 是否有在用腦在寫程式碼,還是不管三七二十一拼出一個會動的東西而已.

靠巧合編碼 最好的解釋情境 – 修一個關於迴圈的 Bug ,只是不斷地去調整迴圈 index 的範圍,而不是找出錯誤的真正原因. 如果在寫程式時有這樣的心態,那你就是在靠巧合在編碼.

演算法的速度 使用 O() 表示法,在編碼(或 檢視程式碼片段)的過程中就能大概知道其效率,提早察覺效能上可能會遇到的瓶頸.

重構 鼓勵程式設計師週期性地檢視過去的程式碼,昨日的程式碼不見得符合現今的需要. 不斷地透過重構來整理程式碼,而不是在歪斜的骨架上搭建新的疊層屋.

易測試的代碼 在於寫程式之前就已經準備好測試的程式碼,如此所寫的程式碼不自覺就會以好測試為目標來下筆. 理想中,程式碼的大功能會被切分成小功能(這樣比較好分別測試). 另外,測試程式是重構最好的朋友,重構完是否搞砸了原有的功能? 問問測試程式是最快的方法.

邪惡的嚮導 也就是靠 IDE 工具生成出來的程式碼. 如同靠巧合編碼,是否真的了解程式碼,是 程式黑手 與 程式設計師 的最大的差異之處. 就算只是想當個程式黑手過日子,我相信多了解程式碼還是能節省許多解 Bug 的時間,好讓你回家看老婆抱小孩就是.

第六章 While You Are Coding

Programming by Coincidence

  • 清楚自己要做什麼再下去做,不要只是盲目地寫程式碼.
  • 倚賴可靠的結果,而不是”假設它應該是…”,遇上 假設 請實際去驗證它.
  • 不要讓 過去的程式碼 限制了 當下的程式碼! 過時了那就重構它!

Algorithm Speed

  • 對於 O() 表示法有所了解,並了解自己寫的程式碼其 O() 值.
  • 如果真的看不出來,可以直接調整 input 將結果做成圖表,利用圖表看出大概的效能.
  • 根據實際情況選擇適當的作法即可,不需要總是使用最完美的作法.
  • 確認是瓶頸後再去優化它,而不要掉進過早優化的陷阱中.

Refactoring

  • 與其說寫程式是在蓋房子,更不如說是在規劃你家花園,花草會爛所以你要加肥料,也許你覺得看膩了你又會買新的花回來種. 這裡要強調的是,需求及環境是不斷隨時間而變遷的,不符時宜的程式碼就可以重構之.
  • 當你發現 1)重複的程式碼片段 2)正交性很差的設計 3)過時的資訊 4)效能差 的情況,這代表你該重構你所看到的問題了.
  • 重構和增加新功能不要同時進行.
  • 重構前先準備好對應的測試程式,這樣你能馬上知道你有沒有搞砸任何東西.
  • 把重構拆成多個小步驟,每完成一個步驟就檢查一次,而不是一次重構完再來檢查.

Code That’s Easy to Test

  • 若欲測試的模組有關聯到別的模組,那先從關聯模組開始測試.
  • 測試程式能向別人展示如何使用你寫的程式.
  • 測試程式能在你做了任何的變動後,快速告訴你是否改爛了哪些原本正常的功能.

Evil Wizards

  • 了解利用工具自動產生出來的程式碼.

程序員修煉之道 (The Pragmatic Programmer From Journeyman to Master) 第五章讀書心得

續上一章 程序員修煉之道 (The Pragmatic Programmer From Journeyman to Master) 第四章讀書心得.

此為讀後重點筆記,好書值得大家購買閱讀.

本章強調彈性的好處,寫出鬆散低耦合的程式碼,在將來能用最少的修改以完成變動的需求(理想烏邦托是這樣).

解耦 就有點像 島耕作 在公司裡的作為 - 不結黨營私,越少的利害關係才能明哲保身. 其中的Demeter 法則,是在譔寫方法時很好用的一個開發心法.

Metaprogramming 又是更進一步將工作流程從程式碼中解耦出來,現在很多框架都也是用這種方式來做設定. 不過也代表除了程式碼之外,也得知道 要到哪? 做哪些設定? 設定的效果? ,以上是我在遇到設定時比較頭疼的問題(不過有好好看文件,這些應該都不是問題.).

時間耦合 是提醒在一開始就以將來會支援並行性的心態來撰寫程式,當加入行程的考量時,程式的設計不得不跳脫線性執行的思考,同時也比較模組化.

這不僅僅是 UI 主要是使用 訂閱/發佈 和 MVC 的概念,將 資料/商業邏輯 從 UI 中拔出來. 不過只有提到大觀念跟架構,實際寫法我建議還是要另外找書看,免得寫出一堆自稱是 MVC 的爛扣出來!

最後一章黑板,我只能說寫的很抽像,若是套用在開發流程上,我知道是要大家在同一個地方做溝通與設計的動作(ex: wiki),不過後面將黑板套用在程式設計時則完全是沒有提到如果實作,本人極度懷疑這段是請某個會劃大餅的 sales 寫的啊! XD

第五章 Bend, or Break

Decoupling and the Law of Demeter

  • 限制程式元件間的互動,其實是在保護所有的程式元件.
  • 減少藕合就像裝潢房子,你只會跟設計師溝通你的想法,而不是跑去跟木工/油漆工/水泥工說你想要怎麼做. 另外,如果你跟設計師說你這面牆想要塗成黑色,設計師不應該是把油漆工叫到你面前 –> designer.callPainter().drawColor(Color.BLACK) // 火車頭寫法 囧rz
  • 根據上面例子,如果客戶不想要跟其它人沾上關係的話,那你的設計師就要夠包山包海. 換句話說,設計師類別裡頭會有大量的包裝 (Wrap) 方法,將客戶的要求轉給 (Delegate) 師父去執行.

Metaprogramming

  • 讓程式碼抽像化(以高階的思考撰寫),將實作細節隔離出來(容易抽換,文中是期望用改寫 config 的方式,在執行期動態切換.).
  • 越容易變動的地方,越是要用更容易替換的作法來處理.
  • 用設定檔的方式控制常會變動的流程/實作方式(常使用第三方框架應該知道我在說啥),而不是直接進入程式碼層次去搬泥巴.
  • 重新啟動很快的小程式,可以採取一開始就載入配置檔(只會載入一次)的策略. 大型需要長期執行的程式,則採取每次執行時總是載入配置檔的策略.

Temporal Coupling

  • 時間耦合度在程式設計中,指的是 順序 以及 併行 這兩種情況.
  • 利用 UML 的活動圖分析客戶提供的工作流程(通常是線性順序),找出其實可以同時執行的行為,以排除時間耦合度(原本被順序相依性所耦合).
  • 開發時就以支援並行性的角度來設計架構.

It’s Just a View

  • 利用 發佈/訂閱 的型式 取代 集中發送訊息/SPAM … 等不良作法.
  • MVC <- 這東西一言難盡,有心人請找書看與實作. 很多人號稱會 MVC 寫出來還是只有 V ,我自己也不敢保證自己有正確實作出 MVC . XD

Blackboards

  • 用黑板來溝通,主要概念就是有一塊大家可以 共同編輯/觀看/歷史紀錄 的環境,一個集中式的腦力激盪的空間,而不是每個人都在自己的小房間內搞自己的想法.

程序員修煉之道 (The Pragmatic Programmer From Journeyman to Master) 第四章讀書心得

續上一章 程序員修煉之道 (The Pragmatic Programmer From Journeyman to Master) 第三章讀書心得.

此為讀後重點筆記,好書值得大家購買閱讀.

本章終於開始進入寫程式的階段,利用語言或是外掛提供的功能,在進入程式實作之前建立一些規則/定義,讓潛在的問題提早在開發階段發生,而不是出包會黑掉的部署階段. 囧rz

按合約編程在實際開始編碼前,先規定好預期的 input 和 output ,我剛開始寫程式似乎都是用此想法開始,但後來我比較喜歡用測試先行的方式來寫碼.

死掉的程式就是死了! 換句話說有問題就讓程式早點死掉,忽略問題雖然可以讓程式繼續執行,但有很大的可能它已經是個活死人了(而已你也只會覺得它怪怪的),人死了才會讓程式設計師去正視問題!

斷言編程 不同於 合約編程,合約編程定出預期的事物,斷言編程用於檢查程式設計師(不要相信自己是本書的中心思想之一)認為不會發生的情況. 現實生活中,我還是習慣用 測試先行 來包含 合約編程 + 斷言編程 這兩種作法.

例外 是 Java 處理錯誤的方式,我只知道 1)不要亂隱藏例外,2)要寫有可讀性質的例外,3)將例外用於真正異常發生的時候,而不是當作 true/false 的昂貴代替寫法.

Java 有垃圾回收機制,所以資源部份我就不亂發表心得了! 以後我若改去寫 C 的工作,我相信我要重花一段時間好好學習這一塊. XD

第四章 Pragmatic Paranoia

Desing by Contract

  • 正確的程式就是”不多做事! 也不少做事!”.
  • 寫出懶惰的片段程式碼 - 也就是專注做好一件事的程式碼.
  • 合約 會定義出 進入條件 和 結束時會得到的結果.

Dead Programs Tell No Lies

  • 利用 例外機制 盡早在開發階段就發現錯誤.
  • 一旦在某個地方發生了自以為不會發生的錯誤,這之後的程式也就不能夠被保證是正確的.
  • 假裝還活著的程式(對問題視而不見) 比 早點死掉的程度(強迫中止讓開發者察覺) 造成更大的傷害.

Assertive Programming

  • 若你肯定不會發生,那就加上 Assertion 來確保真的不會發生.
  • Assertion 是用來檢查不會發生的情況,而不能當成程式流程的一部份(若關掉 Assertion 就會造成流程錯亂).
  • 出貨時,在講求效能的地方關掉 Assertion ,其它地方則持續開啟 Assertion .
  • 若檢查行為會影響程式的行為(Side Effect),這就是有問題的程式.

When to Use Exceptions

  • 觸發例外的時間點: 當未預期的事情發生. 換句話說,你預期發生的事情並沒有發生. ex: 開啟一個系統內應該要存在的檔案.
  • 如果你不確定這件事該不該發生,那 不觸發例外 是合理的作法. ex: 開啟一個使用者指定的檔案.

How to Balance Resources

  • 拿到資源要記得把資源還回去(有始有終).
  • 由拿到資源的人(方法),在離開時負責釋放資源.
  • 釋放資源的順序 要跟 取得資源的順序 相反.
  • 若程式在不同的地方,都有取得同一組(多個)資源的需求,取得資訊的順序要一樣,可以減少死結的情況發生.
  • 巢狀資料結構適放資源的三種策略:
    1. 最上層 必須負責 其擁有的資料結構的釋放資源動作.
    2. 最上層 只釋放自己所佔用的資源.
    3. 如果最上層其下擁有資料結構,便不允許釋放資源.

程序員修煉之道 (The Pragmatic Programmer From Journeyman to Master) 第三章讀書心得

續上一章 程序員修煉之道 (The Pragmatic Programmer From Journeyman to Master) 第二章讀書心得.

此為讀後重點筆記,好書值得大家購買閱讀.

本章開始介紹程式員應該設置好有效率的工作環境和工具. 建立專屬於自己的一套火藥庫,並不斷將這套環境更新及進化.

純本文的威力在於它沒有太多格式問題,人腦可理解也很容易寫程式去解析它. 雖然文字檔是人眼可讀的,但只要寫入的人無腦,還是能寫入一堆不可讀的資料,讓文字檔失去人腦可讀的特性.

Shell 這方面,只能說 GUI 讓更多人擁抱電腦,但在 Shell 才能讓電腦發揮它的長處 - 重覆性的耗時工作.

編輯器算是影響程序員產能的重要因素之一吧! 雖然我知道打開筆計本寫扣看起來很屌很大師,但我還是寧願打開我的 IDE ,背好熱鍵,讓 IDE 幫我產生樣版打出正確的名稱.

版本控制真的是好物,但不知為何總有人喜歡這邊留一份那邊留一份,然後再來人眼比對. 我想這這就是學校講授上和業界實務上的鴻溝之一吧學校沒教的事吧! XD

測試首先就是要冷靜,不要有先入為主的假設,遇到假設就要能證明它. 最後找出臭蟲的源頭並修正它,不要只做些表像的修補工作. 試問你家馬桶大便沖不下去, 1)你會每次大便完,把大便撈出來丟垃圾桶? 2)還是把馬桶修好?

文字處理算是程式員常常在接觸的東西,所以學好一個本文處理語言算是有益無害的東西. 有時只是臨時需要(用完可丟的)一個文字處理小程式,像 JAVA 的正規表達式的寫法就很難用,這時你若會寫 Ruby 就方便多了! 雖然我對於學新技術很排斥(我不愛追最新的東西,我覺得這東西追不完,這個十年你可以看到都是這些人在追,但下個十年可能就是完全沒看過新的一批人了. 至少我會想拿這些時間去學些可以永遠使用的技能. 但我還是很感謝勇於追新技術又肯分享的人.),但我不排斥能讓我早點下班的技術觀念. XD

透過程式碼生成器,可以將一些重覆的概念封裝在同一處,讓產生器根據此處來產生其它語言程式碼(讓它變成一個 Build 的步驟之一),變動只出現在一個地方,其它所需要的變動都讓生成器幫程式員做完了.

第三章 The Basic Tools

The Power of Plain Text

  • 使用可讀性的純文字,而不是用純文字寫些不可讀的東西來困擾自己.

Shell Games

  • GUI 限制了某些原本應該能達成的功能.

Power Editing

  • 自己是否已經發揮 IDE 的最大效用.
  • 用好一個 IDE 而不是每種都碰一點但又不熟.
  • 讓熱鍵變成你的反射動作. 沒有人在用滑鼠寫扣的,除非你是 CP 流的人還說的過去.

Source Code Control

  • 再好的記性都比不上版本控制系統.

Debugging

  • 解決問題而不是找理由或是責怪創造他的人.
  • 冷靜以對,而不是一股傻勁就開始玩泥巴.
  • 找到問題發生的源頭,而不只是胡亂解決表面上的問題.
  • 試著把問題講解給別人聽.
  • 不要什麼問題一開始就先入為主地認為是別人的問題. 再檢查一下自己的程式.
  • 若覺得這段程式碼應該是對的,就拿出證明而不要只是瞎猜假設.

Text Manipulation

  • 至少學一種本文處理程式.

Code Generators

  • 被動式程式產生器產生出來的結果是會被保留下來的. ex: 事先產生需要昂貴計算的查表(儲存結果),這份表格會被保留,之後就不用再經過計算來取得結果.
  • 主動式程式產生器產生出來的結果是用完即丟的. ex: 利用 SQL Schema 當做來源,透過程式產生器產生高階的對應程式物件,這行為屬於 build code 的一部份(代表每次都會重新產生). 這樣做的好處是 – DRY(Don’t Repeat),只有一個地方負責資料庫表格的結構.
  • 在由不同程式語言所組成的應用程式中,有時會有兩個物件對應到同一個概念的情況(重覆是一件不好的事)發生. 此時可利用獨立於程式之外的的表達方式,利用程式產生器來產生各自的程式碼.
  • 產生器不一定是要產生程式碼,也可以用來產生 XML, HTML, 文字檔.

點點背 1.0.0


(圖片來自: http://www.dajiadiy.com/data/2007/0429/article_75.html)

對照上面的照片:

  • 黃色衣服的小孩 = 使用者
  • 拿著卡片的媽媽 = 點點背

點點背是一個 極低調的讀字卡學習程式.

安裝

  1. 在電腦上安裝 Java ,到 Sun 的下載頁面選擇適合自己的版本.
  2. 下載點點背:

移除

基本上 Delete jar 檔就可以了!

開始

下載回來會是一個 jar 檔! 點兩下就可以執行!

操作

第一步

若在你的系統托盤上看到點點背的圖示,代表已經成功啟動點點背. 在圖示上按右鍵,你可以看到點點背的相關功能.

開啟檔案

點點背只支援 CSV 格式的檔案. 可填入 檔案在電腦上的路徑 或是 檔案的網路連結.

  • 關於 CSV 格式檔案可以參考下文 CSV檔案 這一章.
  • 一開始大家應該沒有 CSV 檔案可匯入,可參考下文 分享 這一章,我有分享一個檔案可供大家測試.

低調學習

成功開啟後:

  • 在圖示上點左鍵兩下,就會顯示目前卡片內容的對話框.
  • 在圖示上點左鍵兩下,就會顯示下一張卡片內容的對話框.
  • 在對話框上點擊,對話框就會消失.

CSV 檔案

簡單但說錯不負責地說明 CSV 格式:

  • 檔案中每一橫列就代表一張卡片.
  • 每一列中被逗號分開文字,就是卡片中的元素.

更清楚的 CSV 格式可參考 http://zh.wikipedia.org/wiki/CSV (中文) 或 http://en.wikipedia.org/wiki/Comma-separated_values (英文) . 在了解 CSV 的格式之後,你可以使用 筆記本/Excel/Google Doc 產生你自己專屬的讀字卡內容.

分享

歡迎大家留言分享自己在用的 CSV 檔案,舉手之勞這世界會更美好. 小弟自己先提供一個我在用的 CSV 檔案

日檢四級常用單字(共701個單字,直接把 Link 填入開啟 或 下載後在開啟 都可以.) - http://spreadsheets.google.com/pub?key=pYls0CH6DreZ4oin1thzWLg&output=csv

問題回報

在此篇留言即可! Orz

感謝

謝謝這軟體的原創者 - 我同事 farfree ,我只是根據我的需求重新寫了一個我想要的版本. あぃがとう

程序員修煉之道 (The Pragmatic Programmer From Journeyman to Master) 第二章讀書心得

續上一章程序員修煉之道 (The Pragmatic Programmer From Journeyman to Master) 第一章讀書心得.

此為讀後重點筆記,好書值得大家購買閱讀.

持續第一章,本章點出一些開發人員必要的心法,謹記在心可以避免很多低級錯誤!

重覆之罪這我幹醮很多次了! 不管再怎麼憤怒都不應該 CP 來 CP 去,好好靜下心來思考是否可重新利用(重構)可運行的程式碼,這才是王道. 另外減少重覆同時也是在縮小出包的範圍. XD

正交就是指每個元件的交集程度,交集越小也代表重覆的概念or責任越少. 但正交性這章看完,我不知道為什麼我總是會想到”上班好同事,下班不認識.”這句話. XD

可逆性白點就是話不要說太死,說太滿結果最後說錯可是很丟臉低. 寫扣前要好好想想是否未來此處有變動的機率,留點後路以後也不會太痛也可以少加一點班.

我個人開發還常用 Tracer Bullets 這個技巧,不浪費每一個我摸索所寫下的程式碼,我果然有客家人的血統.

相對於 Tracer Bullets ,我覺得寫程式用 Prototype 真的很腦殘,刻一個看起來正確卻無用的東西,真的是白癡!

領域語言我覺得跟第一章所說的溝通有關. 如何用對方了解的事物解釋對方所不了解的東西,就某方面來說,我覺得這是一個好 RD 跟 普通好 RD 的差別之一.

最後一章節就真的屌了! 估時程,坦白說,我真的覺得有些東西根本沒辦法估時程,有時候你很認真估了一個時程,到實際上也不一定照這個時程跑. 我覺得與其自己學好這些技巧,不如讓整個團隊也重視這個觀念來得有用!

第二章 A Pragmatic Approach

The Evils of Duplication

  • DRY.
  • 不要用低階的思唯層次寫註解,這樣子的註解可視為程式碼另一種型式的重覆. 另外,不符合程式碼的註解 不如 沒有註解.

Orthogonality

  • 系統中,每個程式元件都專心做好自己的事. 關於正交性最簡單的說法 : 大家都就做好自己該做的事.

Reversibility

  • 沒有替代方案是最危險的事.
  • 需求總是一直在變的.
  • 一次寫一點點,回饋快,砍掉重練也不那麼痛.

Tracer Bullets

  • 不是在紙上討論出所有未知問題的正確規格,而是用一種實驗性程式碼來找出問題的答案,每一次都是在寫一個從頭到尾的使用者案例.

Prototypes and Post-it Notes

  • 相對於 Tracer Bullets , Prototype 是隨時可以丟棄的程式碼,最終不會成為產品上的一部份.

Domain Languages

  • 領域語言幫助你補捉客戶的需求,隨著轉換成實作碼,最終它會變成可執行的程式碼.
  • 領域語言讓你先在高階層次思考問題,之後再來考慮低階的實作細節.

Estimating

  • 估時程前先問問自己: 對方是想要多精確的時程?
  • 單位要使用正確. 14天跟兩個星期都代表一樣的時間長度,但人們會覺得14天很快就到了(然後每天來問你好了沒)!
  • 估時程前,可以問問之前有做過一樣事情的人.
  • 估時程前,先了解問題.
  • 別人叫你估時程時,你最好回他”我估好再跟你說”.

程序員修煉之道 (The Pragmatic Programmer From Journeyman to Master) 第一章讀書心得

此為讀後重點筆記,好書值得大家購買閱讀.

本章沒有太多技術性的東西,主要是導正程式設計師上一些心態.

貓吃掉了我的源碼是多麼愚蠢的理由,但有時我就是會說出這種不成理由的理由,面對問題不應該急著推卸責任,找出可行的解法才能體現個人價值所在.

專案中的無序狀態,根本就是在說我. 面對殘破不堪的程式碼,即使不能大破大立的砍掉重練,也應該築起防火牆,讓腐敗不影響後面新加入的程式碼.

石頭湯教我要做團隊中的摧化劑,大家一起學習才是最快的進步方式. 不知水溫的青蛙則是在警告我們要不時注意大環境潮流,更新自己的知識才能維持自己的價值.

寫出夠好的程式碼 然後 就夠了,前往下一個村莊吧.

建立自己的學習地圖,定期以及有效率地投資自己的知識. 我們是科技業,這不完全是一個寫越久就越有價值的達人系統行業.

最後,我們要學會如何好好表達自己的想法. 也許我是不喜歡跟人溝通才進入工程師這個職業,但事實上,除了跟電腦溝通(寫扣),我要跟主管溝通,我要跟客戶溝通. 沒錯! 很殘念的事實! 我們必須學會與別人溝通.

第一章 A Pragmatic Philosophy

The Cat Ate My Source Code

  • 對自己寫的程式碼負責.
  • 不要害怕承認錯誤.
  • 出錯時,不要找藉口,而是要找解決方法.
  • 說藉口時,先想想這個藉口別人聽起來是否很可笑.
  • 藉口與指責並無法解決問題.
  • 不要想做不到,而是要想還能做什麼.

Software Entropy

  • 一但程式碼開始出現不好的事物,便會加速專案的腐爛速度. (破窗理論 可參考 景氣大蕭條與塗鴉.....)
  • 不予以不好的程式碼出現. 重構它,改寫它,即使只是注釋,都能避免進一步的毀滅.
  • 保持程式碼的有序狀態,因為誰都不會想當第一個搞亂程式碼的人.

Stone Soup and Boiled Frogs

  • 人們總是害怕變化,不願意分享. 自己要試著去做團體中的催化劑.
  • 做事要看大方向,太專注於不重要的細節容易造成 最後結果 偏移 當初的目標.
  • 不時環顧四周的變化,而不是整天在死守在自己的工作上.

Good-Enough Software

  • 寫出夠好的程式碼. 所謂的夠好指的是 使用者會滿意,後續維護者會感激 而 你自己看得懂你自己在寫什麼.
  • 知道什麼時候該收手,離開已經夠好的程式碼! 你要了解這世界上並沒有完美的程式碼!

Your Knowledge Portfolio

  • 知識跟經驗是我們最大的資產,但很不幸地我們是科技業,你的知識跟經驗隨著新技術的出現而失去其價值.
  • 知識管理機制 跟 投資機制 類似:
    • 強者總是規率地投資 - 這是一種習慣.
    • 多方面的學習 是 長期成功 的關鍵.
    • 聰明的投資者 會按比例將資金 保守投資 和 積極投資.
    • 買低賣高以取得最大的投資報酬率.
    • 定期重新檢視及規劃之前的策略.
  • 不要只讀電腦書,別忘了你寫的程式也是在服務”人”.
  • 對任何事物保持開放不排斥的態度.

Communicate

  • 再好的點子沒有人知道也沒有意義.
  • 自己要知道自己在說什麼.
  • 對方知道你在說什麼.
  • 在適當的時間點溝通. 星期五下午六點就不是一個好的時間點.