搜尋此網誌

2013年8月30日 星期五

【工具】GitHub設定


以下節錄至[1]
GitHub簡介
GitHub是個提供線上git空間的平台,能讓多名開發人員很方便地進行協力軟體開發。提供的方案包含免費和付費的帳號,而其中的差異在於能否使用私人空間。雖然免費的帳號只能使用公開的空間並且需要公佈所有原始碼,但對許多專案來說不是個問題。除此之外,免費的帳號沒有其他限制。 

 使用GitHub的優點包含:
  • 擁有線上原始碼和修改歷史瀏覽,能讓開發人員便利地分享原始碼
  • 有人創立分支(Fork)時能夠追蹤所有的分支
  • 越來越多的知名企業在徵才時會要求申請者提供GitHub帳號,以用來觀察在開源軟體社群中的參與,還有程式寫作風格和技巧等等(不過如果GitHub帳號上的東西太空洞或潦草的話,還是不要給雇主知道,免得扣分。)
--------------------------------------------------------------------------------------------------------------------------------------------------
而GitHub有專為windows所設計的gitHub for windows(設定參考,請按此),讓使用者不用再為了不熟linux指令,而無法使用git之類的程式版本控管。

不過就在第一次測試push,sync完後,久久沒有使用,某天,改了code,想透過gitHub for windows,再次上傳更新的code,悲劇發生了,不管怎樣就是無法sync,弄了許久,上網看相關解決辦法,無奈粉少人分享相關經驗。

直到找到了可以用TortoiseGit + MSysGit來跟GitHub配合,一樣有windows UI介面, 剛好Tortoise之前就有用過,加個git應該也差不多吧。
搜尋結果,只有一開始設定複雜,之後sync或branch push都很方便,不錯,正是我想要的。
設定可參考底下連結:
[1][教學]初心者git (TortoiseGit) + GitHub使用教學
[2]GitHub入門 Part.2 工具安裝與環境配置  

備註:GitHub UI跟可能[1][2]有些許差別。
實測
TortoiseGit 1.8.5.0 + Git-1.8.3-preview20130601.exe 可以順利安裝使用github。




2013年8月29日 星期四

【工具】附加元件

好的瀏覽器讓上天堂,比較不好的瀏覽器讓你住套房。
但是現在不論是IE9, Chrome, FireFox,...等等,效能其實都提升得差不多,但是沒有附加元件的瀏覽器根本就是折磨人。
幾款筆者必裝的附加元件:
Chrome
Adblock Plus 1.4.1   -- 過濾所有網路上煩人的廣告,眼不見為淨。

AutoPager Chrome 0.8.0.4  --  預先載入下一頁。


Google Dictionary (by Google) 3.0.17     --  網路翻譯的神器。


Mobile01 Picture Auto Loader 1.36       --  m01必用的神器,還再傻傻的移動滑鼠點擊開圖片喔。


Session Buddy 3.2.1  --  輕輕鬆鬆管理瀏覽器 session


SingleFile 0.3.14 + SingleFile Core 0.3.14   -- 遇到沒辦法儲存的網頁嗎???沒關係交給它輕鬆搞定


Smooth Gestures 0.17.7    --  滑鼠手勢,讓你操作網頁就是快人一等。

