19/04/2012

Xoá thư mục không rỗng trong Qt

Cho đến phiên bản 4.8, để xoá một file trong Qt chúng ta dùng QFile::remove hay QDir::remove, để xoá một thư mục rỗng thì chúng ta sử dụng QDir::rmdir và không có sẵn phương thức để xoá một thư mục không rỗng.
Đến phiên bản 5.0, thì Qt bổ sung phương thức QDir::removeRecursively dùng để xoá thư mục và toàn bộ nội dung bên trong của nó. Như vậy nếu chúng ta đang dùng Qt phiên bản 4.8 trở về trước thì chúng ta tự hiện thực phương thức  removeRecursively. Sau đây là cách hiện thực sử dụng đệ quy của Folami tôi:
bool removeRecursively(const QString &dirName)
{
    bool result = true;
    QDir dir(dirName);
 
    if (dir.exists(dirName)) {
        Q_FOREACH(QFileInfo info, 
                 dir.entryInfoList(QDir::NoDotAndDotDot | 
                                   QDir::System | 
                                   QDir::Hidden | 
                                   QDir::AllDirs | 
                                   QDir::Files, QDir::DirsFirst)) {
            if (info.isDir()) { 
            //Neu la thu muc thi goi de quy de xoa thu muc nay 
            result = removeRecursively(info.absoluteFilePath());
            }
            else {
                result = QFile::remove(info.absoluteFilePath());
            }
 
            if (!result) {
                return result;
            }
        } 
        //Da xoa het noi dung, thu muc la thu muc rong
        //Xoa no 
      result = dir.rmdir(dirName);
    }
 
    return result;
}

15/04/2012

Tải nhạc từ trang nhaccuatui.com

Bài hướng dẫn này dành cho những bạn là fan của Firefox (cũng không khác lắm cho IE, Chrome, Safari, Opera).
Để tải nhạc từ trang nhaccuatui.com các bạn thực hiện các bước như sau:
1) Truy cập trang có bài nhạc bạn yêu thích ví dụ:
http://www.nhaccuatui.com/nghe?M=UwP5oaaicD
2) View mã nguồn của trang
Click chuột phải trên trang > View page source
3) Bấm Ctrl+ F tìm cụm từ
file=http://www.nhaccuatui.com/api/playerv7.ashx?
4) Copy đoạn sau "file=" cho đến hết giá trị của key2= ta có
 http://www.nhaccuatui.com/api/playerv7.ashx?key2=001b003400040076002e0035002f002a00370007
5) Mở tab mới dán link này vào
6) Làm lại bước 2 cho tab mới.
7)Bấm Ctrl+F tìm từ khoá
<location><![CDATA[
8) Copy đoạn ngay sau đó cho đến trước dấu ]] ta có:
http://stream41.gonct.info/de70ee715a5d94d497da16735ad75b09/4f8abddd/NhacCuaTui211/The Lost Child - Anathema [NCT 036347011027685350008].mp3
Bây giờ bạn có thể tải file nhạc về rồi bằng trình download bạn thích.
 
 

14/04/2012

Thợ săn thành phố (City Hunter)

  • Đạo diễn: Jin Hyuk
  • Diễn viên: Lee Min Ho, Park Min Young, Lee Jun Hyuk, Goo Hara
  • Nhà sản xuất: SBS
  • Quốc gia: Hàn Quốc
  • Thời lượng: 20 tập
  • Thể loại: Phim Bộ Hàn Quốc
  • Năm sản xuất: 2011
Bộ phim Thợ săn thành phố được chuyển thể từ một bộ truyện tranh ăn khách của Nhật Bản được xuất bản từ năm 1983. Khi chuyển thành phim các nhà làm phim đã Hàn hoá nó bằng cách chuyển bối cảnh Tokyo những năm 1980 thành Seoul năm 2010.
Câu chuyện bắt đầu chuyến viếng thăm của tổng thống Hàn Quốc và các quan chức cấp cao tới Myanmar. Một vụ nổ đã xảy ra do các điệp viên của Triều Tiên thực hiện. Vụ nổ không giết chết tổng thống nhưng rất nhiều quan chức cấp cao đã chết.
Để trả đũa cho hành động này, Ngũ nhân hội đã lên kế hoạch gửi người sang Triều Tiên và tiêu diệt các điệp viên của Triều Tiên. Lee Jin-Pyo  và  Park Moo-Yul đang làm trong đội cảnh vệ Nhà Xanh đã dẫn đầu đoàn 21 người Bắc tiến với nhiệm vụ cực kỳ nguy hiểm. Theo kế hoạch thì đội đặc nhiệm được đưa đến bờ biển gần Triều Tiên và họ sẽ tiến và đất Triều Tiên để thực hiện kế hoạch ám sát. Choi Eung-Chan hứa sẽ điều tàu ngầm đón họ quay về.
Khi kế hoạch đang tiến hành thuận lợi, phía Hàn Quốc chỉ có Park Moo-Yul bị thương thì Ngũ Nhân hội thay đổi ý kiến họ ra lệnh thủ tiêu toàn bộ đội đặc nhiệm. K hi đội đặc nhiệm hoàn nhiệm vụ bị truy đuổi họ đã bơi về phía chiếc tàu ngầm điều họ không ngờ là tên sát thủ đã lần lượt đưa họ về với tổ quốc duy chỉ có  Lee Jin-Pyo là sống sót do Park Moo-Yul xả thân cứu thoát. Chứng kiến cảnh máu đồng đội nhuộm đỏ biển Nampu vì sự phản bội của Ngũ Nhân hội, ông thề sẽ trả thù một cách tàn khốc nhất và kế hoạch trả thù của ông bắt đầu bằng việc bắt cóc đứa con trai của  Park Moo-Yul và đưa sang khu Tam Giác Vàng để huấn luyện. Ở đây đứa bé được gọi bằng cái tên Thái là Poo Chai
28 năm sau, Lee Yun-Seung (Poo Chai) và  Steve Lee ( Lee Jin-Pyo) quay về Hàn Quốc với mác là chàng tiến sĩ MIT và thương nhân Hàn kiều. Kế hoạch trả thù bắt đầu. Tuy nhiên phương pháp trả thù của Lee Yun-Seung và Steve Lee lại khác nhau hoàn toàn. Liệu họ có thành công không?
Sau khi xem phim xong thấy cái chết của chàng công tố viên Kim Young-Joo thật là đau lòng là một kết thúc buồn, se lòng trước cảnh nàng Jin Soo-Hee đổ sụp trước quan tài của người chồng cũ ...
Phim lấy bối cảnh 2010 rất hiện đại nhưng tình yêu nam nữ trong phim cứ như thập niên 1980 ...
Anh Lee Min-Ho
Lee Yun-Seong (Lee Min-Ho)

