Saturday, March 9, 2019

Từ điển Hán Việt Android, IOS phiên bản mới

1. Giới thiệu

Từ điển Hán Việt cho người học, nghiên cứu Hán Nôm trên điện thoại sử dụng hệ điều hành Android và IOS phiên bản mới.

- Tra theo từ: tra từ Hán, Việt, Hàn
- Tra theo bộ
- Tra theo Pinyin
- Tra theo mã Unicode
- Tra theo mã Thương Hiệt
- Tìm trong định nghĩa
- Duyệt theo tam thiên tự

Các chức năng phụ thêm đã có từ phiên bản trước:
- Xem cách viết (yêu cầu kết nối Internet).
- Nghe phát âm (yêu cầu kết nối Internet).

Các thông tin của chữ Hán được bổ sung trong phiên bản mới:

- Từ kép với chữ tìm kiếm.
- Thành phần cấu tạo nên chữ Hán.
- Các dạng biến thể.
- Các cách đọc trong nhiều ngôn ngữ khác.

Các tiện ích khác:
- Lịch sử tìm kiếm
- Lưu từ yêu thích
- Xem sách Hán Nôm (Thiên tự văn, Tam tự kinh, Bách gia tính)

2. Hướng dẫn sử dụng

Xem hướng dẫn sử dụng trên Youtube:



- Chi tiết định nghĩa chia thành 4 tab:

+ Tab 1: định nghĩa Hán Việt, chữ Nôm, định nghĩa Unicode (tiếng Anh)
+ Tab 2: các từ kép có chữ đang tra
+ Tab 3: có các phần cấu tạo nên chữ, các biến thể, các chữ liên quan (nếu có).
+ Tab 4: các cách đọc trong nhiều ngôn ngữ khác nhau.

Các chữ màu xanh các tab đều có thể nhấn vào để xem chi tiết.






- Mục từ tìm kiếm gần đây (recent) và mục từ yêu thích (favorites):
Mở menu bên bằng cách kéo từ trái sang phải hoặc bấm vào nút ở góc trái trên cùng rồi chọn mục muốn xem.
Nhấn nút ở góc phải trên cùng để xóa hết mục từ.
Kéo sang trái từng từ để xóa từng mục một.



- Các cài đặt: chọn ngôn ngữ ứng dụng.


3. Các lưu ý

- Lần đầu chạy ứng dụng vui lòng chờ một lúc để ứng dụng hoàn thành việc cài đặt dữ liệu.

- Nếu không thể mở được ứng dụng, hãy thử gỡ bỏ và cài đặt lại.

- Nếu bàn phím điện thoại Android không hỗ trợ chức năng nhận dạng chữ viết, hãy cài đặt ứng dụng bàn phím Hán Nôm trên Google play:
Download from Google Play

4. Link tải ứng dụng

Ứng dụng được cung cấp hoàn toàn miễn phí trên Google Play Store và Apple Store. Nếu quí vị cảm thấy vui lòng với ứng dụng, xin dùng chức năng xóa quảng cáo để gỡ bỏ quảng cáo và hỗ trợ tác giả. Mọi đóng góp xin để lại dưới phần comment. Xin chân thành cảm ơn.
Download from Google Play


Download from Apple Store

Nếu như cảm thấy phiên bản mới chưa được tốt, quí vị vẫn có thể sử dụng ứng dụng phiên bản cũ ở đây:


Download from Google Play


