Tuesday, June 3, 2014

Delimiter Matching

Below is the C# program to check whether the delimiters are opened and closed correctly. The program only supports for 3 kinds of delimiters, including (), {}, and [].

A stack is used to store the opening delimiters including the line and the column whether the delimiter appears.

You can download the complete program at https://dl.dropboxusercontent.com/u/7046415/Blogger/CheckMatchingDelimeter.exe

amespace CheckMatchingDelimeter
{
    class Program
    {
        static private List openDelimeters = new List() { '(', '{', '[' };
        static private List closeDelimeters = new List() { ')', '}', ']' };

        struct DelimiterInfo
        {
            public char c;
            public int line;
            public int col;

            public DelimiterInfo(char c, int line, int col)
            {
                this.c = c;
                this.line = line;
                this.col = col;
            }
        }

        static void Main(string[] args)
        {
            Console.WriteLine("Run this execution file to check delimeter open/close matching of files in the same folder.");
            string directory = Directory.GetCurrentDirectory();

            string name = System.Reflection.Assembly.GetEntryAssembly().GetName().Name;


            foreach (var file in Directory.GetFiles(directory))
            {
                if (Path.GetFileName(file) != name + ".exe")
                {
                    Console.WriteLine("Process " + Path.GetFileName(file));

                    string[] fileContent = File.ReadAllLines(file);
                    Stack delimeters = new Stack();
                    for (int i = 0; i < fileContent.Length; i++)
                    {
                        HandleLine(fileContent[i], i + 1, delimeters);
                    }

                    if (delimeters.Count > 0)
                    {
                        foreach (DelimiterInfo delimeter in delimeters)
                        {
                            Console.WriteLine("Line " + delimeter.line + ", Col " + delimeter.col + ": Lack of close");
                        }

                    }
                }
            }

            Console.WriteLine("Enter to exit!");
            Console.Read();
        }

        static void HandleLine(string line, int lineIndex, Stack delimeters)
        {
            for (int i = 0; i < line.Length; i++ )
            {
                char c = line[i];

                if (openDelimeters.Contains(c))
                {
                    delimeters.Push(new DelimiterInfo(c, lineIndex, i + 1));
                }
                else if (closeDelimeters.Contains(c))
                {
                    if (delimeters.Count == 0)
                    {
                        Console.WriteLine("Line " + lineIndex + ", Col " + (i+1) + ": No open before close");
                    }
                    else if (IsMatch(delimeters.Peek().c, c))
                    {
                        delimeters.Pop();
                    }
                    else
                    {
                        delimeters.Pop();
                        Console.WriteLine("Line " + lineIndex + ", Col " + (i + 1) + ": Mismatch");
                    }
                }
            }
  
        }

        private static bool IsMatch(char current, char next)
        {
            for(int i = 0; i < openDelimeters.Count; i++)
            {
                if(openDelimeters[i] == current && closeDelimeters[i]== next)
                {
                    return true;
                }
            }

            return false;
        }
    }
}

Monday, May 12, 2014

Nếu Bạn Đang Tìm Kiếm Mục Đích Sống Của Mình




“Realize what you really want. It stops you from chasing butterflies and puts you to work digging gold.” ~ William Moulton Marsden

Cố gắng để khám phá mục đích sống có thể sẽ rất khó khăn nếu bạn không biết bắt đầu từ đâu. Thực ra nó sẽ dễ dàng hơn khi bạn biết nhiều hơn về cuộc sống và về chính bạn. Vậy nếu bạn là người muốn bước ra tạo sự khác biệt bằng cách hiểu rõ mục đích sống của mình, trong bài viết này, bạn sẽ học cách khám phá ra mục đích sống bằng cách thực hiện theo các bước hành động. Hãy coi đây là một khóa học nhỏ bởi vì khi bạn đọc xong bài viết này, bạn sẽ thấy ra những điều về bản thân mà tưởng chừng như không quan trọng.

Làm những gì khiến bạn khác biệt
Những thứ làm bạn khác biệt chính là những thứ không dễ hoặc không thể đối với người khác. Bạn chơi game giỏi, đó là thế thế mạnh của bạn. Bạn chụp ảnh đẹp, đó cũng là thế mạnh của bạn. Bạn học toán giỏi, đó cũng là một thế mạnh nữa của bạn. Hãy tìm thế mạnh, niềm đam mê và giá trị của riêng bạn. Bạn có thể bắt đầu với những thứ bình thường và sau đó hãy thứ làm nó theo một cách mới của riêng bạn.

Làm những việc bạn thích thường xuyên hơn
Hãy để ý đến cảm xúc của bạn khi bạn đang làm một cái gì đó? Nó có thể là công việc của bạn, hay sở thích của bạn. Giữ một cuốn sổ tay hoặc sử dụng điện thoại để ghi lại cảm xúc của bạn khi làm một việc gì đó, bạn thích hay không thích. Sau đó hãy xác địch những việc mà bạn thích làm và làm những điều bạn thích thường xuyên hơn.

