<?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"><channel><title><![CDATA[Howard's Note]]></title><description><![CDATA[A nice starter blog post boilerplate template built using Gatsby.]]></description><link>https://abhaynikam.github.io/gatsby-nice-blog</link><generator>GatsbyJS</generator><lastBuildDate>Thu, 24 Mar 2022 11:03:08 GMT</lastBuildDate><item><title><![CDATA[最近近況]]></title><description><![CDATA[最近遇到了一點事情，整個人彷彿疊落到谷底，什麼都不想要做。每天都活在可怕的自我懷疑的負面情緒裡。 比較可惜的是，在事情發生前，我正在看。筆記整理到了一半，看起來八成是又要變成我的待辦清單之一了。 自大 19年到21年年底前，我生活還蠻順利的。工作上技術不斷的突破。2…]]></description><link>https://abhaynikam.github.io/gatsby-nice-blog/2022-03-24/</link><guid isPermaLink="false">https://abhaynikam.github.io/gatsby-nice-blog/2022-03-24/</guid><pubDate>Thu, 24 Mar 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近遇到了一點事情，整個人彷彿疊落到谷底，什麼都不想要做。每天都活在可怕的自我懷疑的負面情緒裡。&lt;/p&gt;
&lt;p&gt;比較可惜的是，在事情發生前，我正在看&lt;code class=&quot;language-text&quot;&gt;clojure&lt;/code&gt;。筆記整理到了一半，看起來八成是又要變成我的待辦清單之一了。&lt;/p&gt;
&lt;h2&gt;自大&lt;/h2&gt;
&lt;p&gt;19年到21年年底前，我生活還蠻順利的。工作上技術不斷的突破。20年在社群上嘗試分享了自己的一些學習心得，發現了自己的不足之處，也讓我也有更多的動力去看、去學習更多有趣的新技術。&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;strong&gt;自信與自大造成的無知，又在我自己身上印證了一次&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;負面情緒是真實存在且必須要認真學習處理的&lt;/h2&gt;
&lt;p&gt;最近遇到了一些挫折。工作不順利，生活中出現了一些問題，才讓我發現，我根本不像我自以為的這麼強大、這麼自信。&lt;/p&gt;
&lt;p&gt;我真實的感受到了憂鬱的可怕。像是一個無盡的黑洞，每天從一早起來，就開始抽乾心理的快樂、期待。剩下的只有無盡的悲傷和自我懷疑。&lt;/p&gt;
&lt;p&gt;完全可以體會羅琳當初是怎麼創造出催狂魔這種生物。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;它是真實存在的嗎？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我曾經認為一切的悲傷都是假的，都是人的生理反應造成的錯覺。可以透過運動、做自己有興趣的事……等等心靈雞湯常見的解決方式解決。&lt;/p&gt;
&lt;p&gt;直到自己真的的卡在這樣的漩渦出不來，我才意識到：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;負面情緒是真實存在的&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;什麼做事、運動，當真的進入憂鬱的漩渦中，這些都像是廢話一樣讓人厭惡。&lt;/p&gt;
&lt;h2&gt;克服&lt;/h2&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;</content:encoded></item><item><title><![CDATA[Cljure FAQ]]></title><description><![CDATA[Recently I try to learn clojure. Here are some problem noted that I face when I play in clojure & clojurescript what is  file When Clojure…]]></description><link>https://abhaynikam.github.io/gatsby-nice-blog/2022-01-30/</link><guid isPermaLink="false">https://abhaynikam.github.io/gatsby-nice-blog/2022-01-30/</guid><pubDate>Sun, 30 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Recently I try to learn clojure.&lt;/p&gt;
&lt;p&gt;Here are some problem noted that I face when I play in clojure &amp;#x26; clojurescript&lt;/p&gt;
&lt;h2&gt;what is &lt;code class=&quot;language-text&quot;&gt;.cljc&lt;/code&gt; file&lt;/h2&gt;
&lt;p&gt;When Clojure or ClojureScript needs to load a namespace, they first look for the platform-specific file (.class then .clj on Clojure and .cljs on ClojureScript) and if not found, then they look for the .cljc file.&lt;/p&gt;
&lt;p&gt;Clojure versions &gt;= 1.7, I can name a file foo.cljc if I want it to be available for loading with require or use both from Clojure and Clojurescript.&lt;/p&gt;
&lt;p&gt;ref &lt;a href=&quot;https://stackoverflow.com/questions/38676944/basic-functionality-of-cljc-files&quot;&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;custom macro linter error&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;ref &lt;a href=&quot;https://github.com/clj-kondo/clj-kondo/issues/536&quot;&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;define custom config &lt;code class=&quot;language-text&quot;&gt;:lint-as&lt;/code&gt; treat custom macro as built-in macro:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;clojure&quot;&gt;&lt;pre class=&quot;language-clojure&quot;&gt;&lt;code class=&quot;language-clojure&quot;&gt;	  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:lint-as&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;rum.core/defcs clojure.core/def&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	   &lt;span class=&quot;token symbol&quot;&gt;:linters&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:unresolved-symbol&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:exclude&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;rum.core/defcs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Also note from &lt;a href=&quot;https://github.com/clj-kondo/clj-kondo/blob/master/doc/config.md&quot;&gt;here&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;There is four way to setup linter config:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;home dir config in ~/.config/clj-kondo/config.edn (respects XDG&lt;em&gt;CONFIG&lt;/em&gt;HOME)&lt;/li&gt;
&lt;li&gt;project config: a &lt;code class=&quot;language-text&quot;&gt;config.edn&lt;/code&gt; file in the &lt;code class=&quot;language-text&quot;&gt;.clj-kondo&lt;/code&gt; directory&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;:config-paths&lt;/code&gt; in project &lt;code class=&quot;language-text&quot;&gt;config.edn&lt;/code&gt;: a list of directories that provide additional config&lt;/li&gt;
&lt;li&gt;command line &lt;code class=&quot;language-text&quot;&gt;--config&lt;/code&gt; file or EDN arguments&lt;/li&gt;
&lt;li&gt;namespace local config using &lt;code class=&quot;language-text&quot;&gt;:clj-kondo/config&lt;/code&gt; metadata in the namespace form&lt;/li&gt;
&lt;/ol&gt;</content:encoded></item><item><title><![CDATA[data inspect note]]></title><description><![CDATA[Just some useful toolkit note, including api, useful tip, etc. request data There are two most use library in python world, acording to…]]></description><link>https://abhaynikam.github.io/gatsby-nice-blog/2021-12-16-python-data-inspect-note1/</link><guid isPermaLink="false">https://abhaynikam.github.io/gatsby-nice-blog/2021-12-16-python-data-inspect-note1/</guid><pubDate>Thu, 16 Dec 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Just some useful toolkit note, including api, useful tip, etc.&lt;/p&gt;
&lt;h2&gt;request data&lt;/h2&gt;
&lt;p&gt;There are two most use library in python world, acording to Google search: &lt;code class=&quot;language-text&quot;&gt;request&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;http.client&lt;/code&gt;. &lt;code class=&quot;language-text&quot;&gt;request&lt;/code&gt; seems a easiest and quickest way to fetch web content and api.&lt;/p&gt;
&lt;p&gt;but &lt;code class=&quot;language-text&quot;&gt;http.client&lt;/code&gt; seems to be more oo way. so I just try to use &lt;code class=&quot;language-text&quot;&gt;http.client&lt;/code&gt; to fetch data instead.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; http&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;client
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; json
url &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;www.twse.com.tw&apos;&lt;/span&gt;
route &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;/v1/exchangeReport/MI_INDEX&apos;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# params just the parameter u want to use in GET request&lt;/span&gt;
params &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; urllib&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parse&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;urlencode&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;date&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; date&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;response&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;json&apos;&lt;/span&gt; 
    &lt;span class=&quot;token string&quot;&gt;&apos;_&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;round&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;time&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;time&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;500&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Note that don&apos;t need to add protocal (http or https) in url.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# instend, just choose to use HTTPSConnection or HttpConnection to make a request.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# also note that port is needed to be selected.&lt;/span&gt;
client &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; http&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;client&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;HTTPSConnection&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;443&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; timeout&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; 
client&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;request&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;GET&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&apos;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;_route&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;params&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; client&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;getresponse&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; res&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 
    &lt;span class=&quot;token comment&quot;&gt;# use json to loads the response and parse to dict.&lt;/span&gt;
    data &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; json&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;loads&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;res&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;read&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; 
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; data&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;panda&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; panda &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; pd&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;load json to data farme:&lt;/p&gt;
&lt;p&gt;use Dataframe. in my case, I use &lt;code class=&quot;language-text&quot;&gt;json.loads&lt;/code&gt; + Dataframe + &lt;code class=&quot;language-text&quot;&gt;pd.concat&lt;/code&gt; to achieve goal.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;load_to_df&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;filename&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; df&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;filename&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;r&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; f&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            j &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; json&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;loads&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;f&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;read&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token comment&quot;&gt;# concat&lt;/span&gt;
            date &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; filename&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;split&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;.&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&apos;load date: &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;date&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            temp &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; pd&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;DataFrame&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;columns&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;j&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;fields8&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; data&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;j&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;data8&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; index&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&apos;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;date&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;i&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;)&apos;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; i&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _ &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;enumerate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;j&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;data8&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            df &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; pd&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;concat&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;df&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; temp&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;except&lt;/span&gt; Exception &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;[ERROR] error happen in file: &apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; filename&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&apos;[ERROR] msg: &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; df&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;pd.concat&lt;/code&gt; will create a new DataFframe, that is good, in my opinion.&lt;/p&gt;
