---
        layout: null
        ---
        <?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>碎碎念</title>
        <description>Write an awesome description for your new site here. You can edit this line in _config.yml. It will appear in your document head meta (for Google search results) and in your feed.xml site description.
</description>
        <link>https://blog.yunglinho.com/</link>
        <atom:link href="https://blog.yunglinho.com/feed.xml" rel="self" type="application/rss+xml"/>
        <pubDate>Sat, 25 Dec 2021 18:42:20 +0000</pubDate>
        <lastBuildDate>Sat, 25 Dec 2021 18:42:20 +0000</lastBuildDate>
        <generator>Jekyll v3.9.0</generator>
        
        <item>
            <title>制度的設計</title>
            <description>&lt;p&gt;美國好萊塢演員亞歷鮑德溫 (Alec Baldwin) 拍攝西部電影時，在拍攝使用槍械的片段時，扣下板機後，擊發實彈，意外槍殺攝影指導
，貫穿後，再打中導演，導至導演受傷。&lt;/p&gt;

&lt;p&gt;這個案子在美國鬧的很大，第一是大明星出包，自然媒體會追，第二是因為亞歷鮑德溫是著名的反槍人士，怎麼會自己擔任製片，拍
西部片，然後用槍打死片場人員呢？不是反槍嗎？於是自然擁槍人士也不會放過他，檢討他在這個案子裡犯了那些的錯誤。&lt;/p&gt;

&lt;p&gt;在幫亞歷鮑德溫辯護這邊（左派）的說法是，自從李小龍之子的意外之後，美國片廠拍片的用槍規定非常的嚴格。&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;首先是片場只能用道具槍跟空包彈（後作力的效果演不來，需要空包彈提供後作力），但是道具槍那有生產這麼多型號，像是本案件使
  用的 18xx Colt 45 左輪手槍。所以就拿真槍裝空包彈當道具槍&lt;/li&gt;
  &lt;li&gt;拍片現廠要有兩位的專業人士在現場指導，一位是槍械師，負責保管跟檢查槍械的狀況，另一位是安全主任，觀查一些用槍的規範是否
  有確實執行&lt;/li&gt;
  &lt;li&gt;拍片時，槍械絕對不能對著任何的人員，需要拍設槍械的鏡頭，可以用對位的方式拍攝。如果需要拍攝正對著攝影機的角度開槍，那麼
  要疏散人員，攝影機採用搖控操作。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;種種的程序，就是要避免意外的發生，沒想到隔了近 30 年後，又發生用槍拍攝電影時的意外。至於這意外是怎麼發生的呢？當然是所有的關
那卡都失效了。&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;拍片使用的道具槍，拍攝前幾天還有被工作人員，裝實彈拿去打靶玩。&lt;/li&gt;
  &lt;li&gt;現場的槍械師，在午餐前把槍隻交給了安全主任，安全主任把槍放著就大家吃午餐去了，回來後，就把槍交給了演員，跟他說槍沒裝彈。&lt;/li&gt;
  &lt;li&gt;排演時，演員把槍口對著攝影機、導演的方向，扣下了板機，由於沒有淨空，所以就打中了兩人，造成傷亡。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;在左派這邊，他們認為這是制度的缺失，吃燒餅那有不掉芝麻了，沒有人不會犯錯，所以才要設計三層的制度來防止人為的失誤造成的傷亡，
這個制度也確實讓好萊塢拍片三十年來才再次出意外。這種制度失靈的意外，不應該懲罰個人，所以開槍的演員沒責任、負責檢查槍械的軍械
師沒責任、負責清場的安全主任也沒責任，被打死那個人是制度失靈的受害者，保險公司賠錢了事就好，沒有人需要去坐牢。&lt;/p&gt;

&lt;p&gt;在擁槍派（右派）這邊，認為使用槍隻的人都必須把「槍枝安全四守則」練成肌肉記憶，在靶場上被看到違規，可是直接趕出去的。&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;假設所有槍枝都是已經上膛的，拿到槍枝後要立刻檢查狀況，看看有沒有上膛。&lt;/li&gt;
  &lt;li&gt;不要把槍舉向你不想摧毀的目標。&lt;/li&gt;
  &lt;li&gt;清楚你的目標和目標後方的狀況。&lt;/li&gt;
  &lt;li&gt;除非確定瞄準目標，否則別將手指伸進板機內。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;在這次拍電影中，如果演員本人有遵守四大守則的其中的任何一點，就不會發生憾事了。拿到後馬上檢查彈艙看看是否有子彈，排演時用對位
的就好，不要把槍口對著攝影機，而且只是排演，不用後作力演出，扣板機幹嘛。&lt;/p&gt;

