<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10chinesetwfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0"><generator uri="http://www.habariproject.org/" version="0.7-alpha">Habari</generator><id>tag:blog.bcse.info,2010-08-01:atom/0b7d649d4e1b4b369409ea814509ecd4f65e39fe</id><title>Lvx ex Cælis</title><subtitle>虛實相歸，有無相生；寒暑相反，明晦相隨。</subtitle><updated>2010-07-23T15:58:15+08:00</updated><link rel="alternate" href="http://blog.bcse.info/" /><link rel="first" href="http://blog.bcse.info/atom/1/page/1" type="application/atom+xml" title="First Page" /><link rel="next" href="http://blog.bcse.info/atom/1/page/2" type="application/atom+xml" title="Next Page" /><link rel="last" href="http://blog.bcse.info/atom/1/page/12" type="application/atom+xml" title="Last Page" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/bcse" /><feedburner:info uri="bcse" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>23.97692</geo:lat><geo:long>121.57041</geo:long><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nd/2.5/" /><xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" /><logo>http://feeds.feedburner.com/~fc/bcse?bg=CCFFFF&amp;fg=444444&amp;anim=f</logo><feedburner:emailServiceId>bcse</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Fbcse" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fbcse" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/bcse" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fbcse" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fbcse" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fbcse" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2Fbcse" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><entry><title>Segoe WP Full Family Free Download</title><link rel="alternate" href="http://feedproxy.google.com/~r/bcse/~3/qmoClah-Fp4/segoe-wp-full-family-free-download" /><link rel="edit" href="http://blog.bcse.info/segoe-wp-full-family-free-download/atom" /><author><name>Joel Lee</name><uri>http://blog.bcse.info</uri></author><id>tag:blog.bcse.info,2010:%E6%B8%AC%E8%A9%A6/1273947572</id><updated>2010-07-23T15:58:15+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-23T15:59:44+08:00</app:edited><published>2010-07-23T15:58:15+08:00</published><category term="@言語" /><category term="typeface" /><content type="html">&lt;p&gt;Microsoft 在剛釋出的 &lt;a href="http://go.microsoft.com/fwlink/?LinkId=196225"&gt;Design Templates for Windows Phone 7&lt;/a&gt;&lt;sup id="fnref:segoe-wp-1"&gt;&lt;a href="#fn:segoe-wp-1" rel="footnote"&gt;1&lt;/a&gt;&lt;/sup&gt; 當中包含了 Segoe WP 全字族。&lt;/p&gt;

&lt;p&gt;根據它的授權條款描述，它允許使用者依照該字型的嵌入限制來進行內嵌，而我用 FontForge 查看過的結果是，Segoe WP 允許被內嵌於 Editable Document。唯一不允許的是自由散佈這些檔案，不過沒關係，大家到上面 Microsoft 提供的連結下載就好。&lt;/p&gt;

&lt;p&gt;以下是授權條款原文：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;c. Font Components.&lt;/strong&gt; While the software is running, you may use its fonts to display and print content. You may only embed fonts in content as permitted by the embedding restrictions in the fonts; and temporarily download them to a printer or other output device to print content.  You may not distribute the fonts.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="footnotes"&gt;
&lt;hr /&gt;
&lt;ol&gt;