&lt;p&gt;note that use &lt;code class=&quot;language-text&quot;&gt;for comprehension&lt;/code&gt; to create index, which is a elegent way to create, and show purpose.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;get data row from DataFrame by index.&lt;/p&gt;
&lt;p&gt;Just find two api that may be useful: &lt;code class=&quot;language-text&quot;&gt;df.loc()&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;df.ioc()&lt;/code&gt;. This time I just use &lt;code class=&quot;language-text&quot;&gt;loc()&lt;/code&gt; to acheive my goal.&lt;/p&gt;
&lt;p&gt;ref from: &lt;a href=&quot;https://www.shanelynn.ie/pandas-iloc-loc-select-rows-and-columns-dataframe/#1-pandas-iloc-data-selection&quot;&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get_overall_by_date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;date&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; df&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; df&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;loc&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;date &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&apos;(&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;i&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;)&apos;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; i &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Data visualization.&lt;/h2&gt;
&lt;p&gt;Choose to use matplotlib, which seems a easiest solution.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; matplotlib&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pyplot &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; plt&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[jupyter notebook nbextensiions 404 issue.]]></title><description><![CDATA[問題 安裝，重新啟動終端機後 ，打開  不會出現 nb-extentions 頁簽。 web consle 出現以下 error 訊息：  Root cause 會發生這個問題的原因是因為，jupyter notebook 的作用域／環境變數設定，跟 nb-extentions…]]></description><link>https://abhaynikam.github.io/gatsby-nice-blog/2021-12-05-python-notebook-nbextensions-issue/</link><guid isPermaLink="false">https://abhaynikam.github.io/gatsby-nice-blog/2021-12-05-python-notebook-nbextensions-issue/</guid><pubDate>Sun, 05 Dec 2021 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;問題&lt;/h2&gt;
&lt;p&gt;安裝&lt;code class=&quot;language-text&quot;&gt;jupyter note extentions&lt;/code&gt;，重新啟動終端機後 ，打開 &lt;code class=&quot;language-text&quot;&gt;jupyter notebook&lt;/code&gt; 不會出現 nb-extentions 頁簽。&lt;/p&gt;
&lt;p&gt;web consle 出現以下 error 訊息：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;Failed to load extension:
Array &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;nbextensions/nbextensions_configurator/tree_tab/main&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
 Error: Script error &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;nbextensions/nbextensions_configurator/tree_tab/main&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/487718130cc42365b45d88a324d46427/3dde1/error.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 8.227848101265824%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAACCAIAAADXZGvcAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAa0lEQVQI10XISw6DMAwAUe5/vS4aqSmhTWU7tsEhQanCoh9WSG8xmsGcNxfQQ7xGunhyTx1R7zAH+gfcUB88hyQTN9IOfEjaUTrJAH6U10LRFsw5rZZKlpq5rLJlrgLlOFyN617ad3t/Tu0H4A5uVIOYHlYAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;error message&quot;
        title=&quot;error message&quot;
        src=&quot;/static/487718130cc42365b45d88a324d46427/f058b/error.png&quot;
        srcset=&quot;/static/487718130cc42365b45d88a324d46427/c26ae/error.png 158w,
/static/487718130cc42365b45d88a324d46427/6bdcf/error.png 315w,
/static/487718130cc42365b45d88a324d46427/f058b/error.png 630w,
/static/487718130cc42365b45d88a324d46427/40601/error.png 945w,
/static/487718130cc42365b45d88a324d46427/3dde1/error.png 1018w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;Root cause&lt;/h2&gt;
&lt;p&gt;會發生這個問題的原因是因為，jupyter notebook 的作用域／環境變數設定，跟 nb-extentions 的不一致而產生。&lt;/p&gt;
&lt;h2&gt;Reproduce&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;使用venv進入某一個python 虛擬環境內。&lt;/li&gt;
&lt;li&gt;安裝&lt;code class=&quot;language-text&quot;&gt;jupyter notebook&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;安裝 nb-extentions。&lt;/li&gt;
&lt;li&gt;關閉終端機，重新開啟。&lt;/li&gt;
&lt;li&gt;直接進入 jupyter notebook。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Solution&lt;/h2&gt;
&lt;h3&gt;for now:&lt;/h3&gt;
&lt;p&gt;每一次使用 jupyter notebook 都進入前一次安裝的venv內。&lt;/p&gt;
&lt;h3&gt;better:&lt;/h3&gt;
&lt;p&gt;notebook 的 kernel 和 notebook 本身的安裝是分開來的。&lt;/p&gt;
&lt;p&gt;之後使用全域python重新安裝 notebook，&lt;/p&gt;
&lt;p&gt;並且在venv內設定 ipykernel，將ipykernel 安裝到 user目錄底下。&lt;/p&gt;
&lt;p&gt;ref: &lt;a href=&quot;https://zhuanlan.zhihu.com/p/33257881?utm_source=pocket_mylist&quot;&gt;https://zhuanlan.zhihu.com/p/33257881?utm_source=pocket_mylist&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Python Note]]></title><description><![CDATA[筆記 https://en.wikibooks.org/wiki/Python_Programming/Idioms http.client 封裝過的http (https) 請求。 基本使用方式： 下例是請求台灣證交所的API note: url不用加入協定（http…]]></description><link>https://abhaynikam.github.io/gatsby-nice-blog/2021-12-03-python-note/</link><guid isPermaLink="false">https://abhaynikam.github.io/gatsby-nice-blog/2021-12-03-python-note/</guid><pubDate>Fri, 03 Dec 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;筆記 &lt;a href=&quot;https://en.wikibooks.org/wiki/Python_Programming/Idioms&quot;&gt;https://en.wikibooks.org/wiki/Python_Programming/Idioms&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;http.client&lt;/h2&gt;
&lt;p&gt;封裝過的http (https) 請求。&lt;/p&gt;
&lt;p&gt;基本使用方式：&lt;/p&gt;
&lt;p&gt;下例是請求台灣證交所的API&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt; url &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;openapi.twse.com.tw&apos;&lt;/span&gt;
mi_index &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;/v1/exchangeReport/MI_INDEX&apos;&lt;/span&gt;
client &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; http&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;client&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;HTTPSConnection&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&apos;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;443&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; timeout&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 呼叫request後才會實際請求。&lt;/span&gt;
client&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;request&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;GET&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&apos;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;mi_index&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
res &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; client&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;getresponse&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
data &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; json&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;loads&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;res&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;read&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;note: url不用加入協定（http, https)，由使用的物件決定協定（&lt;code class=&quot;language-text&quot;&gt;http.client.HTTPSConnection&lt;/code&gt; vs &lt;code class=&quot;language-text&quot;&gt;https.client.HTTPConnection&lt;/code&gt;)。&lt;/p&gt;
&lt;p&gt;注意 request 的port，需要當作參數指定。預設http使用 80 port，https 使用443 port。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;python idiom&lt;/h2&gt;
&lt;p&gt;記錄python的貫用寫法加深印象。&lt;/p&gt;
&lt;h3&gt;錯誤處理&lt;/h3&gt;
&lt;p&gt;盡量使用 &lt;code class=&quot;language-text&quot;&gt;try ... except&lt;/code&gt; 的方式處理錯誤。&lt;/p&gt;
&lt;p&gt;python 的哲學以 EAFP (its Easier to Ask Forgiveness then Permission) 取代 LBYL (Look Before You Leap)。&lt;/p&gt;
&lt;p&gt;將有可能會發生錯誤的程式碼片段放在 &lt;code class=&quot;language-text&quot;&gt;try ... except&lt;/code&gt; 區塊內。&lt;/p&gt;
&lt;h3&gt;屬性使用方式&lt;/h3&gt;
&lt;p&gt;直接使用屬性，不使用 getter / setter 封裝。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;屬性是否為private，使用前綴底線(_prop)區分，依賴約定。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;dictionary vs class&lt;/h3&gt;
&lt;p&gt;變值是動態時使用 dictiory，靜態時使用 class。&lt;/p&gt;
&lt;h3&gt;discard variable&lt;/h3&gt;
&lt;p&gt;使用底線代表要被捨棄的變數。如使用tuple接回傳值時、或是指示忽略函式參數。&lt;/p&gt;
&lt;p&gt;也可以使用 &lt;code class=&quot;language-text&quot;&gt;*_&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;**_&lt;/code&gt; 搭棄 positional / keyword 拾棄傳進函式的印數。&lt;/p&gt;
&lt;p&gt;對應可變參數&lt;a href=&quot;##%20%E5%8F%AF%E8%AE%8A%E5%8F%83%E6%95%B8%20*args,%20**kwargs&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;*args&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;**kwargs&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;使用 else&lt;/h3&gt;
&lt;p&gt;可以在 try, for, while, if 後使用 else。&lt;/p&gt;
&lt;h2&gt;import 原則&lt;/h2&gt;
&lt;p&gt;impmort 模組，盡量避免引入 name ( function, class etc)。&lt;/p&gt;
&lt;p&gt;若直接引入名稱 ，將會產生新的名稱綁定。而這個命名綁定會跟模組底下的原命名不同（如果兩個名稱任一個被重新賦值）。&lt;/p&gt;
&lt;p&gt;可使用 &lt;code class=&quot;language-text&quot;&gt;import &amp;lt;module&gt; as &amp;lt;alias&gt;&lt;/code&gt; 取個簡單的別名。&lt;/p&gt;
&lt;p&gt;若是使用&lt;code class=&quot;language-text&quot;&gt;from &amp;lt;module&gt; import &amp;lt;sub-module&gt;&lt;/code&gt; 引入子模組，則不太會有問題。&lt;/p&gt;
&lt;h2&gt;運算&lt;/h2&gt;
&lt;h3&gt;交換值&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;b&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; a &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; b&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;使用nullable 屬性&lt;/h3&gt;
&lt;p&gt;使用&lt;code class=&quot;language-text&quot;&gt;and&lt;/code&gt;：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;a &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;x
a &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;f&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# regular expression 尤其常用&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;match&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;group&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;子字串比對&lt;/h3&gt;
&lt;p&gt;使用 &lt;code class=&quot;language-text&quot;&gt;in&lt;/code&gt;關鍵字。&lt;/p&gt;
&lt;h3&gt;next&lt;/h3&gt;
&lt;p&gt;使用 next 搭配 for 表達示，可以取得集合內特定條件的第一個index或值（find first)。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    x &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;n &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; n &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; l &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; n &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;except&lt;/span&gt; StopIteration&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;No positive numbers&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;The first positive number is&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; x&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;else 用法可以將關注點分離。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;截斷&lt;/h3&gt;
&lt;p&gt;使用 &lt;code class=&quot;language-text&quot;&gt;del&lt;/code&gt;，不用使用重新賦值的方式。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;del&lt;/span&gt; l&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;j&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;del&lt;/span&gt; l&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# anti pattern&lt;/span&gt;
l &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; l&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;j&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
l &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; l&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;del 可以直接回收資源。&lt;/p&gt;
&lt;h2&gt;建構string&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;很常用的感覺&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;善用 join()&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# ...&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# l.append(x)&lt;/span&gt;
s &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;join&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;l&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# 也可使用 generactor expressiotns&lt;/span&gt;
s &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;join&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;f&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; x &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; l&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;使用 + 串接字串的話，每次都會產生新的字串（字串在python內是不可變變數）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;可變參數 *args, **kwargs&lt;/h2&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;*args&lt;/code&gt; 跟 positional variable相關。
&lt;code class=&quot;language-text&quot;&gt;**kargs&lt;/code&gt; 與 keyword variable 相關。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ref: &lt;a href=&quot;https://blog.maxkit.com.tw/2018/12/python-args-kwargs.html&quot;&gt;https://blog.maxkit.com.tw/2018/12/python-args-kwargs.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</content:encoded></item><item><title><![CDATA[gatsby config api]]></title><description><![CDATA[gatsby config api gatsby 包含了一個，可以提供以下設定： siteMetaData plugin mapping flags pathPrefix polyfill Proxy developmentMiddleware  此config…]]></description><link>https://abhaynikam.github.io/gatsby-nice-blog/2021-11-20-gatsby-js-config/</link><guid isPermaLink="false">https://abhaynikam.github.io/gatsby-nice-blog/2021-11-20-gatsby-js-config/</guid><pubDate>Sat, 20 Nov 2021 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;gatsby config api&lt;/h1&gt;
&lt;p&gt;gatsby 包含了一個&lt;code class=&quot;language-text&quot;&gt;gatsby-config.js&lt;/code&gt;，可以提供以下設定：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;siteMetaData&lt;/li&gt;
&lt;li&gt;plugin&lt;/li&gt;
&lt;li&gt;mapping&lt;/li&gt;
&lt;li&gt;flags&lt;/li&gt;
&lt;li&gt;pathPrefix&lt;/li&gt;
&lt;li&gt;polyfill&lt;/li&gt;
&lt;li&gt;Proxy&lt;/li&gt;
&lt;li&gt;developmentMiddleware&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt; 此config檔僅支援commonJs。&lt;/p&gt;
&lt;h2&gt;siteMetaData&lt;/h2&gt;
&lt;p&gt;可以定義一些各頁面間共享的參數。gatsby會產生一個 graphQL的 &lt;code class=&quot;language-text&quot;&gt;field&lt;/code&gt; 叫做 &lt;code class=&quot;language-text&quot;&gt;siteMetaData&lt;/code&gt;，供各頁面查詢。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exports &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;siteMetadata&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;Gatsby&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;siteUrl&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;https://www.gatsbyjs.com&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;Blazing fast modern site generator for React&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;plugin&lt;/h2&gt;
&lt;p&gt;gatsby 不支援直接使用 &lt;code class=&quot;language-text&quot;&gt;npm&lt;/code&gt;安裝插件。如果要使用gatsby的插件，必須在&lt;code class=&quot;language-text&quot;&gt;gatsby-config.js&lt;/code&gt;底下定義要使用的插件。&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;plugin&lt;/code&gt; 是一個 Array。可以直接使用string指定要使用的插件名稱：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exports &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;plugins&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;gatsby-plugin-name&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;若該插件支援option，也可以傳入包含&lt;code class=&quot;language-text&quot;&gt;options&lt;/code&gt;的object：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exports &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;plugins&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;resolve&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;gatsby-plugin-name&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;options&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;optionA&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;optionB&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;Another option&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;plugin 欄位也可以是混合的 array。可以混合不需要指定option的 plugin (型別為string)以及需要指定option的plugin（型別為object）：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exports &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;plugins&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;gatsby-transform-plugin&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;resolve&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;gatsby-plugin-name&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;options&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;optionA&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;optionB&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;Another option&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;flag&lt;/h2&gt;
&lt;p&gt;設定flag可以指定開啟一些正在實驗中的功能。&lt;/p&gt;
&lt;h2&gt;pathPrefix&lt;/h2&gt;
&lt;p&gt;pathPrefix可以加入產生的網頁路由前綴。&lt;/p&gt;
&lt;h2&gt;Polyfill&lt;/h2&gt;
&lt;p&gt;gatsbyjs 使用 es6的 promise api。預設為未支援promise的瀏覽器提供了polyfill。如果要提供自已版本的 Promise polyfill，可以將此flag 設為 false。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exports &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;polyfill&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;mapping node type&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;官方建議使用 &lt;code class=&quot;language-text&quot;&gt;@Link&lt;/code&gt; grapthQL directives
&lt;a href=&quot;https://www.gatsbyjs.com/docs/reference/graphql-data-layer/schema-customization/#foreign-key-fields&quot;&gt;https://www.gatsbyjs.com/docs/reference/graphql-data-layer/schema-customization/#foreign-key-fields&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;mapping&lt;/code&gt; 屬性支援將不同來源的資料做 mapping。&lt;/p&gt;
&lt;p&gt;在資料 mapping 前。要先確定是否有裝該資料來源的 transformer (i.e. transformer of yaml, json… )，並且設定&lt;code class=&quot;language-text&quot;&gt;gatsby-source-filesystem&lt;/code&gt;讓gatsby可以正確取得mapping 檔案。&lt;/p&gt;
&lt;p&gt;以下範例，假設一個多作者協同的blog，有一個 &lt;code class=&quot;language-text&quot;&gt;author.yaml&lt;/code&gt;：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Kyle Mathews
  &lt;span class=&quot;token key atrule&quot;&gt;bio&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Founder @ GatsbyJS. Likes tech&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; reading/writing&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; founding things. Blogs at bricolage.io.
  &lt;span class=&quot;token key atrule&quot;&gt;twitter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;@kylemathews&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;markdown 的 frontmatter：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;---