Kim Na-Na (Park Min-Young)
Anh Jin Soo-He
Jin Soo-Hee (Hwang Sun-Hee)
Anh Kim Young Joo
Kim Young-Joo (Lee Jun-Hyuk)


07/04/2012

Tại sao Lệnh Hồ Xung là người vô địch?


Đọc "Tiếu ngạo giang hồ" của Kim Dung ai cũng biết phái Hoa Sơn chia thành hai tông: Kiếm Tông và Khí Tông. Khí Tông thì chú trọng vào luyện công phu mà không chú trọng luyện chiêu thức. Kiếm Tông thì ngược lại chỉ chú trọng vào luyện chiêu thức mà không chú trọng luyện nội công. Lệnh Hồ Xung là đệ tử của Nhạc Bất Quần+Ninh Trung Tắc thuộc phe Khí Tông. Lệnh Hồ Xung là đệ tử cưng của họ, học giỏi và tài nghệ nhất nhì môn phái nhưng ra đường chẳng bằng ai. Một hôm Lệnh Hồ Xung gặp tiền bối Phong Thanh Dương thuộc phe Kiếm Tông truyền thụ võ công và từ đó Lệnh Hồ Xung thành đệ nhất thiên hạ.
Câu chuyện tóm tắt là vậy. Xem đến đây nhiều người lầm tưởng rằng Lệnh Hồ Xung thành đệ nhất thiên hạ là do học được tuyệt kỹ của phe Kiếm Tông. Nhưng sự thực theo Folami tôi nghĩ không phải vậy. Sở dĩ Lệnh Hồ Xung thành đệ nhất thiên hạ vì anh đã biết kết hợp tinh hoa của hai phe Kiếm Tông và Khí Tông. Đây mới thật sự là điều mà tác giả Kim Dung muốn gửi đến độc giả. Mỗi một môn phái, một trường phái đều có cái hay, cái dở của nó. Người thành công là người biết kết hợp tinh hoa của các trường phái này lại
Một điểm khá hay nữa nếu độc giả để ý sẽ thấy đó là Lệnh Hồ Xung phải học Khí Tông trước rồi mới học Kiếm Tông nghĩa là anh ta phải vững nền tảng rồi sau đó mới học chuyên sâu. Đây là một thứ tự mà có lẽ Kim Dung cũng cố tình truyền đạt.
Bàn đến việc học ngày nay:
Một trường đại học đúng nghĩa thì thuộc phe Khí Tông. Trường đại học dạy cho sinh viên kiến thức nền tảng (nội công) và khả năng tư duy để từ cái nền tảng này biến thành chiêu thức khi đi vào làm việc. Đây là nhóm người biết tại sao nhưng không biết làm, hoặc biết làm mà không hay. Thời gian học kéo dài (Lệnh Hồ Xung ở Hoa Sơn mười mấy năm mà). Tuy nhiên có rất nhiều trường đại học hiện nay lại thuộc phe Kiếm Tông.
Một trường trung cấp, cao đẳng nghề hay một khoá học ngắn hạn thì thuộc phe Kiếm Tông (Lệnh Hồ Xung học với Phong Thanh Dương là khoá ngắn hạn mà ). Ở đây học viên học các kỹ năng để làm việc, một số công việc cụ thể. Đây làc nhóm người làm rất giỏi mà không biết tại sao.
Một người muốn giỏi thì phải biết kết hợp hai trường phái này lại và theo đúng trình tự Khí Tông-Kiếm Tông.
Nếu đã theo học phe Khí Tông (tốt nghiệp đại học, Lệnh Hồ Xung bị trục xuất khỏi Hoa Sơn ) thì bạn nên tự trang bị cho mình các tuyệt kỹ của Kiếm Tông (học thêm các kỹ năng bằng tự học, đăng ký học các khoá ngắn hạn, ...) cái này Folami tôi gọi là công thức 1: n (1 bằng đại học+n chứng chỉ)
Nếu bạn vì lý do nào đó phải theo phe Kiếm Tông rồi thì cũng đừng quá lo lắng (Phong Thanh Dương cũng một thời chọc trời khuấy nước đấy thôi), bạn hãy học tiếp Khí Tông (liên thông lên đại học í mà). Tuy có khó khăn hơn một tí nhưng quyết chí cũng thành công.
Ngoài cái chuyện học hành ra trong Tiếu ngạo giang hồ còn một câu chuyện tình đẹp của nàng Nhậm Doanh Doanh và chàng lãng tử Lệnh Hồ Xung. Đây là một trường đoạn khác nói về tình yêu không biên giới, không giai cấp. Có dịp sẽ bàn đến ...


05/04/2012

Dịch ngược ứng dụng Android


Việc chuyển gói nhị phân apk của một ứng dụng Android thành dạng mà con người có thể đọc được gọi là quá trình dịch ngược (reverse engineering). Ở đây tôi không bàn đến tính hợp pháp của hành động này mà tôi chỉ bàn đến khía cạnh kỹ thuật của nó. Đồng tiền thì có hai mặt. Việc dịch ngược này cũng vậy tôi tin rằng nó cũng hữu ích cho bạn trong nhiều tình huống hoàn toàn hợp pháp. Để dịch ngược ứng dụng Android bạn cần thực hiện qua hai bước

Decompiling

  • Tải android-apktool từ đây.
  • Giải nén hay cài đặt (tuỳ theo gói mà bạn chọn tải về).
  • Thực hiện câu lệnh sau đây:
apktool d file.apk 
  • Bạn thu được các tập tin resource xml và mã nguồn smali. Tuy nhiên mã nguồn smali rất khó đọc (có thể chạy debug được). Chúng ta cần tiến hành bước kế tiếp để thu được mã nguồn Java.

Disassembling

  • Tải công cụ dex2jar tool tại đây.
  • Giải nén nó vào một thư mục bất kỳ.
  • Thực hiện câu lệnh sau đây để chuyển gói apk thành gói jar
dex2jar file.apk
  • Tải công cụ jd-gui  tại đây.
  • Sử dụng công cụ này để chuyển file class thành file java.
Đến đây chúng ta đã có mã nguồn, có các tập tin resource.

04/04/2012

Truy xuất Facebook bằng Operator

Opera Tor hay Operator là dạng portable của trình duyệt web nổi tiếng Opera.
Opera Tor sử dụng polipo proxy server để che dấu IP của trang web mà trình duyệt truy xuất. Do đó chúng ta dễ dàng truy xuất trang Facebook sử dụng Opera Tor.
Tuy nhiên khi sử dụng Opera Tor có một phiền toái là Facebook không nhận ra vị trí, thiết bị mà mình truy xuất nên Facebook thường xuyên tiến hành quy trình kiểm tra bảo mật (captcha, xác nhận tài khoản bằng điện thoại di động, ảnh bạn bè, câu hỏi bảo mật). Nên chia sẻ vị trí của bạn cho Facebook để giảm bớt quá trình kiểm tra bảo mật ở lần đăng nhập sau.
Một phiền toái khác nữa là khi bạn đang duyệt web thì polipo chết. Bạn nên khởi động lại polipo.exe bằng tay bằng câu lệnh:
polipo -c config
Để tải Opera Tor bạn vào đây:http://archetwist.com/en/opera/operator

18/02/2012

IT Careers

This afternoon, I shared some my thoughts about IT with the students from Le Qui Don highschool on behalf of alumni student. I used the following slides:


05/02/2012

Bug fix for folderlistmodel

If you have used folderlistmodel in Qt.labs.folderlistmodel 1.0, I am sure that it will make you disappointed because it cannot reflect the change from system file such as file deleted, file renamed, ...
I found that folderlistmodel is based on QDirModel which is a deprecated class. I decided to implement it again using QFileSystemModel because QFileSystemModel use file system watcher.
I have succeeded!If you have same problem as me, drop me a line...


27/12/2011

弟14課-復習B


I。
1)かばんを開けてください。
2)レポートをコピーしてください。
3)あそこに車を止めてください。
4)レポートを書いてください。
II.
  1. すみませんが、エアコンをつけてください。
  2. すみませんが、ドアを閉めてください。
  3. すみませんが、もう少しゆっくり話してください。
  4. すみませんが、写真をもう1枚撮ってください。
III.
1)これをコピーしましょうか。。。。ええ、5枚コピーしてください。
2)レポートを送りましょうか。。。。ええ、すぐ送ってください。
3)タクシーを呼びましょうか。。。。ええ、2台呼んでください。
4)あしたも来ましょうか。。。。ええ、10時来てください。
IV.
1)地図をかきましょうか。。。。ええ、お願いします。
2)荷物を持ちましょうか。。。。いええ、けっこうです。
3)エアコンをつけましょうか。。。。いええ、けっこうです。
4)駅まで迎えに行きましょうか。。。。ええ、お願いします。
V.
1)今電話をかけています。
2)今コーヒーを飲んでいます。
3)今ダンスをしています。
4)今たばこをすっています。
VI.
1)ミラーさんは何をしていますか。。。。シュミットさんと話しています。
2)ワンさんは何をしていますか。。。。新聞を読んでいます。
3)カリナさんは何をしていますか。。。。花をかいています。
4)サントスさんは何をしていますか。。。。寝ています。
VII.
1) 子どもと遊んでいます。
2)木の下で寝ています。
3)新聞を読んでいます。
4)どこへ食事に行きますか。。。。インド料理のレストランへ食事に行きます。

13/12/2011

HP make webOS source code public

HP bought Palm in April 2009. webOS has been belong to HP. However, webOS is minority force of the global mobile marketshare.
In December 9, 2011, HP announced that they will contribute webOS to open source community.

30/11/2011

弟13課-問題


3.
1)用事がありますから、5時にうちへ帰りたいです。
2)あしたは休みですから、昼まで寝たいです。
3)のどがかわましたから、何か飲みたいです。
4)疲れましたから、何もしたいです。
5)暑いですから、どこも行きたいです。
4.
1)わたしは大きいうち欲しいです。
2)おなかいっぱいですから、何食べたくないです。
3)京都の大学美術勉強します。
4)日本経済の勉強来ました。
5)あの喫茶店入りませんか。
5.
1)図書館へ本を借りに行きます。
2)郵便局へ切手を買いに行きました。
3)デパートへ買い物に行きたいです。
4)暑いですから、ペールへ泳ぎに行きましょう。
5)日本に1年いますから、市役所へ外国人登録に行きます。
6.
1) 0
2) 0
3)
4) 0
5)

29/11/2011

Cài đặt XCode 3.2.6 trên Mac OS X Lion

Apple chỉ cho phép cài đặt Xcode 4.1 cho Mac OS X Lion. So với phiên bản trước thì Xcode 4.1 có nhiều điểm nổi trội nhưng bên cạnh đó cũng mang đến cho các dev rất nhiều nổi bực bội:
  1. Chức năng Design bị gỡ bỏ.
  2. Thêm ARC quản lý việc tham khảo biến tự giải phóng biến, tuyệt vời quá, tuy nhiên nếu bạn mở một dự án cũ thì mệt lắm.
  3. Không hỗ trợ PowerPC Mac.