&lt;li id="fn:segoe-wp-1"&gt;
&lt;p&gt;我實在找不到 MSDN Download 的連結。&amp;#160;&lt;a href="#fnref:segoe-wp-1" rev="footnote"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;
&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/bcse?a=qmoClah-Fp4:RxKAgDqtEk0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/bcse?i=qmoClah-Fp4:RxKAgDqtEk0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bcse/~4/qmoClah-Fp4" height="1" width="1"/&gt;</content><link rel="replies" href="http://blog.bcse.info/segoe-wp-full-family-free-download/atom/comments" thr:count="0" /><thr:total>0</thr:total><feedburner:origLink>http://blog.bcse.info/segoe-wp-full-family-free-download</feedburner:origLink></entry><entry><title>中文簡繁參考對應表</title><link rel="alternate" href="http://feedproxy.google.com/~r/bcse/~3/ccF2QL7F-dI/chinese-simp-to-trad" /><link rel="edit" href="http://blog.bcse.info/chinese-simp-to-trad/atom" /><author><name>Joel Lee</name><uri>http://blog.bcse.info</uri></author><id>tag:blog.bcse.info,2010:chinese-simp-to-trad/1272666857</id><updated>2010-05-01T06:51:03+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-05T21:18:39+08:00</app:edited><published>2010-05-01T06:51:03+08:00</published><category term="@斷簡" /><category term="Natural Language Processing" /><content type="html">&lt;p&gt;更新了一下&lt;a href="https://spreadsheets.google.com/ccc?key=0AhpwnJUAWi9ndHBTVmg5cS0xZVhQUC1NX2s0bzNWY3c&amp;amp;hl=zh_TW"&gt;這張表&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;欄位由左至右依序是簡字編號、繁字編號、簡體字符、繁體字符、簡字字頻、繁字字頻，字頻的計算是根據 &lt;a href="http://svn.openfoundry.org/libchewingdata/utf-8/"&gt;tsi.src&lt;/a&gt;，因此沒有簡體字的資料，事實上也不需要有。&lt;/p&gt;

&lt;p&gt;有顏色的部份是指沒有必要轉換，或者為了避免發生混淆而不進行轉換。&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/bcse?a=ccF2QL7F-dI:pjdPLvRXkQc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/bcse?i=ccF2QL7F-dI:pjdPLvRXkQc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bcse/~4/ccF2QL7F-dI" height="1" width="1"/&gt;</content><link rel="replies" href="http://blog.bcse.info/chinese-simp-to-trad/atom/comments" thr:count="0" /><thr:total>0</thr:total><feedburner:origLink>http://blog.bcse.info/chinese-simp-to-trad</feedburner:origLink></entry><entry><title>Get geolocation via JavaScript (2)</title><link rel="alternate" href="http://feedproxy.google.com/~r/bcse/~3/3lpoKQ4gxsc/get-geolocation-via-javascript-2" /><link rel="edit" href="http://blog.bcse.info/get-geolocation-via-javascript-2/atom" /><author><name>Joel Lee</name><uri>http://blog.bcse.info</uri></author><id>tag:blog.bcse.info,2010:get-geolocation-via-javascript-2/1270383672</id><updated>2010-04-04T20:23:19+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-05T04:12:04+08:00</app:edited><published>2010-04-04T20:23:19+08:00</published><category term="@斷簡" /><category term="JavaScript" /><category term="Geolocation" /><content type="html">&lt;p&gt;&lt;a href="http://blog.bcse.info/get-geolocation-via-javascript"&gt;延續上一篇&lt;/a&gt;，這篇是精度更高的 Geolocation，原理是透過 &lt;a href="http://www.w3.org/TR/geolocation-API/"&gt;W3C Geolocation API&lt;/a&gt; 來取，如果瀏覽器不支援，就 fallback 到 &lt;a href="http://code.google.com/apis/gears/api_geolocation.html"&gt;Google Gears&lt;/a&gt;，兩者的精度似乎是相同的。此方法有兩個缺點，其一是瀏覽器支援率低，其二則是需要經過使用者同意。&lt;/p&gt;

&lt;p&gt;原始碼如下：&lt;/p&gt;

&lt;!--more--&gt;

&lt;h4&gt;ClientLocation_2.js&lt;/h4&gt;