title: A blog post
author: Kyle Mathews
---&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;設定 author 的 mapping 關係：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exports &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;plugins&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;mapping&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;MarkdownRemark.frontmatter.author&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;AuthorYaml.name&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;gatsby 產生的gruaphql query便提供了兩個資料來源的 mapping 供查詢：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;graphql&quot;&gt;&lt;pre class=&quot;language-graphql&quot;&gt;&lt;code class=&quot;language-graphql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;query&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$slug&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token scalar&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property-query&quot;&gt;markdownRemark&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token attr-name&quot;&gt;fields&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;slug&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;eq&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$slug&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;html&lt;/span&gt;
    &lt;span class=&quot;token object&quot;&gt;fields&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;slug&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token object&quot;&gt;frontmatter&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;title&lt;/span&gt;
      &lt;span class=&quot;token object&quot;&gt;author&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;# This now links to the author object&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;name&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;bio&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;twitter&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;mapping 也可以用來mapping 一個包含外來鍵（ids）的array到其它的 collection of data。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// experement.js&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;companyA&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;company&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Company A&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;position&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Unicorn Developer&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;from&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Dec 2016&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;to&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Present&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;items&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token string-property property&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Responsibility&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string-property property&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Being an unicorn&quot;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token string-property property&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Hands on&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string-property property&quot;&gt;&quot;tech&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;REACT&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;NODE&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// tech.js&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;REACT&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;icon&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;facebook&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;color&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;teal&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;React&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;NODE&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;icon&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;server&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;color&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;green&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;NodeJS&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;在&lt;code class=&quot;language-text&quot;&gt;gatsby-config.js&lt;/code&gt; 設定規則：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exports &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;plugins&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;mapping&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&apos;ExperienceJson.items.tech&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;TechJson.name&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;可以查詢 tech 與它關聯的項目：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;graphql&quot;&gt;&lt;pre class=&quot;language-graphql&quot;&gt;&lt;code class=&quot;language-graphql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;query&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token object&quot;&gt;allExperienceJson&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token object&quot;&gt;edges&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token object&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;company&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;position&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;from&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;to&lt;/span&gt;
        &lt;span class=&quot;token object&quot;&gt;items&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;label&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;description&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;link&lt;/span&gt;
          &lt;span class=&quot;token object&quot;&gt;tech&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;label&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;icon&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Proxy&lt;/h2&gt;
