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.

24/03/2011

Alert Dialog trong Android

Trong lập trình phát triển ứng dụng Android để giao tiếp với người dùng có hai cách:
  1. Sử dụng một màn hình (Activity)
  2. Sử dụng hộp thoại (Dialog)
Tuỳ tình huống cụ thể chúng ta chọn giải pháp phù hợp.
Việc sử dụng một Dialog thông minh đôi khi cho chúng ta một giải pháp tuyệt vời.
Để hiển thị Dialog trong Android chúng ta thường sử dụng AlertDialog.
Sau đây là đoạn mã sử dụng AlertDialog tôi thường sử dụng:
AlertDialog.Builder mAltBld = new AlertDialog.Builder(this);
mAltBld.setMessage("")
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface aDialog, int aID){
//Thực hiện điều gì đó khi người dùng bấm nút Yes.
}
})
.setNegativeButton("No",new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface aDialog, int aID){
//Thực hiện điều gì đó khi người dùng bấm nút No.
aDialog.cancel();
}

});
AlertDialog mAlert = mAltBld.create();
//Tiêu đề cho AlertDialog
mAlert.setTitle("Tiêu đề");
//Biểu tượng cho AlertDialog
mAlert.setIcon(R.drawable.icon);
mAlert.show();

03/03/2011

Lấy tên phương thưc hiện tại

Trong lập trình Java. Dôi khi bạn muốn lấy tên phương thức hiện tại ví dụ để xuất thông tin phục vụ cho gỡ rối chẳng hạn. Sau đây là kinh nghiệm của cá nhân mình:
Đối với Java 4:
new Exception().getStackTrace()[0].getMethodName();
Đối với Java 5:
Thread.currentThread().getStackTrace()[1].getMethodName();

Cấu hình Firefox hoạt động với Ultrasurf

Một điều đáng tiếc cho các thần dân FirefoxUltrasurf không tự cấu hình Firefox khi cài đặt (và hầu hết các công cụ che dấu IP dựa trên VPN khác cũng vậy ngoại trừ IP Privacy)
Có hai lựa chọn cho bạn khi bạn muốn sử dụng Firefox kết hợp với Ultrasurf để dấu mình khi truy xuất mạng:
  1. Cài Ultrasurf Firefox Addon.
  2. Tự cấu hình Firfox sử dụng các máy chủ Ultrasurf.
Trong bài viết này tôi nói về lựa chọn thứ 2. Bạn thực hiện theo các bước sau đây:
  1. Mở Firefox.
  2. Vào Tools --> Options ...
  3. Chọn trang Network, nhấn nút Settings


  4. Trong cửa sổ "Connection Settings" chọn "Manual proxy configuration"


  5. Điền vào ô HTTP Proxy và ô Port các giá trị tương ứng là 127.0.0.19666 (xem hình trên).
  6. Nhấn OK rồi OK một lần nữa.
  7. Khởi động chương trình Ultrasurf (bạn có thể nhìn thấy biểu tượng cái khoá màu vàng ở gócdưới bên tay phải màn hình của bạn)

  8. Vào trang WhatIsMyIPAddress.com để kiểm tra IP của bạn. Nó sẽ hiện lên một trong các IP của Ultrasurf. Bây giờ bạn đã có thể lướt Web ẩn danh rồi.