&lt;p&gt;右派攻擊他，如果他把他這幾年反槍的一成時間，拿來學習用槍守則，就不會打死人了。實際上演員本人拍過許多用槍的片段，也受過非常多
次的槍械訓練，但是亞歷鮑德溫平日在推特上，把把打打殺殺掛口上，不去學習正確的槍械使用心態，出了問題就往計時工的身上推，這樣未
來拍片安全有進步的可能嗎？&lt;/p&gt;

&lt;p&gt;講到最後又是左右派之爭，不管你理不理解左右之爭，你的思想方式，還是脫不了這兩個框架，左派認為系統可以保護大眾，右派認為做事的
是個人，只有個人負責，才可能把事情幹好&lt;/p&gt;

&lt;p&gt;但是兩者都不對，右派的問題是人人都要十項全能的話，無法做大計畫，大計畫的規模超過個人能掌控的複雜度&lt;/p&gt;

&lt;p&gt;左派的問題是，問題都推到系統上，系統中的個人難免會有操作上的失誤，所以要用兩三倍的人力去做防呆，但即使是這樣，當組織大到一定
程度後，成敗不受到單一子系統的影響，子系統會漸漸腐敗，三倍的人力沒有一個人有責任，大家都不用心。最後出事，就是受害的倒霉鬼一
個人負責而已&lt;/p&gt;

&lt;p&gt;如果你想要避免事情再次發生，就必須去了解這兩個框架，跟如何的使用他們。如果你的工具箱裏只有左派系統論一種工具的話，那是很可惜
的事，很多事情你無法用較佳的工具去解決問題。&lt;/p&gt;

&lt;p&gt;在本例中、在任何工作場所裡，人身安全是所有工作場所的最高指引，在工廠裡，每一個員工都要受安全訓練的，不能夠把安全性問題推給別
人（又稱系統）去負責的。拍片時如果需要用到高危險性的物品時，自然是要人人都受安全訓練的，如果出了意外，個人跟系統都是要承擔責
任的，這樣子，才有進步的可能。&lt;/p&gt;

</description>
            <pubDate>Sun, 05 Dec 2021 06:00:00 +0000</pubDate>
            <link>https://blog.yunglinho.com/blog/2021/12/05/system-design/</link>
            <guid isPermaLink="true">https://blog.yunglinho.com/blog/2021/12/05/system-design/</guid>
            
            
        </item>
        
        <item>
            <title>[Typescript] Promise API</title>
            <description>&lt;p&gt;Typescript Promise API 不知道為什麼，只有提供 callback style 的 API ，對於用過 Scala Promise 的用戶來說。使用上很難用，可讀性又很糟糕&lt;/p&gt;

&lt;div class=&quot;language-typescript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Promise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;kr&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;resolve&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;reject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;//do something&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;resolve&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;reject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;這樣子的寫法，把主要的邏輯包在 callback 內，可讀性不高，如果 promise 內又有 promise 就更難讀了。所以隨手寫了個 wrapper ，把包在 callback 內的 resolve 跟 reject 釋放出來，可以直接呼叫&lt;/p&gt;

&lt;div class=&quot;language-typescript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;cm&quot;&gt;/**
 * Wrapper that expose the `resolve` and `reject` functions to enable scala style promise API.
 *
 * &amp;lt;code&amp;gt;
 *     const p = promise&amp;lt;number&amp;gt;()
 *     p.resolve(3)
 *     await p.await()
 * &amp;lt;/code&amp;gt;
 */&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;PromiseWrapper&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;readonly&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;_promise&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Promise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;_resolve&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;_reject&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;_resolved&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;

    &lt;span class=&quot;kd&quot;&gt;constructor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;_promise&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Promise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(((&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;resolve&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;reject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;_resolve&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;resolve&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;_reject&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;reject&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}))&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;resolved&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;_resolved&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;Promise is resolved already.&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;_resolved&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;resolve&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;resolved&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;_resolve&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;nx&quot;&gt;reject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;resolved&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;_reject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Promise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;_promise&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;promise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;PromiseWrapper&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;PromiseWrapper&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;這下子程式可以改成這樣寫&lt;/p&gt;

&lt;div class=&quot;language-typescript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;
&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;p&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;promise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;kr&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// do something&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;resolve&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;reject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;看起來效益不高，但是這寫法真正的好處是，可以把 promise 當成一個變數，傳到其他的函式內，在其它的地方呼叫 promise.resolve(…)&lt;/p&gt;