Do đó nhiều dev tìm cách cài Xcode 3.2.6 trên chú sư tử của mình. Mình cũng nằm trong số này. Sau đây là các bước mình thực hiện và thành công:
  1. Tải xcode_3.2.6_and_ios_sdk_4.3.dmg miễn phí từ developer của Apple. Nếu bạn không có tài khoản thì xin đừng hỏi tôi cách tải về mà hãy hỏi nhà thông thái Google nhé. Lưu tập tin tải về tại ~/Downloads
  2. Chuyển đến thư mục download: cd ~/Downloads
  3. Tạo ảnh của tập tin này để có thể chỉnh sửa: hdiutil attach -shadow xcode_3.2.6_and_ios_sdk_4.3.shadow xcode_3.2.6_and_ios_sdk_4.3.dmg
  4. Xoá chuỗi '&& system.compareVersions(my.target.systemVersion.ProductVersion, '10.7') < 0 ' trong tập tin 'Xcode and iOS SDK.mpkg/Contents/iPhoneSDKSL.dist' (dòng 148):cat '/Volumes/Xcode and iOS SDK/Xcode and iOS SDK.mpkg/Contents/iPhoneSDKSL.dist' | sed "s/&& system.compareVersions(my.target.systemVersion.ProductVersion, '10.7') < 0 //g" > '/Volumes/Xcode and iOS SDK/Xcode and iOS SDK.mpkg/Contents/iPhoneSDKSL.dist.new' && mv '/Volumes/Xcode and iOS SDK/Xcode and iOS SDK.mpkg/Contents/iPhoneSDKSL.dist.new' '/Volumes/Xcode and iOS SDK/Xcode and iOS SDK.mpkg/Contents/iPhoneSDKSL.dist'
  5. Tiến hành cài đặt Xcode như bình thường.

27/11/2011

弟13課-復習B


I。
1)わたしはパソコン が欲しいです。
2)わたしは車が欲しいです。
3)わたしはお金が欲しいです。
4)わたしは彼女が欲しいです。
II.
  1. どんな車が欲しいですか。。。。ドイスの車が欲しいです。
  2. どんな靴が欲しいですか。。。。黒い靴が欲しいです。
  3. どんなパソコンが欲しいですか。。。。IMCのパソコンが欲しいです。
  4. どんなうちが欲しいですか。。。。広いうちが欲しいです。
III.
1)北海道へ行きたいです。
2)ビールを読みたいです。
3)映画を見たいです。
4)サッカをしたいです。
IV.
1)いつ北海道へ行きたいですか。。。。2月に行きたいです。
2)何を習いたいですか。。。。生け花を習いたいです。
3)だれに会いたいですか。。。。両親に会いたいです。
4)何を食べたいですか。。。。何も食べたくないです。
5)どんな本を読みたいですか。。。。旅行の本を読みたいです。
6)日曜日どこへ行きたいですか。。。。どこも行きたくないです。
V.
1)デパートへお土産を買いに行きます。
2)郵便局へ速達を出しに行きます。
3)図書館へ本を借りに行きます。
4)駅へ友達を迎えに行きます。
VI.
1)ホンコンへ買い物に行きます。
2)ホテルへ食事に行きます。
3)川へ釣りに行きます。
4)市役所へ外国人登録に行きます。
VII.
1)どこへ泳ぎに行きますか。。。。ホテルのプールへ泳ぎに行きます。
2)どこへお土産を買いに行きますか。。。。デパートへ買いに行きます。
3)どこへ絵を見に行きますか。。。。奈良の美術館へ見に行きます。
4)どこへ食事に行きますか。。。。インド料理のレストランへ食事に行きます。
VIII. 
  1. 何を買いに行きますか。。。。フィルムを買いにす行きます。
  2. だれに会いに行きますか。。。。カリナさんに会いに行きます。
  3. 何時ごろ子どもを迎えに行きますか。。。。2時ごろ迎えに行きます。
  4. だれとテニスに行きますか。。。。会社の人に行きます。

弟12課-復習B

I.
1)先月は忙しかったです。
2)お祭りは楽しかったです。
3)去年の冬は暖かかったです。
4)公園は人が多かったです。 
II.
  1. おとといは雨でした。
  2. 図書館は休みでした。
  3. 先週は暇でした。
  4. 奈良公園は静かでした。 
    III.
  1. 歌舞伎はおもしろかったですか。。。。はい、おもしろかったです。 
  2. コンサートはよかったですか。。。。。いいえ、あもりよくなかったです。
  3. お祭りはにぎやかでしたか。。。。はい、とてもにぎやかでした。
  4. 試験は簡単でしたか。。。。いいえ、かんたんじゃありませんでした。
IV.
  1. 天気はどうでしたか。。。。曇りでした。
  2. タイ料理はどうでしたか。。。辛かったです。
  3. 北海道はどうでしたか。。。あもり寒くなかったです。
  4. ホテルの部屋はどうでしたか。。。とてもすてきでした。
V.
  1. このかばんはそのかばんよりならいです。
  2. ホンコンはシンガポールより近いです。
  3. 地下鉄は車より早いです。
  4. ミラーさんはサントスさんよりテニスが上手です。 
    VI.
  1. コーヒーと紅茶とどちらがいいですか。。。コーヒーのほうがいいです。
  2. 大きいみかんと小さいみかんとどちらが甘いですか。。。小さいみかんのほうが甘いです。
  3. お父さんとお母さんとどちらが料理が上手ですか。。。父のほうが料理が上手です。
  4. 春と秋とどちらが好きですか。。。どちらも好きです。
VII.
  1. スポーツで何がいちばんおもしろいですか。。。サッカーがいちばんおもしろいです。
  2. 年でいつ(何月)がいちばん暑いですか。。。8月がいちばん暑いです。
  3. 家族でだれが歌がいちばん上手ですか。。。妹が歌がいちばん上手です。
  4. ヨーロッパでどこがいちばんよかったですか。。。スイスがいちばんよかったです。

12/11/2011

How to exit program from iOS application

From iOS 4.0 when you push Home button the application go to background instead of exiting as before.

 When you launch application again you can see the screen before the application go to background.
Sometime, you don't want this default behavior, you want to exit (terminate) the program when user press on (touch on) a button. How to do this?
There are two ways:
+ Call exit(0) in the action handler method.
+Call [[NSThread mainThread] exit] in the action handler method.

03/11/2011

Determin mp4 file is audio file or video file

