D3 繪製點跟線

GitHub : https://github.com/amberchenchen/D3

首先先加入  insights.standalone.js and insights.standalone.css 這兩支檔案

先準備好 Div容器 ,裝點跟線

再來就是 要有點跟線的資料

1.nodes

  • id: primary key
  • text: node  名稱
  • size: node 大小
  • cluster: node群組的屬性設定,可以把node分類然後針對這類的node去設定顏色大小等等之類的

2.links [1,2] 表示你要在node id=1 跟 node id=2 畫線

3.點跟線都有了,再來就是畫圖 運用 Insights 物件把點跟線以及div容器放入

便會出現點跟線的關析圖 (如下)

螢幕快照 2017-07-02 下午6.36.27

4.node 上的 tooltip ,呼叫已在底層寫好的 tooltip  方法,把想要呈現的內容放入

螢幕快照 2017-07-02 下午6.41.57

 

5. link 線上的 tooltip, 跟node 一樣  ,呼叫已在底層寫好的 PathTooltip方法,把想要呈現的內容放入

螢幕快照 2017-07-02 下午6.46.10

6.再來介紹node的拖拉 drag and drop

主要在 產生node時 ,加上 call back 這個方法  ex: call(node_drag)

  • dragstart : 開始拖拉
  • dragmove : 拖拉過程 , 必須同時update  node 跟 link位置
  • dragend : 拖拉結束

 

螢幕快照 2017-07-02 下午6.54.13

7. node event

首先要先在產生node時 ,先註冊你要的事件

  • click  :  單次點擊
  • dblclick : 雙次點擊

    如何區分單次點擊跟雙次點擊 : 在單次點擊設定 setTimeOut 等250毫秒在去執行單次點擊,如果等待過程中觸發的是雙次點擊那就會進入雙次點擊方法並把正在等待的timeout方法 clear掉直接執行 double click

  • contextmenu : 右鍵觸發

8. Filter node :

基本上就是呼叫 filter這個方法,然後把需要filter的條件組成Json格式放入,最後在update node

螢幕快照 2017-07-02 下午7.15.32

Jackson 2 — Java 物件與JSON 相互轉換的好幫手

JSON是現在很流行的一種系統間交換資料的格式,結構簡單且容易閱讀,我們一起來看看怎麼使用Java 來玩玩JSON吧!

增加Maven dependency

使用的JSON lib 是 Jackson2 ,在POM.xml 只需加一個dependency

Java物件轉JSON

以下程式,我們將Java物件 (Department) 轉為JSON string,並輸出到 console
(也可以直接輸出到檔案,如最後一行所示)

輸出結果如下,第一段輸出 JSON string 無斷行,第二段使用了 writerWithDefaultPrettyPrinter() 來輸出我們容易閱讀的格式

JSON轉Java物件

相反地,我們也可以直接把JSON string或是檔案轉為Java物件

輸出結果如下

使用@JsonView來控制會顯示的欄位

有時候,我們可能會因應不同的情境,而回傳不同數量的欄位。舉例來說,User物件中的password欄位可能就不適合傳到前台去(資安考量),但後台管理系統的密碼維護功能可能會需要這欄位。我們當然可以視狀況多寫幾個欄位數量不一的User DTO,但Jackson2提供了一種更有效率的作法!

  1. 視需求定義不同的 view,如下所示,Public 表示資料出現在「公開場合」,Private 則為後台管理使用(必須繼承Public 因為後台可以看到所有欄位),view name 可自訂

  2. 在DTO 類別的欄位上,分別指定適用的view

  3. 在輸出JSON時,可指定要套用哪個 view 來輸出

    輸出結果如下,可以發現第一段輸出使用了Public view 所以看不到 password 欄位,而Private view 繼承了 Public view 所以全部的欄位都會顯示!

 

以上完整範例程式可參考 https://github.com/kennyliao1982/demo-jackson2

 

JDBC 再升級 — 使用p6spy監控SQL執行結果

在開發專案時,我們通常會很在意 SQL 的執行狀況,像是

  • 想知道 SQL 執行的效能如何
  • 實際在資料庫執行的 SQL 內容為何
    • 使用 JDBC prepared statement時 “?”參數的內容
    • OR mapping 工具最後產生的 SQL 語句內容