&lt;pre class="prettyprint"&gt;&lt;code&gt;var ClientLocation = null;
(function() {
    var successCallback = function(position, provider) {
        ClientLocation = {
            provider: provider,
            latitude: position.coords.latitude,
            longitude: position.coords.longitude,
        }
    }
    var errorCallback = function(error) {return;}
    var options = {enableHighAccuracy: true}
    if (navigator.geolocation instanceof Object) {
        navigator.geolocation.getCurrentPosition(
            function(position) {
                successCallback(position, "W3C Geolocation API");
            }, errorCallback, options);
    } else {
        var js = document.createElement("script");
        js.type = "text/javascript";
        js.src = "http://code.google.com/apis/gears/gears_init.js";
        document.getElementsByTagName("head")[0].appendChild(js);

        var loadGears = setInterval(
            function() {
                if (typeof google.gears != "undefined") {
                    clearInterval(loadGears);
                    var geo = google.gears.factory.create('beta.geolocation');
                    geo.getCurrentPosition(
                        function(position) {
                            successCallback(position, "Google Gears");
                        }, errorCallback, options);
                }
            },
            210 /* poll per 0.21 second*/
        );
    }
})();
&lt;/code&gt;&lt;/pre&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/bcse?a=3lpoKQ4gxsc:vNI8M0i8cgo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/bcse?i=3lpoKQ4gxsc:vNI8M0i8cgo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bcse/~4/3lpoKQ4gxsc" height="1" width="1"/&gt;</content><link rel="replies" href="http://blog.bcse.info/get-geolocation-via-javascript-2/atom/comments" thr:count="0" /><thr:total>0</thr:total><feedburner:origLink>http://blog.bcse.info/get-geolocation-via-javascript-2</feedburner:origLink></entry><entry><title>Get geolocation via JavaScript</title><link rel="alternate" href="http://feedproxy.google.com/~r/bcse/~3/rRr6eD0t5Hs/get-geolocation-via-javascript" /><link rel="edit" href="http://blog.bcse.info/get-geolocation-via-javascript/atom" /><author><name>Joel Lee</name><uri>http://blog.bcse.info</uri></author><id>tag:blog.bcse.info,2010:get-geolocation-via-javascript/1270367463</id><updated>2010-04-04T16:10:28+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-05T04:11:35+08:00</app:edited><published>2010-04-04T16:10:28+08:00</published><category term="@斷簡" /><category term="JavaScript" /><category term="Geolocation" /><content type="html">&lt;p&gt;此 script 的運作流程如下：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;先試著用 &lt;a href="http://code.google.com/apis/ajax/documentation/"&gt;Google AJAX API&lt;/a&gt; 取得訪客的 Geolocation 資訊，因為這邊的資訊精度比較高，不過也比較有可能缺資料。&lt;/li&gt;
&lt;li&gt;如果前面的步驟失敗了，就改用 &lt;a href="http://www.maxmind.com/app/javascript_city"&gt;MaxMind GeoIP Javascript Web Service&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;最後得到的結果將會放在 ClientLocation 物件中，這個物件的取用方法基本上跟 Google AJAX API 的 &lt;a href="http://code.google.com/apis/ajax/documentation/#ClientLocation"&gt;ClientLocation&lt;/a&gt; 一樣，差別只在多了一個 &lt;code&gt;provider&lt;/code&gt; 屬性。&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;Example Usage&lt;/h3&gt;

&lt;pre class="prettyprint"&gt;&lt;code&gt;&amp;lt;script type="text/javascript" src="ClientLocation.js"&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type="text/javascript"&amp;gt;
var interval = setInterval(
        function() {
            if (ClientLocation instanceof Object) {
                clearInterval(interval);
                alert("Client Geolocation via " + ClientLocation.provider + ": " + ClientLocation.latitude + ", " + ClientLocation.longitude);
            }
        },
        467 /* poll per 0.467 second*/
    );
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;以下附上 &lt;code&gt;ClientLocation.js&lt;/code&gt; 的原始碼。&lt;/p&gt;

&lt;!--more--&gt;

&lt;h4&gt;ClientLocation.js&lt;/h4&gt;

