2024年4月24日 星期三

[編碼]Java Web的編碼問題

 一陣子沒有寫中文的部落格文章了,不過,這篇主要是放在中文編碼上,所以還是寫了一篇許久未寫的中文文章,來回饋一下。先講一下我遇到的情況,主要是把一個舊專案的Big 5編碼轉成UTF-8,這中間還需要處理,難字、弱掃的問題。基本上UTF-8應該已經算是web的標準編碼了,不過,在專案公司上班,後端工程師,總是會遇到一些歷史包袱不輕的案子。

再大概講一下基本觀念,基本上,Java的字串是UTF-16,所以各字串轉到Java處理時,都會進行編碼,而轉出時也會再次進行編碼,而難字的部分是預留空間可以使用的自訂義編碼,MS950(for 微軟)和CP950(for Linux)都是Big5的擴充字集了,不過這幾個擴充的字集大小我不太確定那個比較多,不過,可以確定的是UTF-8是提供比Big5更多的字集,不過,當遇到不支援的文字時,都是需要另建字檔,每台電腦上需要安裝這個字檔,不過,這塊有專門的廠商在做了,也只是最常用的解決方案之一就是了。

http://smallken.com/blog/wp-content/uploads/2010/06/Untitleddrawing2.png

AP Server上到底有幾個地方要設定呢?其實我試過很多地方的設定,但,我最後確定的是主要有幾個,第一個是URL Encoding, 第二個是Filter,第三個是File Encoding,第四個是JSP的開頭的部分,不過1, 3JBoss有不一同的設定方式,可以參考下面 JEAP 5&6 — 編碼設定問題 (Encoding) 、使用 CharacterEncodingFilter 解決 Java Web 的編碼問題 這二篇。不過,第三個我是沒設就是了,其它三個是一定要設定就是了。其它有的沒的設定可以拿掉看看,至於信良哥的編碼文章,因為我也沒有特別去試,我覺得還是先試這四個設定都不行了,再去看那些細部設定就好了。

最後簡單說一下遇到的坑吧: 1. url的部分中文傳到後端還是會變亂碼,我是使用encodeURIComponent這個js function來解決這個問題,不知道為何傳到後端會幫你自動解成正確的中文QQ。2. JSP檔案的編碼需要是UTF-8,其實原本檔案是Big5,但在我local是可以正常運行的,放到server就是亂碼,不過因為檔案有點多,我是用mac的iconv來轉,如果使用windows的朋友,可以用uniconv(沒用過,不掛保證XD)。3. ESAPI也需要設定編碼,如果弱掃需要使用這個資安的套件,主要在ESAPI.properties可以設定編碼Encryptor.CharacterEncoding=UTF-8和HttpUtilities.ResponseContentType=text/html; charset=UTF-8。

參考資料:

你的原始碼是什麼編碼?

UniConv - 超強轉碼工具 BIG5/GB/UTF8/Unicode

http://www.importnew.com/19791.html

JavaScript 的 encodeURIComponent() 會將字串轉換成 UTF-8 編碼 - Tsung's Blog

Big5、UTF-8、難字、外字解決方案選擇

JEAP 5&6 - 編碼設定問題 (Encoding)

使用 CharacterEncodingFilter 解決 Java Web 的編碼問題

亂碼 1/2


2015年11月11日 星期三

Java基礎-常用API(上)

為什麼要寫這篇呢?因為吃飽太閒嗎,當然不是=_=,因為人的記憶力是有限的,好啦,其實是我的記憶力是有限的 冏,有些東西真的是每天用,很自然就會記得了,比如if和for,但,有些大概一個星期用到一次,或是一陣子沒用…就很自然的忘記了,不過,有些人記憶力是真的蠻好的就是了,但,我不行,所以整理了一下,我覺得常用的Java API。

