Thứ Bảy, 9 tháng 8, 2014

C# – Lấy thứ tự tuần trong năm

Bạn có thể sử dụng đoạn code sau để lấy ra thứ tự trong năm của tuần chứa 1 ngày được chỉ định cụ thể nào đó:
 /// <summary>
 /// Lấy ra thứ tự trong năm của tuần có chứa ngày nhập vào 
 /// với Culture mặc định là Culture hiện tại
 /// </summary>
 /// <param name="time">Ngày nhập vào</param>
 /// <returns>Trả về kiểu int là thứ tự của tuần trong năm</returns>
 public static int GetWeekOrderInYear(DateTime time)
 {
     CultureInfo myCI = CultureInfo.CurrentCulture;
     Calendar myCal = myCI.Calendar;
     CalendarWeekRule myCWR = myCI.DateTimeFormat.CalendarWeekRule;
     DayOfWeek myFirstDOW = myCI.DateTimeFormat.FirstDayOfWeek;
 
     return myCal.GetWeekOfYear(time, myCWR, myFirstDOW);
 }

C# – Lấy ngày đầu tiên trong tuần

Bạn có thể sử dụng đoạn code sau để lấy về ngày đầu tiên trong tuần chứa 1 ngày được nhập vào.
Lưu ý là class CultureInfo nằm trong namespace System.Globalization, nên bạn cần using nó để sử dụng.
 /// <summary>
 /// Lấy ra ngày đầu tiên trong tuần của ngày nhập vào 
 /// với Culture mặc định là Culture hiện tại
 /// </summary>
 /// <param name="dayInWeek">Ngày nhập vào</param>
 /// <returns>Ngày đầu tiên trong tuần</returns>
 public static DateTime GetFirstDayOfWeek(DateTime dayInWeek)
 {
     CultureInfo defaultCultureInfo = CultureInfo.CurrentCulture;
     return GetFirstDayOfWeek(dayInWeek, defaultCultureInfo);
 }
 /// <summary>
 /// Lấy ra ngày đầu tiên trong tuần của ngày nhập vào
 /// với một Culture cụ thể được truyền vào
 /// </summary>
 /// <param name="dayInWeek">Ngày nhập vào</param>
 /// <param name="cultureInfo">CultureInfo quy định các thông tin về Culture 
 /// ( định dạng ngày tháng, ngày bắt đầu trong tuần , ... )
 /// </param>
 /// <returns></returns>
 private static DateTime GetFirstDayOfWeek(DateTime dayInWeek, CultureInfo cultureInfo)
 {
     DayOfWeek firstDay = cultureInfo.DateTimeFormat.FirstDayOfWeek;
     DateTime firstDayInWeek = dayInWeek.Date;
     while (firstDayInWeek.DayOfWeek != firstDay)
     {
        firstDayInWeek = firstDayInWeek.AddDays(-1);
     }
     return firstDayInWeek;
 }
 /// <summary>
 /// Lấy ra ngày đầu tiên trong tuần của ngày nhập vào
 /// với 1 giá trị cụ thể của enum DayOfWeek chỉ định 
 /// ngày bắt đầu tuần là thứ mấy
 /// </summary>
 /// <param name="dayInWeek">Ngày nhập vào</param>
 /// <param name="dayOfWeek">enum chỉ định thứ bắt đầu tuần</param>
 /// <returns></returns>
 private static DateTime GetFirstDayOfWeek(DateTime dayInWeek, DayOfWeek dayOfWeek)
 {
     DateTime firstDayInWeek = dayInWeek.Date;
     while (firstDayInWeek.DayOfWeek != dayOfWeek)
     {
         firstDayInWeek = firstDayInWeek.AddDays(-1);
     }
     return firstDayInWeek;
 }

C# – Lấy ngày đầu tiên và cuối cùng trong tháng