&lt;pre class="prettyprint"&gt;&lt;code&gt;var ClientLocation = null;
(function() {
    var loadJs = function(file) {
        var js = document.createElement("script");
        js.type = "text/javascript";
        js.src = file;
        document.getElementsByTagName("head")[0].appendChild(js);
    }
    loadJs('http://www.google.com/jsapi');

    var loadGoogle = setInterval(
        function() {
            if (google.loader instanceof Object) {
                clearInterval(loadGoogle);
                if (google.loader.ClientLocation instanceof Object) {
                    ClientLocation = google.loader.ClientLocation;
                    ClientLocation.provider = "Google";
                } else {
                    loadJs('http://j.maxmind.com/app/geoip.js');

                    var loadMaxMind = setInterval(
                        function() {
                            if (typeof geoip_country_name != "undefined") {
                                clearInterval(loadMaxMind);
                                ClientLocation = {
                                    provider: "MaxMind",
                                    latitude: parseFloat(geoip_latitude()),
                                    longitude: parseFloat(geoip_longitude()),
                                    address: {
                                        city: geoip_city(),
                                        country: geoip_country_name(),
                                        country_code: geoip_country_code(),
                                        region: geoip_region_name()
                                    }
                                }
                            }
                        },
                        431 /* poll per 0.431 second*/
                    );
                }
            }
        },
        271 /* poll per 0.271 second*/
    );
})();
&lt;/code&gt;&lt;/pre&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/bcse?a=rRr6eD0t5Hs:aM07ndfJJd8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/bcse?i=rRr6eD0t5Hs:aM07ndfJJd8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bcse/~4/rRr6eD0t5Hs" height="1" width="1"/&gt;</content><link rel="replies" href="http://blog.bcse.info/get-geolocation-via-javascript/atom/comments" thr:count="0" /><thr:total>0</thr:total><feedburner:origLink>http://blog.bcse.info/get-geolocation-via-javascript</feedburner:origLink></entry><entry><title>Windows Live SkyDrive Direct Download Link</title><link rel="alternate" href="http://feedproxy.google.com/~r/bcse/~3/4azHSpLkKDc/windows-live-skydrive-direct-download-link" /><link rel="edit" href="http://blog.bcse.info/windows-live-skydrive-direct-download-link/atom" /><author><name>Joel Lee</name><uri>http://blog.bcse.info</uri></author><id>tag:blog.bcse.info,2010:windows-live-skydrive-direct-download-link/1270308708</id><updated>2010-04-03T23:56:30+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-03T23:57:25+08:00</app:edited><published>2010-04-03T23:56:30+08:00</published><category term="@斷簡" /><category term="Microsoft" /><content type="html">&lt;h3&gt;Usage&lt;/h3&gt;

&lt;pre class="prettyprint"&gt;&lt;code&gt;http://ex.bcse.info/skyd.php?file={%url%}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;舉例來說，要得到 &lt;a href="http://cid-c935cb6de4803510.skydrive.live.com/self.aspx/Videos/FF%E3%80%8C%E3%83%81%E3%83%A7%E3%82%B3%E3%83%9C%E3%81%AE%E3%83%86%E3%83%BC%E3%83%9E%E3%80%8D%E3%82%92%E3%82%AA%E3%82%AB%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%B3%E3%81%8C%E6%AD%8C%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F.flv"&gt;FF「チョコボのテーマ」をオカメインコが歌ってみた.flv&lt;/a&gt; 的下載網址，就使用&lt;a href="http://ex.bcse.info/skyd.php?file=http://cid-c935cb6de4803510.skydrive.live.com/self.aspx/Videos/FF%E3%80%8C%E3%83%81%E3%83%A7%E3%82%B3%E3%83%9C%E3%81%AE%E3%83%86%E3%83%BC%E3%83%9E%E3%80%8D%E3%82%92%E3%82%AA%E3%82%AB%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%B3%E3%81%8C%E6%AD%8C%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F.flv"&gt;這個連結&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;另外，如果要配合 &lt;a href="http://code.google.com/p/bcse/wiki/JWMediaPlayer"&gt;JWMediaPlayer&lt;/a&gt; 使用，需注意太長的網址會被截斷，可使用短網址服務解決，比方說這樣：&lt;/p&gt;