If you receive mp4 file from server, you can determin it is audio file or video file by mime information which is sent by server. However, if mp4 file is in your Android terminal (internal or external storage device), how do you solve the problem? In this small post, I present a solution use MP4Parser library.

try{
//mp4 is path string of your mp4 file   

IsoBufferWrapper isoBufferWrapper = new IsoBufferWrapper(new File(mp4));
IsoFile isoFile = new IsoFile(isoBufferWrapper);
isoFile.parse();
//Get FileTypeBox   
    ArrayList boxes =( ArrayList) isoFile.getBoxes(FileTypeBox.class);
    FileTypeBox ftb =(FileTypeBox) boxes.get(0);
    String major =ftb.getMajorBrand().trim().toLowerCase();
    //The list of ftyps http://www.ftyps.com/
    if(major.equals("m4a") || //Apple iTunes AAC-LC (.M4A) Audio
       major.equals("msnv")|| //MPEG-4 (.MP4) for SonyPSP
       major.equals("ndas")|| //MP4 v2 [ISO 14496-14] Nero Digital AAC Audio
       major.equals("da1a")|| //DMB MAF audio with ER-BSAC audio, JPG/PNG/MNG images
       major.equals("f4a")|| //Audio for Adobe Flash Player 9+ (.F4A)
       major.equals("f4b")|| //Audio Book for Adobe Flash Player 9+ (.F4B)
       major.equals("m4b")|| //Apple iTunes AAC-LC (.M4B) Audio Book
       major.equals("m4p")|| //Apple iTunes AAC-LC (.M4P) AES Protected Audio
       major.equals("bsac")|| //MPEG-4 "Bit Sliced Arithmetic Coding" (audio)
       major.equals("mot slides") //Digital Audio Broadcasting (DAB) MOT slideshow (ETSI DAB  TR 101 497)
            ){
        //AUDIO FILE
    }else{
        //VIDEO FILE
    }
        }catch(IOException ex){
            ex.printStackTrace();
            //ERROR
        }

18/10/2011

Cuộc chiến giữa Android phone và iPhone ở khía cạnh nhà cung cấp dịch vụ

Sự lớn mạnh không ngừng của Android phone trong thị trường smart phone trong thời gian gần đây thật ấn tượng. Theo số liệu thống kê vào cuối quý 3 năm 2011, thị phần của Android phone là 43,7%.
Tuy nhiên hầu hết Android phone gắn kết với nhà cung cấp dịch vụ (carrier) Verizon trong khi iPhone lại chọn AT&T. Điểm khác biệt này đôi khi lại là nguyên nhân khiến người dùng chọn iPhone hơn Android phone.
Đọc thêm thông tin ở blog sau:
Jason Pearlow, Why my parents don't use Android


17/10/2011

Set thông tin proxy cho DefaultHttpClient

Sau đây là một đoạn code nhỏ mô tả cách thiết lập thông tin proxy cho HttpDefaultClient
        //Tạo đối tượng DefaultHttpClient
        DefaultHttpClient client = new DefaultHttpClient();
        //Thiết lập thông tin proxy
        HttpHost httpproxy = new HttpHost("[Proxy Server Address]",[Proxy Server Port]);
        client.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, httpproxy);

14/10/2011

Develop an Apache HttpClient client for Android to a JAX-RS web service

Create JAX-RS web service access with the Apache HttpClient library. Jersey, a reference implementation for JAX-RS, simplifies development of RESTful web services in the Java™ environment. Android is a popular smartphone and this article shows you how to create a JAX-RS client for Android. You'll create an Apache HttpClient library client to a JAX-RS web service.
Read more:

03/10/2011

Nokia sa thải 3.500 công nhân

Theo thông tin từ Vietnam+ thì ngày 29/09 vừa qua hãng Nokia thông báo tiếp tục cắt giảm 3.500 công nhân trong đó có 2.200 nhân viên ở  Cluj, Romania và 1.300 nhân viên khối Location & Commerce.
Đây là đợt cắt giảm thứ hai sau khi hãng này chuyển 2.800 kỹ sư phát triển Symbian platform sang làm việc tại Accenture  vào tháng 06/2011 vừa rồi.

07/09/2011

Gosling rời Google và Android

'Cha đẻ của Java', James Gosling đã rời Sun Microsystems sau khi hãng này bị Oracle thâu tóm và đến Google.
Sự kiện này đã gây xôn xao cộng đồng mạng. Mới đây Gosling tiếp tục rời khỏi Google, từ bỏ Android về đầu quân cho Liquid Robotics ( để có thể tạo ra các android,robot, thật sự) với vai trò kiến trúc sư trưởng.

04/09/2011

Microsoft Excel chiếm 100% CPUs

Sáng nay có bà chị gặp vấn đề sau đây:
Chị có một tập tin Excel 2003 trong có có 1 sheet có khoảng vài trăm ngàn row. Tập tin này chạy rất tốt trên Excel 2003.
Khi chị mở tập tin này bằng Excel 2007, chị filter một column thì máy bị not respond và hai CPU của máy bị chiếm 100%.
Chị nhờ mình chẩn bệnh và trị bệnh.
Đầu tiên mình xem qua cấu hình máy thì cấu hình máy rất cao, core i3, RAM 2G, bộ nhớ ảo set 4G.
Xem qua Event Viewer thấy OS ở tình trạng tốt không có vấn đề gì đáng quan tâm.
Mình nghĩ vấn đề là do Excel 2007 chạy file Excel 2003 (compitable mode) và hình save cái file này sang Excel 2007 (.xlsx). Tuy nhiên vấn đề không được giải quyết.
Sau một hồi lang thang trên mạng tìm hiểu sự khác biệt Excel 2007 và Excel 2003 mình phát hiện Excel 2007 có chức năng tự động tính toán. Chỉ cần tắt tính năng này là mọi việc được giải quyết:
Office button > Excel Options > Formula > Manual for Automatic Calculation

01/09/2011

August Album

AAB-1102 Class
Le Qui Don-Long An Alumni Annual Meeting
   Le Qui Don-Long An Alumni Scholarship  

29/08/2011

Set proxy cho HttpURLConnection