&lt;p&gt;告訴開發server將request導到指定的server。&lt;/p&gt;
&lt;h2&gt;developMiddleware&lt;/h2&gt;
&lt;p&gt;加速開發的設定。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;jsxRuntime&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;將此屬性設定為 &lt;code class=&quot;language-text&quot;&gt;automatic&lt;/code&gt;，可以在開發時直接使用 jsx，而不需手動import react。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;jsxImportSource&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;可以指定gatsby使用特定的jsx transformer。例如若使用 &lt;code class=&quot;language-text&quot;&gt;@emotion/react&lt;/code&gt;，可以如下設定：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exports &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;jsxImportSource&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;@emotion/react&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;如此預設的 jsx runtime 就會變成 @emotion/react了。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Hello, gatsby]]></title><description><![CDATA[Static site generactor 根據wiki  條目，Static site generactor (SSG) 指的是可能有使用 tepmlate lanugage、可以用來產生網頁、不用重撰相同內容的工具。
除了重覆的網頁內容外，可能也包含CSS…]]></description><link>https://abhaynikam.github.io/gatsby-nice-blog/2021-11-13-gatsby-js-note/</link><guid isPermaLink="false">https://abhaynikam.github.io/gatsby-nice-blog/2021-11-13-gatsby-js-note/</guid><pubDate>Sat, 13 Nov 2021 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Static site generactor&lt;/h2&gt;
&lt;p&gt;根據wiki &lt;code class=&quot;language-text&quot;&gt;Web template system&lt;/code&gt; 條目，Static site generactor (SSG) 指的是可能有使用 tepmlate lanugage、可以用來產生網頁、不用重撰相同內容的工具。
除了重覆的網頁內容外，可能也包含CSS，例如 FrontPage 和 Dreamweaver 這種網頁編輯器。&lt;/p&gt;
&lt;p&gt;SSG 不是近幾年才產生的概念。例如 Jekyll，非常流行的SSG，早在2008年的時候就已經誕生了。&lt;/p&gt;
&lt;p&gt;SSG是前端的其中一種解決方案，選用不同的技術當前端的解決方案時，應該選擇最適合問題本身的方案，沒有所謂的最佳解。&lt;/p&gt;
&lt;p&gt;GatsbyJs 是個基於 js、react 的SSG框架。&lt;/p&gt;
&lt;h2&gt;JAMStack&lt;/h2&gt;
&lt;p&gt;JAMStack 指的是使用 &lt;code class=&quot;language-text&quot;&gt;javascript&lt;/code&gt;、&lt;code class=&quot;language-text&quot;&gt;API&lt;/code&gt;、&lt;code class=&quot;language-text&quot;&gt;Markup&lt;/code&gt;的技術線。所謂的&lt;code class=&quot;language-text&quot;&gt;Markup&lt;/code&gt;，在這裡指的是包含一些已經被事先定義好「顯示語義」的標記語言。例如Html就是在網頁中被廣範使用的 Markup stack。&lt;/p&gt;
&lt;p&gt;JAMStack 會有一種特徴：程式的邏輯大多會在client端，而不緊緊依賴 backend。&lt;/p&gt;
&lt;p&gt;這幾年講到JAMStack，M有時指的是 &lt;code class=&quot;language-text&quot;&gt;Markdown&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;GatsbyJs 捏供 plugin，可以用 Markdown 來寫網頁內容。&lt;/p&gt;
&lt;h2&gt;GatsbyJS基本架構&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/8243259cbaa2ea1609f372b019cc4517/e5ca1/gatsby-architecture.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 54.43037974683544%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAABYlAAAWJQFJUiTwAAABOUlEQVQoz51Ty07EMAzc//8JfoILf8CJ+x44ICSkhaXv5u0Yj9PQ7ipcsGRFsT3jcZ2ecs6ciDikyF48UGKSGGXSU/O55Es83+RRH2jPnQTCXgJjMNyHlUdvtBgkIIMB0Lvlt0EVAZukfvCrxpRQ1dnEbgm8dJa9iTtA+Crp0arq+5wSEgidEBohHK2eiEHlkeDeK2F1NC+EDQUpEceUOHrxkJoqlZAbCgG2s+fxunJ3mXn6NpxiUfj08MLPj2ctHr5WHj4X7qUGk2hDabYMVjFuDYrRkUkIgpcNu6iqqsL385Uvb0NZjOS8La41VEbGfepkkZQ3wsN3QDCLgxAAqJ57wy2rI0Pxx2vH6+T0vo0cdDEAoztUA6BdKTcXU5eCsVVApH0pzS1u7wxd/8q3n83h9eebP+F//gMRfmLb13vsmwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;gatsby architecture&quot;
        title=&quot;gatsby architecture&quot;
        src=&quot;/static/8243259cbaa2ea1609f372b019cc4517/f058b/gatsby-architecture.png&quot;
        srcset=&quot;/static/8243259cbaa2ea1609f372b019cc4517/c26ae/gatsby-architecture.png 158w,
/static/8243259cbaa2ea1609f372b019cc4517/6bdcf/gatsby-architecture.png 315w,
/static/8243259cbaa2ea1609f372b019cc4517/f058b/gatsby-architecture.png 630w,
/static/8243259cbaa2ea1609f372b019cc4517/40601/gatsby-architecture.png 945w,
/static/8243259cbaa2ea1609f372b019cc4517/78612/gatsby-architecture.png 1260w,
/static/8243259cbaa2ea1609f372b019cc4517/e5ca1/gatsby-architecture.png 1332w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;GatsbyJS 是一個 SSG框架，本身使用React做為視圖層。在資料來源層，使用了 &lt;code class=&quot;language-text&quot;&gt;GraphQL&lt;/code&gt; 做了一層抽象。除了框架本身會自動從指定的檔案路徑內取得內容外，&lt;code class=&quot;language-text&quot;&gt;GraphQL&lt;/code&gt; 社群也提供了非常多的 &lt;code class=&quot;language-text&quot;&gt;plugin&lt;/code&gt;，用來取得、解析資料。例如&lt;code class=&quot;language-text&quot;&gt;gatsby-transformer-remark&lt;/code&gt;，可以用來解析 &lt;code class=&quot;language-text&quot;&gt;markdown&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;GatsbyJS 主要的程式設定檔有三個：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;gatsby-config.js&lt;/li&gt;
&lt;li&gt;gatsby-node.js&lt;/li&gt;
&lt;li&gt;gatsby-browser.js&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;另外 &lt;code class=&quot;language-text&quot;&gt;src/pages&lt;/code&gt; 資料夾底下的檔案，會被 &lt;code class=&quot;language-text&quot;&gt;File System Route&lt;/code&gt; API 自動解析，產生對應的網頁內容。&lt;/p&gt;
&lt;p&gt;目前三個預設的js，似乎都還不支援 EMCAscript module，必須使用 &lt;code class=&quot;language-text&quot;&gt;common script&lt;/code&gt; 撰寫。&lt;/p&gt;
&lt;h3&gt;gatsby-config.js&lt;/h3&gt;
&lt;p&gt;gatsby-config.js 裡面包含了跟框架及網頁有關的設定檔。包含使用的 plugins、proxy、 siteMetaData等等。&lt;/p&gt;
&lt;p&gt;其中 &lt;code class=&quot;language-text&quot;&gt;plugins&lt;/code&gt;的使用很重要，可以從豐富的 plugin librarys 中，找到很多有用的 plugin，加速網站的開發、或是增加網站的功能等。&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;siteMetaData&lt;/code&gt; 可以用來存放一些 meta資訊，例如作者、email等等資訊。&lt;/p&gt;
&lt;h3&gt;gatsby-browser.js&lt;/h3&gt;
&lt;p&gt;gatsby-browser.js 中包含一些在Browser中、框架定義的事件，例如 &lt;code class=&quot;language-text&quot;&gt;onClientEntry&lt;/code&gt;。另外也可以攜代一些網頁元件當作全域的元件。&lt;/p&gt;
&lt;h3&gt;gatsby-node.js&lt;/h3&gt;
&lt;p&gt;gatsby-cnode.js 相對復雜，它包含了產生頁面、產生gastby field 的 API、及在建置階段中的一些事件處理。之後再整理一下它的API。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;懶了好久，剛剛看一下突然發現我寫錯好久…&lt;/p&gt;
&lt;/blockquote&gt;</content:encoded></item><item><title><![CDATA[rust RefCell、Cell筆記]]></title><description><![CDATA[此文章記錄學習中的個人理解 文章在這 所有權、出借、移出 rust 特別的地方就是有所有權的概念。透過所有權的規則檢查，可以很有效率的管控記憶體的使用；並且可以檢查是否有 的風險。 雖然在寫程式的時候非常麻煩，但是程式run起來以後，可以基本保證不會有 runtime error…]]></description><link>https://abhaynikam.github.io/gatsby-nice-blog/2020-10-16--Ref_note.md/2020-10-16--Ref_note/</link><guid isPermaLink="false">https://abhaynikam.github.io/gatsby-nice-blog/2020-10-16--Ref_note.md/2020-10-16--Ref_note/</guid><pubDate>Fri, 16 Oct 2020 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;此文章記錄學習中的個人理解&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://ithelp.ithome.com.tw/articles/10201653&quot;&gt;文章在這&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;所有權、出借、移出&lt;/h2&gt;
&lt;p&gt;rust 特別的地方就是有所有權的概念。透過所有權的規則檢查，可以很有效率的管控記憶體的使用；並且可以檢查是否有 &lt;code class=&quot;language-text&quot;&gt;dangling refernence&lt;/code&gt;的風險。&lt;/p&gt;
&lt;p&gt;雖然在寫程式的時候非常麻煩，但是程式run起來以後，可以基本保證不會有 runtime error的情形發生。習慣以後開發會很有效率。&lt;/p&gt;
&lt;p&gt;同時所有權的觀念也可以融入到打程式的思考當中。&lt;/p&gt;
&lt;h2&gt;參照? 指標？&lt;/h2&gt;
&lt;p&gt;在C++中，其實也有 把 Pointer 跟 Reference 的概念分開來。&lt;/p&gt;
&lt;p&gt;如果你跟我一樣，只熟悉 C，不熟悉 C++ 的話：&lt;/p&gt;
&lt;p&gt;指標的概念就是「指向記憶體的某個位置」。因此，rust中參照也可以視為一個指標，但是它是靜態的（const），不能改變指標指向的位置。&lt;/p&gt;
&lt;p&gt;但是，因為rust多了所有權的概念，而且參照的操作方式也跟c的指標不太一樣，而且必須尊守參照規則。&lt;/p&gt;
&lt;p&gt;（例如：在c當中，要操作參照位置的變數一定要透過指標 derefrence（*）；rust的參照則不需要）&lt;/p&gt;
&lt;p&gt;因此，在 rust 看到 函式傳入參照時，必須以 借出（borrow）來思考，不能使用c的指標思考。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;C++ 也有參照的概念，跟rust就比較相似，不過C++並沒有 借出的規則要尊守。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;出借的規則&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;先不提lifetime，出借主要兩個規則：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在任何情況下，可以同時借出多個inmutable 參照，但是只能借出一個 mutable 參照。&lt;/li&gt;
&lt;li&gt;在任何時間點下，參照都必須是合法的。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;智慧指標&lt;/h2&gt;
&lt;p&gt;智慧指標是多了一些能力的指標。&lt;/p&gt;
&lt;p&gt;在rust中，如果智慧指標有實作 &lt;code class=&quot;language-text&quot;&gt;Deref trait&lt;/code&gt;，就基本可以把它當成一般參照使用了。&lt;/p&gt;
&lt;p&gt;它其實不是rust的特別概念，在C++ 也有這個概念。&lt;/p&gt;
&lt;h2&gt;Cell / RefCell&lt;/h2&gt;
&lt;p&gt;上面提到，參照的規則，同時只能有一個 &lt;code class=&quot;language-text&quot;&gt;mutable&lt;/code&gt; 參照。如果有多個參照需要修改，可以使用Cell。&lt;/p&gt;
&lt;p&gt;Cell中的型態需要實作 &lt;code class=&quot;language-text&quot;&gt;Copy trait&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Cell 跟 Cow 其實只差一點。Cell 是「取用時復製」，Cow是「寫入時復製」。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;RefCell 則是可以使用 boroow (reference)的方式取得 內部的值； 它透過RefCell使用rust 的 lifetime機制實作動態檢查。&lt;/p&gt;
&lt;p&gt;它可以動態檢查 borrow 的規則，將borrow的規則延遲到 runtime。&lt;/p&gt;
&lt;p&gt;以下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;rust&quot;&gt;&lt;pre class=&quot;language-rust&quot;&gt;&lt;code class=&quot;language-rust&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;token namespace&quot;&gt;std&lt;span class=&quot;token punctuation&quot;&gt;::&lt;/span&gt;cell&lt;span class=&quot;token punctuation&quot;&gt;::&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;RefCell&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; a &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;RefCell&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; b &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;borrow_mut&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; c &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;borrow_mut&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    
    &lt;span class=&quot;token macro property&quot;&gt;println!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;{}&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;的確將borrow 放到運行時檢查。&lt;/p&gt;