&lt;pre class="prettyprint"&gt;&lt;code&gt;http://ex.bcse.info/skyd.php?file=http://bit.ly/asXC1A?.flv
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;※ 註：為了讓 &lt;a href="http://www.longtailvideo.com/"&gt;JW Player&lt;/a&gt; 知道檔案是 FLV 格式，所以在短網址後面加上 &lt;code&gt;?.flv&lt;/code&gt;。&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/bcse?a=4azHSpLkKDc:YRVFlF4xj1k:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/bcse?i=4azHSpLkKDc:YRVFlF4xj1k:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bcse/~4/4azHSpLkKDc" height="1" width="1"/&gt;</content><link rel="replies" href="http://blog.bcse.info/windows-live-skydrive-direct-download-link/atom/comments" thr:count="0" /><thr:total>0</thr:total><feedburner:origLink>http://blog.bcse.info/windows-live-skydrive-direct-download-link</feedburner:origLink></entry><entry><title>Read/Write JSON in C#</title><link rel="alternate" href="http://feedproxy.google.com/~r/bcse/~3/iFhr-jh3ZMk/read-write-json-in-c-sharp" /><link rel="edit" href="http://blog.bcse.info/read-write-json-in-c-sharp/atom" /><author><name>Joel Lee</name><uri>http://blog.bcse.info</uri></author><id>tag:blog.bcse.info,2010:readwrite-json-in-c/1270304991</id><updated>2010-04-03T22:48:17+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-04T15:53:01+08:00</app:edited><published>2010-04-03T22:48:17+08:00</published><category term="@斷簡" /><category term="JavaScript" /><category term="C#" /><category term=".NET" /><content type="html">&lt;p&gt;將要轉成 JSON 的類別標上 &lt;code&gt;[DataContract]&lt;/code&gt;、屬性標上 &lt;code&gt;[DataMember]&lt;/code&gt;，然後用 &lt;code&gt;DataContractJsonSerializer&lt;/code&gt; 來操作，超簡單的。需要注意的是要記得加入 &lt;code&gt;System.Runtime.Serialization&lt;/code&gt; 參考，如果不加的話就不能用 &lt;code&gt;DataContractAttribute&lt;/code&gt;。&lt;/p&gt;

&lt;!--more--&gt;

&lt;h3&gt;Sample Code&lt;/h3&gt;

&lt;pre class="prettyprint"&gt;&lt;code&gt;using System;
using System.Diagnostics;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Windows.Forms;