Nguồn dữ liệu tham khảo:
- Tự Điển Hán Việt Thiều Chửu (www.viethoc.org)
- Hán Việt Từ Điển Trích Dẫn (www.hanviet.org) (*)
- Tự Điển Chữ Nôm (nomfoundation.org)
- MDBG Chinese-English Dictionary (www.mdbg.net/chindict)
- Unicode Consortium (unicode.org)
- Cổ Hán văn (http://www.cohanvan.com)

(*) BNF (Bibliothèque Nationale de France) Copyright Paris © DTK : Đặng Thế Kiệt, email: dangthekiet2002@yahoo.fr

Saturday, May 7, 2016

Bộ gõ chữ Hán thương hiệt

1. Giới thiệu

Khoảng năm 1978, một người Hoa tên Chu Bang Phục 朱邦復 đã đưa ra một cách gõ chữ Hán mà ông đặt tên là Thương Hiệt thâu nhập pháp. Ðó là thành tựu sau 8 năm nghiên cứu của ông.

Theo qui định của Chu Bang Phục, mỗi chữ Hán phồn thể được phân tích tối đa là 5 mã (ứng với 5 phím gõ). Cách phân tích lấy mã này gọi là thủ mã pháp 取碼法 . Thương Hiệt thâu nhập pháp dùng 24 mã (ứng với 24 chữ cái Latin hiện trên 24 phím của keyboard). Số mã này (gọi là tự căn 字根 ) chia thành 4 loại: (1) Triết lý 哲理 , (2) Bút hoạch 筆畫, (3) Nhân thể 人體 , và (4) Tự hình 字形 .

Coding of "倉頡輸入法" 

Về sau, Thương Hiệt thâu nhập pháp được giản hoá thành Tốc Thành thâu nhập pháp 速成輸入法. Với Tốc thành, ta lấy không quá 2 mã (đầu và cuối) của một chữ Hán phồn thể (ứng với 2 phím gõ) là có thể gõ được nó. Thí dụ chữ 載 gõ bằng Thương Hiệt là JIJWJ, nhưng gõ bằng Tốc thành là JJ (lấy mã đầu và mã cuối của Thương Hiệt). Sự khác biệt là: gõ JIJWJ ta có ngay 載 gõ JJ ta phải chọn 載 trong 16 chữ có mã đầu và cuối giống nhau là JJ: 南 , 車 , 載 , 轟 , 輯 , 辜 , 軒 , 宰 , 幹 , 廾 , 斡 , 軯 , 窣 , 窲 , 轋 , 轚 .

Bàn phím Thương hiệt

2. Các phím của bộ gõ

Bộ gõ chia làm 4 nhóm phím:
- Triết lý loại: Âm dương ngũ hành được gán cho 7 phím chữ cái đầu tiên. A (nhật 日), B (nguyệt 月), C (kim 金), D (mộc 木), E (thủy 水), F (hoả 火), G (thổ 土).
Bút hoạch loại: nhóm kí tự gốc xếp theo nét bút.
Nhân thể loại: dựa trên ý nghĩa con người và các bộ phận liên quan như nhân 人, tâm 心, thủ 手, khẩu 口.
Tự hình loại: nhóm kí tự gốc xếp theo hình dạng chữ.

Nhóm Phím Tên Nghĩa chính
Triết lý loại A 日 nhật - 日, 曰
- 日 quay 90° (như trong 巴)
B 月 nguyệt - 目, 冂, 爫, 冖.
- 4 nét trên đầu, đầu trái của: 炙, 然, và 祭.
- 4 nét trên đầu trái của 豹 and 貓.
- 4 nét trên đầu của 骨.
C 金 kim - 金, 八, 儿, ソ, ハ, 丷
- Hai nét giáp chót của: 四, 匹 (儿)
D 木 mộc - 木
- Hai nét đầu của: 寸, 才
- Hai nét đầu của: 也, 皮
E 水 thủy 氵, 又, 氺
F 火 hỏa - 小, 灬
- Ba nét đầu của: 當, 光
G 土 thổ土, 士
Bút hoạch loại H 竹 trúc - 竹
- 4 nét đầu của: 笨, 節 (bộ trúc)
- ㄏ,丿, ノ
I 戈 qua - Nét chấm (、)
- Ba nét đầu của: 床, 庫 (广)
- 厶
J 十 thập 十, 宀
K 大 đại - Nét dạng chữ X: 乂ㄨナ犭疒廴
- Hai nét đầu trong 右 (ナ)
- 疒
L 中 trung - Nét sổ (丨)
- 衤
- 4 nét đầu trong 書, 盡
M 一 nhất - Nét hoành (一)
- 厂, 工
- Nét cuối trong 孑, 刁
N 弓 cung Nét hình cung, móc câu: フ, ク, 乙, 亅,ㄱ 
Nhân thể loại O 人 nhân - Bộ nhân 人
- Hai nét đầu trong: 丘, 乓
- Hai nét đầu trong: 知, 攻, 氣
- Nét cuối trong: 兆
P 心 tâm - Bộ tâm 忄
- Nét thứ hai trong: 心
- 4 nét cuối trong: 恭, 慕, 忝
- 匕, 七, 勹
- Hai nét áp chót trong: 代
Q 手 thủ 手, ヰ,扌, ≠
R 口 khẩu Bộ khẩu 口
Tự hình loại S 尸 thi - 匚
- 2 nét đầu của 己 (コ)
- Nét đầu của 司, 刀
- Nét thứ 3 của: 成, 豕
- 4 nét đầu của: 長, 髟 (E)
T 廿 trấp - Hai nét dọc nối bằng một nét ngang: ㅛ, 卄, 廾, 丱, 业, 丷
- Bộ thảo 艸, 艹
U 山 sơn Ba mặt đóng, mở bên trên: ㄩ, 乚, 屮
V 女 nữ - Một nét móc bên phải, hình chữ V: ㄴ,ㄑ, <, レ
- Ba nét cuối của: 艮, 衣, 長
W 田 điền - Đóng bốn phía, bên trong có nét khác: 囗, 田
- Hai nét đầu của: 母, 毋
Y 卜 bốc -卜 ,ㅏ, 亠
- 辶
- Hai nét đầu trong 斗
Phím trùng / đặc biệt * X 重/難 trùng/nan - (1) Các chữ dễ nhầm lẫn, trùng lặp
- (2) Những chữ khó tách riêng
Kí tự đặc biệt * Z (See note) Các kí hiệu đặc biệt, các dấu chấm câu (như 。,、,「 」,『 』).

3. Qui tắc lấy mã

a. Thứ tự lấy mã

Tự thể chữ Hán chia làm 4 loại hình:

- Tịnh liệt hình 並列形: Các bộ phận chữ đứng song song từ trái qua phải, thí dụ 針﹐ 億 ﹐ 轉 ﹐ 順 ﹐ 謝 .

- Thượng hạ hình 上下形: Các bộ phận chữ nằm song song từ trên xuống dưới, thí dụ 哲 ﹐ 三 ﹐ 變 ﹐ 貪.

- Ngoại nội hình 外內形: Bộ phận ngoài bao lấy bộ phận trong, thí dụ 國 ﹐ 圖 ﹐ 區 ﹐ 間 ﹐ 凶 ﹐ 幽 .

- Liên thể hình 連體形: Các nét bút liên tiếp khó nhận ra trái-phải, trên-dưới, hay ngoài-trong, thí dụ 叢 ﹐ 亞 ﹐ 重 ﹐ 兩 ﹐ 爾.

Cách lấy mã cũng theo thứ tự như khi viết chữ: Trái qua phải, trên xuống dưới, và ngoài vào trong.

Cần chú ý:
– Chữ 巾 có | ở vị trí cao nên lấy nó làm mã đầu rồi đến 冂.
– Chữ 麒 có bộ phận trái và phải bình hành, thì lấy 鹿 làm mã đầu, rồi mới đến 其.
– Chữ có các bộ phận trái-phải và trên-dưới, thì lấy mã từ trái qua phải, rồi mới từ trên xuống dưới.
– Chữ có bộ phận bao vây như 囗 ﹐ 冂 ﹐ ㄩ ﹐ ㄈ thì bộ phận ngoài này được ưu tiên làm mã đầu.
– Chữ liên thể thì lấy tối đa 4 mã theo các nét đầu, nhì, ba, cuối. Thí dụ chữ 叢 lấy mã theo các nét ㅛ丷ㅛ又.

b. Số lượng mã:
Ta lấy tối đa là 5 mã cho một chữ Hán không phải là liên thể tự. Cần nhớ ba khái niệm: Tự căn 字根, tự thủ 字首, và tự thân 字身.

- Tự căn 字根: là 24 chữ Hán ứng với 24 chữ cái Latin trên bàn phím. Ðó là cơ sở xác định mã. Số lượng tối đa 5 mã phân bố: 2 mã cho tự thủ và 3 mã cho tự thân.

- Tự thủ 字首: Chữ Hán không phải là liên thể tự có thể phân tích ra các bộ phận trái-phải, trên-dưới, ngoài-trong. Tự thủ là bộ phận bên trái, hoặc bên trên, hoặc bên ngoài của chữ. Tự thủ là 1 hoặc 2 mã thì được lấy trọn. Nếu phân tích thành nhiều mã thì chỉ lấy mã đầu và cuối cho đúng chuẩn là 2 mã:

Chữ Tự thủ Chữ Tự thủ
禾 HD 谷 CR
言 YR 囗 W
走 GO 丿 L
八 C 風 HI
厭 MK 林 DD

Bốn trường hợp sau cũng xem là tự thủ:
1. Các bộ phận mà tự điển xem là bộ thủ như ㄩ ㄈ ㄏ 疒 癶 尸 戶 廴 走 風 毛 ... cũng được xem là tự thủ.
2. Các bộ phận tuy tự điển không xem là bộ thủ thí dụ như   ... cũng được xem là tự thủ.
3. Các bộ phận như 戊 麻 產 辰 厭 厥 羽 府 鹿 亥 老 包 ... tuy không thể phân ly trên-dưới hoặc trái-phải nhưng để tiện lấy mã thì cũng xem là tự thủ.
4. Chữ liên thể thì mã đầu tiên xem như tự thủ.

- Tự thân 字身: Bất kỳ một chữ Hán nào, bỏ tự thủ ra, phần còn lại gọi là tự thân. Tự thân lấy tối đa là 3 mã. Nếu nó phân tích được thành nhiều mã thì lấy 3 mã là: đầu, nhì, cuối. Thí dụ: Ta thấy chữ 頁 nếu đứng một mình thì mã là MBUC, khi là tự thân thì mã là MBC. Chữ 希 nếu đứng một mình thì mã là KKLB, khi là tự thân thì mã là KKB. Chữ 麗 nếu đứng một mình thì mã là MMBBP, khi là tự thân thì mã là MMP. Xem các thí dụ sau:
Chữ Tự thủ Tự thân Trọn chữ
木 D 古 JR DJR
火 F 卓 YAJ FYAJ
金 C 昔 TA CTA
虫 LI 胡 JRB LIJRB
豆 MT 頁 MBC MTMBC
禾 HD 希 KKB HDKKB
日 A 麗 MMP AMMP

c. Liên thể tự:
Thương Hiệt thâu nhập pháp chia chữ Hán làm hai loại: Liên thể tự và phi liên thể tự. Những chữ phi liên thể thì được lấy tối đa 5 mã (tự thủ 2 mã, tự thân 3 mã) mà ta đã biết ở trên. Liên thể tự là những chữ mà nét bút rối rắm giao liên, khó phân ly thành những bộ phận trái-phải, trên-dưới, hoặc ngoài-trong. Liên thể tự lấy tối đa 4 mã (đầu, nhì, ba, cuối). Thí dụ về liên thể tự:

正 MYLM 央 LBK 兩 MLBO 凸 BSS
焉 MYLF 牙 MVDH 步 YLMH 函 NUE
免 NAHU 商 YCBR 乖 HJLP 無 OTF
叢 TCTE 其 TMMC 頁 MBUC 重 HJWG
也 PD 喪 GRRV 業 TCTD 甚 TMMV
凹 SSU 直 JBMM 世 PT 疌 JLYO

Toát yếu:
- Trước tiên ta phải thuộc 24 tự căn và biến thể.
- Nhìn một chữ Hán ta phân tích ngay nó có phải là liên thể tự không? Nếu đúng, lấy tối đa 4 mã: đầu, nhì, ba, cuối.
- Nếu đó là phi liên thể tự, ta phân ly nó ra tự thủ (2 mã: đầu, cuối) và tự thân (3 mã: đầu, nhì, cuối).

Nguồn:
http://vietsciences2.free.fr/sinhngu/hannom/tuhochanngu/ngoaikhoa/chineseime.htm
https://en.wikipedia.org/wiki/Cangjie_input_method

Saturday, April 30, 2016

Từ điển Hán Việt Android, version 4.0

1. Giới thiệu

Từ điển Hán Việt cho người học, nghiên cứu Hán Nôm trên điện thoại sử dụng hệ điều hành Android có nhiều update ở version 4.0. Từ điển có các chức năng tra cứu như sau:

- Tra theo từ: tra từ Hán, tra từ Việt
- Tra theo bộ
- Tra theo Pinyin
- Tra theo mã Unicode

Các chức năng phụ thêm đã có từ phiên bản trước:
- Xem cách viết (yêu cầu kết nối Internet).
- Nghe phát âm (yêu cầu kết nối Internet).

Các thông tin của chữ Hán được bổ sung trong phiên bản mới:

- Từ kép với chữ tìm kiếm.
- Thành phần cấu tạo nên chữ Hán.
- Các dạng biến thể.
- Các cách đọc trong nhiều ngôn ngữ khác.

Ngoài ra phiên bản mới cho phép lưu lịch sử và mục từ yêu thích để tiện cho công việc tra cứu.

2. Hướng dẫn sử dụng

- Ở màn hình tìm kiếm, chọn tab có biểu tượng hình bàn phím để chọn kiểu tra từ bằng bàn phím. Bấm vào nút nằm bên phải ô tìm kiếm trên thanh công cụ để chọn cách tra từ. Có các cách tra sau:

+ C: tra bằng âm (VD: an, 安)
+ P: tra bằng pinyin (VD: ba1)
+ U: tra bằng unicode (VD: 5b89)



- Chọn tab có biểu tượng hình miếng xếp hình để chọn cách tra theo bộ



- Sau khi gõ vào ô tìm kiếm, ấn vào từ muốn tra để xem chi tiết. Các phần chi tiết cụ thể như sau:

+ 1: phần mô tả chung với định dạng: R: bộ thủ (số nét phụ / tổng số nét); mã unicode; L: độ khó từ; F: tần suất của từ
+ 2: phần kí tự gồm chữ Hán và âm Hán Việt
+ 3: pinyin, bấm vào từng phần để nghe phát âm (cần kết nối Internet)
+ 4: bấm vào nút này để xem cách viết (cần kết nối Internet). Lưu ý là nhiều chữ không có nguồn cách viết.
+ 5: bấm vào để thêm / xóa mục từ yêu thích (biểu tượng ngôi sao có màu xanh có nghĩa là đã ở trong danh mục từ yêu thích.
+ 6: các phần định nghĩa chi tiết của chữ (xem tiếp phần sau).




- Chi tiết định nghĩa chia thành 4 tab:

+ Tab 1: định nghĩa Hán Việt, chữ Nôm, định nghĩa Unicode (tiếng Anh)
+ Tab 2: các từ kép có chữ đang tra
+ Tab 3: có các phần cấu tạo nên chữ, các biến thể, các chữ liên quan (nếu có).
+ Tab 4: các cách đọc trong nhiều ngôn ngữ khác nhau.
Các chữ màu hồng ở tab 1 và tab 3 hay các từ ở tab 2 đều có thể nhấn vào để xem chi tiết.

- Mục từ tìm kiếm gần đây (recent) và mục từ yêu thích (favorites):
Mở menu bên bằng cách kéo từ trái sang phải hoặc bấm vào nút ở góc trái trên cùng rồi chọn mục muốn xem.
Nhấn nút ở góc phải trên cùng để xóa hết mục từ.
Nhấn và giữ từng từ để xóa từng mục một.



- Các cài đặt:

+ Font size: cỡ chữ trong phần định nghĩa.
+ Language: chọn ngôn ngữ ứng dụng.


3. Các lưu ý

- Lần đầu chạy ứng dụng vui lòng chờ một lúc để ứng dụng hoàn thành việc cài đặt dữ liệu.

- Nếu không thể mở được ứng dụng, hãy thử gỡ bỏ và cài đặt lại.

- Nếu điện thoại không hiển thị một số kí tự có thể là vì font chữ điện thoại không hỗ trợ, hãy tạo một thư mục tên "hannom_fonts" trong bộ nhớ trong điện thoại và copy font chữ "HAN NOM A.tff" download từ fonts_hannom thì có thể xem được.

- Nếu bàn phím điện thoại không hỗ trợ chức năng nhận dạng chữ viết, hãy cài đặt ứng dụng nhận dạng chữ viết của Google để tiện lợi trong việc tra từ. Làm theo hướng dẫn tại trang này để cài đặt, lưu ý khi chọn ngôn ngữ nhớ chọn gói ngôn ngữ tiếng Trung (giản hoặc phồn thể)


4. Link tải ứng dụng

Ứng dụng được cung cấp hoàn toàn miễn phí trên Google Play Store. Nếu quí vị cảm thấy vui lòng với ứng dụng, xin dùng chức năng xóa quảng cáo để gỡ bỏ quảng cáo và hỗ trợ tác giả. Mọi đóng góp xin để lại dưới phần comment. Xin chân thành cảm ơn.
Download from Google Play

Nếu như cảm thấy phiên bản mới không được tốt, mời tải file cài apk phiên bản 3.1 tại đây:
HanViet.v3.1.apk

Nguồn dữ liệu tham khảo:
- Tự Điển Hán Việt Thiều Chửu (http://www.viethoc.org/hannom/tdtc_intro.php)
- Hán Việt Từ Điển Trích Dẫn (http://www.hanviet.org/)
- Tự Điển Chữ Nôm (http://nomfoundation.org)

Thursday, March 31, 2016

Spring Injection with @Resource, @Autowired and @Inject

Overview

I’ve been asked several times to explain the difference between injecting Spring beans with ‘@Resource’, ‘@Autowired’, and ‘@Inject’. While I received a few opinions from colleagues and read a couple of posts on this topic I didn’t feel like I had a complete picture.

Annotations

Annotation Package Source
@Resource javax.annotation Java
@Inject javax.inject Java
@Qualifier javax.inject Java
@Autowired org.springframework.bean.factory Spring
In order to explore the behavior of each annotation I fired up Spring Tool Suite and started debugging the code. I used Spring 3.0.5.RELEASE in my research. The following is a summary of my findings.

The Code

I wanted to know how ‘@Resource’, ‘@Autowired’, and ‘@Inject’ resolved dependencies. I created an interface called ‘Party’ and created two implementations classes. This allowed me to inject beans without using the concrete type. This provided the flexibility I needed to determine how Spring resolves beans when there are multiple type matches.
public interface Party {
 
}
‘Person’ is a component and it implements ‘Party’.
package com.sourceallies.person;
...
@Component
public class Person implements Party {
 
}
‘Organization’ is a component and it implements ‘Party’.
package com.sourceallies.organization;
...
@Component
public class Organization implements Party {
 
}
I setup a Spring context that scans both of these packages for beans marked with ‘@Component’.
<context:component-scan base-package="com.sourceallies.organization"/>
<context:component-scan base-package="com.sourceallies.person"/>

Tests

Test 1: Ambiguous Beans

In this test I injected a ‘Party’ bean that has multiple implementations in the Spring context.
@Resource
private Party party;
@Autowired
private Party party;
@Inject
private Party party;
In all three cases a ‘NoSuchBeanDefinitionException’ is thrown. While this exception’s name implies that no beans were found, the message explains that two beans were found. All of these annotations result in the same exception.
org.springframework.beans.factory.NoSuchBeanDefinitionException: 
No unique bean of type [com.sourceallies.Party] is defined: 
expected single matching bean but found 2: [organization, person]

Test 2: Field Name

In this test I named the Party field person. By default beans marked with ‘@Component’ will have the same name as the class. Therefore the name of the class ‘Person’ is person.
@Resource
private Party person;
@Autowired
private Party person;
@Inject
private Party person;
‘@Resource’ can also take an optional ‘name’ attribute. This is equivalent to the ‘@Resource’ code above. In this case the field variable name remains ‘party’. There is no equivalent syntax for ‘@Autowired’ or ‘@Inject’. Instead you would have to use a ‘@Qualifier’. This syntax will be covered later.
@Resource(name="person")
private Party party;
All four of these styles inject the ‘Person’ bean.

Test 3: Field Type

In this test I changed the type to be a ‘Person’.
@Resource
private Person party;
@Autowired
private Person party;
@Inject
private Person party;
All of these annotations inject the ‘Person’ bean.

Test 4: Default Name Qualifier

In this test I use a ‘@Qualifier’ annotation to point to the default name of the ‘Person’ component.
@Resource
@Qualifier("person")
private Party party;
@Autowired
@Qualifier("person")
private Party party;
@Inject
@Qualifier("person")
private Party party;
All of these annotations inject the ‘Person’ bean.

Test 5: Qualified Name

I added a ‘@Qualifier’ annotation to the ‘Person’ class
package com.sourceallies.person;
...
@Component
@Qualifier("personBean")
public class Person implements Party {
 
}
In this test I use a ‘@Qualifier’ annotation to point to the qualified name of the ‘Person’ component.
@Resource
@Qualifier("personBean")
private Party party;
@Autowired
@Qualifier("personBean")
private Party party;
@Inject
@Qualifier("personBean")
private Party party;
All of these annotations inject the ‘Person’ bean.

Test 6: List of Beans

In this test I inject a list of beans.
@Resource
private List<Party> parties;
@Autowired
private List<Party> parties;
@Inject
private List<Party> parties;
All of these annotations inject 2 beans into the list. This can also be accomplished with a ‘@Qualifier’. Each bean marked with a specific qualifier will be added to the list.

Test 7: Conflicting messages

In this test I add a bad ‘@Qualifier’ and a matching field name.
@Resource
@Qualifier("bad")
private Party person;
@Autowired
@Qualifier("bad")
private Party person;
@Inject
@Qualifier("bad")
private Party person;
In this case the field marked with ‘@Resource’ uses the field name and ignores the ‘@Qualifier’. As a result the ‘Person’ bean is injected.
However the ‘@Autowired’ and ‘@Inject’ field throw a ‘NoSuchBeanDefinitionException’ error because it can not find a bean that matches the ‘@Qualifier’.
 org.springframework.beans.factory.NoSuchBeanDefinitionException: 
No matching bean of type [com.sourceallies.Party] found for dependency: 
expected at least 1 bean which qualifies as autowire candidate for this dependency. 
Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true),
@org.springframework.beans.factory.annotation.Qualifier(value=bad)}

Conclusions

With the exception of test 2 & 7 the configuration and outcomes were identical. When I looked under the hood I determined that the ‘@Autowired’ and ‘@Inject’ annotation behave identically. Both of these annotations use the ‘AutowiredAnnotationBeanPostProcessor’ to inject dependencies. ‘@Autowired’ and ‘@Inject’ can be used interchangeable to inject Spring beans. However the ‘@Resource’ annotation uses the ‘CommonAnnotationBeanPostProcessor’ to inject dependencies. Even though they use different post processor classes they all behave nearly identically. Below is a summary of their execution paths.
@Autowired and @Inject
  1. Matches by Type
  2. Restricts by Qualifiers
  3. Matches by Name
@Resource
  1. Matches by Name
  2. Matches by Type
  3. Restricts by Qualifiers (ignored if match is found by name)
While it could be argued that ‘@Resource’ will perform faster by name than ‘@Autowired’ and ‘@Inject’ it would be negligible. This isn’t a sufficient reason to favor one syntax over the others. I do however favor the ‘@Resource’ annotation for it’s concise notation style.
@Resource(name="person")
@Autowired
@Qualifier("person")
@Inject
@Qualifier("person")
You may argue that they can be equal concise if you use the field name to identify the bean name.
@Resource
private Party person;
@Autowired
private Party person;
@Inject
private Party person;
True enough, but what happens if you want to refactor your code? By simply renaming the field name you’re no longer referring to the same bean. I recommend the following practices when wiring beans with annotations.
Spring Annotation Style Best Practices
  1. Explicitly name your component [@Component(“beanName”)]
  2. Use ‘@Resource’ with the ‘name’ attribute [@Resource(name=”beanName”)]
  3. Avoid ‘@Qualifier’ annotations unless you want to create a list of similar beans. For example you may want to mark a set of rules with a specific ‘@Qualifier’ annotation. This approach makes it simple to inject a group of rule classes into a list that can be used for processing data.
  4. Scan specific packages for components [context:component-scan base-package=”com.sourceallies.person”]. While this will result in more component-scan configurations it reduces the chance that you’ll add unnecessary components to your Spring context.
Following these guidelines will increase the readability and stability of your Spring annotation configurations.

Source: http://blogs.sourceallies.com/2011/08/spring-injection-with-resource-and-autowired/comment-page-2/#comment-55380

Friday, October 30, 2015

Run a program automatically when Windows starts

If you always open the same programs after starting your computer, such as a web browser or an e‑mail program, you might find it convenient to have them start automatically when you start Windows. Programs or shortcuts placed in the Startup folder will run whenever Windows starts.
  1. Click the Start button Picture of the Start button , click All Programs, right-click the Startup folder, and then click Open.
  2. Open the location that contains the item you want to create a shortcut to.
  3. Right-click the item, and then click Create Shortcut. The new shortcut appears in the same location as the original item.
  4. Drag the shortcut into the Startup folder.
The next time you start Windows, the program will run automatically.

Friday, October 23, 2015

Submitting a form with target set to a script-generated iframe on IE

Although AJAX techniques are now widespread among the web-developers community, there’s still something that can’t be done using pure AJAX techiques (whatever that means): file uploads. There’s no way to grab a file using JavaScript and send it to the server using an asynchronous request. I guess the main reason for this is security, you don’t want web sites to steal files from your home directory.
Anyway, people found a relatively popular way to do this. The ideia is having a hidden iframe on the page, and use that iframe as a target of the form where you have the reference to the file to upload. So, when the form submits, the result page will go to the hidden iframe, and the user won’t see a full page refresh. You still have to take care of some details, like hiding the form and showing a nice progress bar with the classic “Hold on, we are uploading” message, and polling for the content of the iframe to check is the file is still in its way, or if it arrived safely.
One nice detail is where do you actually have the hidden iframe. You could just put the iframe on the HTML code of your page, but IMO that’s ugly. The iframe is an artifact that is needed just to serve as a black hole for the form submittion result page. It doesn’t make sense to put it in your HTML code, as it hasn’t anything to do with the content. Also, it’s error prone: you may inadvertently delete it, causing the file upload to missbehave. Or you may need to change the iframe code and having it on HTML will force you to update on all the pages where you use it (and of course, you will forget one).
So, I believe the most elegant solution (if you can use the word “elegance” in the context of this major hack) is to generate the iframe using javascript. You may do this on the page load, when you create the form, whatever. Just do it before the user submits the file! :) Well, it’s easy, right? Something like this does the trick:

var objBody = document.getElementsByTagName("body").item(0);
var iframe = document.createElement('iframe');
iframe.id = 'fileUploaderEmptyHole';
iframe.name = 'fileUploaderEmptyHole';
iframe.width = 0;
iframe.height = 0;
iframe.marginHeight = 0;
iframe.marginWidth = 0;
objBody.insertBefore(iframe, objBody.firstChild);
That’s cool, right? Just run this and the iframe will be created. Submit the form, the result goes in the hidden iframe, everything works, we are done, let’s go home. Well… all true until you actually test it on Internet Explorer…
If you test this on IE, the result will be a new window being created when you submit, which is clearly not what you want. Well, I had a hard time finding the problem, so here goes: if you create the iframe using JavaScript, IE wont set it’s name. Yes, the “iframe.name = ‘fileUploaderEmptyHole’;” line will simply be ignored. It does nothing. So, as you don’t have any frame called ‘fileUploaderEmptyHole’, when you submit the form, it will create a new window named ‘fileUploaderEmptyHole’ and display the result on it.
The solution it to hack this even further. Specifically:
iframe = document.createElement('<iframe name="fileUploaderEmptyHole">');
Yeah! Now you’re thinking “WTF?”. Yes, yes, it’s true. This actually works on IE, with the expected (?) results. Well, you still have to support the other browsers, but you are lucky, as this will throw an exception on all the non-IE browsers. So, it’s just a matter of catching it, and running the decent version of the code:

var iframe;
try {
  iframe = document.createElement('<iframe name="fileUploaderEmptyHole">');
} catch (ex) {
  iframe = document.createElement('iframe');
}
iframe.id = 'fileUploaderEmptyHole';
iframe.name = 'fileUploaderEmptyHole';
iframe.width = 0;
iframe.height = 0;
iframe.marginHeight = 0;
iframe.marginWidth = 0;

This is why I love the Web. Or maybe not.
Original article: Terminal.app

Sunday, May 31, 2015

M3U Generator - Simple Java application for creating a m3u playlist file for folders

A simple Java application for creating a m3u playlist file for a folder and its subfolders. It's very simple to use.

1. Open jar file (Windows OS and JRE installation required).


2. Click "Select folder" and select the folder that contains media files (audio and video).

3. Click "Save to" and select the folder you wish to save m3u file to (default is the source folder).

4. Select generating option:
a. Folder only: only scan current selecting folder.
b. All subfolders: scan current selecting folder and all subfolders.
c. Sort all files by name: sort all files by name regardless of their path.
d. Sort by folder then name: sort files by name for every folder.


5. Click "Start". Wait until "Finished!" message is showed in log view.


6. M3U file is created in selected folder.



Download link: M3UGenerator