&lt;h2&gt;Rc&lt;/h2&gt;
&lt;p&gt;Rc 是 reference counting （參照技術）的意思。它是一個記憶體管理的技術。主要概念是，當沒有參照時就釋放記憶體。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Rc::clone 是 clone Rc 這個 pointer，不是Rc 內的值。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;文章提到的 linked list，使用RefCell 是為了動態檢查 borrow規則；而使用Rc可以讓多個變數可以同時參照同一個位置（這樣就可以實作雙向linked list了）。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://play.rust-lang.org/?version=stable&amp;#x26;mode=debug&amp;#x26;edition=2018&amp;#x26;gist=1727a323e4d135699f09d000fcccd293&quot;&gt;playground&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[rxjs source trace]]></title><description><![CDATA[achieve  此篇內容做為個人學習記錄，不會再更改。  學習 後，發現更重要的其實是函式編程的思考方式。  如果真的理解函式做為一級公民的思考邏輯，  的實現看起來就會非常自然、直覺。  當初寫這篇學習記錄時，並不懂fp…]]></description><link>https://abhaynikam.github.io/gatsby-nice-blog/2020-05-31-rxjs-src/Rxjs/</link><guid isPermaLink="false">https://abhaynikam.github.io/gatsby-nice-blog/2020-05-31-rxjs-src/Rxjs/</guid><pubDate>Sat, 30 May 2020 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;achieve&lt;/h2&gt;
&lt;p&gt; 此篇內容做為個人學習記錄，不會再更改。&lt;/p&gt;
&lt;p&gt; 學習 &lt;code class=&quot;language-text&quot;&gt;haskell&lt;/code&gt;後，發現更重要的其實是函式編程的思考方式。&lt;/p&gt;
&lt;p&gt; 如果真的理解函式做為一級公民的思考邏輯， &lt;code class=&quot;language-text&quot;&gt;rxjs&lt;/code&gt; 的實現看起來就會非常自然、直覺。&lt;/p&gt;
&lt;p&gt; 當初寫這篇學習記錄時，並不懂fp的思考方式。&lt;/p&gt;
&lt;p&gt; 因此，下面的記錄比較像是逐行記錄動作、及 ts特性，並沒有真正解釋 rxjs 的實作目的。&lt;/p&gt;
&lt;p&gt; 2020/09/16&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;目的：看懂&lt;code class=&quot;language-text&quot;&gt;Rxjs&lt;/code&gt;的&lt;code class=&quot;language-text&quot;&gt;Observable&lt;/code&gt;實現方式&lt;/p&gt;
&lt;h2&gt;Rxjs的流程圖&lt;/h2&gt;
&lt;p&gt;Rxjs是一個實作了 &lt;code class=&quot;language-text&quot;&gt;觀察者模式&lt;/code&gt;、&lt;code class=&quot;language-text&quot;&gt;疊代器模式&lt;/code&gt;的library。&lt;/p&gt;
&lt;p&gt;根據 ReactiveX 官網所述：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Observables fill the gap by being the ideal way to access asynchronous sequences of multiple items&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&quot;center&quot;&gt;#&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;single items&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;multiple items&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;synchronus&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;T getData()&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Iterable&amp;lt;T&gt; getData()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;asynchronous&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Future&amp;lt;T&gt; getData()&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Observable&amp;lt;T&gt; getData()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;ReactiveX 填補了疊代器模式無法支援非同步旨令的問題。&lt;/p&gt;
&lt;p&gt;事實上，我在理解原始碼的時候有發現，雖然Rxjs的確有實現 &lt;code class=&quot;language-text&quot;&gt;觀察者模式&lt;/code&gt;，但是當你在看程式碼的時候，將它當作一個變型的&lt;code class=&quot;language-text&quot;&gt;疊代器模式&lt;/code&gt;，反而更容易理解。&lt;/p&gt;
&lt;p&gt;那麼我們就先從一個流程圖及簡單的範例開始吧。&lt;/p&gt;
&lt;p&gt;以下是我們使用 Rxjs的時候，最典型的流程。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/71f5b60b87810e54ac9ceabbe6b6fea6/077b7/flowchart.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 17.088607594936708%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAYAAACTWi8uAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAkklEQVQI102OiQqDMAyGff/3m1pFxpjCGPZynZ3W9l8SZCwk5PhyVa8Q4ZyHPU0bi3fcwRLWDbO2MFQz1gmPW0I6ijDOZ22E+SVgTxnVEj64jxNa1eFSNxiuN1qYZKEnprpBWN20FPdwy4ojA0/t0bSKWC9+nB7Y6VB15AJSMVLxXGPJJ+Psx2iolCJf/jM+wv1fe7DmQJD9LlMAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;流程圖&quot;
        title=&quot;流程圖&quot;
        src=&quot;/static/71f5b60b87810e54ac9ceabbe6b6fea6/f058b/flowchart.png&quot;
        srcset=&quot;/static/71f5b60b87810e54ac9ceabbe6b6fea6/c26ae/flowchart.png 158w,
/static/71f5b60b87810e54ac9ceabbe6b6fea6/6bdcf/flowchart.png 315w,
/static/71f5b60b87810e54ac9ceabbe6b6fea6/f058b/flowchart.png 630w,
/static/71f5b60b87810e54ac9ceabbe6b6fea6/40601/flowchart.png 945w,
/static/71f5b60b87810e54ac9ceabbe6b6fea6/077b7/flowchart.png 1166w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;我直接從 Anuglar 官網引用簡單的範例：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Create simple observable that emits three values&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; myObservable &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;of&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Create observer object&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; myObserver &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function-variable function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token parameter&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Observer got a next value: &apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; x&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token function-variable function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token parameter&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Observer got an error: &apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; err&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token function-variable function&quot;&gt;complete&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Observer got a complete notification&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Execute with the observer object&lt;/span&gt;
myObservable&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;subscribe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;myObserver&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Logs:&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Observer got a next value: 1&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Observer got a next value: 2&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Observer got a next value: 3&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Observer got a complete notification&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;code 1&lt;/code&gt; 使用 &lt;code class=&quot;language-text&quot;&gt;of&lt;/code&gt; 運算子產生 &lt;code class=&quot;language-text&quot;&gt;Observable&lt;/code&gt; 並訂閱。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;另外，如果你不想要使用 &lt;code class=&quot;language-text&quot;&gt;Operator&lt;/code&gt; 建立 &lt;code class=&quot;language-text&quot;&gt;Observable&lt;/code&gt;的話，你可以直接 new一個 &lt;code class=&quot;language-text&quot;&gt;Obsevrable&lt;/code&gt; 實例，並且將訂閱後會發出值使用 &lt;code class=&quot;language-text&quot;&gt;callback function&lt;/code&gt; 的方式傳入 &lt;code class=&quot;language-text&quot;&gt;Observable&lt;/code&gt; 中。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;實務上是不會這麼使用的。在實務上，可以使用 &lt;code class=&quot;language-text&quot;&gt;of&lt;/code&gt;這類的 creation operator 產生一個最簡單的Observable。而其內部的實現方式，其實就是回傳一個會固定發出 &lt;code class=&quot;language-text&quot;&gt;of&lt;/code&gt; 參數的 &lt;code class=&quot;language-text&quot;&gt;Observable&lt;/code&gt;，&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// This function runs when subscribe() is called&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sequenceSubscriber&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;observer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// synchronously deliver 1, 2, and 3, then complete&lt;/span&gt;
  observer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  observer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  observer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  observer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;complete&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// unsubscribe function doesn&apos;t need to do anything in this&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// because values are delivered synchronously&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;unsubscribe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Create a new Observable that will deliver the above sequence&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; sequence &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Observable&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sequenceSubscriber&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// execute the Observable and print the result of each notification&lt;/span&gt;