Lưu ý:
Bạn đừng quên chuyển "Connection Settings" từ "Manual proxy configuration" sang "Direct connection to the internet" sau khi thoát chương trình Ultrasurf nếu không bạn không thể truy xuất mạng bằng Firefox được.

    03/01/2011

    Chuyện tình Rau muống biển


    Hôm nay xem ảnh một người bạn vô tình nhìn thấy ảnh hoa muống biển.
    Bao nhiêu ký ức tuổi thơ quay về. Nhớ ngày xưa khi chăn trâu, chăn bò, có loài rau rất tốt, hoa tim tím rất đẹp nhưng trâu, bò không ăn. Có phải trâu, bò cũng cảm động với chuyện tình muống biển? Thưở đó, F thường hái hoa muống biển để giữa vòng ngón tay cái và ngón tay trỏ của bàn tay trái . Dùng tay phải đập mạnh, hoa vỡ ra, một tiếng kêu nhỏ phát ra.
    Từ khi F nghe câu chuyện đau lòng về muống biển thì F không còn chơi trò này nữa.
    HOA MUỐNG BIỂN
    (Khải Nguyên)
    Thiếu phụ ngóng chồng
    Nỗi đau hóa đá - vọng phu.


    Em ngóng đợi anh
    Nỗi buồn hóa thành hoa muống biển.


    Bông hoa trắng xinh xinh
    Nhụy hoa buồn tim tím
    Rưng rức mắt người
    Rưng rức trái tim đau...

    Sao em không hóa thành hòn đá ngóng trông nhau
    Bền vững, thủy chung, trầm mặc trông ra phía biển
    Em lại hóa thành loài hoa rau muống
    Cứ mãi bồng bềnh... làm khổ suốt đời nhau


    Dưới cái nắng ban trưa - lá héo, hoa úa màu
    Cứ dại khờ, oằn mình, vật vã dưới chân ai - trên cát
    Anh hiểu được em - nỗi buồn kia tan nát
    Người ấy không về... mê mải cuối trời xa...


    Suốt một đời, sao em chẳng nhận ra
    Hóa kiếp thân em - nỗi buồn xưa còn đó
    Lữ khách ơi, đừng một lần giẫm lên loài hoa nhỏ!
    Để cô muống chân tình tan nát... cõi lòng đau! 
    Chuyện tình Rau muống biển
    Nhạc:Hoàng Phương
    Trình bày: Giao Linh
    Em đến thăm anh mùa vui bên biển
    Nụ hoa muống biển rung rinh rung rinh 
    Chao sóng vỗ về chào em chào em 
    Làn gió mát ru, triền sóng hát ca 
    Hải âu tung trời đùa, cá tôm theo thuyền về 
    Anh kể chuyện tình về biển em nghe. 
    Thuở loài người có tên trước biển 
    Và không ai gọi biển như bây giờ 
    Có chàng trai tên Biển cùng yêu thương cô Muống chân tình 
    Biển mải mê khơi tìm luồng cá 
    Con nước vô tình cuốn biển trôi xa! 
    Muống âu sầu rồi chết bên bờ 
    Đời gọi tên từ đó loài hoa, loài hoa muống biển 
    Đời gọi tên từ đó: bông hoa trắng xinh xinh, nhụy hoa buồn tim tím 
    Mùa xuân không về phố bao giờ!!! 
    Để đêm đêm nghe biển ru bóng dừa... 
    Mùa xuân không về phố bao giờ! 
    Mùa xuân không về phố bao giờ! 
    Để đêm đêm nghe biển thức vọng về... 
    Để đêm đêm nghe biển thức vọng về.

    04/08/2010

    Khắc phục màn hình CRT bị nhoè

    Sáng nay tự nhiên cái màn hình máy tính LG Flatron ez T530S tự nhiên chữ bị nhoè.
    Sau một hồi chỉnh sửa các thông số về monitor và display adapter không đem lại kết quả.
    F nghĩ chắc là do phần cứng rùi. Cuối cùng mở cái màn hình ra và nhớ lại cái kiến thức xa xưa rồi không dùng về màn hình CRT. F cho rằng phải có cái nút để chỉnh biến trở cho mấy chùm tia quét chứ.  Dùng screw chỉ chỏ hồi cũng tìm ra 2 cái ốc hình chữ nhật. Trong đó có một cái là adjustable thôi.Chỉnh qua chỉnh lại đến mức OK.
    Lưu ý: Mở màn hình CRT là việc làm vô cùng nguy hiểm vì bạn dễ dàng bị điện giật. Do đó bạn chỉ áp dụng bài viết này cho mình khi bạn có kiến thức về an toàn điện.

    16/07/2010

    Firebird Developer Day Lần 7

    NHÀ TỔ CHỨC:

    Mind The Bird

    Giới thiệu về MindTheBird trên website http://www.mindthebird.com
    MindTheBird! is the Firebird Community activation campaign, with main goal to support launch of Firebird 2.5 and ensure the visibility of Firebird in the world of information technologies, media, open-source enthusiasts and end users.
    MindTheBird! provides a messaging framework, marketing materials and guidance for Firebird end-users, journalists and even competitors. We encourage all developers and enthusiasts of Firebird to be the part of this very important campaign.
    Be Firebird ambassador. Take a look around our website and we'll show you how you can help Firebird.
    MindTheBird đã tổ chức một số cuộc thi:
    1. Useful and Cool Stored Procedures
      Ba SP thắng giải:

    2. Firebird Articles
      Ba bài viết đạt giải:

    3. Thiết kế logo sinh nhật thứ 10 của Firebird.
      Tải về tại đây.

    Webinar:Technological history of Firebird - 3 decades of innovations

    Webinar do Ann Harrison trình bày lúc 14:00 08/04/2010.
    Tải toàn bộ webinar về tại đây (zip, 10.5MB)

    Webinar:SuperClassic: new architecture in Firebird

    Webinar do Dmitry Yemanov trình bày lúc 15:30 06/04/2010.
    Tải toàn bộ webinar về tại đây (zip, 35MB)