String proxy = "proxy.mydomain.com",
port = "8080"
;
URL url = new URL( "http://www.google.com/" );
Properties systemProperties = System.getProperties();
systemProperties.setProperty("http.proxyHost",proxy);
systemProperties.setProperty("http.proxyPort",port);

HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.connect();

28/08/2011

Lấy danh sách content provider trong một terminal

Sau đây là một đoạn code nhỏ để liệt kê danh sách các content provider trong một terminal:
for (PackageInfo package : getPackageManager().getInstalledPackages(PackageManager.GET_PROVIDERS)) {
  ProviderInfo[] providers = package.providers;
if (providers != null) {
for (ProviderInfo provider : providers) {
Log.d("Example", "provider: " + provider.authority);
}
}
}

19/08/2011

Xoá Spanable Image khỏi EditText

Nhiều lúc chúng ta muốn thêm hình ảnh vào EditText ví dụ như bạn viết chương trình chat bạn muốn thay chữ "hello" bằng hình ảnh smiley chẳn hạn thì đoạn chương trình sau đây sẽ hữu ích:
SpannableString ss = new SpannableString("hello@");
Drawable d = img.getDrawable();
d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BASELINE);
ss.setSpan(span, 0, 3, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
editT.setText(ss);

Bạn hãy hiện thực TextWatcher bằng Activity chứa EdiText hiện tại. Trong sự kiện afterTextChange bạn đặt đoạn chương trình trên sau khi bạn nhận được đoạn text là "hello".
Tuy nhiên lúc này có một vấn đề khác là làm sao để xoá hình khi người dùng nhấn phím "Back" trên Soft Keyboard. Vì khi nhấn phím này thì hình sẽ bị xoá nhưng khi nhập vào ký tự bất kỳ thì hình lại hiện ra và các ký tự nhập vào biến đâu mất.
Để giải quyết bài toán này bạn hãy hiện thực Activity hiện tại interface OnKeyListener. Trong hàm onKey bạn kiểm tra View có phải là EditText, keycode có bằng KEYCODE_DEL và keyevent có action là ACTION_DOWN hay không. Nếu đúng vậy thì bạn sử dụng đoạn mã sau để xoá hình:
   Editable buffer = ((EditText) view).getText();
 // If the cursor is at the end of a RecipientSpan then remove the whole span
 int start = Selection.getSelectionStart(buffer);
 int end = Selection.getSelectionEnd(buffer);
 if (start == end) {
 ImageSpan[] img = buffer.getSpans(start, end, ImageSpan.class);
if (img.length > 0) {
 buffer.replace(
 buffer.getSpanStart(img[0]),
 buffer.getSpanEnd(img[0]),
 ""
 );
 buffer.removeSpan(img[0]);
return true;
 }
}

16/08/2011

Google thâu tóm Motorola Mobility

Ảnh:Digitaltrends 
Sau thất bại trong cuộc đấu giá kho bản quyền phát minh Nortel cách đây vài tháng mà người chiến thắng lại là đối thủ trực tiếp RIM, Apple, Microsoft, Sony, Google đã có bước đi chấn động thị trường công nghệ đó là mua lại Motorola Mobility (công ty chuyên sản xuất điện thoại của tập đoàn Motorola) với giá 12,5 tỷ USD.
Nói về sự xác nhập này Larry Page nói:“Cùng nhau, Google và Motorola sẽ tạo ra những trải nghiệm sử dụng sản phẩm phi thường, giúp củng cố thêm sự vững chắc cho hệ sinh thái Android, mà ở đó lợi ích của người dùng cuối, đối tác kinh doanh và giới phát triển phần mềm sẽ được đặt lên hàng đầu. Tôi trân trọng chào mừng Motorola trở thành thành viên mới nhất của đại gia đình Google.”
Thương vụ này chứng tỏ rằng Google quyết tâm bảo vệ đứa con cưng Android của mình trước sự tấn công mạnh mẽ của các đối thủ cạnh tranh.

11/08/2011

Sử dụng Photoshop/GIMP để thiết kế QML

Sử dụng QML để lập trình giao diện là điều rất hấp dẫn cho những lập trình viên Qt.
Kể từ phiên bản 2.1 Qt Creator đã hỗ trợ khá tốt cho việc thiết kế QML. Tuy nhiên để có một GUI đẹp Qt developer phờ nhờ đến các phần mềm xử lý đồ hoạ chuyên nghiệp như Adobe Photoshop hay GIMP (nếu bạn là thần dân của cộng đồng FOSS). Sau khi có bản thiết kế đồ hoạ để chuyển sang mã QML lại là một bài toán không khó nhưng khá nhàm chán và tốn nhiều công sức. Xuất phát từ ý tưởng slice của Adobe Photoshop chuyển bản thiết kế website sang trang HTML người ta đã viết các plugin cho Adobe Photoshop và GIMP để cho phép design có thể export bản thiết kế của mình sang mã QML. Tôi là thần dân của FOSS nên tôi sẽ giới thiệu với các bạn cách dùng GIMP để export ra QML:
1) Download "Gimp-Python support easier" từ liên kết http://photocomix-resources.deviantart.com/art/Gimp-Python-support-easier-74889017.Giải nén và tiến hành cài đặt tất cả các gói phần mềm có trong đó.
2) Down load GIMP for Windows từ http://gimp-win.sourceforge.net/stable.html. Khi cài đặt nhớ chọn "Customize" để chọn Gimp-Python.
3) Download extension từ http://libregraphicsworld.org/news.php?readmore=597.Đọc file README để biết cách cài đặt.
Bây giờ mở GIMP lên bạn đã nhìn thấy một menu item "Export to QML" đã được thêm vào menu "File".
Xem video:

 Reference:
  1. Jens Bache-Wiig, Exporting QML from Photoshop and GIMP 
  2. QML exporting script makes GIMP a UI design tool 


10/08/2011

Xây dựng Hammock Task