namespace ExampleApplication
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Document[] d = new Document[] {
                new Document { author = @"囧rz", content = @"Lorem ipsum dolor sit amet.",created = DateTime.Now },
                new Document { author = @"XD", content = @"Os iusti meditabitur ""sapientium"".",created = DateTime.Today }
            };

            string json = Serialize&amp;lt;Document[]&amp;gt;.ToJsonString(d);
            Document[] d2 = Serialize&amp;lt;Document[]&amp;gt;.FromJsonString(json);

            Debug.WriteLine(json);
            // Output: [{"author":"囧rz","content":"Lorem ipsum dolor sit amet.","created":"\/Date(1270305854078+0800)\/"},{"author":"XD","content":"Os iusti meditabitur \"sapientium\".","created":"\/Date(1270224000000+0800)\/"}]

            Debug.WriteLine(d2[0].author);
            // Output: 囧rz

            Debug.WriteLine(Serialize&amp;lt;string[]&amp;gt;.ToJsonString(new string[] { "Lorem", "Ipsum", "Dolor", "Sit", "Amet" }));
            // Output: ["Lorem","Ipsum","Dolor","Sit","Amet"]
        }
    }

    public class Serialize&amp;lt;T&amp;gt; where T : class
    {
        static DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
        static MemoryStream stream;

        public static string ToJsonString(T graph)
        {
            stream = new MemoryStream();
            serializer.WriteObject(stream, graph);
            return Encoding.UTF8.GetString(stream.ToArray());
        }

        public static T FromJsonString(string json)
        {
            stream = new MemoryStream(Encoding.UTF8.GetBytes(json));
            return serializer.ReadObject(stream) as T;
        }
    }

    [DataContract]
    public class Document
    {
        [DataMember]
        public string author;

        [DataMember]
        public string content;

        [DataMember]
        public DateTime created;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/bcse?a=iFhr-jh3ZMk:fbS7S4_mcys:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/bcse?i=iFhr-jh3ZMk:fbS7S4_mcys:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bcse/~4/iFhr-jh3ZMk" height="1" width="1"/&gt;</content><link rel="replies" href="http://blog.bcse.info/read-write-json-in-c-sharp/atom/comments" thr:count="0" /><thr:total>0</thr:total><feedburner:origLink>http://blog.bcse.info/read-write-json-in-c-sharp</feedburner:origLink></entry><entry><title>Load Cufón font dynamically</title><link rel="alternate" href="http://feedproxy.google.com/~r/bcse/~3/S69YFE_fOrQ/load-cufon-font-dynamically" /><link rel="edit" href="http://blog.bcse.info/load-cufon-font-dynamically/atom" /><author><name>Joel Lee</name><uri>http://blog.bcse.info</uri></author><id>tag:blog.bcse.info,2009:load-cufon-font-dynamically/1248607329</id><updated>2009-07-26T21:16:27+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-03T22:50:51+08:00</app:edited><published>2009-07-26T21:16:27+08:00</published><category term="@言語" /><category term="Typography" /><category term="Web Design" /><category term="canvas" /><content type="html">&lt;p&gt;前陣子我曾實驗利用 &lt;a href="http://cufon.shoqolate.com/"&gt;Cufón&lt;/a&gt; 在網頁上嵌入中文字型，當時的實驗結果是中文字型轉換為 JavaScript 格式，再經過 gzip 壓縮後，其大小雖然已經比原來的 TrueType 檔案小------以微軟正黑體為例，原始字型檔為 14 MB，經轉換後為 5.3 MB------但對於網路傳輸而言仍然過大，因此無法實際使用。&lt;/p&gt;

&lt;p&gt;最近發現 Google App Engine 的&lt;a href="http://code.google.com/appengine/docs/python/tools/uploadingdata.html"&gt;大量傳輸 API&lt;/a&gt; 已經&lt;a href="http://googleappengine.blogspot.com/2009/02/sdk-version-119-released.html"&gt;開放&lt;/a&gt;了，於是試著寫個東西來玩。我把 Cufón 字型的每個 Glyph 個別儲存到 Datastore，然後根據頁面的實際需要，重組成僅含所需字集的新檔案，藉此縮小所需傳輸的檔案大小。&lt;/p&gt;

&lt;table&gt;
    &lt;thead&gt;
        &lt;tr&gt;&lt;th rowspan="2"&gt;&amp;nbsp;&lt;/th&gt;&lt;th colspan="2"&gt;字型檔案大小&lt;/th&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;th&gt;使用 gzip 壓縮&lt;/th&gt;&lt;th&gt;不使用 gzip 壓縮&lt;/th&gt;&lt;/tr&gt;
    &lt;thead&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;a href="http://ex.bcse.info/cufon/msjh.gae.html"&gt;範例1：載入完整字型&lt;/a&gt;&lt;/td&gt;
            &lt;td class="aligncenter"&gt;10.5 MB&lt;/td&gt;
            &lt;td class="aligncenter"&gt;34.1 MB&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;a href="http://ex.bcse.info/cufon/msjh.dynamic.html"&gt;範例2：只載入所需的字集&lt;/a&gt;&lt;/td&gt;
            &lt;td class="aligncenter"&gt;22.3 KB&lt;/td&gt;
            &lt;td class="aligncenter"&gt;61.4 KB&lt;/td&gt;
        &lt;/tr&gt;
    &lt;tbody&gt;
&lt;/table&gt;

&lt;p&gt;目前的作法是把需要的字集直接用 &lt;code&gt;GET&lt;/code&gt; 告訴伺服器，但這樣未來可能會遇上 &lt;a href="http://support.microsoft.com/kb/208427"&gt;&lt;code&gt;GET&lt;/code&gt; 長度限制問題&lt;/a&gt;…… 我想到的解法是可改用 JavaScript 載入這個檔案，用 &lt;code&gt;POST&lt;/code&gt; 傳遞字集資訊，同時或許也能用 JavaScript 自動整理出所需的字集（目前是用手動整理 :p）。&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/bcse?a=S69YFE_fOrQ:-O_O7NqLYG4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/bcse?i=S69YFE_fOrQ:-O_O7NqLYG4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bcse/~4/S69YFE_fOrQ" height="1" width="1"/&gt;</content><link rel="replies" href="http://blog.bcse.info/load-cufon-font-dynamically/atom/comments" thr:count="4" thr:updated="2009-12-01T18:18:20+08:00" /><thr:total>4</thr:total><feedburner:origLink>http://blog.bcse.info/load-cufon-font-dynamically</feedburner:origLink></entry><entry><title>繁體版微軟雅黑字型 (2)</title><link rel="alternate" href="http://feedproxy.google.com/~r/bcse/~3/Bc98KLBd8mc/microsoft-yahei-traditional-6-02" /><link rel="edit" href="http://blog.bcse.info/microsoft-yahei-traditional-6-02/atom" /><author><name>Joel Lee</name><uri>http://blog.bcse.info</uri></author><id>tag:blog.bcse.info,2009:繁體版微軟雅黑字型-2/1245656368</id><updated>2009-06-22T15:39:30+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-01T18:48:59+08:00</app:edited><published>2009-06-22T15:28:29+08:00</published><category term="@斷簡" /><category term="typeface" /><content type="html">&lt;p&gt;&lt;a href="/microsoft-yahei-traditional#comment-14246"&gt;因為有人想要&lt;/a&gt;，所以更新了一下。&lt;/p&gt;

&lt;p&gt;此更新檔的功能為將微軟雅黑字型 6.02 版（MD5: EB525DCBA67C642CFA418424F8C7DFC7）更新為繁體版。原始字型檔取自 Windows 7 RC 版，本 blog 不提供原始字型檔，請自行取得。&lt;/p&gt;

&lt;p&gt;※ 註：微軟雅黑字型本來就包含繁體字，此更新檔是將微軟雅黑中的簡體字也取代為繁體，如此便能用繁體顯示原本為簡體的文字。如果您沒有這樣的需求，便無須使用本更新檔。&lt;/p&gt;

&lt;div class="download"&gt;&lt;a href="http://cdn.bcse.info/file/msyht_6.02.exe"&gt;Microsoft YaHei Traditional Patcher&lt;/a&gt; v6.02&lt;/div&gt;

&lt;p&gt;這裡是我的&lt;a href="/chinese-simp-to-trad"&gt;中文簡繁參考對應表&lt;/a&gt;，如果對此對應表有意見者，也歡迎幫忙修改。&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;這次製作我改用 &lt;a href="http://fontforge.sourceforge.net/"&gt;FontForge&lt;/a&gt;，FontForge 有強大的 &lt;a href="http://fontforge.sourceforge.net/scripting.html"&gt;Scripting&lt;/a&gt; 能力&lt;sup id="fnref:microsoft-yahei-traditional-6-02-1"&gt;&lt;a href="#fn:microsoft-yahei-traditional-6-02-1" rel="footnote"&gt;1&lt;/a&gt;&lt;/sup&gt;，所以製作起來速度超快！&lt;a href="http://cdn.bcse.info/file/remove_simplified_characters.pe"&gt;我的 script 可在此下載&lt;/a&gt;。&lt;/p&gt;

&lt;div class="footnotes"&gt;
&lt;hr /&gt;
&lt;ol&gt;

&lt;li id="fn:microsoft-yahei-traditional-6-02-1"&gt;
&lt;p&gt;這樣說可能會引起誤會，因此特別註明一下：其實 FontCreator、FontLab Studio 等產品也都有 Scripting 的能力，只是我以前不會用 :p&amp;#160;&lt;a href="#fnref:microsoft-yahei-traditional-6-02-1" rev="footnote"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;
&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/bcse?a=Bc98KLBd8mc:5pkP6eHk0Rc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/bcse?i=Bc98KLBd8mc:5pkP6eHk0Rc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bcse/~4/Bc98KLBd8mc" height="1" width="1"/&gt;</content><link rel="replies" href="http://blog.bcse.info/microsoft-yahei-traditional-6-02/atom/comments" thr:count="21" thr:updated="2010-07-30T04:14:43+08:00" /><thr:total>21</thr:total><feedburner:origLink>http://blog.bcse.info/microsoft-yahei-traditional-6-02</feedburner:origLink></entry><entry><title>How to get the latest Droid font family</title><link rel="alternate" href="http://feedproxy.google.com/~r/bcse/~3/4F0vlVcZs2M/how-to-get-the-latest-droid-font-family" /><link rel="edit" href="http://blog.bcse.info/how-to-get-the-latest-droid-font-family/atom" /><author><name>Joel Lee</name><uri>http://blog.bcse.info</uri></author><id>tag:blog.bcse.info,2009:how-to-get-the-latest-droid-font/1245137917</id><updated>2009-06-16T15:38:51+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-16T15:48:08+08:00</app:edited><published>2009-06-16T15:38:51+08:00</published><category term="@斷簡" /><category term="Google" /><category term="typeface" /><content type="html">&lt;p&gt;這篇只是給自己作個紀錄。&lt;/p&gt;

&lt;p&gt;最新版 Droid 字型可以直接從 Android 的 Git repository 取得，不需要從 Android SDK 解出來。位址在 &lt;a href="http://android.git.kernel.org/?p=platform/frameworks/base.git;a=tree;f=data/fonts"&gt;platform/frameworks/base.git/data/fonts&lt;/a&gt;，點選 snapshot 可以將這個資料夾打包下載。&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/bcse?a=4F0vlVcZs2M:HNDi7FiXQGA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/bcse?i=4F0vlVcZs2M:HNDi7FiXQGA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bcse/~4/4F0vlVcZs2M" height="1" width="1"/&gt;</content><link rel="replies" href="http://blog.bcse.info/how-to-get-the-latest-droid-font-family/atom/comments" thr:count="1" thr:updated="2009-06-16T23:07:20+08:00" /><thr:total>1</thr:total><feedburner:origLink>http://blog.bcse.info/how-to-get-the-latest-droid-font-family</feedburner:origLink></entry><entry><title>A Non-Free OpenType Font Pack</title><link rel="alternate" href="http://feedproxy.google.com/~r/bcse/~3/KC1LeT5aHLE/a-non-free-opentype-font-pack" /><link rel="edit" href="http://blog.bcse.info/a-non-free-opentype-font-pack/atom" /><author><name>Joel Lee</name><uri>http://blog.bcse.info</uri></author><id>tag:blog.bcse.info,2009:non-free-opentype-font-pack/1239153396</id><updated>2009-04-08T09:16:36+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-03T22:51:19+08:00</app:edited><published>2009-04-08T09:42:33+08:00</published><category term="@言語" /><category term="Typography" /><category term="Microsoft" /><category term="typeface" /><category term=".NET" /><content type="html">&lt;div class="floatright"&gt;&lt;a href="http://www.flickr.com/photos/bcse/3422105999/" title="OpenTypeFontsSample (by BCSEEATI)"&gt;&lt;img src="http://farm4.static.flickr.com/3390/3422105999_bb7c1ea40f_o.png" title="OpenTypeFontsSample (by BCSEEATI)" alt="OpenTypeFontsSample (by BCSEEATI)" width="181" height="240" /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;p&gt;意外發現 MSDN 中有一包還不錯的 OpenType 字型。這包字型的本意只是用來展示 WPF 的 OpenType 處理能力，所以僅包含英文、數字及部份標點符號，版權則仍由 Ascender 持有，如果要用於其他用途，必須聯絡 Ascender。&lt;/p&gt;

&lt;p&gt;這些字型的特色是它們分別支援了不同的 OpenType Features，例如  Small Caps、Ligatures、Old Style Figures、Swashes、Alternates 等，如果不在意以上所述缺點並想要玩玩看 OpenType Features 的話，可到 &lt;a href="http://msdn.microsoft.com/en-us/library/ms771464.aspx"&gt;Using OpenType Fonts Sample&lt;/a&gt; 這一頁下載。&lt;/p&gt;

&lt;p&gt;P.S. 如果想玩 OpenType Features，請找 Windows 7 中附帶的 Gabriola 字型會更好玩，實在很難得可以看到檔案大小這麼大的英文字型。&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/bcse?a=KC1LeT5aHLE:U1rAxHNLnsM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/bcse?i=KC1LeT5aHLE:U1rAxHNLnsM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bcse/~4/KC1LeT5aHLE" height="1" width="1"/&gt;</content><link rel="replies" href="http://blog.bcse.info/a-non-free-opentype-font-pack/atom/comments" thr:count="0" /><thr:total>0</thr:total><feedburner:origLink>http://blog.bcse.info/a-non-free-opentype-font-pack</feedburner:origLink></entry></feed>
