<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>A Humble Programmer</title>
	<atom:link href="http://hjiang.net/feed" rel="self" type="application/rss+xml" />
	<link>http://hjiang.net</link>
	<description>Notes on life, computing, and programming</description>
	<pubDate>Mon, 01 Dec 2008 06:42:19 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.5</generator>
	<language>en</language>
			<item>
		<title>LINQ++: An embeded DSL for C++</title>
		<link>http://hjiang.net/archives/229</link>
		<comments>http://hjiang.net/archives/229#comments</comments>
		<pubDate>Mon, 20 Oct 2008 06:44:56 +0000</pubDate>
		<dc:creator>j</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<category><![CDATA[c++]]></category>

		<guid isPermaLink="false">http://hjiang.net/?p=229</guid>
		<description><![CDATA[LINQ have been the new hotness in Microsoft&#8217;s .Net platform. Well, you can have the same syntactic sugar in C++ without writing a new compiler. I wrote a small library (just a short header file right now) that can do some interesting things. (source available at github) The following snippets from the companion unit test [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://en.wikipedia.org/wiki/Language_Integrated_Query">LINQ</a> have been the new hotness in Microsoft&#8217;s .Net platform. Well, you can have the same syntactic sugar in C++ without writing a new compiler. I wrote a small library (just a short header file right now) that can do some interesting things. (<a href="http://github.com/hjiang/linqxx">source available at github</a>) The following snippets from the companion unit test shows a few:</p>

<pre><code>// Count the number of people older than 30
cout &lt;&lt; from(guests)
        .where(&amp;_1 -&gt;* &amp;Person::age &gt; 30)
        .count()

// combine the people older than 30 with the person with name
// "joe" into one table.
DataSet&lt;vector&lt;Person&gt; &gt; results =
        insert(
                from(guests)
                .where(&amp;_1 -&gt;* &amp;Person::age &gt; 30))
        .into(
                from(guests)
                .where(&amp;_1 -&gt;* &amp;Person::name == "joe"));

// select the age column from the previous table.
shared_ptr&lt;vector&lt;int&gt; &gt; ages = results
                                .select&lt;int&gt;(&amp;_1 -&gt;* &amp;Person::age)
                                .get();
</code></pre>

<p>It should work with all STL-compatible sequence containers and requires the <a href="http://boost.org">boost</a> library. You can chain the clauses to form complicated queries.</p>

<p>I wrote it up on the shuttle from work to home. Hopefully I can find some time to polish it up and make it actually useful.</p>
]]></content:encoded>
			<wfw:commentRss>http://hjiang.net/archives/229/feed</wfw:commentRss>
		</item>
		<item>
		<title>Coroutine and continuation in C</title>
		<link>http://hjiang.net/archives/220</link>
		<comments>http://hjiang.net/archives/220#comments</comments>
		<pubDate>Sat, 04 Oct 2008 05:08:59 +0000</pubDate>
		<dc:creator>j</dc:creator>
		
		<category><![CDATA[Linux-Unix]]></category>

		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://hjiang.net/?p=220</guid>
		<description><![CDATA[An article about the EVE Online game and stackless Python got me thinking about how to implement coroutines and continuations in C. After a short research, I found a simple implementation (without using longjmp!).

Coroutines can be thought of as cooperative multithreading, sometimes also known as user threads. Two or more procedures can yield the CPU [...]]]></description>
			<content:encoded><![CDATA[<p>An article about the EVE Online game and stackless Python got me thinking about how to implement coroutines and continuations in C. After a short research, I found a simple implementation (without using longjmp!).</p>

<p>Coroutines can be thought of as cooperative multithreading, sometimes also known as user threads. Two or more procedures can yield the CPU to each other in the middle of their execution, so that they appear to run concurrently. It&#8217;s a very well-known feature in more academic programming languages such as Lisp and Scheme which have the Call/CC (call-with-current-continuation) mechanism. A continuation is a way of representing &#8220;the rest of the execution&#8221; at a certain point of time.</p>

<p>Here&#8217;s the C implementation of two functions that run &#8220;concurrently&#8221;. First, the required headers:</p>

<pre><code>#include &lt;signal.h&gt;
#include &lt;stdio.h&gt;
#include &lt;ucontext.h&gt;
</code></pre>

<p>Because the two routines need to cooperate, they need to communicate with each other. I will just use a global variable to signal whose turn it is. The <code>volatile</code> key word is needed to prevent possible compiler optimization. I will explain later.</p>

<pre><code>// Signals which routine should run.
volatile int g_turn;
</code></pre>

<p>Let the first routine print the elements of the array <code>{1, 2, 3}</code> each in a line.</p>

<pre><code>void routineOne(ucontext_t* self, ucontext_t* other) {
    int numbers[] = {1, 2, 3};
    int i;
    for (i = 0; i &lt; sizeof(numbers)/sizeof(int); ++i) {
        printf("Routine one: %d\n", numbers[i]);
        // Call other with current continuation
        if (g_turn != 1) {
            g_turn = 1;
            swapcontext(self, other);
        }
    }
}
</code></pre>

<p>A few things to notice here. ucontext_t is a <code>struct</code> that stores a user thread&#8217;s execution state, including it&#8217;s stack pointers and instruction pointer. We pass two contexts to the function, one for itself and one for the other routine. This is very similar to the continuation-passing programming style in functional languages such as Haskell. The <code>swapcontext()</code> call stores the current state of execution to the first argument and switches to the state stored in the second argument. Notice that in this function, there is only one assignment to <code>g_turn</code>. The compiler does not know the semantics of <code>swapcontext()</code>. To the compiler, it&#8217;s just a function, and there&#8217;s no way to know it switches execution context. Therefore the compiler can assume <code>g_turn</code> never changes within this function after the first assignment, and replace all subsequent references to <code>g_turn</code> with the constant <code>1</code>. That&#8217;s why we need to use <code>volatile</code> in the declaration.</p>

<p>We let the second routine print the array `{-1, -2, -3}. It&#8217;s completely symmetric to the first one.</p>

<pre><code>void routineTwo(ucontext_t* self, ucontext_t* other) {
    int numbers[] = {-1, -2, -3};
    int i;
    for (i = 0; i &lt; sizeof(numbers)/sizeof(int); ++i) {
        printf("Routine two: %d\n", numbers[i]);
        if (g_turn != 2) {
            g_turn = 2;
            swapcontext(self, other);
        }
    }
}
</code></pre>

<p>Unlike Stackless Python and most symbolic or functional languages, C is a stack based language. The main function needs to set up a stack for each user thread before starting them.</p>

<pre><code>int main() {
    // Continuations
    ucontext_t cont_one;
    ucontext_t cont_two;
    ucontext_t cont_main;

    // one stack for each thread
    char stack_one[SIGSTKSZ];
    char stack_two[SIGSTKSZ];

    // Initialize the coutinuations.
    cont_one.uc_link = &amp;cont_main;
    cont_one.uc_stack.ss_sp = stack_one;
    cont_one.uc_stack.ss_size = sizeof(stack_one);
    cont_two.uc_link = &amp;cont_main;
    cont_two.uc_stack.ss_sp = stack_two;
    cont_two.uc_stack.ss_size = sizeof(stack_two);
    getcontext(&amp;cont_one);
    makecontext(&amp;cont_one, (void (*)())routineOne, 2, &amp;cont_one, &amp;cont_two);
    getcontext(&amp;cont_two);
    makecontext(&amp;cont_two, (void (*)())routineTwo, 2, &amp;cont_two, &amp;cont_one);
    g_turn = 0;

    // Call routineOne with current continuation. Continue from here
    // after routineOne finishes.
    getcontext(&amp;cont_main);
    if (g_turn == 0) {
        setcontext(&amp;cont_one);
    }
    return 0;
}
</code></pre>

<p>Run this program and you should see the following output:<sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup></p>

<pre><code>Routine one: 1
Routine two: -1
Routine one: 2
Routine two: -2
Routine one: 3
Routine two: -3
</code></pre>

<p>Hopefully you&#8217;ve found something interesting in this article. Now an exercise for the reader: If you step through this program in gdb, what do you think will happen? Will gdb get confused? Can you step from <code>main()</code> into <code>routineOne()</code> and then into <code>routineTwo()</code>? Try it. <img src='http://hjiang.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>

<div class="footnotes">
<hr />
<ol>

<li id="fn:1">
<p>This program runs fine in Linux, but unfortunately it causes a bus error in Mac OS X. I&#8217;m not sure why. Perhaps there is some issue in the Mac OS X system library.&#160;<a href="#fnref:1" rev="footnote">&#8617;</a></p>
</li>

</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://hjiang.net/archives/220/feed</wfw:commentRss>
		</item>
		<item>
		<title>Building Thrift</title>
		<link>http://hjiang.net/archives/204</link>
		<comments>http://hjiang.net/archives/204#comments</comments>
		<pubDate>Fri, 29 Aug 2008 23:06:32 +0000</pubDate>
		<dc:creator>j</dc:creator>
		
		<category><![CDATA[Linux-Unix]]></category>

		<category><![CDATA[Programming]]></category>

		<category><![CDATA[rpc]]></category>

		<category><![CDATA[thrift]]></category>

		<guid isPermaLink="false">http://hjiang.net/?p=204</guid>
		<description><![CDATA[Thrift is Facebook&#8217;s cross-language data-exchange and RPC library, similar to Google&#8217;s Protocol Buffers. In my opinion, it also seems to be better (supports more data structures and programming languages) than Protocol Buffers. Unfortunately, its documentation isn&#8217;t very comprehensive, and many people have trouble getting it to work. In Ubuntu/Debian Linux, besides the requirements on the [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://developers.facebook.com/thrift/">Thrift</a> is Facebook&#8217;s cross-language data-exchange and RPC library, similar to Google&#8217;s <a href="http://code.google.com/p/protobuf/">Protocol Buffers</a>. In my opinion, it also seems to be better (supports more data structures and programming languages) than Protocol Buffers. Unfortunately, its documentation isn&#8217;t very comprehensive, and many people have trouble getting it to work. In Ubuntu/Debian Linux, besides the requirements on the official homepage, you need the following packages to compile Thrift:</p>

<pre><code>libboost-dev
python-dev
ruby1.8-dev
byacc
flex
</code></pre>

<p>Hopefully after thrift comes out of the Apache Incubator, the documentation would be more complete.</p>
]]></content:encoded>
			<wfw:commentRss>http://hjiang.net/archives/204/feed</wfw:commentRss>
		</item>
		<item>
		<title>Moving My Site</title>
		<link>http://hjiang.net/archives/197</link>
		<comments>http://hjiang.net/archives/197#comments</comments>
		<pubDate>Wed, 27 Aug 2008 06:23:40 +0000</pubDate>
		<dc:creator>j</dc:creator>
		
		<category><![CDATA[Blog]]></category>

		<guid isPermaLink="false">http://18scorpii.com/?p=197</guid>
		<description><![CDATA[Because of a number of performance problems with DreamHost (strange memory spikes, intermittent 500s), I am moving my site (my homepage and blog) to a VPS I have with RimuHosting. I&#8217;ve been using the VPS for development and experimental web hosting for the past year. I pay slightly more to RimuHosting but get much more [...]]]></description>
			<content:encoded><![CDATA[<p>Because of a number of performance problems with DreamHost (strange memory spikes, intermittent 500s), I am moving my site (my homepage and blog) to a VPS I have with RimuHosting. I&#8217;ve been using the VPS for development and experimental web hosting for the past year. I pay slightly more to RimuHosting but get much more memory, more powerful CPU, and root access (most important).</p>

<p>The domain name for my site will not change, but my blog will be moved from http://www.hjiang.net/wp to http://www.hjiang.net/blog. In the very unlikely event that you subscribed to my feed, you will need to redo it.</p>

<p>During the transition, some photos may be missing, and some text may be badly formatted. I will also take the chance to reorganize and delete some of my old posts.</p>
]]></content:encoded>
			<wfw:commentRss>http://hjiang.net/archives/197/feed</wfw:commentRss>
		</item>
		<item>
		<title>Writing Tests First</title>
		<link>http://hjiang.net/archives/191</link>
		<comments>http://hjiang.net/archives/191#comments</comments>
		<pubDate>Tue, 26 Aug 2008 23:43:32 +0000</pubDate>
		<dc:creator>j</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://18scorpii.com/?p=191</guid>
		<description><![CDATA[The test-driven development (TDD) methodology advocates the following practice (in that order):


Write tests for the feature you want to implement.
Watch the tests fail.
Write enough code for the tests to pass.
Refactor your code.


I usually don&#8217;t care about the order in which the tests and the production code are written. I am used to a more traditional [...]]]></description>
			<content:encoded><![CDATA[<p>The test-driven development (TDD) methodology advocates the following practice (in that order):</p>

<ol>
<li>Write tests for the feature you want to implement.</li>
<li>Watch the tests fail.</li>
<li>Write enough code for the tests to pass.</li>
<li>Refactor your code.</li>
</ol>

<p>I usually don&#8217;t care about the order in which the tests and the production code are written. I am used to a more traditional approach &#8212; write the code, and then the tests. Recently I realized one big benefit of writing tests first (in addition to all the other benefits the TDD advocates have been saying). Writing the tests first and watching them fail make sure the tests are indeed working, and after you write more code to make the tests pass, you are sure that the new code is indeed doing the work. If you write the production code first and then write the tests, the tests pass, but then you cannot be sure whether your code is indeed correct or your tests are broken (pass when they shouldn&#8217;t have).</p>

<p>In a few places in one of my personal projects, I mistakenly used <code>assert()</code> instead of the <code>assertTrue()</code> JUnit function. <code>assert()</code> is only effective in debug mode, so these tests end up useless.</p>
]]></content:encoded>
			<wfw:commentRss>http://hjiang.net/archives/191/feed</wfw:commentRss>
		</item>
		<item>
		<title>奥运改不了的媚外情结</title>
		<link>http://hjiang.net/archives/178</link>
		<comments>http://hjiang.net/archives/178#comments</comments>
		<pubDate>Mon, 25 Aug 2008 20:49:28 +0000</pubDate>
		<dc:creator>j</dc:creator>
		
		<category><![CDATA[Society]]></category>

		<guid isPermaLink="false">http://www.hjiang.net/wp/?p=242</guid>
		<description><![CDATA[08奥运闭幕式上伦敦的8分钟表演在英国自己新闻网站的读者评论中几乎被骂得一无是处，认为是闭幕式的一个embarrassment。就是这让英国人觉得困窘和莫名其妙的8分钟，在中国确有不少人能从中解读出不少内涵，于是伦敦8分钟成为了奥运会闭幕式唯一亮点，“令张艺谋汗颜”。

不知道是这些人真的比英国人更了解英国文化，还是在他们的惯性思维中西方是“文明世界”，所以出来的东西必然是必然是比中国的更加有文化的。
]]></description>
			<content:encoded><![CDATA[<p>08奥运闭幕式上伦敦的8分钟表演在英国自己新闻网站的读者评论中<a href="http://www.telegraph.co.uk/sport/othersports/olympics/2615247/Beijing-Olympics-Boris-Johnson-and-Downing-St-condemn-Myra-Hindley-London-2012-image.html">几乎被骂得一无是处</a>，认为是<a href="http://www.bbc.co.uk/blogs/olympics/2008/08/beijing_over_and_out_follow_th.html">闭幕式的一个embarrassment</a>。就是这让英国人觉得困窘和莫名其妙的8分钟，在中国确有不少人能从中<a href="http://www.xici.net/b396019/d76166108.htm">解读出不少内涵</a>，于是伦敦8分钟成为了<a href="http://blog.sina.com.cn/s/blog_476fb4b30100apoq.html">奥运会闭幕式唯一亮点，“令张艺谋汗颜”</a>。</p>

<p>不知道是这些人真的比英国人更了解英国文化，还是在他们的惯性思维中西方是“文明世界”，所以出来的东西必然是必然是比中国的更加有文化的。</p>
]]></content:encoded>
			<wfw:commentRss>http://hjiang.net/archives/178/feed</wfw:commentRss>
		</item>
		<item>
		<title>哀悼日</title>
		<link>http://hjiang.net/archives/169</link>
		<comments>http://hjiang.net/archives/169#comments</comments>
		<pubDate>Mon, 19 May 2008 02:48:31 +0000</pubDate>
		<dc:creator>j</dc:creator>
		
		<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://www.hjiang.net/wp/?p=237</guid>
		<description><![CDATA[过去这个星期时间都花在看新闻报道和bbs上了，一直没有时间为地震写篇blog，其实到现在也不知道该写什么。把主页和blog的颜色换了，和别的中国人一起悼念被灾难摧毁的生命。
]]></description>
			<content:encoded><![CDATA[<p>过去这个星期时间都花在看新闻报道和bbs上了，一直没有时间为地震写篇blog，其实到现在也不知道该写什么。把主页和blog的颜色换了，和别的中国人一起悼念被灾难摧毁的生命。</p>
]]></content:encoded>
			<wfw:commentRss>http://hjiang.net/archives/169/feed</wfw:commentRss>
		</item>
		<item>
		<title>贴了些在三藩迎火炬时的照片</title>
		<link>http://hjiang.net/archives/168</link>
		<comments>http://hjiang.net/archives/168#comments</comments>
		<pubDate>Sun, 27 Apr 2008 07:28:45 +0000</pubDate>
		<dc:creator>j</dc:creator>
		
		<category><![CDATA[Photos]]></category>

		<guid isPermaLink="false">http://www.hjiang.net/wp/2008/04/27/torch-relay-photos/</guid>
		<description><![CDATA[一直忘了在这里发个链接：
点这里
]]></description>
			<content:encoded><![CDATA[<p>一直忘了在这里发个链接：
<a href="http://picasaweb.google.com/hjiang.net/SanFranciscoOlympicTorchRelay">点这里</a></p>
]]></content:encoded>
			<wfw:commentRss>http://hjiang.net/archives/168/feed</wfw:commentRss>
		</item>
		<item>
		<title>We Are Not Brain-Washed</title>
		<link>http://hjiang.net/archives/167</link>
		<comments>http://hjiang.net/archives/167#comments</comments>
		<pubDate>Sun, 13 Apr 2008 02:24:14 +0000</pubDate>
		<dc:creator>j</dc:creator>
		
		<category><![CDATA[Culture]]></category>

		<category><![CDATA[Society]]></category>

		<category><![CDATA[politics]]></category>

		<category><![CDATA[tibet]]></category>

		<guid isPermaLink="false">http://www.hjiang.net/wp/2008/04/12/we-are-not-brain-washed/</guid>
		<description><![CDATA[This is from my post in an email discussion with some coworkers, edited for a more general audience.

Many Americans
believe that people who grow up in China have been brainwashed. There
were many times during the torch relay event that the phrase &#8220;because
you are brainwashed&#8221; caused a conversation to end abruptly. Back when
I was a college student [...]]]></description>
			<content:encoded><![CDATA[<p>This is from my post in an email discussion with some coworkers, edited for a more general audience.</p>

<p>Many Americans
believe that people who grow up in China have been brainwashed. There
were many times during the torch relay event that the phrase &#8220;because
you are brainwashed&#8221; caused a conversation to end abruptly. Back when
I was a college student in China, I disliked the government as much as
any of you here do, probably more. The same is true for many other
students. If the government intended to brainwash the students, then I
can assure you it wasn&#8217;t very successful. I was thoroughly disgusted
by many things, and I used to organize protests against the school
authority. Then I came to the US, both because the US has some of the
world&#8217;s best universities and because I disliked the Chinese
government. I studied for 5 years in a PhD program here and have
worked for less than one year. During these 6 years, my
attitude toward the Chinese government has been gradually changed and
I started to understand why things are that way in China and found
many of the things I hated become understandable, not because the
Chinese government can remotely brain-wash me from the other side of
the ocean but because there is comparison. Don&#8217;t get me wrong. I am
not saying that China is better than or anywhere close to the US. But
I do see many of the things I disliked in China happening here,
sometimes in more subtle ways, sometimes to a lesser extent. Seeing
that with the abundance of wealth and resource, a relatively small
population, the strongest military force, and strong international
influence, the US still have so many problems, it seemed to me that
the Chinese government had been doing a decent job managing the
country. There are plenty of Chinese people who support the government
on many issues and policies, and believe it or not it is most likely
because their lives are improved rapidly, not because of government
propaganda. Sure there are a lot of propaganda on the Chinese medias,
but they are so superficial and obvious that they largely get ignored
or made fun of. From this aspect, I would argue that the US has a more
powerful propaganda machine to serve its interests and ideology (it
probably started influencing me back when I was in China).</p>

<p>Many people I know have similar feelings. Many of those who went to
San Francisco to protect the torch were also on the Tian&#8217;an Men Square
in 1989.</p>

<p>I think it is unfair and impractical to expect China to do the same
things that the US does now w.r.t. to issues like human rights,
freedom of speech, etc. China has a long cultural history, but as a
modern country, it has less than 60 years of history, while the
social, governmental, and legal systems in the US have evolved for
hundreds of years, not to mention China&#8217;s huge population and
relatively small farmable land. Whenever a problem about China is
discussed, there is always someone who comes out and say &#8220;Simple. Why
not just let people vote for a decision?&#8221; It&#8217;s not that simple. Our
laws have huge holes; Different ethnic groups can have serious
conflicts because of religion and cultural differences; Our government
is immature and afraid of uncertainty; Our whole social system is too
fragile and don&#8217;t have enough buffer to survive instability. Fixing
these problems takes time, and we&#8217;ve come a long way. Voting is not a
trivial process, otherwise there wouldn&#8217;t be so many debates in the US
about the procedure and machinery of voting. Other governments can
easily point fingers at China only because they don&#8217;t have to solve
China&#8217;s problems. One example comes to mind &#8212; the one-child policy.
It had been criticized for a long time by westerners for human rights
violation. Reagan questioned that policy when he visited China, but
the conversation ended when Deng said the restriction could be lifted
if the US could help by accepting 10 million Chinese immigrants per
year. In the city where I grew up, I know a number of families who had
two or more kids. They paid a fine, and did not get the monthly
single-child stipend from the government. It&#8217;s simple. But it does not
surprise me if there are government officials in certain places who
enforced this policy in ways that violated human rights and created
tragedies. In the 80s and 90s, even now, the low-level government
officials in some rural areas didn&#8217;t get chance to receive much
education due to the cultural revolution. It&#8217;s a tragedy of that whole
generation, a tragedy for both the victims and wrong-doers. In the
same way, I don&#8217;t doubt there are many Tibetans whose families
suffered great pain and loss in certain periods, just like many people
in other parts of China. They have my greatest sympathy. However, such
tragedies are usually exaggerated to sound like systematically planned
crime in order to serve political goals.</p>

<p>I grew up in the Yunnan province (next to Tibet), where many Tibetans
live, so I&#8217;ve visited some Tibetan monasteries. My wife travelled a
large region in Tibet - from Lasa all the way to the Everest, talked
to many Tibetans, lived in Tibetan homes. I don&#8217;t want to bring up too
much opinion. Let me just say that from our experience we do not think
the government is against the Tibetan culture or has any plan to
reduce the Tibetan population &#8212; Tibetans don&#8217;t have to pay tax
(although many of them still choose to contribute much of their wealth
to the monasteries); Large amounts of money is spent maintaining the
monasteries; Tibetans receive enough stipend so that they can have a
decent live without working (such social benefit doesn&#8217;t exist in
other parts of China); Tibetans can have 3 children (or more for a
small fee) instead of one. My wife also got warned when entering Tibet
that if she got involved in any kind of conflict with Tibetans, most
likely the local government and police will not help her, to avoid
stirring up the tension between different ethnic groups.</p>

<p>We all agree that China has problems: human rights, freedom of speech,
etc. But I don&#8217;t believe there is such a thing that one country or
government helps to improve human rights in another country. A country
only helps itself. The US government only supports freedom and
self-determination when it serves its national interest. I&#8217;m not
accusing the US, this probably applies to all governments. I have a
pessimistic view of international politics, so when a government is
paying money for something happening elsewhere, I always doubt its
intention. From unclassified US government documents, the Dalai Lama
had been on CIA payroll until the mid 70s when the US and China
establishes foreign relationship, then he got transfered to another
organization with the phrase &#8220;human rights&#8221; in it. The same set of
documents also show that the US had been training a Tibetan army in
Colorado and dropping them back to Tibet as gorilla fighters. &#8220;Human
rights&#8221; sounds so good and is so widely applicable that it is the most
convenient phrase to use when a government needs to explain to tax
payers why their money is used to help overthrow another government.
Yes, there are problems in the Chinese government, we all acknowledge
that. There is no incentive for a Chinese to hide the government&#8217;s
shortcomings, after all,  a better government means a better China and
better lives for Chinese. However, I believe the Chinese people have
enough wisdom and courage to solve their own problems. We know the US
government&#8217;s capability of &#8220;introducing&#8221; democracy into another
country &#8212; there are plenty of examples to look at. Thanks, but no,
thanks. China is unique, and there is more than one way to democracy.</p>

<p>I hope people from different nations don&#8217;t accuse each other of &#8220;brain-washed&#8221; simply
because they have different opinions or they are not expressing their
opinions clearly due to language/cultural barriers.</p>

<p>I believe most Americans who support &#8220;Free Tibet&#8221; have good intentions
and have very good reasons for their attitude. But be sure to do
enough research to make sure your good will is not misused by others.
(Note that this is a suggestion, not an assertion.) I&#8217;m not
trying to change anyone&#8217;s opinion, just want to let others know what
people with similar backgrounds with me might think.</p>
]]></content:encoded>
			<wfw:commentRss>http://hjiang.net/archives/167/feed</wfw:commentRss>
		</item>
		<item>
		<title>&#8220;Free Tibet&#8221; on the Golden Gate Bridge</title>
		<link>http://hjiang.net/archives/166</link>
		<comments>http://hjiang.net/archives/166#comments</comments>
		<pubDate>Tue, 08 Apr 2008 06:14:19 +0000</pubDate>
		<dc:creator>j</dc:creator>
		
		<category><![CDATA[Entertainment]]></category>

		<guid isPermaLink="false">http://www.hjiang.net/wp/2008/04/08/free-tibet-idiots-on-the-golden-gate-bridge/</guid>
		<description><![CDATA[See this link.

Quoted from a Digg comment:

Did anyone bother to tell them that Tibet is within the territorial grounds of mainland China and NOT California? Seriously, I think our Elemetary schools are failing us!
]]></description>
			<content:encoded><![CDATA[<p>See <a href="http://www.sfgate.com/cgi-bin/article.cgi?f=/c/a/2008/04/07/MN6L101A0U.DTL&#038;tsp=1">this link</a>.</p>

<p>Quoted from a Digg comment:</p>

<blockquote>Did anyone bother to tell them that Tibet is within the territorial grounds of mainland China and NOT California? Seriously, I think our Elemetary schools are failing us!</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://hjiang.net/archives/166/feed</wfw:commentRss>
		</item>
	</channel>
</rss>
