Lỗi khi debug của Visual Studio 2008, nhấn Step Into và Step Over thì lại giống như nhấn F5
Sau khi chuyển sang dùng VS2008 SP1, tôi gặp một lỗi ngớ ngẩn và rất khó chịu, nó làm giảm hiệu suất làm việc rất nhiều.
– “Step into” (khi bạn nhấn F11) hay “Step over” (khi bạn nhấn F10) không dừng lại ở các breakpoints.
– Đôi khi nhấn F10 và F11 thì VS2008 cư xử như ấn F5. —-> bạn sẽ không debug được
Đó là một lỗi của M$, mời xem tại đây: http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=365666 và https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=368650
Cài Hotfix sẽ chữa được lỗi này:
http://code.msdn.microsoft.com/KB957912/Release/ProjectReleases.aspx?ReleaseId=1796 (15.5MB)
Hy vọng giúp được các bạn.
Bổ sung:
Nếu bạn chạy windows 64bit (Vista 64, Windows 7 64 …) thì khi cài đặt có thể bị lỗi. Nguyên nhân thì chưa xác định rõ ràng (tôi đoán là do trên các bản win này, VS được cài ở Program Files (x86), chứa ký tự đặc biệt nên bản cài cho hotfix bị lỗi (xong trong log thì thấy) khi detect đường dẫn)
http://codepoet5150.com/2008/09/12/visual-studio-2008-sp1-setup-failure-on-64-bit-vista-solved/
Giải pháp: bạn disable ổ CD/DVD đi thì sẽ giải quyết được vấn đề
- bỏ các ổ ảo, virtual drive nếu có
- bỏ ổ CD thật (chuột phải vào My Computer, Manage, Disk Management, disconnect ổ CD hoặc remove driver letter/path đi)
Thị phần của smartphone tại Việt Nam tăng trưởng mạnh và đạt hơn 13%, mở ra cơ hội mới
Theo con số của công ty nghiên cứu thị trường GFK thì thị phần của điện thoại thông minh trong thị trường điện thoại di động Việt Nam đã đạt con số 13,4%. Thị phần điện thoại thông minh đã liên tục tăng trường trong các tháng gần đây. Thông tin này được đăng tải trong buổi cà phê sáng với nội dung Mobile Content so Viễn Thông A tổ chức.

