<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[30Sparks]]></title><description><![CDATA[程序設計，讀書進度，與及人生規劃?!]]></description><link>https://sparks-blog2.fly.dev/</link><image><url>https://sparks-blog2.fly.dev/favicon.png</url><title>30Sparks</title><link>https://sparks-blog2.fly.dev/</link></image><generator>Ghost 5.17</generator><lastBuildDate>Sat, 17 Oct 2026 10:16:02 GMT</lastBuildDate><atom:link href="https://sparks-blog2.fly.dev/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[在 ruby 檢查 time]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>ruby &#x4E2D;&#x7684;&#x6642;&#x9593;&#x5176;&#x5BE6;&#x662F; float &#x4F86;&#x7684;&#x3002;</p>
<p>&#x6240;&#x4EE5;&#x5C31;&#x7B97;&#x660E;&#x660E;&#x5169;&#x500B;&#x6642;&#x9593;&#x7684;&#x6642;&#x5206;&#x79D2;&#x662F;&#x4E00;&#x6A23;</p>
<pre><code>&gt; t1,t2 = Time.now, Time.now
=&gt; [2017-06-15 03:16:02 +0000, 2017-06-15 03:16:02 +0000]
</code></pre>
<p><code>t1 == t2</code> &#x7684;</p>]]></description><link>https://sparks-blog2.fly.dev/ruby-time-comparsion/</link><guid isPermaLink="false">6344c7bf02c13c0211c7d2d9</guid><category><![CDATA[development]]></category><dc:creator><![CDATA[Ryan Leung]]></dc:creator><pubDate>Thu, 15 Jun 2017 03:23:16 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>ruby &#x4E2D;&#x7684;&#x6642;&#x9593;&#x5176;&#x5BE6;&#x662F; float &#x4F86;&#x7684;&#x3002;</p>
<p>&#x6240;&#x4EE5;&#x5C31;&#x7B97;&#x660E;&#x660E;&#x5169;&#x500B;&#x6642;&#x9593;&#x7684;&#x6642;&#x5206;&#x79D2;&#x662F;&#x4E00;&#x6A23;</p>
<pre><code>&gt; t1,t2 = Time.now, Time.now
=&gt; [2017-06-15 03:16:02 +0000, 2017-06-15 03:16:02 +0000]
</code></pre>
<p><code>t1 == t2</code> &#x7684;&#x7D50;&#x679C;&#x4E5F;&#x662F; <code>false</code>&#x3002;</p>
<pre><code>&gt; t1 == t2
=&gt; false
</code></pre>
<p>&#x5982;&#x679C;&#x6211;&#x5011;&#x7528; <code>to_f</code> &#x6AA2;&#x67E5;&#x7684;&#x8A71;&#x6703;&#x5F97;&#x51FA;&#xFF1A;</p>
<pre><code>&gt; t1.to_f
=&gt; 1497496562.0442958
&gt; t2.to_f
=&gt; 1497496562.0443037
</code></pre>
<p>&#x7D50;&#x8AD6;&#x662F;&#x4F7F;&#x7528; <code>to_i</code>, &#x9019;&#x6A23;&#x4FBF;&#x5FFD;&#x7565; milliseconds&#x3002;</p>
<pre><code>&gt; t1.to_i == t2.to_i
=&gt; true
</code></pre>
<h3 id>&#x53C3;&#x8003;&#x9023;&#x7D50;&#xFF1A;</h3>
<ul>
<li><a href="http://railsware.com/blog/2014/04/01/time-comparison-in-ruby/">Time Comparison in Ruby</a></li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[藍芽 logcat filter]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x958B;&#x767C;&#x7528;&#x5230;&#x85CD;&#x82BD;&#x7684; Android Apps &#x6642;&#xFF0C;&#x6703;&#x767C;&#x73FE;&#x5F88;&#x591A;&#x4F86;&#x81EA; BluetoothAdapter &#x7684; log:</p>
<pre><code>
06-08 09:18:07.369 13434-7392/hk.gov.ekeo.app.debug D/BluetoothAdapter: stopLeScan()
06-08 09:18:07.373 13434-7392/hk.gov.ekeo.app.debug D/BluetoothAdapter: STATE_ON</code></pre>]]></description><link>https://sparks-blog2.fly.dev/android-bluetooth-logcat-filter/</link><guid isPermaLink="false">6344c7bf02c13c0211c7d2d8</guid><category><![CDATA[android dev]]></category><dc:creator><![CDATA[Ryan Leung]]></dc:creator><pubDate>Thu, 08 Jun 2017 01:41:59 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x958B;&#x767C;&#x7528;&#x5230;&#x85CD;&#x82BD;&#x7684; Android Apps &#x6642;&#xFF0C;&#x6703;&#x767C;&#x73FE;&#x5F88;&#x591A;&#x4F86;&#x81EA; BluetoothAdapter &#x7684; log:</p>
<pre><code>
06-08 09:18:07.369 13434-7392/hk.gov.ekeo.app.debug D/BluetoothAdapter: stopLeScan()
06-08 09:18:07.373 13434-7392/hk.gov.ekeo.app.debug D/BluetoothAdapter: STATE_ON
06-08 09:18:07.386 13434-7392/hk.gov.ekeo.app.debug D/BluetoothAdapter: stopLeScan()
06-08 09:18:07.389 13434-7392/hk.gov.ekeo.app.debug D/BluetoothAdapter: scan not started yet
06-08 09:18:07.396 13434-7392/hk.gov.ekeo.app.debug D/BluetoothAdapter: startLeScan(): null
06-08 09:18:07.401 13434-7392/hk.gov.ekeo.app.debug D/BluetoothAdapter: STATE_ON
</code></pre>
<p>&#x554F;&#x554F; Google &#x5927;&#x795E;&#x624D;&#x767C;&#x73FE;&#x9019;&#x4E9B;&#x662F;&#x6C92;&#x8FA6;&#x6CD5;&#x95DC;&#x6389;&#x7684;&#x3002;&#x62C6;&#x8877;&#x65B9;&#x6CD5;&#x662F;&#x4F7F;&#x7528; log filter&#xFF0C;&#x7528;&#x4EE5;&#x4E0B; configuration &#x8A2D;&#x5B9A;&#x5373;&#x53EF;</p>
<p>Log Tag: <code>^(?!(BluetoothAdapter|BluetoothLeScanner))</code><br>
Package Name: <code>com.thirtysparks.awesome.app</code></p>
<p>&#x9019;&#x662F;&#x7D66;&#x5C07;&#x4F86;&#x7684;&#x81EA;&#x5DF1;&#x7684;&#x53C3;&#x8003;&#x3002;</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Android 7.0 Locales 中文的處理]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x82E5;&#x7528;&#x6236;&#x7684;&#x5730;&#x5340;&#x8A9E;&#x9078;&#x64C7;&#x4E86;&#x9999;&#x6E2F;&#x7684;&#x8A71;&#xFF0C;&#x662F;&#x6703;&#x4F7F;&#x7528; <code>values-zh</code> &#x7684;&#x8CC7;&#x6E90;&#x7684;&#x3002;&#x5C31;&#x7B97; official document &#x4E5F;&#x662F;&#x9019;&#x6A23;&#x5BEB;&#x7684;&#xFF0C;&#x4F46;&#x5728; Android 7.0 (SDK 25)&#x4E0A;&#x7684;&#x5BE6;&#x969B;&#x6E2C;&#x8A66;&#x7D50;</p>]]></description><link>https://sparks-blog2.fly.dev/android-7-0-locales-chinese-problem/</link><guid isPermaLink="false">6344c7bf02c13c0211c7d2d7</guid><category><![CDATA[android dev]]></category><dc:creator><![CDATA[Ryan Leung]]></dc:creator><pubDate>Wed, 29 Mar 2017 02:10:28 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x82E5;&#x7528;&#x6236;&#x7684;&#x5730;&#x5340;&#x8A9E;&#x9078;&#x64C7;&#x4E86;&#x9999;&#x6E2F;&#x7684;&#x8A71;&#xFF0C;&#x662F;&#x6703;&#x4F7F;&#x7528; <code>values-zh</code> &#x7684;&#x8CC7;&#x6E90;&#x7684;&#x3002;&#x5C31;&#x7B97; official document &#x4E5F;&#x662F;&#x9019;&#x6A23;&#x5BEB;&#x7684;&#xFF0C;&#x4F46;&#x5728; Android 7.0 (SDK 25)&#x4E0A;&#x7684;&#x5BE6;&#x969B;&#x6E2C;&#x8A66;&#x7D50;&#x679C;&#x537B;&#x4E0D;&#x662F;&#x5982;&#x6B64;&#x3002;</p>
<p>&#x4EE5;&#x5F80;&#x5728; <code>TargetSDK=24</code> &#x6642;&#xFF0C;&#x4EFB;&#x4F55; <code>values-zh-HK</code>&#x3001;<code>values-zh-TW</code>&#x3001;<code>values-zh-MO</code>&#x4E2D;&#x627E;&#x4E0D;&#x5230;&#x7684;&#x8A71;&#xFF0C;&#x90FD;&#x6703; fallback &#x53BB; <code>values-zh</code>&#x3002;&#x4F46;&#x5230; <code>TargetSDK&#xFF1D;25</code> &#x6642;&#xFF0C;&#x537B;&#x53EA;&#x6703; fallback &#x53BB; <code>values</code>&#xFF0C; &#x800C;&#x4E0D;&#x662F; <code>values-zh</code>&#x3002;&#x6240;&#x4EE5;&#x8981;&#x5728; Android 7.0 &#x986F;&#x793A;&#x6B63;&#x9AD4;&#x4E2D;&#x6587;&#xFF08;&#x9999;&#x6E2F;&#xFF09;&#x7684;&#x8A71;&#xFF0C;&#x9700;&#x5C07;&#x6587;&#x5B57;&#x653E;&#x5728; <code>values-zh-rHK</code> &#x6216; <code>values-zh-rTW</code> &#x4E0B;&#xFF01;</p>
<p>&#x6709;&#x8208;&#x8DA3;&#x4E86;&#x89E3;&#x591A;&#x4E00;&#x9EDE;&#x7684;&#x53EF;&#x770B;&#x770B;&#x4EE5;&#x4E0B; issues:</p>
<p><a href="https://code.google.com/p/android/issues/detail?id=211776">https://code.google.com/p/android/issues/detail?id=211776</a></p>
<p><a href="https://code.google.com/p/android/issues/detail?id=206865">https://code.google.com/p/android/issues/detail?id=206865</a></p>
<h2 id="appcompatv7">&#x79FB;&#x9664; appcompat-v7 &#x7684;&#x591A;&#x570B;&#x8A00;&#x554F;&#x984C;</h2>
<p>&#x53E6;&#x5916;&#xFF0C;&#x82E5;&#x4F60;&#x6709;&#x4F7F;&#x7528; appcompat-v7 &#x7684;&#x8A71; &#xFF08;&#x6211;&#x76F8;&#x4FE1;&#x5927;&#x90E8;&#x4EFD;&#x4EBA;&#x4E5F;&#x6709;&#xFF09;&#xFF0C;&#x800C;&#x4F60;&#x53C8;&#x53EA;&#x63D0;&#x4F9B;&#x5C11;&#x90E8;&#x4EFD;&#x7684;&#x8A9E;&#x8A00;&#x6A94;&#x7684;&#x8A71;&#xFF0C;&#x5EFA;&#x8B70;&#x5728; gradles &#x4E2D;&#x52A0;&#x5165; <code>resConfigs</code> &#x8A2D;&#x5B9A;&#xFF0C;&#x4EE5;&#x79FB;&#x8D70;&#x591A;&#x9918;&#x7684;&#x8A9E;&#x8A00;&#x6A94;&#x3002;&#x9019;&#x6A23;&#x53EF;&#x4EE5;&#x4EE4;&#x8A9E;&#x8A00; fallback &#x300C;&#x6B63;&#x5E38;&#x300D;&#x4E00;&#x9EDE;&#x3002;</p>
<p>&#x4F8B;&#x5982;&#x4EE5;&#x5B98;&#x65B9; doc &#x7684;&#x4F8B;&#x5B50;&#x70BA;&#x4F8B;&#xFF0C;&#x6B63;&#x5E38;&#x60C5;&#x6CC1;&#x4E0B;&#x6703;&#x662F;&#x9019;&#x6A23;&#xFF1A;</p>
<table>
<tr>
<th>User Settings</th>
<th>App Resources</th>
<th>Resource Resolution</th>
</tr>
<tr>
<td><ol>
<li> fr_CH</li>
</ol>
</td>
<td>
default (en)<br>
de_DE<br>
es_ES<br>
fr_FR<br>
it_IT<br>
</td>
<td>
Try fr_CH =&gt; Fail<br>
Try fr =&gt; Fail<br>
Try children of fr =&gt; fr_FR<br>
Use fr_FR
</td>
</tr>
</table>
<h2 id="appcompatv7">appcompat-v7 &#x7684;&#x591A;&#x8A9E;&#x8A00;&#x554F;&#x984C;</h2>
<p>&#x56E0;&#x70BA; appcompat-v7 &#x6709;&#x5305;&#x62EC;&#x4E16;&#x754C;&#x5404;&#x570B;&#x7684;&#x8A9E;&#x8A00;&#x6A94;&#xFF0C;&#x7D93; gradles &#x6253;&#x5305;&#x5F8C;&#xFF0C;&#x5728;&#x6700;&#x5F8C;&#x7684; apk &#x4E2D;&#x6703;&#x6709;&#x5404;&#x570B;&#x7684;&#x8A9E;&#x8A00;&#xFF08;&#x5305;&#x62EC; fr_CH)&#x3002;android &#x6703;&#x5230; <code>values-fr-CH</code> &#x627E; strings&#xFF0C;&#x4F46;&#x56E0;&#x70BA; <code>strings.xml</code> &#x88F9;&#x9762;&#x53EA;&#x6709; appcompat-v7 &#x7684;&#x5167;&#x5BB9;&#xFF0C;&#x800C;&#x6C92;&#x6709;&#x4F60;&#x7684; app &#x6240;&#x9700;&#x7684; string&#xFF0C; android &#x4FBF;&#x6703;&#x5230; <code>values</code> &#x4E2D;&#x627E;&#x5B57;&#x4E32;&#x4E86;&#x3002;</p>
<table>
<tr>
<th>User Settings</th>
<th>App Resources</th>
<th>Resource Resolution</th>
</tr>
<tr>
<td><ol>
<li> fr_CH</li>
</ol>
</td>
<td>
default (en)<br>
de_DE<br>
es_ES<br>
fr_FR<br>
it_IT<br>
</td>
<td>
Try fr_CH =&gt; OK, but string not found<br>
Use default
</td>
</tr>
</table>
<p>&#x4F7F;&#x7528; Android Studio &#x7684; Analyze APK &#x529F;&#x80FD; (Build &gt; Analyze APK)&#x5206;&#x6790; apk &#xFF0C;&#x53EF;&#x770B;&#x5230;&#x5728; <code>resources.arsc</code> &#x7684; strings type &#x5305;&#x542B;&#x5404;&#x5730;&#x8A9E;&#x8A00;&#x4F60;&#x6C92;&#x6709;&#x4F7F;&#x7528;&#x904E;&#x7684;&#x8A9E;&#x8A00;&#x6A94;&#x3002;</p>
<p>&#x8981;&#x79FB;&#x9664;&#x9019;&#x4E9B;&#x591A;&#x9918;&#x7684;&#x8A9E;&#x8A00;&#x8A2D;&#x5B9A;&#xFF0C;&#x53EF;&#x4EE5;&#x5728; gradles &#x4E2D;&#x52A0;&#x5165;&#xFF1A;</p>
<pre><code>defaultConfig{
    ....
    resConfigs &quot;en&quot;, &quot;zh-rHK&quot;
}
</code></pre>
<p>&#x9019;&#x6A23;&#xFF0C;&#x5728;&#x6700;&#x7D42;&#x751F;&#x6210;&#x7684; apk &#x4FBF;&#x6703;&#x53EA;&#x5269;&#x4E0B; <code>en</code> &#x548C; <code>zh-rHK</code> &#x7684;&#x8A9E;&#x8A00;&#x4E86;&#xFF0C;&#x4E0D;&#x6703;&#x5F15;&#x8D77;&#x300C;&#x4E0D;&#x77E5;&#x539F;&#x56E0;&#x300D; resolve &#x554F;&#x984C;&#x3002;</p>
<h3 id>&#x76F8;&#x95DC;&#x9023;&#x7D50;</h3>
<ul>
<li><a href="https://developer.android.com/guide/topics/resources/multilingual-support.html">&#x5B98;&#x65B9;&#x6587;&#x4EF6; Language and Locale</a></li>
<li><a href="https://code.google.com/p/android/issues/detail?id=223709">[Android N Multilingual Support] Applications still show default (EN) strings even if a secondary language is supported </a></li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[2016下半年讀書]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x5077;&#x61F6;&#x3002;</p>
<hr>
<h2 id="stillalicelisagenova">&#x300A;Still Alice&#x300B; - Lisa Genova</h2>
<p>&#x63CF;&#x8FF0;&#x60A3;&#x6709; alzheimer&apos;s disease &#x7684;&#x60C5;&#x6CC1;&#xFF0C;&#x5F9E;&#x60A3;&#x8005;&#x7684;&#x89D2;&#x5EA6;&#x770B;&#x4E16;&#x754C;&#x3002;<br>
&#x4EE5;&#x70BA;&#x6703;&#x63CF;&#x8FF0;&#x56E0;&#x75C5;&#x8DDF;&#x5BB6;&#x4EBA;&#x95DC;&#x4FC2;&#x597D;&#x8F49;&#x4E4B;&#x985E;&#xFF0C;&#x96D6;</p>]]></description><link>https://sparks-blog2.fly.dev/book-read-in-second-half-2016/</link><guid isPermaLink="false">6344c7bf02c13c0211c7d2d6</guid><category><![CDATA[一星期一書]]></category><dc:creator><![CDATA[Ryan Leung]]></dc:creator><pubDate>Wed, 22 Feb 2017 02:08:38 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x5077;&#x61F6;&#x3002;</p>
<hr>
<h2 id="stillalicelisagenova">&#x300A;Still Alice&#x300B; - Lisa Genova</h2>
<p>&#x63CF;&#x8FF0;&#x60A3;&#x6709; alzheimer&apos;s disease &#x7684;&#x60C5;&#x6CC1;&#xFF0C;&#x5F9E;&#x60A3;&#x8005;&#x7684;&#x89D2;&#x5EA6;&#x770B;&#x4E16;&#x754C;&#x3002;<br>
&#x4EE5;&#x70BA;&#x6703;&#x63CF;&#x8FF0;&#x56E0;&#x75C5;&#x8DDF;&#x5BB6;&#x4EBA;&#x95DC;&#x4FC2;&#x597D;&#x8F49;&#x4E4B;&#x985E;&#xFF0C;&#x96D6;&#x7136;&#x5B83;&#x4E5F;&#x6709;&#xFF0C;&#x4F46;&#x5F88;&#x9593;&#x63A5;&#xFF0C;&#x7B97;&#x662F;&#x504F;&#x5411;&#x73FE;&#x5BE6;&#x98A8;&#x683C;&#x3001;&#x4E0D;&#x505A;&#x4F5C;&#x7684;&#x4F5C;&#x54C1;&#x3002;</p>
<h2 id="factorygirlsleslietchang">&#x300A;Factory Girls&#x300B; - Leslie T. Chang</h2>
<p>&#x4E5D;&#x5341;&#x5E74;&#x4EE3;&#x7684;&#x6771;&#x839E;&#x5DE5;&#x5EE0;&#x5973;&#x5DE5;&#x7684;&#x63A1;&#x8A2A;&#x3002;</p>
<p>&#x5728;&#x5DE5;&#x5EE0;&#x5DE5;&#x4F5C;&#x7684;&#x5DE5;&#x4EBA;&#xFF0C;&#x5979;&#x5011;&#x7684;&#x751F;&#x6D3B;&#x662F;&#x600E;&#x6A23;&#x5462;&#xFF1F;&#x5979;&#x5011;&#x5C0D;&#x751F;&#x6D3B;&#x3001;&#x5C0D;&#x7570;&#x6027;&#x3001;&#x5C0D;&#x793E;&#x6703;&#x3001;&#x5C0D;&#x6559;&#x80B2;&#x6709;&#x4EC0;&#x9EBC;&#x8FFD;&#x6C42;&#xFF1F;</p>
<p>&#x4E3B;&#x8981;&#x8FFD;&#x8E2A;&#x7576;&#x4E2D;&#x5169;&#x4F4D;&#x5973;&#x5DE5;&#xFF0C;&#x5979;&#x5011;&#x7684;&#x7D93;&#x6B77;&#xFF0C;&#x5982;&#x4F55;&#x9760;&#x300C;&#x9A19;&#x300D;&#x627E;&#x5DE5;&#x4F5C;&#x3001;&#x6649;&#x5347;&#x7B49;&#x3002;&#x5DE5;&#x5EE0;&#x7684;&#x74B0;&#x5883;&#x3001;&#x85AA;&#x916C;&#x3001;&#x5F85;&#x9047;&#x3002;<br>
&#x5DE5;&#x4EBA;&#x5916;&#x51FA;&#x5DE5;&#x4F5C;&#x5C0D;&#x6545;&#x9109;&#x5BB6;&#x5EAD;&#x7684;&#x5F71;&#x97FF;</p>
<p>&#x7576;&#x4E2D;&#x6709;&#x5169;&#x7BC7;&#x8AC7;&#x4F5C;&#x8005;&#x81EA;&#x5DF1;&#x5BB6;&#x65CF;&#x7684;&#x51FA;&#x8EAB;&#xFF0C;&#x6253;&#x7B97;&#x5C07;&#x4EE5;&#x524D;&#x7956;&#x7236;&#x96E2;&#x9109;&#x5225;&#x4E95;&#x7684;&#x60C5;&#x6CC1;&#x5957;&#x56DE;&#x73FE;&#x4EE3;&#x6C11;&#x5DE5;&#x7684;&#x8EAB;&#x4E0A;&#xFF0C;&#x4F46;&#x6548;&#x679C;&#x5F88;&#x52C9;&#x5F37;&#x3002;&#x770B;&#x4E86;&#x5176;&#x4E2D;&#x4E00;&#x7BC7;&#xFF0C;&#x5916;&#x570B;&#x4EBA;&#x53EF;&#x80FD;&#x6703;&#x5F88;&#x611F;&#x8208;&#x8DA3;&#xFF0C;&#x4F46;&#x5C0D;&#x9999;&#x6E2F;&#x6216;&#x4E2D;&#x570B;&#x4EBA;&#x4F86;&#x8AAA;&#xFF0C;&#x6C92;&#x4EC0;&#x9EBC;&#x7279;&#x5225;&#xFF0C;&#x53CD;&#x800C;&#x8DDF;&#x4E3B;&#x984C; Factory Girl &#x4E0D;&#x7B26;&#xFF0C;&#x611F;&#x89BA;&#x5F88;&#x60B6;&#xFF0C;&#x53E6;&#x4E00;&#x7BC7;&#x5C31;&#x6C92;&#x6709;&#x770B;&#x4E86;&#x3002;</p>
<h2 id>&#x300A;&#x770B;&#x898B;&#x300B; - &#x67F4;&#x975C;</h2>
<p>&#x7B97;&#x662F;&#x67F4;&#x975C;&#x7684;&#x56DE;&#x61B6;&#x9304;&#xFF1F;</p>
<p>&#x4F69;&#x670D;&#x65B0;&#x805E;&#x5DE5;&#x4F5C;&#x8005;&#xFF0C;&#x7279;&#x5225;&#x662F;&#x5728;&#x4E2D;&#x570B;&#x5927;&#x9678;&#x5DE5;&#x4F5C;&#x7684;&#x65B0;&#x805E;&#x4EBA;&#x54E1;&#x3002;&#x4ED6;&#x5011;&#x6371;&#x66F4;&#x62B5;&#x591C;&#x70BA;&#x4E00;&#x500B;&#x7BC0;&#x76EE;&#xFF0C;&#x4F46;&#x6700;&#x5F8C;&#x53EF;&#x80FD;&#x4EC0;&#x9EBC;&#x4E5F;&#x62CD;&#x4E0D;&#x4E86;&#xFF0C;&#x53C8;&#x6216;&#x62CD;&#x6210;&#xFF0C;&#x4F46;&#x4E0D;&#x80FD;&#x63A8;&#x51FA;&#x3002;</p>
<p>&#x4E00;&#x5B9A;&#x662F;&#x6709;&#x717D;&#x60C5;&#x6210;&#x4EFD;&#x3002;&#x4F5C;&#x8005;&#x4E5F;&#x5927;&#x65B9;&#x627F;&#x8A8D;&#xFF0C;&#x4F46;&#x4EE4;&#x4EBA;&#x8F03;&#x4E86;&#x89E3;&#x7576;&#x7BC0;&#x76EE;&#x4E3B;&#x6301;&#x7684;&#x5FC3;&#x614B;&#x3002;</p>
<h2 id>&#x300A;&#x4EE4;&#x4EBA;&#x6026;&#x7136;&#x5FC3;&#x52D5;&#x7684;&#x4EBA;&#x751F;&#x6574;&#x7406;&#x9B54;&#x6CD5;&#x300B;- &#x9EBB;&#x7406;&#x60E0;</h2>
<p>&#x6574;&#x7406;&#x66F8;&#x85C9;&#x3002;&#x975E;&#x5E38;&#x51FA;&#x540D;&#x7684;&#x4E00;&#x672C;&#x66F8;&#x3002;&#x4E0D;&#x904E;&#x6211;&#x7C21;&#x55AE;&#x7684;&#x5FEB;&#x8B80;&#x4E00;&#x6B21;&#x5C31;&#x7B97;&#x4E86;&#x3002;</p>
<p>&#x91CD;&#x9EDE;&#xFF1A;&#x4E0D;&#x8981;&#x6BCF;&#x5929;&#x6574;&#x7406;&#x5C0F;&#x5C0F;&#xFF0C;&#x800C;&#x662F;&#x50CF;&#x7BC0;&#x6176;&#x822C;&#xFF0C;&#x4E00;&#x6B21;&#x904E;&#x5C07;&#x540C;&#x4E00;&#x985E;&#x578B;&#x7684;&#x6771;&#x897F;&#x5012;&#x5728;&#x4E00;&#x8D77;&#xFF0C;&#x53BB;&#x6574;&#x7406;&#x3002;</p>
<h2 id="neverwhereneilgaiman">&#x300A;Neverwhere&#x300B;- Neil Gaiman</h2>
<p>London Underground&#xFF0C;&#x662F; London &#x5E95;&#x4E0B;&#x7684;&#x53E6;&#x4E00;&#x5947;&#x5E7B;&#x4E16;&#x754C;&#x3002;&#x751F;&#x6D3B;&#x65BC;&#x7576;&#x4E2D;&#x7684;&#x4EBA;&#x548C;&#x7269;&#xFF0C;&#x8207;&#x666E;&#x901A;&#x4EBA;&#x6C92;&#x6709;&#x4EA4;&#x96DC;&#x3002;&#x4E3B;&#x89D2;&#x672C;&#x4F86;&#x662F;&#x666E;&#x901A;&#x4EBA;&#x4E00;&#x500B;&#xFF0C;&#x56E0;&#x6551;&#x4E86;&#x4E00;&#x5973;&#x5B50;&#x800C;&#x88AB;&#x626F;&#x5165; Underground &#x4E16;&#x754C;&#x3002;</p>
<p>&#x6545;&#x4E8B;&#x662F;&#x4E00;&#x500B;&#x666E;&#x901A;&#x7684;&#x5192;&#x96AA;&#x6545;&#x4E8B;&#xFF0C;&#x6C23;&#x6C1B;&#x71DF;&#x9020;&#x4E0D;&#x932F;&#xFF0C;&#x5287;&#x60C5;&#x6709;&#x9EDE;&#x8D77;&#x4F0F;&#xFF0C;&#x4E0D;&#x904E;&#x60C5;&#x7BC0;&#x6709;&#x9EDE;&#x7C21;&#x55AE;&#xFF0C;&#x61C9;&#x8A72;&#x7B97;&#x662F;&#x5152;&#x7AE5;&#x8B80;&#x7269;&#x3002;&#x4F46;&#x8001;&#x5BE6;&#x8AAA;&#x6211;&#x9817;&#x4EAB;&#x53D7;&#x95B1;&#x8B80;&#x6B64;&#x66F8;&#x3002;</p>
<h2 id="predictablyirrationalitydanariely">&#x300A;Predictably Irrationality&#x300B; - Dan Ariely</h2>
<p>&#x4EBA;&#x662F;&#x7406;&#x6027;&#x7684;&#xFF1F;&#x6B64;&#x66F8;&#x900F;&#x904E;&#x4E0D;&#x540C;&#x7684;&#x5BE6;&#x9A57;&#x544A;&#x8A34;&#x4F60;&#xFF0C;&#x6839;&#x672C;&#x4E0D;&#x662F;&#x9019;&#x6A23;&#x7684;&#x4E00;&#x56DE;&#x4E8B;&#x3002;</p>
<h2 id="110">&#x300A;&#x6B66;&#x9053;&#x72C2;&#x8005;&#x4E4B;&#x8A69;&#x300B;&#x5377; 1 - 10 - &#x55AC;&#x9756;&#x592B;</h2>
<p>&#x6B66;&#x7576;&#x6D3E;&#x8981;&#x9054;&#x6210;&#x5929;&#x4E0B;&#x7121;&#x6575;&#xFF0C;&#x6D3E;&#x4EBA;&#x56DB;&#x8655;&#x6EC5;&#x9580;&#x6EC5;&#x6D3E;&#xFF0C;&#x800C;&#x4ED6;&#x5011;&#x4E0D;&#x662F;&#x70BA;&#x6B0A;&#xFF0C;&#x5168;&#x56E0;&#x5C0D;&#x6B66;&#x9053;&#x7684;&#x75F4;&#x72C2;&#x3002;</p>
<p>&#x6709;&#x5225;&#x65BC;&#x4EE5;&#x5F80;&#x6709;&#x5982; superhero &#x7684;&#x6B66;&#x4FE0;&#x5C0F;&#x8AAA;&#xFF0C;&#x4ECA;&#x6B21;&#x7684;&#x662F;&#x8F03;&#x70BA;&#x300C;&#x73FE;&#x5BE6;&#x300D;&#x7684;&#x6B66;&#x4FE0;&#x3002;&#x89D2;&#x8272;&#x6C92;&#x6709;&#x5167;&#x529F;&#x4E4B;&#x985E;&#xFF0C;&#x4E00;&#x5207;&#x7684;&#x529B;&#x91CF;&#x90FD;&#x662F;&#x6E90;&#x81EA;&#x81EA;&#x8EAB;&#x808C;&#x8089;&#x7684;&#x904B;&#x7528;&#x3001;&#x5354;&#x8ABF;&#x548C;&#x5E73;&#x8861;&#x3002;&#x9019;&#x5957;&#x53EF;&#x80FD;&#x662F;&#x6700;&#x771F;&#x5BE6;&#x7684;&#x6B66;&#x4FE0;&#x5C0F;&#x8AAA;&#x3002;</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[為何今年不寫 iReserver]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x5F9E; iPhone 4S &#x958B;&#x59CB;&#x63A5;&#x89F8; iPhone Bot &#x7092;&#x8CE3;&#x904A;&#x6232;&#xFF0C;&#x5230; iPhone 6 &#x958B;&#x59CB;&#x63A8;&#x51FA; iReserver&#xFF0C;&#x4E5F;&#x7B97;&#x73A9;&#x4E86;&#x4E94;&#x5E74;&#x3002;&#x4F46;&#x4ECA;&#x5E74;&#x6211;&#x537B;&#x6C92;&#x6709;&#x7E7C;&#x7E8C;&#x53C3;&#x8207; iPhone &#x9019;&#x7AF6;&#x722D;&#x904A;&#x6232;&#x4E86;&#x3002;</p>
<h2 id>&#x5FD9;</h2>]]></description><link>https://sparks-blog2.fly.dev/why-i-did-not-play-iphone7-reserve/</link><guid isPermaLink="false">6344c7bf02c13c0211c7d2d5</guid><category><![CDATA[iReserve]]></category><category><![CDATA[iReserver]]></category><category><![CDATA[iPhone]]></category><dc:creator><![CDATA[Ryan Leung]]></dc:creator><pubDate>Fri, 14 Oct 2016 04:08:46 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x5F9E; iPhone 4S &#x958B;&#x59CB;&#x63A5;&#x89F8; iPhone Bot &#x7092;&#x8CE3;&#x904A;&#x6232;&#xFF0C;&#x5230; iPhone 6 &#x958B;&#x59CB;&#x63A8;&#x51FA; iReserver&#xFF0C;&#x4E5F;&#x7B97;&#x73A9;&#x4E86;&#x4E94;&#x5E74;&#x3002;&#x4F46;&#x4ECA;&#x5E74;&#x6211;&#x537B;&#x6C92;&#x6709;&#x7E7C;&#x7E8C;&#x53C3;&#x8207; iPhone &#x9019;&#x7AF6;&#x722D;&#x904A;&#x6232;&#x4E86;&#x3002;</p>
<h2 id>&#x5FD9;</h2>
<p>&#x56E0;&#x70BA;&#x516C;&#x79C1;&#x90FD;&#x5F88;&#x5FD9;&#xFF0C;&#x6C92;&#x7A7A;&#x9592;&#x6642;&#x9593;&#x53BB;&#x7814;&#x7A76;&#xFF0C;&#x518D;&#x4F5C;&#x6BCF;&#x5929;&#x66F4;&#x65B0;&#x3002;&#x6700;&#x6158;&#x662F;&#x82B1;&#x6642;&#x9593;&#x7814;&#x7A76;&#x5F8C;&#xFF0C;&#x904E;&#x5169;&#x5929; Apple &#x7D66;&#x4F60;&#x63A8;&#x5012;&#x91CD;&#x4F86;&#xFF0C;&#x5BE6;&#x5728;&#x4EE4;&#x4EBA;&#x6C23;&#x9912;&#x3002;</p>
<p>&#x800C;&#x6700;&#x82B1;&#x6642;&#x9593;&#x7684;&#xFF0C;&#x662F;&#x505A;&#x552E;&#x5F8C;&#x670D;&#x52D9;&#xFF0C;&#x89E3;&#x7B54; iReserver &#x4F7F;&#x7528;&#x8005;&#x7684;&#x554F;&#x984C;&#x3002;&#x8981;&#x56DE;&#x7B54;&#x300C;&#x5783;&#x573E; App, &#x57FA;&#x672C;&#x8A02;&#x4E0D;&#x5230;&#x300D;&#x9019;&#x4E9B;&#x554F;&#x984C;&#x6642;&#xFF0C;&#x624D;&#x662F;&#x6700;&#x8F9B;&#x82E6;&#x548C;&#x6D88;&#x78E8;&#x610F;&#x5FD7;&#x7684;&#x3002;</p>
<h2 id>&#x96D9;&#x62F3;&#x96E3;&#x6575;&#x56DB;&#x624B;</h2>
<p>&#x4E0A;&#x5E74;&#x958B;&#x59CB;&#x5DF2;&#x7D93;&#x662F;&#x5468;&#x8857; bot &#x7684;&#x4E16;&#x4EE3;&#xFF0C;&#x4ECA;&#x5E74;&#x66F4;&#x52A0;&#x4E0D;&#x7528;&#x63D0;&#x3002;&#x6210;&#x529F;&#x8207;&#x5426;&#x5DF2;&#x7D93;&#x4E0D;&#x662F;&#x7528;&#x300C;&#x79D2;&#x300D;&#x4F86;&#x8A08;&#x7B97;&#xFF0C;&#x800C;&#x662F;&#x7528;&#x300C;&#x6BEB;&#x79D2;&#x300D;&#x4E86;&#x3002;&#x4F60;&#x4E0D;&#x7528;&#x6578;&#x5341;&#x751A;&#x81F3;&#x904E;&#x767E;&#x7684; bot &#x540C;&#x6642;&#x904B;&#x884C;&#x7684;&#x8A71;&#xFF0C;&#x6839;&#x672C;&#x4E0D;&#x80FD;&#x4FDD;&#x8B49;&#x6436;&#x5230;&#x7684;&#x3002;</p>
<p>Apple Reservation &#x80CC;&#x5F8C;&#x7684;&#x904B;&#x4F5C;&#x53C8;&#x6709;&#x8AF8;&#x591A;&#x4E0D;&#x5408;&#x5E38;&#x7406;&#x7684;&#x5730;&#x65B9;&#xFF0C;&#x5F88;&#x591A;&#x8B8A;&#x6578;&#x3002;&#x4EE5;SMS &#x70BA;&#x4F8B;&#xFF0C;&#x6709;&#x6642;&#x53EF;&#x4EE5;&#x79D2;&#x56DE;&#xFF0C;&#x6709;&#x6642;&#x5341;&#x591A;&#x4E8C;&#x5341;&#x5206;&#x9418;&#x4E5F;&#x6C92;&#x6709;&#x53CD;&#x61C9;&#x3002;&#x53C8;&#x4EE5;&#x5B58;&#x8CA8;&#x70BA;&#x4F8B;&#xFF0C;&#x6709;&#x6642;8:00:00 &#x51FA;&#x8CA8;&#xFF0C;&#x6709;&#x6642;&#x537B;&#x6709;&#x4E00;&#x5169;&#x5206;&#x9418;&#x5F8C;&#x624D;&#x653E;&#x3002;</p>
<p>&#x6BCF;&#x5929;&#x57FA;&#x672C;&#x4E0A;&#x53EA;&#x6709;&#x65E9;&#x4E0A;&#x4E00;&#x6B21;&#x6A5F;&#x6703;&#x3002;&#x82E5;&#x6709;&#x4EFB;&#x4F55;&#x9583;&#x5931;&#xFF0C;&#x5373;&#x4E00;&#x5B9A;&#x98DF;&#x767D;&#x679C;&#x3002;</p>
<p>&#x4F46;&#x8981;&#x6E96;&#x5099;&#x5E7E;&#x5341;&#x90E8;&#x96FB;&#x8A71;&#x5E7E;&#x5341;&#x689D;&#x9023;&#x7DDA;&#xFF0C;&#x5C0D;&#x4E00;&#x822C;&#x4EBA;&#x4F86;&#x8AAA;&#x5BE6;&#x5728;&#x4E0D;&#x5BB9;&#x6613;&#x3002;&#x800C;&#x6436;&#x4E0D;&#x5230;&#x7684;&#x8A71;&#xFF0C;&#x53C8;&#x6703;&#x7D66;&#x4EBA;&#x52A3;&#x8A55;&#x3002;</p>
<h2 id>&#x521D;&#x8877;</h2>
<p>&#x7576;&#x521D;&#x5BEB; iReserver &#x9664;&#x4E86;&#x60F3;&#x8CFA;&#x5916;&#x5FEB;&#x5916;&#xFF0C;&#x4E5F;&#x80FD;&#x900F;&#x904E;&#x6B64;&#x300C;&#x904A;&#x6232;&#x300D;&#x5B78;&#x7FD2;&#x4E0D;&#x540C;&#x7684;&#x6280;&#x8853; (multi-threading on Android, OCR, etc)&#x3002;&#x5728;&#x5BEB;&#x4E86;&#x5E7E;&#x4EE3;&#x5F8C;&#xFF0C;&#x73FE;&#x5728;&#x73A9;&#x6B64;&#x904A;&#x6232;&#x53EA;&#x5269;&#x8CFA;&#x9322;&#xFF0C;&#x800C;&#x4E14;&#x662F;&#x8F9B;&#x82E6;&#x9322;&#x3002;&#x5C31;&#x7B97;&#x6210;&#x529F;&#x9810;&#x8A02;&#x80FD;&#x7372;&#x5F97;&#x6EFF;&#x8DB3;&#x611F;&#xFF0C;&#x4F46;&#x4E5F;&#x4E0D;&#x8DB3;&#x4EE5;&#x652F;&#x6301;&#x4E0B;&#x53BB;&#x3002;</p>
<hr>
<p>&#x4E0B;&#x5E74;&#x4E5F;&#x672A;&#x5FC5;&#x6703;&#x73A9;&#x3002;&#x5C31;&#x7B97;&#x6703;&#x73A9;&#xFF0C;&#x4E5F;&#x4E0D;&#x6703;&#x51FA; App&#xFF0C;&#x800C;&#x662F;&#x505A;&#x4E2D;&#x4ECB;&#xFF0C;&#x8A02;&#x5230;&#x518D;&#x6536;&#x9322;&#x7B97;&#x4E86;&#x3002;&#x7562;&#x7ADF;&#x8981;&#x61C9;&#x4ED8;&#x7121;&#x77E5;&#x7684;&#x5BA2;&#x6236;&#x5BE6;&#x5728;&#x662F;&#x5F88;&#x7D2F;&#x4EBA;&#x3002;</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Parcelable 幫手]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x5728; Android &#xFF0C;&#x8981;&#x5C07; object &#x7531; <code>Activities</code> &#x6216; <code>services</code> &#x4E4B;&#x9593;&#x50B3;&#x9001;&#xFF0C;&#x5FC5;&#x9808;&#x5C07;&#x5176;&#x653E;&#x9032; <code>intent</code> &#x4E2D;&#x3002;&#x9664;&#x4E86; primitive types &#x5916;&#xFF0C;object &#x5FC5;&#x9808; implement <code>Parcelable</code> &#x624D;&#x80FD;&#x653E;&#x5728; <code>intent</code>&#x3002;Implement <code>Parcelable</code>&#xFF0C;&#x4E0D;&#x662F;&#x96E3;&#xFF0C;&#x800C;&#x662F;</p>]]></description><link>https://sparks-blog2.fly.dev/parcelable-helper/</link><guid isPermaLink="false">6344c7bf02c13c0211c7d2d4</guid><category><![CDATA[android dev]]></category><category><![CDATA[android libraries 推介]]></category><dc:creator><![CDATA[Ryan Leung]]></dc:creator><pubDate>Wed, 27 Jul 2016 02:32:09 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x5728; Android &#xFF0C;&#x8981;&#x5C07; object &#x7531; <code>Activities</code> &#x6216; <code>services</code> &#x4E4B;&#x9593;&#x50B3;&#x9001;&#xFF0C;&#x5FC5;&#x9808;&#x5C07;&#x5176;&#x653E;&#x9032; <code>intent</code> &#x4E2D;&#x3002;&#x9664;&#x4E86; primitive types &#x5916;&#xFF0C;object &#x5FC5;&#x9808; implement <code>Parcelable</code> &#x624D;&#x80FD;&#x653E;&#x5728; <code>intent</code>&#x3002;Implement <code>Parcelable</code>&#xFF0C;&#x4E0D;&#x662F;&#x96E3;&#xFF0C;&#x800C;&#x662F;&#x9EBB;&#x7169;&#xFF0C;&#x4F8B;&#x5982;&#x4EE5;&#x4E0B;&#x7684; <code>Foo</code> Class:</p>
<pre><code>public class Foo {
    private String myString;
    private int myInt;

    public Foo() {
    }
}
</code></pre>
<p>&#x8B8A;&#x6210; <code>Parcelable</code> &#x7684;&#x8A71;:</p>
<pre><code>public class Foo implements Parcelable {
    private String myString;
    private int myInt;

    public Foo() {
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(this.myString);
        dest.writeInt(this.myInt);
    }

    protected Foo(Parcel in) {
        this.myString = in.readString();
        this.myInt = in.readInt();
    }

    public static final Parcelable.Creator&lt;Foo&gt; CREATOR = new Parcelable.Creator&lt;Foo&gt;() {
        @Override
        public Foo createFromParcel(Parcel source) {
            return new Foo(source);
        }

        @Override
        public Foo[] newArray(int size) {
            return new Foo[size];
        }
    };
}
</code></pre>
<p>&#x591A;&#x4E86;&#x5169;&#x500B; methods&#x3001;&#x4E00;&#x500B; constructor&#x548C;&#x4E00;&#x500B; static variable&#x3002;&#x5927;&#x90E8;&#x4EFD;&#x90FD;&#x662F; boilerplate code&#x3002;&#x7576;&#x4F60;&#x6709;&#x6578;&#x5341;&#x500B; object &#x8981;&#x9019;&#x6A23;&#x505A;&#x7684;&#x8A71;&#xFF0C;&#x8981;&#x5BEB;&#x9019;&#x4E9B;&#x771F;&#x7684;&#x4EE4;&#x4EBA;&#x89BA;&#x5F97;&#x7169;&#x53AD;&#x3002;&#x82E5;&#x8981;&#x52A0;&#x6E1B; field&#xFF0C;&#x9084;&#x8981;&#x56E0;&#x61C9;&#x6B21;&#x5E8F;&#x4FEE;&#x6539; <code>writeToParcel()</code> &#x548C; constructor &#x3002;&#x6BD4;&#x8D77; getter &amp; setter &#x66F4;&#x9EBB;&#x7169;&#x554A;&#x3002;</p>
<p>&#x5E78;&#x597D;&#xFF0C;&#x9019;&#x4E9B;&#x91CD;&#x8986;&#x6027;&#x7684; code &#x4E00;&#x5B9A;&#x6703;&#x6709;&#x6709;&#x5FC3;&#x4EBA;&#x5BEB;&#x7A0B;&#x5F0F;&#x65B9;&#x4FBF;&#x4EBA;&#x6C11;&#xFF01;&#x4E16;&#x754C;&#x5927;&#x540C;&#x842C;&#x6B73;&#xFF01;</p>
<h2 id="serializeable">&#x65B9;&#x6CD5;&#x4E00;&#xFF1A;&#x4F7F;&#x7528; Serializeable</h2>
<p>&#x4F60;&#x53EF;&#x4EE5; implement <code>Serializeable</code>&#xFF0C;&#x7136;&#x5F8C;&#x4F7F;&#x7528; <code>intent.putExtra(String name, Serializable serializable)</code>&#x3002;&#x9019;&#x662F;&#x6700;&#x7C21;&#x55AE;&#x7684;&#x505A;&#x6CD5;&#xFF0C;&#x4E0D;&#x9700;&#x984D;&#x5916; coding &#x6216; library&#x3002;&#x6709;&#x6642;&#x61F6;&#x8D77;&#x4F86;&#x6216;&#x60F3;&#x5FEB;&#x901F; proof of concept&#xFF0C;&#x6211;&#x4E5F;&#x6703;&#x9019;&#x6A23;&#x505A;&#x3002;</p>
<p>&#x4F46;&#x662F;&#xFF0C;&#x9019;&#x505A;&#x6CD5;&#x6709;&#x4E00;&#x91CD;&#x5927;&#x7F3A;&#x9EDE;&#xFF0C;&#x5C31;&#x662F;&#x901F;&#x5EA6;&#x975E;&#x5E38;&#x6162;&#x3002;&#x6709;&#x8208;&#x8DA3;&#x7684;&#x53EF;&#x53C3;&#x8003;&#x5225;&#x4EBA;&#x7684;<a href="http://www.developerphil.com/parcelable-vs-serializable/">&#x6BD4;&#x8F03;&#x7D50;&#x679C;</a>&#x3002;&#x7E3D;&#x4E4B;&#xFF0C;&#x4E0D;&#x5EFA;&#x8B70;&#x5728; production code &#x4E0A;&#x9019;&#x6A23;&#x5BEB;&#xFF0C;&#x5225;&#x505A;&#x58DE;&#x624B;&#x52E2;&#x554A;&#x3002;</p>
<h2 id="webparcelablercom">&#x65B9;&#x6CD5;&#x4E8C;&#xFF1A;&#x4F7F;&#x7528; Web - Parcelabler.com</h2>
<p><img src="https://sparks-blog2.fly.dev/content/images/2016/07/parcelabler.jpg" alt="Parcelabler.com Screenshot" loading="lazy"></p>
<p>&#x53EF;&#x5230; <a href="http://parcelabler.com/">http://parcelabler.com/</a>&#xFF0C; &#x5C07; class &#x8CBC;&#x4E0A;&#x53BB;&#xFF0C;&#x80FD;&#x81EA;&#x52D5;&#x8F49;&#x63DB;&#x70BA; <code>Parcelable</code>&#x3002;&#x8CBC;&#x4E0A;&#x7684; class &#x4E0D;&#x9700;&#x5B8C;&#x6574;&#xFF0C;&#x53EA;&#x9700;&#x6709; class &#x540D;&#x548C; field &#x540D;&#x5373;&#x8DB3;&#x5920;&#x3002;</p>
<h2 id="pluginandroidparcelablecodegenerator">&#x65B9;&#x6CD5;&#x4E09;&#xFF1A;&#x4F7F;&#x7528; Plugin - Android Parcelable Code Generator</h2>
<p>&#x82E5;&#x89BA;&#x5F97;&#x4F7F;&#x7528; web &#x4E0D;&#x5920;&#x5FEB;&#x6377;&#xFF0C;&#x4E5F;&#x53EF;&#x4F7F;&#x7528; IntelliJ IDEA/Android Studio &#x7684; plugin:</p>
<ol>
<li>&#x958B;&#x555F; IntelliJ IDEA/Android Studio</li>
<li>&#x5230; Settings &gt; Plugin</li>
<li>&#x627E;&#x5C0B; &quot;Android Parcelable Code Generator&quot;</li>
<li>&#x5B89;&#x88DD;&#x4E26;&#x91CD;&#x555F; IDE</li>
</ol>
<p>&#x5B89;&#x88DD;&#x5B8C;&#x6210;&#x5F8C;&#xFF0C;&#x958B;&#x555F;&#x60F3;&#x8B8A;&#x6210; Parcelable &#x7684; file &#xFF0C;&#x5982; <code>Foo.java</code>&#xFF0C;&#x9EDE;&#x9078; Menu &gt; Code &gt; Generate&#xFF0C;&#x9078; &quot;Parcelable&quot; &#x4FBF;&#x6703;&#x81EA;&#x52D5;&#x751F;&#x6210;&#x5C0D;&#x61C9;&#x7684; methods&#xFF0C;&#x975E;&#x5E38;&#x65B9;&#x4FBF;&#x3002;</p>
<p>&#x9019;&#x500B; plugin &#x7684;&#x4F5C;&#x8005;&#x5C31;&#x662F; parcelabler.com &#x7684;&#x9054;&#x4EBA;&#xFF0C;&#x6709;&#x795E;&#x5FEB;&#x62DC;&#x554A;&#xFF01;</p>
<h2 id="libraryautoparcel">&#x65B9;&#x6CD5;&#x56DB;&#xFF1A;&#x4F7F;&#x7528; library - AutoParcel</h2>
<p>&#x5982;&#x679C;&#x4E0D;&#x60F3;&#x81EA;&#x5DF1;&#x624B;&#x52D5;&#x57F7;&#x884C; plugin &#x7684;&#x8A71;&#xFF0C;&#x4E5F;&#x53EF;&#x4F7F;&#x7528; <code>AutoParcel</code> &#x9019; library&#xFF0C;&#x900F;&#x904E; android-apt &#x53BB;&#x81EA;&#x52D5;&#x751F;&#x6210;&#x652F;&#x63F4; <code>Parcelabe</code> &#x7684; class &#x3002;</p>
<blockquote>
<p><a href="https://github.com/frankiesardo/auto-parcel">https://github.com/frankiesardo/auto-parcel</a></p>
</blockquote>
<p>&#x8981;&#x7528;&#x6B64; library&#xFF0C;&#x5FC5;&#x9808;&#x5728; gradle &#x7684; <code>dependencies</code> &#x548C; <code>apply plugin</code> &#x8A2D;&#x5B9A;&#x8F09;&#x5165; android-apt&#xFF1A;</p>
<pre><code>buildscript {
  repositories {
    mavenCentral()
    jcenter()
  }
  dependencies {
    classpath &apos;com.android.tools.build:gradle:1.0.0&apos;
    classpath &apos;com.neenbedankt.gradle.plugins:android-apt:1.4&apos;
  }
}

