processing初體驗與再識Awk - 從小語言到領域特定語言

在往常同樣寒夜的夜晚,外面下着小雨,而我坐在小書房裏,靜靜地看着技術類的書籍。 java

但和以前不同的是,心上的這本書不只讓我學到了一些新東西,並且還深深吸引了我要動手來玩一玩(毫不是書中的練習題要求我作的)。這本書就是《代碼本色》。 程序員

下面我將簡單陳述一下自學processing的過程和一些有趣的體驗。 shell

1、processing初體驗

一、簡單的繪畫

processing是一門針對圖形的語言,具體也能夠在開源中國上找獲得,如:圖像處理框架語言 Processing
編程

processing的安裝其實很是地簡單,在有JAVA環境的系統上(這裏是Ubuntu),把processing的壓縮包解壓後,再執行如下命令便可啓動: api


./processing-3.0.2/processing
啓動後,咱們就能夠這樣簡單地玩一玩了。


processing是一個針對畫圖的語言,或者說是一個工具。如簡單地畫一條線: 數組

二、結合Box2d

但更爲有趣的是,咱們能夠結合Box2d來繪畫一些帶有物理屬性的物體和場景,如重力、加速度、摩擦力等,也就是說咱們能夠輕鬆創始一個粒子系統,創始一個屬於咱們的「世界」。 框架

如畫一張我一直都想畫的網: 工具

而後,添加一些吸引力: 學習

再進一步,咱們能夠嘗試創造一張羽毛球網: 優化


其中用到的Box2d,須要使用Java版的。更多說明可參考:http://www.jbox2d.org/

三、與生物、遺傳學的結合

上面是processing在物理學的應用,但咱們也可在生物這個領域進行一些好玩的嘗試。如重現細胞的90規則:

書中提到的,有四種規則,也頗讓我印象深入。這四種規則分別是:

  • 呈現週期性的重複
  • 最終的統一,或是歸一
  • 隨機性
  • 綜合以上這幾種的

而上面的規則90就是第一種:週期性的重複。


基於這些規則,咱們能夠建立一些細胞,並模擬它們的生長、退化、和衰亡。也能夠模擬一些病毒感染的場景。

四、最後的練習:碰撞的小球

在讀大學的時候,咱們用的電腦常常會用到屏保。其中有一個屏保就是幾個泡泡在相互碰撞。當時我看到比較有趣,就想能不能本身也模擬實現一下。

在通過了大量的設計(只要是計算物理中兩個物體相撞後的方向和速度變化),咱們勉強作出了效果。最終呈現還不錯,但花費了很多的時間,大概也有幾天甚至一週。

現在再用processing,我能夠在短短的10多分鐘就完成了效果。以下:

五、小結

上面都是簡單到不能再簡單的示例了,只是提供了一些表面的感觀的瞭解。但經過這些,咱們其實能夠總結到更多。

對於編程的初學者,尤爲是未受過專業學習而是初嘗編程的中小學生,上面的編程都是頗有趣的,由於這把他們帶到了個新的世界。他們能夠由此受到啓發,而作一些與物理、化學、生物有關的科技競賽或創新。

而對於編程的老手,對於已經有工做經驗的人來講,持續學習和嘗試一些新的技術是值得的。由於這會讓咱們重新的角度來看待問題。好比如何組織設計這些虛擬現實世界的物體,如何實現processing。後面這點咱們稍候會再討論。

但無論怎樣,做爲一名程序員,我仍是忘不了最初學會編程的那種興奮。固然,也很enjoy此次這樣的編程樂趣。由於在這裏,你不須要考慮太多的業務,也不用作什麼DBUF,只是作你想作的事情就好。你徹底能夠作很酷的事情,發揮你的創造力。

2、Awk從新的認識

在我剛畢業的時候,由於工做須要,用到了shell批處理,於是接觸到了awk的使用。如一般地:


cat ./a.txt | awk -F '{print $1}'
但稍微複雜的語法則不會使用了,更不用說它的內部實現。



但最近在看《編程珠璣》的時候,才發現Awk這一語言裏面蘊藏瞭如此豐富的設計和思想。

其中就是它的「pattern-action」模式,並且還有它的內置變量,不須要初始化的變量,關聯數組,以及BEGIN-END的結構等。

不少看似很複雜在其餘語言實現困難的,均可以在Awk獲得優化的解決。

3、從小語言到DSL

《編程珠璣》一書中說起到了小語言,能夠用它來繪畫一些特定場景的圖表,以及很天然地表達某個領域的規則和實現。如一些基於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的《領域特定語言》一書。

因爲只出於簡單備忘,是以簡單紀錄。

相關文章
相關標籤/搜索