code_prettify

2014年12月12日 星期五

Could not publish server configuration for XXX Multiple contexts with the same path error running XXX

Eclipse local server publish時出現上述錯誤訊息.
SO查到的答案是去看看 servers.xml

不過後來是刪掉 local server重新建一個搞定

2014年11月15日 星期六

64-bit 環境中設定 eclipse使用超過 2G記憶體

設定在 eclipse.ini個人試了沒用

啟動 eclipse, 到 Windows>Preference>Java>Installed JREs, 選擇使用的 JER 後點 Edit.
在 Default VM Arguments輸入 -Xms256M -Xmx8192M.
要確認目前運行環境,寫個 main method,看看下面兩個屬性
System.getProperty("sun.arch.data.model")
Runtime.getRuntime().maxMemory();

6 Common Errors in Setting Java Heap Size
這篇文章討論了常見的輸入錯誤
另外提供了 tomcat設定記憶體使用量的設定及幾個 IDE記憶體使用量的設定方式.

Einstein, where are u?

OK.我笨,被陷害了n個小時
一直以來傾向 Entity以單純 JavaBean呈現
所有 logic放在 service中

遇到 hibernate one-to-many中 element怎麼都放不進去
也不是不知道 java.util.Set不允許重複的物件
只是沒想到 n代前手去 override equals......

OK.我知道有一種看法覺得將 entity作業務邏輯封裝是自然的好事
我也承認
有些東西直接封裝到 entity中相當自然且方便
但是
我還是很難接受把 entity搞成帶業務邏輯的物件
讓它就是個單純的 DTO
把邏輯集中到 service是個人比較喜歡的單純化

也許,現在的 model只是更高維度的架構的 projective/affine space
還真期待 model的 4-dimension space會是什麼
Einstein, where are u?

maven使用下載檔案建立 local repository

專案將 datasource以 webapp/META-INF/context.xml設定
用 maven embedded tomcat測試時需要給 embedded tomcat設定 jdbc driver建立連線
maven central repository中並沒有 DB2 driver.

把從 IxM下載的 jar 檔註冊到 local repository 中,指令參考:
mvn install:install-file -DgroupId=com.ibm.db2 -DartifactId=db2jcc -Dversion=3.4.6 -Dpackaging=jar -DgeneratePom=true -Dfile=E:\jdbcDrivers\db2jcc.jar
其中 groupId, artifactId, version可自行設定,方便辨識即可.
-Dfile後面為下載的 jar檔存放路徑.

Compare java.sql.Date

以下的 Date專指 java.sql.Date.