&lt;p&gt;這種寫法，在寫非同步程式的測式時很好用，在底下的例子中， &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Engine&lt;/code&gt; 是個 PubSub ，會非同步執行 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;workflow&lt;/code&gt; 內容。&lt;/p&gt;

&lt;p&gt;因為是在背景執行又沒有吐出資料，那麼我們要怎麼測試這個 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Engine&lt;/code&gt; 是不是每一步都有執行到，又要怎麼樣把每一步的結果傳出來到測試當中呢？&lt;/p&gt;

&lt;p&gt;這時 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;promise(...)&lt;/code&gt; 就很好用了，先把 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;promise&lt;/code&gt; 開好，再傳到非同步的函式內去呼叫 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;resolve(...)&lt;/code&gt; ，這樣子就可以把中間的狀態送到外層去，而且在測式內也不用寫很醜的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sleep(5000)&lt;/code&gt; 。&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sleep(5000)&lt;/code&gt;一開始付出的成本還好，等到專案寫了一年後，有上百個測式都在 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sleep(5000)&lt;/code&gt; ，然後偶爾因為 CI 的機器太慢，等的不夠久造成程式失敗，重跑又要十幾分鐘，你就會知道為什麼要用 promise API 了。&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;describe(&quot;workflow&quot;, () =&amp;gt; {
    const engine = new Engine(pub)
    it(&quot;can step through steps&quot;, async () =&amp;gt; {
        const name = randomString(10)
        const result = promise&amp;lt;any&amp;gt;()
        const workflow = WorkflowBuilder.newBuilder(name)
            .from({
                name: &quot;step-1&quot;,
                run(context: Context, event: Event) {
                    return 2
                }
            })
            .to({
                name: &quot;step-2&quot;,
                run(context: Context, event: Event) {
                    result.resolve(context)
                    return
                }
            })
            .build()
        engine.register(workflow)
        engine.trigger(workflow, {&quot;msg&quot;: &quot;hello&quot;})

        const ret = await result.await()
        expect(ret).toStrictEqual({...})
    })
})


&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
            <pubDate>Wed, 22 Sep 2021 06:00:00 +0000</pubDate>
            <link>https://blog.yunglinho.com/blog/2021/09/22/typescript-promise-api/</link>
            <guid isPermaLink="true">https://blog.yunglinho.com/blog/2021/09/22/typescript-promise-api/</guid>
            
            
        </item>
        
        <item>
            <title>悼自由美國之死</title>
            <description>&lt;p&gt;在二三十年前，在我小的時候，常聽到自由美國、自由美國，似乎美國就是自由的象徵。&lt;/p&gt;

&lt;p&gt;後來，我來到美國後，才知道，美國這塊土地上，住著兩種不同思想的人，一種是崇尚個人主義的冒險家，另一種則是崇尚集體主義的社會主義者。兩種截然不同的人，一直衝突跟對抗。&lt;/p&gt;

&lt;p&gt;我個人是偏向前者的，我常跟人說，美國能夠偉大，站在全世界前面，一直領導的一個重大原因是聯邦制度，美國是一個超大的 A/B Test ，五十個州，州民的差異很小，很適合來做實驗的對照組。一個新的社會問題出現，各州採取不一樣的政策，十年之後，可以收集到許多的資料，來比較各種政策的差異好壞，然後做出選擇推到全國去。&lt;/p&gt;

&lt;p&gt;相較於台灣，就有點像是在尋找明君尋找超人了，一個新的問題出現，我們就在找一個超人，能夠在問題的初期，就看穿問題，找出答案。但真有這種超人的存在嗎？還是說，因為也沒有了替代方案的資料，大家也只能默默的接受，這就是(區域內)的最佳解了。&lt;/p&gt;

&lt;p&gt;許多人不懂，以為我反疫苗、反口罩。其實，這只是我實踐我政治觀念的手法而已。我反對的是「強制疫苗施打」「強制全民戴口罩」的政策，我反對的是全民找超人，反對把 A/B Test 的機制給消滅掉。&lt;/p&gt;

&lt;p&gt;在政治學上有個學理叫 &lt;a href=&quot;https://en.wikipedia.org/wiki/Overton_window&quot;&gt;Overton Window&lt;/a&gt;，講的是言論自由的空間，言論自由是一個光譜，從極左到極右，中間有一個區塊，是眾人能夠接受的言論。目前在美國，這個區塊越來越小，也越來越偏左。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021-08/Overton_Window.png&quot; alt=&quot;Overton&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Overton Window 的縮小並不是好事，因為它代表了我們面對未知事情時，自我縮限了探索解決方案的空間。有時候，答案往往不是在眾人能夠接受的範圍出現。舉個極端一點的例子，在愛因斯坦相對論出現之前，牛頓力學才是眾多學者能夠接受的共識解。如果我們的研究只能在眾人同意的範圍間進行，那麼不止是相對論，可能現在我們都還在談地平說。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021-08/Overton_Window_2.png&quot; alt=&quot;Overton&quot; /&gt;&lt;/p&gt;