Để lấy ra ngày đầu tiên trong tháng, bạn sử dụng đoạn code sau :
 /// <summary>
 /// Lấy ra ngày đầu tiên trong tháng có chứa 
 /// 1 ngày bất kỳ được truyền vào
 /// </summary>
 /// <param name="dtDate">Ngày nhập vào</param>
 /// <returns>Ngày đầu tiên trong tháng</returns>
 public static DateTime GetFirstDayOfMonth(DateTime dtInput)
 {
     DateTime dtResult = dtInput;
     dtResult = dtResult.AddDays((-dtResult.Day)+1);
     return dtResult;
 }
 /// <summary>
 /// Lấy ra ngày đầu tiên trong tháng được truyền vào 
 /// là 1 số nguyên từ 1 đến 12
 /// </summary>
 /// <param name="iMonth">Thứ tự của tháng trong năm</param>
 /// <returns>Ngày đầu tiên trong tháng</returns>
 public static DateTime GetFirstDayOfMonth(int iMonth)
 {
     DateTime dtResult = new DateTime(DateTime.Now.Year, iMonth, 1);
     dtResult = dtResult.AddDays((-dtResult.Day)+1);
     return dtResult;
 }

Đoạn code sau dùng để lấy ra ngày cuối cùng trong tháng :
 /// <summary>
 /// Lấy ra ngày cuối cùng trong tháng có chứa 
 /// 1 ngày bất kỳ được truyền vào
 /// </summary>
 /// <param name="dtInput">Ngày nhập vào</param>
 /// <returns>Ngày cuối cùng trong tháng</returns>
 public static DateTime GetLastDayOfMonth(DateTime dtInput)
 {
     DateTime dtResult = dtInput;
     dtResult = dtResult.AddMonths(1);
     dtResult = dtResult.AddDays(-(dtResult.Day));
     return dtResult;
 }
 /// <summary>
 /// Lấy ra ngày cuối cùng trong tháng được truyền vào
 /// là 1 số nguyên từ 1 đến 12
 /// </summary>
 /// <param name="iMonth"></param>
 /// <returns></returns>
 public static DateTime GetLastDayOfMonth(int iMonth)
 {
     DateTime dtResult = new DateTime(DateTime.Now.Year,iMonth,1);
     dtResult = dtResult.AddMonths(1);
     dtResult=dtResult.AddDays(-(dtResult.Day));
     return dtResult;
 }

Chủ Nhật, 3 tháng 8, 2014

Regular Expression

Cơ bản về Regular Expression trong C#

1. Giới thiệu:
RE là một ngôn ngữ cực mạnh dùng mô tả văn bản cũng như thao tác trên văn bản. Một RE thường được ứng dụng lên một chuỗi, nghĩa là lên một nhóm ký tự.
- Biểu thức chính quy được xây dựng dựa vào ký tự đại diện và những nguyên tắc sau :
Ký tự đại diện
[0-9] hay \d: đại diện 1 ký tự số từ 0 – 9
[0-9a-zA-Z_] hay \w: Đại diện ký tự aphabet hay ký tự gạch chân(hoa thường).
.(dấu chấm): đại diện ký tự bất kỳ.
\s : đại diện ký tự trắng (\r\n\t\f)
[xyz] đại diện 1 ký tự x,y hặc z.
\D: đại diện ký tự không thuộc \d
\W : đại diện ký tự không thuộc \w
[^xyz]: đại diện ký tự không thuộc xyz.
^: chỉ ra ký tự bắt đầu
$: chỉ ra ký tự kết thúc
Số lần xuất hiện :
{n,m}: ít nhất n lần, nhiều nhất m lần
{,m}: nhiều nhất m lần
{n,}: ít nhất n lần
{n}: chính xác n lần
?: tương đương {0,1}
* : tương dương {0,vô cùng}
+ : tương đương {1,vô cùng}
KHÔNG CHỈ ĐỊNH: 1 lần
Ví dụ :
// S chng minh nhân dân 9 ký t
String cmnd = "[0-9]{9}";

// s đin thoi 10 s hay 11 s
// bt đu bng 0
String PhoneNumber = "0\d{9,10}";

// S xe máy Sài Gòn : VD như 51-Z8-111.11
String MotoNumber = "5\d-[A-Z]\d-\d{3}.\d{2}";

// Đa ch Email
String Email = "\w+.@\w+.\w{2,4}";
- Khi đã hiểu được cách lập biểu thức chính qui chúng ta có thể kiểm tra một chuổi bất kỳ  xem có đúng định dạng hay không, cách đơn giản nhất là dùm phương thức IsMach().
bool Regex.IsMach(String input,String Pattern);

- Ví dụ :
// Kim tra đnh dng chui nhp vào là Email
String EmailPattern = "\w+.@\w+.\w{2,4}";
String input = "xxx@hotmail.com"