在思考 Date比較時, 如果要用到 after or before, 最好不要用 a.after(b) or a.before(b)的思考邏輯,而是用 !b.before(a) or !b.after(a)的邏輯思考,在企業環境中比較不容易出錯.
Date的 after or before 怎麼比呢?
基本上等同於 a.getTime() > or a.getTime() <.其中沒有等於的空間,也就是沒有 >= or <=.
所以 a.after(b)等同於 a.getTime() > b.getTime(). a.before(b)等同於 a.getTime() < b.getTime().
這並不惱人, 邏輯其實很清楚.
但重點來了: 商用環境中,當你從 DB 拿到一個 Date時,你並不知道這個 Date到底當初是用
Date.valueOf(String)還是 new Date(System.currentTimeMillis())來的(也許有些規劃得很好的系統沒這問題,但是維護前人留下來的系統時,沒那工夫去檢查到底有沒有不一致的做法(甚至有時是不得已: 尤其有些日期是直接由 UI輸入,有些 Date是 current date, 而這兩種 Date須互相比較時.)
以 2014-05-02為例:
Date.valueOf("2014-05-02").getTime() == 1398960000000.
new Date(1399025789901(L)).toString == 2014-05-02.(事實上是2014-05-02 18:16:29.901)
從 DB看, 兩個都是 2014-05-02.
但是 equals絕對 return false.
因此純粹日期比較時要嘛先過一次水讓兩個日期的邏輯一致, 要嘛, 就是用 not after, not before去思考.

ubuntu vim?

6種變形?變形金剛才拍到第 4集耶
jvim-canna
vim-athena
vim-gnome
vim-gtk
vim-nox
vim-tiny(ubuntu 14.04內建)
以上 6種變形金剛vim差異詳見原文 What is the difference between the different vim packages available in Ubuntu

要跑圖形界面 vim直接在 terminal下
gvim
或者到 Search your computer打
text editor
就可以啟動

安裝 docker(on ubuntu)

參考文件:docker官方文件
安裝最新的 ubuntu package(by ubuntu, not by docker.ubuntu提供的最新 package, 不見得是 docker目前最新的 release):
sudo apt-get updatesudo apt-get install docker.io
然後要確認更新到哪個版本,下 docker version
(這應該還需要別的處理,因為到這邊我下 docker version得到的回應是 access denied :P 只能下 sudo docker version)
(欸, sudo apt-get update沒啥必要的感覺,不下這個指令應該也沒差)
然後,如果要啟用 tab快速完成指令(打前幾個字按 tab鍵自動完成)
source /etc/bash_completion.d/docker.io

如果想要用 docker的最新版本
先確認 ubuntu的 APT(Advenced Package Tool)是否支援 https

要確認是否有啟用 https, 找找看有沒有 /usr/lib/apt/methods/https

如果沒有,執行
sudo apt-get update
sudo apt-get install apt-transport-https
啟用 https支援

然後將 docker的 repository key加到系統的 key chain中
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9

然後將 docker repository加到 ubuntu的 repository source list中,並且更新 lxc-docker這個 package
sudo sh -c "echo deb https://get.docker.com/ubuntu docker main\ > /etc/apt/sources.list.d/docker.list"
sudo apt-get update
sudo apt-get install lxc-docker
最後那個指令如果 ubuntu提示 ...package isn't trusted(未受信任的 package)..
想裝就按 y(yes)
不想裝
return :P
以上哩哩拉拉
可以用一個 script代替
curl -sSL https://get.docker.com/ubuntu/ | sudo sh
ps.歹勢,官網降說,但是本人新安裝的 ubuntu 14.04直接言干言焦(ㄐ一ㄝˊㄑ一ㄠˊ)我說 command not found(加了 sudo也一樣)
沒想試,因為我的 docker正常了 :Q

訐譙我只是在練習罕見字
要確認王子與公主最後是否過著幸福快樂的日子,請下指令
sudo docker run -i -t ubuntu /bin/bash
然後王子跟公主就會被抓到你的電腦裡,試試看是不是過著幸福快樂的日子了

ㄟ,王子跟公主幹嘛一直在我面前晃來晃去不走
OK, 按 ctrl-q叫他倆睡覺去先
然後
sudo docker ps -a
找出他倆的床號 xxxxxx
然後
sudo docker stop xxxxxx
把床拆了 :Q

2014年11月12日 星期三

設定 tomcat startup.bat 視窗標題(command prompt title)

測試環境常需要開好幾個 tomcat佈署程式給 user測試
一堆人一起用,全安裝成 service也很煩
直接用 startup.bat啟動是個好方法
不過一堆 command prompt
又分不清楚哪個是誰的

command prompt有個指令可以設定視窗標題
command: title
example: title Elie Program
Elie Program: 自己想要的視窗標題
不用加引號, title後面的所有文字會全部被當成一個字串做為標題 ㄋ
環境: windows 7

至於 tomcat, catalina.bat中有如下說明
"Do not set the variables in this script. Instead put them into a script
setenv.bat in CATALINA_BASE/bin to keep your customizations separate.
.....
TITLE           (Optional) Specify the title of Tomcat window.
......"
簡單說就是不要直接去改 catalina.bat
省得手殘改壞開不起來浪費時間而是在 catalina.bat所在目錄中增加一個 setenv.bat
裡面打上
set "TITLE=Elie Server 1"
這樣用 startup啟動 tomcat後的 command prompt視窗的標題就會變成Elie Server 1
不只視窗左上角的標題欄,工作列 ICON上的文字也會變成Elie Server 1
全部最小化,誰是誰的誰依然是一目瞭然:Q

2014年7月17日 星期四

Play 操作使用筆記-安裝


Play framework 個人當它是一種 rails-lik開發工具

rails-like 我個人是指一種基於 CoC( Convension over Configuration) - 慣例先於設置的開發流程觀念.
事實上, Struts, Spring, Tapestry, ZK 寫久了, 很多人都會對一大堆設定檔感到厭倦.
不設不行, 設嗎其實都大同小異, 通常都是 copy 一段來改一下就搞定了.
是沒花多少時間啦, 但是像我這種大而化之(=粗心)的人也不是沒發生過手殘打錯設定檔內容, 然後 debug 好久的情形(不出則已, 一出通常就鬼打牆. 因為根本不會想從這邊找問題-潛意識認為錯誤不可能出現在設定-事後證明我的手真的挺殘低)
那麼有沒有甚麼方法, 可以讓我不要再跟這些枝微末節打交道了. 不過就寫個 MVC, 能不能讓我寫個 M, 寫個 V, 寫個 C 然後其他的就有人/ 工具替我代勞?現在網路對一些熱門事件不是很流行懶人包嗎? 用 framework 能不能也來個懶人包-替我們這些懶人把程式碼包一包.

ruby on rails- 不怎麼考慮, 對我來說像是另一個世界
Spring Roo- 網路上看了一下, 好像 trouble 還滿多低, 既然是懶人就不想多找麻煩了
Spring Groovy on Grails- 也有在玩. 主要是看上 Spring 用太多了. GoG 基本上就是 Spring 的懶人包(雖然也是有加入別家的東西啦)
Play- 正在玩(俗話說蛋不要放在一個籃子裡, 除了 Spring 這個籃子, 另外找個籃子玩)

OK. GO!!

1. 下載 Play.

Play 的原作者好像成立了家公司 Typesafe. 然後雖然看起來是下載 Play 2.3.1 including activator-1.2.3, 但是下載的程式叫作 typesafe-activator-1.2.3-minimal.zip, 解出來的 folder 叫做 activator-1.2.3-minimal. 害我以為我上了釣魚網站.

2.解壓縮到任意位置.

除了 typesafe-activator-1.2.3-minimal.zip, 還有個typesafe-activator-1.2.3.zip(300 多M)可下載.這個待會會提到.

3.設定 Path.
開始>電腦->右鍵選內容>進階電腦設定>環境變數->系統變數
  JAVA_HOME
  必須指向 JDK. JRE 不夠. ex.C:\Program Files\Java\jdk1.6.0_45
  PATH
  在 PATH 變數增加一個項目(PATH 中各個項目用分號分隔, 最後一個項目後面不需要分號, 也   就是不需要用分號結尾, 但是加了也沒差就是了).ex.E:\activator-1.2.3-minimal

4.測試安裝
開始>執行>cmd 或開始>所有程式>附屬應用程式>命令提示字元開啟一個 Command Line 視窗
key 入(key 完指令後按 enter 執行)
>javac -version
驗證 JDK
>java -version
驗證 JRE
>activator
會打開一個 html 說明文件(因為沒有指定要執行的命令)

Typesafe Activator Documentation

說明 activator 用法
activator [options] [command]
ps. activator 算是一個前導指令, 真正要做甚麼事看後面的功能指令
>activator help
activator 使用略述






2014年4月9日 星期三

半自動解決瀏覽器憑證錯誤

senario: 佈署了 security HTTP後, user很不爽每次 IE都會出現憑證錯誤,是否繼續瀏覽然後得按繼續瀏覽才能進到頁面.

solution:
叫 user手動接受我們產生的自簽核憑證(sellf-signed certification).
不過,還是得處理一下我們的自簽核憑證才能順利讓 user接受憑證
錯誤訊息有三:
1.此網站出示的安全性憑證並非由信任的憑證授權單位所發行。
ans:這部份需要 user手動接受.首先,須將本網站加到信任的網站(網際網路選項>安全性>信任的網站,細節不贅述.然後點選網址列最右邊的憑證錯誤,在打開的視窗中點安裝憑證(先加信任網站才會有安裝憑證可以點),然後把憑證安裝到信任的憑證區.

2.此網站出示的安全性憑證已過期或尚未生效
ans:夠清楚了,憑證過期.那憑證如果是別人發行的,就只好檢查或改改自己的電腦時間.但是我們是發行者,憑證有效期限要多久我們自己可以決定.
keytool -genKey -keyalg RSA -alias <%aliasName%> -keystore <%keystore-path%> -storepass 1234qwer -validity 10000 -keysize 2048 -dname "CN=abc.com, OU=def, O=ghi, L=jkl, S=mno, C=pqr"
-validity 10000就是代表從下這個指令開始,產生的憑證在 10000天內有效:)

3.此網站出示的安全性憑證是為其他網站的位址所發行的
ans:上面那個 keytool指令, -dname中的 CN就是瀏覽器用來判斷"位址不符"的根據.把 CN改成自己的網址(不用加 https://)就符了.

tomcat+struts url querystring中文編碼解碼

senario: xmlhttprequest GET傳送含中文資料到 action, AP Server tomcat 6.x, struts 1.x

solution:
1. url path沒有中文,只有傳遞的參數有中文,所以對參數做 encodeURIComponent
2. tomcat \conf\server.xml中 Connector並未設定 URIEncoding屬性(因此預設值 ISO-8859-1)
3. request.getParameter 會做 URLDecode, 但是因為 2., 所以得到的中文是 ISO-8859-1編碼
4.對request.getParameter重新編碼就拿到想要的 utf-8 encoded string
   new String(req.getParameter("xxx").getBytes("ISO-8859-1"), "utf-8");

2014年3月19日 星期三

jquery 五種取 selected text的方法

console.log($('select[name="leave_type_auto_id"] option:selected').text());
console.log($('select[name="leave_type_auto_id"] option').filter(':selected').text());// optimized(maybe)
console.log($('select[name="leave_type_auto_id"]').children().filter(':selected').text());
console.log($('select[name="leave_type_auto_id"]').children('option').filter(':selected').text());// fastest(maybe)
console.log($('select[name="leave_type_auto_id"]').children('option:selected').text());
console.log($('select[name="leave_type_auto_id"]').children(':selected').text());// fastest(maybe)
有篇比較各種 selector速度的測試
http://jsperf.com/get-selected-option-text

2014年3月12日 星期三

懶得寫 bean. java內建的 key value paire.

java.util.AbstractMap.SimpleEntry<K, V>(K, V).
腦袋一下轉不過來,一直無法建構
new java.util.AbstractMap.SimpleEntry<Integer, String>(new Integer(1), "foo");

2014年2月14日 星期五

Win7下 eclipse註解字型太小

網路上搜尋了一下,主要是因為字型的關係, 而非 font size.
eclipse - Window> Preferences> General> Appearance> Colors and Fonts> Java,選中Java Editor Text Font,點 Edit,把字型改成 Courier New就 OK了

如果點 Edit後字型沒 Courier New可選,在作業系統 - 控制台>外觀及個人化>字型,找到  Courier New右鍵選單選顯示,回 eclipse就有 Courier New可選了