&lt;p&gt;那如何要把 Overton Window 放大呢？那就是要多談在眾人可以接受的領域之外的事務，擴大邊際，搜索不同的可能。&lt;/p&gt;

&lt;p&gt;那麼為什麼我要反對「強制戴口罩」政策呢？因為如果全國都施行一樣的政策，那麼我們怎麼知道「戴口罩」有多有效呢？&lt;/p&gt;

&lt;p&gt;還好有&lt;a href=&quot;https://archive.is/69D2g&quot;&gt;喬治亞州的研究資料&lt;/a&gt;，喬治亞州在過去 18 個月來，予許各學區自己做決定，因此收集到許多不同防疫方式的比較資料，對於學童戴不戴口罩的問題，戴口罩較不戴有減少 20% 的染病數，但是在統計上並沒有顯注的意義，這個差距可能是其它更多不同的因素等導制。&lt;/p&gt;

&lt;p&gt;至於「強制施打疫苗」，更是絕不該進行了，強制打下去，所有的長期影響，在沒有對照組的狀況下，未來將看不出來疫苗是否有造成其它疾病的發生率增加。&lt;/p&gt;

&lt;p&gt;另外，在我另一篇文章提到過，我不認為 FDA 的臨床試驗機制有正常執行。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021-08/feynman.jpg&quot; alt=&quot;feynman&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;科學家信賴的是科學研究的過程，不信仰應服宗教般的口號。&lt;/p&gt;

  &lt;p&gt;關於疫苗，我們要看的是 FDA 臨床試驗的機制是怎樣跑的。在 18 個月中，透過三期的小量人口實驗，看看對人體有沒有短期的影響，在藥物上市之後，大幅度人體實驗後，要再長期追蹤他的影響。&lt;/p&gt;

  &lt;p&gt;許多的新藥，就在第三期失敗，也有許多在上市多年後，才發現有長期的影響。&lt;/p&gt;

  &lt;p&gt;關於新冠疫苗，這次的 FDA 臨床試驗機制有正常執行嗎？以現在壓迫反對言論的狀況下，我不覺得 FDA 臨床試驗機制有正常執行。&lt;/p&gt;

  &lt;p&gt;如果費曼先生還在世，我想，他會跟 &lt;a href=&quot;https://odysee.com/@BretWeinstein:f/how-to-save-the-world,-in-three-easy:0&quot;&gt;Dr R.Malone&lt;/a&gt; 一樣，出來呼預重視不良反應的數據。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;一個簡單的檢驗方式是，請「強制施打疫苗的支持者」告訴我，目前因為疫苗的不良反應而死亡的數字有多少？這個數字絕不會是零，但美國目前因為 Overton Window 的縮限，跟本不敢有單位去碰這些敏感的案例。&lt;/p&gt;

&lt;p&gt;連不良反應的案例都不敢去檢驗，不敢去收集數據，怎麼能說 FDA 臨床試驗機制有正常執行呢？&lt;/p&gt;

&lt;p&gt;最後，談到我個人對疫情的看法。&lt;/p&gt;

&lt;p&gt;綜觀人類歷史，對抗病毒就是這樣了，在三年內，每個人都會染病，病毒會帶走一部分抵抗力弱的人，剩下來病毒的影響力就變弱，淡出歷史的舞台。（這條路在國際舞台上並不是這麼的極端，瑞典跟日本就選擇了這條路）&lt;/p&gt;

&lt;p&gt;除非科技有突破（目前看來失敗了），那就是看個體免疫力有多強了。如果只是躲在家中，少接觸各種細菌病毒，反而免疫力是會下降的。&lt;/p&gt;

&lt;p&gt;至於口罩教派跟疫苗教派的信徒，還是停止被政治人物當成工具吧，口罩是否能消滅疫情，看台灣跟日本就知道了，當一個政策有 95~99% 的人遵守都還沒有效，那就是沒效。在美國吵這個問題，只是政治人物拿來操作而以，讓選民集合起來鬥爭另一群人，來爭取政治人物的選票。&lt;/p&gt;

