2014年11月7日 星期五

Sublime text 2

教學
http://net.tutsplus.com/articles/news/perfect-workflow-in-sublime-text-free-course/
教學內的影片
http://www.youtube.com/watch?v=5AV9zJH2n_Y&list=PLmJpVU-TdmVtTLooKvX3jcrOziPjlWrD4

[Plugin]
先裝
Package Control
再裝透過Package Control裝其他的Plugin

EasyMotion
BracketHighlighter
SideBarEnhancements
SublimeLinter
gist
git



[config]

// 把 tab 換空白
"translate_tabs_to_spaces": true,

// 高亮所在行
"highlight_line": true,

// 存檔時移除多餘的空白
"trim_trailing_white_space_on_save": true,

在Maven中使用ProGuard plugin的方法

設定Maven 的plug-in如下:

 
   
             com.github.wvengen
             proguard-maven-plugin
             2.0.6
             
                 
                     net.sf.proguard
                     proguard-base
                     5.1
                 
             
             
                
                    package
                    proguard
                
             
             
                 5.1            
                 
                     
                      
                     
                  
                 
                 
                     ${java.home}/lib/rt.jar
                     ${java.home}/lib/jsse.jar
                 
             
         
如此一來,做出來的jar檔都會被混淆(obfuscator)
可以減少從class中去猜出相關method內的做法…
但有心人事還是有機會被反解回來喔…

原來在Android sdk2.3以後就有將proguard加入其中了

Reference:
Pro Guard
Progard maven plugin

2012年10月5日 星期五

Lotus Notes 加速大絕

其實這是在找相關的資料時看到的,只要修改"{notes}\framework\rcp\deploy"中的jvm.properties打開後將vmarg.Xmx=-Xmx256m改為 vmarg.Xmx=-Xmx512m,並且重開Notes,應該就會快很多。

PS.修改前請先確認本身的記憶體大小,不然Notes會當掉。

LotusNotes的LS2J

最近公司使用LotusNotes(以下簡稱Notes)從R5升到R8.5.3,其中就有個新的功能LS2J(其實在R6版本就開始有)。由於先前需寫WebSphere MQ的Java程式,剛好就發現了這項功能的好處與缺點。其實國外的相關文件滿多可以參考的,以下就做個簡要的說明與實做。

 在LotusDomino Designer(以下簡稱Designer)中建立一個資料庫。 Notes會自動將所需要的內容建起來。

在來就是在"程式碼\Script程式庫" 中"新增Script程式庫",名稱暫時叫"testJava",類型記得改成"Java",確定後,Designer就會幫我們做相關的配置。再來就是在Src中建立所需要的Package與Class啦…也可以在別的地方寫好的Java做匯入的動作,就能將寫好的程式直接載入進來。這邊放入個簡單回傳的code。
package my;

public class javaMain {
    public String getMessage(){
        return "This is Message from Java";
    }
} 

 
"我有相關用到的Jar檔要用,怎麼辦" ,解法有二。
  1. 選"匯入"到"保存"中(存到Server中)
  2. 放在"{NotesPath}\jvm\lib\ext"中(存在Clinet中)
這兩個差在那?讀取資料庫的效率!!如果Jar檔過大,在JVM開始載入相關的Jar檔,在保存中的Jar,需讀取下來,所以需要網路傳送的時間,所以效能較存在Clinet中慢。但如果存在Clinet中,會有發布的問題,因為是每個Clinet都要放置這個Jar檔,不然Notes會直接當給你看。

再來就可以寫LotusScript(LSX)的部分了 ,這邊用代理程式來測試,首先,新增一個代理程式,名稱就叫"testJAVAFromAgent",類型選"LotusScript",建立後,在"Options"中加入下述兩行
Use "testJava"
UseLSX "*javacon"
第一行就是上面寫的Script程式庫的名稱
第二行就是等一下會使用到的LS2J的元件

選Initialize,並加入下述程式碼

Sub Initialize
    Dim jsession As JavaSession
    Dim jclass As JavaClass
    Dim jObject As JavaObject
    Dim jerr As JavaError
    On Error GoTo Catch   
    Set jsession = New JavaSession
    Set jclass = jsession.GetClass("my.javaMain")   
    Set jObject = jclass.Createobject()   
    MesssageBox jObject.getMessage()
    Catch:   
    MessageBox "LS Error: " & Error
    Set jerr = jsession.GetLastJavaError()   
    ret=ErrorHandling1(jerr.ErrorMsg())
    MessageBox " Stack trace: " & jerr.Stacktrace()
    jsession.Clearjavaerror    