sequence&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;subscribe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;num&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;complete&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Finished sequence&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Logs:&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 1&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 2&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 3&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Finished sequence&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;code 2&lt;/code&gt; 建立 一個 &lt;code class=&quot;language-text&quot;&gt;Observable&lt;/code&gt; 物件。&lt;/p&gt;
&lt;p&gt;這樣我們已經知道最基本的使用方式了。接著我們看看 Rxjs 中最核心的兩個組件：&lt;code class=&quot;language-text&quot;&gt;Observable&lt;/code&gt; 與 &lt;code class=&quot;language-text&quot;&gt;Observer&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;Observable&lt;/h2&gt;
&lt;p&gt;Observable 是 Rxjs 中最核心的物件。&lt;/p&gt;
&lt;p&gt;我剛開始看&lt;code class=&quot;language-text&quot;&gt;Observable&lt;/code&gt;的實現方式時，旁邊放著 &lt;code class=&quot;language-text&quot;&gt;觀察者模式&lt;/code&gt; 的 類別圖。&lt;/p&gt;
&lt;p&gt;然後我看的很困惑。所以我不建議使用觀察者模式對應Rxjs實作。&lt;/p&gt;
&lt;p&gt;截取重要的幾段程式碼：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Observable&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Subscribable&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;/** Internal implementation detail, do not use directly. */&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;_isScalar&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; boolean &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;/** @deprecated This is an internal implementation detail, do not use. */&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Observable&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;any&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;undefined&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;/** @deprecated This is an internal implementation detail, do not use. */&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;operator&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Operator&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;any&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;undefined&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;/**
   * @constructor
   * @param {Function} subscribe the function that is called when the Observable is
   * initially subscribed to. This function is given a Subscriber, to which new values
   * can be `next`ed, or an `error` method can be called to raise an error, or
   * `complete` can be called to notify of a successful completion.
   */&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;constructor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;subscribe&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Observable&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;subscriber&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Subscriber&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; TeardownLogic&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;subscribe&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;_subscribe &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; subscribe&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// .... 中間略&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;subscribe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;observer&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; PartialObserver&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Subscription&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/** @deprecated Use an observer instead of a complete callback */&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;subscribe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;next&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;undefined&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;undefined&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;complete&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Subscription&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/** @deprecated Use an observer instead of an error callback */&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;subscribe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;next&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;undefined&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; any&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; complete&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Subscription&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/** @deprecated Use an observer instead of a complete callback */&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;subscribe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;undefined&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;complete&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Subscription&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;subscribe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;next&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; error&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; any&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; complete&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Subscription&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;subscribe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;observerOrNext&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; PartialObserver&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            error&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; any&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            complete&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Subscription &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; operator &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; sink &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;toSubscriber&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;observerOrNext&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; error&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; complete&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;operator&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      sink&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;operator&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sink&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;source&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      sink&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;source &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;useDeprecatedSynchronousErrorHandling &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;sink&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;syncErrorThrowable&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;_subscribe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sink&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;_trySubscribe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sink&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;useDeprecatedSynchronousErrorHandling&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sink&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;syncErrorThrowable&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        sink&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;syncErrorThrowable &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sink&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;syncErrorThrown&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token keyword&quot;&gt;throw&lt;/span&gt; sink&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;syncErrorValue&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; sink&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// ... （略）&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;code 3&lt;/code&gt;. &lt;code class=&quot;language-text&quot;&gt;Observable&lt;/code&gt; 程式碼。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;不論 &lt;code class=&quot;language-text&quot;&gt;pipe&lt;/code&gt; 與 &lt;code class=&quot;language-text&quot;&gt;Operator&lt;/code&gt; 的話，整個 &lt;code class=&quot;language-text&quot;&gt;Observable&lt;/code&gt;的重點，其實就是 &lt;code class=&quot;language-text&quot;&gt;subscribe&lt;/code&gt;函式。&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;Ts 筆記&lt;/p&gt;