當然我們也可以自己加幾行程式碼來取得這些資訊,但大家可以想一想,這些用來純粹取得 SQL 執行內容的程式碼,無關任何業務邏輯,這樣的程式碼放在專案裡真的好嗎?修改幅度不大的話,或許可以這麼做。但如果是有點規模的專案,光是加這些監控的程式碼就是一項很耗費時間的工作,再加上一個不小心動到原本正常執行的程式,那更是得不償失!

今天要介紹一個工具:p6spy,只要透過幾個簡單設定,就可以觀察所有 SQL 的執行狀況,而且移除也很容易,非常適合專案在開發階段時使用!

  1. 請 clone 以下專案
    https://github.com/kennyliao1982/demo-p6spy
  2. 匯入 Eclipse 之後,執行 mvn  package,確保需要的 dependency 都有抓到
  3. 執行 src/main/java 底下的 com.appx.demo.p6spy.App.java
  4. 觀察 console

大家可以看到 log 的上半部記載了 SQL 執行狀況,log的格式如下:(以”|”分隔)
執行當下時間 | 執行耗費時間 | log種類 | connection id | prepared statement SQL語句
實際執行的SQL語句

這次的測試一樣使用了H2 database + Hikari connection pool,主要執行流程如下:
(可參考App.java 的 main 方法)

  1. 啟動資料庫
  2. 建立 DataSource,新建 user table,新增幾筆 user 資料
  3. 查詢所有 user資料
  4. 關閉資料庫

大部分的操作都和之前在示範 connection pool 時一樣,究竟在哪裡用到 p6spy 呢?答案在 App.java 第61行

對,程式碼的異動,就只有這麼一行!這一行只是把原本建立好的 HikariDataSource 物件用 p6spy 提供的 P6DataSource 包裝起來,後續的參數一律使用 P6DataSource,這樣就達到 SQL logging 的效果了!( log 輸出格式的設定可以參考 src/main/resources/spy.properties,基本上都用預設值)

P6DataSource 針對原有 DataSource 作了包裝並加上 logging 機制,實現了 design pattern 中的 decorator pattern (另一個典型例子就是 Java IO 的 BufferedReader )

我們這個案例是手動建立資料庫連線,所以使用 p6spy 需要動一點程式碼,如果是在使用了 framework 的架構下,基本上資料庫連線都是由 framework 讀取設定後負責建立的,這種情況下要使用 p6spy 只需動動設定檔就好,對於程式碼來說沒有任何影響,之後要移除也是非常容易!

JDBC 再升級 — connection pool 牛刀小試

這回要透過一個簡單的例子,讓大家實際感受使用了 connection pool 前後的差異!

  1. 把這個專案 clone 下來
    https://github.com/kennyliao1982/demo-connection-pooling
  2. 在專案根目錄下執行  mvn test
  3. 從console log 就可以看出測試的數據囉!

    *測試說明:測試方式為開關 connection 5000 次,並計算其平均以及全部所花費的時間 (單位是毫秒),由上圖可看出

    • 最慢: NoConnectionPoolingTest,開關一次 connection要 7.106 毫秒,跑完5000回合需要35530毫秒
    • 最快: HikariConnectionPoolingTest,開關一次 connection要 0.017 毫秒,跑完5000回合需要85毫秒

看到這裡,相信大家已經深刻的體會到 connection pool 對於效能優化帶來多麼大的幫助。 connection pool 在市面上有不少團隊推出自己的實作: c3p0, dbcp2, BoneCP, tomcat, vibur, HikariCP…等等,經由上面的簡單測試可以稍微比較一下哪家的效能比較好


如果對於上面測試的程式有興趣的同學,可參考以下說明:

  • 使用了快速、輕巧的資料庫H2 database,可以內嵌在應用程式裡,方便執行測試
  • 基於JUnit,可參考 AbstractConnectionTest.java
    • 在@BeforeClass, @AfterClass 裡啟動/關閉H2資料庫
    • 標註了 @Test的 testOpenCloseConnections 為主要測試流程
    • abstract method initDataSource() 由子類別自行實作,這是 design pattern 的 Template (method) pattern

JDBC 再升級 — 使用 connection pool