2. Các lớp để thao tác với Regular Expression trong .NET:
2.1.Regex:
Lớp Regex tượng trưng cho 1 regular expression bất di bất dịch (read-only). Nó cũng chứa một phương thức tĩnh (static) cho phép chúng ta sử dụng những lớp rex khác mà khỏi khởi tạo 1 đối tượng khác.

Sau đây, mình sẽ kể ra vài thành phần của lớp Regex này:
-Thuộc tính:
+Options: trả về những mục chọn được trao qua cho constructor Regex.
+RightToLeft: nhận 1 trị cho biết liệu xem regular expression dò tìm từ phải qua trái hay không
-Phương thức:
+GetGroupNames: trả về mảng gồm toàn tên nhóm thu lượm đối với RE.
+GetGroupNumbers: trả về mảng gồm toàn số nhóm thu lượm tương ứng với tên nhóm trên 1 mảng.
+GroupNameFromNumber: đi lấy tên nhóm tương ứng với số nhóm được khai báo.
+IsMatch: trả về trị bool cho biết liệu xem RE có tìm thấy một so khớp hay không trên pattern.
+Match: dò tìm trên pattern xem có xuất hiện một RE hay không rồi trả về kết quả chính xác như là một đối tượng Match duy nhất.
+Matches: dò tìm trên pattern xem tất cả các xuất hiện của một RE có hay không rồi trả về tất cả những so khớp thành công xem như Match được gọi nhiều lần.
+Replace: cho thay thế những xuất hiện của một pattern được định nghĩa bởi một RE bởi một chuỗi ký tự thay thế được chỉ định.
+Split: chẻ một pattern thành một mảng gồm những chuỗi con ở những vị trí được chỉ định bởi một so khớp trên RE
+Unescape: cho unescape bất cứ những ký tự nào được escape trên pattern.

2.2.Lớp Match:
Lớp này tượng trưng cho những kết quả duy nhất của một tác vụ so khớp (match) RE. 
Sử dụng thuộc tính Match.Access của lớp Match báo cho biết liệu xem đã tìm ra 1 so khớp hay chưa.
VD:
string chuoi = "123abcd456bdabc";
string pattern = "abc";
Regex myRegex = new Regex(pattern);
Match m = myRegex.Match(chuoi);
if (m.Success)
{
   WriteLine("Chuoi {0} o vi tri thu {1} trong chuoi", m.Value, m.Index);
}

3.Lớp MatchCollection
Hiểu nôm na MatchCollection là mảng các đối tượng Match


Chủ Nhật, 16 tháng 2, 2014

Tư tưởng phát triển phần mềm Agile và phương pháp Scrum!

Quy trình SCRUM: Thành công mới trong phát triển phần mềm

Một số link tham khảo về Scrum:
Giới thiệu Scrum
www.vntesters.com/tong-quan-scrum/‎
Scrum sử dụng Team Foundation Server 2012 - SlideShare
Hiện phutn đang triển khai tại địa chỉ: http://203.128.246.222:8181/tfs, dự án thử nghiệm "Nghiên cứu công nghệ"
1. Scrum