Theo dự đoán, thị trường điện thoại thông minh sẽ còn tăng trưởng khi mà các dịch vụ cho điện thoại đang được đầu tư và mở rộng như email, nghe nhạc trực tuyến, chơi game trực tuyến và tới đây là mạng 3G.
(original from Tinhte.com)
- Như vậy từ thông tin này ta thấy có thể khai thác điện thoại di động nhiều hơn nữa để chạy các ứng dụng phức tạp, game tương tác, ứng dụng kết nối thực – ảo, … Các ứng dụng di động ngày càng được cởi trói về kích cỡ màn hình, bộ nhớ, sức mạnh xử lý của CPU.
- Thậm chí với tỷ lệ thị phần chiếm tới hơn 13% và còn tăng nữa, các công ty có thể nghĩ tới chuyện phát triển riêng phân khúc ứng dụng cho smartphone, bỏ qua nỗi khổ thường trực là phải lo vấn đề tương thích với các thiết bị tầm thấp (low-end) và tầm trung (mid-end)
mobile: Lập trình Hello world với Eclipse 3.5 và Android SDK
Bài viết này ghi lại các bước tuần tự để cài đặt và thiết lập môi trường giúp bạn lập trình ứng dụng cho Android. Tôi giả định máy bạn trắng trơn, chưa cài đặt gì dính dáng tới Java hay Android. Các bước sau đây là cách phổ biến, dễ và chính quy nhất:
Down và cài
- Download Eclipse (bản mới nhất vào thời điểm viết bài) là 3.5 . Tới địa chỉ này http://www.eclipse.org/downloads/ , tìm Eclipse for Java Developer, lấy bản tương ứng với hệ điều hành của bạn (xài windows thì cứ chọn win32 là OK). Các bạn nên download từ mirror của Oracle (từ VN thì rất nhanh)
- Download Android SDK tại đây http://developer.android.com/sdk/download.html
- Unzip Eclipse.
- Unzip Android SDK, VD là unzip vào: F:\Program Files\android-sdk-windows-1.5_r3
- Nhấn windows + Pause, chọn tab Advanced, chọn Environment Variables
- Nháy đúp vào mục PATH, dán thêm ;F:\Program Files\android-sdk-windows-1.5_r3\tools vào cuối (chú ý, có dấu ; để phân cách với các giá trị trước)
- Cài đặt một plugin cho Eclipse là Android Development Tools (ADT), tại đây
1. bật Eclipse, chọn Help > Install new Software (Software Updates) ….
2. Chọn tab Available Software
3. Nhấn Add …
4. Gõ Name = ADT, gõ đường dẫn vào Location:
https://dl-ssl.google.com/android/eclipse/
(Nếu gặp lỗi, sửa đường dẫn lại thành http://dl-ssl.google.com/android/eclipse/)
Nhấn OK.
5. Quay lại mục Available Software, bạn sẽ thấy danh sách các plugin (có thể bạn phải chọn lại trong Combo Work With, chọn ADT), có mục “Developer Tools” ở ngay dưới, hãy nhấn chọn checkbox và nhấn Install…
6. Ở màn hình tiếp theo, bạn sẽ thấy một list các mục, 2 mục “Android DDMS” và “Android Development Tools” phải có mặt. Nhấn Next.
7. Đọc và đồng ý các thoả thuận bản quyền, nhấn Finish. Hãy chờ Eclipse tải về các plugin và cài đặt.
8. Khởi động lại Eclipse.
- Mở Eclipse, bỏ qua hết các error hay inFo nếu có hiện lên
- Chọn menu Windows/Preference
- Chọn mục Android, dán vào ô textbox : F:\Program Files\android-sdk-windows-1.5_r3
- Nhấn Apply. Vậy là xong các bước để cấu hình, dịch, debug ứng dụng Android của bạn.
Cấu hình emulator (để chạy thử ứng dụng của bạn)
- Mở Menu Start của windows, chọn Run, gõ cmd, gõ Enter.
- Hãy chuyển đến ổ đĩa mà bạn đã unzip android, nhảy vào thư mục tools của android (ở VD này sẽ là:
F: để sang ổ F
cd Program Files\android-sdk-windows-1.5_r3\tools
)
- Gõ lệnh android create avd –target 2 –name my_avd rồi enter. Nhấn enter tiếp khi được hỏi cài custom hardware profile.
Vậy là xong phần cài đặt và cấu hình, giờ bạn có thể tạo project mới, viết ứng dụng được rồi.
VD để viết Helloworld cho bản 1.5
- Chọn File, New, New Project
- Chọn Android
- Điền các thông số cần thiết (target chọn bản 1.5 cho mới, min SDK version = 3)
- Mở file .java ra (có 1 file duy nhất thôi)
import thêm lớp này
import android.widget.TextView; - xoá dòng setContentView cũ, thêm đoạn này vào
TextView tv = new TextView(this);
tv.setText(“Hello, Android”);
setContentView(tv);
- Nhấn mũi tên nhỏ cạnh nút Debug, chọn Debug Configuration, chọn Tab Target, chọn sang Automatic, chọn một AVD mà ta đã tạo từ lúc trước. Apply, Close.
Vậy là xong, bạn có thể nhấn Debug, Eclipse (cùng với ADT) sẽ dịch, install chương trình sang máy ảo Android (Emulator), khởi động máy ảo Android (khá lâu, mất khoảng 1 phút), rồi chạy chương trình.
Nếu bạn sửa mã, cứ sửa trong code Java, đừng tắt Emulator (kẻo bật lại rất lâu). Khi Debug lại, ADT sẽ tự cài đặt lại lên Emulator, không phải khởi động từ đầu Emulator.
Đọc thêm
Xem thêm về Android Emulator: http://diendan.vietandroid.com/showthread.php?t=34
Xem thêm về việc dựng giao diện bằng XML: http://developer.android.com/guide/tutorials/hello-world.html
dùng Cache trong ASP.NET
Bài này đề cập tới DataCaching của ASP.NET. Các vấn đề outputCaching (cache cả trang aspx) và fragmentCaching (cache một ascx, một phần của trang Aspx) là khá dễ, chỉ cần setup vài thẻ trong mã aspx là xong nên không được đề cập trong bài.
Xem thêm tại http://aspnet.4guysfromrolla.com/articles/022802-1.aspx
Cache về bản chất giống như một HashTable, lưu key là một String, value là đối tượng .NET. Tuy nhiên Cache thì có tính năng đặc biệt là tự động gỡ bỏ các entry theo thời gian hoặc khi hết bộ nhớ để lưu.
Truy xuất Cache:
dùng đối tượng tĩnh HttpContext.Current.Cache
nếu trong Page aspx, dùng Server.Cache
nếu trong ashx, dùng context.Cache
tất cả đều truy xuất đến cùng một chỗ lưu cache của ASP.NET.
Có hai kiểu chính sách hết hiệu lực bạn có thể sử dụng khi lưu giữ dữ liệu trong cache.
- Absolute expiration: hết hiệu lực vào một THỜI ĐIỂM xác định trong tương lai (VD: 10 phút nữa là huỷ đổi tượng).
Cache.Insert("cacheKey", ObjectToCache, null, DateTime.Now.AddMinutes(10), TimeSpan.Zero);
- Sliding expiration: gỡ bỏ các đối tượng sau một khoảng thời gian không dùng đến. Mỗi khi đối tượng được truy xuất, thời gian sống của nó sẽ được reset. (VD: loại bỏ các đối tượng mà đã lâu (10 phút) không dùng tới)
Cache.Insert("cacheKey", ObjectToCache, null,DateTime.MaxValue, TimeSpan.FromMinutes(10));
Mẫu code chung để sử dụng Cache là:
T GetValue(){
string CACHE_KEY = "cacheKey";
object oValue = cache[CACHE_KEY];
if (oValue == null) {
oValue = GetValueFromSomeWhere();
// Lưu giữ đối tượng theo kiểu nào tuỳ bạn chọn
cache.Insert(CACHE_KEY, oValue, null, DateTime.MaxValue, TimeSpan.FromSeconds(60));
}
return oValue as T;
}
Hàm GetValueFromSomeWhere() là chỗ bạn lấy dữ liệu thực ở đâu đó (VD lấy từ Database, đọc từ file …)
.
Một số bonus:
Hàm Cache.Insert() có đối số cuối cùng là CallBack. Tính năng này khá tiện, cho phép developer kiểm soát xem nên làm gì mỗi khi Cache entry bị gỡ bỏ (có thể kiểm tra, tạo lại mới luôn, hoặc thực hiện một số tác vụ …) . Tips: Dùng cái này có thể tránh được việc pooling để kiểm tra xem Cache entry hết hạn chưa.
Callback này không được khởi chạy nếu cache entry bị gỡ bỏ có chủ ý (bằng cách gọi Remove(), hay gọi Insert() mới đè lên)
Hàm Cache.Insert() nếu cung cấp key trùng với key đã có rồi sẽ gỡ bỏ entry cũ, ấn entry mới vào với key tương ứng ấy
Gửi mail từ dot NET qua Gmail
MailMessage mailMsg = new MailMessage();
mailMsg.From = new MailAddress("username@gmail.com");
mailMsg.To.Add(sTo);
mailMsg.ReplyTo = new MailAddress("new_username@gurucore.com", "reply to guru");
mailMsg.Subject = "subject of the mail";
mailMsg.IsBodyHtml = true;
mailMsg.BodyEncoding = Encoding.UTF8;
mailMsg.Body = "this is body, format is html <strong>hTML</strong>";
mailMsg.Priority = MailPriority.Normal;
// Smtp configuration
SmtpClient client = new SmtpClient();
client.Credentials = new NetworkCredential("username@gmail.com", "password");
client.Port = 587; //or use 465
client.Host = "smtp.gmail.com";
client.EnableSsl = true;
try
{
client.Send(mailMsg);
}
catch (SmtpException ex)
{
Literal1.Text = ex.Message + ex.StackTrace;
}
Xài nhanh (RAD) MySQL với C#
Khi code nhanh, cần giao tiếp CSDL, lập trình viên thường ẩu, không tính đến các vấn đề về bảo mật.
Một trong những trick đơn giản để tránh lỗi không đáng có khi giao tiếp CSDL, là khi insert, update, không nên sử dụng cách cộng chuỗi để ghép thành câu SQL mà nên sử dụng tham số hình thức (dấu ? trong câu SQL mẫu). Làm vậy sẽ tránh được SQL Injection:
string sSQL_NewMsg = "INSERT INTO `messages` (`user`, `time`, `msg`, `from`, `direct`, `reply`) " +
"VALUES (?user, ?time, ?msg, ?from, ?direct, ?reply); ";
MySqlParameter paramuser = new MySqlParameter("?user", "lockevn");
MySqlParameter paramtime = new MySqlParameter("?time", 1219057011);
MySqlParameter parammsg = new MySqlParameter("?msg", ".");
MySqlParameter paramfrom = new MySqlParameter("?from", "web");
MySqlParameter paramdirect = new MySqlParameter("?direct", DbType.Int32); paramdirect.Value = 0;
MySqlParameter paramreply = new MySqlParameter("?reply", DbType.Int32); paramreply.Value = 0;
try
{
MySqlHelper.ExecuteNonQuery(myCon, sSQL_NewMsg,
paramuser, paramtime, parammsg, paramfrom, paramdirect, paramreply
);
}
catch (Exception ex)
{
ex.ToString();
}
10 điều phải chấp nhận nếu làm ngành IT
“Dương thịnh âm suy”, thường xuyên bị stress, lương tăng chậm, dễ phải lấy người cùng nghề… là những thực tế bạn phải đối mặt nếu muốn theo đuổi nghề IT.
Dưới đây là 10 thống kê vui những “nguy cơ” tiềm ẩn trong ngành IT mà bạn có thể phải đối mặt nếu quyết tâm theo đuổi nghề này, thông qua con mắt của một blogger làm trong nghề.
10 điều phải chấp nhận nếu làm ngành IT
Ảnh minh họa
1. Ở những ngành khác thì nữ vừa nhiều vừa xinh đẹp, ngành IT thì ngược lại
Điều này ai đã và đang học CNTT ở các trường ĐH đều biết rồi. Không riêng gì trong ngành CNTT mà những ngành kỹ thuật, số lượng nữ giới cũng rất thấp. Tuy nhiên so với các ngành như cơ khí, điện tử thì tỉ lệ nữ giới học CNTT cũng còn khá cao. Nhưng khi học xong và đi làm, tỉ lệ nữ giới làm lập trình lại càng giảm, đa số các bạn ấy làm QC, DB, BA… Ở nhóm tôi khoảng 20 người chỉ có mỗi 2 dev, 2 QC là nữ, còn lại toàn “đực rựa”. Tuy nhiên điều an ủi là trong công ty vẫn có nhiều chị em xinh lắm, nhưng không làm ở bộ phận lập trình. Thiếu thốn này thường dẫn đến điều thứ hai.
2. Xác suất phải lập gia đình với người cùng ngành rất cao
Nghe có vẻ như hơi mâu thuẫn, đã ít nữ thì làm sao xác suất này cao được. Thế nhưng với những người làm IT thì kể từ lúc đi làm thường nhìn máy tính nhiều hơn giao tiếp với ngưòi thật nên sẽ ăn nói kém, giao tiếp kém, cơ hội gặp phụ nữ khác ngành cũng ít hơn người làm ở ngành khác nên trời kêu ai nấy dạ. Tuy nhiên chúng ta thường quen nửa cuộc đời của mình từ trong trường ĐH hoặc ở nơi làm việc nên điều này có thể cũng đúng với những người làm ở các ngành khác. Dù những người làm ở ngành IT chúng ta thường được cái thông minh, nhưng hai người thông minh thì sinh con ra chưa chắc thông minh nên đây cũng là một hiểm họa tiềm tàng. Hơn nữa, hai người cùng ngành IT giờ gặp nhau ngoài nói chuyện bug, code thì chán chết. Phải chi chàng kể chuyện bug, nàng hỏi bug là gì hở anh thì có phải thú vị hơn biết bao.
3. Bạn sẽ bị yếu đi
Điều này không có gì phải bàn cãi. Thứ nhất ngồi nhiều… thì bụng và mông sẽ to. Bụng càng to càng khó làm… nhiều thứ và tuổi thọ giảm. Ngồi nhiều còn có thể gây ra nhiều bệnh tế nhị khác. Ngoài hai bệnh đằng trước và đằng sau thì còn bệnh ở mắt do nhìn quá nhiều. Đa số người làm IT xung quanh ta đều bị cận thị. Gõ máy tính thường xuyên sẽ ảnh hưởng đến tim, rê chuột thường xuyên sẽ thoái hóa cổ tay. Ngoài ra cột sống sẽ bị chai hoặc mọc gai do tật ngồi nhiều hơn đứng của công việc này.
Ngoài ra, người làm IT thường có thói quen làm việc, sinh hoạt ban đêm. Cái giờ đáng lẽ những người ở những ngành khác làm cái việc mà ai cũng biết là việc gì thì người trong ngành IT lại gõ gõ, click click và thường gây ra bệnh đau bao tử. Tay chân ít hoạt động nên con người thường cảm thấy mỏi mệt, lười vận động, thậm chí cả lười tắm nên đừng thắc mắc tại sao một số SV ngành IT thường ở dơ. Nói chung làm cái nghề này nếu ko chịu sinh hoạt… điều độ thì đừng mong thọ.
4. Bạn sẽ thường xuyên bị làm phiền bởi người quen
Đây là một trong những điều tệ hại và khó chịu nhất bạn sẽ gặp phải. Những người quen của bạn: bạn bè, bà con, cô dì chú bác, bạn của ba của mẹ sẽ gọi điện nhờ bạn giúp khi họ không nghe nhạc được, máy khởi động chậm, không thấy webcam, không biết đưa hình lên blog. Kiểu hỗ trợ kỹ thuật miễn phí này nên cẩn thận vì nó sẽ thường xuyên lặp đi lặp lại. Một số trường hợp bạn sẽ được trả công nhưng theo tôi, bạn chẳng cần số tiền chả đáng đổ xăng đó làm gì so với thời gian phải chạy đi chạy lại. Đa số người nhờ bạn giúp sẽ mong muốn được hỗ trợ miễn phí và tôi chắc chúng ta sẽ không vui gì về điều đó. Vì vậy hãy tập nói không khi có thể.
5. Bạn sẽ phải thường xuyên về trễ mà không được trả tiền
Đặc thù của ngành IT là công việc thường không thể tính chính xác bằng giờ. Có nghĩa là không phải cứ một lượng thời gian nào đó thì sẽ làm xong một công việc. Thường chúng ta sẽ phải ở lại thêm 1 giờ, 2 giờ để làm nốt công việc của mình nếu bạn là người có trách nhiệm. Nhưng dù có trách nhiệm hay không thì khi công việc chưa xong mà đã gần đến deadline thì bạn vẫn phải ở lại để hoàn thành những gì còn dở dang, tất nhiên không có xu nào cả.
6. Bạn sẽ thường xuyên bị stress
Khi làm việc với những project lớn nhiều người, công việc sẽ theo flow rõ ràng, bạn làm, người khác test, manager gí, và khi đến những ngày cuối cùng là lúc bạn làm việc nhiều nhất. Phải suy nghĩ nhiều, cơ thể mệt mỏi, thiếu ngủ cộng với căng thẳng khi làm việc sẽ khiến nhiều người bị stress. Theo một số điều tra, thủ phạm gây stress nhiều nhất là email. Khi phải đọc khoảng 100 email một ngày thì người hiền lành cũng trở nên gắt gỏng. Bởi vậy những người làm IT thường hay khó chịu đột xuất.
7. Lương bạn sẽ tăng rất chậm
Làm IT lương khởi điểm sẽ khá cao so với một số ngành nhưng tốc độ tăng sẽ chậm và ít đột biến. Thường người làm IT sẽ giải quyết nhu cầu tăng lương bằng cách nhảy sang công ty khác. Cho nên những bạn sinh viên mới ra trường nên tìm một công ty có lương khởi điểm khá tốt, vì thông thường chu kỳ tăng lương sẽ là từng năm và khi lạm phát hai chữ số mà tăng lương dưới 15% cộng với trả lương bằng tiền Việt thì hơi bị đuối. Tốt nhất nên tìm hiểu những anh chị đi trước hoặc xác định mục tiêu của mình để tìm hướng đi khác vì làm lập trình chay khó làm giàu lắm.
8. Không phải lúc nào cũng được làm công việc ưa thích
Bạn từng nghĩ sẽ áp dụng những kỹ thuật tiên tiến nhất của các ngôn ngữ lập trình hiện đại, sẽ học hỏi những công nghệ mới nhất và làm việc với những chuyên gia đầy kinh nghiệm trong lĩnh vực CNTT nhưng thường không phải như vậy. Ở những công ty càng lớn càng có những project kỳ lạ kiểu như chuyển nguyên một chương trình từ VB6 sang C#, hoặc từ một ngôn ngữ rất cổ xưa sang C#.
Tuy đòi hỏi kiến thức lập trình trên hai ngôn ngữ, khả năng đọc hiểu code nhưng nói chung công việc như vậy khá nhàm chán và tôi nghĩ chẳng ai muốn theo đuổi lâu dài. Đối với những project lớn thì chi phí công nghệ mới là một trong những vấn đề quan tâm của khách hàng. Bạn muốn sử dụng SQL 2005 nhưng khách hàng sẽ nói “No” khi họ đã có licence cho SQL 2000 và không muốn bỏ tiền mua thứ mới. Bạn muốn sử dụng ASP.NET để làm website cho khách hàng nhưng họ cho rằng PHP sẽ rẻ hơn vì không tốn nhiều licence cho máy chủ WINDOWS. Bạn muốn dùng ORM tool để tiết kiệm thời gian lập trình nhưng khách hàng nhất quyết bạn phải dùng Store Procedure và viết code gọi bằng C# vì làm vậy nhanh hơn 30 milisecond khi gọi 10.000 query. Nói chung khách hàng là thượng đế và chúng ta phải nghe theo.
9. Khi nhảy việc cũng không đơn giản, có khi phải bắt đầu lại từ đầu
Lương bạn hiện không cao trong khi lương tụi bạn đã gấp hai mình. Đề nghị sếp tăng lương thì sao, liệu sếp có chịu tăng cho mình gấp rưỡi không chứ đừng nói gấp hai. Tại sao không nhảy việc khi vừa có thể có lương cao hơn lại có thể học hỏi nhiều cái mới và làm quen nhiều con người mới. Nhưng khi nhảy việc là lúc bạn phải chấp nhận làm lại từ đầu. Có thể bạn có nhiều kinh nghiệm từ công ty cũ nhưng sang môi trường mới sẽ không có đất để dụng võ. Và khi chưa biết gì hết thì bạn sẽ là một newbie (dân tay mơ) và chấp nhận làm lại từ con số không. Vì vậy, theo tôi, nếu tìm được công việc mới lương gấp rưỡi trở lên thì hãy nhảy, còn không ở lại cho lành và chờ thời cơ.
10. Rất khó để tự kinh doanh riêng về IT
Tỉ lệ thất bại cao của các công ty IT mới thành lập đã nói lên điều này. Nếu bạn làm IT khi muốn mở một công ty làm phần mềm thì rất khó. Một trong những khó khăn lớn nhất là sự cạnh tranh. Bạn sẽ khó kiếm được project từ những khách hàng lớn khi công ty của bạn chưa hề có tên tuổi hoặc không có công ty mẹ đỡ đầu. Nếu chấp nhận làm dự án nhỏ thì có vô khối công ty đã làm như vậy. Những công ty may mắn sống sót nhờ vào dạng những project nhỏ này họ có thể thực hiện website trong một tuần nhờ tái sử dụng những cái đã có từ project cũ và chúng ta sẽ khó cạnh tranh mỗi khi kinh nghiệm tổ chức và kinh doanh là con số 0. Giỏi lập trình không có nghĩa là giỏi quản lý, và càng không có nghĩa là giỏi kinh doanh nên làm công ty về IT không hề đơn giản. Và khi không có project nào trong khi phải nuôi đội quân cỡ năm người, cộng với trả tiền điện, tiền mặt bằng trong ba tháng là bạn phải nghĩ đến chuyện giải tán.
Đó là 10 trong khá nhiều những khó khăn, thiệt thòi, gian khổ của ngành IT. Làm IT không đơn giản và không sướng chút nào, càng không dễ làm giàu. Thế nên những ai nghĩ làm IT sướng và lương cao thì nên xem lại và cân nhắc nếu như đang chọn nghề cho mình. Đây là những ý kiến chủ quan của tôi, có thể có nhiều ý kiến trái ngược và bổ sung khác nên rất mong được sự chia sẻ từ các bạn. Mọi comment khen ngợi, chửi bới đều hoan nghênh.
Theo Tuổi trẻ/Blogger Thoại Nguyễn
Sự khác nhau giữa <%= expressions %> và <%# expressions %> trong ASP.NET
Khi viết ASP.NET, nhất là với MVC, các bạn chú ý mấy điểm khác biệt sau để phun dữ liệu ra đúng ý mình nhé:
- <%= expressions %> được thực hiện tại thời gian render trang ASPX
- <%# expressions %> được thực hiện khi ta gọi phương thức DataBind(), và thẻ này sẽ không được thực hiện nếu ta không gọi phương thức DataBind()
- <%# expressions %> có thể được sử dụng trong thuộc tính của các server controls, còn <%= %> không thể làm giá chị trong các thuộc tính cho các server controls
Lập trình ứng dụng Facebook
(Draft version – ghi chú nhanh, chưa trau chuốt sửa chữa)
Vào đây tìm hiểu thêm thông tin (tiếng Anh)
http://developers.facebook.com/get_started.php
- Chuẩn bị kỹ thuật, server
- Thêm ứng dụng Facebook Developer vào account Facebook của mình, đây là chỗ quản lý và cấu hình các ứng dụng mà bạn phát triển
- Thiết lập tham số cho ứng dụng mới của bạn
- Phát triển ứng dụng của bạn
- Quản lý ứng dụng của bạn
Cần có facebook account
Cần biết lập trình một ngôn ngữ (dùng để viết) web nào đó, VD như PHP, Ruby on Rails, JavaScript, Python, ASP.NET — Nhất là những nền tảng ngôn ngữ có sẵn thư viện API để viết Facebook app (PHP, ASP.NET).
Hiểu biết cơ bản về Internet, SSH, MySQL, và Unix
Biết sử dụng Web hosting, có host để xài (để chứa ứng dụng của bạn)
Server cần chạy được HTML, tối thiểu một nền tảng lập trình web PHP (có cURL) và/hoặc .NET. Nếu có kết nối CSDL càng tốt
Cần cài ứng dụng Developer của Facebook
Vào mục này http://www.facebook.com/developers/ , chọn allow (để sử dụng facebook app Developer trong profile của mình)
Nhấn “Set Up New Application”. Khai báo, submit.
Xem thêm về các trường có thể khai báo tại đây: http://wiki.developers.facebook.com/index.php/Creating_a_Platform_Application
Có 2 thông tin quan trọng cần lưu ý:
* API key: chuỗi này là định danh ứng dụng của bạn với Facebook (về sau khi gọi API tới facebook luôn phải đính chuỗi này vào)
* Chuỗi bí mật của ứng dụng: Facebook sử dụng key này để xác định ứng dụng nào đang gọi, bạn ko được share key này cho ai khác.
Lưu ý, mỗi khi sửa thông tin của App, sẽ mất vài chục phút để update trên các Server của FB.
Các trường thông tin cần sửa là:
Canvas Page URL (url trên facebook để truy cập ứng dụng của bạn, lúc test bạn sẽ chạy thử từ URL này)
Canvas Callback URL (url của ứng dụng, mà bạn host trên site)
Tóm lại: đây là mô hình của ứng dụng trên Facebook: User Facebook Website của bạn (hay ứng dụng của bạn)
Do vậy, bạn nhất thiết phải có một webserver trên mạng (hosting, hoặc server riêng). PHP và MySQL là nên có, dù không bắt buộc.
Viết facebook app bằng .NET (dùng VS2008 và bộ Toolkit nguồn mở)
http://www.stevetrefethen.com/wiki/Facebook%20application%20development%20in%20ASP.NET.ashx
Một số phần quan trọng để ứng dụng của bạn thực sự trở thành một phần của facebook
Kiểu dáng phù hợp http://devtacular.com/articles/bkonrad/how-to-style-an-application-like-facebook/
Liệt kê App lên Application Directory
Chỉnh sửa các thông tin cơ bản của ứng dụng thật đầy đủ, nhất là trang About của App
Canvas Page: là nơi hiển thị chính của ứng dụng, là nơi cho user tương tác với App của bạn
Profile Box: ứng dụng của bạn có thể được hiển thị trên trang Profile của user
Application Menu: menu nhỏ bên dưới góc phải, tương tự như menu Start của Windows.
Xài FBML hay iframe cho ứng dụng của bạn?
http://wiki.developers.facebook.com/index.php/Choosing_between_an_FBML_or_IFrame_Application
FBML

Dựng trang nhanh dễ, dùng thẻ của facebook
Thể hiện các thành tố cơ bản của facebook rất đơn giản (chỉ cần ghi thẻ tương ứng là xong)
URL và kiểm tra xác thực user đơn giản
IFrames

Linh hoạt, thích viết gì thì viết, vì bản chất là User tương tác với trực tiếp với trang nằm trên hosting của mình
Chuyển các ứng dụng có sẵn sang dạng Facebook dễ dàng
Nhanh hơn khi sử dụng, User view trang không cần qua Proxy của FB để render các thẻ
Sử dụng JavaScript, HTML, CSS của mình (xài jquery, blueprint vô tư)
Chạy ajax nhanh hơn do user chạy trực tiếp trang của mình (không qua proxy)
Debug dễ hơn (vì mã HTML và js là nguyên bản)
vẫn chỉnh được kích thước (auto resize), không ngại bị scrollbar (dùng thêm js của facebook trong iframe)
Khuyên dùng: nên xài iframe, ko phải tái nạp các thành phần topbar và appbar,chatbar của Facebook, vẫn tận dụng được tốt FBML nếu dùng XFBML.

JS của facebook sẽ scan DOM và render lại các thẻ fb trên chính browser, bớt được các vòng roundtrip trên app server của mình
trích xuất dc URL trong iframe của mình ra trang facebook container (dùng js của facebook trong iframe của mình)
Nếu đang dùng iframe, có thể chuyển trang thành dạng FBML, sử dụng fb_force_mode
Có thể dùng HTML, đánh dấu, và dùng javascript lib của Facebook để có khả năng hiển thị tương tự FBML
http://wiki.developers.facebook.com/index.php/Using_HTML_to_Imitate_XFBML
Các thành phần cơ bản quan trọng của Facebook App
* API, gọi hàm, lấy dữ liệu trả về từ Facebook.
* FBML, Facebook Markup Language, ngôn ngữ mô tả của Facebook, khi ứng dụng trả về FBML, đi qua Proxy của Facebook, các thẻ fbml sẽ được render để trả về HTML thực cho User.
* XFBML, một mở rộng của FBML, sử dụng javascript để render FBML trên trình duyệt của User, không đi qua proxy.
* FQL, Facebook Query Language, lấy dữ liệu sử dụng dạng ngôn ngữ tựa như SQL query, không cần dùng API. Giảm tải lời gọi API, chỉ lấy những gì cần, tránh dùng nhiều round trip (nhiều lần gọi API) để lấy thông tin. (cách dùng tương tự như gọi API vì nó là một hàm API mà, bạn gọi API fql.query với tham số là query của bạn)
http://developers.facebook.com/news.php?blog=1&story=257
* FBJS, Facebook javascript
Facebook Connect
- biết được user facebook đang ở trên site của bạn
- đưa bạn bè lên site của bạn
- xuất bản thông tin mới từ site lên stream của các bạn facebook đã connect
- làm cho user comment được thông tin trên site bạn, và hiện cả trên facebook
Di cư ứng dụng web social của bạn lên facebook
Chuyển hết kho user lên facebook account: http://wiki.developers.facebook.com/index.php/Express_Registration
Silverlight – lập trình viên .NET cần đón đầu công nghệ
http://weblogs.asp.net/scottgu/archive/2008/10/14/silverlight-2-released.aspx
http://weblogs.asp.net/scottgu/archive/2007/05/07/silverlight.aspx
http://weblogs.asp.net/scottgu/archive/2008/11/16/update-on-silverlight-2-and-a-glimpse-of-silverlight-3.aspx
http://weblogs.asp.net/scottgu/archive/2008/02/22/first-look-at-silverlight-2.aspx
Webserver push tới browser (client), kỹ thuật và đánh giá, Reverse Ajax / Comet / Ajax Push
(đang nghiên cứu và đánh giá, thực hiện)
Giới thiệu công nghệ
Reverse Ajax refers to an Ajax design pattern that uses long-lived HTTP connections to enable low-latency communication between a web server and a browser. Basically it is a way of sending data from client to server and a mechanism for pushing server data back to the browser.[1][2]
This server–client communication takes one of two forms:
* Client polling, the client repetitively queries (polls) the server and waits for an answer.
* Server pushing, a connection between a server and client is kept open, the server sends data when available.
Reverse Ajax describes the implementation of any of these models, including a combination of both. The design pattern is also known as Ajax Push, Full Duplex Ajax and Streaming Ajax.
Từ khoá: Reverse Ajax / Comet / Ajax Push
Slow load
http://www.obviously.com/tech_tips/slow_load_technique
So sánh Push và Pull khi dùng Ajax
http://www.infoq.com/news/2007/07/pushvspull
Các lựa chọn để cài đặt
Comet – http://cometdproject.dojotoolkit.org/
Cometd Bayeux Ajax Push: Cometd is a scalable HTTP-based event routing bus that uses a Ajax Push technology pattern known as Comet. The term ‘Comet’ was coined by Alex Russell in his post Comet: Low Latency Data for the Browser.
MeteorServer – http://meteorserver.org/
jquery
dojo
APE http://www.ape-project.org/
Tomcat / Pushlets
http://www.pushlets.com/
http://www.icesoft.com/corporate/press_release_07_06_EE_1.0.html
http://www.icefaces.org/main/ajax-java/ajaxpush.iface
Apache
http://jha.rajeev.googlepages.com/web2push
PHP server push (chỉ xài với non-IE)
http://web.they.org/software/php-push.php
Đọc thêm
http://www.wired.com/wired/archive/5.03/ff_push_pr.html
http://www.patentstorm.us/patents/6381645/claims.html
http://www.itaware.eu/2008/11/03/push-push-push-on-the-browser/
http://www.itaware.eu/2008/11/03/push-push-push-on-the-browser/
http://www.openajax.org/member/wiki/Main_Page
http://www.theserverside.com/news/thread.tss?thread_id=40650
http://ajaxpatterns.org/HTTP_Streaming
http://cometdaily.com/
http://www.pathf.com/blogs/2006/05/not_there_yet_c/
Jetty 6 Servlet Container has it. It is called Continuation and is based on NIO
Scalability is a fundamental feature for a Comet Server, since a large number of concurrent TCP connections has to handled.
Lightstreamer is based on a staged event driven architecture, built over Java NIO classes, that allows it to handle an arbitrary number of connections with a fixed pool of threads.
Just to give you an idea of performance, on a single Pentium 4 CPU – 2.4 GHz, Lightstreamer Server was able to sustain 10,000 concurrent streaming connections with an outbound frequency of 1 update/sec per client.
.NET
http://www.codeproject.com/KB/aspnet/CometGrid.aspx?fid=1538113&select=3001476#xx3001476xx
http://www.codeproject.com/KB/aspnet/CometMultiClient.aspx
Móc nối toán tử ?? của C# để lấy tham số nhẹ nhàng hơn
C# từ bản 2.0 có toán tử ?? rất tiện. Toán tử ?? tương tự như hàm isnull() trong T-SQL của SQL Server vậy. Nó hoạt động như sau:
Nếu value1 là null thì sẽ trả ra value2;
VD:
Nếu dùng toán tử ??
string result = value1 ?? value2;
Nếu viết bình thường
string value1 = null;
string value2 = "Test1";
string result = value1 != null ? value1 : value2;
Cả hai trường hợp trên, biến result sẽ nhận giá trị “Test1″.
Sử dụng toán tử ?? thì bạn sẽ dễ viết hơn, ngắn gọn, bỏ đi được cả đống if() kiểm tra null. Với VD dưới đây, bạn có thể móc nối toán tử ?? để viết chỉ trên 1 dòng mã (chaining):
string partner = Request.QueryString["GoogleId"] ??
Request.QueryString["PartnerId"] ??
Request.QueryString["UserKey"] ??
string.Empty;
Câu lệnh trên sẽ dừng khi nó tìm ra giá trị querystring đầu tiên không null. Nếu tất cả querystring đều null thì nó sẽ trả ra chuỗi rỗng “”.
Nếu bạn sử dụng if()else thì sẽ phải viết rất nhiều mã, nhàm chán, lại phải lồng các if() vào nhau, khó đọc.
.
Nguồn: http://www.west-wind.com/weblog/posts/236298.aspx
Sử dụng YUI Compressor với Visual Studio
1. Minified (làm tối thiểu hoá) hay compress các file text. Công việc này thường là: bỏ các dấu xuống dòng, bỏ các dấu cách, dấu tab thừa (mà developer thường dùng trong khi viết mã – cho đẹp).
2. Khi làm web, nếu làm kỹ lưỡng thì tất cả các file JS, CSS đều phải được minified, giảm khá nhiều dung lượng truyền tải. Đôi khi còn phải ghép nhiều file thành 1 file nữa (để giảm số lần request, thay vì lấy 3 file 1.css 2.css 3.css thì chỉ lấy 1 file 123.css thôi, tiết kiệm 2 request)
YUICompressor là công cụ khá tốt (và nổi để làm việc này). Bài viết này hướng dẫn dùng YUICompressor (kèm) với VisualStudio. (Ngắn gọn là cấu hình VS để nó gọi hộ mình chương trình Java YUICompressor)
Download YUI Compressor từ Yahoo và giải nén (unzip) nó vào thư mục nào đó.
Cấu hình External Tool của Visual Studio
Mở Visual Studio. Chọn (Tools -> External Tools…)
Nhấn Add, tạo một tool mới , đặt tên là YUI Compressor. Nhập các thông số như sau:
Chỉnh lại đường dẫn đến file jar (chỗ mà bạn vừa giải nén YUI Compressor ở bước trước).
Bạn cũng cần phải có khả năng chạy Java trên máy (Cài JRE hoặc JDK rồi, đặt Path đến java.exe rồi java.exe is in your path)
- Title: Yui Compressor
- Command: java.exe
- Arguments: -jar “E:\yuicompressor-2.4.2\build\yuicompressor-2.4.2.jar” $(ItemPath) –charset “UTF8″ –type js -o $(ItemFileName).min$(ItemExt)
- Initial Directory: $(ItemDir)
- Đánh dấu vào “Use Output Window”
Để thử nghiệm, bạn hãy chọn file js trong cửa sổ Solution Explorer. Sau đó mở menu Tool/Yui Compressor. Refresh lại thư mục trong Solution Explorer, bạn sẽ thấy các file dạng *.min.js
Bạn hãy làm tương tự để tạo Tool YUI cho các file css, chỉ chú ý là thay đối số –type thành css chứ không phải js khi cấu hình tool (trong ô nhập Argument)
Tạo Toolbar trong VS để làm cho tiện
Vào menu Tools->Customize. Nhấn New…
Sang tab Command , chọn mục Tools.
Kéo thả External Command 1 vào toolbar của bạn.
Hy vọng các bạn dùng .NET thấy hữu ích với kỹ thuật này. Kỹ thuật này có các điểm lợi:
- Bớt được việc mở commandline, gõ lệnh để chạy YUIC, mất thời gian, tốn công, khó setup, nhất là phải gõ đường dẫn. Giờ chỉ cần click chuột trên toolbar
- Vẫn dùng nguyên xi code của YUICompressor (Java). Khi YUI nó có thay đổi hay nâng cấp, tải về bản mới là xong.
Bài gốc cho bài viết này đc lấy tại đây:
http://blog.lavablast.com/post/2009/05/YUI-Compressor-for-Visual-Studio.aspx
Cách khác
Nếu bạn cảm thấy ngại cài thêm Java trên máy, đây là một công cụ khác, cũng có chức năng tương đương. Tuy nhiên nếu dùng bản này bạn sẽ không có điểm lợi thứ 2 (trong cách dùng Java YUIC như trên)
http://www.codeplex.com/YUICompressor
Đây là bản code viết bằng .NET, convert từ dự án (viết bằng Java) Yahoo! UI Library’s YUI Compressor. Tác dụng của nó cũng là nén JS và CSS tới mức tối đa mà vẫn đảm bảo hoạt động như bình thường.
Phiên bản này dựa trên YUI Compressor version: 2.4.2 (từ ngày 2009-02-22).
Tính năng chính
* Stock Yui Css compression.
* Stock Yui JavaScript compression.
* MsBuild task which can be used in a Web Deployment Project build.
* The MsBuild task also compiles all compressed files into a single destination file (aka. file combining).
* Can now handle Encoding Types (eg. Unicode) from v1.2.2.0 onwards and ThreadCulture from v1.3.0.0 onwards.
Xây dựng hệ thống chơi game Tá lả online
Tớ sắp làm một cái game chơi bài, trò chơi nổi tiếng và rất phổ biến tại Việt Nam – Tá Lả – Phỏm. Nếu các bạn muốn biết kỹ năng, những gì diễn ra trong đầu tớ, … hay đơn giản là cũng muốn tham gia, muốn học làm một thứ tương tự như thế này, thì hãy theo dõi bài này nhé.
Rất cảm ơn góp ý của @hoangxu, @gachien, @dungla, @tridm, @lehuongA2, @hoahongxam trong quá trình xây dựng tài liệu
Mô tả về trò chơi
Tớ dùng ngôn ngữ đời thường bình dân để mô tả, các bạn có viết doc cho doanh nghiệp, khách hàng nhớ đổi giọng văn nhé. Cách mô tả ở đây là dựng user story, hướng tới các bạn lập trình viên, để các bạn có thể dễ dàng biến mô tả này thành tổ chức dữ liệu và module business cho chương trình
Luật chơi Tá Lả thông dụng – quy ước, thuật ngữ
Quân = Cây: chỉ 1 lá bài
Số: chữ, số in trên lá bài, chỉ độ to của lá bài (A là nhỏ nhất < 2 <3 … < Q < K là to nhất)
Chất: màu, kiểu lá bài: rô cơ bích tép (nhép) (RCBT)
Bài (để chơi): luôn luôn có 9 cây (mỗi Người luôn có 9 cây trên bài và cả các cây đã ăn)
Hội chơi: một nhóm người chơi liên tục các ván tạo thành Hội. Hội tan rã (kết thúc) khi có 1 Người nghỉ.
Ván: một ván có tối đa 4 người chơi là Người1, Người2, Người3, Người4
NgườiN: N là số từ 1 đến 4, người bất kỳ trong ván chơi đều có Người Trước và Người Sau. Người cầm Bài để chơi.
Bắt đầu Ván: khi bắt đầu chơi, hệ thống sẽ Chia bài cho các người chơi.
- Các quân bài khi chia được phân phối ngẫu nhiên. Các quân còn lại (Nọc) cũng được sắp xếp ngẫu nhiên.
- Vị trí Người chơi 1 2 3 4 cũng được sắp xếp ngẫu nhiên. (hoặc vào trước ngồi trước)
- Nếu Ù, có option để cho chọn có random lại chỗ ngồi không
- Khi bắt đầu ván đầu tiên, Random để chọn người Đánh đầu tiên. Người này sẽ được (hệ thống) tự động lấy thêm Cây đầu từ Nọc
Nọc: phần bài còn lại ngay sau khi chia xong, đặt ở giữa bàn.
Cạ: 2 Quân cùng số (số bằng nhau, VD cùng là 2, cùng là Q) hoặc 2 Quân cùng Chất có Số cách nhau 1 hoặc 2 đơn vị
Phỏm: (Note: Phỏm cũng đc coi là cạ, vì vẫn thoả mãn điều kiện của Cạ): gồm 3 Cây trở lên. Các Cây này cần thoả mãn tính chất: liên tiếp Số cùng Chất, hoặc các cây có cùng Số
Lượt: Ván tá lả chơi theo lượt, lần lượt từng người chơi (Từ Người1 đến NgườiN, sau NgườiN là Người1). Mỗi khi đến Lượt (có Lượt), Người chơi phải làm hai việc: Lấy bài và Đánh bài. Lấy bài là quyết định Ăn cây Rác của Người Trước hoặc bốc một Cây từ Nọc lên. Đánh bài là Đánh, hoặc Ù. Lượt đổi luân phiên Ngược chiều kim đồng hồ.
Đánh: một Người khi đến lượt chơi, luôn luôn phải đánh Cây Rác (Người Sau có thể Ăn). Không được đánh cây đã Ăn. (Note: Đánh cây trong Cạ, trong Phỏm đều được) (Note: Móm vẫn phải đánh)
Cây Rác: Khi đến lượt, sau khi Lấy Bài (Người chơi sẽ có 10 Cây), Người chơi phải Đánh ra một Cây Rác (để bài luôn có 9 Cây)
Cây Đã Ăn: Người chơi ăn Cây Rác của Người Trước thì Cây đó sẽ trở thành Cây Đã Ăn của Người Chơi (đang có Lượt). Cây Đã Ăn phải luôn lật cho tất cả Người chơi trong Ván được biết.
Bốc: lấy một Cây từ Nọc khi đến Lượt
Chốt: khi Người chơi có Lượt mà Người Sau đã có 3 Cây Rác thì lần Đánh này gọi là Chốt.
Ăn: một Người khi đến lượt chơi, có thể ăn của Người Trước, chỉ được Ăn nếu cây đó Ăn vào Cạ –> trở thành Phỏm. Mỗi Phỏm chỉ được Ăn vào 1 Cây. (VD: có Cạ 2R3R, có thể ăn 1R, 4R. Sau khi ăn 1R, không được ăn 4R nữa. Nếu có cạ 2R3R 5R6R, có thể ăn 1R và 4R, trường hợp này không tính là Ăn 2 lần vào Phỏm vì 4R ăn vào Phỏm 5R6R chứ không phải ăn nối vào 1R2R3R).
Tạm thời không cho phép ăn khống. (hoặc bố trí đây là ràng buộc Option)
Chú ý với các phỏm dọc, thì số nhỏ nhất là A, số lớn nhất là K. (VD chỉ có thể có Phỏm 1 2 3, J Q K, không cho phép Q K A)
Chuyển: khi có người Ăn, Cây Rác trên cùng (vì mỗi Người có thể có nhiều Cây Rác) được chuyển Ngược chiều kim đồng hồ 1 mức.
Tái: sau khi Chuyển, Người nào có Cây Rác giảm xuống từ 4 -> 3 thì Người đó lại được có Lượt tiếp (Ăn/Bốc và Đánh tiếp)
(Note: Móm vẫn được Tái).
Ăn Chốt: Người chơi Ăn Cây Rác của Người Trước khi mà mình đã có sẵn 3 Cây Rác
Kết thúc ván: khi một Người đến Lượt mà đã có 3 Cây Rác, sau khi Ăn/Bốc, họ phải thực hiện các hành động theo thứ tự sau:
- Hạ (nếu có Phỏm)
- Gửi (nếu có thể)
- Đánh (bắt buộc phải đánh, Móm cũng phải đánh)
- Ngồi đợi với phần bài còn lại để tính điểm (nếu ván kết thúc bằng tính điểm)
Hạ: Khi Người nào đã có 3 Cây Rác, đánh Cây Rác thứ 4 thì phải Hạ, trình tất cả các Phỏm của mình ra, thực hiện các lần Gửi. giữ lại các Cây còn lại để tính điểm. Thứ tự hạ trước sau có liên quan đến thắng thua. Nếu tổng số điểm bằng nhau, Người nào Hạ trước sẽ thắng. (Note: một Người có thể Hạ nhiều lần, do họ có thể được Tái)
Gửi: khi Hạ, nếu Người chơi có Phỏm để hạ thì sẽ được Gửi. Người chơi đưa các cây trên bài mình vào các Phỏm của Người đã Hạ trước sao cho Phỏm đó vẫn đảm bảo tính chất Phỏm sau khi Gửi.
Móm: khi Hạ, nếu không có Phỏm, Người chơi sẽ bị Móm. Móm không được Gửi.
Ù: Bất kỳ lúc nào khi 9 Cây trên Bài có thể sắp xếp thành các Phỏm mà không còn thừa cây nào thì Người chơi có thể Ù. Thời điểm Ù khi nào do Người chơi quyết định. Khi Ù, Ván kết thúc ngay lập tức.
Khi Hạ, sau khi trình hết Phỏm ra, Người chơi có thể Gửi đến mức không còn Cây nào (Tính điểm = 0) thì cũng là Ù. Ván chơi kết thúc lập tức.
Ù Khan: Ngay sau khi chia xong bài, nếu Người chơi không có bất kỳ Phỏm hay Cạ nào thì tính là Ù Khan, quyền lợi giống như Ù.
Ù Tròn: Người chơi khi đến lượt có 10 Cây trên bài, đều có thể ghép thành Phỏm cả –> được gấp đôi Ù
Đền: Một Người chơi phải chịu phạt thay các Người khác. Có nhiều tình huống dẫn đến phải đền:
- Do ngốc: Nếu Người chơi nào bị ăn 3 Cây Rác (dẫn đến Người Sau được Ù) thì phải chịu thay các Người chơi (không Ù) còn lại phần phạt khi Ù.
- Đền do Tái vòng: khi người được Tái lại Ù, người ăn chốt cuối cùng phải chi trả phí Ù (chi 15Chip) hộ hai người còn lại.
- Đền do Ăn láo: Ăn 2 cây vào một Phỏm, Ăn không thành Phỏm (nếu gỡ bỏ ràng buộc khi Ăn sẽ xảy ra trường hợp này)
- Đền do gửi: không áp dụng (VD: Người1 hạ 1R2R3R, Người2 hạ, rồi gửi con 4R vào, Người3 Hạ, rồi gửi 5R vào, Ù –> Người2 bị đền –> do tạo điều kiện cho Người sau Ù)
Hoặc trong quá trình hạ, người nào ăn cây thứ 4 của người trước đó và khi một trong những người hạ sau Ù
Tính Điểm: Sau khi các phỏm đã hạ hết xuống và gửi đi thì các Cây trên tay sẽ sử dụng để tính điểm bằng cách cộng lại số điểm của từng Cây (A=1, J=11, Q=12, K=13). Nếu bài nào có số điểm thấp nhất thì thắng. Trường hợp đồng điểm thì tính theo thứ tự Hạ, Hạ trước thì thắng.
Trường hợp tất cả cùng Móm, người nào Móm trước thì thắng.
Luật tính thưởng phạt
Đơn vị cơ bản cho một ván là Chip. Một Chip có thể đổi thành x Coin (tuỳ theo nhóm chơi quyết định).
Các thưởng phạt được tính theo quy tắc sau:
- Ván kết thúc bằng Tính Điểm: Người nhất được lấy tất cả thưởng của các Người còn lại. Người nhì nộp 1Chip, ba nộp 2Chip, bét nộp 3Chip.
- Móm phải nộp 4Chip.
- Khi Ù, mỗi Người còn lại nộp cho Người Ù 5Chip (tổng cộng Người Ù ăn 15Chip)
- Ù Khan, cũng như Ù
- Ù Tròn, gấp đôi Ù
- Người bị Ăn Chốt nộp 4Chip cho Người Ăn
- Người nào ăn khống trong Lượt, khi đến cuối mà không có Phỏm cho Cây Đã Ăn ấy sẽ đền 5Chip cho mỗi Người còn lại (mất tổng cộng 15Chip).
Business
- Hệ thống hỗ trợ chơi theo luật Phỏm Hà Nội
- Hệ thống có API cho các client giao tiếp tự do (client có thể là wap, web, mobile app)
- Không có chế độ cho máy chơi (do hạn chế thời gian nên không cài đặt AI cho máy được)
- Luật nộp Gà: Option. Khi bị Ăn, Người bị Ăn nộp 1 Chip vào Gà.
- Khi Ù (Ù, Ù Tròn, Ù Khan): Người Ù được nhận toàn bộ số Chip trong Gà.
- Luật được thiết kế để không phá hỏng tính đúng của Ván bài, tuy nhiên không ràng buộc quá chặt –>Người chơi có thể mắc sai sót (dẫn đến phải Đền) như vậy mới hấp dẫn và hay, giống thực tế
- Một số luật bổ sung nhưng không phổ biến, sẽ được xem xét để cài đặt sau hoặc để dạng luật option của Ván.
.
Design
Do thời gian thực hiện dự án quá ngắn, nên phải theo phương pháp phát triển dự án Agile. Phần design sẽ được giảm thiểu tài liệu.
Hạn chế cài đặt các luật Option
.
Code
PHP
lock/sync
RESTful API
Flash
JavaMobile
Multi-line JavaScript
I discovered via some random blog post that you can do multi-line JavaScript by escaping the line breaks.
var a = ‘You can start here \
and continue here \
and then finish it up here.’;
The backslash on each line allows you to keep going. It’s a little bit cleaner than opening and closing quotes and a concatenation operator on each line.
http://snook.ca/archives/javascript/multi-line-javascript
Snippet: js detect which key was pressed
For compatible with both IE and Mozilla
var code = (e.keyCode ? e.keyCode : e.which);
if(code == 13) { //Enter keycode
//Do something
}
Lấy đoạn text đang được user chọn trên trang
Hi all,
Mấy hôm nay thấy dân mạng khoe inh sỏi vụ có cái Tracer của bọn Tynt.com nó cho phép webmaster biết user người ta đang xem gì làm gì chọn gì trên website của mình. Vụ này ý tưởng hay phết, nhưng technical chắc cũng chả có gì ghê gớm (vẫn phục bọn khoai tây về cái vấn đề này, bọn nó ăn học nghĩ, khoai lang như mình thì ăn học làm, ek nghĩ đc cái gì cho dân tình e sợ cả).
Mình draft thử vài cái xem có làm đc không, thì thấy là cũng không khó lắm:
- Viết đoạn js nhỏ, nhúng vào website. Đoạn js này sẽ làm nhiệm vụ detect xem user đang chọn cái gì rồi gửi lên một cái server nào đó (gọi web API qua URL thôi). Việc này phải làm âm thầm và nhanh, nếu tiện tay gửi kèm luôn cả cookie, url các thể loại cho nó đầy đặn. Có một vướng mắc nho nhỏ là: nếu không handle đc sự kiện kiểu như OnSelection, thì đoạn js này sẽ phải setInterval() để check xem User có chọn gì ko, mà làm vậy là mệt đấy, nặng đấy.
- API nhận đoạn text kia và dữ liệu liên quan, ghi lại hết vào db.
- Chú chủ website lúc nào thích thống kê thì mở trang report ra, query vào cái DB kia là xong.
Tính năng nghe có vẻ hay, nhưng đồ là chạy sẽ không nhanh (vì Google Analytics có mỗi chuyện gửi cookie, url đi thôi mà còn chậm, chú này còn phải quét on_selection), vớ vẩn làm chậm trang web, user cằn nhằn rồi chạy mất thì hỏng bánh kẹo.
Anh em ném đá cái nhỉ, xem có đúng ko?
Tham khảo kỹ thuật về lấy đoạn text đang được chọn trên trang:
http://www.codetoad.com/javascript_get_selected_text.asp (ok với IE, FF, chưa test cái khác)
http://laboratorium.0xab.cd/jquery/fieldselection/0.2.3-test/test.html (ok IE, FF, chưa test cái khác)
http://snipplr.com/view/775/getselection/ (IE6, Fx2, Opera9, Safari)
Javascript – JS – Sắp xếp ngẫu nhiên các phần tử trong mảng
Javascript – JS – Sắp xếp ngẫu nhiên các phần tử trong mảng
arrDisplayEntry.sort(function() {return 0.5 – Math.random()}) //Array elements now scrambled
Cài đặt và chạy PHP trên IIS 6 (windows 2003 server)
http://learn.iis.net/page.aspx/247/using-fastcgi-to-host-php-applications-on-iis-60/
http://learn.iis.net/page.aspx/248/configuring-fastcgi-extension-for-iis60/
Tớ sẽ dịch dần 2 bài này cho độc giả đọc + kinh nghiệm cá nhân.
- download fcgi for IIS
- cài đặt fcgi
- download php
- cài đặt php
- cấu hình fcgi
- cấu hình iis
- Tinh chỉnh vài tham số trong php.ini để chạy nhanh hơn