apply plugin: &apos;com.android.application&apos;
apply plugin: &apos;com.neenbedankt.android-apt&apos;

repositories {
  mavenCentral()
  jcenter()
  maven {url &quot;https://clojars.org/repo/&quot;}
}

dependencies {
  apt &apos;frankiesardo:auto-parcel:{{latest-version}}&apos;
}
</code></pre>
<p>&#x7136;&#x5F8C;&#x4FBF;&#x53EF;&#x4EE5;&#x5C07; class &#x5BEB;&#x6210;&#x4EE5;&#x4E0B;&#x683C;&#x5F0F;&#xFF0C;&#x52A0;&#x4E0A; <code>@AutoValue</code>&#xFF1A;</p>
<pre><code>@AutoValue
abstract class Person implements Parcelable {
  abstract String name();
  abstract List&lt;Address&gt; addresses();
  abstract Map&lt;Person, Integer&gt; likes();

  static Person create(String name, List&lt;Address&gt; addresses, Map&lt;Person, Integer&gt; likes) {
    return new AutoValue_Person(name, addresses, likes);
  }
}
</code></pre>
<p>&#x4E4B;&#x5F8C;&#x4FBF;&#x53EF;&#x76F4;&#x63A5;&#x4F7F;&#x7528;&#x8A72; object&#x3002;&#x5C31;&#x7B97;&#x4E4B;&#x5F8C;&#x6709;&#x4EFB;&#x4F55;&#x6539;&#x52D5;&#xFF0C;&#x4E5F;&#x4E0D;&#x9700;&#x50CF;&#x4F7F;&#x7528; plugin &#x822C;&#x8981;&#x4EBA;&#x624B;&#x518D; generate source code&#xFF0C;android-apt &#x6703;&#x81EA;&#x52D5;&#x5E6B;&#x4F60;&#x5F04;&#x59A5;&#xFF0C;&#x66F4;&#x662F;&#x76F4;&#x63A5;&#x65B9;&#x4FBF;&#x3002;</p>
<h2 id>&#x7D50;&#x8A9E;</h2>
<p>&#x6211;&#x81EA;&#x5DF1;&#x662F;&#x4F7F;&#x7528; plugin &#x53BB;&#x505A;&#x7684;&#xFF0C;&#x4E0B;&#x500B; project &#x6703;&#x8A66;&#x7528; <code>AutoParcel</code>&#xFF0C;&#x7562;&#x7ADF;&#x8981;&#x81EA;&#x52D5;&#x7684;&#x8A71;&#xFF0C;&#x4FBF;&#x8981;&#x81EA;&#x52D5;&#x5230;&#x5E95;&#x3002;</p>
<p>&#x4EE5;&#x524D;&#x5F88;&#x6015;&#x5BEB; <code>Parcelable</code>&#xFF0C;&#x6709; plugin &#x5F8C;&#x771F;&#x662F;&#x5982;&#x6DCB;&#x6625;&#x98A8;&#xFF0C;&#x6709;&#x591A;&#x5C11;&#x5BEB;&#x591A;&#x5C11;&#x3002;</p>
<h2 id>&#x76F8;&#x95DC;&#x9023;&#x7D50;</h2>
<ul>
<li><a href="http://www.parcelabler.com/">parcelabler.com</a></li>
<li><a href="http://www.developerphil.com/parcelable-vs-serializable/">Parcelable vs Serializable</a></li>
<li><a href="https://github.com/frankiesardo/auto-parcel">Android Library - AutoParcel</a></li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[六月讀書]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x9019;&#x500B;&#x6708;&#x53C8;&#x53BB;&#x4E86;&#x770B;&#x8F15;&#x5C0F;&#x8AAA;&#x3002;&#x679C;&#x7136;&#x8F15;&#x5C0F;&#x8AAA;&#x5C31;&#x50CF;&#x6BD2;&#x54C1;&#x4E00;&#x6A23;&#x3002;</p>
<p>&#x9019;&#x88CF;&#x5FEB;&#x8B8A;&#x6210;&#x8B80;&#x66F8; blog, sosad &#x3002;</p>
<hr>
<p><img src="https://sparks-blog2.fly.dev/content/images/2016/07/1.jpg" alt loading="lazy"></p>
<h2 id="theoldmanswarjohnscalzi">&#x300A;The Old Man&apos;s War&#x300B;- John Scalzi</h2>
<p>&#x5178;&#x5F62;&#x7684;&#x79D1;&#x5E7B;&#x6230;</p>]]></description><link>https://sparks-blog2.fly.dev/book-read-in-june-2016/</link><guid isPermaLink="false">6344c7bf02c13c0211c7d2d3</guid><category><![CDATA[一星期一書]]></category><dc:creator><![CDATA[Ryan Leung]]></dc:creator><pubDate>Fri, 15 Jul 2016 01:03:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x9019;&#x500B;&#x6708;&#x53C8;&#x53BB;&#x4E86;&#x770B;&#x8F15;&#x5C0F;&#x8AAA;&#x3002;&#x679C;&#x7136;&#x8F15;&#x5C0F;&#x8AAA;&#x5C31;&#x50CF;&#x6BD2;&#x54C1;&#x4E00;&#x6A23;&#x3002;</p>
<p>&#x9019;&#x88CF;&#x5FEB;&#x8B8A;&#x6210;&#x8B80;&#x66F8; blog, sosad &#x3002;</p>
<hr>
<p><img src="https://sparks-blog2.fly.dev/content/images/2016/07/1.jpg" alt loading="lazy"></p>
<h2 id="theoldmanswarjohnscalzi">&#x300A;The Old Man&apos;s War&#x300B;- John Scalzi</h2>
<p>&#x5178;&#x5F62;&#x7684;&#x79D1;&#x5E7B;&#x6230;&#x722D;&#x6545;&#x4E8B;&#xFF0C;&#x4E0D;&#x540C;&#x4E4B;&#x8655;&#x5728;&#x65BC;&#x6BCF;&#x500B;&#x53C3;&#x6230;&#x8005;&#x90FD;&#x662F; 75 &#x6B73;&#x4EE5;&#x4E0A;&#x7684;&#x300C;&#x8001;&#x300D;&#x4EBA;&#x3002;&#x6545;&#x4E8B;&#x7684;&#x958B;&#x59CB;&#xFF0C;&#x662F; 75 &#x6B72;&#x7684;&#x8001;&#x4EBA;&#x624D;&#x53EF;&#x4EE5;&#x5728;&#x661F;&#x969B;&#x6230;&#x722D;&#x4E2D;&#x53C3;&#x8ECD;&#x3002;&#x4E4B;&#x5F8C;&#x662F;&#x4E00;&#x9023;&#x4E32;&#x7684;&#x672A;&#x4F86;&#x79D1;&#x6280;&#x63CF;&#x8FF0;&#xFF0C;&#x4EBA;&#x9020;&#x7684;&#x8EAB;&#x9AD4;&#x3001;&#x672A;&#x4F86;&#x7684;&#x69CD;&#x68B0;&#x3001;&#x5916;&#x661F;&#x4EBA;&#x7684;&#x751F;&#x614B;&#x7B49;&#x3002;&#x6545;&#x4E8B;&#x7C21;&#x55AE;&#xFF0C;&#x5C1A;&#x7B97;&#x6709;&#x8DA3;&#xFF0C;&#x6709;&#x4E00;&#x8B80;&#x7684;&#x50F9;&#x503C;&#x3002;&#x4F0F;&#x7B46;&#x70BA;&#x5F8C;&#x7E8C;&#x6545;&#x4E8B;&#x92EA;&#x8DEF;&#x3002;</p>
<h2 id="thelessonsofhistorywillarieldurant">&#x300A;The Lessons of History&#x300B; - Will &amp; Ariel Durant</h2>
<p>&#x8584;&#x8584;&#x7684;&#x4E00;&#x672C;&#x66F8;&#xFF0C;&#x5F9E;&#x6B77;&#x53F2;&#x5F97;&#x5230;&#x7684;&#x7D50;&#x8AD6;&#xFF0C;&#x7C21;&#x55AE;&#x7684;&#x544A;&#x8A34;&#x8B80;&#x8005;&#xFF0C;&#x6B77;&#x53F2;&#x8DDF;&#x653F;&#x6CBB;&#x9AD4;&#x5236;&#x3001;&#x4EBA;&#x7A2E;&#x3001;&#x500B;&#x6027;&#x3001;&#x5B97;&#x6559;&#x7B49;&#x7684;&#x95DC;&#x4FC2;&#x3002;</p>
<p><img src="https://sparks-blog2.fly.dev/content/images/2016/07/2.jpg" alt loading="lazy"></p>
<h2 id>&#x300A;&#x8B1B;&#x6545;&#x4E8B;&#x7684;&#x9B54;&#x6CD5;&#x300B; - &#x5F6D;&#x57F7;&#x4E2D;</h2>
<p>&#x5982;&#x4F55;&#x8B1B;&#x6545;&#x4E8B;&#x7D66;&#x5C0F;&#x5B69;&#x807D;&#x3002;</p>
<h2 id>&#x300A;&#x609F;&#x7A7A;&#x50B3;&#x300B;- &#x4ECA;&#x4F55;&#x5728;</h2>
<p>&#x7DB2;&#x4E0A;&#x5C0F;&#x8AAA;&#x3002;&#x91CD;&#x65B0;&#x6F14;&#x7E79;&#x609F;&#x7A7A;&#x7684;&#x6545;&#x4E8B;&#x3002;&#x70BA;&#x4F55;&#x8981;&#x795E;&#x4F5B;&#xFF1F;&#x4F55;&#x8B02;&#x5996;&#x4F55;&#x8B02;&#x795E;&#xFF1F;</p>
<p>&#x609F;&#x7A7A;&#x773E;&#x4EBA;&#x7684;&#x60B2;&#x5287;&#x6545;&#x4E8B;&#x3002;</p>
<p><img src="https://sparks-blog2.fly.dev/content/images/2016/07/-------1.jpg" alt loading="lazy"></p>
<h2 id="110">&#x300A;&#x76FE;&#x4E4B;&#x52C7;&#x8005;&#x6210;&#x540D;&#x9304;&#x300B;1-10 &#x5377; - &#x30A2;&#x30CD;&#x30B3;&#x30E6;&#x30B5;&#x30AE;</h2>
<p>&#x65E5;&#x672C;&#x7DB2;&#x7D61;&#x8F15;&#x5C0F;&#x8AAA;&#x3002;</p>
<p>&#x4F86;&#x81EA;&#x65E5;&#x672C;&#x7684;&#x5927;&#x5B78;&#x751F;&#xFF0C;&#x88AB;&#x83AB;&#x540D;&#x5947;&#x5999;&#x7684;&#x53EC;&#x559A;&#x5230;&#x4E00;&#x500B;&#x985E;&#x4F3C;&#x904A;&#x6232;&#x7684;&#x7570;&#x4E16;&#x754C;&#x4E2D;&#xFF0C;&#x7576;&#x5176;&#x4E2D;&#x4E00;&#x4F4D;&#x50B3;&#x8AAA;&#x7684;&#x52C7;&#x8005;&#x3002;&#x5176;&#x6B66;&#x5668;&#x7ADF;&#x7136;&#x662F;.....&#x76FE;&#xFF1F;&#x6C92;&#x6709;&#x653B;&#x64CA;&#x529B;&#xFF0C;&#x800C;&#x4E14;&#x5728;&#x7B2C;&#x4E00;&#x5929;&#x4FBF;&#x88AB;&#x8AA3;&#x884A;&#xFF0C;&#x6C92;&#x6709;&#x4EBA;&#x9858;&#x610F;&#x6210;&#x70BA;&#x540C;&#x4F34;&#x3002;&#x4E3B;&#x89D2;&#x8981;&#x505A;&#x7684;&#x662F;&#xFF0C;&#x52AA;&#x529B;&#x751F;&#x5B58;&#x4E0B;&#x53BB;&#xFF0C;&#x5728;&#x61C9;&#x4ED8;&#x9B54;&#x7269;&#x7684;&#x540C;&#x6642;&#xFF0C;&#x9084;&#x8981;&#x53BB;&#x5FA9;&#x4EC7;&#x3002;</p>
<p>&#x7BC0;&#x594F;&#x660E;&#x5FEB;&#x5287;&#x60C5;&#x6709;&#x8D77;&#x4F0F;&#xFF0C;&#x6C92;&#x6709;&#x592A;&#x591A;&#x7684;&#x65E5;&#x5E38;&#xFF0C;&#x7121;&#x804A;&#x5C0D;&#x8A71;&#x7684;&#x4EFD;&#x91CF;&#x4E5F;&#x5728;&#x53EF;&#x63A5;&#x53D7;&#x7684;&#x7A0B;&#x5EA6;&#x3002;&#x4E0D;&#x932F;&#x3002;</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[香港政府的 Open Data 之我見]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x770B;&#x898B;&#x50B3;&#x5A92;&#x5831;&#x5C0E;&#xFF0C;&#x7ACB;&#x5373;&#x8D70;&#x53BB; data.gov.hk &#x770B;&#x3002;OMG&#xFF0C;&#x9084;&#x771F;&#x7684;&#x6709;&#x8B66;&#x65B9;&#x7684; Appreciation Letters &#xFF0C;&#x662F;&#x56E0;&#x70BA;&#x8B66;&#x52D9;&#x7F72;&#x89BA;&#x5F97;&#x81EA;&#x5DF1;&#x5F62;&#x8C61;&#x4F4E;&#x843D;&#xFF0C;&#x6240;&#x4EE5;&#x767C;&#x653E;&#x51FA;&#x4F86;&#xFF0C;</p>]]></description><link>https://sparks-blog2.fly.dev/my-view-onhk-gov-open-data/</link><guid isPermaLink="false">6344c7bf02c13c0211c7d2d2</guid><dc:creator><![CDATA[Ryan Leung]]></dc:creator><pubDate>Wed, 06 Jul 2016 08:55:04 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x770B;&#x898B;&#x50B3;&#x5A92;&#x5831;&#x5C0E;&#xFF0C;&#x7ACB;&#x5373;&#x8D70;&#x53BB; data.gov.hk &#x770B;&#x3002;OMG&#xFF0C;&#x9084;&#x771F;&#x7684;&#x6709;&#x8B66;&#x65B9;&#x7684; Appreciation Letters &#xFF0C;&#x662F;&#x56E0;&#x70BA;&#x8B66;&#x52D9;&#x7F72;&#x89BA;&#x5F97;&#x81EA;&#x5DF1;&#x5F62;&#x8C61;&#x4F4E;&#x843D;&#xFF0C;&#x6240;&#x4EE5;&#x767C;&#x653E;&#x51FA;&#x4F86;&#xFF0C;&#x544A;&#x8A34;&#x5E02;&#x6C11;&#x5B83;&#x591A;&#x9EBC;&#x53D7;&#x6B61;&#x8FCE;&#xFF0C;&#x9084;&#x662F;&#x5B83;&#x771F;&#x5FC3;&#x89BA;&#x5F97;&#xFF0C;&#x6709;&#x4EBA;&#x6703;&#x5C0D;&#x6B64;&#x65B9;&#x9762;&#x7684;&#x8CC7;&#x6599;&#x6709;&#x8208;&#x8DA3;&#x5462;&#xFF1F;</p>
<p>&#x653F;&#x5E9C;&#x9023;&#x611F;&#x8B1D;&#x4FE1;&#x4E5F;&#x62FF;&#x51FA;&#x4F86;&#x7576; open data &#xFF0C;&#x5BE6;&#x5728;&#x4E0D;&#x77E5;&#x5982;&#x4F55;&#x5F62;&#x5BB9;&#x3002;&#x662F;&#x56E0;&#x70BA;&#x61F6;&#xFF0C;&#x9084;&#x662F;&#x56E0;&#x70BA;&#x6839;&#x672C;&#x4E0D;&#x77E5;&#x4EC0;&#x9EBC;&#x662F; open data &#x554A;&#xFF1F;</p>
<h2 id="opendata">&#x4EC0;&#x9EBC;&#x662F; Open data?</h2>
<p>Open data &#x7C21;&#x55AE;&#x8AAA;&#x662F;&#x958B;&#x653E;&#x8CC7;&#x6599;&#x3002;&#x653F;&#x5E9C;&#x638C;&#x63E1;&#x6700;&#x591A;&#x8CC7;&#x6599;&#xFF0C;&#x800C;&#x9019;&#x4E9B;&#x8CC7;&#x6599;&#xFF0C;&#x4E00;&#x822C;&#x4EBA;&#x57FA;&#x672C;&#x4E0A;&#x662F;&#x6C92;&#x53EF;&#x80FD;&#x7528;&#x5176;&#x4ED6;&#x65B9;&#x6CD5;&#x81EA;&#x884C;&#x7372;&#x53D6;&#x7684;&#x3002;&#x900F;&#x904E;&#x9019;&#x4E9B;&#x8CC7;&#x6599;&#xFF0C;&#x5E02;&#x6C11;&#x53EF;&#x4EE5;&#x4E86;&#x89E3;&#x793E;&#x6703;&#x767C;&#x751F;&#x7684;&#x4E8B;&#x60C5; (&#x6295;&#x7968;&#x3001;&#x4EBA;&#x53E3;&#x3001;&#x72AF;&#x7F6A;&#x8CC7;&#x6599;)&#xFF0C;&#x53EF;&#x4EE4;&#x751F;&#x6D3B;&#x66F4;&#x65B9;&#x4FBF; (&#x5929;&#x6C23;&#x3001;&#x4EA4;&#x901A;&#x3001;&#x79DF;&#x91D1;&#x50F9;&#x683C;&#x8CC7;&#x6599;)&#xFF0C;&#x6216;&#x505A;&#x5B78;&#x8853;&#x7814;&#x7A76; (&#x6559;&#x80B2;&#x3001;&#x5C31;&#x696D;&#x7B49;&#x8CC7;&#x6599;)&#x3002;</p>
<p>&#x9019;&#x4E9B;&#x8CC7;&#x6599;&#x6578;&#x64DA;&#xFF0C;&#x5982;&#x4EBA;&#x53E3;&#x7D71;&#x8A08;&#x3001;&#x72AF;&#x7F6A;&#x7387;&#x7B49;&#xFF0C;&#x7686;&#x7531;&#x653F;&#x5E9C;&#x638C;&#x63A7;&#x3002;&#x82E5;&#x653F;&#x5E9C;&#x4E0D;&#x9858;&#x958B;&#x653E;&#xFF0C;&#x6211;&#x5011;&#x4FBF;&#x6C92;&#x6709;&#x65B9;&#x6CD5;&#x5F97;&#x77E5;&#x3002;&#x73FE;&#x5728;&#x9F13;&#x5439;&#x7684; open data&#xFF0C;&#x4FBF;&#x662F;&#x5E0C;&#x671B;&#x653F;&#x5E9C;&#x80FD;&#x958B;&#x653E;&#x6578;&#x64DA;&#xFF0C;&#x9664;&#x4E86;&#x53EF;&#x589E;&#x52A0;&#x900F;&#x660E;&#x5EA6;&#xFF0C;&#x4E5F;&#x80FD;&#x8B93;&#x5927;&#x773E;&#x90FD;&#x53EF;&#x4EE5;&#x62FF;&#x8457;&#x6578;&#x64DA;&#x53BB;&#x505A;&#x5206;&#x6790;&#x3001;&#x7814;&#x7A76;&#x6216;&#x505A;&#x5176;&#x4ED6;&#x5F62;&#x5F0F;&#x7684;&#x767C;&#x653E;&#x3002;</p>
<p>&#x4E00;&#x822C;&#x4F86;&#x8AAA;&#xFF0C;open data &#x7684;&#x8CC7;&#x6599;&#x683C;&#x5F0F;&#x662F;&#x5BB9;&#x6613;&#x8F38;&#x5165;&#x9032;&#x96FB;&#x8166;&#x7A0B;&#x5F0F;&#x88CF;&#xFF0C;&#x8B93;&#x7A0B;&#x5F0F;&#x5BB9;&#x6613;&#x95B1;&#x8B80;&#x3002;&#x8F03;&#x65B0;&#x7684;&#x683C;&#x5F0F;&#x6709; JSON&#xFF0C;XML &#x7B49;&#xFF0C;&#x70BA;&#x6700;&#x65B9;&#x4FBF;&#x7A0B;&#x5F0F;&#x4F7F;&#x7528;&#x7684;&#x683C;&#x5F0F;&#xFF1B;&#x5176;&#x6B21;&#x662F; xls&#xFF0C;&#x5F88;&#x591A;&#x6642;&#x9700;&#x8981;&#x7528;&#x5176;&#x4ED6;&#x7A0B;&#x5F0F;&#x518D;&#x8F49;&#x63DB;&#xFF0C;&#x4F46;&#x4ECD;&#x7B97;&#x65B9;&#x4FBF;&#xFF1B;&#x800C; PDF&#x3001;JPG &#x7B49;&#x5247;&#x4E0D;&#x80FD;&#x8F15;&#x6613;&#x8F38;&#x5165;&#x9032;&#x7A0B;&#x5F0F;&#x4E2D;&#xFF0C;&#x70BA;&#x6700;&#x4E0D;&#x4FBF;&#x7684;&#x683C;&#x5F0F;&#x3002;</p>
<h2 id="datagovhk">data.gov.hk &#x7684;&#x554F;&#x984C;</h2>
<p>&#x9999;&#x6E2F;&#x653F;&#x5E9C;&#x70BA;&#x97FF;&#x61C9; open data &#xFF0C;&#x5E7E;&#x5E74;&#x524D;&#x6210;&#x7ACB; data.gov.hk &#xFF0C;&#x65E8;&#x5728;&#x7528;&#x4E00;&#x500B;&#x7D71;&#x4E00;&#x7684;&#x5730;&#x65B9;&#x767C;&#x653E;&#x8CC7;&#x6599;&#x3002;&#x53EF;&#x80FD;&#x5167;&#x88CF;&#x7684;&#x8CC7;&#x6599;&#x985E;&#x578B;&#x548C;&#x8CEA;&#x7D20;&#x4E00;&#x76F4;&#x5F37;&#x5DEE;&#x4EBA;&#x610F;&#xFF0C;&#x4F3C;&#x4E4E;&#x653F;&#x5E9C;&#x4EBA;&#x54E1;&#x5C0D;&#x4EC0;&#x9EBC;&#x662F; data &#x6BEB;&#x7121;&#x6982;&#x5FF5;&#x3002;</p>
<h3 id="data">&#x9019;&#x7B97;&#x662F; data &#xFF1F;</h3>
<p>&#x300C;Open Data&#x300D;&#x662F;&#x4EE5; data &#x70BA;&#x4E3B;&#xFF0C;&#x4EC0;&#x9EBC;&#x662F;&#x300C;data&#x300D;&#x5247;&#x56E0;&#x4EBA;&#x800C;&#x7570;&#xFF0C;&#x4F46;&#x5982;&#x4F55;&#x4E0D;&#x540C;&#xFF0C;&#x4E5F;&#x6709;&#x5E95;&#x7DDA;&#x5427;&#xFF1F;&#x9664;&#x4E86;&#x4E4B;&#x524D;&#x5831;&#x5C0E;&#x7684;&#x8B66;&#x5BDF;&#x8868;&#x63DA;&#x4FE1;&#xFF0C;&#x6211;&#x5011;&#x5728; data.gov.hk &#x53EF;&#x4EE5;&#x770B;&#x5230;&#x300C;&#x5728;&#x56DA;&#x4EBA;&#x58EB;&#x520A;&#x7269;&#x300D;&#x3001;&#x300C;&#x5E73;&#x7B49;&#x6A5F;&#x6703;&#x653F;&#x7B56;&#x300D;&#xFF0C;&#x6216;&#x81F3;&#x4E4E;&#x300C;&#x53C3;&#x52A0;&#x8868;&#x683C;&#x300D;&#xFF0C;&#x7121;&#x8AD6;&#x4EFB;&#x4F55;&#x89D2;&#x5EA6;&#x770B;&#xFF0C;&#x5B83;&#x5011;&#x4E5F;&#x4E0D;&#x7B97;&#x662F; &#x300C;data&#x300D;&#x5427; ? &#x653F;&#x5E9C;&#x4F3C;&#x4E4E;&#x662F;&#x4EE5;&#x70BA; open &#x4E86;&#x4FBF;&#x53EF;&#x4EE5;&#xFF0C;&#x662F;&#x4E0D;&#x662F; data &#x4E5F;&#x6C92;&#x6709;&#x6240;&#x8B02;&#x3002;</p>
<p>OK&#xFF0C;&#x6211;&#x5011;&#x4E0D;&#x61C9;&#x8A72;&#x602A;&#x4ED6;&#x5011;&#xFF0C;&#x5176;&#x5BE6;&#x5F88;&#x96E3;&#x754C;&#x5B9A;&#x4EC0;&#x9EBC;&#x8CC7;&#x6599;&#x6709;&#x7528;&#xFF0C;&#x7562;&#x7ADF;&#x4E5F;&#x6709;&#x4EBA;&#x7528;&#x8868;&#x63DA;&#x4FE1;&#x8CC7;&#x6599;&#x5BEB;&#x4E86;&#x7A0B;&#x5F0F;&#x3002;&#x800C;&#x4E14;&#x8868;&#x63DA;&#x4FE1;&#x7684;&#x767C;&#x653E;&#x683C;&#x5F0F;&#x662F; XML&#xFF0C;&#x53EF;&#x4EE5;&#x5BB9;&#x6613;&#x8B80;&#x53D6;&#x5206;&#x6790;&#xFF0C;&#x6240;&#x4EE5;&#x4E5F;&#x4E0D;&#x80FD;&#x7B97;&#x4E0D; OK &#x5427;&#x3002;&#x96D6;&#x7136;&#x6211;&#x5011;&#x671F;&#x671B;&#x7684;&#x8CC7;&#x7C75;&#x6703;&#x662F;&#x66F4;&#x6709;&#x7528;&#x4E00;&#x9EDE; (&#x5982;&#x5404;&#x5340;&#x72AF;&#x7F6A;&#x7387;&#x3001;&#x5831;&#x6848;&#x4EBA;&#x6578;&#x7B49;)&#x3002;</p>
<h3 id="pdfpdfpdf">PDF PDF PDF</h3>
<p>PDF &#x662F;&#x65B9;&#x4FBF;&#x4EBA;&#x5217;&#x5370;&#x95B1;&#x8B80;&#x7684;&#x683C;&#x5F0F;&#xFF0C;&#x5C31;&#x7B97;&#x5728;&#x4E0D;&#x540C;&#x5E73;&#x53F0;&#x6A5F;&#x5668;&#x4E0A;&#x958B;&#x555F;&#xFF0C;&#x5916;&#x89C0;&#x683C;&#x5F0F;&#x4E5F;&#x6703;&#x4E00;&#x81F4;&#xFF0C;&#x4EE5;&#x4EBA;&#x985E;&#x70BA;&#x5C0D;&#x50CF;&#x4F86;&#x767C;&#x653E;&#x7684;&#x8A71;&#xFF0C;&#x662F;&#x975E;&#x5E38;&#x65B9;&#x4FBF;&#x3002;</p>
<p>&#x4F46;&#x82E5;&#x5C0D;&#x50CF;&#x662F;&#x96FB;&#x8166;&#x7A0B;&#x5F0F;&#x7684;&#x8A71;&#xFF0C;&#x5247;&#x662F;&#x53E6;&#x7576;&#x5225;&#x8AD6;&#x4E86;&#x3002;PDF &#x4E0D;&#x80FD;&#x8F15;&#x6613;&#x8F49;&#x63DB;&#x70BA;&#x5176;&#x4ED6;&#x683C;&#x5F0F;&#xFF0C;&#x5F88;&#x591A;&#x6642;&#x5C31;&#x7B97; copy &amp; paste &#x4E5F;&#x672A;&#x5FC5;&#x80FD;&#x5C07;&#x8CC7;&#x6599;&#x5B8C;&#x6574;&#x5730;&#x8907;&#x88FD;&#x51FA;&#x4F86;&#x3002;&#x5C0D;&#x7A0B;&#x5F0F;&#x8A2D;&#x8A08;&#x8005;&#x4F86;&#x8AAA;&#xFF0C;PDF &#x7C21;&#x76F4;&#x5C31;&#x662F;&#x60E1;&#x5922;&#xFF01;</p>
<p>&#x4F46;&#x70BA;&#x4EC0;&#x9EBC;&#x653F;&#x5E9C;&#x7684;&#x8CC7;&#x6E90;&#x591A;&#x662F; PDF &#x683C;&#x5F0F;? &#x4EC0;&#x9EBC;&#xFF1F;&#x9023; JPG &#x4E5F;&#x6709;&#x5462;&#x3002;</p>
<figure>
![&#x6D3B;&#x8C6C;&#x6578;&#x91CF;&#x5206;&#x4F48;&#x5716;](/content/images/2016/07/barchart.jpg)
<figcaption>
&#x300C;&#x6D3B;&#x8C6C;&#x6578;&#x91CF;&#x5206;&#x4F48;&#x5716;&#x300D;&#x3002;&#x53EA;&#x6709;&#x5716;&#x8868;&#xFF0C;&#x6C92;&#x6709;&#x8CC7;&#x6599;&#x3002;&#x70BA;&#x4EC0;&#x9EBC;&#x4E0D;&#x76F4;&#x63A5;&#x51FA; data set &#x800C;&#x8981;&#x51FA; Excel graph?</figcaption>
</figure>
<h3 id>&#x5167;&#x5BB9;&#x70BA;&#x738B;</h3>
<p>&#x6709;&#x4E9B;&#x8CC7;&#x6599;&#x96D6;&#x7136;&#x662F;&#x4EE5; XML &#x683C;&#x5F0F;&#x767C;&#x653E;&#xFF0C;&#x4F46;&#x88CF;&#x9762;&#x7684;&#x662F;&#x6587;&#x5B57;&#x6BB5;&#x843D;&#xFF0C;&#x5B8C;&#x5168;&#x5931;&#x53BB;&#x4F7F;&#x7528; XML &#x7684;&#x610F;&#x7FA9;&#xFF0C;&#x6D6A;&#x8CBB;&#x6642;&#x9593;&#x554A;&#x3002;</p>
<p>&#x62FF;&#x6700;&#x591A;&#x4EBA;&#x4F7F;&#x7528;&#x7684;&#x5929;&#x6C23;&#x8CC7;&#x6599;&#x70BA;&#x4F8B;&#xFF0C;&#x8B93;&#x6211;&#x5011;&#x770B;&#x770B; <a href="http://rss.weather.gov.hk/rss/CurrentWeather_uc.xml">&#x672C;&#x6E2F;&#x5730;&#x5340;&#x5929;&#x6C23;&#x5831;&#x544A;</a> &#x7684;&#x8CC7;&#x6599;&#xFF1A;</p>
<pre><code>&lt;description&gt;
&lt;![CDATA[
    &lt;p&gt;&lt;img src=&quot;http://rss.weather.gov.hk/img/pic53.png&quot; style=&quot;vertical-align: middle;&quot;&gt;&lt;br/&gt;&lt;br/&gt; &#x4E0A; &#x5348; 9 &#x6642; &#x5929; &#x6587; &#x53F0; &#x9304; &#x5F97;&#xFF1A;&lt;br/&gt; &#x6C23; &#x6EAB; &#xFF1A; 29 &#x5EA6;&lt;br/&gt; &#x76F8; &#x5C0D; &#x6FD5; &#x5EA6; &#xFF1A; &#x767E; &#x5206; &#x4E4B; 89&lt;br/&gt; &#x904E; &#x53BB; &#x4E00; &#x5C0F; &#x6642; &#xFF0C; &#x4EAC; &#x58EB; &#x67CF; &#x9304; &#x5F97; &#x7684; &#x5E73; &#x5747; &#x7D2B; &#x5916; &#x7DDA; &#x6307; &#x6578; &#xFF1A; 2&lt;br/&gt; &#x7D2B; &#x5916; &#x7DDA; &#x5F37; &#x5EA6; &#xFF1A; &#x4F4E; &lt;br/&gt;

    &lt;br/&gt; &#x5929; &#x6C23; &#x708E; &#x71B1; &#x53EF; &#x80FD; &#x5F71; &#x97FF; &#x5065; &#x5EB7; &#xFF0C; &#x5929; &#x6587; &#x53F0; &#x63D0; &#x9192; &#x5E02; &#x6C11; &#x4FDD; &#x6301; &#x8B66; &#x60D5; &#x3002;&lt;br/&gt;

    &lt;p&gt;&lt;/p&gt;
    &#x672C; &#x6E2F; &#x5176; &#x4ED6; &#x5730; &#x5340; &#x7684; &#x6C23; &#x6EAB; &#xFF1A;&lt;br/&gt;
    &lt;font size=&quot;-1&quot;&gt;
        &lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;

            &lt;tr&gt;
                &lt;td&gt;&#x5929; &#x6587; &#x53F0; &lt;/td&gt;
                &lt;td width=&quot;100&quot; align=&quot;right&quot;&gt;29&lt;/SPAN&gt;&lt;SPAN style=&quot;float:static; text-align:left;&quot;&gt; &#x5EA6; &#xFF0C;&lt;/td&gt;&lt;/tr&gt;
                &lt;tr&gt;&lt;td&gt;&#x4EAC; &#x58EB; &#x67CF; &lt;/td&gt;&lt;td width=&quot;100&quot; align=&quot;right&quot;&gt;30&lt;/SPAN&gt;&lt;SPAN style=&quot;float:static; text-align:left;&quot;&gt; &#x5EA6; &#xFF0C;&lt;/td&gt;&lt;/tr&gt;
                &lt;tr&gt;&lt;td&gt;&#x9EC3; &#x7AF9; &#x5751; &lt;/td&gt;&lt;td width=&quot;100&quot; align=&quot;right&quot;&gt;30&lt;/SPAN&gt;&lt;SPAN style=&quot;float:static; text-align:left;&quot;&gt; &#x5EA6; &#xFF0C;&lt;/td&gt;&lt;/tr&gt;
                &lt;tr&gt;&lt;td&gt;&#x6253; &#x9F13; &#x5DBA; &lt;/td&gt;&lt;td width=&quot;100&quot; align=&quot;right&quot;&gt;29&lt;/SPAN&gt;&lt;SPAN style=&quot;float:static; text-align:left;&quot;&gt; &#x5EA6; &#xFF0C;&lt;/td&gt;&lt;/tr&gt;
                &lt;tr&gt;&lt;td&gt;&#x6D41; &#x6D6E; &#x5C71; &lt;/td&gt;&lt;td width=&quot;100&quot; align=&quot;right&quot;&gt;30&lt;/SPAN&gt;&lt;SPAN style=&quot;float:static; text-align:left;&quot;&gt; &#x5EA6; &#xFF0C;&lt;/td&gt;&lt;/tr&gt;
                &lt;tr&gt;&lt;td&gt;&#x5927; &#x57D4; &lt;/td&gt;&lt;td width=&quot;100&quot; align=&quot;right&quot;&gt;28&lt;/SPAN&gt;&lt;SPAN style=&quot;float:static; text-align:left;&quot;&gt; &#x5EA6; &#xFF0C;&lt;/td&gt;&lt;/tr&gt;
                &lt;tr&gt;&lt;td&gt;&#x6C99; &#x7530; &lt;/td&gt;&lt;td width=&quot;100&quot; align=&quot;right&quot;&gt;29&lt;/SPAN&gt;&lt;SPAN style=&quot;float:static; text-align:left;&quot;&gt; &#x5EA6; &#xFF0C;&lt;/td&gt;&lt;/tr&gt;
                &lt;tr&gt;&lt;td&gt;&#x5C6F; &#x9580; &lt;/td&gt;&lt;td width=&quot;100&quot; align=&quot;right&quot;&gt;30&lt;/SPAN&gt;&lt;SPAN style=&quot;float:static; text-align:left;&quot;&gt; &#x5EA6; &#xFF0C;&lt;/td&gt;&lt;/tr&gt;
                &lt;tr&gt;&lt;td&gt;&#x5C07; &#x8ECD; &#x6FB3; &lt;/td&gt;&lt;td width=&quot;100&quot; align=&quot;right&quot;&gt;29&lt;/SPAN&gt;&lt;SPAN style=&quot;float:static; text-align:left;&quot;&gt; &#x5EA6; &#xFF0C;&lt;/td&gt;&lt;/tr&gt;
                &lt;tr&gt;&lt;td&gt;&#x897F; &#x8CA2; &lt;/td&gt;&lt;td width=&quot;100&quot; align=&quot;right&quot;&gt;29&lt;/SPAN&gt;&lt;SPAN style=&quot;float:static; text-align:left;&quot;&gt; &#x5EA6; &#xFF0C;&lt;/td&gt;&lt;/tr&gt;
                &lt;tr&gt;&lt;td&gt;&#x9577; &#x6D32; &lt;/td&gt;&lt;td width=&quot;100&quot; align=&quot;right&quot;&gt;29&lt;/SPAN&gt;&lt;SPAN style=&quot;float:static; text-align:left;&quot;&gt; &#x5EA6; &#xFF0C;&lt;/td&gt;&lt;/tr&gt;
                &lt;tr&gt;&lt;td&gt;&#x8D64; &amp;#40050;  &#x89D2;    &lt;/td&gt;&lt;td width=&quot;100&quot; align=&quot;right&quot;&gt;30&lt;/SPAN&gt;&lt;SPAN style=&quot;float:static; text-align:left;&quot;&gt; &#x5EA6; &#xFF0C;&lt;/td&gt;&lt;/tr&gt;
                &lt;tr&gt;&lt;td&gt;&#x9752; &#x8863; &lt;/td&gt;&lt;td width=&quot;100&quot; align=&quot;right&quot;&gt;31&lt;/SPAN&gt;&lt;SPAN style=&quot;float:static; text-align:left;&quot;&gt; &#x5EA6; &#xFF0C;&lt;/td&gt;&lt;/tr&gt;
                &lt;tr&gt;&lt;td&gt;&#x77F3; &#x5D17; &lt;/td&gt;&lt;td width=&quot;100&quot; align=&quot;right&quot;&gt;31&lt;/SPAN&gt;&lt;SPAN style=&quot;float:static; text-align:left;&quot;&gt; &#x5EA6; &#xFF0C;&lt;/td&gt;&lt;/tr&gt;
                &lt;tr&gt;&lt;td&gt;&#x8343; &#x7063; &#x53EF; &#x89C0; &lt;/td&gt;&lt;td width=&quot;100&quot; align=&quot;right&quot;&gt;27&lt;/SPAN&gt;&lt;SPAN style=&quot;float:static; text-align:left;&quot;&gt; &#x5EA6; &#xFF0C;&lt;/td&gt;&lt;/tr&gt;
                &lt;tr&gt;&lt;td&gt;&#x8343; &#x7063; &#x57CE; &#x9580; &#x8C37; &lt;/td&gt;&lt;td width=&quot;100&quot; align=&quot;right&quot;&gt;30&lt;/SPAN&gt;&lt;SPAN style=&quot;float:static; text-align:left;&quot;&gt; &#x5EA6; &#xFF0C;&lt;/td&gt;&lt;/tr&gt;
                &lt;tr&gt;&lt;td&gt;&#x9999; &#x6E2F; &#x516C; &#x5712; &lt;/td&gt;&lt;td width=&quot;100&quot; align=&quot;right&quot;&gt;30&lt;/SPAN&gt;&lt;SPAN style=&quot;float:static; text-align:left;&quot;&gt; &#x5EA6; &#xFF0C;&lt;/td&gt;&lt;/tr&gt;
                &lt;tr&gt;&lt;td&gt;&#x7B72; &#x7B95; &#x7063; &lt;/td&gt;&lt;td width=&quot;100&quot; align=&quot;right&quot;&gt;29&lt;/SPAN&gt;&lt;SPAN style=&quot;float:static; text-align:left;&quot;&gt; &#x5EA6; &#xFF0C;&lt;/td&gt;&lt;/tr&gt;
                &lt;tr&gt;&lt;td&gt;&#x4E5D; &#x9F8D; &#x57CE; &lt;/td&gt;&lt;td width=&quot;100&quot; align=&quot;right&quot;&gt;30&lt;/SPAN&gt;&lt;SPAN style=&quot;float:static; text-align:left;&quot;&gt; &#x5EA6; &#xFF0C;&lt;/td&gt;&lt;/tr&gt;
                &lt;tr&gt;&lt;td&gt;&#x8DD1; &#x99AC; &#x5730; &lt;/td&gt;&lt;td width=&quot;100&quot; align=&quot;right&quot;&gt;30&lt;/SPAN&gt;&lt;SPAN style=&quot;float:static; text-align:left;&quot;&gt; &#x5EA6; &#xFF0C;&lt;/td&gt;&lt;/tr&gt;
                &lt;tr&gt;&lt;td&gt;&#x9EC3; &#x5927; &#x4ED9; &lt;/td&gt;&lt;td width=&quot;100&quot; align=&quot;right&quot;&gt;30&lt;/SPAN&gt;&lt;SPAN style=&quot;float:static; text-align:left;&quot;&gt; &#x5EA6; &#xFF0C;&lt;/td&gt;&lt;/tr&gt;
                &lt;tr&gt;&lt;td&gt;&#x8D64; &#x67F1; &lt;/td&gt;&lt;td width=&quot;100&quot; align=&quot;right&quot;&gt;30&lt;/SPAN&gt;&lt;SPAN style=&quot;float:static; text-align:left;&quot;&gt; &#x5EA6; &#xFF0C;&lt;/td&gt;&lt;/tr&gt;
                &lt;tr&gt;&lt;td&gt;&#x89C0; &#x5858; &lt;/td&gt;&lt;td width=&quot;100&quot; align=&quot;right&quot;&gt;30&lt;/SPAN&gt;&lt;SPAN style=&quot;float:static; text-align:left;&quot;&gt; &#x5EA6; &#xFF0C;&lt;/td&gt;&lt;/tr&gt;
                &lt;tr&gt;&lt;td&gt;&#x6DF1; &#x6C34; &#x57D7; &lt;/td&gt;&lt;td width=&quot;100&quot; align=&quot;right&quot;&gt;31&lt;/SPAN&gt;&lt;SPAN style=&quot;float:static; text-align:left;&quot;&gt; &#x5EA6; &#xFF0C;&lt;/td&gt;&lt;/tr&gt;
                &lt;tr&gt;&lt;td&gt;&#x555F; &#x5FB7; &#x8DD1; &#x9053; &#x516C; &#x5712; &lt;/td&gt;&lt;td width=&quot;100&quot; align=&quot;right&quot;&gt;30&lt;/SPAN&gt;&lt;SPAN style=&quot;float:static; text-align:left;&quot;&gt; &#x5EA6; &#xFF0C;&lt;/td&gt;&lt;/tr&gt;
                &lt;tr&gt;&lt;td&gt;&#x5143; &#x6717; &#x516C; &#x5712; &lt;/td&gt;&lt;td width=&quot;100&quot; align=&quot;right&quot;&gt;31&lt;/SPAN&gt;&lt;SPAN style=&quot;float:static; text-align:left;&quot;&gt; &#x5EA6; &#x3002;&lt;/td&gt;&lt;/tr&gt;
        &lt;/table&gt;&lt;/font&gt;&lt;br/&gt;
    &lt;br/&gt;
    &#x4E0A; &#x5348; 7 &#x6642; 45 &#x5206;  &#x81F3; 8 &#x6642; 45 &#x5206;  &#xFF0C; &#x5404; &#x5340; &#x9304; &#x5F97; &#x96E8; &#x91CF; &#x5982; &#x4E0B; &#xFF1A;&lt;br/&gt;&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
    &lt;tr&gt;&lt;td&gt;&#x5317; &#x5340; &lt;/td&gt;&lt;td width=&quot;100&quot; align=&quot;right&quot;&gt;0 &#x81F3; 5 &#x6BEB; &#x7C73; &#xFF0C; 
    &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;&#x5C6F; &#x9580; &lt;/td&gt;&lt;td width=&quot;100&quot; align=&quot;right&quot;&gt;0 &#x81F3; 4 &#x6BEB; &#x7C73; &#xFF0C; 
    &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;&#x96E2; &#x5CF6; &#x5340; &lt;/td&gt;&lt;td width=&quot;100&quot; align=&quot;right&quot;&gt;0 &#x81F3; 4 &#x6BEB; &#x7C73; &#xFF0C; 
    &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;&#x5927; &#x57D4; &lt;/td&gt;&lt;td width=&quot;100&quot; align=&quot;right&quot;&gt;0 &#x81F3; 1 &#x6BEB; &#x7C73; &#x3002; 
    &lt;/td&gt;&lt;/tr&gt;
    &lt;/table&gt;&lt;br/&gt;
    &#x5F9E; &#x6628; &#x665A; &#x5348; &#x591C; &#x81F3; &#x4E0A; &#x5348; 9 &#x6642; &#xFF0C; &#x5929; &#x6587; &#x53F0; &#x9304; &#x5F97; &#x6700; &#x4F4E; &#x6C23; &#x6EAB; &#x70BA; 25.8 &#x5EA6; &#x3002;&lt;br/&gt;&lt;br/&gt;
]]&gt;
&lt;/description&gt;
</code></pre>
<p>&#x770B;&#x5230;&#x4E86;&#x55CE;&#xFF1F;XML &#x88CF;&#x662F;&#x4E00;&#x5927;&#x6BB5; HTML code&#xFF0C;&#x9084;&#x6709; css &#x5462;&#x3002;&#x82E5;&#x60F3;&#x5F9E;&#x4E2D;&#x627E;&#x5230;&#x7576;&#x5929;&#x5929;&#x6C23;&#x6EAB;&#x5EA6;&#xFF0C;&#x8981;&#x81EA;&#x5DF1;&#x7528; regex &#x62BD;&#x51FA;&#x4F86;&#x3002;&#x5176;&#x5BE6;&#x300A;&#x6211;&#x7684;&#x5929;&#x6587;&#x53F0;&#x300B;&#x8B80;&#x53D6;&#x7684;&#x4E5F;&#x662F;&#x683C;&#x5F0F;&#x597D;&#x7684;&#x8CC7;&#x6599;&#xFF0C;&#x8B49;&#x660E;&#x5929;&#x6587;&#x53F0;&#x662F;&#x7D55;&#x5C0D;&#x6709;&#x80FD;&#x529B;&#x767C;&#x653E;&#x65B9;&#x4FBF;&#x7A0B;&#x5F0F;&#x4F7F;&#x7528;&#x7684;&#x683C;&#x5F0F;&#xFF0C;&#x4F46;&#x70BA;&#x4EC0;&#x9EBC;&#x653E;&#x5728; data.gov.hk &#x8981;&#x4F7F;&#x7528;&#x9019;&#x7A2E;&#x6587;&#x5B57;&#x5F62;&#x5F0F;&#x4F86;&#xFF1F;&#x662F;&#x4E0D;&#x9F13;&#x52F5;&#x5176;&#x4ED6;&#x4EBA;&#x4F7F;&#x7528;&#xFF1F;&#x9084;&#x662F;&#x8981;&#x8981;&#x8FEB;&#x4EBA;&#x4F7F;&#x7528;&#x5B83;&#x7684; app &#x5462;&#xFF1F;</p>
<p>&#x958B;&#x767C;&#x300C;&#x9999;&#x6E2F;&#x5929;&#x6674;&#x300D;&#x6642;&#xFF0C;&#x6211;&#x672C;&#x60F3;&#x4F7F;&#x7528;&#x9019;&#x4E9B; RSS&#xFF0C;&#x7121;&#x5948;&#x9019;&#x4E9B;&#x8CC7;&#x6599;&#x6709;&#x7B49;&#x65BC;&#x7121;&#xFF0C;&#x6700;&#x5F8C;&#x4E5F;&#x8981;&#x81EA;&#x884C; scrape &#x7DB2;&#x7AD9;&#x8CC7;&#x6599;&#x53BB;&#x505A;&#xFF0C;&#x9019;&#x4E9B; RSS &#x5B8C;&#x5168;&#x6C92;&#x6709;&#x4EFB;&#x4F55;&#x5E6B;&#x52A9;&#x3002;</p>
<h2 id="app">&#x653F;&#x5E9C; app</h2>
<p>&#x8001;&#x5BE6;&#x8AAA;&#xFF0C;&#x653F;&#x5E9C;&#x51FA;&#x54C1;&#x7684; app &#xFF0C;&#x4E00;&#x5B9A;&#x6709;&#x5F88;&#x591A;&#x9650;&#x5236;&#x3002;&#x5148;&#x5929;&#x7684;&#x9650;&#x5236;&#x662F;&#xFF0C;&#x653F;&#x5E9C;&#x5FC5;&#x6709;&#x7ACB;&#x5834;&#xFF0C;&#x5FC5;&#x9808;&#x670D;&#x52D9;&#x5E02;&#x6C11;&#x3002;&#x5176;&#x6B21;&#x662F;&#x638C;&#x63E1;&#x751F;&#x6BBA;&#x5927;&#x6B0A;&#x8005;&#xFF0C;&#x5FC5;&#x70BA;&#x4E0A;&#x4E00;&#x4EE3;&#x7684;&#x9AD8;&#x5B98;&#x8001;&#x4EBA;&#xFF0C;&#x4ED6;&#x5011;&#x8F03;&#x96E3;&#x63A5;&#x53D7;&#x300C;&#x65B0;&#x4E8B;&#x7269;&#x300D;&#xFF0C;&#x666E;&#x904D;&#x5BB3;&#x6015;&#x51FA;&#x932F;&#xFF0C;&#x4E0D;&#x9858;&#x627F;&#x64D4;&#xFF0C;&#x9593;&#x63A5;&#x4EE4;&#x7A0B;&#x5F0F;&#x8A2D;&#x8A08;&#x8001;&#x820A;&#x4E4B;&#x9918;&#xFF0C;&#x4EA6;&#x4E0D;&#x6703;&#x5BE6;&#x7528;&#x3002;</p>
<p>&#x5F88;&#x591A;&#x653F;&#x5E9C;&#x7684; App &#x5982;&#x4EA4;&#x529F;&#x8AB2;&#xFF0C;&#x70BA;&#x505A;&#x800C;&#x505A;&#xFF0C;&#x6C92;&#x6709;&#x8003;&#x616E;&#x7528;&#x5BB6;&#x6709;&#x6C92;&#x6709;&#x6B64;&#x7B49;&#x9700;&#x6C42;&#x3002;&#x6709;&#x4E9B;&#x64C1;&#x6709;&#x300C;&#x82B1;&#x5DE7;&#x300D;&#x7684;&#x5916;&#x89C0;&#xFF0C;&#x9023;&#x6587;&#x5B57;&#x4E5F;&#x7531;&#x5716;&#x7247;&#x5806;&#x780C;&#xFF0C;&#x4F46;&#x537B;&#x6C92;&#x6709;&#x5BE6;&#x969B;&#x7684;&#x529F;&#x80FD;&#xFF0C;&#x53EA;&#x6D41;&#x65BC;&#x8868;&#x9762;&#x3002;&#x800C;&#x653F;&#x5E9C;&#x90E8;&#x9580;&#x9593;&#x5404;&#x81EA;&#x70BA;&#x653F;&#xFF0C;&#x672C;&#x4F86;&#x53EF;&#x4EE5;&#x7D71;&#x4E00;&#x5728;&#x540C;&#x4E00;&#x7A0B;&#x5F0F;&#x4E2D;&#x986F;&#x793A;&#x7684;&#x8CC7;&#x6599;&#xFF0C;&#x5F88;&#x591A;&#x6642;&#x9700;&#x8981;&#x5206;&#x958B;&#x5404;&#x81EA;&#x7684; app &#x4F86;&#x986F;&#x793A;&#xFF0C;&#x6D6A;&#x8CBB;&#x8CC7;&#x6E90;&#x3002;</p>
<p>&#x70BA;&#x4F55;&#x574A;&#x9593;&#x7684;&#x7A0B;&#x5F0F;&#xFF0C;&#x5F80;&#x5F80;&#x6BD4;&#x653F;&#x5E9C;&#x7684;&#x5B98;&#x8FD4;&#x7A0B;&#x5F0F;&#x66F4;&#x53D7;&#x89C0;&#x8FCE;&#xFF1F;&#x56E0;&#x70BA;&#x958B;&#x767C;&#x8457;&#x6703;&#x4EE5;&#x7528;&#x5BB6;&#x7684;&#x89D2;&#x5EA6;&#x51FA;&#x767C;&#xFF0C;&#x8F03;&#x6613;&#x63A5;&#x53D7;&#x65B0;&#x5F0F;&#x8A2D;&#x8A08;&#xFF0C;&#x6C92;&#x6709;&#x5B98;&#x50DA;&#x7684;&#x5305;&#x88B1;&#x3002;&#x82E5;&#x8B93;&#x6709;&#x8208;&#x8DA3;&#x7684;&#x4EBA;&#x6216;&#x516C;&#x53F8;&#x81EA;&#x884C;&#x958B;&#x767C;&#xFF0C;&#x57FA;&#x65BC;&#x4ED6;&#x5011;&#x6703;&#x4EE5;&#x5438;&#x5F15;&#x4EBA;&#x7528;&#x4F5C;&#x8CE3;&#x9EDE;&#xFF0C;&#x7A0B;&#x5F0F;&#x8A2D;&#x8A08;&#x7D55;&#x5C0D;&#x6BD4;&#x653F;&#x5E9C;&#x512A;&#x52DD;&#x3002;</p>
<p>&#x7576;&#x7136;&#xFF0C;&#x653F;&#x5E9C;&#x7684;&#x89D2;&#x8272;&#x4FBF;&#x6709;&#x5176;&#x529F;&#x7528;&#xFF1A;&#x67D0;&#x4E9B;&#x7A0B;&#x5F0F;&#x6839;&#x672C;&#x6C92;&#x6709;&#x4EBA;&#x9858;&#x610F;&#x958B;&#x767C; (&#x8868;&#x63DA;&#x4FE1; app , anyone? )&#xFF0C;&#x9019;&#x6642;&#x653F;&#x5E9C;&#x4FBF;&#x80FD;&#x586B;&#x88DC;&#x7A7A;&#x7F3A;&#x3002;</p>
<h2 id>&#x7E3D;&#x7D50;</h2>
<p>&#x653F;&#x5E9C;&#x4E0D;&#x662F;&#x8981;&#x5275;&#x9020;&#x5C31;&#x696D;&#x3001;&#x63A8;&#x52D5;&#x5275;&#x65B0;&#x7684;&#x55CE;&#xFF1F;&#x70BA;&#x4EC0;&#x9EBC;&#x9023;&#x98EF;&#x4E5F;&#x4E0D;&#x9858;&#x65BD;&#x6368;&#xFF0C;&#x4E0D;&#x9858;&#x7D66; data &#x8B93;&#x5E02;&#x6C11;&#x4F7F;&#x7528;&#xFF1F;&#x5C31;&#x771F;&#x7684;&#x9019;&#x9EBC;&#x6015;&#x51FA;&#x932F;&#x55CE;&#xFF1F;&#x9084;&#x662F;&#x6709;&#x5176;&#x4ED6;&#x653F;&#x6CBB;&#x8003;&#x616E;&#xFF1F;</p>
<p>&#x653F;&#x5E9C;&#x61C9;&#x8A72;&#x4E3B;&#x529B;&#x63D0;&#x4F9B;&#x6578;&#x64DA;&#xFF0C;&#x8B93;&#x5404;&#x65B9;&#x904B;&#x7528;&#x3002;&#x4E0D;&#x80FD;&#x56E0;&#x70BA;&#x6015;&#x81EA;&#x5DF1;&#x7684;&#x7A0B;&#x5F0F;&#x4F7F;&#x7528;&#x7387;&#x4F4E;&#xFF0C;&#x800C;&#x4E0D;&#x80AF;&#x958B;&#x653E;&#x3002;</p>
<p>&#x653F;&#x5E9C;&#x4F5C;&#x70BA;&#x8CC7;&#x6599;&#x63D0;&#x4F9B;&#x8005;&#x4F5C;&#x8DB3;&#x77E3;&#x3002;</p>
<h2 id>&#x76F8;&#x95DC;&#x9023;&#x7D50;</h2>
<ul>
<li><a href="https://data.gov.hk/tc">&#x8CC7;&#x6599;&#x4E00;&#x7DDA;&#x901A;</a></li>
<li><a href="https://opendatahk.com/">Open Data Hong Kong</a></li>
<li><a href="https://github.com/siuying/goodcops-letters">Good Cops - Visualize Hong Kong Police appreciation letters by region</a></li>
<li><a href="https://theinitium.com/article/20160606-taiwan-g0v/">&#x4E2D;&#x3001;&#x6E2F;&#x548C;&#x5916;&#x570B;&#x7684;&#x958B;&#x6E90;&#x904B;&#x52D5;&#x8005;&#xFF0C;&#x70BA;&#x4EC0;&#x9EBC;&#x7FA1;&#x6155;&#x53F0;&#x7063;&#xFF1F;</a></li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[五月讀書]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x4E94;&#x6708;&#x662F;&#x8F15;&#x5C0F;&#x8AAA;&#x6708;&#x3002;</p>
<hr>
<h2 id>&#x300A;&#x7A7A;&#x4E4B;&#x5883;&#x754C;&#x300B;&#x4E0A;&#x4E2D;&#x4E0B;&#x548C;&#x300A;&#x672A;&#x4F86;&#x798F;&#x97F3;&#x300B;- &#x5948;&#x9808;&#x8611;&#x83C7;</h2>
<p><img src="https://sparks-blog2.fly.dev/content/images/2016/06/void.jpg" alt loading="lazy"></p>
<p>&#x63CF;&#x8FF0;&#x9B54;&#x8853;&#x5E2B;&#x4E4B;&#x9593;&#x7684;&#x6545;&#x4E8B;&#x3002;&#x9B54;&#x8853;&#x8207;&#x9B54;&#x6CD5;&#x7684;&#x5340;&#x5225;&#x9817;&#x6709;</p>]]></description><link>https://sparks-blog2.fly.dev/book-read-in-may-2016/</link><guid isPermaLink="false">6344c7bf02c13c0211c7d2d1</guid><category><![CDATA[一星期一書]]></category><dc:creator><![CDATA[Ryan Leung]]></dc:creator><pubDate>Fri, 24 Jun 2016 01:47:24 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x4E94;&#x6708;&#x662F;&#x8F15;&#x5C0F;&#x8AAA;&#x6708;&#x3002;</p>
<hr>
<h2 id>&#x300A;&#x7A7A;&#x4E4B;&#x5883;&#x754C;&#x300B;&#x4E0A;&#x4E2D;&#x4E0B;&#x548C;&#x300A;&#x672A;&#x4F86;&#x798F;&#x97F3;&#x300B;- &#x5948;&#x9808;&#x8611;&#x83C7;</h2>
<p><img src="https://sparks-blog2.fly.dev/content/images/2016/06/void.jpg" alt loading="lazy"></p>
<p>&#x63CF;&#x8FF0;&#x9B54;&#x8853;&#x5E2B;&#x4E4B;&#x9593;&#x7684;&#x6545;&#x4E8B;&#x3002;&#x9B54;&#x8853;&#x8207;&#x9B54;&#x6CD5;&#x7684;&#x5340;&#x5225;&#x9817;&#x6709;&#x8033;&#x76EE;&#x4E00;&#x65B0;&#x7684;&#x611F;&#x89BA;&#x3002;</p>
<p>&#x611F;&#x89BA;&#x4F5C;&#x8005;&#x6709;&#x5B8F;&#x5927;&#x7684;&#x4E16;&#x754C;&#x89C0;&#xFF0C;&#x96D6;&#x7136;&#x4F5C;&#x8005;&#x6C92;&#x6709;&#x63CF;&#x5BEB;&#xFF0C;&#x4F46;&#x6BCF;&#x500B;&#x4EBA;&#x4E5F;&#x6709;&#x8A73;&#x7D30;&#x7684;&#x8A2D;&#x5B9A;&#x548C;&#x6B77;&#x53F2;&#xFF0C;&#x4F3C;&#x4E4E;&#x6703;&#x6709;&#x4F77;&#x591A;&#x5916;&#x50B3;&#x6216;&#x4EE5;&#x6B64;&#x4E16;&#x754C;&#x70BA;&#x57FA;&#x790E;&#x7684;&#x5176;&#x4ED6;&#x6545;&#x4E8B;&#x3002;</p>
<p>&#x4F5C;&#x8005;&#x7684;&#x5BEB;&#x4F5C;&#x624B;&#x6CD5;&#x6709;&#x9EDE;&#x300C;&#x5947;&#x7279;&#x300D;&#xFF0C;&#x7D93;&#x5E38;&#x52A0;&#x5165;&#x63D2;&#x654D;&#xFF0C;&#x6709;&#x6642;&#x5F88;&#x96E3; follow &#x3002;&#x96D6;&#x7136;&#x53EF;&#x4EE5;&#x8996;&#x70BA;&#x662F;&#x4E0D;&#x540C;&#x7684;&#x55AE;&#x5143;&#x6545;&#x4E8B;&#xFF0C;&#x4F46;&#x5404;&#x6545;&#x4E8B;&#x7684;&#x6392;&#x5E8F;&#x4E0D;&#x662F;&#x6309;&#x8457;&#x767C;&#x751F;&#x6642;&#x9593;&#x6392;&#x7684;&#xFF0C;&#x7D50;&#x679C;&#x505A;&#x6210;&#x6DF7;&#x4E82;&#xFF0C;&#x3002;</p>
<p>&#x6574;&#x9AD4;&#x4F86;&#x8AAA;&#xFF0C;&#x6545;&#x4E8B;&#x92EA;&#x6392;&#x4E0D;&#x932F;&#xFF0C;&#x4E16;&#x754C;&#x8A2D;&#x5B9A;&#x6709;&#x8DA3;&#xFF0C;&#x5287;&#x60C5;&#x6709;&#x6642;&#x8981;&#x82B1;&#x9EDE;&#x6642;&#x9593;&#x7406;&#x89E3;&#xFF0C;&#x4F46;&#x7D55;&#x5C0D;&#x503C;&#x5F97;&#x3002;</p>
<h2 id="gonegirlgilianflynn">&#x300A;Gone Girl&#x300B;- Gilian Flynn</h2>
<p><img src="https://sparks-blog2.fly.dev/content/images/2016/06/gone_girl.jpg" alt loading="lazy"></p>
<p>&#x4E00;&#x958B;&#x59CB;&#x662F;&#x61F8;&#x7591;&#x6545;&#x4E8B;&#xFF0C;&#x524D;&#x534A;&#x90E8;&#x4EFD;&#x5BEB;&#x5F97;&#x4E0D;&#x932F;&#xFF0C;&#x80FD;&#x5E36;&#x51FA;&#x61F8;&#x7591;&#x548C;&#x7DCA;&#x5F35;&#x7684;&#x6C23;&#x6C1B;&#x3002;&#x4F46;&#x53BB;&#x5230;&#x5F8C;&#x534A;&#x90E8;&#xFF0C;&#x63ED;&#x9732;&#x539F;&#x56E0;&#x5F8C;&#xFF0C;&#x8B8A;&#x6210;&#x62D6;&#x6232;&#x3002;&#x96D6;&#x7136;&#x4E4B;&#x524D;&#x7684;&#x92EA;&#x6392;&#x4E00;&#x500B;&#x4E00;&#x500B;&#x5C55;&#x958B;&#xFF0C;&#x4F46;&#x9084;&#x662F;&#x4E0D;&#x5920;&#x7DCA;&#x6E4A;&#x3002;</p>
<p>&#x6700;&#x5F8C;&#x4F3C;&#x4E4E;&#x60F3;&#x5BEB;&#x6210;&#x9B25;&#x667A;&#x9B25;&#x529B;&#x7684;&#x60C5;&#x7BC0;&#xFF0C;&#x53EF;&#x60DC;&#x6545;&#x4E8B;&#x57FA;&#x672C;&#x4E0A;&#x5B9A;&#x5F62;&#xFF0C;&#x7BC7;&#x5E45;&#x4E5F;&#x592A;&#x5C11;&#xFF0C;&#x6C92;&#x8FA6;&#x6CD5;&#x8F49;&#x8B8A;&#x3002;</p>
<p>&#x8001;&#x5BE6;&#x8AAA;&#x7D50;&#x5C40;&#x6709;&#x9EDE;&#x610F;&#x6599;&#x4E4B;&#x5916;&#xFF0C;&#x539F;&#x4F86;&#x4E00;&#x65E9;&#x5DF2;&#x6709;&#x92EA;&#x6392;&#x3002;&#x4E0D;&#x904E;&#x6BD4;&#x8D77;&#x300C;&#x610F;&#x5916;&#x7684;&#x7D50;&#x5C40;&#x300D; &#xFF0C;&#x300C;&#x7D42;&#x65BC;&#x8B80;&#x5B8C;&#x4E86;&#x300D;&#x66F4;&#x4EE4;&#x6211;&#x9AD8;&#x8208;&#x3002;&#x771F;&#x662F;&#x610F;&#x60F3;&#x4E0D;&#x5230;&#x554A;&#x3002;</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Gradle 與不同 buildTypes]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x82E5;&#x60F3;&#x540C;&#x6642;&#x5B89;&#x88DD; development &#x7248;&#x672C;&#x548C; production &#x7248;&#x672C;&#x5230;&#x540C;&#x4E00;&#x7684; Android &#x6A5F;&#x4E0A;&#xFF0C;&#x61C9;&#x5982;&#x4F55;&#x505A;&#xFF1F;</p>
<p>&#x56E0;&#x70BA; <code>applicationId</code> &#x76F8;&#x540C;&#xFF0C;&#x4E0D;&#x80FD;&#x540C;&#x6642;&#x5B89;&#x88DD;&#x5169;&#x7A2E;&#x7248;&#x672C;&#x3002;&#x60F3;&#x7528;&#x4E00;&#x500B; overwrite &#x53E6;&#x4E00;</p>]]></description><link>https://sparks-blog2.fly.dev/gradle-and-different-build-types/</link><guid isPermaLink="false">6344c7bf02c13c0211c7d2d0</guid><category><![CDATA[android dev]]></category><dc:creator><![CDATA[Ryan Leung]]></dc:creator><pubDate>Tue, 14 Jun 2016 01:00:22 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x82E5;&#x60F3;&#x540C;&#x6642;&#x5B89;&#x88DD; development &#x7248;&#x672C;&#x548C; production &#x7248;&#x672C;&#x5230;&#x540C;&#x4E00;&#x7684; Android &#x6A5F;&#x4E0A;&#xFF0C;&#x61C9;&#x5982;&#x4F55;&#x505A;&#xFF1F;</p>
<p>&#x56E0;&#x70BA; <code>applicationId</code> &#x76F8;&#x540C;&#xFF0C;&#x4E0D;&#x80FD;&#x540C;&#x6642;&#x5B89;&#x88DD;&#x5169;&#x7A2E;&#x7248;&#x672C;&#x3002;&#x60F3;&#x7528;&#x4E00;&#x500B; overwrite &#x53E6;&#x4E00;&#x500B;&#xFF0C;&#x4EE5;&#x4FBF;&#x4FDD;&#x7559; setting &#x55CE;&#xFF1F;&#x4F46;&#x56E0;&#x70BA; certificate &#x4E0D;&#x540C;&#xFF0C;Android &#x898F;&#x5B9A;&#x5FC5;&#x9808;&#x522A;&#x6389;&#x91CD;&#x88DD;&#x3002;&#x6253;&#x7B97;&#x81EA;&#x5DF1;&#x6539; application Id &#x55CE;&#xFF1F;&#x62B1;&#x6B49;&#xFF0C;&#x5FC5;&#x9808;&#x9023; package &#x540D;&#x4E00;&#x8D77;&#x6539;&#xFF0C;&#x5929;&#x77E5;&#x9053;&#x6703;&#x4E0D;&#x6703;&#x505A;&#x6210;&#x66F4;&#x591A;&#x554F;&#x984C;&#x554A;&#x3002;</p>
<h2 id="buildtypes"><code>buildTypes</code></h2>
<p>&#x73FE;&#x5728;&#x6709; gradle &#xFF0C;&#x6211;&#x5011;&#x53EF;&#x4EE5;&#x7C21;&#x55AE;&#x505A;&#x5230;&#x3002;&#x5728; debug <code>buildTypes</code> &#x52A0;&#x9032; <code>applicationIdSuffix</code> &#x548C; <code>versionNameSuffix</code> &#x4FBF;&#x6703;&#x81EA;&#x52D5;&#x4FEE;&#x6539; debug build &#x7684; <code>applicationId</code>&#x3002;</p>
<pre><code>android {
    ...


    defaultConfig {
        minSdkVersion 8
        versionCode 10
    }

    buildTypes {
        debug {
            applicationIdSuffix &apos;.debug&apos;
            versionNameSuffix &apos;-SNAPSHOT&apos;
        }

        release {
            proguardFiles getDefaultProguardFile(&apos;proguard-android.txt&apos;), &apos;proguard-rules.pro&apos;
        }
    }
}
</code></pre>
<p>&#x9019;&#x6A23;&#x4FBF;&#x53EF;&#x4EE5;&#x540C;&#x6642;&#x88DD; production &#x548C; debug &#x7248;&#x4E86;&#x3002;</p>
<figure>
![Two apps](/content/images/2016/06/two_apps.png)
<figcaption>&#x540C;&#x6642;&#x5B89;&#x88DD; Release &#x548C; Debug &#x7248;</figcaption>
</figure>
<h2 id="googlecloudservice">Google Cloud Service &#x932F;&#x8AA4;</h2>
<p>&#x5982;&#x679C;&#x6709;&#x4F7F;&#x7528; GCM&#xFF0C;&#x5728;&#x5B89;&#x88DD;&#x6642;&#x6703;&#x6709;&#x4EE5;&#x4E0B;&#x932F;&#x8AA4;&#xFF1A;</p>
<pre><code>Failure [INSTALL_FAILED_DUPLICATE_PERMISSION perm=com.mysuperapp.app1.permission.C2D_MESSAGE pkg=com.mysuperapp.app1]
</code></pre>
<p>&#x9019;&#x662F;&#x56E0;&#x70BA; <code>AndroidManifest.xml</code> &#x4E2D;&#x6709;&#x4EE5;&#x4E0B; permission</p>
<pre><code>&lt;permission android:name=&quot;com.thirtysparks.sunny.permission.C2D_MESSAGE&quot; android:protectionLevel=&quot;signature&quot; /&gt;
&lt;uses-permission android:name=&quot;com.thirtysparks.sunny.permission.C2D_MESSAGE&quot; /&gt;
</code></pre>
<p>Release &#x548C; debug &#x7248;&#x672C;&#x90FD;&#x4F7F;&#x7528;&#x4E86;&#x540C;&#x4E00; permission &#xFF0C;&#x6240;&#x4EE5;&#x6709; error &#x3002;&#x89E3;&#x6C7A;&#x65B9;&#x6CD5;&#x5F88;&#x7C21;&#x55AE;&#xFF0C;&#x4F7F;&#x7528; <code>${applicationId}</code> &#x4EE3;&#x66FF;&#x4F60;&#x7684; package name &#x4FBF;&#x53EF;&#x3002;</p>
<pre><code>&lt;permission android:name=&quot;${applicationId}.permission.C2D_MESSAGE&quot; android:protectionLevel=&quot;signature&quot; /&gt;
&lt;uses-permission android:name=&quot;${applicationId}.permission.C2D_MESSAGE&quot; /&gt;
</code></pre>
<p>&#x82E5;&#x6709;&#x4F7F;&#x7528; <code>&lt;provider&gt;</code> &#x7684;&#x4E5F;&#x662F;&#x540C;&#x4E00;&#x89E3;&#x6C7A;&#x65B9;&#x6CD5;&#x3002;</p>
<h2 id>&#x4E0D;&#x540C;&#x5716;&#x793A;&#x548C;&#x540D;&#x7A31;</h2>
<p>&#x4E0D;&#x904E; Release &#x548C; debug build &#x7684;&#x540D;&#x7A31;&#x548C;&#x5716;&#x793A;&#x4E00;&#x6A23;&#xFF0C;&#x73FE;&#x5728;&#x5206;&#x4E0D;&#x6E05;&#x90A3;&#x500B;&#x624D;&#x662F; release &#x90A3;&#x500B;&#x624D;&#x662F; debug &#x7248;&#xFF0C;&#x600E;&#x8FA6;&#xFF1F;&#x5E78;&#x597D;&#xFF0C;Gradle &#x4E5F;&#x6709;&#x65B9;&#x6CD5;&#x89E3;&#x6C7A;&#x3002;</p>
<p>&#x4E0D;&#x540C;&#x7684; <code>buildType</code> &#x6709;&#x5176;&#x81EA;&#x5BB6;&#x7684; source directory&#x3002;Release build &#x7684; source files &#x6703;&#x653E;&#x5728; <code>/app/src/main</code>&#x3002;Debug build &#x7684; directory &#x5247;&#x662F; <code>/app/src/debug/</code>&#x3002;&#x5728; build &#x4E0D;&#x540C; <code>buildType</code> &#x6642;&#xFF0C;Gradle &#x6703;&#x7528;&#x5176;&#x6240;&#x5C6C;&#x7684; directory &#x53BB;&#x53D6;&#x4EE3;&#x76F8;&#x95DC;&#x8CC7;&#x6599;&#x3002;</p>
<p>&#x4F8B;&#x5982;&#x6211;&#x5011;&#x60F3;&#x6539; launcher icons&#xFF0C;&#x6211;&#x5011;&#x53EF;&#x4EE5;&#x5728; <code>app/src/debug</code> &#x4E0B;&#x65B0;&#x589E; <code>res/mipmap-hdpi</code>&#xFF0C;&#x5982;&#x4E0B;&#xFF1A;</p>
<p><img src="https://sparks-blog2.fly.dev/content/images/2016/06/directory.jpg" alt="Directory List" loading="lazy"></p>
<p>&#x518D;&#x5C07;&#x65B0; icons &#x653E;&#x9032;&#x53BB;&#xFF0C;&#x9019;&#x6A23; debug build &#x4FBF;&#x6703;&#x6709;&#x81EA;&#x5DF1;&#x7684; icons&#xFF01;</p>
<p>&#x4E5F;&#x53EF;&#x653E;&#x65B0;&#x7684; <code>strings.xml</code> &#x5728; <code>app/src/debug/res/values/</code> &#x4E0B;&#xFF0C;&#x52A0;&#x9032;&#x65B0;&#x7684; <code>app_name</code>&#xFF0C;&#x9019;&#x6A23;&#x4FBF;&#x6703;&#x6709;&#x4E0D;&#x540C;&#x7684;&#x7A0B;&#x5F0F;&#x540D;&#x7A31;&#x3002;</p>
<figure>
![New icons - Debug builds](/content/images/2016/06/two_apps_new_icons.png)
<figcaption>Debug build &#x7684;&#x65B0;&#x5716;&#x793A;&#x548C;&#x540D;&#x7A31;</figcaption>
</figure>
<h2 id>&#x5F8C;&#x8A71;</h2>
<p>&#x82E5;&#x4F60;&#x7684;&#x7A0B;&#x5F0F;&#x6709;&#x5206; demo &#x548C; professional &#x7248;&#x672C;&#xFF0C;&#x4E5F;&#x53EF;&#x900F;&#x904E;&#x4EE5;&#x4E0A;&#x65B9;&#x6CD5;&#xFF0C;&#x7C21;&#x55AE;&#x751F;&#x6210;&#x5169;&#x500B;&#x4E0D;&#x540C;&#x7684; apk&#x3002;Gradle &#x9084;&#x6709;&#x5176;&#x4ED6;&#x5F37;&#x5927;&#x7684;&#x529F;&#x80FD;&#xFF0C;&#x5927;&#x5BB6;&#x53EF;&#x4EE5;&#x7814;&#x7A76;&#x4E00;&#x4E0B;&#x518D;&#x5206;&#x4EAB;&#x3002;</p>
<h2 id>&#x76F8;&#x95DC;&#x9023;&#x7D50;</h2>
<ul>
<li><a href="http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Product-flavors">Gradle Plugin User Guide</a></li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[四月讀書]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x56DB;&#x6708;&#x7684;&#x8B80;&#x66F8;&#x5831;&#x544A;&#x8981;&#x5BEB;&#x5230;&#x516D;&#x6708;&#x624D;&#x5BEB;&#x5B8C;&#xFF0C;&#x771F;&#x615A;&#x6127;&#x3002;</p>
<hr>
<h2 id="thefirstfifteenlivesofharryaugust">&#x300A;The First Fifteen Lives of Harry August&#x300B;</h2>
<p><a href="https://sparks-blog2.fly.dev/the-first-fifteen-lives-of-harry-august/">&#x300A;The First Fifteen Lives of Harry August&#x300B;&#x8B80;&#x5F8C;&#x611F;</a></p>
<h2 id="9">&#x300A;&#x9280;&#x6CB3;&#x82F1;&#x96C4;&#x50B3;&#x8AAA;&#x300B;&#x5377;</h2>]]></description><link>https://sparks-blog2.fly.dev/book-read-in-april-2016/</link><guid isPermaLink="false">6344c7bf02c13c0211c7d2cd</guid><category><![CDATA[一星期一書]]></category><dc:creator><![CDATA[Ryan Leung]]></dc:creator><pubDate>Wed, 01 Jun 2016 01:01:29 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x56DB;&#x6708;&#x7684;&#x8B80;&#x66F8;&#x5831;&#x544A;&#x8981;&#x5BEB;&#x5230;&#x516D;&#x6708;&#x624D;&#x5BEB;&#x5B8C;&#xFF0C;&#x771F;&#x615A;&#x6127;&#x3002;</p>
<hr>
<h2 id="thefirstfifteenlivesofharryaugust">&#x300A;The First Fifteen Lives of Harry August&#x300B;</h2>
<p><a href="https://sparks-blog2.fly.dev/the-first-fifteen-lives-of-harry-august/">&#x300A;The First Fifteen Lives of Harry August&#x300B;&#x8B80;&#x5F8C;&#x611F;</a></p>
<h2 id="9">&#x300A;&#x9280;&#x6CB3;&#x82F1;&#x96C4;&#x50B3;&#x8AAA;&#x300B;&#x5377; 9 - &#x7530;&#x4E2D;&#x82B3;&#x6A39;</h2>
<p>&#x50B2;&#x6C23;&#x8207;&#x53DB;&#x4E82;</p>
<h2 id="10">&#x300A;&#x9280;&#x6CB3;&#x82F1;&#x96C4;&#x50B3;&#x8AAA;&#x300B;&#x5377; 10 - &#x7530;&#x4E2D;&#x82B3;&#x6A39;</h2>
<p>&#x9BAE;&#x8840;&#xFF0C;&#x7D42;&#x7109;</p>
<h2 id="themartianandyweir">&#x300A;The Martian&#x300B;- Andy Weir</h2>
<p><a href="https://sparks-blog2.fly.dev/the-martian/">&#x300A;The Martian&#x300B;&#x8B80;&#x5F8C;&#x611F;</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[讀後感：《The Martian》- Andy Weir]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x4E3B;&#x89D2;&#x56E0;&#x610F;&#x5916;&#x88AB;&#x7559;&#x5728;&#x706B;&#x661F;&#xFF0C;&#x8981;&#x5728;&#x50C5;&#x6709;&#x7684;&#x8CC7;&#x6E90;&#x4E0B;&#x751F;&#x5B58;&#x56DB;&#x5E74;&#xFF0C;&#x624D;&#x6709;&#x6A5F;&#x6703;&#x7372;&#x6551;&#x3002;&#x6C27;&#x6C23;&#x3001;&#x98DF;&#x7269;&#x3001;&#x6C34;&#x3001;&#x88DD;&#x5099;&#xFF0C;&#x7F3A;&#x5C11;&#x4EFB;&#x4F55;&#x4E00;&#x6A23;&#x90FD;&#x6703;</p>]]></description><link>https://sparks-blog2.fly.dev/the-martian/</link><guid isPermaLink="false">6344c7bf02c13c0211c7d2cf</guid><category><![CDATA[一星期一書]]></category><dc:creator><![CDATA[Ryan Leung]]></dc:creator><pubDate>Tue, 31 May 2016 02:15:40 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x4E3B;&#x89D2;&#x56E0;&#x610F;&#x5916;&#x88AB;&#x7559;&#x5728;&#x706B;&#x661F;&#xFF0C;&#x8981;&#x5728;&#x50C5;&#x6709;&#x7684;&#x8CC7;&#x6E90;&#x4E0B;&#x751F;&#x5B58;&#x56DB;&#x5E74;&#xFF0C;&#x624D;&#x6709;&#x6A5F;&#x6703;&#x7372;&#x6551;&#x3002;&#x6C27;&#x6C23;&#x3001;&#x98DF;&#x7269;&#x3001;&#x6C34;&#x3001;&#x88DD;&#x5099;&#xFF0C;&#x7F3A;&#x5C11;&#x4EFB;&#x4F55;&#x4E00;&#x6A23;&#x90FD;&#x6703;&#x4EE4;&#x4EBA;&#x6B7B;&#x4EA1;&#x3002;&#x6191;&#x8457;&#x50C5;&#x6709;&#x7684;&#x8CC7;&#x6E90;&#xFF0C;&#x4E3B;&#x89D2;&#x514B;&#x670D;&#x4E86;&#x98DF;&#x7269;&#x3001;&#x6C34;&#x3001;&#x901A;&#x8A0A;&#x7B49;&#x554F;&#x984C;&#x3002;&#x53EF;&#x60DC;&#x5927;&#x81EA;&#x7136;&#x975E;&#x5E38;&#x6B98;&#x9177;&#xFF0C;&#x4E0D;&#x65B7;&#x7684;&#x627E;&#x6A5F;&#x6703;&#x6BBA;&#x6389;&#x4E3B;&#x89D2;.....</p>
<p><img src="https://sparks-blog2.fly.dev/content/images/2016/05/The_Martian_2014.jpg" alt="The Martian" loading="lazy"></p>
<p>&#x300A;The Martian&#x300B;&#x539F;&#x672C;&#x662F;&#x7DB2;&#x7D61;&#x5C0F;&#x8AAA;&#xFF0C;&#x60F3;&#x4E0D;&#x5230;&#x653E;&#x4E86;&#x5728; Amazon &#x5F8C;&#x7ADF;&#x7136;&#x6162;&#x6162;&#x7684;&#x5927;&#x53D7;&#x6B61;&#x8FCE;&#xFF0C;&#x751A;&#x81F3;&#x88AB;&#x6539;&#x7DE8;&#x6210;&#x96FB;&#x5F71;&#x3002;&#x5728;&#x770B;&#x4E86;&#x982D;&#x5169;&#x7AE0; sample &#x5F8C;&#xFF0C;&#x6211;&#x6C7A;&#x5B9A;&#x8CB7;&#x4F86;&#x770B;&#x4E86;&#x3002;</p>
<p>&#x5728;&#x8DDF;&#x5730;&#x7403;&#x5B8C;&#x5168;&#x4E0D;&#x540C;&#x7684;&#x706B;&#x661F;&#xFF0C;&#x6C92;&#x6709;&#x8CC7;&#x6E90;&#xFF0C;&#x6C92;&#x6709;&#x7A7A;&#x6C23;&#xFF0C;&#x6C92;&#x6709;&#x98DF;&#x7269;&#x3002;&#x5982;&#x4F55;&#x5728;&#x4EC0;&#x9EBC;&#x4E5F;&#x6C92;&#x6709;&#x7684;&#x706B;&#x661F;&#x7368;&#x81EA;&#x4E00;&#x4EBA;&#x751F;&#x5B58;&#x56DB;&#x5E74;&#xFF1F;&#x5E78;&#x597D;&#x4ED6;&#x53EA;&#x662F;&#x4E00;&#x500B;&#x4EBA;&#xFF0C;&#x554F;&#x984C;&#x8B8A;&#x5F97;&#x76F8;&#x5C0D;&#x300C;&#x5BB9;&#x6613;&#x300D;&#x89E3;&#x6C7A;&#xFF1B;&#x5E78;&#x597D;&#x4E3B;&#x89D2;&#x662F;&#x4E00;&#x500B;&#x5DE5;&#x7A0B;&#x5E2B;&#x592A;&#x7A7A;&#x4EBA;&#xFF0C;&#x4ED6;&#x64C1;&#x6709;&#x8DB3;&#x5920;&#x7684;&#x77E5;&#x8B58;&#x53BB;&#x89E3;&#x6C7A;&#x554F;&#x984C;&#xFF1B;&#x4E5F;&#x5E78;&#x597D;&#x4ED6;&#x662F;&#x4E3B;&#x89D2;&#xFF0C;&#x4ED6;&#x6709;&#x4E3B;&#x89D2;&#x5149;&#x74B0;&#x3002;</p>
<p>&#x4E3B;&#x89D2;&#x9047;&#x5230;&#x7684;&#x554F;&#x984C;&#xFF0C;&#x975E;&#x5E38;&#x300C;&#x5BE6;&#x969B;&#x300D;&#x3002;&#x5982;&#x4F55;&#x586B;&#x88DC;&#x4EBA;&#x9AD4;&#x6BCF;&#x5929;&#x6240;&#x9700;&#x591A;&#x5C11;&#x7684;&#x80FD;&#x91CF;&#xFF0C;&#x5982;&#x4F55;&#x751F;&#x7522;&#x8DB3;&#x5920;&#x7684;&#x6C34;&#xFF0C;&#x5982;&#x4F55;&#x7A2E;&#x690D;&#x690D;&#x7269;&#x3002;&#x7576;&#x4E2D;&#x9700;&#x8981;&#x7684;&#x5316;&#x5B78;&#x539F;&#x6599;&#x53CA;&#x53CD;&#x61C9;&#xFF0C;&#x63CF;&#x5BEB;&#x5F97;&#x975E;&#x5E38;&#x8A73;&#x76E1;&#x3002;&#x4F5C;&#x8005;&#x5728;&#x5F8C;&#x8A18;&#x63D0;&#x53CA;&#xFF0C;&#x4ED6;&#x672C;&#x8EAB;&#x662F;&#x5F88;&#x559C;&#x6B61;&#x7814;&#x7A76;&#x9019;&#x985E;&#x6578;&#x64DA;&#xFF0C;&#x9592;&#x6687;&#x6642;&#x7D93;&#x5E38;&#x8A2D;&#x8A08;&#x9019;&#x985E;&#x300C;&#x5916;&#x661F;&#x4EFB;&#x52D9;&#x300D;&#xFF0C;&#x7136;&#x5F8C;&#x8A08;&#x7B97;&#x6240;&#x9700;&#x8CC7;&#x6E90;&#x7269;&#x6599;&#x7B49;&#x81EA;&#x5A1B;&#xFF0C;&#x6240;&#x4EE5;&#x6545;&#x4E8B;&#x60C5;&#x7BC0;&#x8B80;&#x8D77;&#x4F86;&#x7570;&#x5E38;&#x771F;&#x5BE6;&#x3002;</p>
<p>&#x76F8;&#x6BD4;&#x8D77;&#x9019;&#x4E9B;&#x300C;&#x5147;&#x96AA;&#x300D;&#x60C5;&#x7BC0;&#xFF0C;&#x611F;&#x60C5;&#x90E8;&#x4EFD;&#x5247;&#x975E;&#x5E38;&#x6B20;&#x7F3A;&#x3002;&#x4E3B;&#x89D2;&#x7368;&#x81EA;&#x4E00;&#x4EBA;&#x5728;&#x706B;&#x661F;&#x4E0A;&#x751F;&#x6D3B;&#xFF0C;&#x5FC3;&#x5883;&#x4F3C;&#x4E4E;&#x8D85;&#x5805;&#x5B9A;&#xFF0C;&#x6C92;&#x6709;&#x4EFB;&#x4F55; emotional break down &#x4E4B;&#x985E;&#x3002;&#x5728;&#x5916;&#x661F;&#x4E2D;&#x5B64;&#x7368;&#x4E00;&#x4EBA;&#x4E5F;&#x80FD;&#x5982;&#x6B64;&#xFF0C;&#x96E3;&#x9053;&#x592A;&#x7A7A;&#x4EBA;&#x771F;&#x7684;&#x662F;&#x5343;&#x6311;&#x7D30;&#x9078;&#x3001;&#x842C;&#x4E2D;&#x7121;&#x4E00;&#xFF1F;&#x4E0D;&#x904E;&#x9019;&#x4E5F;&#x6C92;&#x6709;&#x8FA6;&#x6CD5;&#xFF0C;&#x56E0;&#x70BA;&#x4E3B;&#x89D2;&#x53EA;&#x6709;&#x81EA;&#x5DF1;&#x4E00;&#x500B;&#xFF0C;&#x6C92;&#x6709;&#x4ED6;&#x5C31;&#x6C92;&#x6232;&#x5531;&#x4E86;&#x3002;</p>
<p>&#x66F8;&#x4E00;&#x958B;&#x59CB;&#x4EE5;&#x300C;&#x4EFB;&#x52D9;&#x8A18;&#x9304;&#x300D;&#x5F62;&#x5F0F;&#x5BEB;&#x6210;&#xFF0C;&#x662F;&#x81EA;&#x5DF1;&#x4E00;&#x500B;&#x4EBA;&#x7684;&#x81EA;&#x767D;&#xFF0C;&#x9084;&#x4EE5;&#x70BA;&#x6703;&#x4E00;&#x76F4;&#x90FD;&#x6703;&#x5982;&#x6B64;&#x3002;&#x4F46;&#x5E7E;&#x7AE0;&#x5F8C;&#x537B;&#x6539;&#x70BA;&#x7B2C;&#x4E09;&#x8EAB;&#x63CF;&#x8FF0;&#xFF0C;&#x9084;&#x4EE5;&#x70BA;&#x4F5C;&#x8005;&#x80FD;&#x4EE5;&#x7B2C;&#x4E00;&#x8EAB;&#x5BEB;&#x6574;&#x500B;&#x5287;&#x60C5;&#x51FA;&#x4F86;&#x5462;&#x3002;</p>
<p>&#x6B64;&#x66F8;&#x4EA6;&#x5DF2;&#x6539;&#x7DE8;&#x6210;&#x96FB;&#x5F71;&#x3002;&#x6C92;&#x6709;&#x4E86;&#x90A3;&#x4E9B;&#x6578;&#x64DA;&#x7D30;&#x7BC0;&#xFF0C;&#x800C;&#x4E14;&#x5F8C;&#x534A;&#x90E8;&#x4EFD;&#x5C11;&#x4E86;&#x4E00;&#x4E9B;&#x4E3B;&#x89D2;&#x9047;&#x5230;&#x7684;&#x5147;&#x96AA;&#xFF0C;&#x4F46;&#x6574;&#x9AD4;&#x4ECD;&#x7136;&#x4E0D;&#x932F;&#xFF0C;&#x975E;&#x5E38;&#x96E3;&#x5F97;&#x3002;&#x6545;&#x4E8B;&#x6700;&#x5F8C;&#x62EF;&#x6551;&#x7684;&#x4E00;&#x90E8;&#x4EFD;&#x8DDF;&#x5C0F;&#x8AAA;&#x4E0D;&#x540C;&#xFF0C;&#x5C0F;&#x8AAA;&#x66FE;&#x63D0;&#x53CA;&#x90A3;&#x62EF;&#x6551;&#x65B9;&#x6CD5;&#xFF0C;&#x4F46;&#x4F3C;&#x4E4E;&#x771F;&#x7684;&#x662F;&#x6C92;&#x6709;&#x6A5F;&#x6703;&#x6210;&#x529F;&#xFF0C;&#x4E0D;&#x904E;&#x6211;&#x4E5F;&#x627F;&#x8A8D;&#xFF0C;&#x7528; Ironman &#x65B9;&#x5F0F;&#x53BB;&#x7D50;&#x5C3E;&#x771F;&#x7684;&#x66F4;&#x7DCA;&#x5F35;&#x523A;&#x6FC0;&#x3002;</p>
<p>&#x63A8;&#x85A6;&#x3002;</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[讀後感：《The First Fifteen Lives of Harry August》 - Claire North]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x4E3B;&#x89D2; Harry August &#x662F;&#x4E00;&#x500B; kalachakra&#xFF0C;&#x5247;&#x6B7B;&#x5F8C;&#x6703;&#x91CD;&#x65B0;&#x56DE;&#x5230;&#x51FA;&#x751F;&#x6642;&#x7684;&#x4EBA;&#xFF0C;&#x6BCF;&#x6B21;&#x4E00;&#x6B7B;&#x6389;&#xFF0C;&#x4FBF;&#x6703;&#x4FDD;&#x7559;&#x8457;&#x300C;&#x524D;&#x751F;&#x300D;&#x7684;&#x8A18;&#x61B6;&#xFF0C;&#x56DE;&#x5230;&#x51FA;&#x751F;&#x7684;&#x6642;&#x5019;&#xFF0C;</p>]]></description><link>https://sparks-blog2.fly.dev/the-first-fifteen-lives-of-harry-august/</link><guid isPermaLink="false">6344c7bf02c13c0211c7d2ce</guid><category><![CDATA[一星期一書]]></category><dc:creator><![CDATA[Ryan Leung]]></dc:creator><pubDate>Fri, 27 May 2016 07:37:07 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x4E3B;&#x89D2; Harry August &#x662F;&#x4E00;&#x500B; kalachakra&#xFF0C;&#x5247;&#x6B7B;&#x5F8C;&#x6703;&#x91CD;&#x65B0;&#x56DE;&#x5230;&#x51FA;&#x751F;&#x6642;&#x7684;&#x4EBA;&#xFF0C;&#x6BCF;&#x6B21;&#x4E00;&#x6B7B;&#x6389;&#xFF0C;&#x4FBF;&#x6703;&#x4FDD;&#x7559;&#x8457;&#x300C;&#x524D;&#x751F;&#x300D;&#x7684;&#x8A18;&#x61B6;&#xFF0C;&#x56DE;&#x5230;&#x51FA;&#x751F;&#x7684;&#x6642;&#x5019;&#xFF0C;&#x518D;&#x6B21;&#x7D93;&#x6B77;&#x4E00;&#x751F;&#x3002;&#x7B2C;&#x4E00;&#x6B21;&#x91CD;&#x751F;&#x6642;&#xFF0C;&#x4E3B;&#x89D2;&#x4EE5;&#x70BA;&#x81EA;&#x5DF1;&#x760B;&#x4E86;&#xFF0C;&#x7D50;&#x679C;&#x5165;&#x4E86;&#x7CBE;&#x795E;&#x75C5;&#x9662;&#x518D;&#x81EA;&#x6BBA;&#x3002;&#x7B2C;&#x4E8C;&#x6B21;&#x6642;&#x597D;&#x4E00;&#x9EDE;&#xFF0C;&#x4E0D;&#x904E;&#x9084;&#x662F;&#x5FCD;&#x4E0D;&#x4F4F;&#x7684;&#x8DDF;&#x6240;&#x611B;&#x4E4B;&#x4EBA;&#x8AAA;&#x4E86;&#x6B64;&#x4E8B;&#xFF0C;&#x7D50;&#x679C;&#x9084;&#x662F;&#x88AB;&#x9001;&#x9032;&#x7CBE;&#x795E;&#x75C5;&#x9662;&#xFF0C;&#x4F46;&#x88AB;&#x6709;&#x5FC3;&#x4E4B;&#x4EBA;&#x8EDF;&#x7981;&#xFF0C;&#x5957;&#x53D6;&#x300C;&#x672A;&#x4F86;&#x300D;&#x6D88;&#x606F;&#xFF0C;&#x4E0D;&#x904E;&#x56E0;&#x6B64;&#x5F97;&#x77E5;&#x539F;&#x4F86;&#x4E16;&#x4E0A;&#x6709;&#x5176;&#x4ED6;&#x4EBA;&#x8DDF;&#x81EA;&#x5DF1;&#x4E00;&#x6A23;&#x53EF;&#x4EE5;&#x91CD;&#x751F;&#x4E4B;&#x4EBA;&#x3002;</p>
<p><img src="https://sparks-blog2.fly.dev/content/images/2016/05/The_First_Fifteen_Lives_of_Harry_August.jpg" alt loading="lazy"></p>
<p>&#x6703;&#x770B;&#x6B64;&#x66F8;&#x662F;&#x56E0;&#x70BA;&#xFF0C;&#x6211; &#x2027; &#x8CB7; &#x2027; &#x932F; &#x2027; &#x4E86;&#x3002;</p>
<p>&#x672C;&#x4F86;&#x662F;&#x60F3;&#x8CB7;&#x53E6;&#x4E00;&#x672C;&#x4E5F;&#x662F;&#x6B7B;&#x5F8C;&#x56DE;&#x5230;&#x751F;&#x524D;&#x7684;&#x66F8;&#xFF0C;&#x56E0;&#x70BA;&#x4E0D;&#x77E5;&#x66F8;&#x540D;&#xFF0C;&#x770B;&#x5230;&#x5167;&#x5BB9;&#x4ECB;&#x7D39;&#x5F8C;&#x4FBF;&#x8CB7;&#x4E0B;&#x9019;&#x672C;&#x3002;&#x770B;&#x4E86;&#x5E7E;&#x5341;&#x9801;&#xFF0C;&#x56E0;&#x70BA;&#x6545;&#x4E8B;&#x8D70;&#x5411;&#x4F3C;&#x4E4E;&#x8DDF;&#x60F3;&#x50CF;&#x7684;&#x4E0D;&#x540C;&#xFF0C;&#x624D;&#x610F;&#x8B58;&#x5230;&#x81EA;&#x5DF1;&#x8CB7;&#x932F;&#x4E86;&#x3002;&#x5E78;&#x597D;&#xFF0C;&#x8B80;&#x7562;&#x5F8C;&#x611F;&#x89BA;&#x4E5F;&#x4E0D;&#x932F;&#x3002;</p>
<p>Kalachakra &#x70BA;&#x4F5B;&#x6559;&#x7528;&#x8A9E;&#xFF0C;&#x4E2D;&#x8B6F;&#x6642;&#x8F2A;&#xFF0C;&#x610F;&#x7FA9;&#x592A;&#x8907;&#x96DC;&#x770B;&#x4E0D;&#x61C2;&#x3002;&#x672C;&#x66F8;&#x53EA;&#x62FF;&#x53D6;&#x5176;&#x300C;&#x91CD;&#x8986;&#x6642;&#x9593;&#x300D;&#x7684;&#x6982;&#x5FF5;&#x3002;&#x8DDF;&#x5438;&#x8840;&#x9B3C;&#x4E0D;&#x540C;&#xFF0C;kalachakra &#x4E0D;&#x662F;&#x4E0D;&#x6703;&#x6B7B;&#x7684;&#x751F;&#x547D;&#xFF0C;&#x800C;&#x662F;&#x4E0D;&#x65B7;&#x91CD;&#x8986;&#x7684;&#x751F;&#x547D;&#x3002;&#x6B7B;&#x5F8C;&#x91CD;&#x751F;&#x3001;&#x6B7B;&#x5F8C;&#x91CD;&#x751F;&#x3001;&#x6B7B;&#x5F8C;&#x518D;&#x91CD;&#x751F;&#x3002;&#x96D6;&#x8AAA;&#x4E0D;&#x65B7;&#x91CD;&#x8986;&#xFF0C;&#x50CF;&#x88AB;&#x56F0;&#x5728;&#x67D0;&#x4E00;&#x6BB5;&#x6642;&#x9593;&#x4E2D;&#xFF0C;&#x4F46;&#x4ED6;&#x5011;&#x5927;&#x90E8;&#x4EFD;&#x7684;&#x8A18;&#x61B6;&#x537B;&#x4E0D;&#x6703;&#x6D88;&#x5931;&#xFF0C;&#x7D93;&#x9A57;&#x53EF;&#x4EE5;&#x7D2F;&#x7A4D;&#xFF0C;&#x6703;&#x77E5;&#x9053;&#x4E16;&#x754C;&#x300C;&#x672A;&#x4F86;&#x300D;&#x7684;&#x767C;&#x5C55;&#xFF0C;&#x907F;&#x958B;&#x5384;&#x904B;&#x3002;&#x56E0;&#x6B64;&#x4ED6;&#x5011;&#x53EF;&#x4EE5;&#x5728;&#x4E0D;&#x540C;&#x7684;&#x300C;&#x4E00;&#x751F;&#x300D;&#x9078;&#x64C7;&#x4E0D;&#x540C;&#x7684;&#x9053;&#x8DEF;&#xFF0C;&#x9078;&#x64C7;&#x4E0D;&#x540C;&#x7684;&#x4EBA;&#x751F;&#xFF0C;&#x5FEB;&#x6A02;&#x5730;&#x751F;&#x6D3B;&#x3002;</p>
<p>&#x53EA;&#x8981;&#x4E00;&#x6B7B;&#xFF0C;&#x610F;&#x5FD7;&#x4FBF;&#x56DE;&#x5230;&#x51FA;&#x751F;&#x7684;&#x6642;&#x5019;&#xFF0C;&#x4FDD;&#x7559;&#x4EE5;&#x5F80;&#x7684;&#x8A18;&#x61B6;&#xFF0C;&#x5BE6;&#x5728;&#x662F;&#x72AF;&#x898F;&#x5F97;&#x96E2;&#x8B5C;&#x3002;&#x60F3;&#x60F3;&#x8B80;&#x66F8;&#x6642;&#x4F60;&#x5DF2;&#x7D93;&#x77E5;&#x9053;&#x6240;&#x6709;&#x667A;&#x8B58;&#x751A;&#x81F3;&#x662F;&#x8003;&#x8A66;&#x7684;&#x984C;&#x76EE;&#xFF0C;&#x60F3;&#x60F3;&#x6295;&#x8CC7;&#x6642;&#x77E5;&#x9053;&#x80A1;&#x5E02;&#x7684;&#x767C;&#x5C55;&#x4EE5;&#x53CA;&#x6295;&#x8CC7;&#x7684;&#x65B9;&#x5411;&#xFF0C;&#x60F3;&#x60F3;&#x8FFD;&#x6C42;&#x7570;&#x6027;&#x6642;&#x77E5;&#x9053;&#x5C0D;&#x65B9;&#x7684;&#x611B;&#x597D;&#xFF0C;&#x5B8C;&#x5168;&#x662F;&#x4EBA;&#x751F;&#x52DD;&#x5229;&#x7D44;&#x7684;&#x611F;&#x89BA;&#x3002;&#x96D6;&#x7136;&#x672A;&#x4F86;&#x6703;&#x56E0;&#x81EA;&#x6211;&#x7684;&#x9078;&#x64C7;&#x4E5F;&#x6703;&#x6709;&#x6240;&#x8B8A;&#x5316;&#xFF0C;&#x4F46;&#x5927;&#x4E8B;&#x4E0D;&#x6703;&#x8B8A;&#x7684;&#xFF0C;&#x6240;&#x4EE5;&#x6703;&#x6709;&#x4E00;&#x5207;&#x76E1;&#x5728;&#x638C;&#x63E1;&#xFF0C;&#x53C8;&#x4E0D;&#x6703;&#x6709;&#x6C89;&#x60B6;&#x4E4B;&#x611F;&#x3002;</p>
<p>&#x53EF;&#x60DC;&#x66F8;&#x4E2D;&#x6C92;&#x6709;&#x53BB;&#x89E3;&#x91CB;&#x6642;&#x9593;&#x5982;&#x4F55;&#x904B;&#x4F5C;&#x3002;&#x82E5;&#x53EA;&#x6709;&#x4E00;&#x500B;&#x4EBA;&#x662F; Kalachakra &#x7684;&#x8A71;&#xFF0C;&#x662F;&#x5F88;&#x5BB9;&#x6613;&#x89E3;&#x91CB;&#x7684;&#x3002;&#x4F46;&#x591A;&#x65BC;&#x4E00;&#x500B;&#x7684;&#x8A71;&#xFF0C;&#x6BCF;&#x500B;&#x4EBA;&#x7684;&#x51FA;&#x751F;&#x6642;&#x9593;&#x6B7B;&#x4EA1;&#x6642;&#x9593;&#x4E0D;&#x540C;&#xFF0C;&#x7576;&#x4E2D;&#x53C8;&#x6703;&#x6709;&#x4EA4;&#x96DC;&#xFF0C;&#x5982;&#x4F55;&#x89E3;&#x91CB;&#x4ED6;&#x5011;&#x4E4B;&#x9593;&#x8DDF;&#x5C0D;&#x65B9;&#x7684;&#x8A18;&#x61B6;&#x8207;&#x6642;&#x9593;&#x7684;&#x6D41;&#x901D;&#xFF1F;&#x4F8B;&#x5982;&#x7532;&#x8DDF;&#x4E59;&#x5728; 2000 &#x5E74;&#x898B;&#x9762;&#xFF0C;&#x7532;&#x540C;&#x5E74;&#x901D;&#x53BB;&#x518D;&#x91CD;&#x751F;&#x65BC; 1930 &#x5E74;&#xFF0C;&#x800C;&#x4E59;&#x5728; 2010 &#x5E74;&#x5F8C;&#x624D;&#x53BB;&#x4E16;&#x91CD;&#x751F;&#x65BC; 1931 &#x5E74;&#xFF0C;&#x90A3;&#x9EBC;&#x7532;&#x5728;&#x4E59;&#x51FA;&#x751F;&#x6642;&#x662F;&#x5426;&#x6709; 9 &#x5E74;&#x7A7A;&#x6A94;&#x671F;&#xFF1F;</p>
<p>&#x5E78;&#x597D;&#x6545;&#x4E8B;&#x89E3;&#x91CB;&#x4E86;&#x70BA;&#x4EC0;&#x9EBC;&#x6C92;&#x6709;&#x4EBA;&#x53BB;&#x6539;&#x8B8A;&#x6B77;&#x53F2;&#x3002;&#x56E0;&#x70BA;&#x6539;&#x8B8A;&#x300C;&#x672A;&#x4F86;&#x300D;&#x662F;&#x6C92;&#x6709;&#x7528;&#x7684;&#xFF0C;&#x56E0;&#x70BA;&#x4EBA;&#x4E00;&#x6B7B;&#x4FBF;&#x6703; reset&#xFF0C;&#x6539;&#x8B8A;&#x4F86;&#x6709;&#x4EC0;&#x9EBC;&#x7528;&#xFF1F;&#x800C;&#x4E14;&#x4E00;&#x6539;&#x8B8A;&#x300C;&#x672A;&#x4F86;&#x300D;&#xFF0C;&#x4FBF;&#x6703;&#x4EE4;&#x5F71;&#x97FF;&#x4E86;&#x8EAB;&#x8655;&#x300C;&#x672A;&#x4F86;&#x300D;&#x7684; Kalachakra&#xFF0C;&#x751A;&#x81F3;&#x6703;&#x300C;&#x6BBA;&#x6B7B;&#x300D;&#x4ED6;&#x5011;&#x3002;&#x6240;&#x4EE5;&#x5F71;&#x97FF;&#x4E16;&#x4EE3;&#x7684;&#x91CD;&#x5927;&#x4E8B;&#x4EF6;&#xFF0C;&#x57FA;&#x672C;&#x4E0A;&#x4E0D;&#x88AB;&#x5141;&#x8A31;&#x53BB;&#x6539;&#x8B8A;&#x7684;&#x3002;</p>
<p>&#x82E5;&#x5805;&#x6301;&#x53BB;&#x505A;&#x7684;&#x8A71;&#xFF0C;&#x6703;&#x88AB;&#x4EBA;&#x300C;&#x6BBA;&#x6B7B;&#x300D;&#x3002;&#x662F;&#x7684;&#xFF0C;&#x8DDF;&#x6240;&#x6709;&#x4EBA;&#x4E00;&#x6A23;&#xFF0C;Kalachakra &#x90FD;&#x662F;&#x53EF;&#x4EE5;&#x88AB;&#x6BBA;&#x800C;&#x4E0D;&#x6703;&#x91CD;&#x751F;&#x7684;&#x3002;</p>
<p>&#x4F46;&#x9664;&#x4E86;&#x6642;&#x9593;&#x5916;&#xFF0C;&#x66F8;&#x5BEB;&#x4E86;&#x5F88;&#x591A;&#x5176;&#x4ED6;&#x7D30;&#x7BC0;&#x3002;&#x5982; Kalachakra &#x5728;&#x91CD;&#x751F;&#x5F8C;&#x7684;&#x5B30;&#x5152;&#x968E;&#x6BB5;&#xFF0C;&#x5C0F;&#x5B69;&#x6642;&#x671F;&#x5982;&#x4F55;&#x53EF;&#x4EE5;&#x96E2;&#x958B;&#x6240;&#x5C6C;&#x5BB6;&#x5EAD;&#xFF0C;&#x300C;&#x672A;&#x4F86;&#x300D;&#x7684;&#x4EBA;&#x5982;&#x4F55;&#x8DDF;&#x300C;&#x904E;&#x4F86;&#x300D;&#x7684;&#x4EBA;&#x6E9D;&#x901A;&#x7B49;&#xFF0C;&#x4F5C;&#x8005;&#x5C07;&#x5927;&#x90E8;&#x4EFD;&#x7D30;&#x7BC0;&#x90FD;&#x8A08;&#x5283;&#x597D;&#xFF0C;&#x9019;&#x4E9B;&#x8B80;&#x8D77;&#x4F86;&#x5F88;&#x6709;&#x8DA3;&#x3002;</p>
<p>&#x6211;&#x5F88;&#x559C;&#x6B61;&#x9019;&#x985E;&#x4E2D;&#x9593;&#x63D2;&#x654D;&#x63CF;&#x8FF0;&#x5176;&#x4ED6;&#x7121;&#x95DC;&#x60C5;&#x7BC0;&#x7684;&#x7AE0;&#x7BC0;&#x7684;&#x5C0F;&#x8AAA;&#x3002;&#x5982;&#x300A;Forrest Gump&#x300B;&#x3001; &#x300A;The Curious Incident of the Dog in the Night Time&#x300B; &#x7B49;&#x4E5F;&#x662F;&#x9019;&#x7A2E;&#x5F62;&#x5F0F;&#xFF0C;&#x6216;&#x8005;&#x6709;&#x4EBA;&#x6703;&#x89BA;&#x5F97;&#x300C;&#x62D6;&#x300D;&#x6216;&#x8005;&#x4E0D;&#x5920;&#x7DCA;&#x6E4A;&#xFF0C;&#x4E0D;&#x904E;&#x9019;&#x4E9B;&#x63D2;&#x654D;&#x5012;&#x654D;&#x5F88;&#x5408;&#x53E3;&#x5473;&#xFF0C;&#x52A0;&#x4E0A;&#x6B7B;&#x5F8C;&#x91CD;&#x751F;&#x7B49;&#x6982;&#x5FF5;&#xFF0C;&#x6545;&#x4E8B;&#x6D41;&#x7A0B;&#x63A7;&#x5236;&#x5F97;&#x5F88;&#x597D;&#x3002;&#x7136;&#x5F8C;&#x6545;&#x4E8B;&#x767C;&#x5C55;&#x4E0B;&#x4F86;&#xFF0C;&#x6240;&#x6709;&#x7684;&#x7D30;&#x7BC0;&#x53C8;&#x6703;&#x6D6E;&#x73FE;&#xFF0C;&#x518D;&#x6B21;&#x7D44;&#x5408;&#x5728;&#x4E00;&#x8D77;&#xFF0C;&#x4EE4;&#x9019;&#x4E9B;&#x7AE0;&#x7BC0;&#x7D30;&#x7BC0;&#x8B8A;&#x5F97;&#x91CD;&#x8981;&#x8D77;&#x4F86;&#x3002;</p>
<p>&#x8CB7;&#x932F;&#x4E86;&#x6B64;&#x66F8;&#x771F;&#x7684;&#x6BEB;&#x4E0D;&#x5F8C;&#x6094;&#x3002;</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[開發 Telegram Bot 簡介]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h2 id="overview">Overview</h2>
<p>&#x5BEB; Telegram bot &#x5176;&#x5BE6;&#x5F88;&#x7C21;&#x55AE;&#xFF0C;&#x53EA;&#x662F;&#x8655;&#x7406;&#x5E7E;&#x500B; http request &#x800C;&#x5DF2;&#x3002;&#x53CD;&#x800C;&#x662F; set up &#x9084;&#x6BD4;&#x8F03;&#x9EBB;&#x7169;&#x3002;</p>
<p>&#x8981;&#x5EFA;&#x7ACB; bot &#x5927;&#x7D04;&#x8981;&#x505A;&#x4EE5;&#x4E0B;&#x6B65;&#x9A5F;&#xFF1A;</p>
<ol>
<li>&#x8DDF; BotFather &#x8AAA;&#x8981;&#x8D77;</li></ol>]]></description><link>https://sparks-blog2.fly.dev/develop-telegram-bot-introduction/</link><guid isPermaLink="false">6344c7bf02c13c0211c7d2cc</guid><category><![CDATA[development]]></category><category><![CDATA[bot]]></category><dc:creator><![CDATA[Ryan Leung]]></dc:creator><pubDate>Wed, 18 May 2016 01:55:25 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id="overview">Overview</h2>
<p>&#x5BEB; Telegram bot &#x5176;&#x5BE6;&#x5F88;&#x7C21;&#x55AE;&#xFF0C;&#x53EA;&#x662F;&#x8655;&#x7406;&#x5E7E;&#x500B; http request &#x800C;&#x5DF2;&#x3002;&#x53CD;&#x800C;&#x662F; set up &#x9084;&#x6BD4;&#x8F03;&#x9EBB;&#x7169;&#x3002;</p>
<p>&#x8981;&#x5EFA;&#x7ACB; bot &#x5927;&#x7D04;&#x8981;&#x505A;&#x4EE5;&#x4E0B;&#x6B65;&#x9A5F;&#xFF1A;</p>
<ol>
<li>&#x8DDF; BotFather &#x8AAA;&#x8981;&#x8D77;&#x6A5F;......&#x68B0;&#x4EBA;</li>
<li>&#x5F9E; Telegram &#x6536;&#x53D6; message</li>
<li>&#x8655;&#x7406; message</li>
</ol>
<h2 id="botfather">Bot Father</h2>
<p>&#x5EFA;&#x7ACB;&#x4E00;&#x500B; bot&#xFF0C;&#x7576;&#x7136;&#x8981;&#x900F;&#x904E;&#x53E6;&#x4E00;&#x500B; bot &#x53BB;&#x505A;&#x3002;&#x5728; Telegram &#x627E; BotFather&#xFF0C;&#x7136;&#x5F8C;&#x8DDF;&#x4ED6;&#x5C0D;&#x8A71;&#x5373;&#x53EF;&#x3002;</p>
<p>&#x8A2D;&#x7ACB;&#x7C21;&#x4ECB;&#x3001;&#x540D;&#x7A31;&#x3001;command list &#x90FD;&#x8981;&#x900F;&#x904E; BotFather &#x53BB;&#x505A;&#x3002;&#x5B8C;&#x6210;&#x5F8C;&#x6703;&#x5F97;&#x5230;&#x4E00;&#x500B; bot token &#xFF0C;&#x7B49;&#x65BC;&#x662F;&#x4F60;&#x7684; bot password&#xFF0C;&#x8ACB;&#x4FDD;&#x5B58;&#x5728;&#x5B89;&#x5168;&#x7684;&#x5730;&#x65B9;&#x3002;</p>
<p>&#x9019;&#x6642;&#x4F60;&#x5DF2;&#x7D93;&#x53EF;&#x4EE5;&#x5728; Telegram &#x641C;&#x5C0B;&#x81EA;&#x5DF1;&#x7684; bot&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x767C;&#x8A0A;&#x606F;&#x7D66;&#x5B83;&#xFF0C;&#x7576;&#x7136;&#x5B83;&#x9084;&#x4E0D;&#x6703;&#x56DE;&#x8986;&#x3002;</p>
<h2 id="message">&#x6536;&#x53D6; message</h2>
<p>&#x8981;&#x5728;&#x4F60;&#x7684; server &#x6536;&#x5230; message&#xFF0C;&#x6709;&#x5169;&#x7A2E;&#x65B9;&#x6CD5;&#xFF1A;<code>getUpdates</code> &#x548C; <code>setWebhook</code>&#x3002;</p>
<h3 id="getupdates"><code>getUpdates</code></h3>
<p>&#x53EA;&#x8981; <code>GET</code> <code>https://api.telegram.org/my-bot-token/getUpdates</code>&#xFF0C;&#x4FBF;&#x53EF;&#x4EE5;&#x5F97;&#x5230; message array &#x56DE;&#x4F86;&#xFF0C;</p>
<p>&#x6B64;&#x65B9;&#x6CD5;&#x662F;&#x6211;&#x65B9;&#x4E3B;&#x52D5;&#x8DDF; Telegram &#x62FF;&#x53D6; message&#xFF0C;&#x4E43;&#x6700;&#x7C21;&#x55AE;&#x7372;&#x5F97; messages &#x7684;&#x65B9;&#x6CD5;&#x3002;&#x7F3A;&#x9EDE;&#x662F;&#x9700;&#x81EA;&#x884C;&#x4F7F;&#x7528; long polling &#x4E26;&#x5B9A;&#x6642;&#x57F7;&#x884C;&#x624D;&#x80FD;&#x7372;&#x53D6;&#x6700;&#x65B0; messages&#x3002;</p>
<h3 id="setwebhook"><code>setWebhook</code></h3>
<p>&#x53E6;&#x4E00;&#x65B9;&#x6CD5;&#x5247;&#x662F;&#x4F7F;&#x7528; web hook&#x3002;</p>
<p><code>POST</code> &#x4F60;&#x7684; web server address &#x5230; <code>https://api.telegram.org/my-bot-token/setWebhook</code> &#x5373;&#x5B8C;&#x6210;&#x3002;&#x6709;&#x65B0; message &#x6642; Telegram &#x6703;&#x4E3B;&#x52D5;&#x901A;&#x77E5;&#x6211;&#x65B9;&#x3002;&#x8CC7;&#x6599;&#x6703;&#x4EE5; <code>POST</code> &#x7684;&#x5F62;&#x5F0F;&#x767C;&#x904E;&#x4F86;&#x3002;</p>
<p>&#x4E0D;&#x904E;&#x4F7F;&#x7528;&#x6B64;&#x65B9;&#x6CD5;&#x9700;&#xFF1A;</p>
<ol>
<li>&#x6709;&#x4E00; public web server</li>
<li>Web server &#x9700;&#x652F;&#x63F4; https</li>
</ol>
<p>SSL &#x65B9;&#x9762;&#xFF0C;&#x82E5;&#x4E0D;&#x60F3;&#x4ED8;&#x8CBB;&#x7684;&#x8A71;&#xFF0C;&#x7528; self sign cert &#x4E5F;&#x53EF;&#x4EE5;&#x3002;</p>
<h4 id="selfsigncert">&#x4F7F;&#x7528; self sign cert</h4>
<p>&#x53EF;&#x4EE5;&#x7528; openssl &#x4F86; generate certificate&#xFF1A;</p>
<p><code>openssl req -newkey rsa:2048 -sha256 -nodes -keyout my-bot-cert.key -x509 -days 365 -out my-public-cert.pem -subj &quot;/C=HK/ST=Hong Kong/L=My-NAME/O=My-ORG/CN=my-domain.com&quot;</code></p>
<p>&#x518D;&#x7528; <code>setWehook</code> &#x4E0A;&#x8F09;&#x4F60;&#x7684; public cert &#x4E0A; Telegram&#xFF1A;</p>
<p><code>curl -i -X POST -H &quot;Content-Type: multipart/form-data&quot; -F &quot;certificate=@my-public-cert.pem&quot; -F &quot;url=https://my-web-server/my-bot.php&quot; https://api.telegram.org/my-bot-token/setWebhook</code></p>
<p>PS: &#x5176;&#x5BE6;&#x4E0D;&#x4E00;&#x5B9A;&#x4F7F;&#x7528; <code>curl</code>&#xFF0C;&#x4E0D;&#x904E; <code>setWebhook</code> &#x9700;&#x8981;&#x4F7F;&#x7528; POST&#xFF0C;&#x4E26; upload certificate&#xFF0C;&#x6700;&#x7C21;&#x55AE;&#x7684;&#x65B9;&#x6CD5;&#x662F;&#x4F7F;&#x7528; <code>curl</code></p>
<h3 id>&#x61C9;&#x8A72;&#x4F7F;&#x7528;&#x54EA;&#x500B;&#xFF1F;</h3>
<p>&#x55AE;&#x5F9E;&#x5169;&#x8005;&#x53EF;&#x770B;&#x51FA;&#xFF0C;&#x4E00;&#x500B;&#x662F; pull&#xFF0C; &#x4E00;&#x500B;&#x662F; push&#x3002;&#x8981;&#x7B97;&#x5373;&#x6642;&#x6027;&#x7684;&#x8A71;&#x4E00;&#x5B9A;&#x662F;&#x7528; <code>setWebhook</code>&#x3002;&#x4F46;&#x5176;&#x5BE6;&#x4F60;&#x7684; bot &#x4E0D;&#x662F;&#x4E00;&#x79D2;&#x6709;&#x5341;&#x500B; message &#x7684;&#x8A71;&#xFF0C;&#x4F7F;&#x7528; <code>getUpdates</code> &#x5DF2;&#x8DB3;&#x5920;&#x8FC5;&#x901F;&#x3002;&#x53E6;&#x5916; <code>setWebhook</code> &#x662F; Telegram &#x8DDF;&#x4F60;&#x7684; server &#x81EA;&#x52D5;&#x6E9D;&#x901A;&#xFF0C;&#x8981; debug &#x7684;&#x8A71;&#x8F03;&#x56F0;&#x96E3;&#xFF0C;&#x6240;&#x4EE5;&#x5728; debug &#x6642;&#x53EF;&#x4EE5;&#x9078;&#x64C7;&#x7528; <code>getUpdates</code>&#xFF0C;production &#x6642;&#x624D;&#x7528; <code>setWebhook</code>&#x3002;</p>
<p>&#x800C;&#x6BCF;&#x8AD6;&#x4F7F;&#x7528;&#x90A3;&#x4E00;&#x500B;&#x65B9;&#x6CD5;&#xFF0C;&#x6700;&#x5F8C;&#x90FD;&#x53EF;&#x4EE5;&#x5F97;&#x5230;&#x4E00;&#x500B; message &#x7684; json &#x3002;</p>
<h2 id="message">&#x8655;&#x7406; message</h2>
<p>Message &#x5927;&#x7D04;&#x662F;&#x9019;&#x500B;&#x6A23;&#x5B50;&#xFF1A;</p>
<pre><code>{
    &quot;update_id&quot;: 57743038,
    &quot;message&quot;: {
        &quot;message_id&quot;: 7,
        &quot;from&quot;: {
            &quot;id&quot;: 0000001,
            &quot;first_name&quot;: &quot;Goofyz&quot;,
            &quot;username&quot;: &quot;goofyz&quot;
        },
        &quot;chat&quot;: {
            &quot;id&quot;: 0000001,
            &quot;first_name&quot;: &quot;Goofyz&quot;,
            &quot;username&quot;: &quot;goofyz&quot;,
            &quot;type&quot;: &quot;private&quot;
        },
        &quot;date&quot;: 1459783985,
        &quot;text&quot;: &quot;\/start&quot;
    }
}
</code></pre>
<p>&#x6BCF;&#x500B; message &#x90FD;&#x6709;&#x767C;&#x9001;&#x8005;&#x7684; <code>user_id</code>, <code>first_name</code> &#x7B49;&#xFF0C;&#x9084;&#x6709;&#x65E5;&#x671F;&#x6642;&#x9593;&#x548C;&#x6700;&#x91CD;&#x8981;&#x7684;&#x8A0A;&#x606F;&#x5167;&#x5BB9; <code>text</code>&#x3002;&#x82E5;&#x662F;&#x5716;&#x7247;&#x8A0A;&#x606F;&#x4FBF;&#x6703;&#x6709;&#x5176;&#x4ED6; fields&#xFF0C;&#x8A73;&#x60C5;&#x53EF;&#x53C3;&#x95B1;&#x5B98;&#x65B9;&#x6587;&#x4EF6;&#x3002;</p>
<p>&#x4E4B;&#x5F8C;&#x4FBF;&#x662F;&#x4F60;&#x7684; business logic &#x7684;&#x9818;&#x57DF;&#x3002;&#x4F60;&#x53EF;&#x4EE5;&#x56DE;&#x8986;&#x6587;&#x5B57;&#x3001;&#x5132;&#x5B58;&#x9032; database&#xFF0C;&#x53C8;&#x6216;&#x8005;&#x5E72;&#x8106;&#x4E0D;&#x7406;&#x4ED6;&#x5011; (!)&#x3002;</p>
<h2 id="somethingextradeeplinking">Something extra: Deep linking</h2>
<p>&#x5982;&#x679C;&#x60F3;&#x70BA; bot &#x505A; authorization&#xFF0C;&#x6216;&#x4E0D;&#x60F3;&#x4EFB;&#x4F55;&#x4EBA;&#x90FD;&#x53EF;&#x4EE5;&#x7528;&#x4F60;&#x7684; bot &#xFF0C;&#x53EF;&#x4EE5;&#x5728; bot link &#x4E0A;&#x52A0;&#x4E0A; <code>?start=some-random-specific-text</code>&#xFF0C;&#x5982; <a href="https://telegram.me/goofyzbot?start=goofyz-secretly-love-whatsapp">https://telegram.me/goofyzbot?start=goofyz-secretly-love-whatsapp</a> &#x3002;&#x4EE5;&#x6B64;&#x9023;&#x7D50;&#x70BA;&#x958B;&#x59CB;&#x7684;&#x8A71;&#xFF0C;bot &#x4FBF;&#x6703;&#x5F97;&#x5230; <code>/start goofyz-secretly-love-whatsapp</code> &#x4F5C;&#x70BA; <code>text</code>&#xFF0C;&#x4F60;&#x4FBF;&#x53EF;&#x900F;&#x904E;&#x8655;&#x7406;&#x6B64; argument &#x53BB;&#x505A; authorization (&#x6216;&#x5176;&#x4ED6;&#x521D;&#x59CB;&#x5316;&#x52D5;&#x4F5C;)&#x3002;</p>
<h2 id>&#x7D50;&#x8A9E;</h2>
<p>&#x8001;&#x5BE6;&#x8AAA;&#xFF0C;Telegram Bot &#x5F88;&#x7C21;&#x55AE;&#xFF0C;&#x5C31;&#x53EA;&#x662F;&#x6536;&#x767C; message &#x800C;&#x5DF2;&#x3002;&#x4F46;&#x8655;&#x7406; <code>setWebhook</code> &#x6BD4;&#x8D77;&#x5BEB; bot &#x66F4;&#x9EBB;&#x7169;&#x3002;&#x6211;&#x6700;&#x521D; <code>setWebhook</code> &#x5F8C;&#x53EA;&#x5F97;&#x5230; <code>result: ok</code>&#xFF0C;&#x4F46; server &#x5C31;&#x662F;&#x6536;&#x4E0D;&#x5230; message&#xFF0C;&#x6839;&#x672C;&#x4E0D;&#x77E5;&#x554F;&#x984C;&#x51FA;&#x5728;&#x90A3;&#x88CF;&#x3002;&#x6700;&#x5F8C;&#x624D;&#x767C;&#x73FE; self-sign cert &#x7684; CN &#x8981;&#x7B49;&#x65BC;&#x4F60;&#x7684; server domain&#xFF0C;BOOM&#x3002;</p>
<p>&#x6700;&#x5F8C;&#xFF0C;Telegram &#x5BE6;&#x5728;&#x6BD4; WhatsApps &#x5FEB;&#x5F88;&#x591A;&#xFF0C;&#x529F;&#x80FD;&#x591A;&#x5F88;&#x591A;&#xFF0C;bot &#x4EE4; Telegram Group &#x6BD4; WhatsApps &#x66F4;&#x591A;&#x73A9;&#x6CD5;&#xFF0C;&#x5BE6;&#x5728;&#x503C;&#x5F97;&#x8F49;&#x7528;&#x3002;<s>&#x53EF;&#x60DC;&#x5728;&#x4EFB;&#x4F55; IM &#x4E0A;&#x6211;&#x4E5F;&#x662F;&#x55AE;&#x6A5F;</s></p>
<h2 id>&#x76F8;&#x95DC;&#x9023;&#x7D50;</h2>
<ul>
<li><a href="https://core.telegram.org/bots">Telegram Bots</a></li>
<li><a href="https://core.telegram.org/bots/api">Telegram Bots API</a></li>
<li><a href="https://core.telegram.org/bots/samples">Bot code examples</a></li>
<li><a href="https://telegram.me/botfather">BotFather</a></li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Google Codelab]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x5F8C;&#x77E5;&#x5F8C;&#x89BA;&#x3002;&#x767C;&#x73FE;&#x539F;&#x4F86; Google &#x6709;&#x63D0;&#x4F9B; Android Testing &#x7684; tutorial &#x3002;</p>
<blockquote>
<p><a href="https://codelabs.developers.google.com/codelabs/android-testing/index.html">https://codelabs.developers.google.com/codelabs/android-testing/index.html</a></p>
</blockquote>
<p>&#x9019;&#x500B; Android Testing Codelab &#x9084;&#x6709;&#x6559; MVP Architecture &#x548C; Unit &amp; UI Test&#xFF0C;&#x5C0D;&#x521D;&#x5B78;&#x7684;&#x4F86;&#x8AAA;&#x5BE6;</p>]]></description><link>https://sparks-blog2.fly.dev/google-codelab-android-testing/</link><guid isPermaLink="false">6344c7bf02c13c0211c7d2cb</guid><category><![CDATA[android]]></category><dc:creator><![CDATA[Ryan Leung]]></dc:creator><pubDate>Wed, 27 Apr 2016 01:50:27 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x5F8C;&#x77E5;&#x5F8C;&#x89BA;&#x3002;&#x767C;&#x73FE;&#x539F;&#x4F86; Google &#x6709;&#x63D0;&#x4F9B; Android Testing &#x7684; tutorial &#x3002;</p>
<blockquote>
<p><a href="https://codelabs.developers.google.com/codelabs/android-testing/index.html">https://codelabs.developers.google.com/codelabs/android-testing/index.html</a></p>
</blockquote>
<p>&#x9019;&#x500B; Android Testing Codelab &#x9084;&#x6709;&#x6559; MVP Architecture &#x548C; Unit &amp; UI Test&#xFF0C;&#x5C0D;&#x521D;&#x5B78;&#x7684;&#x4F86;&#x8AAA;&#x5BE6;&#x5728;&#x5F88;&#x6709;&#x7528;&#xFF01;</p>
<p>&#x82E5;&#x4F60;&#x4E0D;&#x77E5;&#x9053;&#x6216;&#x4E0D;&#x719F;&#x6089; MVP&#x3001;Espresso&#x3001;Mockito &#xFF0C;&#x4E00;&#x5B9A;&#x8981;&#x8B80;&#x4E00;&#x8B80;&#x3002;</p>
<p>PS: Google Codelab &#x9084;&#x6709;&#x5F88;&#x591A; tutorial &#x503C;&#x5F97;&#x4E00;&#x770B;&#xFF0C;&#x5EFA;&#x8B70;&#x5927;&#x5BB6;&#x53BB;&#x5C0B;&#x5BF6;&#x3002;</p>
<!--kg-card-end: markdown-->]]></content:encoded></item></channel></rss>