Tuesday, May 14, 2013
Tuesday, March 20, 2012
Một số cái mới trong Java 7
Dạo này lắm việc quá ko có gì note lại đây. Tình cờ hôm qua đọc thử sách trên Amazon Kindle thấy hay nên note lại đây cho mình và cho những người chưa biết.
Những thay đổi này thực sự có ích cho các bạn lập trình let's start.
1, Diamond Operator: Chắc hẳn bạn đã làm việc với kiểu Generics ví dụ bạn khai báo một map:
Nhưng với Java 7 bạn có thể khai báo như sau:
2, Sử dụng String trong câu lệnh switch: Bạn còn nhớ, trước đây khi dùng switch statements bạn bắt buộc phải sử dụng với kiểu dữ liệu đếm được thì nay với Java 7 bạn có thể làm việc đó với cả String, đỡ phải viết if/else nhiều. Sướng nhá!
Thay vì phải khai báo:
Giống như các Connections, Files, Input/OutStreams...
Bình thường bạn sẽ phải lập trình như sau:
Nay với Java 7 bạn ko cần phải đóng những gì đã mở :D, nhưng như thế nghe vẻ hơi mất đi tính logic của nó "Mở là phải đóng" nhỉ.
4, Khai báo number với gạch dưới: Đã bao giờ bạn khai báo tới hàng tỷ mà bạn phải đếm những số 0 trong đó, nó mà lớn hơn nữa thì cũng mệt phết. Với Java 7 bạn làm cho phép khai báo số với gạch dưới, vì thế việc "Đếm" rất đơn giản:
Bạn có thể khai báo như sau:
Nhưng bạn không thể convert nó sang số thập phân nữa đâu nhé :)
5, Multi-catch trong Exception: Trước đây với một phương thức bắn ra nhiều Exception, bạn cần khai báo nhiều block catch để bắt chúng. Ví dụ:
Còn một số phần mới về NIO 2.0 mình sẽ note lại vào ngày mai.
Những thay đổi này thực sự có ích cho các bạn lập trình let's start.
1, Diamond Operator: Chắc hẳn bạn đã làm việc với kiểu Generics ví dụ bạn khai báo một map:
Map <String, List<Trade>> trades = new TreeMap<String, List<Trade> >();Bạn có nhìn thấy thừa không, bạn cần khai báo loại map ở cả hai phía.
Nhưng với Java 7 bạn có thể khai báo như sau:
Map <String, List<Trade>> trades = new TreeMap<>();Trình biên dịch sẽ tự động hiểu bạn cần khai báo gì.
2, Sử dụng String trong câu lệnh switch: Bạn còn nhớ, trước đây khi dùng switch statements bạn bắt buộc phải sử dụng với kiểu dữ liệu đếm được thì nay với Java 7 bạn có thể làm việc đó với cả String, đỡ phải viết if/else nhiều. Sướng nhá!
Thay vì phải khai báo:
private void processTrade(Trade t) {
String status = t.getStatus();
if (status.equalsIgnoreCase(NEW)) {
newTrade(t);
} else if (status.equalsIgnoreCase(EXECUTE)) {
executeTrade(t);
} else if (status.equalsIgnoreCase(PENDING)) {
pendingTrade(t);
}
}
Với Java 7 bạn có thể:public void processTrade(Trade t) {
String status = t.getStatus();
switch (status) {
case NEW:
newTrade(t);
break;
case EXECUTE:
executeTrade(t);
break;
case PENDING:
pendingTrade(t);
break;
default:
break;
}
}
3, Tự động quản lý tài nguyên: Chắc chắn một điều tiên quyết mà ai cũng phải nhớ "Đã mở thì phải đóng" nghĩa là bạn mở một cái gì đó, khi làm xong bạn phải đóng lại.Giống như các Connections, Files, Input/OutStreams...
Bình thường bạn sẽ phải lập trình như sau:
public void oldTry() {
try {
fos = new FileOutputStream("tmp.txt");
dos = new DataOutputStream(fos);
dos.writeUTF("blog.vn-dev.net");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fos.close();
dos.close();
} catch (IOException e) {
// log the exception
}
}
}
Chú ý java vitual machine chỉ có thể tự quản lý những thằng inplement interface AutoCloseble thôi nhé :).Nay với Java 7 bạn ko cần phải đóng những gì đã mở :D, nhưng như thế nghe vẻ hơi mất đi tính logic của nó "Mở là phải đóng" nhỉ.
4, Khai báo number với gạch dưới: Đã bao giờ bạn khai báo tới hàng tỷ mà bạn phải đếm những số 0 trong đó, nó mà lớn hơn nữa thì cũng mệt phết. Với Java 7 bạn làm cho phép khai báo số với gạch dưới, vì thế việc "Đếm" rất đơn giản:
Bạn có thể khai báo như sau:
int thousand = 1_000; int million = 1_000_000; int one = 1;Với số nhị phân bạn cũng có thể sử dụng phương pháp này ví dụ: 0b1
Nhưng bạn không thể convert nó sang số thập phân nữa đâu nhé :)
5, Multi-catch trong Exception: Trước đây với một phương thức bắn ra nhiều Exception, bạn cần khai báo nhiều block catch để bắt chúng. Ví dụ:
public void oldMultiCatch() {
try {
methodThatThrowsThreeExceptions();
} catch (ExceptionOne e) {
// log and deal with ExceptionOne
} catch (ExceptionTwo e) {
// log and deal with ExceptionTwo
} catch (ExceptionThree e) {
// log and deal with ExceptionThree
}
}
Nhưng với Java 7 bạn có thể gộp các block catch kia lại giống như:public void oldMultiCatch() {
try {
methodThatThrowsThreeExceptions();
} catch (ExceptionOne | ExceptionTwo | ExceptionThree e) {
// log and deal with all Exception
}
}
Còn một số phần mới về NIO 2.0 mình sẽ note lại vào ngày mai.
Monday, November 7, 2011
Dấn thân vào con đường mã hóa, bảo mật.
Bắt đầu bằng nguyên lý Kerckhoff:
"Một hệ thống mã hóa phải an toàn ngay cả khi tất cả thông tin về hệ thống đó đều đã được công bố ra ngoài. Bí mật duy nhất của hệ thống là một khóa ngắn."
Mình sẽ tiếp loạt bài này khi học hỏi được cái j mới :)
"Một hệ thống mã hóa phải an toàn ngay cả khi tất cả thông tin về hệ thống đó đều đã được công bố ra ngoài. Bí mật duy nhất của hệ thống là một khóa ngắn."
Mình sẽ tiếp loạt bài này khi học hỏi được cái j mới :)
Tuesday, August 2, 2011
Xăng - nhạc chế của GS Xoay
Am----------------------------------------------Dm
Xăng , sao vừa tăng giá mấy hôm lại tăng
---------------------------------------------Am
Đang thời lạm phát khắp nơi đều căng
------------------------------------------ E
Phen này chết đói dân nhe cả răng
-------------------------------------- Am
Sao lại chơi ác với dân vậy xăng
Xăng bây giờ ta biết kiếm ăn làm sao
Xăng giờ tăng giá mỗi hôm một cao
Bao tiền trong ví mỗi hôm một down
Xăng lại chơi ác với dân vậy sao
----------Dm-------------- E --------------------Am
Giờ xe máy cất trong nhà mình đếch thèm đi
--------------- Dm --------------------------------------E
Đi bằng xe bus chi tiền cũng ít đỡ phải đau đít
------------ Dm ------------ E -------------------- Am
Giờ cưa gái, đến chơi nhà mình cứ tặng xăng
--------------------Dm--------------------------------------- E
Xăng giờ cao giá, lấy lòng ba má không cần hoa lá
(Lặp lại)
Xăng...hay là ta sẽ đi xe đạp chăng
Không chừng cơ bắp mấy hôm lại căng
Nghe đồn sang tháng giá xăng còn tăng
Nhưng mà tăng nữa cũng mặc mẹ xăng
Giờ xe máy cất trong nhà đếch thèm đi
Đi bằng xe buýt chi tiền cũng ít đỡ phải đau đít
Giờ cưa gái, đến chơi nhà mình cứ tặng xăng
Xăng giờ cao giá, lấy lòng ba má không cần hoa lá
Xăng...hay là ta sẽ đi xe đạp chăng
Không chừng cơ bắp mấy hôm lại căng
Nghe đồn sang tháng giá xăng còn tăng
Nhưng mà tăng nữa cũng mặc mẹ xăng.
Nghe đồn sang tháng giá xăng còn tăng
Nhưng mà tăng nữa cũng mặc mẹ xăng!
Xăng , sao vừa tăng giá mấy hôm lại tăng
---------------------------------------------Am
Đang thời lạm phát khắp nơi đều căng
------------------------------------------ E
Phen này chết đói dân nhe cả răng
-------------------------------------- Am
Sao lại chơi ác với dân vậy xăng
Xăng bây giờ ta biết kiếm ăn làm sao
Xăng giờ tăng giá mỗi hôm một cao
Bao tiền trong ví mỗi hôm một down
Xăng lại chơi ác với dân vậy sao
----------Dm-------------- E --------------------Am
Giờ xe máy cất trong nhà mình đếch thèm đi
--------------- Dm --------------------------------------E
Đi bằng xe bus chi tiền cũng ít đỡ phải đau đít
------------ Dm ------------ E -------------------- Am
Giờ cưa gái, đến chơi nhà mình cứ tặng xăng
--------------------Dm--------------------------------------- E
Xăng giờ cao giá, lấy lòng ba má không cần hoa lá
(Lặp lại)
Xăng...hay là ta sẽ đi xe đạp chăng
Không chừng cơ bắp mấy hôm lại căng
Nghe đồn sang tháng giá xăng còn tăng
Nhưng mà tăng nữa cũng mặc mẹ xăng
Giờ xe máy cất trong nhà đếch thèm đi
Đi bằng xe buýt chi tiền cũng ít đỡ phải đau đít
Giờ cưa gái, đến chơi nhà mình cứ tặng xăng
Xăng giờ cao giá, lấy lòng ba má không cần hoa lá
Xăng...hay là ta sẽ đi xe đạp chăng
Không chừng cơ bắp mấy hôm lại căng
Nghe đồn sang tháng giá xăng còn tăng
Nhưng mà tăng nữa cũng mặc mẹ xăng.
Nghe đồn sang tháng giá xăng còn tăng
Nhưng mà tăng nữa cũng mặc mẹ xăng!
Tuesday, July 12, 2011
Cài đặt Cygwin để lập trình C/C++ trên Eclipse
Trước hết bạn cần download Eclipse cho C/C++ về, giải nén ra.
http://www.eclipse.org/downloads/
Tiếp đến bạn tải Cygwin cho window về từ
http://cygwin.com/setup.exe
Bước tiếp theo bạn cài đặt Cygwin, chú ý một số gói quan trọng cần phải cài đặt.
1, binutils
2, gcc
3, gcc-core
4, gcc-g++
5, gcc-mingw-core
6, gcc-mingw-g++
7, make
8, gdb (Nếu bạn muốn hỗ trợ debug trên Eclipse)
Sau khi cài đặt xong, đưa thư mục bin trong thư mục cài đặt Cygwin vào PATH.
Kiểm tra các gói trên đã cài đặt đầy đủ chưa bằng lệnh 'cygcheck -c' trên command.
Bạn hãy mở Eclipse và tạo một project mới với lưu ý lựa chọn toolchain là Cygwin.
Chạy thử nào!!!!
Để cấu hình debug, bạn vào: Windows->Preference->C/C++ -> Debug -> Common Source Lookup
sau đó thêm Path mapping:
\cygdrive\c -> c:\
\cygdrive\d -> d:\
http://www.eclipse.org/downloads/
Tiếp đến bạn tải Cygwin cho window về từ
http://cygwin.com/setup.exe
Bước tiếp theo bạn cài đặt Cygwin, chú ý một số gói quan trọng cần phải cài đặt.
1, binutils
2, gcc
3, gcc-core
4, gcc-g++
5, gcc-mingw-core
6, gcc-mingw-g++
7, make
8, gdb (Nếu bạn muốn hỗ trợ debug trên Eclipse)
Sau khi cài đặt xong, đưa thư mục bin trong thư mục cài đặt Cygwin vào PATH.
Kiểm tra các gói trên đã cài đặt đầy đủ chưa bằng lệnh 'cygcheck -c' trên command.
Bạn hãy mở Eclipse và tạo một project mới với lưu ý lựa chọn toolchain là Cygwin.
Chạy thử nào!!!!
Để cấu hình debug, bạn vào: Windows->Preference->C/C++ -> Debug -> Common Source Lookup
sau đó thêm Path mapping:
\cygdrive\c -> c:\
\cygdrive\d -> d:\
Friday, July 8, 2011
Vết chân tròn trên cát
Vết chân tròn (Dm) vẫn đi về© trên con đường mòn(Am)
cát trắng quê tôi(Am)
Anh thương binh(G) vẫn đến trường làng(Dm) vẫn ôm đàn(Em) dạy các em thơ(Em) bài hát quê hương(Am).
Bài hát(Am) có ngọn núi quê anh(Dm) xa a ... vời (G)
Bài hát(Am) có đồng lúa mênh mang(Dm) câu .. hò(G)
Bài hát© có người lính đã hy sinh(Em) âm thầm(Dm)
Cho hôm nay(F) những gót chân son(G) vui quanh(Em)dấu chân tròn (Am).
Bài hát có trận đấu không quên bên đồi
Bài hát có người lính biên cương thương mẹ
Bài hát có ngọn gió cuốn bay theo dấu chân tròn (Như trên).
Để lại(Em) một bài ca(F)trên cát trắng bao la (Am).
Vết chân tròn(Dm) vẫn in hình (C) trên con đường mòn(Am) cát trắng quê tôi (Am).
Như bài ca(G) anh viết trong thầm lặng (C) trên bờ cát không lời(Dm). Cứ hát mãi trong tôi (Em)
Hát mãi(Dm) trong tôi (C) ôi bài ca cuộc đời (Am)cháy mãi(Em)trong tôi (Am)đốt mãi(Em)trong tôi (Am)
cát trắng quê tôi(Am)
Anh thương binh(G) vẫn đến trường làng(Dm) vẫn ôm đàn(Em) dạy các em thơ(Em) bài hát quê hương(Am).
Bài hát(Am) có ngọn núi quê anh(Dm) xa a ... vời (G)
Bài hát(Am) có đồng lúa mênh mang(Dm) câu .. hò(G)
Bài hát© có người lính đã hy sinh(Em) âm thầm(Dm)
Cho hôm nay(F) những gót chân son(G) vui quanh(Em)dấu chân tròn (Am).
Bài hát có trận đấu không quên bên đồi
Bài hát có người lính biên cương thương mẹ
Bài hát có ngọn gió cuốn bay theo dấu chân tròn (Như trên).
Để lại(Em) một bài ca(F)trên cát trắng bao la (Am).
Vết chân tròn(Dm) vẫn in hình (C) trên con đường mòn(Am) cát trắng quê tôi (Am).
Như bài ca(G) anh viết trong thầm lặng (C) trên bờ cát không lời(Dm). Cứ hát mãi trong tôi (Em)
Hát mãi(Dm) trong tôi (C) ôi bài ca cuộc đời (Am)cháy mãi(Em)trong tôi (Am)đốt mãi(Em)trong tôi (Am)
Mắt đen
Sâu trong đáy(Em9) mắt em nói gì(D) đôi mắt huyền(Em)
Không là cao(Em) xa ko thật gần(D) nhưng chứa chan(Em)
(G)_ Khi anh mất lối trên con đường xa(Am)
Trong đôi mắt em ấm lửa soi lối về(Em)
Khi anh vấp ngã(G) mắt em luôn dịu êm(Am)
Rồi đốt cháy lên(B7) cho niềm kiêu hãnh tới(Em)
Muốn được bên(Em) em để đắm chìm(D) trong mắt huyền(Em)
Đến từ đáy(Em) mắt đi cao vời(D) đôi mắt ơi(Em)
(G)_Ngủ vùi khung tranh trắng trơn ngày qua(Am)
Bao nhiêu ước mong(D) sao còn như quá xa(Em)
Màu nào ước muốn(G) màu nào đầy vơi(Am)
Màu nào cháy lên(B7) như lời đôi mắt nói(Em)
(C9)_Mắt đen đôi khi(D) lung linh hạt tinh khôi(Em)
(C9)Mắt đen ơi trái(D) tim anh thuộc về em(Em)
"(G)_Khi anh mất lối trên con đường xa(Am)
Trong đôi mắt em(D) ấm lửa soi lối về(Em)
Khi anh vấp ngã(G) mắt em luôn dịu êm("Am)
Rồi đốt cháy lên(B7) cho niềm kiêu hãnh tới(Em)
(C9)_Mắt đen đôi khi(D) lung linh hạt tinh khôi(Em)
(C9)_Mắt đen ơi trái(D) tim anh thuộc về em(Em)
(C9)_Mắt đen hãy khát(D) khao cháy một lần thôi(Em)
(C9)Mắt đen hỡi(D).... thắp lên ngọn lửa đam mê(Em)
Em)Sâu trong đáy mắt, em nói gì đôi mắt huyền (Em)
Không là cao xa,không thật gần nhưng chứa chan
(G)Khi anh mất lối trên con đường xa (Am)
Trong đôi mắt em (D)ấm lửa soi đường về (Em)
(G)Khi anh vấp ngã,mắt em luôn dịu êm,(Am)
Rồi đốt cháy lên(G) cho niềm kiêu hãnh ...tới. (Em)
Muốn được bên em để đắm chìm trong mắt huyền
Đến từ đáy mắt,đi xa vời đôi mắt ơi
Ngủ vùi khung tranh trắng trơn ngày qua
Bao nhiêu ước mong sao còn như quá xa?
Màu nào ước muốn? Màu nào đầy vơi?
Lời nào cháy lên như lời đôi mắt.... nói!
Ref:
(G)Mắt đen đôi khi (D)lung linh hạt tinh khôi (Em)
(G)Mắt đen ôi trái tim(D) anh thuộc về em (Em)
Không là cao(Em) xa ko thật gần(D) nhưng chứa chan(Em)
(G)_ Khi anh mất lối trên con đường xa(Am)
Trong đôi mắt em ấm lửa soi lối về(Em)
Khi anh vấp ngã(G) mắt em luôn dịu êm(Am)
Rồi đốt cháy lên(B7) cho niềm kiêu hãnh tới(Em)
Muốn được bên(Em) em để đắm chìm(D) trong mắt huyền(Em)
Đến từ đáy(Em) mắt đi cao vời(D) đôi mắt ơi(Em)
(G)_Ngủ vùi khung tranh trắng trơn ngày qua(Am)
Bao nhiêu ước mong(D) sao còn như quá xa(Em)
Màu nào ước muốn(G) màu nào đầy vơi(Am)
Màu nào cháy lên(B7) như lời đôi mắt nói(Em)
(C9)_Mắt đen đôi khi(D) lung linh hạt tinh khôi(Em)
(C9)Mắt đen ơi trái(D) tim anh thuộc về em(Em)
"(G)_Khi anh mất lối trên con đường xa(Am)
Trong đôi mắt em(D) ấm lửa soi lối về(Em)
Khi anh vấp ngã(G) mắt em luôn dịu êm("Am)
Rồi đốt cháy lên(B7) cho niềm kiêu hãnh tới(Em)
(C9)_Mắt đen đôi khi(D) lung linh hạt tinh khôi(Em)
(C9)_Mắt đen ơi trái(D) tim anh thuộc về em(Em)
(C9)_Mắt đen hãy khát(D) khao cháy một lần thôi(Em)
(C9)Mắt đen hỡi(D).... thắp lên ngọn lửa đam mê(Em)
Em)Sâu trong đáy mắt, em nói gì đôi mắt huyền (Em)
Không là cao xa,không thật gần nhưng chứa chan
(G)Khi anh mất lối trên con đường xa (Am)
Trong đôi mắt em (D)ấm lửa soi đường về (Em)
(G)Khi anh vấp ngã,mắt em luôn dịu êm,(Am)
Rồi đốt cháy lên(G) cho niềm kiêu hãnh ...tới. (Em)
Muốn được bên em để đắm chìm trong mắt huyền
Đến từ đáy mắt,đi xa vời đôi mắt ơi
Ngủ vùi khung tranh trắng trơn ngày qua
Bao nhiêu ước mong sao còn như quá xa?
Màu nào ước muốn? Màu nào đầy vơi?
Lời nào cháy lên như lời đôi mắt.... nói!
Ref:
(G)Mắt đen đôi khi (D)lung linh hạt tinh khôi (Em)
(G)Mắt đen ôi trái tim(D) anh thuộc về em (Em)
Ước gì
Em đã sống (G) những đêm trời có (B7) ánh trăng chiếu vàng (Em)
Em đã sống (C ) những đêm ngoài kia (C7) biển ru bờ cát (B7)!
Ước (Em) gì anh ở đây (Bm/D*) giờ này ,
Ước (C ) gì anh cùng em (G) chuyện trò ,
Cùng nhau nghe sóng (C ) xô ghềnh đá ngàn câu hát yên (D) bình .
Em đã biết cô đơn là thế mỗi khi cách xa anh.
Từng đàn chim cuối chân trời biếc tìm nơi bình yên
Ước gì anh ở đây giờ này , ước gì em được nghe giọng cười ,
Và hơi ấm đã bao ngày wa mình luôn sát vai kề !
(C ) Em xa anh đã bao (G/D) ngày rồi nghe như (C9/D**) tháng năm ngừng trôi (D7)
(C ) Đi xa em nhớ anh (G/D) thật nhiều , này người (C9***)
Người yêu em hỡi (D7) !
Uớc (G) gì em đã ko (D) lỡ lời ,
Ước (Em) gì ta đừng có (Bm/D) giận hờn .
Để giờ đây (C ) cô đơn vắng tênh (D7) , đời em đã vắng (G) anh rồi
Ước gì cho thời gian trở lại , ước gì em gặp anh một lần ,
Em sẽ nói (C ) em luôn nhớ anh (D7), và em chỉ có (D#7) anh thôi
Em đã sống (C ) những đêm ngoài kia (C7) biển ru bờ cát (B7)!
Ước (Em) gì anh ở đây (Bm/D*) giờ này ,
Ước (C ) gì anh cùng em (G) chuyện trò ,
Cùng nhau nghe sóng (C ) xô ghềnh đá ngàn câu hát yên (D) bình .
Em đã biết cô đơn là thế mỗi khi cách xa anh.
Từng đàn chim cuối chân trời biếc tìm nơi bình yên
Ước gì anh ở đây giờ này , ước gì em được nghe giọng cười ,
Và hơi ấm đã bao ngày wa mình luôn sát vai kề !
(C ) Em xa anh đã bao (G/D) ngày rồi nghe như (C9/D**) tháng năm ngừng trôi (D7)
(C ) Đi xa em nhớ anh (G/D) thật nhiều , này người (C9***)
Người yêu em hỡi (D7) !
Uớc (G) gì em đã ko (D) lỡ lời ,
Ước (Em) gì ta đừng có (Bm/D) giận hờn .
Để giờ đây (C ) cô đơn vắng tênh (D7) , đời em đã vắng (G) anh rồi
Ước gì cho thời gian trở lại , ước gì em gặp anh một lần ,
Em sẽ nói (C ) em luôn nhớ anh (D7), và em chỉ có (D#7) anh thôi
Hà nội ngày trở về
Hà Nội ơi (Am) mỗi khi lòng xác xơ (Dm)
Tôi vội vã trở về (G)
Lấy cho mình (Am) dù chỉ là chút bóng đêm (F) trên đường phố quen
Dù chỉ là(Em) 1 chiều hương giăng lối cũ (Am)
Tôi bồi hồi khi chạm bóng cửa Ô (Dm)
Như ngày xưa (G) mỗi lần chạm vai gầy áo mẹ (Am)
Ôi nỗi nhớ (C )muôn đời vẫn thế (Dm)
Như giòng sông Hồng (G )cuộn đỏ mãi trong tôi (Am)
Vội vã trở về(E7) vội vã ra đi (Dm)
Chẳng thể nào qua(G ) hết từng con phố (Am)
Nhưng còn đó © mùa thu,(Em) mùa thu đầy gió ©
Và rêu phong(E7) bên những gốc cây già (Am)
Vội vã trở về (E7) cùng tháng năm xưa (Dm)
Sau những con đường(Em) dầu dãi nắng mưa (Am)
Bên quán ngọ © em buồn (Am) nghe lá trút ©
Chiều mưa sa (Em) giăng kín phố dài (Am)
Hà Nội ơi,(Am) mỗi khi lòng xác xơ(Dm)
Tôi vội vã trở về(G) để nghe tim minh (Em) rưng rưng trong nước hồ thu(Am)
Tôi vội vã trở về (G)
Lấy cho mình (Am) dù chỉ là chút bóng đêm (F) trên đường phố quen
Dù chỉ là(Em) 1 chiều hương giăng lối cũ (Am)
Tôi bồi hồi khi chạm bóng cửa Ô (Dm)
Như ngày xưa (G) mỗi lần chạm vai gầy áo mẹ (Am)
Ôi nỗi nhớ (C )muôn đời vẫn thế (Dm)
Như giòng sông Hồng (G )cuộn đỏ mãi trong tôi (Am)
Vội vã trở về(E7) vội vã ra đi (Dm)
Chẳng thể nào qua(G ) hết từng con phố (Am)
Nhưng còn đó © mùa thu,(Em) mùa thu đầy gió ©
Và rêu phong(E7) bên những gốc cây già (Am)
Vội vã trở về (E7) cùng tháng năm xưa (Dm)
Sau những con đường(Em) dầu dãi nắng mưa (Am)
Bên quán ngọ © em buồn (Am) nghe lá trút ©
Chiều mưa sa (Em) giăng kín phố dài (Am)
Hà Nội ơi,(Am) mỗi khi lòng xác xơ(Dm)
Tôi vội vã trở về(G) để nghe tim minh (Em) rưng rưng trong nước hồ thu(Am)
Wednesday, June 8, 2011
Public ứng dụng của bạn lên Android Market.
Bạn đã hoàn thành việc phát triển ứng dụng của bạn sau 1 tuần (có thể ít hơn hoặc nhiều hơn :D) làm việc chăm chỉ và bạn muốn phát hành ý tưởng của bạn cho cả thế giới biết. Bài này tôi sẽ chỉ bạn cách làm điều đó.
1, Bạn đã test kỹ càng ứng dụng của bạn một cách rộng rãi?
Nếu câu trả lời là chưa thì bạn hãy quay trở lại với việc test cho thật kỹ càng, không chỉ trên emulator, bạn cần kiểm tra chúng trong thực tế, trên các thiết bị thật. Nếu có điều kiện, bạn hãy kiểm tra trên các thiết bị khác nhau, của các nhà cung cấp khác nhau, trên các phiên bản OS khác nhau.
Một lỗi nhỏ trong code của bạn có thể làm giảm doanh số bán hàng và danh tiếng của bạn.
2, Ứng dụng của bạn có hiệu năng tốt không?
Hiệu năng là rất quan trọng, đặc biệt nếu ứng dụng của bạn là 1 game. Nếu ứng dụng của bạn không thể đáp ứng trong một trường hợp nào đó, hãy xem lại và tối ưu hóa chúng nếu có thể.
3 Ứng dụng của bạn có tương thích với nhiều phiên bản khác nhau của hệ điều hành?
Hãy nhìn vào biểu đồ bên dưới để có yêu cầu min SDK phù hợp với ứng dụng của bạn.
1, Yêu cầu các quyền cần thiết.
Hãy chắc chắn rằng bạn đã yêu cầu các quyền cần thiết trong file cấu hình AndroidManifest.xml. Nếu không ứng dụng của bạn có thể chạy không thật sự suôn sẻ. Ví dụ:
2, Tên và icon của ứng dụng.
Hãy chọn một tên và icon thật đặc biệt cho ứng dụng của bạn, bạn có thể cấu hình nó trong file cấu hình AndroidManifest.xml. Ví dụ:
3, Cấu hình version của ứng dụng.
Hãy cấu hình version ứng dụng của bạn nhằm việc update sau này. Thường nó được cấu hình bằng số nguyên và bắt đầu bằng 1, nhưng bạn có thể tùy biến theo ý bạn có thể là 1.0.0b1 hoặc 2.4.13... Ví dụ:
4, Cấu hình phiên bản hệ điều hành tương thích.
Dựa vào API bạn sử dụng để phát triển ứng dụng, bạn hãy cấu hình phiên bản hệ điều hành tương thích bằng các tham số.
android:minSdkVersion: Phiên bản thấp nhất.
android:targetSdkVersion: Bạn phát triển ứng dụng cho phiên bản này.
android:maxSdkVersion: Phiên bản cao nhất có thể chạy ứng dụng, cái này nên bỏ qua.
5, Xóa bỏ file và log.
Rà soát toàn bộ ứng dụng của bạn, hãy xóa bỏ những file không cần thiết, lời gọi log nhằm debug dữ liệu cá nhân, các file không phải là file resource...
6, Export ứng dụng của bạn với certificate.
Đây là bước quan trọng bới ứng dụng của bạn được đảm bảo ứng dụng của bạn đã được xác thực, vì thế bạn nên tạo một mật khẩu đủ mạnh cho private key của bạn và hãy giữ chúng cẩn thận.
Nếu bạn dùng Eclipse IDE, bạn có thể sử dụng Export Wizard trong eclipse để làm điều này.
a, Bạn chọn File > Export
b, Trong cây thư mục bạn chọn Android -> Export Android Application.
c, Hoàn thành các bước wizard (Bạn có thể xem hình vẽ).
Cách khác bạn có thể sử dụng các tools sau keytool, jarsigner, zipalign...
a, Đăng ký dưới một Publisher và cấu hình các thông tin cá nhân của bạn http://market.android.com/publish.
b, Đọc và đồng ý các điều khoản của Android Market http://www.android.com/us/developer-distribution-agreement.html.
c, Trả phí là $25 USD qua Google Checkout.
2, Upload ứng dụng của bạn.
Đăng nhập vào tài khoản publisher của bạn, chọn "Upload an Application" điền các thông tin trên form, nếu ứng dụng của bạn có phí, bạn cần đăng ký Google Checkout Merchant. Cuối cùng chọn "Publish" để đăng ứng dụng của bạn.
OK rồi! cảm giác vui vui khi upload ứng dụng đầu tiên của mình lên android market nào... :D
Trước hết, bạn phải trả lời một số câu hỏi sau:
1, Bạn đã test kỹ càng ứng dụng của bạn một cách rộng rãi?
Nếu câu trả lời là chưa thì bạn hãy quay trở lại với việc test cho thật kỹ càng, không chỉ trên emulator, bạn cần kiểm tra chúng trong thực tế, trên các thiết bị thật. Nếu có điều kiện, bạn hãy kiểm tra trên các thiết bị khác nhau, của các nhà cung cấp khác nhau, trên các phiên bản OS khác nhau.
Một lỗi nhỏ trong code của bạn có thể làm giảm doanh số bán hàng và danh tiếng của bạn.
2, Ứng dụng của bạn có hiệu năng tốt không?
Hiệu năng là rất quan trọng, đặc biệt nếu ứng dụng của bạn là 1 game. Nếu ứng dụng của bạn không thể đáp ứng trong một trường hợp nào đó, hãy xem lại và tối ưu hóa chúng nếu có thể.
3 Ứng dụng của bạn có tương thích với nhiều phiên bản khác nhau của hệ điều hành?
Hãy nhìn vào biểu đồ bên dưới để có yêu cầu min SDK phù hợp với ứng dụng của bạn.
Tiếp theo chúng ta phải chuẩn bị cho ứng dụng của mình sẵn sàng lên Android Market.
1, Yêu cầu các quyền cần thiết.
Hãy chắc chắn rằng bạn đã yêu cầu các quyền cần thiết trong file cấu hình AndroidManifest.xml. Nếu không ứng dụng của bạn có thể chạy không thật sự suôn sẻ. Ví dụ:
2, Tên và icon của ứng dụng.
Hãy chọn một tên và icon thật đặc biệt cho ứng dụng của bạn, bạn có thể cấu hình nó trong file cấu hình AndroidManifest.xml. Ví dụ:
3, Cấu hình version của ứng dụng.
Hãy cấu hình version ứng dụng của bạn nhằm việc update sau này. Thường nó được cấu hình bằng số nguyên và bắt đầu bằng 1, nhưng bạn có thể tùy biến theo ý bạn có thể là 1.0.0b1 hoặc 2.4.13... Ví dụ:
4, Cấu hình phiên bản hệ điều hành tương thích.
Dựa vào API bạn sử dụng để phát triển ứng dụng, bạn hãy cấu hình phiên bản hệ điều hành tương thích bằng các tham số.
android:minSdkVersion: Phiên bản thấp nhất.
android:targetSdkVersion: Bạn phát triển ứng dụng cho phiên bản này.
android:maxSdkVersion: Phiên bản cao nhất có thể chạy ứng dụng, cái này nên bỏ qua.
5, Xóa bỏ file và log.
Rà soát toàn bộ ứng dụng của bạn, hãy xóa bỏ những file không cần thiết, lời gọi log nhằm debug dữ liệu cá nhân, các file không phải là file resource...
6, Export ứng dụng của bạn với certificate.
Đây là bước quan trọng bới ứng dụng của bạn được đảm bảo ứng dụng của bạn đã được xác thực, vì thế bạn nên tạo một mật khẩu đủ mạnh cho private key của bạn và hãy giữ chúng cẩn thận.
Nếu bạn dùng Eclipse IDE, bạn có thể sử dụng Export Wizard trong eclipse để làm điều này.
a, Bạn chọn File > Export
b, Trong cây thư mục bạn chọn Android -> Export Android Application.
c, Hoàn thành các bước wizard (Bạn có thể xem hình vẽ).
Cách khác bạn có thể sử dụng các tools sau keytool, jarsigner, zipalign...
Bước cuối cùng là đăng ký làm một Market Publisher.
1, Đăng kýa, Đăng ký dưới một Publisher và cấu hình các thông tin cá nhân của bạn http://market.android.com/publish.
b, Đọc và đồng ý các điều khoản của Android Market http://www.android.com/us/developer-distribution-agreement.html.
c, Trả phí là $25 USD qua Google Checkout.
2, Upload ứng dụng của bạn.
Đăng nhập vào tài khoản publisher của bạn, chọn "Upload an Application" điền các thông tin trên form, nếu ứng dụng của bạn có phí, bạn cần đăng ký Google Checkout Merchant. Cuối cùng chọn "Publish" để đăng ứng dụng của bạn.
OK rồi! cảm giác vui vui khi upload ứng dụng đầu tiên của mình lên android market nào... :D
Saturday, May 28, 2011
Google IO 2011
Rất nhiều kiến thức được trình bày tại google io 2011, các bạn có thể vào đây để xem các video:
http://www.youtube.com/user/GoogleDevelopers
http://www.youtube.com/user/GoogleDevelopers
Thursday, May 12, 2011
Bắt đầu tập lại guitar
Hôm nay có một niềm vui nho nhỏ, quyết định tập guitar để sau này dùng. Lâu ngày cầm lại cây đàn đau hết tay nhưng dù sao mình cũng sắp đệm được bài "nhỏ ơi" rồi.
Mình giới thiệu gam bài này mình sưu tầm được:
Lần đầu(Dm) ta gặp nhỏ( C), trong nắng(Am) chiều bay bay(Dm)
Ngập ngừng(Dm) ta hỏi nhỏ( C), nhỏ bảo( C) nhỏ không tên(F)
Ừ thì(Dm) nhỏ không tên( C), bây giờ( C) quen nhé nhỏ(Am), nhỏ ơi(Dm)
(Các đoạn sau thì tương tự.)
Lần này ta gặp nhỏ, trong nắng chiều bay bay
Ngập ngừng ta hỏi nhỏ, nhỏ bảo nhỏ chưa yêu
Ừ thì nhỏ chưa yêu, bây giờ yêu nhé nhỏ, nhỏ ơi
Lần này(Dm), nhỏ quay đi( C), không thèm( C) nhìn ta nữa(Am)
Giọt sầu(Dm) rơi một mình( C), chỉ còn(Dm) ta một mình( C), nhỏ ơi (Dm)
Còn j đâu hỡi người, trong nắng chiều phôi phai
Kỷ niệm ta cùng nhỏ, giờ chỉ là hư vô
Nụ cười là hư vô, xa rồi vẫn nhớ hoài, nhỏ ơi.
Tình cờ ta gặp nhỏ, trong nắng vàng ban mai
thẹn thùng ta hỏi nhỏ, nhỏ bảo khờ ghê đi
Ừ thì khờ ghê đi, thương rồi sao chẳng hiểu, nhỏ ơi!
Like it!
Mình giới thiệu gam bài này mình sưu tầm được:
Lần đầu(Dm) ta gặp nhỏ( C), trong nắng(Am) chiều bay bay(Dm)
Ngập ngừng(Dm) ta hỏi nhỏ( C), nhỏ bảo( C) nhỏ không tên(F)
Ừ thì(Dm) nhỏ không tên( C), bây giờ( C) quen nhé nhỏ(Am), nhỏ ơi(Dm)
(Các đoạn sau thì tương tự.)
Lần này ta gặp nhỏ, trong nắng chiều bay bay
Ngập ngừng ta hỏi nhỏ, nhỏ bảo nhỏ chưa yêu
Ừ thì nhỏ chưa yêu, bây giờ yêu nhé nhỏ, nhỏ ơi
Lần này(Dm), nhỏ quay đi( C), không thèm( C) nhìn ta nữa(Am)
Giọt sầu(Dm) rơi một mình( C), chỉ còn(Dm) ta một mình( C), nhỏ ơi (Dm)
Còn j đâu hỡi người, trong nắng chiều phôi phai
Kỷ niệm ta cùng nhỏ, giờ chỉ là hư vô
Nụ cười là hư vô, xa rồi vẫn nhớ hoài, nhỏ ơi.
Tình cờ ta gặp nhỏ, trong nắng vàng ban mai
thẹn thùng ta hỏi nhỏ, nhỏ bảo khờ ghê đi
Ừ thì khờ ghê đi, thương rồi sao chẳng hiểu, nhỏ ơi!
Like it!
Chỉ dẫn lập trình game 3D trên Android (P6)
Xin lỗi các bạn về sự chậm chễ này, dạo này bận quá nên ko có time để post bài nữa. Nhưng mình sẽ tiếp tục loạt bài viết này khi rảnh.
Bài trước mình đã giới thiệu về Java Native Interface. Nhưng hình như các bạn không thể thực hành được bài này.
Và có những email gửi về cho mình nhờ chỉ dẫn cách chạy JNI như thế nào, các bạn đó chạy ví dụ của google mà không được.
Hôm nay tôi sẽ chỉ các bạn cách chạy native như thế nào.
Như các bạn đã biết lập trình game chúng ta cần tận dụng sức mạnh của phần cứng và Java Native Interface là một cách tuyệt vời để thực hiện nó.
Vậy Java Native Interface làm gì?
Có thể các bạn đã biết thực ra Java Native Interface cho phép chúng ta gọi hàm từ thư viện C/C++ khi đó ta có thể giao tiếp nhiều hơn với phần cứng.
Ok, vậy ta có thể hình dung ta cần j rồi, hiểu về C/C++ (Hiểu sâu nhé :D). Một trình biên dịch trên Window (Những ai dùng Linux thì chuyên gia rồi chắc mình không phải hướng dẫn nữa, và mình cũng khuyên các bạn nên chuyển qua Linux (Ubuntu) mà dùng).
Ở đây mình dùng http://www.cygwin.com/. Bạn phải download Android NDK về nhé http://developer.android.com/sdk/ndk/index.html
Eclipse chắc bạn có rồi :D.
Bắt đầu nhé:
Cài đặt cygwin nhé.
Giải nén Android NDK nhé.
Bây giờ ta sẽ chạy một ví dụ của google viết sẵn để hiểu cách làm việc của nó.
Trong thư mục Android NDK bạn vừa giải nén ra có thư mục sample bạn nhìn thấy một số ví dụ ở đây.
Trên eclipse, bạn tạo một project android mới từ source này, ở đây chúng ta chọn hello-jni nhé.
Giờ chúng ta đã có project trên eclipse rồi.
Trên command của windown (cmd), bạn cd tới thư mục của project trên ...\samples\hello-jni
Chạy command:
Nhớ rằng trước đó đã path cho android trong thư mục ...android-sdk-windows\tools và ...android-sdk-windows\platform-tools
Và path của ...cygwin\bin nữa nhé.
Giờ chúng ta bắt đầu build native code sử dụng command ndk-build.
Hãy chắc chắn rằng bạn đang ở ...\samples\hello-jni như vậy bạn sẽ không phải gõ đường dẫn này nhiều nữa.
Trên command của window bạn chạy ash (Hãy chắc chắn rằng bạn đã set path cho ...cygwin\bin).
Lúc này bạn đang chạy SHELL trên môi trường GNU/Linux chứ không phải command như ở window nữa.
Chạy command su
Của mình là su tannm
Khi đó bạn sẽ nhìn thấy đường dẫn của bạn giống như:
TanNM@TanNM-PC /cygdrive/e/STUDY/android/android-ndk-r5b/samples/hello-jni
Ngon rồi đấy!
Tiếp theo bạn hãy chạy lệnh:
/cygdrive/e/STUDY/android/android-ndk-r5b/ndk-build
Khi đó output sẽ giống như:
Gdbserver : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver
Gdbsetup : libs/armeabi/gdb.setup
Compile thumb : hello-jni <= hello-jni.c SharedLibrary : libhello-jni.so Install : libhello-jni.so => libs/armeabi/libhello-jni.so
Quay lại eclipse refresh lại project và chạy.
OK chứ?
Bài trước mình đã giới thiệu về Java Native Interface. Nhưng hình như các bạn không thể thực hành được bài này.
Và có những email gửi về cho mình nhờ chỉ dẫn cách chạy JNI như thế nào, các bạn đó chạy ví dụ của google mà không được.
Hôm nay tôi sẽ chỉ các bạn cách chạy native như thế nào.
Như các bạn đã biết lập trình game chúng ta cần tận dụng sức mạnh của phần cứng và Java Native Interface là một cách tuyệt vời để thực hiện nó.
Vậy Java Native Interface làm gì?
Có thể các bạn đã biết thực ra Java Native Interface cho phép chúng ta gọi hàm từ thư viện C/C++ khi đó ta có thể giao tiếp nhiều hơn với phần cứng.
Ok, vậy ta có thể hình dung ta cần j rồi, hiểu về C/C++ (Hiểu sâu nhé :D). Một trình biên dịch trên Window (Những ai dùng Linux thì chuyên gia rồi chắc mình không phải hướng dẫn nữa, và mình cũng khuyên các bạn nên chuyển qua Linux (Ubuntu) mà dùng).
Ở đây mình dùng http://www.cygwin.com/. Bạn phải download Android NDK về nhé http://developer.android.com/sdk/ndk/index.html
Eclipse chắc bạn có rồi :D.
Bắt đầu nhé:
Cài đặt cygwin nhé.
Giải nén Android NDK nhé.
Bây giờ ta sẽ chạy một ví dụ của google viết sẵn để hiểu cách làm việc của nó.
Trong thư mục Android NDK bạn vừa giải nén ra có thư mục sample bạn nhìn thấy một số ví dụ ở đây.
Trên eclipse, bạn tạo một project android mới từ source này, ở đây chúng ta chọn hello-jni nhé.
Giờ chúng ta đã có project trên eclipse rồi.
Trên command của windown (cmd), bạn cd tới thư mục của project trên ...
Chạy command:
android update project -p . -s
Nhớ rằng trước đó đã path cho android trong thư mục ...android-sdk-windows\tools và ...android-sdk-windows\platform-tools
Và path của ...cygwin\bin nữa nhé.
Giờ chúng ta bắt đầu build native code sử dụng command ndk-build.
Hãy chắc chắn rằng bạn đang ở ...
Trên command của window bạn chạy ash (Hãy chắc chắn rằng bạn đã set path cho ...cygwin\bin).
Lúc này bạn đang chạy SHELL trên môi trường GNU/Linux chứ không phải command như ở window nữa.
Chạy command su
Của mình là su tannm
Khi đó bạn sẽ nhìn thấy đường dẫn của bạn giống như:
TanNM@TanNM-PC /cygdrive/e/STUDY/android/android-ndk-r5b/samples/hello-jni
Ngon rồi đấy!
Tiếp theo bạn hãy chạy lệnh:
/cygdrive/e/STUDY/android/android-ndk-r5b/ndk-build
Khi đó output sẽ giống như:
Gdbserver : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver
Gdbsetup : libs/armeabi/gdb.setup
Compile thumb : hello-jni <= hello-jni.c SharedLibrary : libhello-jni.so Install : libhello-jni.so => libs/armeabi/libhello-jni.so
Quay lại eclipse refresh lại project và chạy.
OK chứ?
Friday, March 18, 2011
Câu lệnh xem size và free của table space trong oracle.
select b.tablespace_name, tbs_size SizeMb, a.free_space FreeMb
from (select tablespace_name, round(sum(bytes)/1024/1024 ,2) as free_space
from dba_free_space
group by tablespace_name) a,
(select tablespace_name, sum(bytes)/1024/1024 as tbs_size
from dba_data_files
group by tablespace_name) b
where a.tablespace_name(+)=b.tablespace_name;
Thursday, March 10, 2011
Ra mắt kho game, ứng dụng cho android.
Sau một thời gian phát triển hiện tại mình đã cho ra phiên bản "Release 1.0" kho game và ứng dụng cho android. Hi vọng được sự đón nhận của mọi người.
http://ungdungandroid.net
http://ungdungandroid.net
Tuesday, March 1, 2011
Fix GPS cho Samsung galaxy
Loay hoay mãi mới fix được GPS cho chú Samsung galaxy của mình, thực chất chỉ là thay đổi file cấu hình. Cách làm như sau:
Cấu hình mặc định của Nó ban đầu là:
1, Settings -> Parameter Settings -> Address -> Server Type: UMTS SLP
2, Settings -> Parameter Settings -> Position mode: option2
3, Settings -> Fix Request Settings -> Session Operation: MS-based
4, Settings -> Fix Request Settings -> Server Option: Default
5, gpsOne XTRA -> Xtra Enable: Disable
1, Bấm *#*#1472365#*#*. Đây là mã để vào menu cấu hình GPS. Trong menu đó bạn lần lượt chọn thay đổi một số giá trị bên dưới.
2, Settings -> Parameter Settings -> Address -> Server Type: 1x MPC
3, Settings -> Parameter Settings -> Position mode: option3
4, Settings -> Fix Request Settings -> Session Operation: Standalone
5, Settings -> Fix Request Settings -> Server Option: Local
6, gpsOne XTRA -> Xtra Enable: Enable
Hehehe... Cuối cùng cũng có GPS để sài. :D
Cấu hình mặc định của Nó ban đầu là:
1, Settings -> Parameter Settings -> Address -> Server Type: UMTS SLP
2, Settings -> Parameter Settings -> Position mode: option2
3, Settings -> Fix Request Settings -> Session Operation: MS-based
4, Settings -> Fix Request Settings -> Server Option: Default
5, gpsOne XTRA -> Xtra Enable: Disable
1, Bấm *#*#1472365#*#*. Đây là mã để vào menu cấu hình GPS. Trong menu đó bạn lần lượt chọn thay đổi một số giá trị bên dưới.
2, Settings -> Parameter Settings -> Address -> Server Type: 1x MPC
3, Settings -> Parameter Settings -> Position mode: option3
4, Settings -> Fix Request Settings -> Session Operation: Standalone
5, Settings -> Fix Request Settings -> Server Option: Local
6, gpsOne XTRA -> Xtra Enable: Enable
Hehehe... Cuối cùng cũng có GPS để sài. :D
Giao diện mới!
http://blog.vn-dev.net đã thay một giao diện mới. Mong được sự đón nhận của mọi người.
Thursday, February 24, 2011
Tạo image header (hay title bằng image) của ứng dụng trên android
Bài trước tôi đã giới thiệu cách control một layout với Image và title. Lần này thêm một bài nữa về layout nhé :D.
Vì vấn đề thương hiệu, các sếp đã bắt Tên của ứng dụng nên để logo của ứng dụng chứ ko chỉ là để chữ không. Mặc định thì nó chỉ hiển thị tên ứng dụng bạn khai báo trong file Manifest. Nhưng bạn hoàn toàn có thể control nó theo ý của mình.
Trước hết tôi design layout main_header cho Title đó như sau.
Ở đây tôi chỉ đưa một image vào đó, nhưng bạn hoàn toàn có thể cho những thứ mà bạn thích vào đây.
Có layout rồi, nhưng làm thế nào để load được nó đây. Bạn để ý thấy trong thẻ Application của file Manifest có thuộc tính sau android:label="@string/app_name":
Cái này chính là cái hiển thị title của ứng dụng.
Ta sẽ ghi đè lên title như sau.
Tạo một style TitleCustomTheme như sau:
Và thêm thuộc tính android:theme="@style/TitleCustomTheme" vào trong thẻ application như sau.
Trong class Activity ta load layout đã design như sau:
Xem thử kết quả nhé. Nhắc bạn luôn nhớ rằng, thương hiệu luôn là vấn đề sống còn của doanh nghiệp :D.
Xem ảnh demo:
Vì vấn đề thương hiệu, các sếp đã bắt Tên của ứng dụng nên để logo của ứng dụng chứ ko chỉ là để chữ không. Mặc định thì nó chỉ hiển thị tên ứng dụng bạn khai báo trong file Manifest. Nhưng bạn hoàn toàn có thể control nó theo ý của mình.
Trước hết tôi design layout main_header cho Title đó như sau.
Ở đây tôi chỉ đưa một image vào đó, nhưng bạn hoàn toàn có thể cho những thứ mà bạn thích vào đây.
Có layout rồi, nhưng làm thế nào để load được nó đây. Bạn để ý thấy trong thẻ Application của file Manifest có thuộc tính sau android:label="@string/app_name":
Cái này chính là cái hiển thị title của ứng dụng.
Ta sẽ ghi đè lên title như sau.
Tạo một style TitleCustomTheme như sau:
Và thêm thuộc tính android:theme="@style/TitleCustomTheme" vào trong thẻ application như sau.
Trong class Activity ta load layout đã design như sau:
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.main_header);
Xem thử kết quả nhé. Nhắc bạn luôn nhớ rằng, thương hiệu luôn là vấn đề sống còn của doanh nghiệp :D.
Xem ảnh demo:
Tuesday, February 22, 2011
Xây dựng grid layout cho android với mỗi phần tử bao gồm Icon + title.
Do dạo này bận dự án quá nên chưa viết loạt bài lập trình game 3D tiếp được, loạt bài này tôi sẽ chỉ các bạn một số thủ thuật trong khi tôi làm dự án của mình.
Giới thiệu sơ qua về dự án của tôi, nó được xây dựng cho mảng bán content cho người dùng giống như Sóc Bay hay một số các phần mềm khác.
Hôm nay tôi sẽ chỉ cách cho các bạn thiết kế layout cho màn hình chính của chương trình. Đó là Grid Layout mỗi phần tử bao gồm các Icon + title bên dưới.
Trước hết chúng ta phải xây dựng được layout cho phần tử bên trong, cái này thì đơn giản quá nhỉ, chỉ cần một ImageView và một TextView là được. Nó trông giống như:
Trong main Activity bạn load View như sau
Trong đó class ImageAdapter load các phần tử ta xây dựng bên trên và xây dựng lớp đó như sau
Ở trên tôi có dùng một đối tượng DictionaryNode để lưu trữ cấu hình các image và title cho các phần tử. Bạn có thể xem cách load nó trong phương thức init().
Cấu trúc của nó kiểu như sau:
MainMenu
NEWS==Đọc báo
$Image$==n
FUNNY==Hài hước
$Image$==hh
....
Khi đó ta sẽ load động các hình ảnh và title từ file cấu hình vào. Chú ý, nếu cái này ko cần thiết bạn nên Fix vì trong điện thoại cần tiết kiệm dung lượng và các sử lý không cần thiết tới mức tối đa do bộ nhớ và CPU nhỏ.
Chúc bạn có một layout tuyệt vời cho ứng dụng của bạn.
Giới thiệu sơ qua về dự án của tôi, nó được xây dựng cho mảng bán content cho người dùng giống như Sóc Bay hay một số các phần mềm khác.
Hôm nay tôi sẽ chỉ cách cho các bạn thiết kế layout cho màn hình chính của chương trình. Đó là Grid Layout mỗi phần tử bao gồm các Icon + title bên dưới.
Trước hết chúng ta phải xây dựng được layout cho phần tử bên trong, cái này thì đơn giản quá nhỉ, chỉ cần một ImageView và một TextView là được. Nó trông giống như:
Trong main Activity bạn load View như sau
GridView gridview = (GridView) findViewById(R.id.gridview); gridview.setAdapter(new ImageAdapter(this, dictionary, dictionary.getChildList().size()));
Trong đó class ImageAdapter load các phần tử ta xây dựng bên trên và xây dựng lớp đó như sau
package vn.vdco.mzone;
import vn.vdco.mzone.util.DictionaryNode;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
/**
*
* @author TanNM
*
*/
public class ImageAdapter extends BaseAdapter {
private Context mContext;
private DictionaryNode dictionary;
private int sizeArray;
private Integer[] mThumbIds = null;
private String[] mTitle = null;
/**
*
* @param c
* @param dictionary
* @param sizeArray
*/
public ImageAdapter(Context c, DictionaryNode dictionary, int sizeArray) {
this.mContext = c;
this.dictionary = dictionary;
this.sizeArray = sizeArray;
mTitle = new String[sizeArray];
mThumbIds = new Integer[sizeArray];
}
public int getCount() {
return mThumbIds.length;
}
public Object getItem(int position) {
return null;
}
public long getItemId(int position) {
return 0;
}
/**
* Load layout for Item with Icon and title
* @param position
* @param convertView
* @param parent
* @return View
* @author tannm
*/
public View getView(int position, View convertView, ViewGroup parent) {
ImageView iv;
TextView tv;
View v;
init();
if (convertView == null) {
LayoutInflater li = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = li.inflate(R.layout.main_icon, null);
tv = (TextView)v.findViewById(R.id.icon_text);
tv.setText(mTitle[position]);
iv = (ImageView)v.findViewById(R.id.icon_image);
iv.setImageResource(mThumbIds[position]);
} else {
v = convertView;
}
return v;
}
/**
* Load title and icon in config file to array
* @author tannm
*/
private void init()
{
if(dictionary != null && dictionary.getChildList() != null && dictionary.getChildList().size() >0)
{
for (int i = 0; i < sizeArray; i++) {
DictionaryNode node = (DictionaryNode)dictionary.getChildList().get(i);
int resID = this.mContext.getResources().getIdentifier("vn.vdco.mzone:drawable/" + node.getString("$Image$"), null, null);
mThumbIds[i] = resID;
mTitle[i] = node.mstrValue;
}
}
}
}
Ở trên tôi có dùng một đối tượng DictionaryNode để lưu trữ cấu hình các image và title cho các phần tử. Bạn có thể xem cách load nó trong phương thức init().
Cấu trúc của nó kiểu như sau:
MainMenu
NEWS==Đọc báo
$Image$==n
FUNNY==Hài hước
$Image$==hh
....
Khi đó ta sẽ load động các hình ảnh và title từ file cấu hình vào. Chú ý, nếu cái này ko cần thiết bạn nên Fix vì trong điện thoại cần tiết kiệm dung lượng và các sử lý không cần thiết tới mức tối đa do bộ nhớ và CPU nhỏ.
Chúc bạn có một layout tuyệt vời cho ứng dụng của bạn.
Sunday, December 12, 2010
Chỉ dẫn lập trình game 3D trên Android (P5)
Đang chờ deploy cái web viết tiếp loạt bài về OpenGL vậy.
Bài hôm nay tôi sẽ giới thiệu cho các bạn cách vẽ một hình đa giác cách xoay chúng như thế nào. Bài trước các bạn đã được học về GLSurfaceView và hãy chắc chắn rằng bạn đã đọc nó vì nó rất quan trọng cho bài hôm nay.
Loạt bài trước tôi cũng đã giới thiệu với các bạn một số khái niệm về đỉnh, tam giác, đa giác. Hôm nay trước khi vào vẽ đa giác tôi sẽ giới thiệu cho các bạn thêm một số khái niệm khác.
1, Cạnh:
Cạnh là một đường thẳng nối 2 đỉnh với nhau. Chúng là đường viền của mặt và đa giác. Trong không gian 3D một cạnh có thể là một đường giao nhau của 2 mặt, do đó khi cạnh này chuyển đổi sẽ dẫn đến sự thay đổi theo của các đỉnh, các mặt kết nối với chúng.
Trong OpenGL ES bạn không định nghĩa các cạnh, thay vào đó bạn định nghĩa các mặt bởi các đỉnh khi đó ta sẽ có các cạnh.
Nếu bạn muốn sửa, thay đổi mộ cạnh bạn có thể thay đổi 2 đỉnh tạo nên cạnh đó.
2, Mặt:
Một cách tổng quát, mặt trong toán học là đa tạp n-1 chiều trong không gian n chiều. Trong tô pô, một mặt hai chiều được gọi là mặt đơn giản nếu nó đồng phôi với một hình vuông trên mặt phẳng hai chiều.
Ví dụ: mặt bán cầu là một mặt đơn giản, còn toàn bộ mặt cầu lại không phải là một mặt đơn giản.
Trong không gian ba chiều, mặt được mặc định là đa tạp hai chiều, là tập hợp những điểm trong hệ tọa độ Đề các ba chiều Oxyz thỏa phương trình: z = f(x,y).
Trong OpenGL ES ta hiểu rằng có thể chia mặt tới mức nhỏ nhất khi đó một mặt chỉ là một tam giác, chúng được tạo lên bởi 3 đỉnh, một chuyển đổi của mặt sẽ ảnh hưởng tới các đỉnh, cạnh liên kết với nó.
Khi uốn khúc trên bề mặt của bạn điều này rất quan trọng để thực hiện các điều khiển đúng hướng của nó. Khi đó bạn phải điều khiển những gì sẽ sảy ra với mặt phía trước và cả mặt phía sau nữa. Tại sao điều này lại rất quan trọng bởi vì hiệu năng của ứng dụng sẽ tăng lên khi bạn không phải vẽ cả 2 mặt mà chỉ thực hiện vẽ mặt phía trước. Đó là ý tưởng tốt sử dụng sự uốn khúc cho tất cả các dự án của bạn. Bạn có thể định nghĩa phía trên của bề mặt bằng cách.
gl.glFrontFace(GL10.GL_CCW); // OpenGL docs
gl.glEnable(GL10.GL_CULL_FACE); // OpenGL docs
gl.glCullFace(GL10.GL_BACK); // OpenGL docs
3, Render:
Thời gian để bạn đưa một cái j đó ra ngoài màn hình, có 2 phương thức để bạn làm điều này, 2 phương thức đó là:
public abstract void glDrawArrays(int mode, int first, int count); // OpenGL docs
và
public abstract void glDrawElements(int mode, int count, int type, Buffer indices); // OpenGL docs
Một số render cơ bản nhất:
GL_POINTS: Render một điểm ra màn hình.
GL_LINE_STRIP: Render một dãy các phân đoạn đường thẳng nối liền nhau, nhưng không nối điểm đầu và điểm cuối.
GL_LINE_LOOP: Giống như GL_LINE_STRIP nhưng không nối điểm đầu và điểm cuối.
GL_LINES: Render một đường thẳng.
GL_TRIANGLES: Render một tam giác.
GL_TRIANGLE_STRIP: Render một loạt các tam giác theo thứ tự VD: Ta có các đỉnh v0, v1, v2, v3, v4, v5 khi đó các tam giác được render là (v0, v1, v2) sau đó là (v2, v1, v3) (lưu ý thứ tự), tiếp theo là (v2, v3, v4) ...

GL_TRIANGLE_FAN: Render một loạt các tam giác giống như GL_TRIANGLE_STRIP nhưng các tam giác được vẽ giống như một hình quạt dựa vào một gốc.

Giờ chúng ta sẽ vẽ thử một tam giác:
Bạn vẫn còn project hôm trước chứ, ta sẽ thay đổi một chút để có thể render ra được một tam giác.
Ta chỉ cần sửa lại lớp VortexRenderer lại như sau:
Để hình tam giác của ta quay với tốc độ tùy vào vị chí mà ta click ta set thêm góc giống như
Bạn có thể download mã nguồn của ứng dụng về chạy thử.
Bài hôm nay tôi sẽ giới thiệu cho các bạn cách vẽ một hình đa giác cách xoay chúng như thế nào. Bài trước các bạn đã được học về GLSurfaceView và hãy chắc chắn rằng bạn đã đọc nó vì nó rất quan trọng cho bài hôm nay.
Loạt bài trước tôi cũng đã giới thiệu với các bạn một số khái niệm về đỉnh, tam giác, đa giác. Hôm nay trước khi vào vẽ đa giác tôi sẽ giới thiệu cho các bạn thêm một số khái niệm khác.
1, Cạnh:
Cạnh là một đường thẳng nối 2 đỉnh với nhau. Chúng là đường viền của mặt và đa giác. Trong không gian 3D một cạnh có thể là một đường giao nhau của 2 mặt, do đó khi cạnh này chuyển đổi sẽ dẫn đến sự thay đổi theo của các đỉnh, các mặt kết nối với chúng.
Trong OpenGL ES bạn không định nghĩa các cạnh, thay vào đó bạn định nghĩa các mặt bởi các đỉnh khi đó ta sẽ có các cạnh.
Nếu bạn muốn sửa, thay đổi mộ cạnh bạn có thể thay đổi 2 đỉnh tạo nên cạnh đó.
2, Mặt:
Một cách tổng quát, mặt trong toán học là đa tạp n-1 chiều trong không gian n chiều. Trong tô pô, một mặt hai chiều được gọi là mặt đơn giản nếu nó đồng phôi với một hình vuông trên mặt phẳng hai chiều.
Ví dụ: mặt bán cầu là một mặt đơn giản, còn toàn bộ mặt cầu lại không phải là một mặt đơn giản.
Trong không gian ba chiều, mặt được mặc định là đa tạp hai chiều, là tập hợp những điểm trong hệ tọa độ Đề các ba chiều Oxyz thỏa phương trình: z = f(x,y).
Trong OpenGL ES ta hiểu rằng có thể chia mặt tới mức nhỏ nhất khi đó một mặt chỉ là một tam giác, chúng được tạo lên bởi 3 đỉnh, một chuyển đổi của mặt sẽ ảnh hưởng tới các đỉnh, cạnh liên kết với nó.
Khi uốn khúc trên bề mặt của bạn điều này rất quan trọng để thực hiện các điều khiển đúng hướng của nó. Khi đó bạn phải điều khiển những gì sẽ sảy ra với mặt phía trước và cả mặt phía sau nữa. Tại sao điều này lại rất quan trọng bởi vì hiệu năng của ứng dụng sẽ tăng lên khi bạn không phải vẽ cả 2 mặt mà chỉ thực hiện vẽ mặt phía trước. Đó là ý tưởng tốt sử dụng sự uốn khúc cho tất cả các dự án của bạn. Bạn có thể định nghĩa phía trên của bề mặt bằng cách.
gl.glFrontFace(GL10.GL_CCW); // OpenGL docs
gl.glEnable(GL10.GL_CULL_FACE); // OpenGL docs
gl.glCullFace(GL10.GL_BACK); // OpenGL docs
3, Render:
Thời gian để bạn đưa một cái j đó ra ngoài màn hình, có 2 phương thức để bạn làm điều này, 2 phương thức đó là:
public abstract void glDrawArrays(int mode, int first, int count); // OpenGL docs
và
public abstract void glDrawElements(int mode, int count, int type, Buffer indices); // OpenGL docs
Một số render cơ bản nhất:
GL_POINTS: Render một điểm ra màn hình.
GL_LINE_STRIP: Render một dãy các phân đoạn đường thẳng nối liền nhau, nhưng không nối điểm đầu và điểm cuối.
GL_LINE_LOOP: Giống như GL_LINE_STRIP nhưng không nối điểm đầu và điểm cuối.
GL_LINES: Render một đường thẳng.
GL_TRIANGLES: Render một tam giác.
GL_TRIANGLE_STRIP: Render một loạt các tam giác theo thứ tự VD: Ta có các đỉnh v0, v1, v2, v3, v4, v5 khi đó các tam giác được render là (v0, v1, v2) sau đó là (v2, v1, v3) (lưu ý thứ tự), tiếp theo là (v2, v3, v4) ...
GL_TRIANGLE_FAN: Render một loạt các tam giác giống như GL_TRIANGLE_STRIP nhưng các tam giác được vẽ giống như một hình quạt dựa vào một gốc.
Giờ chúng ta sẽ vẽ thử một tam giác:
Bạn vẫn còn project hôm trước chứ, ta sẽ thay đổi một chút để có thể render ra được một tam giác.
Ta chỉ cần sửa lại lớp VortexRenderer lại như sau:
package vn.vndev.android.opengl;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.nio.ShortBuffer;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.opengl.GLSurfaceView;
/**
*
* @author TanNM
*
*/
public class VortexRenderer implements GLSurfaceView.Renderer {
private static final String LOG_TAG = VortexRenderer.class.getSimpleName();
private float red = 0f;
private float green = 0f;
private float blue = 0f;
// a raw buffer to hold indices allowing a reuse of points.
private ShortBuffer indexBuffer;
// a raw buffer to hold the vertices
private FloatBuffer vertexBuffer;
private short[] indicesArray = { 0, 1, 2 };
private int nrOfVertices = 3;
private float angle;
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// preparation
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
initTriangle();
}
@Override
public void onSurfaceChanged(GL10 gl, int w, int h) {
gl.glViewport(0, 0, w, h);
}
public void setAngle(float angle) {
this.angle = angle;
}
@Override
public void onDrawFrame(GL10 gl) {
// define the color we want to be displayed as the "clipping wall"
gl.glClearColor(red, green, blue, 1.0f);
// clear the color buffer to show the ClearColor we called above...
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
// set rotation
gl.glRotatef(angle, 0f, 1f, 0f);
gl.glColor4f(0.2f, 0.5f, 0.2f, 0.5f);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
gl.glDrawElements(GL10.GL_TRIANGLES, nrOfVertices,
GL10.GL_UNSIGNED_SHORT, indexBuffer);
}
private void initTriangle() {
// float has 4 bytes
ByteBuffer vbb = ByteBuffer.allocateDirect(nrOfVertices * 3 * 4);
vbb.order(ByteOrder.nativeOrder());
vertexBuffer = vbb.asFloatBuffer();
// short has 4 bytes
ByteBuffer ibb = ByteBuffer.allocateDirect(nrOfVertices * 2);
ibb.order(ByteOrder.nativeOrder());
indexBuffer = ibb.asShortBuffer();
float[] coords = { -0.5f, -0.5f, 0f, // (x1, y1, z1)
0.5f, -0.5f, 0f, // (x2, y2, z2)
0f, 0.5f, 0f // (x3, y3, z3)
};
vertexBuffer.put(coords);
indexBuffer.put(indicesArray);
vertexBuffer.position(0);
indexBuffer.position(0);
}
public void setColor(float r, float g, float b) {
red = r;
green = g;
blue = b;
}
}
Để hình tam giác của ta quay với tốc độ tùy vào vị chí mà ta click ta set thêm góc giống như
renderer.setAngle((event.getX() + event.getY()) / 20);trong phương thức
public boolean onTouchEvent(final MotionEvent event)của lớp VortexView
Bạn có thể download mã nguồn của ứng dụng về chạy thử.
Subscribe to:
Posts (Atom)