&lt;p&gt;code 3 中，建構子使用了 &lt;code class=&quot;language-text&quot;&gt;function type&lt;/code&gt; 的寫法（第19行），定義了 傳入的 function 的參數及 return 的型態。
另外，&lt;code class=&quot;language-text&quot;&gt;function type&lt;/code&gt;的第一個參數可以放 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;，它可以限制 &lt;code class=&quot;language-text&quot;&gt;function&lt;/code&gt; 的 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt; 型態。
（因此，此函式不能使用 &lt;code class=&quot;language-text&quot;&gt;arrow function&lt;/code&gt;）&lt;/p&gt;
&lt;p&gt;底線是一個常用的命名規則（21行，_subscribe屬性），代表變數或屬性是內部屬性。&lt;/p&gt;
&lt;p&gt;&lt;del&gt;&lt;code class=&quot;language-text&quot;&gt;subscribe&lt;/code&gt; 使用了 &lt;code class=&quot;language-text&quot;&gt;ts&lt;/code&gt; 函式多載的功能（27行 ~ 36行）。&lt;code class=&quot;language-text&quot;&gt;ts&lt;/code&gt;支援函式多載，
唯一的限制是，&lt;code class=&quot;language-text&quot;&gt;參數的個數必須要相同&lt;/code&gt;。
因此可以注意到，&lt;code class=&quot;language-text&quot;&gt;subscibe&lt;/code&gt;的所有參數都是 &lt;code class=&quot;language-text&quot;&gt;optional parameter&lt;/code&gt;。&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;跟 &lt;code class=&quot;language-text&quot;&gt;java&lt;/code&gt; 等語言不一樣。 ts 底層其實還是js。因此與其說它是函式多載，不如說它可以定義多個函式簽名。
在 copmile階段，編譯器會選擇最適合的函式簽名來檢查。
&lt;a href=&quot;https://www.typescriptlang.org/docs/handbook/functions.html#overloads&quot;&gt;refer to&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;@deprecated 是軟體中很常使用的標籤（38行），代表被棄用的function。不論是公開的 Api 或者是 內部的 Api 都非常的好用。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;看到 Subscribe 的第一一個參數，它可以是一個 &lt;code class=&quot;language-text&quot;&gt;PartialObserver&amp;lt;T&gt;&lt;/code&gt; 或者是一個 &lt;code class=&quot;language-text&quot;&gt;function&lt;/code&gt;。 &lt;/p&gt;
&lt;p&gt;看一下 PartialObserver&lt;T&gt;的定義：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;NextObserver&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  closed&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; boolean&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token function-variable function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  error&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; any&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  complete&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ErrorObserver&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  closed&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; boolean&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  next&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token function-variable function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; any&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  complete&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;CompletionObserver&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  closed&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; boolean&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  next&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  error&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; any&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token function-variable function&quot;&gt;complete&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; type PartialObserver&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; NextObserver&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; ErrorObserver&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; CompletionObserver&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;code 4&lt;/code&gt;. Observer interface &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;其實，PartialObserver 就是 &lt;code class=&quot;language-text&quot;&gt;Observer&lt;/code&gt;介面的別名，只是三個function中，你至少要定義其中一個。&lt;/p&gt;
&lt;h2&gt;Observer 及 Subscriber&lt;/h2&gt;
&lt;p&gt;Observer 其實是 Rxjs定義的界面。&lt;/p&gt;
&lt;p&gt;定義界面的好處之一，是可以規範程式的 input 的規格。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Observer&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  closed&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; boolean&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token function-variable function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token function-variable function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; any&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token function-variable function&quot;&gt;complete&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;code 5&lt;/code&gt;、Observer&lt;/p&gt;
&lt;p&gt;另外，&lt;code class=&quot;language-text&quot;&gt;Subscriber&lt;/code&gt; 是個物件，它實現了 &lt;code class=&quot;language-text&quot;&gt;Observer&lt;/code&gt; 、並且繼承了 &lt;code class=&quot;language-text&quot;&gt;Subscription&lt;/code&gt;。現在只要知道，&lt;code class=&quot;language-text&quot;&gt;Subscriber&lt;/code&gt; 多了 取消訂閱的能力就好 （&lt;code class=&quot;language-text&quot;&gt;unsubscribe()&lt;/code&gt; 方法）。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;我們繼續看 &lt;code class=&quot;language-text&quot;&gt;code 3&lt;/code&gt; 。&lt;/p&gt;
&lt;p&gt;code 3第19行~23行。它的建構子其實很單純，就是把傳入的&lt;code class=&quot;language-text&quot;&gt;Subscriber function&lt;/code&gt; 放入一個內部的 &lt;code class=&quot;language-text&quot;&gt;_subscribe&lt;/code&gt;屬性。這部份的使用案例可以對應 &lt;code class=&quot;language-text&quot;&gt;code 2&lt;/code&gt; 看。&lt;/p&gt;
&lt;p&gt;接著看到 &lt;code class=&quot;language-text&quot;&gt;subscribe()&lt;/code&gt; 函式。&lt;/p&gt;
&lt;p&gt;code 3，41行。首先會透過 toSubscriber() 這個 utils 將 傳入的 Observer轉變成 Subscriber 。&lt;/p&gt;
&lt;p&gt;前面提到，在 Rxjs的內部實現中，會把所有的 Observer界面，轉化為 Subscriber 物件，提供訂閱及取消訂閱的能力。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;utils 放全域的 function，也是軟體中很常見的專案架構（code 3，41行）。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;code 3，43~51行。接著，如果你是透過 &lt;code class=&quot;language-text&quot;&gt;creation operator&lt;/code&gt; 產生的 &lt;code class=&quot;language-text&quot;&gt;observable&lt;/code&gt;，&lt;code class=&quot;language-text&quot;&gt;subscribe()&lt;/code&gt;函式會呼叫這個 &lt;code class=&quot;language-text&quot;&gt;Operator&lt;/code&gt;（對應 &lt;code class=&quot;language-text&quot;&gt;code 1&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;如果不是的話，會試著去執行 &lt;code class=&quot;language-text&quot;&gt;_subscribe&lt;/code&gt; （對應 &lt;code class=&quot;language-text&quot;&gt;code2&lt;/code&gt;）。&lt;/p&gt;
&lt;p&gt;code 3，53~60行。最下面的 if、else，控制 throw exception 。因為新版建議使用 &lt;code class=&quot;language-text&quot;&gt;Observer&lt;/code&gt;界面，取代將 &lt;code class=&quot;language-text&quot;&gt;subscribe&lt;/code&gt; 包在 &lt;code class=&quot;language-text&quot;&gt;try...catch&lt;/code&gt;中，因此這裡會檢查lib的 config檔的flag有沒有被打開；&lt;/p&gt;
&lt;p&gt;如果有的話，再檢查是否有遇到例外需要&lt;code class=&quot;language-text&quot;&gt;throw&lt;/code&gt;回主函式的情型。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;結論&lt;/h2&gt;
&lt;p&gt;從 &lt;code class=&quot;language-text&quot;&gt;Observable&lt;/code&gt; 的 &lt;code class=&quot;language-text&quot;&gt;subscribe()&lt;/code&gt; 中，可以了解到，&lt;code class=&quot;language-text&quot;&gt;Obsrevable&lt;/code&gt;的 &lt;code class=&quot;language-text&quot;&gt;subscribe()&lt;/code&gt; 要發出的值有兩個來源：要馬是你 new 一個 Observable，並且把 &lt;code class=&quot;language-text&quot;&gt;subscribe&lt;/code&gt;、及 &lt;code class=&quot;language-text&quot;&gt;unsubscribe&lt;/code&gt; 的邏輯傳入；要馬是使用 &lt;code class=&quot;language-text&quot;&gt;Operator&lt;/code&gt; 來發出值。&lt;/p&gt;
&lt;p&gt;使用情境來看，後者應該是更常見的情境。&lt;/p&gt;
&lt;p&gt;另外，內部會將&lt;code class=&quot;language-text&quot;&gt;Observer&lt;/code&gt;轉成 &lt;code class=&quot;language-text&quot;&gt;Subscriber&lt;/code&gt;，是非常重要的一步。有了它，它有辦法實作 &lt;code class=&quot;language-text&quot;&gt;pipe&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt; &lt;code class=&quot;language-text&quot;&gt;觀察者模式&lt;/code&gt;，通常是異步的，也不會有 &lt;code class=&quot;language-text&quot;&gt;Observable&lt;/code&gt; 、&lt;code class=&quot;language-text&quot;&gt;Operator&lt;/code&gt;等物件。因此我開頭才說，最好不要用 &lt;code class=&quot;language-text&quot;&gt;觀察者模式&lt;/code&gt; 對應了解Rxjs的實作，否則只會越看越糊塗。&lt;/p&gt;
&lt;p&gt; 以目前看到的行為來說，&lt;code class=&quot;language-text&quot;&gt;Observable&lt;/code&gt; 更接近 &lt;code class=&quot;language-text&quot;&gt;疊代器模式&lt;/code&gt;。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[RXJS運算子-mergeMap、switchMap]]></title><description><![CDATA[Observable 與 pip 在 Rxjs中， 是一個可供訂閱的物件。當一個  被  （訂閱）後，直到這個  發出 complete 之前，訂閱這個 Observable…]]></description><link>https://abhaynikam.github.io/gatsby-nice-blog/2020-05-28/</link><guid isPermaLink="false">https://abhaynikam.github.io/gatsby-nice-blog/2020-05-28/</guid><pubDate>Thu, 28 May 2020 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Observable 與 pip&lt;/h2&gt;
&lt;p&gt;在 Rxjs中，&lt;code class=&quot;language-text&quot;&gt;Observable&lt;/code&gt; 是一個可供訂閱的物件。當一個 &lt;code class=&quot;language-text&quot;&gt;Observable&lt;/code&gt; 被 &lt;code class=&quot;language-text&quot;&gt;subscribe&lt;/code&gt; （訂閱）後，直到這個 &lt;code class=&quot;language-text&quot;&gt;Observable&lt;/code&gt; 發出 complete 之前，訂閱這個 Observable的 &lt;code class=&quot;language-text&quot;&gt;Observer&lt;/code&gt; 都會收到 &lt;code class=&quot;language-text&quot;&gt;Observable&lt;/code&gt; 發出的值。&lt;/p&gt;
&lt;p&gt;因為 &lt;code class=&quot;language-text&quot;&gt;Observable&lt;/code&gt; 會在特定的條件下，不斷的發出值，因此就會形成一個資料流。可以把資料流想像成水流，而 發出值的 &lt;code class=&quot;language-text&quot;&gt;Observable&lt;/code&gt; 就是水的源頭。&lt;/p&gt;
&lt;p&gt;而當資料流產生後，我們可能還會對資料的值一些處理，最將處理後的值發給訂閱這個 &lt;code class=&quot;language-text&quot;&gt;Observable&lt;/code&gt; 的 &lt;code class=&quot;language-text&quot;&gt;Observer&lt;/code&gt;。這時就可以使用 &lt;code class=&quot;language-text&quot;&gt;pipe&lt;/code&gt;。可以把 &lt;code class=&quot;language-text&quot;&gt;pipel&lt;/code&gt; 想像成一個水管。&lt;/p&gt;
&lt;p&gt;打個比方，源 &lt;code class=&quot;language-text&quot;&gt;Observable&lt;/code&gt; 就像 水龍頭，而 &lt;code class=&quot;language-text&quot;&gt;pipe&lt;/code&gt; 像蓮蓬頭。當水龍頭打開後，我們（&lt;code class=&quot;language-text&quot;&gt;Observer&lt;/code&gt;）最後看到的水，會是蓮蓬頭導出的水。&lt;/p&gt;
&lt;h3&gt;pipe 中的 operator （運算子），input 和 output都會是 Observable&lt;/h3&gt;
&lt;p&gt;所有的運算子，其實都是一個&lt;code class=&quot;language-text&quot;&gt;Observable&lt;/code&gt;。以 &lt;code class=&quot;language-text&quot;&gt;map&lt;/code&gt;為例，當project return 值後，map 會發出project return 的值；pipe中的函式會像接水管一樣，下一個Operator訂閱上一個Operator(Observable)。&lt;/p&gt;
&lt;p&gt;訂閱的動作，可以透過 Subscriber 完成。它是一個內部使用的類別，實現了 Observer界面，並且繼承 Subscription。內部的 Observer 界面，會被轉化為 Subscriber。 Subscriber 實現了「管理」及「取消」多個Observable 訂閱的能力 。因此，在 pipe中，當 其中的某個運算子要結束掉整個 pipe的時候，可以通過 Subscriber 的 unsubscribe() 方法，取消整個管線的訂閱。&lt;/p&gt;
&lt;p&gt;引用官方說明：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A Pipeable Operator is a function that takes an Observable as its input and returns another Observable. It is a pure operation: the previous Observable stays unmodified.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;map operator&lt;/h2&gt;
&lt;p&gt;函式： &lt;code class=&quot;language-text&quot;&gt;map(project: Function, thisArg: any): Observable&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;map operator是很好懂的一個運算子。它的 &lt;code class=&quot;language-text&quot;&gt;project&lt;/code&gt; function 會接受上一個運算子發出的值，並且經過處理後，回傳處理後的值。&lt;/p&gt;
&lt;p&gt;範例：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// RxJS v6+&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; from &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;rxjs&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; map &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;rxjs/operators&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 发出 (1,2,3,4,5)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; source &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 每个数字加10&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; example &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; source&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pipe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; val &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 输出: 11,12,13,14,15&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; subscribe &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; example&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;subscribe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;val&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;mergeMap and switchMap&lt;/h2&gt;
&lt;p&gt;mergeMap: &lt;code class=&quot;language-text&quot;&gt;mergeMap(project: function: Observable, resultSelector: function: any, concurrent: number): Observable&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;switchMap: &lt;code class=&quot;language-text&quot;&gt;switchMap(project: function: Observable, resultSelector: function(outerValue, innerValue, outerIndex, innerIndex): any): Observable&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;很多時候，我們會需要回傳一個 &lt;code class=&quot;language-text&quot;&gt;Observable&lt;/code&gt;，並且自已處理 &lt;code class=&quot;language-text&quot;&gt;Observable&lt;/code&gt; 的發出值。最常見的範例就是在接到值後，面發起一個 http請求。此時，return的值是一個 &lt;code class=&quot;language-text&quot;&gt;Observable&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;mergeMap&lt;/code&gt; 跟 &lt;code class=&quot;language-text&quot;&gt;switchMap&lt;/code&gt; 事實上也沒有什麼魔法。它就是 &lt;code class=&quot;language-text&quot;&gt;project&lt;/code&gt; function 直接回傳一個 Observable，而下一個運算子取得的值，是由這個回傳的Observable發出的。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;mergeMap&lt;/code&gt;、&lt;code class=&quot;language-text&quot;&gt;switchMap&lt;/code&gt; 跟 &lt;code class=&quot;language-text&quot;&gt;map&lt;/code&gt; 的差別，在於 &lt;code class=&quot;language-text&quot;&gt;project&lt;/code&gt; function。 map回傳的是Observable內的值；mergeMap/ switchMap回傳的是一個函式。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;怎麼知道發出的值是從哪一個 Observable發出的？Observable何時 complete&lt;/h3&gt;
&lt;p&gt;這就是 &lt;code class=&quot;language-text&quot;&gt;mregeMap&lt;/code&gt; 和 &lt;code class=&quot;language-text&quot;&gt;switchMap&lt;/code&gt; 的不同處了。因為它們的&lt;code class=&quot;language-text&quot;&gt;project&lt;/code&gt; function 回傳值是 &lt;code class=&quot;language-text&quot;&gt;Observable&lt;/code&gt;，我們不會知道它會什麼時候發出值、什麼時候結束。&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;mergeMap&lt;/code&gt; 跟 &lt;code class=&quot;language-text&quot;&gt;switchMap&lt;/code&gt; 都有內部的 Observable，下一個運算子接收的值，是由這個 Observable 發出的值。而兩者的差別只在，使用&lt;code class=&quot;language-text&quot;&gt;switchMap&lt;/code&gt;的時候，當新的observable進來了，上一個 &lt;code class=&quot;language-text&quot;&gt;Observable&lt;/code&gt;會直接 &lt;code class=&quot;language-text&quot;&gt;complete&lt;/code&gt;。而 &lt;code class=&quot;language-text&quot;&gt;mergeMap&lt;/code&gt;不會&lt;code class=&quot;language-text&quot;&gt;complete&lt;/code&gt;上一個 Observable。&lt;/p&gt;
&lt;p&gt;當Observable被發出後，該Observable之後再發出的任何訊息，都不會再被訂閱者接收（在pipe中就是下一個運算子）。&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;switchMap&lt;/code&gt;一次只會有一個訂閱中的observable。而&lt;code class=&quot;language-text&quot;&gt;mergeMap&lt;/code&gt;會一次管理多個&lt;code class=&quot;language-text&quot;&gt;Observable&lt;/code&gt;訂閱。&lt;/p&gt;
&lt;p&gt;因此，使用switchMap可以防止潛在可能memory leak的問題。大多數的時候，使用&lt;code class=&quot;language-text&quot;&gt;switchMap&lt;/code&gt;是比較安全的。然而，有些情況下，可能還是適合使用 &lt;code class=&quot;language-text&quot;&gt;mergeMap&lt;/code&gt;。這就要看使用情境跟經驗了。&lt;/p&gt;
&lt;h2&gt;例子&lt;/h2&gt;
&lt;p&gt;這是從rxjs官網看到，覺得比較有趣的例子。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://stackblitz.com/edit/typescript-ivdebg?file=index.ts&quot;&gt;StackBlitz&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// RxJS v6+&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; interval&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; fromEvent&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; merge&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; empty &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;rxjs&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; switchMap&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; scan&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; takeWhile&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; startWith&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; mapTo &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;rxjs/operators&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; countdownSeconds &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;setHTML&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token parameter&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token parameter&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getElementById&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;innerHTML &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; val&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; pauseButton &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getElementById&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;pause&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; resumeButton &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getElementById&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;resume&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; interval$ &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;interval&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pipe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;mapTo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; pause$ &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fromEvent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pauseButton&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;click&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pipe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;mapTo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; resume$ &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fromEvent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;resumeButton&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;click&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pipe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;mapTo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; timer$ &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;merge&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pause$&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; resume$&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pipe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;startWith&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;switchMap&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;val &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; interval$ &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;empty&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;tap&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;val&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;scan&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;acc&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; curr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;curr &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; curr &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; acc &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; acc&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; countdownSeconds&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;takeWhile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; v &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;subscribe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setHTML&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;remaining&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;首先，原 &lt;code class=&quot;language-text&quot;&gt;Observable&lt;/code&gt;是 pause和 resume兩個 event 的 merge。
因此，timer$ 要馬會接收 pause button 的 click事件，回傳 &lt;code class=&quot;language-text&quot;&gt;true&lt;/code&gt;
要馬會接收 resume button 的 click事件，回傳 &lt;code class=&quot;language-text&quot;&gt;false&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;接著，&lt;code class=&quot;language-text&quot;&gt;switchMap&lt;/code&gt; 會接收 merge 發出的 true 或 false 值，並判斷要回傳 &lt;code class=&quot;language-text&quot;&gt;interval$&lt;/code&gt; observable 或是 empty。&lt;/p&gt;
&lt;p&gt;而 &lt;code class=&quot;language-text&quot;&gt;interval$&lt;/code&gt;這個 observable會每隔一秒發出 -1 。&lt;/p&gt;
&lt;p&gt;這裡因為使用 &lt;code class=&quot;language-text&quot;&gt;switchMap&lt;/code&gt;，所以當收到新的 click事件，前一個 回傳的 &lt;code class=&quot;language-text&quot;&gt;observable&lt;/code&gt;會被 結束掉，因此不會有潛在的 memory leak風險。&lt;/p&gt;
&lt;p&gt;接下來，&lt;code class=&quot;language-text&quot;&gt;scan&lt;/code&gt;會將收到的值累加，並發出值給下一個運算子。&lt;/p&gt;
&lt;p&gt;最後，&lt;code class=&quot;language-text&quot;&gt;takeWhile&lt;/code&gt; 會在 v &gt; 0 條件成立時，發出接收到的值。&lt;/p&gt;
&lt;p&gt;這樣整個 pipe做到的效果，就是一個 監聽 按鈕有沒有被按，並且做對應動作的倒計時器了。&lt;/p&gt;
&lt;p&gt; 在switchMap 後面 加上一個 &lt;code class=&quot;language-text&quot;&gt;tap&lt;/code&gt;/&lt;code class=&quot;language-text&quot;&gt;do&lt;/code&gt; 運算子，log一下接收的值，對&lt;code class=&quot;language-text&quot;&gt;switchMap&lt;/code&gt;會更了解。當你按下 pause時，switchMap會對內部的Obesrvable送出complete，並且發出一個新的Observable，在這裡是 &lt;code class=&quot;language-text&quot;&gt;empty&lt;/code&gt;。因此，
前一個&lt;code class=&quot;language-text&quot;&gt;interval$&lt;/code&gt; 的 Obsevable因為已經complete，不會再發出值了，達成停止counting 的效果。&lt;/p&gt;
&lt;h2&gt;參考&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://medium.com/allen%E7%9A%84%E6%8A%80%E8%A1%93%E7%AD%86%E8%A8%98/rxjs-mergeMap-%E7%AD%86%E8%A8%98-b971778cbff4&quot;&gt;https://medium.com/allen%E7%9A%84%E6%8A%80%E8%A1%93%E7%AD%86%E8%A8%98/rxjs-mergeMap-%E7%AD%86%E8%A8%98-b971778cbff4&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://rxjs-cn.github.io/learn-rxjs-operators/operators/transformation/switchMap.html&quot;&gt;https://rxjs-cn.github.io/learn-rxjs-operators/operators/transformation/switchMap.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://rxjs-cn.github.io/learn-rxjs-operators/operators/transformation/mergeMap.html&quot;&gt;https://rxjs-cn.github.io/learn-rxjs-operators/operators/transformation/mergeMap.html&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[初探 Golang]]></title><description><![CDATA[根據 wiki， Go是Google開發的一種靜態強型別、編譯型、並發型，並具有垃圾回收功能的程式語言。 現在在雲服務中，很多人在使用golang來實作服務。因此，想試試看 寫 golang是什麼感覺， 因此，隨便上網找了一個 starter turtoril 來 step by…]]></description><link>https://abhaynikam.github.io/gatsby-nice-blog/2020-05-26-go-starter/</link><guid isPermaLink="false">https://abhaynikam.github.io/gatsby-nice-blog/2020-05-26-go-starter/</guid><pubDate>Tue, 26 May 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;根據 wiki，&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Go是Google開發的一種靜態強型別、編譯型、並發型，並具有垃圾回收功能的程式語言。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;現在在雲服務中，很多人在使用golang來實作服務。因此，想試試看 寫 golang是什麼感覺，&lt;/p&gt;
&lt;p&gt;因此，隨便上網找了一個 starter turtoril 來 step by step 照著做，並且記錄一下。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;以下的內容參考、翻譯自 &lt;a href=&quot;https://dev.to/moficodes/build-your-first-rest-api-with-go-2gcj&quot;&gt;https://dev.to/moficodes/build-your-first-rest-api-with-go-2gcj&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;Go 中的 Rest Api&lt;/h1&gt;
&lt;p&gt;寫restful api，為什麼要選擇 go ?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;go 是 compile 語言，所以編譯後會得到一個很小的執行檔。&lt;/li&gt;
&lt;li&gt;快速（比c慢一點，但比大多數的web語言快&lt;/li&gt;
&lt;li&gt;非常簡單易懂。&lt;/li&gt;
&lt;li&gt;它非常適合應用在微服務的使用場景&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;net/http&lt;/h2&gt;
&lt;p&gt;net/http 為go 的 standard library。它是撰寫restful api 非常好的起始點。&lt;/p&gt;
&lt;p&gt;幾乎所有其它的library都可以與它交互操作。所以理解它是很重要的。&lt;/p&gt;
&lt;p&gt;現在不必了解它所有的細節，只要知道一些我們該知道的事，就可以開始coding了！&lt;/p&gt;
&lt;h2&gt;The Handler Interface&lt;/h2&gt;
&lt;p&gt;下面是 Handler 的介面。所有的 net/http 程式都應該要實現此介面。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;go&quot;&gt;&lt;pre class=&quot;language-go&quot;&gt;&lt;code class=&quot;language-go&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;type&lt;/span&gt; Handler &lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;ServeHTTP&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ResponseWriter&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;Request&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;這個介面只有唯一的一個方法。&lt;/p&gt;
&lt;p&gt;一個結構，只要有一個 &lt;code class=&quot;language-text&quot;&gt;ServeHTTP&lt;/code&gt; 方法，接受 ResponseWriter及 *request，就可以被當作一個handler介面使用。&lt;/p&gt;
&lt;h1&gt;source code&lt;/h1&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;package main