(手勢設置檔案:https://drive.google.com/file/d/0Bwcb4aVhru6ENTlXemJuVlZ4ZGc/edit?usp=sharing)

Time Tracker 1.0.9  --  紀錄瀏覽各網頁所花的時間,有效的作時間控管。


我比比 bibibar 2012.8.21.1  --  網路比價不煩惱。


新同文堂 1.0.2     -- 簡體字是什麼?怎麼都沒看過。


關燈看影片 2.2    --  讓背景暗下來,可以更focus youtube主畫面。


Unblock Youku 2.6.6.9  --   輕輕鬆鬆解除解除優酷、土豆等網站的限制。

Incognito Tab Switch 2.2  -- 在分頁中直接切換隱私分頁。

Magic Actions for Youtube 6.2.2  --  強大的youtube影音畫面調整,例:背景變暗、滑鼠滾輪控制聲音大小、自動設定視窗size、自動設定畫值。簡直可以取代關燈看影片 2.2

Frame two pages 1.6.1  --  將畫面切割成2個的frame,可同時瀏覽2個網頁。

IP Whois & Flags Chrome & Websites Rating 3.39  得知網頁主機位置,釣魚網頁無所遁形。

Picture in Picture Viewer 0.4.5   放大圖片

http://iamchucky.github.io/PttChrome/    鄉民必備  pttchrome bbs

Video Downloader professional 1.97.43     下載影片神器


FireFox
Adblock Plus 2.2.4   -- 廣告已成過去式。

AutoPager         0.8.0.8    -- 預先載入下一頁。


BBSFox       3.0.2   --  用FF上ptt 酷耶!!!(FireGestures可以支援)


FireGestures1.7.2--  滑鼠手勢,讓你操作網頁就是快人一等。


FlagFox     4.2.9   --  得知網頁主機位置,釣魚網頁無所遁形。


新同文堂 0.4.0.9.1   --   簡體字是什麼?怎麼都沒看過。


隱私分頁     0.1.2   --   在分頁中直接開啟隱私分頁


HighlightAll  1.6   -- 搜尋網頁中某關鍵字,自動顯示所有的keyword,類似Chrome預設的功能   

網址圖片預覽  0.0.7  -- 把滑鼠游標移到圖片或圖片連結時,即可以跳出原圖,不用傻傻的再多開一個分頁。

Tile Tabs 10.1  -- 將畫面切割成多的frame,可同時瀏覽多個網頁。

Magic Actions for Youtube 6.2.2  --  強大的youtube影音畫面調整,例:背景變暗、滑鼠滾輪控制聲音大小、自動設定視窗size、自動設定畫值。

UnMHT  -- 將網頁存成mht檔。測試後,相同的網頁存取檔案size 比chrome的SingleFile 0.3.14 + SingleFile Core來的小。

IE9筆者不常用。

不過它內建的網頁編輯功能  有如同FireFox的水準。對新手來說(我),蠻容易上手的。


--------------------------------------------------------------------------

其實,安裝這麼多附加元件,或許會佔用部分的記憶體空間,但是能讓瀏覽網頁更加方便迅速,這一切也就值得了。
--------------------------------------------------------------------------
2014.09.25更新

2013年8月24日 星期六

【Java】將javascript的substr函式以java來表示

由於java並沒有類似javascript中的substr功能(或者說找不到...),所以以java code呈現javascript的substr。

/**<p>Example: Different between with String.substring and getSubstr<br>
* String a ="654321"; <br>
* b=a.substring(1,2); //b="5"<br>
* b=getSubstr(a,1,2); //b="54" <br>
*
* @param s (the word)
* @param beginningIndex (the beginning index of word)
* @param length (the length of word)
* @return subStr 

*/
String getSubstr(String s, int beginningIndex, int length) {
char[] temp = s.toCharArray();
length = temp.length < length ? temp.length : length;

StringBuilder subStr = new StringBuilder();
for (int i = beginningIndex; i < length; i++) {
subStr.append(temp[i]);
}

return subStr.toString();
}

String getSubstr(String s, int beginningIndex) {
char[] temp = s.toCharArray();

StringBuilder subStr = new StringBuilder();
for (int i = beginningIndex; i < s.length(); i++) {
subStr.append(temp[i]);
}

return subStr.toString();

//簡化
  return getSubstr(s,beginningIndex,s.length());

}

【Javascript】substr, substring, unescape, parseInt等用法

參考來源:http://www.w3schools.com/

最近常用到,順便記錄一下用法:javascript和java一樣INDEX均是由0開始。


  • substr
    • String.substr(index1,index2)  從指定位置(index1)截取指定長度(index2)的字串。
  • substring
    • String.substring(index1,index2)  從指定位置(index1)至指定位置(index2)之間的字串。
      • 舉例:
        • var word="abcdef";
        • word.substr(1,2);     //bc
        • word.subsrting(1,2); //b
  • unescape(string)
    • 目的在於將string解碼。
      • 舉例:
        • unescape(string)等同於java中的URLDecode.decode(string."utf-8")
  • parseInt(string, radix)
    • 將string轉成radix進位(2~36)。
  • push():
    • 類似stack功能:加入一個新item在array最後面。
      • 舉例:
        • var fruits = ["Banana", "Orange", "Apple", "Mango"];
        • fruits.push("Kiwi")  ;  //fuits -->Banana,Orange,Apple,Mango,Kiwi
  • pop():反之亦然。

2013年8月19日 星期一

【Java】取得URL GET的參數值

很直覺得寫下來,先切?再切&

void getURLvalue(string url){   
if (url.indexOf("?") != -1) {
temp = url.split("?")[1];  //這行有錯

tempArray = temp.split("&");

for (String i : tempArray) {
String[] pair = i.split("=");
if (pair[0] == "id")  // pair[0] = key ; pair[1] = value

...
}

   }
}


但compile說第二行?有錯
Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character '?' near index 0
?
^
原來問題出現在
temp = url.split("?")[1];------->temp = url.split("//|?")[2];
就可以順利執行了

結果不保證每次都是想要的。另外找尋其他方法。
String java.net.URL.getQuery()恰好符合需求,就不用特別去切?,結果不一定正確

修改後的版本
void getURLvalue(string url){  
  URL tempUrl = new URI(url).toURL();

  String[] queryArray = tempUrl.getQuery().split("&");
  for (String i : queryArray) {
  String[] pair = i.split("=");

  if (pair[0].equals("v")) { // pair[0] = key ; pair[1] = value
  }
}

}

其中須注意的地方,字串比對要用.equals。

其他功能

                System.out.println("getAuthority:" + url.getAuthority());
System.out.println("getDefaultPort:" + url.getDefaultPort());
System.out.println("getFile:" + url.getFile());
System.out.println("getHost:" + url.getHost());
System.out.println("getPath:" + url.getPath());
System.out.println("getPort:" + url.getPort());
System.out.println("getProtocol:" + url.getProtocol());
System.out.println("getQuery:" + url.getQuery());
System.out.println("getRef:" + url.getRef());
System.out.println("getUserInfo:" + url.getUserInfo());

2013年8月17日 星期六

【Eclipse】properties檔顯示中文方法-propedit

【Java】外部設定檔的應用(java.util.Properties)這篇測試中遇到了properties在eclipse中,因為text editor預設的是unicode,所以沒辦法正確顯示中文,雖說對系統可以正確讀取,但對coder來說很不直觀。
所以要解決的是讓properties可以正確顯示中文,而不是些coder沒辦法解讀的unicode。

果然這個問題早就有人遇過了,所以開發了eclipse的外掛程式改善這個問題。



  1. Help > Install New Software... 
  2. 輸入http://propedit.sourceforge.jp/eclipse/updates/,如下圖所示,等pedding後,選取最新的版本安裝。
    過程中須接受一些協議,並告知此軟體有可能沒認證過,是否繼續(當然一堆人推薦,應該沒啥問題吧,笑),等安裝完畢後,需要重新啟動eclipse。
  3. 重啟後,即可正常使用。
此軟體日文也可正常顯示。

【Java】外部設定檔的應用(java.util.Properties)

在code的過程中,總會有部分設定,可以直接寫死在檔案中
但希望將來是可以直接透過外部修改某文字檔案內容
code在根據此文件修改,做出相對應的修改動作
而不用每次都透過更新程式碼部分變數(參數),就又要重新comple code
非常沒必要。


所以需要一個可以直接引用外部參數的方法。
而java.util.Properties剛好可以滿足我們需求
透過Properties可以產生key-value pair的.xml或者是.properties並讀取key對映到的value


  • 常見應用:

    • 連線IP位址
    • 某些路徑的設定
    • i18n多國語言(.properties)

    以下部分內容轉載自[1],原文太過冗長,螢光部分較須先了解,橘色部分額外添加

    import java.io.*;
    import java.util.Properties;

    private static Properties props = new Properties();

    //一個key對應一個value

    props.setProperty("key1", "value1");
    props.setProperty("key2", "中文測試");

    System.out.println("在console 印出props中所有的(key, value)配對");
    props.list(System.out);
    System.out.println();

    //重覆設定相同的key不同的value,則key對映之舊value會被新value覆蓋
    System.out.println("印出更改後所有的(key, value)配對");
    props.setProperty("key1", "更改value1");
    props.list(System.out);
    System.out.println();

    try {
        // 輸出props中所有的(key, value)配對到xml(storeToXML)及txt(store)
        // 輸出後Stream不會自動關閉必須手動關閉,否則有可能出錯(不是在()中使用new時)
        // storeToXML(OutputStream os, Stirng comment, String encode)
        // storeToXML(OutputStream os, Stirng comment) encode預設使用 UTF-8
           props.storeToXML(new FileOutputStream("properties.xml"), "storeToXML");
           props.store(new FileOutputStream("properties.properties"), "store");
        } catch (FileNotFoundException e) {
           e.printStackTrace();
        } catch (IOException e) {
           e.printStackTrace();
        }

    props.clear();

    try {
        // props.getProperty(key)讀出(key, value)配對
        // props.getProperty(String key, String defaultWhenNotFound)
        // props.getProperty(String key) throws exception when not found
           System.out.println("props.getProperty(key)讀出(key, value)配對");
       
    // default value test
           props.load(new FileInputStream("properties.properties"));
           System.out.println(props.getProperty("key", "test"));   

           System.out.println(props.getProperty("key1"));
           props.clear();
           System.out.println();
        } catch (FileNotFoundException e) {
           e.printStackTrace();
        } catch (IOException e) {
           e.printStackTrace();
        }

    try {
        // 印出從 properties.xml 讀出的所有(key, value)配對
           System.out.println("印出properties.xml讀出的所有(key, value)配對");
           props.loadFromXML(new FileInputStream("properties.xml"));
           props.setProperty("key3", "new value");
           props.list(System.out);

        // 將新配對寫回 properties.xml,串流沒出錯
           props.storeToXML(new FileOutputStream("properties.xml"), "storeToXML");
        } catch (FileNotFoundException e) {
           e.printStackTrace();
        } catch (IOException e) {
           e.printStackTrace();
        }

    }
    ----------------------------------------------------------
    輸出結果:
    在console 印出props中所有的(key, value)配對
     -- listing properties --
     key2=中文測試
     key1=value1

     印出更改後所有的(key, value)配對
     -- listing properties --
     key2=中文測試
     key1=更改value1

     props.getProperty(key)讀出(key, value)配對
     test
     更改value1

     印出properties.xml讀出的所有(key, value)配對
     -- listing properties --
     key3=new value
     key2=中文測試
     key1=更改value1
    ----------------------------------------------------------
    產生的 properties.properties內容:
    #store
    #Sat Aug 17 15:39:54 CST 2013
    key2=\u4E2D\u6587\u6E2C\u8A66
    key1=\u66F4\u6539value1
    使用 store 所產生的文件並不直接支援中文,所以建議使用 storeToXML

    假如為了要看的見中文而使用xml會使得檔案的字元數變得更多,讓檔案size變得更大。不是一個好的建議方法。而是依照使用需求再做決定xml還是properties。

    ----------------------------------------------------------
    產生的 properties.xml內容:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
    <properties>
    <comment>storeToXML</comment>
    <entry key="key3">new value</entry>
    <entry key="key2">中文測試</entry>
    <entry key="key1">更改value1</entry>
    </properties>


    在Eclipse讀取properties檔案下,預設的text editor會把中文顯示成Unicode的編碼方式,實際上系統讀進來的字還是對的。所以解決的點應該是讓properties可以顯示中文。 解決方法

    2013年8月16日 星期五

    【轉載】Java中“為了性能”需做的26件事

    全文轉貼自:
    http://www.csdn.net/article/2012-06-01/2806249

    最近的機器記憶體又爆滿了,除了新增機器記憶體外,還應該好好review一下我們的代碼,有很多代碼編寫過於隨意化,這些不好的習慣或對程式語言的不瞭解是應該好好打壓打壓了。

    下面是參考網路資源總結的一些在Java程式設計中盡可能要做到的一些地方。

    1.儘量在合適的場合使用單例

    使用單例可以減輕載入的負擔,縮短載入的時間,提高載入的效率,但並不是所有地方都適用于單例,簡單來說,單例主要適用於以下三個方面:

    控制資源的使用,通過執行緒同步來控制資源的併發訪問;
    控制實例的產生,以達到節約資源的目的;
    控制資料共用,在不建立直接關聯的條件下,讓多個不相關的進程或執行緒之間實現通信。

    2.儘量避免隨意使用靜態變數

    要知道,當某個物件被定義為stataic的變數所引用,那麼GC通常是不會回收這個物件所佔有的記憶體,如

    public class A{ static B b = new B();} 此時靜態變數b的生命週期與A類同步,如果A類不會卸載,那麼b物件會常駐記憶體,直到程式終止。

    3.儘量避免過多過常的創建Java物件

    儘量避免在經常調用的方法,迴圈中new物件,由於系統不僅要花費時間來創建物件,而且還要花時間對這些物件進行垃圾回收和處理,在我們可以控制的範圍內,最大限度的重用物件,最好能用基本的資料類型或陣列來替代物件。

    4.儘量使用final修飾符

    帶有final修飾符的類是不可派生的。在Java核心API中,有許多應用final的例子,例如java.lang.String。為String類指定final防止使用者覆蓋length()方法。另外,如果一個類是final的,則該類所有方法都是final的。Java編譯器會尋找機會內聯(inline)所有的final方法(這和具體的編譯器實現有關)。此舉能夠使性能平均提高50%。

    5.儘量使用區域變數

    調用方法時傳遞的參數以及在調用中創建的臨時變數都保存在棧(Stack)中,速度較快。其他變數,如靜態變數、執行個體變數等,都在堆(Heap)中創建,速度較慢。

    6.儘量處理好包裝類型和基本類型兩者的使用場所

    雖然包裝類型和基本類型在使用過程中是可以相互轉換,但它們兩者所產生的記憶體區域是完全不同的,基本類型資料產生和處理都在棧中處理,包裝類型是物件,是在堆中產生實例。

    在集合類物件中,有物件方面需要的處理適用包裝類型,其他的處理提倡使用基本類型。

    7.慎用synchronized,儘量減小synchronize的方法

    都知道,實現同步是要很大的系統開銷作為代價的,甚至可能造成鎖死,所以儘量避免無謂的同步控制。synchronize方法被調用時,直接會把當前物件鎖了,在方法執行完之前其他執行緒無法調用當前物件的其他方法。所以synchronize的方法儘量小,並且應儘量使用方法同步代替代碼塊同步。

    8.儘量使用StringBuilder和StringBuffer進行字元串連接

    這個就不多講了。

    9.儘量不要使用finalize方法

    實際上,將資源清理放在finalize方法中完成是非常不好的選擇,由於GC的工作量很大,尤其是回收Young代記憶體時,大都會引起應用程式暫停,所以再選擇使用finalize方法進行資源清理,會導致GC負擔更大,程式運行效率更差。

    10.儘量使用基底資料型別代替物件

    String str = "hello"; 上面這種方式會創建一個“hello”字串,而且JVM的字元緩存池還會緩存這個字串;

    String str = new String("hello"); 此時程式除創建字串外,str所引用的String物件底層還包含一個char[]陣列,這個char[]陣列依次存放了h,e,l,l,o

    11.單執行緒應儘量使用HashMap、ArrayList

    HashTable、Vector等使用了同步機制,降低了性能。

    12.儘量合理的創建HashMap

    當你要創建一個比較大的hashMap時,要充分利用另一個構造函數public HashMap(int initialCapacity, float loadFactor)避免HashMap多次進行了hash重構,擴容是一件很耗費性能的事,在預設中initialCapacity只有16,而loadFactor是 0.75,需要多大的容量,你最好能準確的估計你所需要的最佳大小,同樣的Hashtable,Vectors也是一樣的道理。

    13.儘量減少對變數的重複計算 



    for(int i=0;i<list.size();i++)應該改為

    for(int i=0,len=list.size();i<len;i++)並且在迴圈中應該避免使用複雜的運算式,在迴圈中,迴圈條件會被反復計算,如果不使用複雜運算式,而使迴圈條件值不變的話,程式將會運行的更快。

    14.儘量避免不必要的創建



    A a = new A(); if(i==1){list.add(a);}應該改為

    if(i==1){ A a = new A();list.add(a);}

    15.儘量在finally塊中釋放資源

    程式中使用到的資源應當被釋放,以避免資源洩漏。這最好在finally塊中去做。不管程式執行的結果如何,finally塊總是會執行的,以確保資源的正確關閉。

    16.儘量使用移位來代替'a/b'的操作

    “/”是一個代價很高的操作,使用移位的操作將會更快和更有效



    int num = a / 4; int num = a / 8;應該改為

    int num = a 》 2; int num = a 》 3;但注意的是使用移位應添加注釋,因為移位操作不直觀,比較難理解。

    17.儘量使用移位來代替'a*b'的操作

    同樣的,對於'*'操作,使用移位的操作將會更快和更有效



    int num = a * 4; int num = a * 8;應該改為

    int num = a 《 2; int num = a 《 3;

    18.儘量確定StringBuffer的容量

    StringBuffer的構造器會創建一個默認大小(通常是16)的字元陣列。在使用中,如果超出這個大小,就會重新分配記憶體,創建一個更大的陣列,並將原先的陣列複製過來,再丟棄舊的陣列。在大多數情況下,你可以在創建StringBuffer的時候指定大小,這樣就避免了在容量不夠的時候自動增長,以提高性能。

    如:

    StringBuffer buffer = new StringBuffer(1000);

    19.儘量早釋放無用對象的引用

    大部分時間,方法局部引用變數所引用的物件會隨著方法結束而變成垃圾,因此,大部分時候程式無需將局部,引用變數顯式設為null.

    例如:

    Public void test(){ Object obj = new Object(); …… Obj=null; }上面這個就沒必要了,隨著方法test()的執行完成,程式中obj引用變數的作用域就結束了。但是如果是改成下面:

    Public void test(){ Object obj = new Object(); …… Obj=null;//執行耗時,耗記憶體操作;或調用耗時,耗記憶體的方法 …… } 這時候就有必要將obj賦值為null,可以儘早的釋放對Object物件的引用。

    20.儘量避免使用二維陣列

    二維資料佔用的記憶體空間比一維陣列多得多,大概10倍以上。

    21.儘量避免使用split

    除非是必須的,否則應該避免使用split,split由於支持規則運算式,所以效率比較低,如果是頻繁的幾十,幾百萬的調用將會耗費大量資源,如果確實需要頻繁的調用split,可以考慮使用apache的StringUtils.split(string,char),頻繁split的可以緩存結果。

    22.ArrayList&LinkedList

    一個是線性表,一個是鏈表,一句話,隨機查詢儘量使用ArrayList,ArrayList優於LinkedList,LinkedList還要移動指標,添加刪除的操作LinkedList優於ArrayList,ArrayList還要移動資料,不過這是理論性分析,事實未必如此,重要的是理解好2者的資料結構,對症下藥。

    23.儘量使用System.arraycopy()代替通過來迴圈複製陣列

    System.arraycopy()要比通過迴圈來複製陣列快的多。

    24.儘量緩存經常使用的物件

    盡可能將經常使用的物件進行緩存,可以使用陣列,或HashMap的容器來進行緩存,但這種方式可能導致系統佔用過多的緩存,性能下降,推薦可以使用一些協力廠商的開源工具,如EhCache,Oscache進行緩存,他們基本都實現了FIFO/FLU等緩存演算法。

    25.儘量避免非常大的記憶體分配

    有時候問題不是由當時的堆狀態造成的,而是因為分配失敗造成的。分配的區塊都必須是連續的,而隨著堆越來越滿,找到較大的連續塊越來越困難。

    26.慎用異常

    當創建一個異常時,需要收集一個棧跟蹤(stack track),這個棧跟蹤用於描述異常是在何處創建的。構建這些棧跟蹤時需要為運行時棧做一份快照,正是這一部分開銷很大。當需要創建一個Exception時,JVM不得不說:先別動,我想就您現在的樣子存一份快照,所以暫時停止入棧和出棧操作。棧跟蹤不只包含運行時棧中的一兩個元素,而是包含這個棧中的每一個元素。

    如果您創建一個Exception,那麼就得付出代價。好在捕獲異常開銷不大,因此可以使用try-catch將核心內容包起來。從技術上講,您甚至可以隨意地拋出異常,而不用花費很大的代價。招致性能損失的並不是throw操作(儘管在沒有預先創建異常的情況下就拋出異常是有點不尋常)。真正要花代價的是創建異常。幸運的是,好的程式設計習慣已教會我們,不應該不管三七二十一就拋出異常。異常是為異常的情況而設計的,使用時也應該牢記這一原則。

    【Java】SWT examples in Clojure

    SWT Examples in Clojure