在往常同樣寒夜的夜晚,外面下着小雨,而我坐在小書房裏,靜靜地看着技術類的書籍。 java
但和以前不同的是,心上的這本書不只讓我學到了一些新東西,並且還深深吸引了我要動手來玩一玩(毫不是書中的練習題要求我作的)。這本書就是《代碼本色》。 程序員
下面我將簡單陳述一下自學processing的過程和一些有趣的體驗。 shell
processing是一門針對圖形的語言,具體也能夠在開源中國上找獲得,如:圖像處理框架語言 Processing
編程
processing的安裝其實很是地簡單,在有JAVA環境的系統上(這裏是Ubuntu),把processing的壓縮包解壓後,再執行如下命令便可啓動: api
./processing-3.0.2/processing啓動後,咱們就能夠這樣簡單地玩一玩了。
processing是一個針對畫圖的語言,或者說是一個工具。如簡單地畫一條線: 數組
但更爲有趣的是,咱們能夠結合Box2d來繪畫一些帶有物理屬性的物體和場景,如重力、加速度、摩擦力等,也就是說咱們能夠輕鬆創始一個粒子系統,創始一個屬於咱們的「世界」。 框架
如畫一張我一直都想畫的網: 工具
而後,添加一些吸引力: 學習
再進一步,咱們能夠嘗試創造一張羽毛球網: 優化
其中用到的Box2d,須要使用Java版的。更多說明可參考:http://www.jbox2d.org/
上面是processing在物理學的應用,但咱們也可在生物這個領域進行一些好玩的嘗試。如重現細胞的90規則:
書中提到的,有四種規則,也頗讓我印象深入。這四種規則分別是:
而上面的規則90就是第一種:週期性的重複。
基於這些規則,咱們能夠建立一些細胞,並模擬它們的生長、退化、和衰亡。也能夠模擬一些病毒感染的場景。
在讀大學的時候,咱們用的電腦常常會用到屏保。其中有一個屏保就是幾個泡泡在相互碰撞。當時我看到比較有趣,就想能不能本身也模擬實現一下。
在通過了大量的設計(只要是計算物理中兩個物體相撞後的方向和速度變化),咱們勉強作出了效果。最終呈現還不錯,但花費了很多的時間,大概也有幾天甚至一週。
現在再用processing,我能夠在短短的10多分鐘就完成了效果。以下:
上面都是簡單到不能再簡單的示例了,只是提供了一些表面的感觀的瞭解。但經過這些,咱們其實能夠總結到更多。
對於編程的初學者,尤爲是未受過專業學習而是初嘗編程的中小學生,上面的編程都是頗有趣的,由於這把他們帶到了個新的世界。他們能夠由此受到啓發,而作一些與物理、化學、生物有關的科技競賽或創新。
而對於編程的老手,對於已經有工做經驗的人來講,持續學習和嘗試一些新的技術是值得的。由於這會讓咱們重新的角度來看待問題。好比如何組織設計這些虛擬現實世界的物體,如何實現processing。後面這點咱們稍候會再討論。
但無論怎樣,做爲一名程序員,我仍是忘不了最初學會編程的那種興奮。固然,也很enjoy此次這樣的編程樂趣。由於在這裏,你不須要考慮太多的業務,也不用作什麼DBUF,只是作你想作的事情就好。你徹底能夠作很酷的事情,發揮你的創造力。
在我剛畢業的時候,由於工做須要,用到了shell批處理,於是接觸到了awk的使用。如一般地:
cat ./a.txt | awk -F '{print $1}'但稍微複雜的語法則不會使用了,更不用說它的內部實現。
但最近在看《編程珠璣》的時候,才發現Awk這一語言裏面蘊藏瞭如此豐富的設計和思想。
其中就是它的「pattern-action」模式,並且還有它的內置變量,不須要初始化的變量,關聯數組,以及BEGIN-END的結構等。
不少看似很複雜在其餘語言實現困難的,均可以在Awk獲得優化的解決。
《編程珠璣》一書中說起到了小語言,能夠用它來繪畫一些特定場景的圖表,以及很天然地表達某個領域的規則和實現。如一些基於Awk的預處理的小語言,能夠把繪畫化學分子結構圖這樣專業的事情更加簡單化。
而processing能夠說是內部的領域特定語言,即DSL。由於processing是基於JAVA實現的,因此也受限於JAVA的語言語法限制。但前面提到的小語言則屬於外部DSL,能夠用任何語言、任何工具解析文法而後生成Awk的代碼再執行。
對於DSl,我也嘗試在PhalApi進行了試用。
考慮到對遠程接口的調用,爲了給客戶端統一接口請求調用的規範性、流暢性和簡單易懂,我特別爲此使用了內部領域特定語言: 接口查詢語言 (Api Structured Query Language) 。
最終,咱們能夠用一句話來描述接口請求。
正如文檔上介紹的,其主要過程以下:
create withHost host withFilter filter withParser parser reset #特別注意:重複查詢時須重置請求狀態 withService service withParams paramName1 paramValue1 withParams paramName2 paramValue2 withParams ... ... withTimeout timeout request即文法爲:
create -> with -> request以JAVA版本爲例,簡單的調用以下:
PhalApiClientResponse response = PhalApiClient.create() .withHost("http://demo.phalapi.net/") //接口域名 .request(); //發起請求一般的調用,即有設置接口服務名稱、接口參數和超時:
PhalApiClientResponse response = PhalApiClient.create() .withHost("http://demo.phalapi.net/") .withService("Default.Index") //接口服務 .withParams("username", "dogstar") //接口參數 .withTimeout(3000) //接口超時 .request();
高級複雜調用,即設置了過濾器、解析器的操做:
PhalApiClientResponse response = PhalApiClient.create() .withHost("http://demo.phalapi.net/") .withService("Default.Index") .withParser(new PhalApiClientParserJson()) //設置JSON解析,默認已是此解析,這裏僅做演示 .withParams("username", "dogstar") .withTimeout(3000) .request();能夠看到,此設計是簡單、一致且易於擴展的。各客戶端能夠根據本身的語言各自實現。
目前已實現的SDK版本包括但不限於:Java、PHP、Javascript、Ruby、Go、Object-C。
關於領域特定語言,可參考Martin Fowler的《領域特定語言》一書。
因爲只出於簡單備忘,是以簡單紀錄。