&lt;p&gt;至於疫苗是否有效，就當他真的有六個月的效力好了，但是頂級期刊 Nature 都講了，&lt;a href=&quot;https://archive.is/eBreK&quot;&gt;Corona Virus 是人畜共通疾病，已經在野鹿上大量的找到抗體&lt;/a&gt;，&lt;a href=&quot;https://archive.is/qEzI8&quot;&gt;Corona Virus 將與人類共存&lt;/a&gt;。如果病毒的變化不能避免，病毒在有施打疫苗的人群中異變的更快，那疫苗的做用是什麼？還是說疫苗教派的要連野生動物都抓來打疫苗？&lt;/p&gt;

&lt;p&gt;最終，我覺得還是要走回宗教或哲學，大家明瞭，生命就是這麼脆弱，大自然就是這麼嚴苛。&lt;/p&gt;
</description>
            <pubDate>Wed, 25 Aug 2021 06:30:00 +0000</pubDate>
            <link>https://blog.yunglinho.com/blog/2021/08/25/death-of-individualism/</link>
            <guid isPermaLink="true">https://blog.yunglinho.com/blog/2021/08/25/death-of-individualism/</guid>
            
            
        </item>
        
        <item>
            <title>[Typescript] Configuration</title>
            <description>&lt;p&gt;最近開始使用 Typescript 跟 Nodejs 在新公司的新專案上面，碰上的問題之一就是，該怎麼寫設定檔。&lt;/p&gt;

&lt;p&gt;寫設定檔不外乎幾種方式&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;.env
    &lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;key=value
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;JSON
    &lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;env&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;test&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;database&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;host&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;db.example.com&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;YAML
    &lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;test&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# comment&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;database&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;host&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;db.example.com&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/lightbend/config/blob/master/HOCON.md&quot;&gt;HOCON&lt;/a&gt;
    &lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;env: test
database:
  host: &quot;...&quot;
   database.port: 5678  
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;前兩者的缺點很明顯，從 Scala &lt;a href=&quot;https://github.com/lightbend/config&quot;&gt;typesafe config&lt;/a&gt; (使用 HOCON) 的轉過來我，自然無法接受前三種格式。&lt;/p&gt;

&lt;p&gt;.env 的缺點是只支援 key=value 的格式，所有東西都是平的，沒有階層的觀念，也不支援矩陣 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;a,b,c&lt;/code&gt; 等複雜一點的資料型態。&lt;/p&gt;

&lt;p&gt;json 的缺點是，雖然支源了複雜一點的資料型態，但是不能寫註解，跟本不能用啊，專案多人共同進行，怎麼知道為什麼某個欄位在不同的環境為什麼要用不同的值。&lt;/p&gt;

&lt;p&gt;yaml 跟 HOCON 沒有上述的缺點，甚至還可以寫 schema 檔，來做格式驗證，但是不知道為什麼在 nodejs 這邊不怎麼流行。&lt;/p&gt;

&lt;p&gt;後來想一想，在 &lt;em&gt;Typescript&lt;/em&gt; 這邊，似乎不用什麼複雜的方案，直接用 Ts 的內建功能就夠了&lt;/p&gt;

