Monday, July 20, 2015

Charizing Operator (#@) Does Not Work On MAC OSX

 #include <iostream>  
 using std::cout;  
 using std::endl;  
 #define Charizing(x) #@x  
 int main()  
 {  
   cout << Charizing(a) << endl;  
   cout << Charizing(b1) << endl;  
 }  
First, let's study above program. The output is
a
25137

Basically, Charizing(x) encloses the parameter x with single quotation mark and treats it as a character. That's why Charizing(a) returns a. However, when x is not a character, the output is some strange number. I guess the number is converted from type of parameter to char.

However, the above program is not compilable in Xcode. The error is '#' is not followed by a macro parameter.

As far as I know, Stringizing operator (#) and Token-pasting operator (##) work fine on Xcode, except Token-pasting operator (##). According to MSDN, Token-pasting operator (##) is a Microsoft specific. This is why it is not supported in Xcode.

To fix the program to work on both Windows and MAC OSX, we can first convert the parameter x to string and then get the first character. We suppose that x always contains one character with "#x[0]".
 #include <iostream>  
 using std::cout;  
 using std::endl;  
 #define Charizing(x) #x[0]  
 int main()  
 {  
   cout << Charizing(a) << endl;  
   cout << Charizing(b1) << endl;  
 }  
Thus,  we can remember #@x is equal to #x[0], assume that x is a one-char string.


Monday, July 13, 2015

Token-Pasting Operator (##) does not concat String as I expect




Let's study below example


#include
using std::cout;
using std::endl;


#define STRINGIFY2( x) #x
#define STRINGIFY(x) STRINGIFY2(x)

#define A1 a2
#define B1 b2

#define concat2(x, y, z) x ## y z
#define concat(x,y, z) concat2(x,y, z)
int main()
{
    cout << STRINGIFY(concat2(A1, B1, A1)) << endl;
    cout << STRINGIFY(concat(A1, B1, A1)) << endl;
    
}

The output is
A1B1 a2
a2b2 a2

According to MSDN, "If a formal parameter in a macro definition is preceded or followed by the token-pasting operator, the formal parameter is immediately replaced by the unexpanded actual argument. Macro expansion is not performed on the argument prior to replacement". Thus, in the function concat2, x and y are not expanded while z is expanded. Therefore, the first line output is "A1B1 a2. Note that the space between x and y is removed. On the other hand, the function concat calls concat2 and 3 arguments, x, y, and z are computed first and send to concat2. Therefore, the output is "a2b2 a2".


Income Tax Rate in Singapore

Income tax rates depend on an individual's tax residency status. You will be treated as a tax resident for a particular Year of Assessment (YA) if you are a : 
  1. Singapore Citizen who normally resides in Singapore except for temporary absences; or
  2. Singapore Permanent Resident (SPR) who has established your permanent home in Singapore; or
  3. Foreigner who has stayed / worked in Singapore (excludes director of a company) for 183 days or more in the previous year. i.e. the year before the YA.
Otherwise, you will be treated as a non-resident of Singapore for tax purposes.

Resident Tax Rates

For YA 2012 to YA 2016

Chargeable Income
Income Tax Rate (%)
Gross Tax Payable ($)
First $20,000
Next $10,000
0
2
0
200
First $30,000
Next $10,000
-
3.50
200
350
First $40,000
Next $40,000
-
7
550
2,800
First $80,000
Next $40,000
-
11.5
3,350
4,600
First $120,000
Next $ 40,000
-
15
7,950
6,000
First $160,000
Next $ 40,000
-
17
13,950
6,800
First $200,000
Next $120,000
-
18
20,750
21,600
First $320,000
Above $320,000
-
20
42,350

Resident Tax Rates

For YA 2012 to YA 2016

Chargeable Income
Income Tax Rate (%)
Gross Tax Payable ($)
First $20,000
Next $10,000
0
2
0
200
First $30,000
Next $10,000
-
3.50
200
350
First $40,000
Next $40,000
-
7
550
2,800
First $80,000
Next $40,000
-
11.5
3,350
4,600
First $120,000
Next $ 40,000
-
15
7,950
6,000
First $160,000
Next $ 40,000
-
17
13,950
6,800
First $200,000
Next $120,000
-
18
20,750
21,600
First $320,000
Above $320,000
-
20
42,350

Tax Rates for Non-Residents

Taxes on Employment Income

The employment income of non-residents is taxed at flat rate of 15% or the progressive resident tax rates (see table above), whichever is a higher tax amount.

Taxes on Director's fee, Consultation fees and All Other Income

Director's fees, consultation fees and all other income, are generally taxed at 20%.

From YA 2017 New!

The tax rates for non- resident individuals (except certain reduced final withholding tax rates) will be raised to 22% from YA 2017. This is to maintain parity between the tax rates of non-resident individuals and the top marginal tax rate of resident individuals.
Type of Income
Non-resident individual tax rate / withholding tax rate from YA 2017
(a)
Director's remuneration 
22%
(b)
Income derived from activity as a non-resident professional (consultant, trainer, coach, etc) 
15% of gross income or 22% of net income

(c)
Income derived from activity as a non-resident public entertainer (artiste, musician, sportsman, etc)
10% concessionary rate (No change)


(d)
Other income e.g. property rental income
22%
(e)
SRS withdrawal by a non-citizen SRS member
22%
(f)
Interest, royalty etc 
Reduced final withholding tax rate (subject to conditions) as follows:
Interest: 15%
Royalty: 10%
OR
22% if reduced final withholding tax rate is not applicable.

(according to IRAS, all the information is copied on 26 Jul 2015)

Monday, June 22, 2015

Ghi Âm Trên MAC OS

Trong bài viết này mình sẽ giới thiệu một cách để ghi âm trên máy tính MAC OS như MacBook. MAC OS cung cấp phần mềm QuickTime Player với nhiều tiện ích bao gồm:

  1. Ghi âm
  2. Quay phim
  3. Quay màn hình
Để ghi âm, bạn chỉ cần mở ứng dụng QuickTime Player, chọn File, rồi chọn New Audio Recording. Để quay phim hay quay màn hình bạn có thể làm tương tự và chọn những lựa chọn khác trong menu File.

Để ghi âm, bấm nút đỏ. Sau đó, để dừng lại cũng bấm nút đỏ. Để lưu lại file ghi âm, chọn File rồi Save. Cuối cùng, chọn nơi để lưu file.



Thursday, March 26, 2015

Chiến Thuật Chơi Settlers of Catan

Tất cả những chiến thuật và kinh nghiệm ở đây được mình tổng hợp từ các nguồn ở Complex Strategies for Settlers of Catan và Settlers of Catan strategy tips. Mình khá thích phong cách đầu vì nó là một phong cách rất nhẹ nhàng nhưng lại hiệu quả. Mình đã áp dụng những gì mình học được và đã dành một vài chiến thắng đầu tiên. Vì thế mình tóm tắt lại các chiến thuật ở đây cho các bạn mới bắt đầu chơi.
  1. Quá trình xây dựng ban đầu
    Việc chọn vị trí để xây dựng ban đầu là cực kì quan trọng. Nhiều người nói rằng nó sẽ quyết định việc thắng hay thua đến 25%. Vậy kinh nghiệm là hãy chọn các vị trí sao cho có càng nhiều số càng tốt, mà không quá quan tâm nhiều đến loại tài nguyên nào. Sau đó, hãy ưu tiên chọn những số có xác suất cao như 6, 8, 5, 9, 4, và 10.  Về sau ta thậm chí có thể xây ở vị trí các số như 2, 3, hoặc 11 nếu ở đó có tài nguyên nào hiếm.

    Thường thì ta sẽ cố gắng lấy số 6 và 8 và xây nhà nằm trên 3 tài nguyên (có thể có số trùng).  Kinh nghiệm là cố gắng đạt được tổng số chấm của các số là từ 11 đến 13. Tuy nhiên nếu vì một lí do nào đó mà còn số 6 nhưng nhà chỉ nằm trên 2 số, ví dụ là 6-2, hoặc 6-12 thì ta không nên xây ở đó. Hãy tìm 8-5-10 rồi 4-9 và sau đó có thể xây đường đến số 6. Nếu tình cờ có 5-6-9 thì hãy xây ở đó ngay. Nếu bạn chơi thứ nhất hoặc thứ 2 thì hãy cố gắng lấy vị trí có sô 6.

    Sau khi đã chọn vị trí nhà, đến chọn vị trí đường. Đừng cố gắng chọn vị trí đường hướng đến các số đẹp vì sẽ có người xây nhà ở đó trước bạn. Thay vì đó xây đường hướng đến các số mà bạn chưa có như 4, 10, 3, hoặc 11. Sau đó ngôi nhà thứ 3 của bạn sẽ nằm trên các số này.

    Những câu hỏi bạn cần hỏi:
    • Số 6, 8 đang ở đâu, những vị trí nào có số 6, hoặc 8 có tốt không? Tìm vì trí 11-13 chấm
    • Tài nguyên nào sẽ khan hiếm?
    • Từ vị trí mình định xây nhà, có vị trí nào khá tốt nằm bên cạnh không? Nếu có thì đừng cố gắng xây đường đến hướng đó vì người ta sẽ xây nhà chặn
    • Mình đã có ít nhất 4 tài nguyên với xác suất ít nhất 2-3 chấm không?
    • Mình đã có nhiều các cặp tài nguyên là Lúa-Đá hoặc Gỗ Gạch chưa?
    • Từ vị trí mình chọn có dễ dàng ra cảng không?
  2. Quan sát đối thủ
    • Xác định những tài nguyên nào mà đối 
  3. Di chuyển quân Cướp
    Có nhiều ý kiến cho vị trí để di chuyển quân Cướp. Ví dụ, di chuyển sang vị trí của người có điểm cao nhất, hoặc ô 6, 8, hoặc ô có nhà của nhiều người. Tuy nhiên cần chú ý rằng, khi bạn di chuyển quân cướp tấn công ai, thì bạn lại có thêm 1 kẻ thù và có nguy cơ kẻ thù sẽ di chuyển quân cướp tấn công bạn.

    Vậy kinh nghiệm là chỉ nên tấn công 1 người duy nhất. Người này chơi trước bạn (nằm bên phải) hoặc ít nhất cũng đối diện bạn và không có quân bài Development. Tuy nhiên thậm chí nếu người này có cũng không sao, người đó phải 2 lượt và ngoài ra ta có thể biết xem quân bài Development người đó có là quân bài Hiệp Sĩ hay không. Để chọn vị trí đặt, thường sẽ đặt vào vị trí có nhiều chấm nhất. Cũng có lúc ta có thể đặt vào ô chứa tài nguyên quan trọng mà đối thủ bạn đang cần dù số chấm có ít.

    Đôi khi cũng có thể tấn công nhiều đối thủ cùng lúc, nhưng hãy chắc chắn rằng bạn có nhiều quân Rider hơn.

    Mẹo: Nếu tình cờ bạn bôc được quân bài Hiệp Sĩ thì hãy giả bộ nói ra. Có như vậy người ta sẽ hạn chế tấn công bạn.
  4. Trao đổi tài nguyên
    Hãy cố gắng tham gia trao đổi tài nguyên càng nhiều càng tốt. Đôi khi đổi dù bạn không được quá lợi. Nhưng làm như vậy sẽ tạo thiện cảm với người khác.
    Tuy nhiên càng về sau, chỉ nên trao đổi với người đang kém bạn hoặc thua bạn, không nên trao đổi với người điểm cao nhất.

    Mẹo: Nếu ai đó hỏi trao đổi tài nguyên mà chỉ có bạn có, hãy cho người đó đợi đến lượt của bạn. Vì lúc đó bạn có thể xây dựng trong khi trước đó thì không. Hãy nói ví dụ: Tôi đang có tài nguyên mà bạn cần, tuy nhiên tôi cũng cần có. Nếu lượt tới mà xúc xắc ra con số tôi cần, tôi sẽ trao đổi với bạn.

    Thông thường tỉ lệ trao đổi 1:1. Bạn không nên đòi hỏi quá cao nếu không mọi người sẽ ghét. Nếu bạn muốn đổi 1 thứ bạn đang có lấy 2 thứ khác. Hãy để người khác tự nguyện, ví dụ bạn có thể hỏi: "Tôi đang có 1 gạch, có ai muốn đổi không?". Nếu ai đó đồng ý đưa bạn 2 thứ thì bạn lấy, còn nếu 1 thứ bạn có thể từ chối. Còn nếu ai đó trực tiếp xin trao đổi với bạn 1 thứ nào đó lấy 1 gạch, bạn có thể từ chối nhẹ nhàng và có thể hỏi xem 2 thứ.
  5. Quân bài Development
    • Quân bài Hiệp Sĩ: Hãy cố gắng sở hữu nó càng sớm càng tốt và lúc nào cũng nên có ít nhất 1 con. Hãy cố gắng sử dụng nó khi bạn đã sử dụng 2 lần và có người khác cũng đã sử dụng 2 lần.
    • Quân bài Xây Đường: Chỉ sử dụng nó khi mà ngay sau đó bạn sẽ xây nhà ở cuối đường. 
    • Quân bài Lấy 2 Tài Nguyên: Nên sử dụng để nâng cấp lên citi.
    • Quân bài Monopoly: Nên sử dụng ở cuối trận. Kinh nghiệm là nhìn bài tài nguyên, xem loại nào còn ít chứng tỏ nó đang được sở hửu rất nhiều. Có một mẹo nữa là trước khi bạn muốn lấy tài nguyên nào, ví dụ Cừu, bạn mang tất cả cừu bạn có để đổi lấy các thứ khác, sau đó dùng quân bài Monopoly để lấy lại hết cừu. Cách này hay nhưng hơi ác. Nó sẽ khiến mọi người ghét bạn, chỉ nên chơi nó trong trận nào quan trọng, 1 mất 1 còn :-)
    • Quân bài 1 Điểm Chiến Thắng: Kinh nghiệm nếu lấy được quân bài Hiệp Sĩ hãy cho mọi người biết, còn các quân bài còn lại hãy nói là quân bài 1 điểm chiến thắng. Có như vậy bạn mới giữ bí mật kế hoạch xây nhà, hoặc Monopoly được. Nhưng nếu đối thủ bạn không có thói quen dò hỏi thì bạn cứ nói là quân bài Hiệp Sĩ. Quân bài 1 điểm chiến thắng luôn là yếu tố bất ngờ. Mình vừa thắng 1 ván khi mà mình chỉ có 3 nhà, nhưng lại có đường dài nhất (+2), có đội quân mạnh nhất với việc sử dụng 3 quân bài Hiệp Sĩ (+2), và trong tay có 2 quân bài 1 Điểm Chiến Thắng. Đến lượt của mình, mình chỉ cần xây thêm 1 nhà và đủ 10 điểm.
  6. Những chú ý khác
    • Tránh xây nhiều nhà trên cùng một ô.
    • Nếu có ý định xây đường dài nhất thì hãy chọn con đường mà khó bị người khác chặn

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