Đó là một quy trình phát triển phần mềm theo mô hình linh hoạt (agile). Công nghệ Agile cung cấp rất nhiều phương pháp luận, quy trình và các thực nghiệm để cho việc phát triển phần mềm trở nên nhanh chóng và dễ dàng. Hiện nay tại Việt Nam, quy trình này đang được thử nghiệm tại các đội phát triển phần mềm của một số công ty lớn. Scrum theo mô hình này.
Scrum chia dự án thành các vòng lặp phát triển gọi là các sprint. Mỗi sprint thường mất 2- 4 tuần (30 ngày) để hoàn thành. Nó rất phù hợp cho những dự án có nhiều sự thay đổi và yêu cầu tốc độ cao.
Một sprint hoàn thành một số chức năng, mục đích nào đó trong toàn bộ hệ thống. Các tác vụ trong sprint được chia ra thành các danh mục, đội làm việc sẽ phát triển và đánh giá lại sao cho đạt được mục đích ban đầu trong khoảng thời gian đề ra.
Thành phần chính quan trọng của scrum là các role (vai trò) và các cuộc trao đổi đánh giá. Có các role chính là: 
+ Product Owner: là người làm những công việc bắt đầu cho dự án, tạo ra các yêu cầu trong quá trình phát triển dự án. Phân tích mục tiêu, giải phóng các kế hoạch.
+ Scrum Master: họ phải đảm bảo các sprint được hoàn thành đúng mục đích, bảo vệ đội làm việc và loại bỏ các trở ngại.
+ Đội làm việc ở scrum: thường từ 5-9 người, tùy theo quy mô dự án nó có thể có rất nhiều đội, nhiều người tham gia. Sẽ không có những lập trình viên (programmer), người thiết kế (designer), kiểm thử viên (tester),… thường thấy ở các dự án phần mềm truyền thống. Các đội làm việc sẽ tiến hành cài đặt các chức năng được mô tả trong bản yêu cầu. Họ tự quản lý, tổ chức và điều chỉnh đội làm việc của mình sao cho hiệu quả lớn nhất. Tất cả các thành viên có ảnh hưởng như nhau đến sự thành công hoặc thất bại của toàn bộ hệ thống hoặc các hệ thống nhỏ hơn trong đó.
Có 2 pha là lập kế hoạch và kết thúc sẽ xác định các tiến trình cần thiết gồm các dữ liệu đầu vào đầu ra thật đầy đủ. Có một số vòng lặp phát triển trong pha kế hoạch. Kế hoạch lập ra ban đầu chỉ là tương đối và sẽ có sự điều chỉnh.
2. So sánh scrum và các quy trình phần mềm truyền thống
Với các phương pháp truyền thống, việc lập kế hoạch dự án (xác định những việc cần làm và thời gian kế thúc) dựa trên kinh nghiệm chứ không phải là môi trường làm trực tiếp. Và so với kế hoạch đó khi bắt tay vào xây dựng thì thường có độ trễ nhất định.
Scrum và quy trình thác nước (waterfall), xoắn ốc (spiral)
Mô hình thác nước chia dự án phần mềm gồm các giai đoạn: đặc tả yêu cầu, thiết kế hệ thống, cài đặt (lập trình), kiểm thử và bảo trì. Quy trình này dễ quản lý nhưng lại kém linh hoạt và không hiệu quả bởi nếu có sự thay đổi ở các giai đoạn sau sẽ ảnh hưởng rất lớn đến các giai đoạn trước.
Quy trình xoắn ốc chia dự án thành các giai đoạn: lập kế hoạch, phân tích rủi ro, giao tiếp khách hàng, đánh giá lại, sản xuất và phân phối. Nó vẫn chưa được sử dụng rộng rãi.
Các quy trình phần mềm truyền thống thường có quá khá nhiều giai đoạn, nhiều thành phần, yếu tố trong suốt thời gian phát triển sản phẩm. Phương pháp scrum tránh điều này. (Xem bảng)
3. Cách thức cài đặt để sử dụng scrum 
Có nhiều cách để triển khai, có thể sử dụng 10 bước sau:
- Bước 1: Thu nhập các đặc điểm của sản phẩm (backlog) trong đơn đặt hàng. Đây là bước quan trọng nhất. Lập nên các đội làm việc, có thể tách thành các đội nếu cần thiết và thảo luận với nhau về nghiệp vụ cần làm. Sau đó bổ nhiệm một người vào vị trí Product owner, người này có khả năng trao đổi, bao quát công việc tốt, biết sắp xếp ưu tiên đúng thứ tự các nhiệm vụ. Sau đó tự tổ chức lại đội làm việc, đề xuất ra vị trí Scrum master và thảo luận chi tiết các yêu cầu, sắp xếp chúng theo thứ tự ưu tiên. 
• Bước 2: Ước lượng đầy các yêu cầu về sản phẩm đầu ra. Có ước lượng ở mức độ cao, chia sản phẩm thành số lượng các danh mục backlog. Tuy nhiên số lượng sẽ không chính xác được, về sau chúng sẽ được bổ sung. Tiếp đến là ước lượng chi tiết từng backlog, ước lượng số lượng các đội làm việc.
• Bước 3: Lên kế hoạch phát triển các vòng lặp sprint. Sử dụng các cuộc trao đổi kế hoạch phát triển sprint với tất cả các thành viên. Xác định khoảng thời gian sẽ phát triển một sprint (thường là 30 ngày), mục tiêu của sprint là gì, sẽ đạt được gì, phân tích các yêu cầu của sprint một cách rõ ràng.
• Bước 4: Lên kế hoạch phát triển các nhiệm vụ của sprint. Tất cả mọi người sẽ xác định ngân sách của sprint đó, chia các đặc điểm thành các tác vụ nhỏ hơn, ước lượng số thời gian sẽ làm từng task (giờ), hoàn tất các yêu cầu và nhận dạng task quan trọng.
• Bước 5: Tạo ra không gian làm việc cộng tác cho tất cả mọi người. Thường sử dụng bảng trắng để vẽ nên những vấn đề cần thiết cho tất cả mọi người cùng đánh giá.
• Bước 6: Các thành viên bắt tay xây dựng từng sprint. Lập trình, kiểm thử và điều chỉnh thời gian để có hiệu quả tốt nhất. Đôi khi có thể hủy bỏ một sprint và quay lại với việc lập kế hoạch khác.
• Bước 7: Mọi người báo cáo kết quả để tiếp tục làm việc. Các báo cáo tập trung vào các vấn đề: đạt được những gì so với lần trao đổi trước; sẽ hoàn thành những gì trong lần trao đổi tiếp theo; có những trở ngại gì trong quá trình làm việc v.v. 
• Bước 8: Tổng hợp kết quả trên biểu đồ. Đây là bức tranh tổng quát về những việc đã làm được, những việc chưa làm được, thời gian ước lượng còn lại và có thể điều chỉnh lại. 
• Bước 9: Xem xét để hoàn tất. Khi các thành viên nói công việc đã hoàn thành có nghĩa là mọi thay đổi sẽ bị từ chối, đẩy lại cho vòng lặp sau.
• Bước 10: Đánh giá, phản ánh và lặp lại. Có các cuộc họp đánh giá lại sprint của các thành viên. Sẽ trình bày những gì đạt được, phản hồi của khách hàng, xét thời hạn của sprint. Nhìn lại biểu đồ ở bước 8 để xác định lại toàn bộ hệ thống và tiếp nhận những đóng góp, bổ sung để đưa tiếp vào các vòng lặp sprint tiếp theo.
4. Các điểm mạnh
Điểm mạnh nhất đó là việc linh hoạt, dự án không được cố định từ đầu về thời gian hoàn thành hay những yêu cầu mà nó sẽ được xác định khi phát triển thực tế. 
Phân phối sản phẩm mềm dẻo: nội dung sản phẩm chuyển giao được xác định linh hoạt theo môi trường sử dụng thực tế.
Thời gian biểu linh hoạt: có thể muộn hoặc sớm hơn so với kế hoạch ban đầu.
Chất lượng sản phẩm tốt và giảm rủi ro sản xuất, chi phí thấp. Khả năng trao đổi giữa khách hàng và nhà phát triển, giữa những thành viên trong đội được đặt lên mức cao.
Tốc độ phát triển nhanh, tiết kiệm thời gian. Việc chuẩn bị hành động cho những thay đổi trong quá trình phát triển tốt hơn vì hầu như hàng ngày luôn có những buổi họp đánh giá lại ở những vòng lặp phát triển.
Các bugs (lỗi) và các vấn đề được phát hiện sớm hơn rất nhiều so với các phương pháp truyền thống bởi vì khách hàng được tham gia đánh giá rất nhiều và đầu ra của sản phẩm rất nhanh. Và khi đi sai hướng, có thể hủy ngay sprint đó để quay lại với bản kế hoạch.
Đặc điểmWaterfallSpiralScrum
Xác định các giai đoạn phát triểnBắt buộcBắt buộcChỉ có giai đoạn lập kế hoạch và kết thúc
Sản phẩm cuối cùngĐược xác định trong quá trình lập kế hoạchĐược xác định trong quá trình lập kế hoạchXác định trong quá trình xây dựng dự án
Chi phí sản phẩmĐược xác định trong quá trình lập kế hoạchThay đổi cục bộXác định trong quá trình xây dựng dự án
Ngày hoàn thành sản phẩmĐược xác định trong quá trình lập kế hoạchThay đổi cục bộXác định trong quá trình xây dựng dự án
Đáp ứng với môi trường sử dụngTrong kế hoạch ban đầuTrong kế hoạch ban đầuXuyên suốt từ kế hoạch đến xây dựng và kết thúc
Kinh nghiệm trao đổiĐào tạo trước cho đến khi bắt tay làm dự ánĐào tạo trước cho đến khi bắt tay làm dự ánThực hiện trong quá trình làm dự án
Khả năng thành côngThấpTrung bình thấpCao
Nguyễn Thị Hạnh