Hammock Task (hay Task hình chiếc võng): Từ cái tên đã gợi cho chúng ta hình dung phần nào về đặc điểm của task loại này. Hammock Task là Task C mà thời điểm bắt đầu phụ thuộc vào thời điểm kết thúc của Task A và thời điểm kết thúc phụ thuộc vào thời điểm bắt đầu một Task B .Do đó duration của Task C này hiển nhiên là phụ thuộc vào A và B, khi thời điểm kết thúc của Task A hay thời điểm bắt đầu của Task B thay đổi thì duration của Task C thay đổi theo.
A|------C--------|B
     A|------C---|B
Cách xây dựng Task C:
  1. Xây dựng hay xác định 3 task A,B,C như trên
  2. Chọn ô chứa ngày kết thúc Task A ( ngày mà Task C bắt đầu).
  3. Từ Edit menu chọn Copy (Cell).
  4. Chọn ô mà chứa ngày bắt đầu Task C
  5. Từ Edit menu chọn Paste Special > Paste Link
  6. Chọn ô chứa ngày bắt đầu Task B (ngày mà Task C kết thúc).
  7. Từ Edit menu chọn Copy (Cell).
  8. Chọn ô chứa ngày kết thúc Task C
  9. Từ Edit menu chọn Paste Special > Paste Link
Lưu ý:
  1. Task C không được có predecessor. Task A và Task B có thể có predecessor.
  2. Task C không thể có duration âm (Task B xảy ra trước khi Task A kết thúc. Task C trở thành milstone khi duration bằng 0.
  3. Vì OLE cập nhật không phụ thuộc vào sự tính toán của project do đó có thể bạn sẽ không nhìn thấy một số kết quả  như mong đợi sau khi bạn thực hiện việc tính toán trên project. Khi đó bạn cần vào Edit menu >Links > Edit/update OLE links (Patse Link) hoặc nhấn phím F9 2 lần
  4. Vì Task C phụ thuộc vào A, B nên mọi sự thay đổi của A,B có thể ảnh hưởng đến C.
  5. Nếu Task C là Task con của một Summary Task thì Task C có thể phải thừa kế các predecessor của Sumary Task và khi đó thời gian bắt đầu, kết thúc sẽ bị ảnh hưởng và có thể bị lặp vòng. 

09/08/2011

Thêm ngày lễ vào lịch của dự án

Bài viết này áp dụng cho Microsoft Project 2007.
Trong Microsoft Project 2007 không có lịch những ngày lễ được thiết lập trước do đó bạn cần thêm các ngày nghỉ lễ của công ty bạn vào trong lịch của dự án một lần. Trong trường hợp bạn muốn dùng lại việc thiết lập này cho nhiều dự án thì bạn nên tạo template hoặc thêm lịch vào tập tin toàn cục hoặc enterprise global template.
  1. Tools > Change Working Time
  2. Trong danh sách "For calendar" chọn lịch mà bạn muốn thay đổi.Project Calendar chọn Standard (Project Calendar) hoặc 24 Hours hoặc Night Shift cho lịch của dự án.
  3. Chọn Exceptions trong Change Working Time.
  4. Đặt một cái tên ví dụ Ngay_le chọn thời điểm bắt đầu, thời điểm kết thúc
  5.  Nếu Ngay_le lập lại nhiều lần trong dự án thì nhấn chuột vào "Details"
  6. Trong Recurrence pattern chọn tần xuất lập lại từ "Daily" (hàng ngày) đến "Yearly" (hàng năm).Range of recurrence chọn "Start" cho thời điểm bắt đầu, chọn "End after" hoặc "End by" cho thời điểm kết thúc.
  7. Nếu bạn chọn   "End after" bạn phải nhập vào số lần mà Ngay_le lặp lại.Nếu bạn chọn "End by" bạn phải nhập vào ngày mà Ngay_le ngừng lặp.
Các task bạn schedule quanh Ngay_le sẽ bị schedule lại để Ngay_le là ngày không làm việc.

02/08/2011

July Album

IVC Champion Cup (07/31/2011)
SCAMPI A (07/30/2011)
 AAB-1101 Class (07/23/2011)
IVC Amazing Race (07/08/2011)

27/07/2011

Tại sao phải truy xuất View qua hàm findViewById

Trong khi lập trình Java, Delphi, C++ ... nếu chúng ta có Form a, b là Widget nằm trong a thì ta có thể truy xuất b bằng cách a.b hay một cách tương tự.
Vậy tại sao trong Android, nếu có Activity a và View b nằm trong file layout của a thì ta không truy xuất b qua a mà phải sử dụng hàm static của Activity findViewById?
Thật ra nếu ai nắm kỹ về định nghĩa Activity đều dễ dàng trả lời câu hỏi này:
Activity là đối tượng mà chúng ta đặt lên trên nó các View để xây dựng nên màn hình
Vậy các View không phải "nằm trong" hay đối tượng con của đối tượng Activity như trường hợp của Form ở trên.

24/07/2011

Tại sao mã nguồn Android có giấy phép sử dụng APL 2.0

Sau khi học qua Kiến trúc của Android:
Có một số bạn thắc mắc GNU libc có giấy phép sử dụng là LGPL vậy Android sử dụng GNU libc thì tại sao Android lại có giấy phép sử dụng là APL 2.0 chứ không phải là LGPL hay GPL?
Thật ra Android không dùng GNU libc (glibc) mà Android sử dụng Bionic libc.
Sau đây là một số đặc điểm của Bionic libc:
  • Giấy phép sử dụng: BSD License.
  • Kích thước: Vì libc được load lên trong mỗi process cho nên kích thước của libc càng nhỏ càng tốt. Bionic libc có kích thước khoảng 200KB bằng một nửa kích thước GNU libc.
  • Tốc độ:Bionic libc hiện thực lại pthread để nó nhỏ gọn hơn, tốc độ nhanh hơn để khắc phục hạn chế sức mạnh của CPU.
  • Bionic libc bổ sung thêm chức năng dành riêng cho Anroid như system properties và logging.
  • Bionic libc không hỗ trợ không số đặc điểm của POSIX như C++ exception, wchar cho nên Bionic libc không tương thích với GNU libc.

Tại sao gọi hàm setContentView trong onCreate?



Sau khi học qua vòng đời của một Activity:

có người thắc mắc rằng tại sao chúng ta không đặt lời gọi hàm setContentView để thiết lập layout cho Activity ở onStart hay onResume mà phải đặt nó trong onCreate?
Để trả lời cho câu hỏi này chúng ta xem xét mối quan hệ giữa các sự kiện xảy ra trong vòng đời một Activity và ba trạng thái của Activity (background/foreground/visible):
Chúng ta thấy rằng onStart/onResume ở trạng thái visible cho nên người dùng đã nhìn thấy màn hình của Activity. Nếu ta gọi hàm setContentView ở đây thì xảy ra tình trạng người dùng sẽ nhìn thấy màn hình trống trong khoảng thời gian nhất định.

19/07/2011

Gửi dữ liệu sang ứng dụng khác sử dụng Notification

Giả sử chúng ta muốn gửi dữ liệu sang ứng dụng khác có tên class:
com.nghelong.blogexample.MainActivity
sử dụng Notification. Điều này có nghĩa là khi ứng dụng chúng ta đang chạy thì xuất hiện một Notification message trên thanh status bar. Khi người dùng click vào Notification thì màn hình MainActivity bật lên.


Notification notification = new Notification(icon, tickerText, when);
Bundle xtra = new Bundle();
Intent ntent = new Intent(); 
ntent.setClassName("com.nghelong.blogexample",
                    "com.nghelong.blogexample.MainActivity");
//set data here
//xtra
ntent.putExtras(xtra);
int flags = Intent.FLAG_ACTIVITY_NEW_TASK
                    | Intent.FLAG_ACTIVITY_SINGLE_TOP
                    | Intent.FLAG_ACTIVITY_CLEAR_TOP; 
ntent.setFlags(flags);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
                ntent, PendingIntent.FLAG_UPDATE_CURRENT); 