import (
    &quot;log&quot;
    &quot;net/http&quot;
)

type server struct {}

func (s *server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    w.Header().Set(&quot;Content-Type&quot;, &quot;application/json&quot;)
    w.WriteHeader(http.StatusOK)
    // 這個用法應該是指定型態↓
    w.Write([]byte(`{&quot;message&quot;: &quot;hello, world&quot;}`))
}

func main() {
    s := &amp;amp;server{}
    http.Handle(&quot;/&quot;, s)
    log.Fatal(http.ListenAndServe(&quot;:8888&quot;, nil))
}        &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;逐行解析&lt;/h2&gt;
&lt;p&gt;所有的可執行go程式，都必須包含一個&lt;code class=&quot;language-text&quot;&gt;main package&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;當錯誤發生時，我們可以使用&lt;code class=&quot;language-text&quot;&gt;log&lt;/code&gt;來查看發生了什麼事情。&lt;/p&gt;
&lt;p&gt;因為我們要寫 restful api，所以我們必須載入 &lt;code class=&quot;language-text&quot;&gt;net/http&lt;/code&gt;這個套件。&lt;/p&gt;
&lt;p&gt;接下來，我們必須要開始設計我們的伺服器。現在伺服器中沒有任何東西，我們建立一個方法&lt;code class=&quot;language-text&quot;&gt;ServeHTTP&lt;/code&gt;，它會滿足我們的 Handler 介面。&lt;/p&gt;
&lt;p&gt;在go當中，我們不須要明確的指明我們實現了哪個介面。編譯器可以自動偵測我們實現的介面。&lt;/p&gt;
&lt;p&gt;在ServeHTTP中，我們設定 httpStatus 200，表示請求成功。並且設定我們回傳的資料型&gt;態為 &lt;code class=&quot;language-text&quot;&gt;application/json&lt;/code&gt;，好讓 client端知道我們的回傳型態是json檔。&lt;/p&gt;
&lt;p&gt;最後，我們將 &lt;code class=&quot;language-text&quot;&gt;{&quot;message&quot;: &quot;hello world&quot;}&lt;/code&gt;做為回傳值。&lt;/p&gt;
&lt;h1&gt;延伸閱讀&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://www.ithome.com.tw/voice/107839&quot;&gt;https://www.ithome.com.tw/voice/107839&lt;/a&gt;&lt;/p&gt;</content:encoded></item></channel></rss>