我們在學習了基本JDBC的操作之後, 如果要更進一步在正式專案使用JDBC,我自己過去的專案經驗是100%都會使用 connection pool 來處理資料庫連線。雖然這已經是一種很普遍的作法,但從學習的角度來看,我們必須知其然,也知其所以然!

Continue reading →

FreeMarker — Java 模版引擎 (1)

在做專案的時候,身為開發者的我們經常會有「產生動態文字內容」這樣的需求,具體來說像是產生網頁、email內容、甚至寫程式來產生程式碼等等。如果為了一時貪求快速,而把這些文字處理的動作寫在程式裡面,這麼一來整體的維護性就會大打折扣。「模版引擎」(template engine) 就是因應這樣的需求而誕生的!

Java界的模版引擎有很多套,其中比較容易上手,功能也相當完備的,當屬 FreeMarker。 Continue reading →

Maven-實作篇 (3)

上一回我們完成了用戶查詢系統–視窗程式的練習,這次我們從Web版開始吧!

請先確認Eclipse 已經整合了Tomcat,如果還沒,請參考Java web app 開發第一步 – 整合Eclipse + Tomcat


Web

  1. 依照以下資訊,建立 Maven 專案 (使用 maven-archetype-webapp)
    • groupId: com.appx
    • artifactId: user-service-web
    • package: com.appx.userservice.web
    • version: 1.0-SNAPSHOT
  2. 將 src/main/webapp/WEB-INF/web.xml 取代為以下內容

    * webapp archetype 預設生成的 web.xml 定義了舊版的 Servlet 2.3的dtd,會使得一些比較新的JSP特性像是EL不能正常運作,因此必須置換為上面的xml
  3. 將user-service-web 專案放上 Tomcat執行

  4. 在 http://localhost:8080/user-service-web/ 看到 “Hello World!” 表示新建的 Maven web 專案運作正常!
  5. 在POM.xml  加入以下 compiler plugin
  6. 移除JUnit dependency ,並加入下列 dependency (servlet-api 的 scope 為  provided,如果忘記的同學可以參考Maven-10-核心概念 dependency management )
  7. 在 src/main 底下建立 java 資料夾,下載以下程式,並放至 src/main/java 底下這個package com.appx.userservice.web
    https://drive.google.com/open?id=0B0C215CJ0AjobThwTlg3WXFkNmM
  8. 在 src/main/webapp 放置以下檔案
    https://drive.google.com/open?id=0B0C215CJ0AjoOHJOeUVzV2JnQWc
  9. 重啟 Tomcat ,確認搜尋功能正常運作
    • 輸入 user id 為 1

    • 搜尋結果為 tom

  10. 執行 mvn package,產生可直接部署的war檔

Java web app 開發第一步 – 整合Eclipse + Tomcat

以下帶大家一步一步在Eclipse環境中設定Tomcat

  1. 下載Tomcat  (以Tomcat 8.5 為例)
    https://tomcat.apache.org/download-80.cgi
    網頁裡有如下各種格式的壓縮檔,請依照作業系統來選擇,下載完成執行解壓縮

  2. 在Eclipse 偏好設定 Server –> Runtime Environments –> Add 把 Tomcat 加進來

  3. 選擇 Tomcat 所在位置 , Finish, 設定完成!

  4. 接著,打開 servers view  (Window –> Show View –> Servers)

  5. 點擊 view 裡面的超連結,選擇 Tomcat 8.5,會出現剛才所設定的 server runtime environment,點擊 Finish 完成設定

  6. 我們已經成功把 Tomcat 整合進 Eclipse 開發環境,下一步就是測試一下囉!
    新增一個 Dynamic Web Project,點擊 Next

  7. Project Name –> “HelloWorld”,點擊 Finish

  8. 在 HelloWorld 專案的 WebContent 底下新增 index.jsp

  9. 在 servers view 的 Tomcat 上按右鍵 選擇  “Add and Remove”

  10. 把 HelloWorld 專案加到右邊,Finish

  11. 點擊 servers view 右上方的啟動按鈕

  12. 在console 看到  INFO: Server startup in xxxx ms ,代表啟動成功!我們可以開啟瀏覽器,網址輸入 http://localhost:8080/HelloWorld 看到 index.jsp 的內容