不過呢,Java是物件導向的程式語言,何謂物件導向呢…其實,這個問題可以說三天三夜,但,不是這裏的重點,重點是,相同類別的function,很可能會被記到同一個類別上,所以,常常會利用IDE的auto instance功能,來協助查詢可用的api,不過,基本上這樣也就夠了嘛,要用再查嘛,但,其實另一個重點就是速度,天下武功,唯快不破(根本在亂用XD),要當一個產值高的Progamer還是記一下常用的API吧 冏

大概列一下我覺得常用的API類型好了
型別轉換-
在強型別的世界,應該是幾乎每天都在使用吧,但,我也常常一沒寫就忘光光了 冏

日期運算-
沒那麼常用,但我敢保證,如果你有在寫程式,你這輩子一定會用到

正規化-
就我個人的經驗,不常用,有的人可能不會用到,但,我每次用都要重查,也蠻麻煩的=_=

IO處理-
這個嘛,常用到,但通常的情況是,用過一次之後,就掛在那邊了XD

2015年11月1日 星期日

TDD for Java (1)

之前去上了TDD的課,覺得收獲蠻多的
不過行銷文還是少講一點好了XD
因為課程還是以C#為主,但工作上還是以Java為主就是了
不過,基本上概念還是相通的就是了
基本上,講了很多很實用的觀念
不過,最後還是要靠自已慢慢吸收、消化和實踐就是了

基本上,我覺得會寫測試,是一個工程師的一個重要指標
代表你所產出來的程式碼的品質,是否正確和可靠
也可代表具有可維護性
當然還有其它面向的東西,可讀性、clean、彈性、效能等等
彈性和可維護性,可以從Design Pattern上學習
可靠性也和Exception Hangle相關
至於可讀性和Clean,個人覺得可以看看Clean Code...或是Effective Java之類的
至於,效能又只另外一個議題了,程式碼的寫法、系統面、設計面等等,甚至到資料結構和演算法面…

不過,第一步還是先從測試開始吧…
畢竟,在商業軟體的世界,先把東西對才是重點
先求有再求好XD
但,如果客戶要求說,我這個功能需要每秒可以處理百萬筆資料
那又是另一個議題了
畢竟,就像某些人常講的,技術不是問題
當然不是問題,問題在於口袋夠不夠深XD

至於上課說了什麼,老實說
年紀大了沒辦法記那麼多了 冏

只記得第一天是講了Unit Test
如何做到Isolate的測試,如果使用Mock和stub做到這點
和一些測試的準則
第二天,主要講了整合測試的部分,再利用整合測試做重構
然後,再進一步做Unit Test
第三天,主要講了TDD和BDD的部分
如何簡單的根據需求,轉換成test case和進行開發

So, anyway, Let's start practice in Java.
I show some resources below.

Resource:
http://www.ithome.com.tw/news/87245
http://ithelp.ithome.com.tw/question/10109845
http://blog.littlelin.info/posts/2014/04/26/tdd-is-dead-long-live-testing
http://openhome.cc/Gossip/JUnit/
http://www.vogella.com/tutorials/JUnit/article.html
http://www.dotspace.idv.tw/ArecaChen/Test/JUnit_Primer.htm
http://blog.iamzsx.me/show.html?id=118001
http://blog.csdn.net/yasi_xi/article/details/24642517
http://billben.iteye.com/blog/1872196
http://obullxl.iteye.com/blog/727304
http://www.codedata.com.tw/java/unit-test-the-way-changes-my-programming
https://blog.alphacamp.co/2015/03/02/tdd-kata/



2015年10月30日 星期五

Insert Sequence Column - Oracle

基本上在Oracle上,不像SQL Server或DB 2有Identity的功能
沒有支援Auto Increment的功能,不過,這個功能真的還蠻常用的

不過其實還有有其它的技巧可以達成這件事的,比如使用下面參考資料的Trigger,不過,我個人比較喜歡單純一點的做法,在建立Table後,再建立Sequence,而在Insert的時候再使用Sequence.NEXTVAL取值的方式