Khi bạn là một đứa trẻ, bạn đã mơ ước làm khi lớn lên?
Hãy nhớ lại xem hồi nhỏ bạn đã nói với mọi người bạn muốn trở thành ai, bác sĩ, kĩ sư, công an, người mẫu, hay ca sĩ. Bạn thich làm việc gì? Bạn thích đi đâu?

Câu hỏi là bạn thực sự thích làm cái gì?
Vâng tôi đang thực sự hỏi bạn, bạn thích làm cái gì? Bạn đã từng bao giờ tự hỏi mình như vậy chưa? Nếu chưa, hãy làm nó ngay bây giờ!

Cái gì đang làm bạn chần chừ?
Hãy tự hỏi mình cái gì làm bạn chần chừ, ngăn bạn tiến về phía trước. Bạn muốn có thân hình lực lưỡng, tại sao lại nghỉ tập Gym sau 1 tháng. Đối với câu hỏi này,  hãy viết trên một tờ giấy về mục tiêu chính của bạn. Sau đó kẻ ra hai cột. Một cột là danh sách các việc bạn sẽ làm để hoàn thành mục tiêu. Cột thứ hai là những thứ ngăn cản bạn đạt đến mục tiêu . Sau đó hãy ngẫm nghĩ lại nhứng thứ ngăn cản bạn, xem thực sự là bạn có thể vượt qua nó hay không? Hãy gạch bỏ nó nếu bạn cảm thấy chúng là chuyện nhỏ, mỗi lần như vậy hãy hét lên “Chuyện nhỏ”.

Thứ gì mang lại cho bạn giá trị, sự quan trọng, hài lòng nhất?
Với câu hỏi này tôi sẽ yêu cầu bạn nằm xuống hoặc ngồi một nơi nào đó bạn thấy thoải mái và hãy hình dung một vài viễn cảnh nào đó mà bạn cảm thấy bạn có giá trị, quan trọng hoặc hài lòng. Hy vọng điều này sẽ làm giúp bạn hình dung ra những gì bạn nên làm thường xuyên hơn.



Một điều tuyệt vời gì mà bạn mơ đến nếu bạn sẽ không thất bại?
Nếu bạn có ước mơ lớn, thì những điều gì làm cho bạn nghĩ rằng bạn không thể làm được. Cố gắng nhận ra được bản chất của nỗi sợ hãi và sau đó loại bỏ từng cái một.

Nếu bạn có rất nhiều tiền, bạn sẽ làm gì? 
Lập một danh sách những điều tuyệt vời bạn sẽ làm, nơi bạn sẽ đi đến, cách sống của bạn như thế nào?

Hành động 
Tạo một danh sách 10 mục tiêu mà bạn muốn đạt được trong ba năm tớ. Hãy chọn ra từ danh sách đó một mục tiêu mà có thể sẽ có tác động tích cực nhất đến cuộc sống của bạn. Sau đó tạo một danh sách những việc sẽ giúp bạn đạt đến mục tiêu đó. Xác định xem cách mà bạn ước lượng sự tiến bộ và thành công trong việc đạt được mục tiêu này. Ghi nó ra. Và thực hiện ngay ít nhất là một điều.

"The only thing that stands between a man and what he wants from life is often merely the will to try it and the faith to believe that it is possible.” ~ Richard M. DeVos