&lt;div class=&quot;language-typescript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;cm&quot;&gt;/*
 * This approach supports:
 *  - complex types
 *  - schema validation through type checking.
 *  - comments
 *  - dynamic reloading !!
 */&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Config&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;dev&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;stg&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;prod&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;db&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;DBConfig&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;DBConfig&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;host&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kr&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kr&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;password&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kr&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;database&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kr&quot;&gt;string&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;devConfig&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Config&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;dev&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;db&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;host&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;process&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;DB_HOST&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;localhost&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;process&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;DB_USERNAME&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;password&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;process&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;DB_PASSWORD&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt;  &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;p@ssword&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;database&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;process&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;DB_DATABASE&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;db&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;getConfig&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kr&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;process&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;NODE_ENV&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Config&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;switch&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;devConfig&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;dev&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;devConfig&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;stg&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;stagingConfig&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;prod&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;prodConfig&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;nl&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;`unsupported environment &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;這個方式可以直接寫程式控制設定檔，而且還支援動態載入，修改設定檔，可以透過 nodemon ，不用手動重開 node ，可以自動重新載入新的設定檔，提高工程師的生產力。&lt;/p&gt;
</description>
            <pubDate>Wed, 25 Aug 2021 04:30:00 +0000</pubDate>
            <link>https://blog.yunglinho.com/blog/2021/08/25/typescript-config/</link>
            <guid isPermaLink="true">https://blog.yunglinho.com/blog/2021/08/25/typescript-config/</guid>
            
            
        </item>
        
        <item>
            <title>現代版焚書坑儒</title>
            <description>&lt;p&gt;Kamala Harris 這禮拜被民主黨提名為副總統候選人，反對 Kamala 的人士，幫她做了個網頁 http://kamalaharris.info/ ，引用新聞媒體來說講述 Kamala 
強迫監獄犯人去滅森林大火、嘲笑因為父母因為坐勞而無法上學的小孩、反對幫重刑犯做 DNA 檢驗、支持死刑、支持未經法院審判而爭
收嫌疑犯的財產、支持對總統候選人 Biden 的性侵指控。&lt;/p&gt;

&lt;p&gt;這網頁的資料，還都是引用跟 Harris 同樣的政治派系， progressive liberal 進步左派的媒體 Huffington Post, New York Times, LA Times 的資料。&lt;/p&gt;

&lt;p&gt;沒想到這網站，竟然被臉書禁掉了，無法貼在臉書上，這就是民主黨支持者的真面目。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2020-10/banned_by_facebook.png&quot; alt=&quot;img&quot; /&gt;&lt;/p&gt;

&lt;p&gt;https://lbry.tv/kamalaharris-info:50321811b2fdae0ce66c0f8059bea9580888dac1&lt;/p&gt;
</description>
            <pubDate>Thu, 13 Aug 2020 02:30:00 +0000</pubDate>
            <link>https://blog.yunglinho.com/blog/2020/08/13/morden-day-buring-books/</link>
            <guid isPermaLink="true">https://blog.yunglinho.com/blog/2020/08/13/morden-day-buring-books/</guid>
            
            
        </item>
        
        <item>
            <title>美國內戰</title>
            <description>&lt;p&gt;臉書上的好友，不少都知道我最近三四個月，都不務正業，那我在幹麻呢？在為美國打內戰做準備。&lt;/p&gt;

&lt;p&gt;那美國內戰是怎麼打起來的呢？&lt;/p&gt;

&lt;p&gt;情節一：&lt;/p&gt;
&lt;blockquote&gt;
  &lt;ol&gt;
    &lt;li&gt;11/3當晚川普票面領先。川普在 mail-in ballot數完前宣布勝利，拜登則是不同意。&lt;/li&gt;
    &lt;li&gt;之後幾天，mail-in ballot進來，川普被逆轉，拜登宣布勝利。&lt;/li&gt;
    &lt;li&gt;川普打官司挑戰mail-in ballot的真實性。&lt;/li&gt;
    &lt;li&gt;拜登開始任命新內閣班子。&lt;/li&gt;
    &lt;li&gt;川普 1/20 日拒絕離開白宮，拜登在紐約宣誓就職，成為繼華盛頓之後第二個在曼哈頓就職的總統。&lt;/li&gt;
    &lt;li&gt;拜登任命的司法部官員赴各地上班，接管local FBI和US attorney office, 在藍州順利接班，而在紅州被亂棍打出。&lt;/li&gt;
    &lt;li&gt;軍方宣布不介入川拜之爭, 不服從川普防長和拜登防長的任何命令。&lt;/li&gt;
  &lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;情節二：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;有幾個州已經州議會投票通過，要把選舉人票投給全國選票領先的候選人，而不是當州領先的候選人。如果藍州如加州，反對黨根本懶得去投票，也不清楚有其他州修改了遊戲規則，就真的沒去投。最後川普總票數輸了，雖然照舊制會拿下選舉人票數獲勝，但是照新制，因為輸了總票數，所以有些搖擺州雖然是川普得票領先但是選舉人票還是都給了拜登，最後照新制是拜登當選&lt;/p&gt;

  &lt;p&gt;註：&lt;del&gt;&lt;a href=&quot;https://www.cnn.com/2020/02/12/politics/va-house-electoral-college-popular-vote/index.html&quot;&gt;維吉尼亞州議會投票通過，把選舉人票投給全國得票領先的候選人&lt;/a&gt;，維吉尼亞是搖擺州，最近民主黨拿下多數席位，不知道什麼時候再會丟掉多數席位，稱民主黨是多數時，通過這種方案，想辦法把維吉尼亞的選舉人票綁住。&lt;/del&gt;&lt;/p&gt;

  &lt;p&gt;08/05 註二：上述法案被參議員擱置，明年才會審。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;del&gt;恐怖故事說到這邊，請問有幾個人知道，美國已經改了選制的？如果開完了票，選民才發現原來選制改了，選輸的選民能服氣嗎？&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;這兩個狀況不是我說說而已，情節一是民主黨跟共和黨內反川派推演出來的，情節二是民主黨內推動改選制推演出來的，兩者的發生的可能性都很高。&lt;/p&gt;

</description>
            <pubDate>Tue, 04 Aug 2020 08:00:00 +0000</pubDate>
            <link>https://blog.yunglinho.com/blog/2020/08/04/civil-war-ii/</link>
            <guid isPermaLink="true">https://blog.yunglinho.com/blog/2020/08/04/civil-war-ii/</guid>
            
            
        </item>
        
        <item>
            <title>Pateron</title>
            <description>&lt;p&gt;這個事件太有趣了，我解釋清楚一些&lt;/p&gt;

&lt;p&gt;Patreon是個類似Youtube的付費平台，可以讓內容供應商在上面刊登付費的影片，或者是訂購贊助。&lt;/p&gt;

&lt;p&gt;Patreon的使用者合約上寫到，使用者如果跟平台有爭執時，需要通過加州的仲裁機構來仲裁。&lt;/p&gt;

&lt;p&gt;然後加州有個特別的規定，仲裁的費用，需要由被告的人負擔，這算是保障消費者的一環。&lt;/p&gt;

&lt;p&gt;前一段時間 Patreon 把許多保守派的內容主提出平台，本來是內容主們告 Patreon ，但不知道那個天才發現使用者合約的漏洞，要求粉絲去告 Patreon ，然後有上千個粉碎加入，因為一個仲裁的費用是上萬塊美金，上千個粉絲去告，就要上千萬美金，現在 Patreon 無力負擔這筆費用，只要靠仲裁，不用開打，就可以弄到 Patreon 破產&lt;/p&gt;

&lt;p&gt;Patreon 發現出問題後，修改使用者合約，並上法院要求使用新合約時，被法官罵，你要不要臉，使用者合約是你們寫的，遊戲規則是你自己定的，怎麼可以臨時改遊戲規則&lt;/p&gt;

&lt;p&gt;在美國開公司，好的律師帶你上天堂，糟的律師讓你下地獄，連官司都不用開打，公司就要倒了&lt;/p&gt;

&lt;iframe src=&quot;https://www.facebook.com/plugins/post.php?href=https%3A%2F%2Fwww.facebook.com%2Felderengineer%2Fposts%2F1798558840287255&amp;amp;width=500&quot; width=&quot;500&quot; height=&quot;801&quot; style=&quot;border:none;overflow:hidden&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; allowtransparency=&quot;true&quot; allow=&quot;encrypted-media&quot;&gt;&lt;/iframe&gt;
</description>
            <pubDate>Thu, 30 Jul 2020 08:00:00 +0000</pubDate>
            <link>https://blog.yunglinho.com/blog/2020/07/30/pateron/</link>
            <guid isPermaLink="true">https://blog.yunglinho.com/blog/2020/07/30/pateron/</guid>
            
            
        </item>
        
        <item>
            <title>技術是熟的好</title>
            <description>&lt;p&gt;工作半年的新工作用的技術是 Actor Model ，我老是被公司的 CTO 說我是 Java 背景的老古板。 Actor Model 越用我越不覺的他有比 shared memory 好到哪裡去。&lt;/p&gt;

&lt;p&gt;shared memory concurrency 像是在玩火，我玩火玩十幾年了，早就知道怎麼樣不會被火燒到。&lt;/p&gt;

&lt;p&gt;Actor Model 是在玩線程，每天都在看到底同一個 actor 要開多少個要給多少線程， actor 開少了，機器再快效率也不會變好，到最後變成在玩自己，每幾天就有人被 akka 整到，玩線程玩到被吊起來。&lt;/p&gt;

&lt;p&gt;程式就是這樣，用上手就好，反正到最後分高下的，大多是對工具的熟悉的。&lt;/p&gt;

&lt;p&gt;最近真的體會到為什麼老少工程師會處不來了，上面的例子是一個，還有像是資料庫的選用， NoSQL推行十幾年後，現在的年輕人要用資料庫就是 NoSQL 中選一個，沒人要用 SQL ，要寫測試，還不准我用通用的 SQL 來建假資料，一定要用的難看的 slick DSL ，這世界真的反了。&lt;/p&gt;

&lt;p&gt;結論就是，大多數人就是把二十多歲前接觸的世界當常態，然後用一輩子在這個時間凍結的世界內，最佳化自己的生活方式。&lt;/p&gt;

&lt;p&gt;好啦，有用老頭技術的小公司可以來找我談談了，我年紀大了，跟新技術處不來了&lt;/p&gt;
</description>
            <pubDate>Sat, 29 Feb 2020 08:00:00 +0000</pubDate>
            <link>https://blog.yunglinho.com/blog/2020/02/29/mature-tech/</link>
            <guid isPermaLink="true">https://blog.yunglinho.com/blog/2020/02/29/mature-tech/</guid>
            
            
        </item>
        
        <item>
            <title>Synology上設定 wordpress &amp; let'sencrypt 的方法</title>
            <description>&lt;!-- wp:paragraph --&gt;
&lt;p&gt;快被 Synology 跟 Comcast 整慘了，正常運作的網站，突然有一天，因為 HTTPS Certificate 的原故連不上了，被整了好幾個小時，所以還是記下怎麼處理好的。&lt;br /&gt;&lt;br /&gt;在 Synology DSM 6.3 上面要正常跑 wordpress &amp;amp; nginx &amp;amp; let's encrypt 的話&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:list --&gt;
&lt;ul&gt;&lt;li&gt;先安裝 PHP 7.3 ，然後在 Web Station 中新增 PHP 7.3 ，記得要勾選 curl &amp;amp; mysqli extension&lt;/li&gt;&lt;li&gt;在 wordpress virtualhost 的設定中選用 nginx &amp;amp; php 7.3&lt;/li&gt;&lt;li&gt;然後到 Control Panel -&amp;gt; Security -&amp;gt; Certificate 的地方新增 Certificate from let's encrypt.&lt;/li&gt;&lt;/ul&gt;
&lt;!-- /wp:list --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;如果新增失敗的話，用 ssh 登入，然後跑下面的指令&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:quote --&gt;
&lt;blockquote class=&quot;wp-block-quote&quot;&gt;&lt;p&gt;sudo /usr/syno/sbin/syno-letsencrypt new-cert -d &amp;lt;host&amp;gt; -m &amp;lt;email&amp;gt; -v&lt;/p&gt;&lt;/blockquote&gt;
&lt;!-- /wp:quote --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;這樣子會吐出一堆 let's encrypt 給的 debug urls ，把 url 點開，就可以看是那邊出錯了。&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;
</description>
            <pubDate>Fri, 25 Oct 2019 08:00:00 +0000</pubDate>
            <link>https://blog.yunglinho.com/blog/2019/10/25/enable-letsencrypt-on-wordpress-and-synology/</link>
            <guid isPermaLink="true">https://blog.yunglinho.com/blog/2019/10/25/enable-letsencrypt-on-wordpress-and-synology/</guid>
            
            
        </item>
        
        <item>
            <title>如何對抗老化</title>
            <description>&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/75doh5hJVRI&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:list {&quot;ordered&quot;:true} --&gt;
&lt;ol&gt;&lt;li&gt;何時進食比吃了什麼重要，採用日間的斷食療法&lt;/li&gt;&lt;li&gt;分子化學已經找出來斷食療法的關鍵酮&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://nutritionreview.org/2019/05/fasting-molecule-exerts-anti-aging-effects-to-protect-vascular-system/&quot;&gt;https://nutritionreview.org/2019/05/fasting-molecule-exerts-anti-aging-effects-to-protect-vascular-system/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;運動及酮療法，可以讓老鼠活更久，兩者都使用的話活的更久。&lt;/li&gt;&lt;li&gt;科學家在20年前就找到能夠讓老鼠或稻穀活更久(5~20%)的基因&lt;/li&gt;&lt;li&gt;大部份研究抗老化的科學家都有服用 nmn &lt;br /&gt;&lt;a href=&quot;https://drjohnday.com/6-foods-to-reverse-aging-with-nmn/&quot;&gt;https://drjohnday.com/6-foods-to-reverse-aging-with-nmn/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;作者還有服用 Resveratrol&amp;nbsp;及 1g Metformin ，後者是糖尿病用藥，但是作者沒有糖尿病&lt;/li&gt;&lt;li&gt;AMPK Sirtuins mTOR 是老化的三條路，前兩者有低風險的藥物可使用（前述的藥物）&lt;/li&gt;&lt;li&gt;洗三溫暖，冷熱交替也可以抗老化&lt;/li&gt;&lt;li&gt;低糖低碳飲食&lt;/li&gt;&lt;li&gt;少吃紅肉，紅肉含 amino acid 會觸發 mTOR&lt;/li&gt;&lt;li&gt;branch chain amino acid 對運動的表現有幫助，但作者認為長期會導至老化&lt;/li&gt;&lt;/ol&gt;
&lt;!-- /wp:list --&gt;
</description>
            <pubDate>Wed, 19 Jun 2019 08:00:00 +0000</pubDate>
            <link>https://blog.yunglinho.com/blog/2019/06/19/anti-aging/</link>
            <guid isPermaLink="true">https://blog.yunglinho.com/blog/2019/06/19/anti-aging/</guid>
            
            
        </item>
        
    </channel>
</rss>