CREATE TABLE TableName  
(  
  Column1 NUMBER NOT NULL,
  Column2  VARCHAR2(11) NOT NULL,
  CONSTRAINT TableName_PKEY PRIMARY KEY(Column1)
);

CREATE SEQUENCE TableName_SEQ;

INSERT INTO TableName (Column1, Column2)
VALUES(TableName_SEQ.NEXTVAL, 'Column2Value');

參考資料:
https://oracle-base.com/articles/misc/autonumber-and-identity

2015年10月27日 星期二

Tomcat JNDI設定

之前工作主要是用Spring的方式來設定資料庫,將連線的相關資訊另外寫到參數檔中,現在因為工作需要,所以需要設定一下JNDI,之前在用JBoss的時候,大概就有用過了,只是換到Tomcat上,還是要找一下資料來設定,其實細節大概看一下,下面的參考資料就知道怎麼用了,至於要怎麼做,就看環境和需求來取捨吧。

只是想說,不管是用Spring設定,或是AP Server設定,各有優缺點,畢竟Spring的設定方式也是蠻簡單的就是了,但設定在AP Server上,可以將資料庫連線的細節交給DB,實務上也不需要分成開發環境或是線上環境的連線設定檔了,當然,其實也可以說只是把設定檔移至AP Server上就是了 冏。

 其實還有不少東西可以丟給AP Server來處理,比如log或是MQ,不過就我個人觀點,不管是用Spring或是AP Server的方式,工作loading都不會減輕丫!只是單純的將業務邏輯無關的部分從程式中抽離就是了。


參考資料:
http://fanli7.net/a/fuwuqiruanjian/Tomcat/20120701/179189.html
https://tomcat.apache.org/tomcat-7.0-doc/jndi-datasource-examples-howto.html

2015年10月26日 星期一

Package naming

package主要的目的是避免相同名稱的Class發生衝突,因此可以避免開發上麻煩
不過,基本上大部分的人都是重視類別、方法、變數上的命名,不過也是因為套件的命名
其實也蠻少會做什麼特別的變動 

基本上,我以前也是亂命名套件的名稱,比如tw.bill.xxx
但,現在覺得tw的意思不大,如果是公司的話應該用com,組織的話就org,個人的話…
有想到pri,但如果是要推個人做的產品的話,目前還沒有想到好的單字,可能就還是先用pri吧,而第二個單字,一般就是公司名,或是省略,直接接產品名
再來呢,就會區分功能區塊了,而功能區塊下,
又會根據其特性,再進行細分,基本上就是這樣啦

另外,至於interface和實作是否要分開,個人會比較覺得分開會比較好,而實作再跟據其對應的對像進行package的分類,不過,這也只是我比較常遇到的清況,
也可以根據功能進行package區分就好,然後Interface和實作可以放在一起,看那種方式最適合實際情況吧

另一個情況要思考的是,關於繼承關系的package分類,這個可以參考一下java api的分類方式,可以看以我個人最常用的ArrayList和其父介面Collection,
嗯…都放在同一個package中,或許這是一個最簡單的作法
思考過多,反而會造成使用上的困難,但這是對外公開的介面,實際上或許package內部,也隱藏著不為人知的祕密吧XD

關於溝通

其實,這篇沒什麼內容,可能比較適合po在plurk之類的
主要是想說關於溝通的一些想法
之前聽過一個說法是說,人其實對於對方說的不能百分之百完全了解
忘記是50%還是多少百分比了
只是,對某些人聽了某些問題,說我懂了
但問他,他也說不出個什麼毛來
也有的人,可以馬上嘴出一個長篇大論,但狗屁不通
有的人,明明聽的時候,明明就在睡覺,
但問他,又可以說的頭頭是道,可能比較講者說的還好…
或許,在底層有些共同的道理存在吧…
只是想說,一知半解是很可怕的一件事情
但對某些人愛面子的人來說,說不知道可能是很難的一件事吧
不過,學著試著去表達自已的想法,就算錯了,也沒關係
也比裝著自已很懂的樣子,但說不出個毛來的好…