(theo lifehack.org

Monday, February 17, 2014

Ngày Tết Nói Chuyện Chơi Cua Bầu (Bầu Cua Cá Cọp)

Ngày tết, người dân ở các vùng quê thường chơi Cua Bầu. Hình thức chơi là dùng 3 con xúc xắc, mỗi mặt được vẽ 1 hình tượng để phân biệt bao gồm Nai, Bầu, Gà, Cá, Cua, Tôm. Người chơi sẽ đặt tiền vào con vật mà mình nghĩ sẽ xuất hiện. Sau khi nhà các lắc xúc xắc xong, nếu có bao nhiêu con vật xuất hiện đúng như con vật mà người chơi đã chọn, người chơi sẽ nhận số tiên gấp bây nhiêu lần số tiền ban đầu. Ví dụ nều đặt vào cửa con Nai 50,000, và kết quả là Nai, Nai, Cá. Người chơi sẽ nhận được 100,000. Vậy xác suất để người chơi ăn tiền là bao nhiêu? Chúng ta sẽ xét các trường hợp sau:
- Xác suất thua cược: Giả sử bạn chọn 1 con vật và đặt cược 1 số tiền là N vào đó. Vậy xác suất bạn thua cuộc là bao nhiêu? Vì có 3 con xúc xắc, nên số trường hợp có thể xảy ra là 6.6.6 = 216 trường hợp. Bạn sẽ thua cuộc nếu cả 3 con xúc xắc đều ra 1 trong 5 con vật còn lại mà bạn không chọn. Vậy có 5.5.5 = 125 trường hợp. Do đó xác suất bạn thua cược là 125/216 = 0.57 > 0.5. Như vậy bạn có khoảng 43% cơ hội để thắng. Vậy còn xác suất bạn thắng cuộc cho từng trường hợp cụ thể là bao nhiêu. Trước hết ta tính xác suất có 1 con vật như bạn đã chọn xuất hiện. Số trường hợp xảy ra là 3.5.5 = 75. Vậy tỉ lệ thắng N tiền sẽ là 75/216 = 0.33. Tương tự như vậy, xác suất để bạn thắng số tiền 2.N sẽ là 15/216 = 0.06. Xác suất để bạn thắng số tiền 3.N sẽ là 1/216 = 0.004. Cuối cùng thì giá trị kì vọng là -125/216 + 75/216 + 15/216 . 2 + 1/216 . 3 = -0.078 < 0. Nghĩa là trò chơi này không công bằng và trung bình ta mất khoảng 78 đồng cho mỗi 1000 đồng đặt cược.


Xác suất
Thua N
57.87%
Thắng N
34.72%
Thắng 2.N
6.94%
Thắng 3.N
0.46%

- Một số bạn chơi chiến thuật đặt vào 2 cửa, ví dụ số tiền N cho 1 con vật và N cho 1 con vật khác. Xác suất không có cửa nào thắng (thua toàn bộ số tiền) là 4.4.4/6.6.6 = 0.29. Xác suất chỉ trúng 1 cửa (hoà) là 96/216 = 0.44. Xác suất thắng số tiền N (1 con vật xuất hiện 2 lần, còn con kia không ra) là 24/216 = 0.11. Xác suất thắng số tiền 2.N là 26/216 = 0.12. Xác suất thắng số tiền 3.N là 6/216. Giá trị kì vọng là -64/216 . 2 + 96/216 . 0 + 24/216 . 1 + 26/216 . 2 + 6/216 . 3 = -0.157.

Xác suất
Thua 2.N
29.62%
Hòa
44.44%
Thắng N
11.11%
Thắng 2.N
12.03%
Thắng 3.N
2.77%

Monday, January 13, 2014

Tool list for MAC OS


  1. Google Chrome: browser
  2. Evernote: note taking
  3. Jing: screen capture
  4. Spotify: listen music online
  5. Dropbox: store your date on cloud
  6. Viber, Skype: free chat, message, call
  7. Adobe Reader: pdf reader
  8. Picasa: manage and edit your photos
  9. Go2shell: shortcut to open a terminal on the current folder
  10. TeamViewer: remote desktop
  11. MacTeX, TeXShop: TeX editor
  12. TunnelBear: VPN
  13. PDFwriter: Virtual PDF Printer, the output files are stored in /Users/Shared/PDFwriter
  14. VLC media player: flac player

Monday, January 6, 2014

MAC OS tips for Windows users


  1. Rename files: There is no context menu or F2 keystroke to rename files, folders. To rename them in MAC OS, you need to slowly click twice on the files' or folders' name. Then the name will be editable and you can enter a new name. (Note that this is "slowly click twice", not "double click")
  2. Lock Screen: At first glance, you don't see the "lock screen" option with the "shut down" option when you click the Apple symbol. To have a shortcut to quickly lock the screen, in the Launcher, run "Key chain access", in the Preference, General tab, check the selection "Show keychain status in menu bar". After you check this selection, there is a padlock icon in your menu bar. You will find the lock screen shortcut when you click on that padlock.
  3. Mouse scroll direction: The default mouse scroll direction in MAC OS is different from the one in Windows. If you want to set the scroll direction as Windows, go to System Preference, Mouse, and uncheck the selection "Scroll direction: natural".
  4. Click on Trackpad: At my first try, I don't know how to do a mouse click on the Trackpad. Actually you can do a mouse click on the Trackpad by pressing it. However the pressing requires some pressure. To make it easier, you can go to System Preference, Trackpad, Point and Click tab, and check the selection "tap to click". Then you can just tap on the Trackpad to make a mouse click.
  5. Display Desktop: As a habit in Windows OS, you often want to display the desktop. In MAC OS, you can press Fn-F11 to display the desktop. In addition, you can display the desktop by a mouse move. Go to System Preference, Desktop & Screen Save, Hot Corners, then in the new windows, you can set the action when you move the mouse to the corner of the screen.
  6. Change Fn Key Priority: Just go to System Preferences, Keyboard and check the selection "Use all F1, F2, etc. keys as standard function keys.
  7. Associate Program to run file: To change the default program to open a file, In Finder windows, click to select that file, then select File, Get Info. In the Info windows,  click the grey triangle to disclose the Open With panel. Then you can select the program you want to open this file. You may wan to click Change All to apply this setting to all the files are the same type as this file.
  8. Open photo without having to double-click every photo: Select a photo, press Space. Then use Up and Down arrow to move among photos.