notification.setLatestEventInfo(context, contentTitle, contentText,
                pendingIntent);
nm.notify(NOTIFICATION_ID, notification);
 

17/07/2011

Sử dụng ngôn ngữ trong ứng dụng Android không phụ thuộc vào locale của thiết bị

Các bạn chắc ai cũng biết Android support multi-language dựa vào cơ chế alternative resource và locale của device. Điều đó có nghĩa là ngoài thư mục res/values bạn cần chuẩn bị các thư mục res/values-[mã ngôn ngữ] hay res/values-[language code]-r[mã vùng] ( nếu như ngôn ngữ có nhiều vùng, nhiều quốc gia sử dụng) khi bạn muốn ứng dụng của bạn hỗ trợ một ngôn ngữ nào đó. Ngoài ra để ứng dụng bạn chuyển sang ngôn ngữ này thì bạn cần cấu hình cho thiết bị sử dụng locale tương ứng với ngôn ngữ.
Tuy nhiên có một tình huống đặt ra như sau: Bạn dùng máy với locale Tiếng Anh nhưng bạn lại muốn ứng dụng của bạn hiển thị Tiếng Việt. Hay ứng dụng của bạn có nơi hiển thị danh sách ngôn ngữ, người dùng chọn ngôn ngữ nào thì ứng dụng bạn hiển thị ngôn ngữ đó. Bài toán này được giải quyết như sau:

String languageToLoad  = "vi";
Locale locale = new Locale(languageToLoad);
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config, null);
Trong tập tin AndroidManifest.xml:
<activity
  android:label="@string/app_name"
  android:name=".Dex"
  android:configChanges="locale">
<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:anyDensity="true"
/>   
Sau đó để không phải restart lại ứng dụng chúng ta sử dụng câu lệnh sau:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); 
Tham khảo:
  1. Force Locale on Android
  2. Selecting language from within the app rather than by locale of the system settings

11/04/2011

QML Internationalization

  • Bước 1: Sử dụng một trong các hàm sau để đánh dấu các chuỗi cần biên dịch: qsTr(), qsTranslate(), QT_TR_NOOP() và QT_TRANSLATE_NOOP(). Ví dụ: Text {text:qsTr("Monday")}
  • Bước 2: Sử dụng lupdate để tạo translation source file:
    ví dụ:
    lupdate vidu.qml -ts vidu.ts
    Chúng ta dùng Linguist mở vidu.ts, dịch rồi release thu được tập tin vidu.qm
  • Bước 3: Thực thi qmlviewer với tuỳ chọn translatation:
    qmlviewer -translation vidu.qm vidu.qml

02/04/2011

Trạng thái mạng và android.net.conn.CONNECTIVITY_CHANGE

Đối với một số người mới lập trình hệ thống trên Android sẽ lúng túng khi sử dụng android.net.ConnectivityManager để quản lý trạng thái mạng (kết nối, đứt kết nối ...). Sau đây là một ví dụ đơn giản để giải quyết vấn đề này:
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class NetworkStateReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(android.net.conn.CONNECTIVITY_CHANGE)) {
//Làm việc gì đó
}
}
}
Trong manifest file:
<receiver class=".NetworkStateReceiver" android:name=".NetworkStateReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
  </intent-filter>
</receiver>   

Canterbury đặt dấu chấm hết cho Debian, Gentoo, Grml, OpenSUSE và Arch Linux

Dự án Canterbury sẽ cho ra đời Canterbury Linux. Đây có thể ví như sự kiện nhà Tần thống nhất Trung Hoa vậy vì Canterbury là sự hợp nhất của Debian, Gentoo,Grml, OpenSUSE và Arch Linux.
 Thông tin chính thức đã có trên trang chính của các distro trên:
  • http://www.debian.org/News/2011/20110401
  • http://www.gentoo.org/news/20110401-canterbury.xml 
  • http://blog.grml.org/archives/352-The-Canterbury-Project.html 
  • http://news.opensuse.org/2011/04/01/the-canterbury-distribution/ 
  • http://www.archlinux.org/news/the-canterbury-project/ 
Do đó tất cả những thần dân của Debian, Gentoo, Grml, OpenSUSE hay Arch bây giờ có thể hợp nhất dưới mái nhà chung Centerbury rồi.
Sự hợp nhất này đem lại cái lợi lớn là làm đơn giản hoá cho các nhà phát triển ứng dụng tuy nhiên lại làm mất đi sự phong phú, đa dạng trong cộng đồng chim cánh cụt.