End Sub


建立JavaSession,再由JavaSession取得要使用的Class名稱並給JavaClass,再由JavaClass產生Object出來,最後就是呼叫該Object有的method。最後Catch的部分則是當如果程式在Java中有throw exception時,可以透過catch來抓取問題出來,以利問題的排除

其他
  1. JVM在第一次載入時會慢
  2. 一個JavaSeasion同名的Class只能有一個,先載入的為主,以Clinet為單位,所以只要JVM一將Class Load進來開不同的資料庫Seasion都會是同一個所Loading進來的Class也是共用
  3. 在Java 中寫System.out.println會出現在那?在NotesLotusClinet的工具列中的"工具\顯示JAVA偵錯控制台"所有的System.out.println都會出現在這
  4. 寫Java程式時,由於JVM已經起來,所以不會重新載入重寫過的Class,所以需將Notes重開,讓JVM重新載入新寫的Class

JTOpen用在Tomcat JNDI載入的使用辦法

其實沒什麼太特別的設定方法,只要將JTOpen的jar檔放在tomcat的lib中,並在在Server.xml中加上下面這段語法就行了
         
         
            
             
              factory
           org.apache.commons.dbcp.BasicDataSourceFactory
               
               
                 driverClassName
           com.ibm.as400.access.AS400JDBCDriver
            
            
              url
              jdbc:as400://ServerIP;translate binary=true
            
            
                username
                username
            
            
                password
                xxxxxxx
            
            
                minEvictableIdleTimeMillis
                30000
            
            
                maxActive
                1000
            
            
                maxIdle
                8
            
            
                maxWait
                10000
            
            

其中要注意的地方,就是"translate binary"這個parameter,由於AS400早期的資料庫編碼是EBCDIT,這個parameter預設為false,也就是不自動轉碼。如果AS400資料庫的CCSID為65535,也是不自動轉碼,所以透過JNDI取得的每個字元都會變成2byte,得到奇怪的字元,所以有兩個方向可走。
  1. 確定讀取到的AS400資料庫CCSID為937,那translate binary可走預設(False)
  2. 如果不確定 AS400資料庫CCSID為何,那translate binary就預設為True,透過JTOpen來做轉碼


AS400相關的CCSID預設與Windows的對應

2012年5月30日 星期三

如何知道Java Class檔是使用那種版本的JDK complier出來的?

最近在試WebService的程式,希望能用來讓ERP系統串接其他系統使用,不過由於系統使用的是1.4.2的JDK…所以如果是太新的third party jar檔就無法使用
所以就引發了一個問題…如果什麼都沒寫連META-INF也都沒有…要怎麼知道這個Class是用那個Version的JDK生的?
Google了一下,其實方法不難…將該class檔用16進位的軟體讀出來就可以知道
查到的wiki中有說…找到第八個byte…
詳見下方的內容
J2SE 7    = 51 (0x33 hex),
J2SE 6.0 = 50 (0x32 hex),
J2SE 5.0 = 49 (0x31 hex),
JDK 1.4   = 48 (0x30 hex),
JDK 1.3   = 47 (0x2F hex),
JDK 1.2   = 46 (0x2E hex),
JDK 1.1   = 45 (0x2D hex).
要看的是0x後面紅色的部分(因為是使用16進位來看)
如果找到的是2E…那對應過去就是JDK 1.2版的依此類推…
如此一來就算只有class檔…也能分辨出來是使用那個版本的JDK 生出來的

reference
http://en.wikipedia.org/wiki/Class_%28file_format%29#General_layout

2012年5月14日 星期一

Apple iPad Camera Connection Kit無法讀照片的原因

之前媽媽的朋友家的小孩買了 iPad Camera Connection Kit,讓她能方便的直接將相機裡的照片轉到ipad中,這東西實在是方便,但也帶來了不便…
某天,該位朋友打給我說照片從別人那邊copy回來都無法放入ipad
我到他家也試了好久…google才發現原來事有奚翹
由於他自朋友那邊copy過來的檔名已經變了所以才無法讀取
原因是…不管什麼相機照出來的圖片檔名前面一定是八碼

EX:00000001.jpg

由於他copy過來的檔名已經被更動,所以ipad認為那不是相機拍出來的照片,所以就不會去理他(就算他是圖檔)

所以解法很簡單,找個重新命名的軟體將照片全部重新命名成八碼長度就可以讓ipad順利讀取啦

更新:記得要放到DCIM的資料夾中才能被讀取到