<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on sappy blog</title><link>https://blog.sappy.tw/posts/</link><description>Recent content in Posts on sappy blog</description><generator>Hugo -- gohugo.io</generator><language>zh-tw</language><copyright>This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.</copyright><lastBuildDate>Sun, 14 Jan 2024 15:08:46 +0000</lastBuildDate><atom:link href="https://blog.sappy.tw/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>使用 Pulumi 自動建立 Proxmox LXC 環境</title><link>https://blog.sappy.tw/posts/homelab/%E4%BD%BF%E7%94%A8pulumi%E8%87%AA%E5%8B%95%E5%BB%BA%E7%AB%8Bproxmoxlxc%E7%92%B0%E5%A2%83/</link><pubDate>Sun, 14 Jan 2024 15:08:46 +0000</pubDate><guid>https://blog.sappy.tw/posts/homelab/%E4%BD%BF%E7%94%A8pulumi%E8%87%AA%E5%8B%95%E5%BB%BA%E7%AB%8Bproxmoxlxc%E7%92%B0%E5%A2%83/</guid><description>使用 Pulumi 自動建立 Proxmox LXC 環境 簡介 最近在嘗試使用 Pulumi + ProxmoxVE 搭建 HomeLab 的開發環境 摸了一段時間後終於搞清楚怎麼用了，因此這邊簡單做個紀錄 我們這次使用的是 https://github.com/muhlba91/pulumi-proxmoxve 這個第</description><content type="html"><![CDATA[<h1 id="使用-pulumi-自動建立-proxmox-lxc-環境">使用 Pulumi 自動建立 Proxmox LXC 環境</h1>
<h1 id="簡介">簡介</h1>
<p>最近在嘗試使用 Pulumi + ProxmoxVE 搭建 HomeLab 的開發環境</p>
<p>摸了一段時間後終於搞清楚怎麼用了，因此這邊簡單做個紀錄</p>
<p>我們這次使用的是 <a href="https://github.com/muhlba91/pulumi-proxmoxve">https://github.com/muhlba91/pulumi-proxmoxve</a> 這個第三方的元件，他是透過  tf-bridge  再去使用 <a href="https://github.com/bpg/terraform-provider-proxmox">https://github.com/bpg/terraform-provider-proxmox</a> 這個 terraform 的元件</p>
<h1 id="安裝步驟">安裝步驟</h1>
<h2 id="建立-pulumi-專案">建立 Pulumi 專案</h2>
<p>首先，我們先建立一個空資料夾作為專案的資料夾</p>
<p>並在資料夾中執行 <code>pulumi new python</code> 來建立一個新專案</p>
<p>我們會看到，資料夾的結構變成這樣</p>
<p><img src="https://images.sappy.tw/HomeLab/%E4%BD%BF%E7%94%A8Pulumi%E8%87%AA%E5%8B%95%E5%BB%BA%E7%AB%8BProxmoxLXC%E7%92%B0%E5%A2%83/Untitled.png" alt="Untitled"></p>
<p><code>Pulumi.yaml</code> 裡面出現的會是我們剛剛填入的資料，其中 <code>options</code> 可以指定 python 環境要不要由 Pulumi 控制，預設會在專案內建立 <code>venv</code> 這個資料夾，並使用該環境來執行 pulumi</p>
<p>如果想要由自己來管理環境的話，可以把這個選項拿掉，他就會用目前 shell 環境下的 python 去執行</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">homelab</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">runtime</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">python</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">options</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">virtualenv</span><span class="p">:</span><span class="w"> </span><span class="l">venv</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">description</span><span class="p">:</span><span class="w"> </span><span class="l">a homelab iac</span><span class="w">
</span></span></span></code></pre></div><h2 id="安裝套件">安裝套件</h2>
<p>接下來就是安裝我們需要的元件，我們根據 <a href="https://www.pulumi.com/registry/packages/proxmoxve/installation-configuration/">說明</a>，安裝對應語言的函式庫</p>
<p>這邊以 python 為例子，指令如下 <code>pip install pulumi-proxmoxve</code></p>
<h2 id="設定-provider">設定 provider</h2>
<p>安裝完成後，就可以開始來設定我們的 provider 了</p>
<p>provider 需要的參數有以下這些</p>
<ul>
<li>
<p>resource_name - Pulumi 的辨識名稱，跟 Proxmox 無關，填一個好記的字串即可</p>
</li>
<li>
<p>insecure - 是否跳過 TLS 檢查，這邊我選是</p>
</li>
<li>
<p>endpoint - Proxmox 的位置，填入 IP Port 就好了</p>
</li>
<li>
<p>api_token - 呼叫API時，用來驗證使用者身分的工具，可以在 datacenter 底下建立，建立完成後他會給你一個 UUID，再把 User 、 TokenID、剛剛拿到的 UUID 填入下面的程式即可</p>
<p><img src="https://images.sappy.tw/HomeLab/%E4%BD%BF%E7%94%A8Pulumi%E8%87%AA%E5%8B%95%E5%BB%BA%E7%AB%8BProxmoxLXC%E7%92%B0%E5%A2%83/Untitled%201.png" alt="Untitled"></p>
</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">pulumi</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">pulumi_proxmoxve</span> <span class="k">as</span> <span class="nn">pve</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">provider</span> <span class="o">=</span> <span class="n">pve</span><span class="o">.</span><span class="n">Provider</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="n">resource_name</span><span class="o">=</span><span class="s2">&#34;</span><span class="si">{Name}</span><span class="s2">&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">insecure</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">endpoint</span><span class="o">=</span><span class="s2">&#34;https://</span><span class="si">{IP}</span><span class="s2">:</span><span class="si">{Port}</span><span class="s2">/&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">api_token</span><span class="o">=</span><span class="s2">&#34;</span><span class="si">{User}</span><span class="s2">!</span><span class="si">{TokenID}</span><span class="s2">=</span><span class="si">{UUID}</span><span class="s2">&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span></code></pre></div><h2 id="給-apitoken-權限">給 APIToken 權限</h2>
<p>接下來我們需要給 APIToken 相對應的權限，這邊我是給 PVEAdmin</p>
<p><img src="https://images.sappy.tw/HomeLab/%E4%BD%BF%E7%94%A8Pulumi%E8%87%AA%E5%8B%95%E5%BB%BA%E7%AB%8BProxmoxLXC%E7%92%B0%E5%A2%83/Untitled%202.png" alt="Untitled"></p>
<h2 id="給-lxc-名稱--id以及登入用的-ssh-key">給 LXC 名稱 + ID，以及登入用的 ssh key</h2>
<p>接下來看看 LXC 的每個步驟分別需要那些基本參數</p>
<p><img src="https://images.sappy.tw/HomeLab/%E4%BD%BF%E7%94%A8Pulumi%E8%87%AA%E5%8B%95%E5%BB%BA%E7%AB%8BProxmoxLXC%E7%92%B0%E5%A2%83/Untitled%203.png" alt="Untitled"></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">pulumi</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">pulumi_proxmoxve</span> <span class="k">as</span> <span class="nn">pve</span>
</span></span><span class="line"><span class="cl"><span class="n">keys</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&#34;{ssh public key}&#34;</span><span class="p">]</span> <span class="c1"># 我是使用 ssh 登入，所以把 ssh publisc key 放這邊</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">pulumiTestCT</span> <span class="o">=</span> <span class="n">pve</span><span class="o">.</span><span class="n">ct</span><span class="o">.</span><span class="n">Container</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="n">resource_name</span><span class="o">=</span><span class="s2">&#34;</span><span class="si">{Name}</span><span class="s2">&#34;</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">    <span class="n">opts</span><span class="o">=</span><span class="n">pulumi</span><span class="o">.</span><span class="n">ResourceOptions</span><span class="p">(</span><span class="n">provider</span><span class="o">=</span><span class="n">provider</span><span class="p">),</span> <span class="c1"># 跟程式說使用我們之前設定的 provider 來執行操作</span>
</span></span><span class="line"><span class="cl">    <span class="n">vm_id</span><span class="o">=</span><span class="p">{</span><span class="n">ID</span><span class="p">},</span> <span class="c1"># CT ID</span>
</span></span><span class="line"><span class="cl">    <span class="n">unprivileged</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="c1"># 對應到 unprivileged container</span>
</span></span><span class="line"><span class="cl">    <span class="n">started</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="c1"># 設定完成後自動啟動</span>
</span></span><span class="line"><span class="cl">    <span class="n">start_on_boot</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="c1"># 開機後自動啟動</span>
</span></span><span class="line"><span class="cl">    <span class="n">node_name</span><span class="o">=</span><span class="s2">&#34;</span><span class="si">{NodeName}</span><span class="s2">&#34;</span><span class="p">,</span> <span class="c1"># 對應到 node 那個欄位</span>
</span></span><span class="line"><span class="cl">    <span class="n">initialization</span><span class="o">=</span><span class="n">pve</span><span class="o">.</span><span class="n">ct</span><span class="o">.</span><span class="n">ContainerInitializationArgs</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">        <span class="n">hostname</span><span class="o">=</span><span class="s2">&#34;</span><span class="si">{Name}</span><span class="s2">&#34;</span><span class="p">,</span> <span class="c1"># 對應到 Hostname 那個欄位</span>
</span></span><span class="line"><span class="cl">        <span class="n">user_account</span><span class="o">=</span><span class="n">pve</span><span class="o">.</span><span class="n">ct</span><span class="o">.</span><span class="n">ContainerInitializationUserAccountArgs</span><span class="p">(</span><span class="n">keys</span><span class="o">=</span><span class="n">keys</span><span class="p">),</span>  <span class="c1"># 我是使用 ssh 登入，所以把 ssh publisc key 放這邊</span>
</span></span><span class="line"><span class="cl">    <span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="n">features</span><span class="o">=</span><span class="n">pve</span><span class="o">.</span><span class="n">ct</span><span class="o">.</span><span class="n">ContainerFeaturesArgs</span><span class="p">(</span><span class="n">nesting</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="c1"># 對應到 Nesting </span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span></code></pre></div><h2 id="找到需要的-ct-template">找到需要的 CT Template</h2>
<p>可以使用 <code>pveam list local</code> 這個指令找出 CT template 的位置</p>
<p><img src="https://images.sappy.tw/HomeLab/%E4%BD%BF%E7%94%A8Pulumi%E8%87%AA%E5%8B%95%E5%BB%BA%E7%AB%8BProxmoxLXC%E7%92%B0%E5%A2%83/Untitled%204.png" alt="Untitled"></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">pulumiTestCT</span> <span class="o">=</span> <span class="n">pve</span><span class="o">.</span><span class="n">ct</span><span class="o">.</span><span class="n">Container</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="n">resource_name</span><span class="o">=</span><span class="s2">&#34;</span><span class="si">{Name}</span><span class="s2">&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">opts</span><span class="o">=</span><span class="n">pulumi</span><span class="o">.</span><span class="n">ResourceOptions</span><span class="p">(</span><span class="n">provider</span><span class="o">=</span><span class="n">provider</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="n">vm_id</span><span class="o">=</span><span class="p">{</span><span class="n">ID</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="n">unprivileged</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">started</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">start_on_boot</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">node_name</span><span class="o">=</span><span class="s2">&#34;</span><span class="si">{NodeName}</span><span class="s2">&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">features</span><span class="o">=</span><span class="n">pve</span><span class="o">.</span><span class="n">ct</span><span class="o">.</span><span class="n">ContainerFeaturesArgs</span><span class="p">(</span><span class="n">nesting</span><span class="o">=</span><span class="kc">True</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="n">operating_system</span><span class="o">=</span><span class="n">pve</span><span class="o">.</span><span class="n">ct</span><span class="o">.</span><span class="n">ContainerOperatingSystemArgs</span><span class="p">(</span> <span class="c1"># 設定我們要的 OS</span>
</span></span><span class="line"><span class="cl">        <span class="n">template_file_id</span><span class="o">=</span><span class="s2">&#34;local:vztmpl/debian-12-standard_12.2-1_amd64.tar.zst&#34;</span><span class="p">,</span> <span class="c1"># 可以使用 pveam list local 這個指令找出 CT template 的位置 </span>
</span></span><span class="line"><span class="cl">        <span class="nb">type</span><span class="o">=</span><span class="s2">&#34;debian&#34;</span><span class="p">,</span> <span class="c1"># 不同作業系統</span>
</span></span><span class="line"><span class="cl">    <span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="n">initialization</span><span class="o">=</span><span class="n">pve</span><span class="o">.</span><span class="n">ct</span><span class="o">.</span><span class="n">ContainerInitializationArgs</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">        <span class="n">hostname</span><span class="o">=</span><span class="s2">&#34;</span><span class="si">{Name}</span><span class="s2">&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="n">user_account</span><span class="o">=</span><span class="n">pve</span><span class="o">.</span><span class="n">ct</span><span class="o">.</span><span class="n">ContainerInitializationUserAccountArgs</span><span class="p">(</span><span class="n">keys</span><span class="o">=</span><span class="n">keys</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="p">),</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span></code></pre></div><h2 id="設定開機硬碟">設定開機硬碟</h2>
<p><img src="https://images.sappy.tw/HomeLab/%E4%BD%BF%E7%94%A8Pulumi%E8%87%AA%E5%8B%95%E5%BB%BA%E7%AB%8BProxmoxLXC%E7%92%B0%E5%A2%83/Untitled%205.png" alt="Untitled"></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">pulumiTestCT</span> <span class="o">=</span> <span class="n">pve</span><span class="o">.</span><span class="n">ct</span><span class="o">.</span><span class="n">Container</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="n">resource_name</span><span class="o">=</span><span class="s2">&#34;</span><span class="si">{Name}</span><span class="s2">&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">opts</span><span class="o">=</span><span class="n">pulumi</span><span class="o">.</span><span class="n">ResourceOptions</span><span class="p">(</span><span class="n">provider</span><span class="o">=</span><span class="n">provider</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="n">vm_id</span><span class="o">=</span><span class="p">{</span><span class="n">ID</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="n">unprivileged</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">started</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">start_on_boot</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">node_name</span><span class="o">=</span><span class="s2">&#34;</span><span class="si">{NodeName}</span><span class="s2">&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">features</span><span class="o">=</span><span class="n">pve</span><span class="o">.</span><span class="n">ct</span><span class="o">.</span><span class="n">ContainerFeaturesArgs</span><span class="p">(</span><span class="n">nesting</span><span class="o">=</span><span class="kc">True</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="n">operating_system</span><span class="o">=</span><span class="n">pve</span><span class="o">.</span><span class="n">ct</span><span class="o">.</span><span class="n">ContainerOperatingSystemArgs</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">        <span class="n">template_file_id</span><span class="o">=</span><span class="s2">&#34;local:vztmpl/debian-12-standard_12.2-1_amd64.tar.zst&#34;</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">        <span class="nb">type</span><span class="o">=</span><span class="s2">&#34;debian&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="n">initialization</span><span class="o">=</span><span class="n">pve</span><span class="o">.</span><span class="n">ct</span><span class="o">.</span><span class="n">ContainerInitializationArgs</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">        <span class="n">hostname</span><span class="o">=</span><span class="s2">&#34;</span><span class="si">{Name}</span><span class="s2">&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="n">user_account</span><span class="o">=</span><span class="n">pve</span><span class="o">.</span><span class="n">ct</span><span class="o">.</span><span class="n">ContainerInitializationUserAccountArgs</span><span class="p">(</span><span class="n">keys</span><span class="o">=</span><span class="n">keys</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="n">disk</span><span class="o">=</span><span class="n">pve</span><span class="o">.</span><span class="n">ct</span><span class="o">.</span><span class="n">ContainerDiskArgs</span><span class="p">(</span><span class="n">datastore_id</span><span class="o">=</span><span class="s2">&#34;localHDD&#34;</span><span class="p">),</span> <span class="c1"># 指定要使用哪個儲存空間</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span></code></pre></div><h2 id="設定-cpu記憶體">設定 CPU/記憶體</h2>
<p><img src="https://images.sappy.tw/HomeLab/%E4%BD%BF%E7%94%A8Pulumi%E8%87%AA%E5%8B%95%E5%BB%BA%E7%AB%8BProxmoxLXC%E7%92%B0%E5%A2%83/Untitled%206.png" alt="Untitled"></p>
<p><img src="https://images.sappy.tw/HomeLab/%E4%BD%BF%E7%94%A8Pulumi%E8%87%AA%E5%8B%95%E5%BB%BA%E7%AB%8BProxmoxLXC%E7%92%B0%E5%A2%83/Untitled%207.png" alt="Untitled"></p>
<p>因為這次只是測試，所以 CPU Memory 都不用填，都使用預設值就好</p>
<h2 id="設定網路">設定網路</h2>
<p><img src="https://images.sappy.tw/HomeLab/%E4%BD%BF%E7%94%A8Pulumi%E8%87%AA%E5%8B%95%E5%BB%BA%E7%AB%8BProxmoxLXC%E7%92%B0%E5%A2%83/Untitled%208.png" alt="Untitled"></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">pulumiTestCT</span> <span class="o">=</span> <span class="n">pve</span><span class="o">.</span><span class="n">ct</span><span class="o">.</span><span class="n">Container</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="n">resource_name</span><span class="o">=</span><span class="s2">&#34;</span><span class="si">{Name}</span><span class="s2">&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">opts</span><span class="o">=</span><span class="n">pulumi</span><span class="o">.</span><span class="n">ResourceOptions</span><span class="p">(</span><span class="n">provider</span><span class="o">=</span><span class="n">provider</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="n">vm_id</span><span class="o">=</span><span class="p">{</span><span class="n">ID</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="n">unprivileged</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">started</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">start_on_boot</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">node_name</span><span class="o">=</span><span class="s2">&#34;</span><span class="si">{NodeName}</span><span class="s2">&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">features</span><span class="o">=</span><span class="n">pve</span><span class="o">.</span><span class="n">ct</span><span class="o">.</span><span class="n">ContainerFeaturesArgs</span><span class="p">(</span><span class="n">nesting</span><span class="o">=</span><span class="kc">True</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="n">operating_system</span><span class="o">=</span><span class="n">pve</span><span class="o">.</span><span class="n">ct</span><span class="o">.</span><span class="n">ContainerOperatingSystemArgs</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">        <span class="n">template_file_id</span><span class="o">=</span><span class="s2">&#34;local:vztmpl/debian-12-standard_12.2-1_amd64.tar.zst&#34;</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">        <span class="nb">type</span><span class="o">=</span><span class="s2">&#34;debian&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="n">disk</span><span class="o">=</span><span class="n">pve</span><span class="o">.</span><span class="n">ct</span><span class="o">.</span><span class="n">ContainerDiskArgs</span><span class="p">(</span><span class="n">datastore_id</span><span class="o">=</span><span class="s2">&#34;localHDD&#34;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="n">initialization</span><span class="o">=</span><span class="n">pve</span><span class="o">.</span><span class="n">ct</span><span class="o">.</span><span class="n">ContainerInitializationArgs</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">        <span class="n">hostname</span><span class="o">=</span><span class="s2">&#34;</span><span class="si">{Name}</span><span class="s2">&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="n">user_account</span><span class="o">=</span><span class="n">pve</span><span class="o">.</span><span class="n">ct</span><span class="o">.</span><span class="n">ContainerInitializationUserAccountArgs</span><span class="p">(</span><span class="n">keys</span><span class="o">=</span><span class="n">keys</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">        <span class="n">ip_configs</span><span class="o">=</span><span class="p">[</span>
</span></span><span class="line"><span class="cl">            <span class="n">pve</span><span class="o">.</span><span class="n">ct</span><span class="o">.</span><span class="n">ContainerInitializationIpConfigArgs</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">                <span class="n">ipv4</span><span class="o">=</span><span class="n">pve</span><span class="o">.</span><span class="n">ct</span><span class="o">.</span><span class="n">ContainerInitializationIpConfigIpv4Args</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">                    <span class="n">address</span><span class="o">=</span><span class="s2">&#34;{IP/CIDR}&#34;</span><span class="p">,</span> <span class="n">gateway</span><span class="o">=</span><span class="s2">&#34;</span><span class="si">{Gateway}</span><span class="s2">&#34;</span> <span class="c1"># 設定 IP/CIDR + gateway</span>
</span></span><span class="line"><span class="cl">                <span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">],</span>
</span></span><span class="line"><span class="cl">    <span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="n">network_interfaces</span><span class="o">=</span><span class="p">[</span>
</span></span><span class="line"><span class="cl">        <span class="n">pve</span><span class="o">.</span><span class="n">ct</span><span class="o">.</span><span class="n">ContainerNetworkInterfaceArgs</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s2">&#34;eth0&#34;</span><span class="p">,</span> <span class="n">firewall</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="c1"># 使用 eth0，並打開防火牆(也可以不開)</span>
</span></span><span class="line"><span class="cl">    <span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span></code></pre></div><h2 id="組合上述步驟--部屬">組合上述步驟 + 部屬</h2>
<p>最後我們把所有步驟組合起來，會變成下面這樣，就大功告成了</p>
<p>現在我們可以使用 <code>pulumi up</code> 來部屬了</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">pulumi</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">pulumi_proxmoxve</span> <span class="k">as</span> <span class="nn">pve</span>
</span></span><span class="line"><span class="cl"><span class="n">keys</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&#34;{ssh public key}&#34;</span><span class="p">]</span> 
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">provider</span> <span class="o">=</span> <span class="n">pve</span><span class="o">.</span><span class="n">Provider</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="n">resource_name</span><span class="o">=</span><span class="s2">&#34;</span><span class="si">{Name}</span><span class="s2">&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">insecure</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">endpoint</span><span class="o">=</span><span class="s2">&#34;https://</span><span class="si">{IP}</span><span class="s2">:</span><span class="si">{Port}</span><span class="s2">/&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">api_token</span><span class="o">=</span><span class="s2">&#34;</span><span class="si">{User}</span><span class="s2">!</span><span class="si">{TokenID}</span><span class="s2">=</span><span class="si">{UUID}</span><span class="s2">&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">pulumiTestCT</span> <span class="o">=</span> <span class="n">pve</span><span class="o">.</span><span class="n">ct</span><span class="o">.</span><span class="n">Container</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="n">resource_name</span><span class="o">=</span><span class="s2">&#34;</span><span class="si">{Name}</span><span class="s2">&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">opts</span><span class="o">=</span><span class="n">pulumi</span><span class="o">.</span><span class="n">ResourceOptions</span><span class="p">(</span><span class="n">provider</span><span class="o">=</span><span class="n">provider</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="n">vm_id</span><span class="o">=</span><span class="p">{</span><span class="n">ID</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="n">unprivileged</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">started</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">start_on_boot</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">node_name</span><span class="o">=</span><span class="s2">&#34;</span><span class="si">{NodeName}</span><span class="s2">&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">features</span><span class="o">=</span><span class="n">pve</span><span class="o">.</span><span class="n">ct</span><span class="o">.</span><span class="n">ContainerFeaturesArgs</span><span class="p">(</span><span class="n">nesting</span><span class="o">=</span><span class="kc">True</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="n">operating_system</span><span class="o">=</span><span class="n">pve</span><span class="o">.</span><span class="n">ct</span><span class="o">.</span><span class="n">ContainerOperatingSystemArgs</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">        <span class="n">template_file_id</span><span class="o">=</span><span class="s2">&#34;local:vztmpl/debian-12-standard_12.2-1_amd64.tar.zst&#34;</span><span class="p">,</span> <span class="c1"># pveam list local</span>
</span></span><span class="line"><span class="cl">        <span class="nb">type</span><span class="o">=</span><span class="s2">&#34;debian&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="p">),</span>
</span></span><span class="line"><span class="cl">		<span class="n">disk</span><span class="o">=</span><span class="n">pve</span><span class="o">.</span><span class="n">ct</span><span class="o">.</span><span class="n">ContainerDiskArgs</span><span class="p">(</span><span class="n">datastore_id</span><span class="o">=</span><span class="s2">&#34;localHDD&#34;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="n">initialization</span><span class="o">=</span><span class="n">pve</span><span class="o">.</span><span class="n">ct</span><span class="o">.</span><span class="n">ContainerInitializationArgs</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">        <span class="n">hostname</span><span class="o">=</span><span class="s2">&#34;</span><span class="si">{Name}</span><span class="s2">&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="n">user_account</span><span class="o">=</span><span class="n">pve</span><span class="o">.</span><span class="n">ct</span><span class="o">.</span><span class="n">ContainerInitializationUserAccountArgs</span><span class="p">(</span><span class="n">keys</span><span class="o">=</span><span class="n">keys</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">        <span class="n">ip_configs</span><span class="o">=</span><span class="p">[</span>
</span></span><span class="line"><span class="cl">            <span class="n">pve</span><span class="o">.</span><span class="n">ct</span><span class="o">.</span><span class="n">ContainerInitializationIpConfigArgs</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">                <span class="n">ipv4</span><span class="o">=</span><span class="n">pve</span><span class="o">.</span><span class="n">ct</span><span class="o">.</span><span class="n">ContainerInitializationIpConfigIpv4Args</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">                    <span class="n">address</span><span class="o">=</span><span class="s2">&#34;192.168.51.5/24&#34;</span><span class="p">,</span> <span class="n">gateway</span><span class="o">=</span><span class="s2">&#34;192.168.51.1&#34;</span>
</span></span><span class="line"><span class="cl">                <span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">],</span>
</span></span><span class="line"><span class="cl">    <span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="n">network_interfaces</span><span class="o">=</span><span class="p">[</span>
</span></span><span class="line"><span class="cl">        <span class="n">pve</span><span class="o">.</span><span class="n">ct</span><span class="o">.</span><span class="n">ContainerNetworkInterfaceArgs</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s2">&#34;eth0&#34;</span><span class="p">,</span> <span class="n">firewall</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">]</span>
</span></span><span class="line"><span class="cl">   
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span></code></pre></div>]]></content></item><item><title>樂觀鎖 悲觀鎖</title><link>https://blog.sappy.tw/posts/%E5%BE%8C%E7%AB%AF/lock/%E6%A8%82%E8%A7%80%E9%8E%96_%E6%82%B2%E8%A7%80%E9%8E%96/</link><pubDate>Sat, 02 Sep 2023 17:14:20 +0800</pubDate><guid>https://blog.sappy.tw/posts/%E5%BE%8C%E7%AB%AF/lock/%E6%A8%82%E8%A7%80%E9%8E%96_%E6%82%B2%E8%A7%80%E9%8E%96/</guid><description>常見的鎖可以分成悲觀鎖跟樂觀鎖 悲觀鎖是認為同時修改資料的人很多，該特定資料被同時修改的機率比較大，因此會給資料加上一把鎖，只有先拿到鎖的人才</description><content type="html"><![CDATA[<p>常見的鎖可以分成<strong>悲觀鎖跟樂觀鎖</strong></p>
<p>悲觀鎖是認為同時修改資料的人很多，該特定資料被同時修改的機率比較大，因此會給資料加上一把鎖，只有先拿到鎖的人才有資格去修改資料，其餘的人只能排隊等待，直到第一個人修改完資料才有資格去修改資料</p>
<p>而樂觀鎖則是認為大部分時候同時修改資料的人不多，甚至只有一個人，因此該特定資料同時被修改的機率不高，所以很多人可以同時修改資料，但是只有第一個人的修改會被接受，其他人的修改都會被拒絕，只能重新跑一次修改資料的流程</p>
<h2 id="悲觀鎖">悲觀鎖</h2>
<p>悲觀鎖，Pessimistic Concurrency Control (PCC)</p>
<p>常見的悲觀鎖像是資料庫的 lock，或者是 排他鎖 mutex</p>
<h3 id="優點">優點</h3>
<ul>
<li>因為是先拿鎖，再修改資料，因此資料正確性比較有保障</li>
<li>通常我們能夠過資料庫來使用悲觀鎖，實作比較不容易出錯</li>
<li>資料庫級別的鎖也能確保資料不被認知外的應用程式改到</li>
</ul>
<h3 id="缺點">缺點</h3>
<ul>
<li>因為會需要處理加鎖機制，所以會產生額外開銷，效能比樂觀鎖差</li>
<li>有機率產生死鎖</li>
</ul>
<h2 id="樂觀鎖optimistic-concurrency-control-occ">樂觀鎖，Optimistic Concurrency Control (OCC)</h2>
<p>常見的樂觀鎖像是 CAS (Compare and Swap) ，透過 CPU 層級的指令來做到 CAS</p>
<h3 id="優點-1">優點</h3>
<ul>
<li>沒有實際上鎖，所以效能比較好</li>
</ul>
<h3 id="缺點-1">缺點</h3>
<ul>
<li>需要自己實作，確保邏輯的正確性</li>
<li>如果同時修改數量很多，會失敗並重試很多次，比較消耗 CPU 資源</li>
<li>ABA 問題，1 2 同時拿到 A 狀態，1 把狀態改成 B，這時候 3 把狀態改回 A，2 會以為狀態沒改過，因此會修改資料，但實際上資料已經不是 2 當時拿的資料了
<ul>
<li>⇒ 解法，加上 遞增版本號或時間戳，確保不會被改回 A</li>
</ul>
</li>
</ul>
<h3 id="優化技巧">優化技巧</h3>
<ul>
<li>縮小樂觀鎖的範圍
<ul>
<li>樂觀鎖如果是要對數字做加減的話可以使用 DB 的增加/減少功能，並檢查做完後的條件是否符合條件，例如</li>
</ul>
</li>
</ul>
<h2 id="參考資料">參考資料</h2>
<ul>
<li><a href="https://kknews.cc/comic/x23nxv8.html">https://kknews.cc/comic/x23nxv8.html</a></li>
</ul>
]]></content></item><item><title>MySQL Lock Mode</title><link>https://blog.sappy.tw/posts/%E5%BE%8C%E7%AB%AF/mysql/mysql-lock-mode/</link><pubDate>Sun, 01 Jan 2023 09:25:20 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E5%BE%8C%E7%AB%AF/mysql/mysql-lock-mode/</guid><description>mysql lock mode Status: Not started Tags: MySQL MySQL :: MySQL 8.0 Reference Manual :: 15.7.1 InnoDB Locking InnoDB 的 lock 主要分成這幾種 • Shared and Exclusive Locks InnoDB 在 row-level 的 lock 有兩種不同的類型 Shared(S) locks - 讓持有該 lock 的 transaction 能讀取這行 row 的資料 Exclusive(X) locks - 讓持</description><content type="html"><![CDATA[<h1 id="mysql-lock-mode">mysql lock mode</h1>
<p>Status: Not started
Tags: MySQL</p>
<p><a href="https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html">MySQL :: MySQL 8.0 Reference Manual :: 15.7.1 InnoDB Locking</a></p>
<p>InnoDB 的 lock</p>
<p>主要分成這幾種</p>
<h1 id="-shared-and-exclusive-lockshttpsdevmysqlcomdocrefman80eninnodb-lockinghtmlinnodb-shared-exclusive-locks">• <a href="https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html#innodb-shared-exclusive-locks">Shared and Exclusive Locks</a></h1>
<p>InnoDB 在 row-level 的 lock 有兩種不同的類型</p>
<ul>
<li>Shared(S) locks - 讓持有該 lock 的 transaction 能讀取這行 row 的資料</li>
<li>Exclusive(X) locks - 讓持有該 lock 的 transaction 能修改 刪除這行 row 的資料</li>
</ul>
<p>其中 S  lock 是可以共享的， X lock 則不能</p>
<p>舉些例子</p>
<ol>
<li>如果 transaction t1 已經有 row r 的 S lock，那這時 transaction t2 要求 row r 的 lock 時
<ul>
<li>如果 t2 要求 row r 的 S lock，則兩個. transaction 都能拿到 S lock， S lock 互相不排斥</li>
<li>如果 t2 要求 row r 的 X lock，則 t2 需要等到 t1 做完後才能拿到 row r 的 X lock</li>
</ul>
</li>
<li>如果 transaction t1 已經有 row r 的 X lock，那這時無論 transaction t2 要求 X lock 或是 S lock 都需要等 t1 做完後才能拿到</li>
</ol>
<h1 id="-intention-lockshttpsdevmysqlcomdocrefman80eninnodb-lockinghtmlinnodb-intention-locks">• <a href="https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html#innodb-intention-locks">Intention Locks</a></h1>
<p>InnoDB 支援不同顆粒度的鎖，像是 row lock，或者是 table lock</p>
<p>那假設現在 transaction t1 想要對整張表 table1 加上 X lock，此時 InnoDB 會需要先檢查 table1 這張表的每個 record 是否已經有被其他 transaction lock 了，才能決定是否要給 transaction t1 表級別的  lock。</p>
<p>但是，要掃描整張表的 record lock 效率太差了，因此才誕生出 intention lock，讓 InnoDB 能更好的判斷是否能夠給 transaction table 等級的 lock</p>
<p>Intention lock 表示某個 transaction 想要再這個 table 的某個 record 上加上鎖</p>
<p>因此</p>
<ul>
<li><a href="https://dev.mysql.com/doc/refman/8.0/en/glossary.html#glos_intention_shared_lock">intention shared lock</a> (IS) 表示這張表上，有個 transaction 想要拿到某個 row 的 S lock</li>
<li><a href="https://dev.mysql.com/doc/refman/8.0/en/glossary.html#glos_intention_exclusive_lock">intention exclusive lock</a> (IX) 表示這張表上，有個 transaction 想要拿到某個 row 的 X lock</li>
</ul>
<p>首先，先確立兩點規則</p>
<ol>
<li>任何 transaction 要拿 row S lock 時，必須先拿到該 table 的 intention share(IS) lock 或是更強的 lock</li>
<li>任何 transaction 要拿 row X lock 時，必須先拿到該 table 的 intention exclusive(IX) lock</li>
</ol>
<p>因此，如果一個 transaction 想要拿到 table 等級的 X 或 S lock，則我們只需要檢查該 table 有沒有被其他 transaction 加上 IX 或 IS lock，就能知道該不該給 table 等級的 X 或 S lock</p>
<p>也因此，IX 跟 IS 相互之間是不衝突的，只有當 table 等級的 S 或 X lock 來時，才要判斷是否能給 lock，下面是 table 級別 lock 的兼容性</p>
<table>
<thead>
<tr>
<th></th>
<th>X</th>
<th>IX</th>
<th>S</th>
<th>IS</th>
</tr>
</thead>
<tbody>
<tr>
<td>X</td>
<td>Conflict</td>
<td>Conflict</td>
<td>Conflict</td>
<td>Conflict</td>
</tr>
<tr>
<td>IX</td>
<td>Conflict</td>
<td>Compatible</td>
<td>Conflict</td>
<td>Compatible</td>
</tr>
<tr>
<td>S</td>
<td>Conflict</td>
<td>Conflict</td>
<td>Compatible</td>
<td>Compatible</td>
</tr>
<tr>
<td>IS</td>
<td>Conflict</td>
<td>Compatible</td>
<td>Compatible</td>
<td>Compatible</td>
</tr>
</tbody>
</table>
<h1 id="-record-lockshttpsdevmysqlcomdocrefman80eninnodb-lockinghtmlinnodb-record-locks">• <a href="https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html#innodb-record-locks">Record Locks</a></h1>
<p>在 InnoDB 中 row lock 其實就是把該 row 的 <a href="https://dev.mysql.com/doc/refman/8.0/en/innodb-index-types.html">cluster index</a> 給 lock 住，因此 InnoDB 的 row lock 其實就是 record lock.</p>
<p>如果說該 table 沒有 cluster index，那 InnoDB 會自己建一個隱藏的 <a href="https://dev.mysql.com/doc/refman/8.0/en/innodb-index-types.html">cluster index</a>，並 lock 對應 row 的 index</p>
<h1 id="-gap-lockshttpsdevmysqlcomdocrefman80eninnodb-lockinghtmlinnodb-gap-locks">• <a href="https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html#innodb-gap-locks">Gap Locks</a></h1>
<p>用來鎖 兩個 index 中間範圍的鎖</p>
<p>例如下面這句執行時，會把 10 ~ 20 範圍內的鎖全部鎖起來，防止有其他 transaction 在中間插入新的 row</p>
<p><code>SELECT c1 FROM t WHERE c1 BETWEEN 10 and 20 FOR UPDATE;</code></p>
<p>這樣做是為了防止 <code>幻讀 (Phantom Reads)</code> 發生，亦即 t1 讀取同樣範圍兩次，但 t2 在這之間插入了一筆資料，這時候 t1 兩次讀出來的行數會不一樣，這就是 <code>幻讀 (Phantom Reads)</code></p>
<p>也因為這是為了防止 幻讀 (Phantom Reads) 的發生，因此如果把 transaction isolation level 切成 <a href="https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html#isolevel_read-committed">READ COMMITTED</a> 的話，就不會產生 gap lock</p>
<p>Gap lock 對於 unique index 無效，但對其他類型的 index 有效</p>
<p>例如下面這句</p>
<p><code>SELECT * FROM child WHERE id = 100;</code></p>
<p>如果 id 不是 <code>unique index</code> 的話，那 100 之前到下一個有效 index (例如 90) 之間的範圍 (91 ~ 100)會被鎖起來，然而，如果是 <code>unique index</code> ，則只會鎖上這行而已</p>
<p>此外，比較有趣的一點是  gap lock 是可以被多個 transaction 同時持有的，因為 gap lock 之間不衝突，都是執行同樣的功能 (防止 record 遭到變化)，也因此， S gap lock  跟 X gap lock 沒有區別</p>
<p>更多例子可以參考</p>
<p><a href="https://juejin.cn/post/7018137095315128328">带你了解record lock、gap lock、next-key lock - 掘金 (juejin.cn)</a></p>
<p><a href="https://blog.twjoin.com/%E9%8E%96-lock-%E7%9A%84%E4%BB%8B%E7%B4%B9%E8%88%87%E6%AD%BB%E9%8E%96%E5%88%86%E6%9E%90-19833c18baab">鎖( Lock )的介紹與死鎖分析</a></p>
<h1 id="-next-key-lockshttpsdevmysqlcomdocrefman80eninnodb-lockinghtmlinnodb-next-key-locks">• <a href="https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html#innodb-next-key-locks">Next-Key Locks</a></h1>
<p>就是 record lock + gap lock，例如</p>
<p><code>SELECT * FROM child WHERE id = 100;</code></p>
<p>如果 id 不是 <code>unique index</code> 的話，那 100 之前到下一個有效 index (例如 90) 之間的範圍 (91 ~ 100)會被鎖起來，然而，如果是 <code>unique index</code> ，則只會鎖上這行而已</p>
<h1 id="-insert-intention-lockshttpsdevmysqlcomdocrefman80eninnodb-lockinghtmlinnodb-insert-intention-locks">• <a href="https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html#innodb-insert-intention-locks">Insert Intention Locks</a></h1>
<p>是 gap lock 的一種，在插入前會要先取得，主要是讓兩個插入可以不用等待</p>
<p>例如 gap 是 10 ~ 20，這時候如果一個要插入 13 另一個插入 17 的話，這兩個插入就不會衝突，因此都可以拿到 Insert Intention lock</p>
<h1 id="-auto-inc-lockshttpsdevmysqlcomdocrefman80eninnodb-lockinghtmlinnodb-auto-inc-locks">• <a href="https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html#innodb-auto-inc-locks">AUTO-INC Locks</a></h1>
<p>當插入有 AUTO_INCREMENT 的 table 時，則會把整張表 lock 住，其他想插入的 transaction 必須等到做完後才能繼續做，這樣做是為了取得連續的 index</p>
<p>我們可以透過 變數 <a href="https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_autoinc_lock_mode">innodb_autoinc_lock_mode</a> 來控制 lock 的行為，詳細可以看 <a href="https://dev.mysql.com/doc/refman/8.0/en/innodb-auto-increment-handling.html">Section 15.6.1.6, “AUTO_INCREMENT Handling in InnoDB”</a></p>
<h1 id="-predicate-locks-for-spatial-indexeshttpsdevmysqlcomdocrefman80eninnodb-lockinghtmlinnodb-predicate-locks">• <a href="https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html#innodb-predicate-locks">Predicate Locks for Spatial Indexes</a></h1>
<h1 id="延伸閱讀">延伸閱讀</h1>
<ul>
<li><a href="https://zhuanlan.zhihu.com/p/222111898">你的insert死锁了看这里 - 知乎 (zhihu.com)</a></li>
<li><a href="https://github.com/octachrome/innodb-locks">https://github.com/octachrome/innodb-locks</a></li>
<li></li>
</ul>
]]></content></item><item><title>K8S debug 技巧</title><link>https://blog.sappy.tw/posts/%E5%BE%8C%E7%AB%AF/k8s/k8s_debug/</link><pubDate>Tue, 27 Sep 2022 16:00:33 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E5%BE%8C%E7%AB%AF/k8s/k8s_debug/</guid><description>紀錄一下最近找問題時用到的指令 查詢上一個 pod 的 log 發現 pod 有重啟的紀錄，因此透過這指令去查死掉的 pod 的 logs 來得知發生甚麼事情 kubectl logs -f -n {NAMESPACE} pod/{PODNAME} --previous</description><content type="html"><![CDATA[<p>紀錄一下最近找問題時用到的指令</p>
<h2 id="查詢上一個-pod-的-log">查詢上一個 pod 的 log</h2>
<p>發現 pod 有重啟的紀錄，因此透過這指令去查死掉的 pod 的 logs 來得知發生甚麼事情</p>
<pre tabindex="0"><code>kubectl logs -f -n {NAMESPACE} pod/{PODNAME} --previous
</code></pre>]]></content></item><item><title>NLP Transformers 模型部署</title><link>https://blog.sappy.tw/posts/ai/nlp/ai%E6%A8%A1%E5%9E%8B%E9%83%A8%E5%B1%AC/</link><pubDate>Mon, 15 Nov 2021 15:33:45 +0000</pubDate><guid>https://blog.sappy.tw/posts/ai/nlp/ai%E6%A8%A1%E5%9E%8B%E9%83%A8%E5%B1%AC/</guid><description>起因 畢業之後，在實驗室協助學長部屬要給聯合報使用的自然語言處理系統，由於速度過慢，因此首要任務便是提高模型的處理速度 常見的模型加速方法 使用更</description><content type="html"><![CDATA[<h1 id="起因">起因</h1>
<p>畢業之後，在實驗室協助學長部屬要給聯合報使用的自然語言處理系統，由於速度過慢，因此首要任務便是提高模型的處理速度</p>
<h1 id="常見的模型加速方法">常見的模型加速方法</h1>
<ol>
<li>使用更好的硬體(GPU、CPU(AVX512)、FPGA)</li>
<li>使用專門的運行環境 (ONNX)</li>
<li>調整推理方式(降低無用的計算)</li>
</ol>
<h1 id="我的解法">我的解法</h1>
<p>使用 ONNX 及 支援 AVX512 的 CPU，並不使用 batch 計算，降低 batch 計算時出現的無用 padding</p>
<h1 id="結果">結果</h1>
<p>將模型的 throughput 提高 9 倍， latency 降低至原本的 1/6</p>
<h1 id="參考資料">參考資料</h1>
<ul>
<li><a href="https://huggingface.co/blog/bert-cpu-scaling-part-1">Scaling up BERT-like model Inference on modern CPU - Part 1</a></li>
<li><a href="https://huggingface.co/blog/bert-cpu-scaling-part-2">Scaling up BERT-like model Inference on modern CPU - Part 2</a></li>
<li><a href="https://blog.roblox.com/2020/05/scaled-bert-serve-1-billion-daily-requests-cpus/">How We Scaled Bert To Serve 1+ Billion Daily Requests on CPUs - Roblox Blog</a></li>
<li><a href="https://www.comet.ml/site/how-to-10x-throughput-when-serving-hugging-face-models-without-a-gpu/">How to 10x throughput when serving Hugging Face models without a GPU – Comet</a></li>
</ul>
]]></content></item><item><title>台積電求職心得</title><link>https://blog.sappy.tw/posts/%E6%B1%82%E8%81%B7/%E5%8F%B0%E7%A9%8D%E9%9B%BB/</link><pubDate>Mon, 07 Dec 2020 14:15:13 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E6%B1%82%E8%81%B7/%E5%8F%B0%E7%A9%8D%E9%9B%BB/</guid><description>目錄 目錄 流程 程式上機考 Interview Mocha 性向測驗 英文測驗 主管面試 竹科 南科 人資面試 本篇簡單記錄了我在 109 年 12 月初到台積電求職 IT Engineer (預聘) 的過程 流程 台積電應徵流</description><content type="html"><![CDATA[<h1 id="目錄">目錄</h1>
<ul>
<li><a href="#%E7%9B%AE%E9%8C%84">目錄</a></li>
<li><a href="#%E6%B5%81%E7%A8%8B">流程</a></li>
<li><a href="#%E7%A8%8B%E5%BC%8F%E4%B8%8A%E6%A9%9F%E8%80%83">程式上機考</a></li>
<li><a href="#interview-mocha">Interview Mocha</a></li>
<li><a href="#%E6%80%A7%E5%90%91%E6%B8%AC%E9%A9%97">性向測驗</a></li>
<li><a href="#%E8%8B%B1%E6%96%87%E6%B8%AC%E9%A9%97">英文測驗</a></li>
<li><a href="#%E4%B8%BB%E7%AE%A1%E9%9D%A2%E8%A9%A6">主管面試</a>
<ul>
<li><a href="#%E7%AB%B9%E7%A7%91">竹科</a></li>
<li><a href="#%E5%8D%97%E7%A7%91">南科</a></li>
</ul>
</li>
<li><a href="#%E4%BA%BA%E8%B3%87%E9%9D%A2%E8%A9%A6">人資面試</a></li>
</ul>
<p>本篇簡單記錄了我在 109 年 12 月初到台積電求職 IT Engineer (預聘) 的過程</p>
<h1 id="流程">流程</h1>
<p>台積電應徵流程主要分成下面幾個部分</p>
<ol>
<li>程式上機考 - 此為Coding測驗，適合對程式開發、測試、與應用有興趣者</li>
<li>Interview Mocha - 此為資訊基礎架構測驗，適合對網路、資料庫、Cloud與Big Data環境建置有興趣者</li>
<li>性向測驗</li>
<li>英文測驗</li>
<li>主管面試</li>
<li>人資面試</li>
</ol>
<h1 id="程式上機考">程式上機考</h1>
<p>台積電使用 hackrank 這套系統，題目有三題，限制時間是 90 分鐘，可以使用任何語言跟該語言內建的函式庫(例如可以直接用 sort，除非題目有特別說明)<br>
難易度大概是一題 easy，兩題 medium (leetcode 難度)，我因為沒有刷 leetcode 及 BFS 有點生疏了，導致這邊只拿到 1.5 題</p>
<h1 id="interview-mocha">Interview Mocha</h1>
<p>主要是考你資訊基礎，例如 OS、網路、資料庫、SQL、雲端計算、AI 等等<br>
題目都蠻基礎的，SQL、雲端計算、AI 非常簡單，而 OS、網路、資料庫 我忘了不少，所以一半是靠猜的，但是應該也是很基礎的東西  。</p>
<h1 id="性向測驗">性向測驗</h1>
<p>都是選擇題，主要是看你在遇到問題時會怎麼應對，以及吸收新知的渴望程度，這邊就誠實填寫就好，我朋友有說，如果面試主管發現你性向測驗跟你履歷不太符合的時候，就可能會挑出來問。。</p>
<h1 id="英文測驗">英文測驗</h1>
<p>我用我渣渣的 TOEIC 成績單(615)抵免，所以免試。</p>
<h1 id="主管面試">主管面試</h1>
<p>預聘的話都會在竹科面試，而我是因為朋友的推薦，才又得到一個南科面試的機會</p>
<h2 id="竹科">竹科</h2>
<p>一進去有兩個主管，分別是管理基礎設施的團隊，還有工廠內程式的開發團隊，不過面試官跟進去後的主管不一定是同一個團隊的。<br>
一開始會先要求你自我介紹，而後他們會從履歷中問感興趣的問題。<br>
我一開始是被問到我怎麼用 ELK 做分析，主管會希望你講越詳細越好(例如打哪個 API)。</p>
<p>第二個問題是關於 API 的設計，你覺得你之前用過的某個開源程式，他 API 的設計如何，還有他使用上遇到的困難等等，這邊我回答得不是很好，因為我那時候最大的困難就是環境架設，所以我也就回答這樣而已，但現在想來，主管還是想要求回答得更加具體。</p>
<p>第三個問題是，你的主管讓你使用新/舊的技術，但你認為舊的或新的技術比較適合的時候，你會怎麼說服主管，我回答使用一個小 demo 以及說服身邊的人來說服主管，不過看的出來主管不是很滿意。</p>
<p>之後他們會讓你提問題，因為最後一個問題是新舊技術的取捨，以及聽說台積有用到 Flutter 跟 Serverless，因此讓我有點好奇台積電內部的基礎設施是怎麼演化的，然後也大概知道他們是從 裸機 -&gt; VM -&gt; 微軟的某個服務 -&gt; Kubernetes 的變化，不過這變化其實就是遇到問題，然後想辦法克服的過程，他們也說，這些變化讓他們的流程大幅加快，Issue 從進來到部屬上線可能只需要不到 24 小時，行政流程也從幾個禮拜的層層批閱，進步到一天就能過關。</p>
<p>最後我問說我的缺點在哪邊，他們的看法是</p>
<ol>
<li>太過重視技術，但台積會比較想要能用技術解決問題的人</li>
<li>技術細節沒有說得很清楚</li>
</ol>
<p>個人認為我這次面試不太好QQ</p>
<h2 id="南科">南科</h2>
<p>一進去有一個主管，南科聽起來是做兩部分，一個是把生產機器上的感應器資料拉出來(感覺就是手工活)，一個是維運，兩者都要 on call，跟竹科一樣，面試官跟進去後的主管不一定是同一個團隊的。<br>
一樣一開始會先要求你自我介紹，而後他們會從履歷中問感興趣的問題。</p>
<p>我主要是被問到怎麼使用 GCP、Kubernetes、ELK、CI/CD 等等，剛好最近我正在使用這些，就說了一下我最近用來做什麼，跟竹科比，更像是純粹聊天XD<br>
例如用過 GCP 的那些服務，Kubernetes 的環境(雲端還是地端，地端怎麼架設的)，怎麼用 Elasticsearch 分析文字資料，CI/CD 用來做啥等等。</p>
<p>之後主管介紹工作內容，南科聽起來是做兩部分，一個是把生產機器上的感應器資料拉出來(感覺就是手工活)，一個是維運，兩者都要 on call，上班時間是 8:30 ~ 7 or 8:00，然後你能問問題。</p>
<p>我這次是問未來的發展性，不過主管的回答比較偏公司內部的發展，不是工程師生涯的發展，另一個問題則是他們怎麼引入新技術，主管是跟我說</p>
<ol>
<li>遇到問題，這問題用新技術解比較好</li>
<li>準備 2、3 頁 ppt 跟主管簡報優缺點</li>
<li>主管認為可行就小規模引入</li>
<li>逐漸擴大規模</li>
</ol>
<h1 id="人資面試">人資面試</h1>
<p>竹科跟南科好像共用，所以只由一次，他主要是問你寫在那應徵人員問卷上的問題，並且會問比較仔細，會通過一連串問題逐步深入，以及一些之外的問題，例如團隊內部衝突，你通常是怎麼解決的(我說我是個聆聽者)、時間有限，但內容做不完怎麼辦(我回答排定優先級)，還有你能不能接受加班等等。<br>
我也認為我這次回答得不太好QQ</p>
]]></content></item><item><title>GitOPs</title><link>https://blog.sappy.tw/posts/meetup/cntug/gitops/</link><pubDate>Sat, 22 Aug 2020 15:36:28 +0000</pubDate><guid>https://blog.sappy.tw/posts/meetup/cntug/gitops/</guid><description>本篇是 CNTUG Meetups 的簡短心得 概念 所有環境的變動變動都在 git 發生並記錄在 git 能從 git 自動部屬 因此如果用是普通的 CI/CD ，在沒有人工介入修改行為一切都是用 git tigger 的情況</description><content type="html"><![CDATA[<p>本篇是 CNTUG Meetups 的簡短心得</p>
<h1 id="概念">概念</h1>
<ol>
<li>所有環境的變動變動都在 git 發生並記錄在 git</li>
<li>能從 git 自動部屬</li>
</ol>
<p>因此如果用是普通的 CI/CD ，在沒有人工介入修改行為一切都是用 git tigger 的情況下，應該也可以稱為 gitops</p>
<h1 id="實作建議">實作建議</h1>
<ol>
<li>Application repo 跟 environment repo 分開</li>
<li>push/pull base -&gt; 推薦使用 pull base
<ul>
<li>push base 跟傳統 CD 差不多，較不推薦使用</li>
<li>pull base 推薦使用，自動化 process 放在 k8s 中，K8S 定期拉 git 上的環境設定，並自動更新環境，改 images tag 也會自動更新到 git 上的 env repo</li>
</ul>
</li>
</ol>
<h1 id="優點">優點</h1>
<ul>
<li>進退版方便</li>
<li>確保環境一致，不會有人為修改</li>
</ul>
<h1 id="實作">實作</h1>
<ul>
<li>ArgoCD</li>
<li>Flux</li>
<li>Pulumi</li>
</ul>
<h2 id="argocd">ArgoCD</h2>
<h3 id="特性">特性</h3>
<ul>
<li>原生做不到金絲雀部屬，要使用 argo rollout</li>
<li>for K8S only</li>
<li>pull base</li>
<li>只觀察 git repo</li>
<li>dex - 預設搭配作認證</li>
<li>repo-server - 觀察 github</li>
<li>可以部屬到多個 cluster</li>
<li>能看到人為修改差異</li>
<li>Redhat 推薦XD</li>
<li>history 放在 CRD 裡面，因此 CRD 不能亂動</li>
<li>會存資料在 CRD &amp; configMap</li>
<li>講者認為 ArgoCD &gt; flux</li>
</ul>
<h2 id="flux">Flux</h2>
<ul>
<li>原生做不到金絲雀部屬</li>
<li>pull base</li>
<li>追蹤 git + docker images</li>
<li>semver version or 時間 來判斷哪個 docker images 最新</li>
</ul>
<h1 id="其他">其他</h1>
<h2 id="其他建議">其他建議</h2>
<ol>
<li>部屬在哪裡 -&gt; 看資安政策，一般來說 prod 去連 dev 比較不會被刁難， dev 去連 prod 比較會被刁難</li>
<li>Docker images 不要用 latest 做命名</li>
<li>k8s master 絕對絕對不能開 public internet</li>
</ol>
<h2 id="有趣問題">有趣問題</h2>
<ul>
<li>
<p>使用 gitops，如果 running state 因為 HPA 把 replicas 變多(或少)時，上版後會不會被改回去？因為 deployment .yaml 裡面的 replicas 不會被 HPA 改到 -&gt; 不過講者說 gitops 有能力做到，這問題可被修正</p>
</li>
<li>
<p>之前我用試著用程式回寫 git repo，結果造成無窮迴圈。 (git 觸發 jenkins 觸發 kubernetes 寫回 git 再觸發 jenkins 觸發 kubernetes ) -&gt; 講者說的回覆是開源幫你做完惹</p>
</li>
<li>
<p>got it, 所以如果用經典的pipline來講 沒有人工介入修改行為一切都是用git tigger 所以也可以講 gitops XD -&gt; 講者說的回覆是說這是正確的</p>
</li>
</ul>
]]></content></item><item><title>文獻管理軟體比較</title><link>https://blog.sappy.tw/posts/ai/%E6%96%87%E7%8D%BB%E7%AE%A1%E7%90%86/%E6%96%87%E7%8D%BB%E7%AE%A1%E7%90%86%E8%BB%9F%E9%AB%94%E6%AF%94%E8%BC%83/</link><pubDate>Sat, 22 Aug 2020 15:33:56 +0000</pubDate><guid>https://blog.sappy.tw/posts/ai/%E6%96%87%E7%8D%BB%E7%AE%A1%E7%90%86/%E6%96%87%E7%8D%BB%E7%AE%A1%E7%90%86%E8%BB%9F%E9%AB%94%E6%AF%94%E8%BC%83/</guid><description>文獻管理軟體比較 比較的時間以 2020/1/1 ~ 2020/1/5 的版本為主 前言 開始了研究生的生活後，陸陸續續使用了不同方法來管理文獻，但還是希望能穩定在一個軟體上，省去手</description><content type="html"><![CDATA[<h1 id="文獻管理軟體比較">文獻管理軟體比較</h1>
<p>比較的時間以 2020/1/1 ~ 2020/1/5 的版本為主</p>
<h1 id="前言">前言</h1>
<p>開始了研究生的生活後，陸陸續續使用了不同方法來管理文獻，但還是希望能穩定在一個軟體上，省去手動的步驟。<br>
經過了一段時間的比較後，終於誕生了這篇文章。</p>
<h1 id="需求簡介">需求簡介</h1>
<ol>
<li>標註必須附著在 pdf 上 - 由於我本身喜歡在 pdf 上做註記，也希望未來若要更換軟體時能方便地把我的資料帶走，而我的筆記就應當是我的筆記，不能被鎖死在特定格式上</li>
<li>取用文獻方便且正確（特別是在 arXiv 上的） - 由於我的領域很多時候會在 arXiv 上看到論文，因此要能夠正確的解析 arXiv 上的文獻，獲得正確的引用資訊外，也必須足夠方便把文獻放入管理軟體中，最好能一鍵解決</li>
<li>跨平台 - 由於我習慣用 ipad 來閱讀論文，用 pc or mac 寫作，因此至少要能跨這三個平台</li>
<li>便宜 - 因為我很窮ＱＡＱ</li>
<li>可用偏好的 pdf 閱讀器閱讀及編輯 - 因為學校有提供 adobe pdf，而有些軟體內建的不是很好用</li>
</ol>
<h1 id="開始比較">開始比較</h1>
<h2 id="參賽選手">參賽選手</h2>
<ol>
<li><a href="https://www.mendeley.com">Mendeley</a> - 之前使用的軟體</li>
<li><a href="https://www.zotero.org/">Zotero</a> - 本次冠軍</li>
<li><a href="https://endnote.com/">Endnote x9</a> - 老牌管理軟體</li>
<li><a href="https://www.citavi.com/en">Citavi 6</a> - 功能強大</li>
<li><a href="https://www.readcube.com/home">ReadCube</a> - 管理軟體新銳</li>
</ol>
<h2 id="第一輪淘汰">第一輪淘汰</h2>
<ol>
<li>Citavi 6 - 沒有跨平台</li>
<li>Endnote x9 - 對 arXiv 支援不好</li>
<li>ReadCube - 對 arXiv 支援不好 + 無法註記在 pdf 上</li>
</ol>
<h2 id="第二輪比較">第二輪比較</h2>
<h3 id="mendeley">Mendeley</h3>
<h4 id="優點">優點</h4>
<ol>
<li>龐大社群</li>
<li>優秀的論文推薦功能</li>
<li>對 arXiv 支援超好</li>
<li>跨平台</li>
</ol>
<h4 id="缺點">缺點</h4>
<ol>
<li>不能直接標記在 pdf 上</li>
<li>搜尋時，相同論文會出現多篇，引用、被引用次數不精確（跟 google scholar 相比）</li>
<li>貴(相比 Zotero)</li>
</ol>
<h3 id="zotero">Zotero</h3>
<h4 id="優點-1">優點</h4>
<ol>
<li>開源</li>
<li>支持 plugin</li>
<li>便宜（搭配 zotfile 服用）</li>
<li>可直接標註在 pdf 上</li>
<li>可自訂 pdf 檔名（zotfile）</li>
</ol>
<h4 id="缺點-1">缺點</h4>
<ol>
<li>對 arXiv 支援不佳（相比 Mendeley）</li>
<li>沒有論文推薦功能</li>
<li>不跨平台（iPad）</li>
</ol>
<h1 id="結論">結論</h1>
<p>最終還是選定 Zotero + Zotfile 搭配使用
下面來說明一下我自己的設定</p>
<h1 id="zotero-設定">Zotero 設定</h1>
<ol>
<li>安裝 <a href="http://zotfile.com/">Zotfile</a></li>
<li>取消自動快照
<img src="https://images.sappy.tw/zotero/zotero-1.png" alt="zotero-1">
<img src="https://images.sappy.tw/zotero/zotero-sync.png" alt="zotero-sync"></li>
<li>修改連結目錄成為相對目錄，這是最重要的步驟，在此目錄下的所有檔案都會變成相對目錄，因此在不同電腦上只要設定正確，就都能成功開啟檔案
<img src="https://images.sappy.tw/zotero/zotero-linked-file.png" alt="zotero-linked-file"></li>
<li>設定 Zotfile，告知要把檔案幫去哪裡，要跟上面的相對路徑一樣
<img src="https://images.sappy.tw/zotero/zotfile-config.png" alt="zotfile-config"></li>
<li>傳送到 ipad - 個人感覺不是很必要，因為這只是把檔案放到雲端硬碟上的資料夾而已，如果第五步驟已經把檔案放在雲端硬碟中，那這步驟就可以略過，不過假若將來檔案多起來，或許就能用這功能，減少在雲端硬碟中一個個慢慢找的時間
<img src="https://images.sappy.tw/zotero/zotfile-send-to-table.png" alt="zotfile-send-to-table"></li>
<li>命名規則，這步驟很重要，我是 年_標題_作者 <code>{%y_}{%t_}{%a}</code> 這樣命名，也要用 collection 作為子資料夾來分大類 <code>/%s</code>
<img src="https://images.sappy.tw/zotero/zotfile-rename.png" alt="zotfile-rename"></li>
</ol>
]]></content></item><item><title>LSTM 心得</title><link>https://blog.sappy.tw/posts/ai/nlp/lstm/</link><pubDate>Sat, 22 Aug 2020 15:33:45 +0000</pubDate><guid>https://blog.sappy.tw/posts/ai/nlp/lstm/</guid><description>RNN RNN 其本質上就是一個具狀態的 NN，他跟其他 NN 不同的地方就在於他多了一個輸入，表示上一個狀態(Hidden State) 如下圖所示 1 RNN 示意圖 RNN 缺點 而隨之帶</description><content type="html"><![CDATA[<h1 id="rnn">RNN</h1>
<p>RNN 其本質上就是一個具狀態的 NN，他跟其他 NN 不同的地方就在於他多了一個輸入，表示上一個狀態(Hidden State)<br>
如下圖所示</p>
<p><img src="https://miro.medium.com/max/250/1*T_ECcHZWpjn0Ki4_4BEzow.gif" alt="RNN 示意圖"><br>
<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> RNN 示意圖</p>
<h2 id="rnn-缺點">RNN 缺點</h2>
<p>而隨之帶來的問題即是梯度消失 or 爆炸的問題<br>
因 RNN 在計算時，是以乘法為主，而乘法有一個特性，那就是很容易使數值太大或太小，
例如 (1.01) 的 365 次方 會是 37.7834343329，
而   (0.99) 的 365 次方 則是 0.02551796445，
因此如果網路很深，句子很長，遇到太長句子時，在 Backward Propagation (反向傳播) 很容易使數字太大或太小，造成梯度爆炸或消失的問題，使越前面的句子，其參數很難被 RNN 更新的很好。
也因此，越是前面的句子，越難被 RNN 所利用 (因為其參數更新不好)，也因此造成 RNN 僅能很好的利用靠近句子結尾的幾個字而已。<br>
<img src="https://miro.medium.com/max/960/1*Ku54qmCryZVBaIc6g8rjGA.gif" alt="RNN 反向傳播 示意圖"><br>
<sup id="fnref1:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> RNN 反向傳播 示意圖</p>
<h1 id="lstm">LSTM</h1>
<p><img src="https://www.researchgate.net/profile/Savvas_Varsamopoulos/publication/329362532/figure/fig5/AS:699592479870977@1543807253596/Structure-of-the-LSTM-cell-and-equations-that-describe-the-gates-of-an-LSTM-cell_W640.jpg" alt=""><br>
LSTM 架構圖 <a href="https://www.researchgate.net/publication/329362532_Designing_neural_network_based_decoders_for_surface_codes/figures?lo=1">出處</a></p>
<p>那要怎麼解決呢? LSTM 提出的做法是透過多一個狀態來保存長距離訊息</p>
<h2 id="lstm-結構">LSTM 結構</h2>
<p>$\sigma$ 控制著資訊流過去的百分比 (0 ~ 1)<br>
$tanh$ 則是代表資訊的數值 (-1 ~ 1)</p>
<h3 id="forget-gate-最左邊的-sigma">Forget gate (最左邊的 $\sigma$)</h3>
<p>從圖中可以很明顯的看出，<br>
決定長距離訊息 C 有多少要用到</p>
<h3 id="input-gate-中間的黃色-sigma--tanh">Input gate (中間的黃色 $\sigma\ &amp;\ tanh$)</h3>
<p>決定多少短距離訊息要被更新到 C 裡面</p>
<h3 id="output-gate最右邊的區域">Output gate(最右邊的區域)</h3>
<p>決定什麼要進入隱藏狀態中</p>
<h1 id="gru">GRU</h1>
<p><img src="https://miro.medium.com/max/1400/1*jhi5uOm9PvZfmxvfaCektw.png" alt=""><br>
<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> GRU 架構圖</p>
<h1 id="參考">參考</h1>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><a href="https://towardsdatascience.com/illustrated-guide-to-recurrent-neural-networks-79e5eb8049c9">Illustrated Guide to Recurrent Neural Networks</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a>&#160;<a href="#fnref1:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p><a href="https://towardsdatascience.com/illustrated-guide-to-lstms-and-gru-s-a-step-by-step-explanation-44e9eb85bf21">Illustrated Guide to LSTM’s and GRU’s: A step by step explanation</a>&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content></item><item><title>Elasticsearch 中文斷詞處理</title><link>https://blog.sappy.tw/posts/%E5%BE%8C%E7%AB%AF/elasticsearch/elasticsearch%E4%B8%AD%E6%96%87%E8%99%95%E7%90%86/</link><pubDate>Sat, 18 Jul 2020 13:55:38 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E5%BE%8C%E7%AB%AF/elasticsearch/elasticsearch%E4%B8%AD%E6%96%87%E8%99%95%E7%90%86/</guid><description>目的 解決 elasticsearch 中，中文斷詞預設是 character-base 的斷詞方式 例如 今天天氣很好 應該要斷成 今天 天氣 很 好，而不是 elasticsearch 中的 今 天 天 氣 很 好 解法 中文斷詞目前最好的應該還是中研院</description><content type="html"><![CDATA[<h1 id="目的">目的</h1>
<p>解決 elasticsearch 中，中文斷詞預設是 character-base 的斷詞方式<br>
例如 <code>今天天氣很好</code> 應該要斷成 <code>今天 天氣 很 好</code>，而不是 elasticsearch 中的 <code>今 天 天 氣 很 好</code></p>
<h1 id="解法">解法</h1>
<p>中文斷詞目前最好的應該還是中研院的 <a href="https://github.com/ckiplab/ckiptagger">CKIPTagger</a> ，我們是自行斷完詞之後再用 elastic search 的 space 斷詞塞進去資料庫<br>
中研院的斷詞器 CKIPtagger，是中研院第二版的斷詞器，主要是用類神經網路做，或者可以跟他們申請第一版的斷詞器，第一版主要是使用傳統斷詞方法<br>
目前我們是自行撰寫一支 Python 程式來用 CKIPtagger 做斷詞，斷好的結果再放在 Document 中 POST 到 Elasticsearch，選擇這樣做是因為做起來比較靈活，可以自由修改處理過程，也不用擔心改版的時候 plugin 不能用<br>
為了之後能繼續存取原始資料來做分析或其他用途，我們是存成兩份資料，一份原始資料，一份是斷詞斷完的資料<br>
大概長得像下面這樣</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;origin&#34;</span><span class="p">:</span> <span class="s2">&#34;今天天氣很好&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;token&#34;</span><span class="p">:</span> <span class="s2">&#34;今天 天氣 很 好&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div>]]></content></item><item><title>社群網路筆記 CASCADING BEHAVIOR IN NETWORKS</title><link>https://blog.sappy.tw/posts/%E5%A4%A7%E5%AD%B8%E5%AD%B8%E7%BF%92/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF_%E5%BE%AE%E8%A7%80%E5%82%B3%E6%92%AD/</link><pubDate>Sun, 31 May 2020 11:59:37 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E5%A4%A7%E5%AD%B8%E5%AD%B8%E7%BF%92/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF_%E5%BE%AE%E8%A7%80%E5%82%B3%E6%92%AD/</guid><description>網路中的擴散 Diffusion in networks 跟考慮整個人群比起來，考慮細粒度的傳播，就是跟考慮整體決定比起來，通常會比較關注身旁的人的所下的決定 考慮在 graph 中的擴散 也稱為</description><content type="html"><![CDATA[<h1 id="網路中的擴散-diffusion-in-networks">網路中的擴散 Diffusion in networks</h1>
<ol>
<li>跟考慮整個人群比起來，考慮細粒度的傳播，就是跟考慮整體決定比起來，通常會比較關注身旁的人的所下的決定</li>
<li>考慮在 graph 中的擴散</li>
<li>也稱為 diffusion of innovations</li>
</ol>
<p>人們模仿鄰居的原因有兩個</p>
<ol>
<li>Informational effects - 發現鄰居做了 A 行為後得到好處，每個人的收益都不受他人影響，目前研究結論有
<ol>
<li>創新，缺乏了解，使採用它具有風險</li>
<li>能獲得很高的利益，所以人們才採用</li>
<li>越早採用的人，社經地位通常越高，交友程度通常越多</li>
<li>是否採納通常藉由觀察鄰居決定</li>
<li>無 direct benefit effect</li>
</ol>
</li>
<li>Direct-benefit effects - 發現鄰居做了 A 行為後得到好處，且越多人做收益越大，具有以下特性
<ol>
<li>吸引人的兩大原因
<ol>
<li>專家採用</li>
<li>大多數人採用</li>
</ol>
</li>
<li>可以傳播開的原因
<ol>
<li>Complexity - 不太複雜</li>
<li>Observability - 很容易觀察到好處</li>
<li>Trialability - 試用風險小</li>
<li>符合社會的習慣</li>
</ol>
</li>
</ol>
</li>
</ol>
<h1 id="diffusion-through-a-network-的模型">diffusion through a network 的模型</h1>
<ol>
<li>用傳染病模型模擬</li>
<li>用 direct benefit effect 模型模擬，這裡使用這個模型，特色有
<ol>
<li>越多人採用，收益越高</li>
<li>出於自身利益，當足夠多鄰居採用時才應該採用</li>
</ol>
</li>
</ol>
<h2 id="direct-benefit-effect">direct benefit effect</h2>
<ol>
<li>跟所有鄰居玩 coordination game
<img src="https://images.sappy.tw/Social_Network/%E5%BE%AE%E8%A7%80%E5%82%B3%E6%92%AD/coordination.jpg" alt="coordination"></li>
<li>點 v 的 payoff 是跟所有鄰居玩 coordination game 的和，v 也是基於和來做決策</li>
<li>p 是 v 的鄰居中採用 A 的比例， d 是鄰居數量， a b 則是不同 coordination game 選擇的 payoff
當 node v 採用 A 時 $pda\geq(1-p)db$，否則採用 B 就是 $pda\leq(1-p)db$
可變成 $p\geq\frac{b}{a+b}$，定義 $q=\frac{b}{a+b}$</li>
</ol>
<h2 id="實驗">實驗</h2>
<ol>
<li>假設 B 是舊的策略，A是新東西</li>
<li>一開始有些人會開始採用 A</li>
<li>其他人會開始慢慢轉變成 A</li>
</ol>
<p>TODO proof 過程中 只會從 B 變成 A，A不會變回 B</p>
<p>問題</p>
<ol>
<li>所有人都會變成 A (complete cascade)</li>
<li>如果不是，那不變成 A 的原因是什麼</li>
</ol>
<p>新思想很難傳播進 tightly-knit 的社群 (內部連接緊密，外部連接稀疏)</p>
<ul>
<li>現實中像是以下原因都會造成 tightly-knit 的社群
<ul>
<li>不同年齡層</li>
<li>不同生活習慣</li>
</ul>
</li>
</ul>
<p>繼續傳播的策略</p>
<ol>
<li>提高 A 的質量， 讓 q 門檻下降，像是 a 從 3-&gt;4，q就會從 2/5 -&gt; 1/3</li>
<li>讓 tightly-knit 的社群 內部有些節點開始轉換
<ol>
<li>衍伸出新問題，要怎麼選那些點轉換</li>
</ol>
</li>
</ol>
<h2 id="把-tightly-knit-用數學定義表示">把 tightly-knit 用數學定義表示</h2>
<p>cascade 可以傳播多遠，取決於</p>
<ol>
<li>新技術的優點</li>
<li>社群連接的緊密程度</li>
</ol>
<h3 id="定義-cluster">定義 cluster</h3>
<ul>
<li>a cluster of density p ， 就是一組(set) node，每個 node 至少有 p 比例的鄰居在這個 set 當中</li>
<li>網路中可同時存在多個規模的 Clusters</li>
<li>缺點是
<ol>
<li>p =1 的定義不好，因為所有點都在內的話也滿足 p =1 的定義</li>
<li>即便兩個 p cluster 沒有連接，但兩個在一起也滿足定義</li>
</ol>
</li>
</ul>
<h3 id="宣稱">宣稱</h3>
<ol>
<li>remaining network 就是不包含初始點的點的集和</li>
<li>若初始點採用 A，且轉換門檻為 threshold q，則
<ol>
<li>如 remaining network 包含 1-q 的 cluster，就不會是 complete cascade</li>
<li>如果不會是 complete cascade，則remaining network 一定有包含 1-q 的 cluster</li>
<li>1-q &lt;=&gt; complete cascade</li>
</ol>
</li>
</ol>
<h3 id="證明">證明</h3>
<h4 id="如-remaining-network-包含-1-q-的-cluster就不會是-complete-cascade">如 remaining network 包含 1-q 的 cluster，就不會是 complete cascade</h4>
<p>proof 1-q 的 cluster 是 complete cascade 的阻礙
反證法
假設有個大於 1-q 的 cluster
有個 node v 在其中，且是第一個變成 A 的 node
因 v 在 大於1-q cluster　中，所以外面最多也就 小於 q 比例的 node，因此最多也就 小於 q 比例的 node 採用 A，因此 v 不可能轉變成 A</p>
<h4 id="如果不會是-complete-cascade則remaining-network-一定有包含-1-q-的-cluster">如果不會是 complete cascade，則remaining network 一定有包含 1-q 的 cluster</h4>
<p>proof 1-q 的 cluster 是 complete cascade 的唯一阻礙
假設 S 是最後依然不轉變的 cluster
要證明 沒有轉換的 S 的 density 比 1-q 大</p>
<p>假設 w 在 S 中，不會轉變，因為她的鄰居最多也就 小於 q 會採用 A
而 w 有 1-比例的鄰居採用 B，且都在 S 中
因此，就定義而言， S 就是有 1-q density 的 cluster</p>
<h1 id="實驗結論">實驗結論</h1>
<p>從接收到消息跟實際採用會需要一段時間<br>
門檻低的消息容易傳送， weak ties 也比較容易傳播門檻低的消息</p>
<h1 id="每個-node-都有自己的-a-b">每個 node 都有自己的 a b</h1>
<p>跟之前類似，不過要分開考慮<br>
blocking cluster ，就是跟之前的 1-q density 類似，只是條件是每個在裡面的 node v 的 $1-q_v$ 比例的鄰居也在 blocking cluster 內</p>
]]></content></item><item><title>社群網路筆記 power law &amp; rich get richer</title><link>https://blog.sappy.tw/posts/%E5%A4%A7%E5%AD%B8%E5%AD%B8%E7%BF%92/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF_power_law/</link><pubDate>Sat, 30 May 2020 21:40:37 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E5%A4%A7%E5%AD%B8%E5%AD%B8%E7%BF%92/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF_power_law/</guid><description>基本性質 Behavior 互相影響，而不是獨立事件 popularity 非常不平衡，高的很高，低的很低 檢驗分散程度是否是 normally distributed 實驗證明，發現不是，因 normal 會假設都是 independe</description><content type="html"><![CDATA[<h1 id="基本性質">基本性質</h1>
<ul>
<li>Behavior 互相影響，而不是獨立事件</li>
<li>popularity 非常不平衡，高的很高，低的很低</li>
</ul>
<h1 id="檢驗分散程度是否是-normally-distributed">檢驗分散程度是否是 normally distributed</h1>
<p>實驗證明，發現不是，因 normal 會假設都是 independency，但這裡不是</p>
<h1 id="power-law">power law</h1>
<p>呈現多項式 $f(k)=\frac{a}{k^c}$</p>
<h2 id="驗證是否為-power-law">驗證是否為 power law</h2>
<p>畫出取 log 的結果，看是不是直線<br>
$\log f(k)=\log a - c \log k$<br>
此時 -c 是斜率， loga 是跟 y 的交點<br>
<img src="https://images.sappy.tw/Social_Network/powerlaw/powerlaw.png" alt="powerlaw"></p>
<h1 id="rich-get-richer-model">rich-get-richer model</h1>
<h2 id="模擬實驗">模擬實驗</h2>
<ul>
<li>
<p>decision 不是完全無關</p>
<ul>
<li>information cascade 會影響</li>
<li>network effect 也會影響</li>
</ul>
</li>
<li>
<p>pages 是順序生成的，由 page1 page2 &hellip; pageN</p>
</li>
<li>
<p>每個 page 只連到一個 page (也可擴充成連到多個 page)</p>
<ul>
<li>當 page j 生成時，有 p 的機率連到前面生成的其中一個 page i</li>
<li>當 page j 生成時，有 1-p 的機率連到前面生成的其中一個 page i 所連到的 page h
<ul>
<li>等效於 page h inlink 數量 越大，被連到的機率越高</li>
<li>$V_h $= page h inlink 的數量，N 是所有 inlink 的總和</li>
<li>page h 被選到的機率為 $\frac{V_h}{N}$</li>
</ul>
</li>
</ul>
</li>
<li>
<p>1-p 越大，越不平衡</p>
</li>
</ul>
<h2 id="歷史重來每次暢銷的東西都不相同">歷史重來，每次暢銷的東西都不相同</h2>
<p>會</p>
<h2 id="preferential-attachment-vs-information-cascade">preferential attachment vs information cascade</h2>
<ul>
<li>相同點
<ul>
<li>兩者都有模仿</li>
</ul>
</li>
<li>不同點
<ul>
<li>copy 讓人有比較多選項，IC 只能選擇接受或拒絕</li>
<li>copy 只參考一個人決定，IC 是參考所有人決定</li>
<li>copy 是盲目 copy，IC 是理性決策</li>
</ul>
</li>
</ul>
<h1 id="search-tools-跟推薦系統">Search Tools 跟推薦系統</h1>
<ol>
<li>大者越大，也叫做 scale free effect</li>
<li>探索讓 rich get richer 效應下降</li>
</ol>
<h1 id="附註">附註</h1>
<ul>
<li>不是所有東西都能 copy，1-p 在城市中，等於人越多生越多</li>
</ul>
<h1 id="analysis-of-rich-get-richer">Analysis of Rich-Get-Richer</h1>
<p>將 random variable 換成期望值
t+1 時增加的量
$\frac{dx_j(t)}{dt}=\frac{p}{t}+\frac{(1-p)x_j(t)}{t}$<br>
<img src="https://images.sappy.tw/Social_Network/powerlaw/diff.png" alt="diff"></p>
]]></content></item><item><title>社群網路筆記 network effect</title><link>https://blog.sappy.tw/posts/%E5%A4%A7%E5%AD%B8%E5%AD%B8%E7%BF%92/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF_network_effect/</link><pubDate>Wed, 20 May 2020 22:13:27 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E5%A4%A7%E5%AD%B8%E5%AD%B8%E7%BF%92/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF_network_effect/</guid><description>Direct benefit effect OR Network effect INformation Cascade 中影響人們決策的原因有兩個 Information effect - 只影響考慮過程，不影響行動後獲得的利益 Direct benefit effect 或是 Network effect - 除了影響考慮的過程，更影響行動後獲得的</description><content type="html"><![CDATA[<h1 id="direct-benefit-effect-or-network-effect">Direct benefit effect OR Network effect</h1>
<p>INformation Cascade 中影響人們決策的原因有兩個</p>
<ol>
<li>Information effect - 只影響考慮過程，不影響行動後獲得的利益</li>
<li>Direct benefit effect 或是 Network effect - 除了影響考慮的過程，更影響行動後獲得的利益</li>
</ol>
<ul>
<li>Network effect 是外部因素(externalities)，可以是正或者是負的</li>
<li>Network effect 會影響別人的 welfare(payoff)，但不是直接影響(uncompensated)，而是間接影響
<ul>
<li>直接影響就是你買東西別人不會給你錢</li>
<li>間接影響就是越多人用這東西對你價值越高，例如社群網路</li>
</ul>
</li>
<li>本章節的 welfare 是看使用者的數量</li>
</ul>
<h1 id="the-economy-without-network-effects">The economy without network effects</h1>
<p>先討論不具有 network effect 的商品，再來討論具有 network effect 的商品</p>
<ol>
<li>
<p>假設這是個很大的市場，裡面有很多小的 consumer 跟 producter，每個對市場的影響都很小(價格不會波動)</p>
</li>
<li>
<p>用 0~1 的實數代表無限多的 consumer(好處是能很方便回答 0~x 有 x 人)</p>
</li>
<li>
<p>每個 consumer 只要一個商品</p>
</li>
<li>
<p>每個 consumer 都有其 Intrinsic interest(偏好)</p>
<ol>
<li>Reservation price - 量化的 intrinsic interest</li>
<li>consumer 的 Reservation price 由高到低排下來，及 consumer 0 的 reservation price 是最高的</li>
<li>用 function r 代表 reservation，r(0) 代表 consumer 0 的 reservation price
<ol>
<li>由 4-2 可知 r(0) &gt; r(0.1) &gt; r(0.5) &gt; r(1)</li>
<li>r 是嚴格遞減，即沒有一樣的 reservation price</li>
<li>r 稱為 inverse demand function</li>
<li>r 的反函數 $r^{-1}$ 稱為 demand function</li>
<li><img src="https://images.sappy.tw/Social_Network/Network_Effect/Demand_function.jpg" alt="demand function"></li>
</ol>
</li>
</ol>
</li>
<li>
<p>p 代表商品的價格， p 是固定值</p>
<ol>
<li>r(x) &gt; p 就會買</li>
<li>如果 p &gt; r(0)，就沒人買，因 r(0) 是最大的 reservation price</li>
<li>如 p &lt; (1)，則所有人都會買，因 r(1) 是最小的 reservation price</li>
</ol>
</li>
<li>
<p>p* 是固定的生產成本</p>
<ol>
<li>每個 producer 只會賣出 p*</li>
<li>因為在很多 producer 競爭情況下，利益會被拉到幾乎為 0</li>
<li>producer 也不可能貼錢賣</li>
<li>因此 producer 只能賣 p*</li>
</ol>
</li>
</ol>
<h2 id="equillibrium-quantity">Equillibrium quantity</h2>
<p>有一 x* 使 r(x*) = p*，就稱呼 x* 為 equilibrium quantity<br>
<img src="https://images.sappy.tw/Social_Network/Network_Effect/equilibrium_quantity.png" alt="equilibrium_quantity"></p>
<h2 id="social-optimal">Social optimal</h2>
<p>使 每個人的 welfare 加起來最大，就是 social optimal<br>
在不考慮 network effect 的情況下，小於 x* 就買，大於 x* 就不買，就能達到 Social optimal</p>
<p>每個人的 welfare 是 $如 x 買的話 w(x)=r(x)-p^* ，不然 w(x) = 0$<br>
social welfare 是 $\int_0^1w(x)dx$，當此值最大時，就是 social welfare</p>
<h1 id="economy-with-network-effects">economy with network effects</h1>
<p>當 z% 的總人口使用商品時，獲得 f(z) 的效益，z 是已知的數字，且假設 f(z) = 0<br>
因此 reservation price 變成 r(x)f(z)<br>
為了簡化分析，進一步假設 r(1) = 0<br>
<img src="https://images.sappy.tw/Social_Network/Network_Effect/network_effect.jpg" alt="network_effect"></p>
<p>假設商品價值為 p*，那當 r(x)f(z) &gt; p* 時，消費者就會購買</p>
<h2 id="self-fulling-expectations-equilibrium">self fulling expectations equilibrium</h2>
<p>如果群體有共同期望，那那個期望就會自動成真，很像是 消費者對產品的信心 的總和<br>
例如大家都認為台GG股票價值 100，那台GG的股票價值就會往 100 靠近，直到變成 100<br>
例如大家都認為有 z 人會使用產品，那使用人數就會往 z 靠近，直到變成 z</p>
<ul>
<li>
<p>z = 0 是 self fulfilled，因為f(x) = 0，所以 r(x)f(x) = 0，因此就沒人會買</p>
</li>
<li>
<p>當 z 在 0~1 之間，</p>
<ul>
<li>r(x*)f(z) = p*</li>
<li>此時會買的人 x 在 0 &lt; x &lt; x*，當 x* 為 z 時，會是 self fulfilled</li>
<li>所以 p* = r(z)f(z)</li>
<li><img src="https://images.sappy.tw/Social_Network/Network_Effect/network_effect_example.jpg" alt="network_effect_example"></li>
<li>當 p* 移動時， z&rsquo; z&rsquo;&rsquo; 也會跟著移動</li>
</ul>
</li>
<li>
<p>當 z 不在 0 z&rsquo; z&rsquo;&rsquo; 上時</p>
<ul>
<li>0 &lt; z &lt; z&rsquo;， z 會 往 0 移動 (下降)</li>
<li>z&rsquo; &lt; z &lt; z&rsquo;&rsquo; ， z 會往 z&rsquo;&rsquo; 移動 (上升)</li>
<li>z &gt; z&rsquo;&rsquo;，  z 會往 z&rsquo;&rsquo; 移動 (下降)</li>
</ul>
</li>
<li>
<p>z&rsquo; 是 unstable ，也就是創業門檻，過了門檻之後就會遠離 z&rsquo;，直奔 z&rsquo;&rsquo; ， 在 z&rsquo; 附近會遠離 z'</p>
</li>
<li>
<p>z&rsquo;&rsquo; 是 stable ，也可說是市占率，在 z&rsquo;&rsquo; 附近會往 z&rsquo;&rsquo; 靠</p>
</li>
<li>
<p>降低 p* 可以使 z&rsquo; 降低，增加 z''</p>
</li>
</ul>
<h3 id="不知道-z-的情況下作分析---gz">不知道 z 的情況下作分析 - g(z)</h3>
<ul>
<li>假設大家有共識 z</li>
<li>願意買的人在 0 ~ $\hat{z}$ 中間， $\hat{z} 是購買意願最低的人$，及 $[0,\hat{z}]$</li>
<li>推導
<ul>
<li>$r(\hat{z})f(z)=p^*$</li>
<li>$r(\hat{z})=\frac{p^*}{f(z)}$</li>
<li>$\hat{z}=r^{-1}(\frac{p^*}{f(z)})$</li>
<li>定義 g(z)，輸入 z 時映射到真正會買的人數 $\hat{z}$，所以 g(z) 為
<ul>
<li>如 $\frac{p^<em>}{f(z)}&lt;=r(0)，g(z)=\hat{z}=r^{-1}(\frac{p^</em>}{f(z)})$</li>
<li>除此之外(p* 太大的情況下)， g(z) = 0</li>
</ul>
</li>
</ul>
</li>
<li><img src="https://images.sappy.tw/Social_Network/Network_Effect/g_example.jpg" alt="g_example"></li>
</ul>
<h3 id="dynamic-behavior---隨時間改變的行為">dynamic behavior - 隨時間改變的行為</h3>
<p>把交易改成參與社群網路或不參與 - 比交易更動態</p>
<p>z 會隨時間改變，時間是離散的 t = 0 1 2 3 &hellip;<br>
當 t=0 時， 會有 $z_0$ 參與</p>
<p>$z_t=g(z_{t-1})$，因為 g 是把預計購買人映射到實際購買人的函數，而 t=t-1階段的實際購買人，會是t=t階段的預計購買人<br>
<img src="https://images.sappy.tw/Social_Network/Network_Effect/dynamic_g_example.jpg" alt="dynamic_g_example"></p>
<h1 id="實際產品分析">實際產品分析</h1>
<ul>
<li>
<p>如果 p* 很大，那 z&rsquo; 就會很大，因此幾乎不會有東西賣出去</p>
</li>
<li>
<p>降低 p*，讓 z; 近乎於 0，這樣更容易跨過 z&rsquo;，且 z&rsquo;&lsquo;也更大</p>
</li>
<li>
<p>社群屬性的產品創業要成功，就要跨過 z&rsquo;(tipping point z&rsquo;)</p>
</li>
<li>
<p>一開始小量投入是無法做起來的，因為很難跨過 z'</p>
</li>
<li>
<p>所以一開始就要燒錢(賠本賣等等)來跨過 z&rsquo;，之後把價格漲到能賺錢的地步</p>
</li>
<li>
<p>或是用 fashion leader 來打響知名度(見 ch19)</p>
</li>
<li>
<p>很多時候，產品成不成功是看誰先跨過 tipping point z&rsquo;，而不是誰品質比較好</p>
</li>
</ul>
<h2 id="social-optimality-with-network-effect">Social optimality with network effect</h2>
<p>之前我們說， 沒有 network effect 時 ，z* 之前的顧客買就是 social optimality<br>
但是，有 network effect 就不一定是這樣，因為如果強迫 [z*,z*+c) 的人去購買，雖然 [z*,z*+c) 這段會讓 social welfare 下降，但是因為 z*+c 這段會讓整體 network effect 上升，因此上升的可能比下降還多，因此可能會賺更多</p>
<p>$r(x)f(z^<em>)-p^</em> &lt; r(x)f(z^<em>+c)-p^</em>$ - 這是單個顧客，要做積分才是 social welfare</p>
<h1 id="mixing-individual-effect-with-population-level-effect">Mixing individual effect with population-level effect</h1>
<p>有些多合一機器，除了 social effect 的功能之外，還有其他能獨立使用的功能，因此 social effect 為 0 時，整體的 Reservation price 不是 0<br>
例如傳真機可以掃描文件等等</p>
<ul>
<li>$f(z) = 1+ az^2$，1 就是附加價值，讓 reservation price 在 z=0 時不為 0</li>
<li>$r(x) = 1-x $</li>
<li>$如 $r(0)&gt;=\frac{p^<em>}{f(z)}，則 g(z)=r^{-1}(\frac{p^</em>}{f(z)})$，否則 $g(z)=0$</li>
<li>$g(z) = 1-\frac{p^*}{1+az^2}$</li>
</ul>
<p><img src="https://images.sappy.tw/Social_Network/Network_Effect/mixing_example.jpg" alt="mixing_example"></p>
]]></content></item><item><title>社群網路筆記 power &amp; bargaining</title><link>https://blog.sappy.tw/posts/%E5%A4%A7%E5%AD%B8%E5%AD%B8%E7%BF%92/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF_bargaining/</link><pubDate>Thu, 07 May 2020 21:40:37 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E5%A4%A7%E5%AD%B8%E5%AD%B8%E7%BF%92/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF_bargaining/</guid><description>社群網路筆記 power &amp;amp; bargaining Power - 影響力 個人屬性、在網路中的位置，等等都會造成影響力 有些研究者認為影響力是相對的，而不是絕對的 Network Exchange theory Social exchange edge 上的 value 怎麼分配</description><content type="html"><![CDATA[<h1 id="社群網路筆記-power--bargaining">社群網路筆記 power &amp; bargaining</h1>
<h1 id="power---影響力">Power - 影響力</h1>
<p>個人屬性、在網路中的位置，等等都會造成影響力<br>
有些研究者認為影響力是相對的，而不是絕對的</p>
<h1 id="network-exchange-theory">Network Exchange theory</h1>
<h2 id="social-exchange">Social exchange</h2>
<p>edge 上的 value 怎麼分配給兩個 node<br>
而此時 social exchange 的不平均程度則反映了 power 的相對程度</p>
<p>探討位置造成分配不均的問題就是 network exchange theory</p>
<h2 id="造成分配不均的原因">造成分配不均的原因</h2>
<p>如 B &gt; A，則有可能是因為</p>
<ul>
<li>Dependence - A 依賴 B</li>
<li>Exclusion - B 有能力排除 A</li>
<li>Satiation - A 要給 B 更多資源才能使 B 滿意</li>
<li>Betweenness - A 到其他點的最短路徑會包含 B(但是也有 Betweenness 越大， power 越小的反例)</li>
</ul>
<h2 id="one-exchange-rule">one-exchange rule</h2>
<p>同一個 Node 只能跟鄰近的 一點 來分 Value (跟 matching 有點像)<br>
如 A-B 且 A-C，則 A 只能跟 B 或 C 分 Value</p>
<h2 id="實驗的一些術語">實驗的一些術語</h2>
<ul>
<li>High-information - 能看到所有人的交談結果</li>
<li>Low-information  - 只能看到自己周圍的人的交談結果</li>
</ul>
<h2 id="實驗結果">實驗結果</h2>
<ul>
<li>Two node path
<ul>
<li>A-B</li>
<li>50%-50%</li>
</ul>
</li>
<li>Three node path
<ul>
<li>A-B-C</li>
<li>(1/6)-(5/6)-0 or 0-(5/6)-(1/6)</li>
</ul>
</li>
<li>Four node path
<ul>
<li>A-B-C-D</li>
<li>B C 大約能站 7/12 ~ 2/3</li>
</ul>
</li>
<li>Five node path
<ul>
<li>A-B-C-D-E</li>
<li>C 只比 A E  好一些</li>
</ul>
</li>
<li><img src="https://images.sappy.tw/Social_Network/bargaining/Fig12-1.png" alt="fig12-1">
<ul>
<li>D 不會跟 B 連，D 跟 E 大概五五分</li>
</ul>
</li>
<li><img src="https://images.sappy.tw/Social_Network/bargaining/Fig12-3.png" alt="fig12-3">
<ul>
<li>D C 五五分，B 比 4 node 的 B 稍大一點</li>
</ul>
</li>
<li><img src="https://images.sappy.tw/Social_Network/bargaining/Fig12-4.png" alt="fig12-4">
<ul>
<li>unstable network or unpredictable outcome</li>
<li>永遠都不會停</li>
</ul>
</li>
</ul>
<h1 id="跟-buyer-seller-network-做連結">跟 buyer-seller-network 做連結</h1>
<p>把一條 path 轉成左右左右<br>
但是限制很多</p>
<ol>
<li>node 要是偶數</li>
<li>不是任何結構都能轉成 bipartite，而且這只是數學表達方式相同而已</li>
</ol>
<h1 id="建立數學模型">建立數學模型</h1>
<h2 id="nash-bargaining-solution">Nash bargaining solution</h2>
<p><img src="https://images.sappy.tw/Social_Network/bargaining/nash-bargaining.png" alt="nash bargaining"></p>
<p>如談判失敗，A 拿到 x，B 拿到 y<br>
如 x+y &gt; 1，因為拿到 outside value 會使 A B 拿到最大利益，則 A B 永遠不會考慮協商<br>
所以如果能談派的話，surplus(剩餘價值 s) = 1-x-y &gt;= 0<br>
且談判技巧相當的話，A B 將會平分剩餘價值 s<br>
因此
A 的 outcome 是 $A=x+s/2=(x+1-y)/2$<br>
B 的 outcome 是 $B=y+s/2=(y+1-x)/2$</p>
<p>equi-dependent outcome - 互相依賴</p>
<p>如果 outside option 越大，則拿得越多</p>
<p>inflate  - 虛張聲勢，使人高估
deflate - 使人低估</p>
<h2 id="the-ultimatum-game---最後通牒">The ultimatum game - 最後通牒</h2>
<p>A 提出分法，B只能選擇接受或拒絕，如果接受就成交，不接受就談判破裂，雙方都不會獲得任何東西</p>
<p>在完全理性的情況下，A 會提出 A 0.99，B 0.01 這樣的分法<br>
但實際實驗，A通常只拿 1/2 ~ 2/3，因為要考慮情緒</p>
<h1 id="outcome">outcome</h1>
<p>outcome 包含兩件事情</p>
<ol>
<li>哪兩個 node 分</li>
<li>value 怎麼分</li>
</ol>
<h2 id="stable">stable</h2>
<p>stable 定義: 當沒有任何 node X 能提出 offer 使 x y 都獲得更好的 outcome<br>
當滿足 stable 時，不在 match 中的 edge，其兩端的 node 的 outcome 相加要大於 1，如果小於 1 ，代表該還有多的 value 可以分給兩端的 node
<img src="https://images.sappy.tw/Social_Network/bargaining/stable.png" alt="stable"><br>
擅長找到分配極端不均的情況<br>
實際實驗中， 1/6 5/6 就算是極端不平均了</p>
<p>三角形網路不會有 stable outcome</p>
<p>缺點是 stable 網路有很多可能
例如四個點的，可以 (1/2)-(1/2) 或 (1/3)-(2/3) 分，但是均分那個比較不合理(因 B 是優勢位置，應該會拿到更多才對)</p>
<h2 id="balanced-outcome">balanced outcome</h2>
<p>考慮 用 outside options 來擴充 nash bargaining solution，變成 balanced outcome
B 的 outcome 是 1 - C 的 value = 1- 1/2 = 1/2
<img src="https://images.sappy.tw/Social_Network/bargaining/balanced.png" alt="balanced"></p>
<ul>
<li>balanced 是 stable 的子集合，即是 balance 則一定是 stable</li>
<li>如 B 同時跟 A B C D 連結，則 B 的 outside solution　是　max(1-C, 1-D, 1-E)</li>
</ul>
<h2 id="其他研究">其他研究</h2>
<ul>
<li>stable 跟 blanace 可以用 cooperative game 表示
<ul>
<li>stable 可以用 core solution 表示</li>
<li>balance 可以用 kernel solution 表示</li>
</ul>
</li>
<li>equiresistance - 其他可解釋 outcome 的理論</li>
</ul>
<h1 id="dynamic-game-在特定情況下跟-bargaining-solution-一致">Dynamic Game 在特定情況下跟 bargaining solution 一致</h1>
<ul>
<li>finite-horizon problem - 時間有限，由後往前推論</li>
<li>infinite-horizon problem - 時間無限，由前往後推論</li>
</ul>
<h2 id="infinite-horizon">infinite-horizon</h2>
<p>第一輪 A 出價，B決定要接收或拒絕<br>
第二輪換 B 出價，A 決定接受或拒絕<br>
為了避免無限進行，引入 breakdown probability p ，每輪結束後有 p 的機率會直接結束 game</p>
<ul>
<li>因為可以計算，所以通常第一輪 A 的提議就會被接受</li>
<li>如果 p 很小，造成結束的原因是因為達成協議</li>
<li>這裡只考慮一個 edge 兩個 node</li>
<li>多個 node 還是研究的議題</li>
</ul>
<h2 id="分析-finite-horizon-problem">分析 finite-horizon problem</h2>
<p>只做兩輪的情況</p>
<h3 id="round-2b-提-offer">Round 2(B 提 offer)</h3>
<p>B 只要給 A x(A 的 outside value) 就好，因為 A 不接受，遊戲就直接結束，A 也只能拿到 x<br>
因此 B 可以留下 1 - x</p>
<h3 id="round-1a-提-offer">Round 1(A 提 offer)</h3>
<p>A 計算 B 的期望值是 $z=py+(1-p)(1-x)$， $py$ 是第一輪就 breakdown 的狀況， (1-p)(1-x) 是沒有 breakdown 的情況<br>
因此 A 只要給 B z 就好，A 留下 1-z， 1-z &gt; x</p>
<p>B 的 payoff 是 $z=py+(1-p)(1-x)$，</p>
<ul>
<li>當 p 趨近 1，對 A 有利，</li>
<li>當 p 趨近 0， A 拿走的量很接近 A 的 outside option</li>
<li>當 p = 0.5 則 接近 Nash bargaining outcome</li>
</ul>
<h2 id="infinite-horizon-problem">infinite-horizon problem</h2>
<ul>
<li>stationary strategies - 假設策略不隨時間改變</li>
<li>stationary strategies 達成的平衡稱為 stationary equilibria</li>
</ul>
<p>A 提出 $(a_1,b_1)$，B 只會在 $b_1&gt;=z_B 時接受$<br>
B 提出 $(a_2,b_2)$，A 只會在 $a_2&gt;=z_A 時接受$</p>
<p>by 之前 Round 1 的分析，且 $(1-z_A) = b_2$ ，可知
$b_1 = z_B = py+(1-p)(1-z_A) = py+(1-p)b_2$
相對的<br>
$a_2 = z_A = px+(1-p)(1-z_B) = py+(1-p)a_1$</p>
<p>因此可得
$a_1=\dfrac{(1-p)x+1-y}{2-p}$<br>
$b_1=\dfrac{(1-p)y+1-x}{2-p}$<br>
B gey payoff 是<br>
$b_1=1-a_1=\dfrac{y+(1-p)(1-x)}{2-p}$</p>
<p>當 p 接近 1 時， $(a_1,b_1) \approx (1-y,y)$<br>
當 p 接近 0 時，game 會持續很久， payoff 是 $(\dfrac{x+1-y}{2} ,\dfrac{y+1-x}{2} )$</p>
]]></content></item><item><title>社群網路筆記 資訊傳播 Information Cascades</title><link>https://blog.sappy.tw/posts/%E5%A4%A7%E5%AD%B8%E5%AD%B8%E7%BF%92/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF_%E8%B3%87%E8%A8%8A%E5%82%B3%E6%92%AD/</link><pubDate>Thu, 07 May 2020 21:40:37 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E5%A4%A7%E5%AD%B8%E5%AD%B8%E7%BF%92/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF_%E8%B3%87%E8%A8%8A%E5%82%B3%E6%92%AD/</guid><description>Information Cascades 簡介 當自身有資訊，且也獲得別人跟你說的資訊時，是要依照自己的資訊做決定還是跟別人一起做 herding 、 information cascade、social contagion - 不依照自己獲</description><content type="html"><![CDATA[<h1 id="information-cascades">Information Cascades</h1>
<h1 id="簡介">簡介</h1>
<p>當自身有資訊，且也獲得別人跟你說的資訊時，是要依照自己的資訊做決定還是跟別人一起做</p>
<ul>
<li>herding 、 information cascade、social contagion - 不依照自己獲得的資訊做決策，而是跟別人一起做
<ul>
<li>不是單純模仿(imitating)</li>
<li>也不是盲從(not mindless)</li>
<li>也不是因為社交壓力(social pressure)</li>
<li>而是經過計算後的決定 !!</li>
<li>人越多，越容易傳播</li>
</ul>
</li>
<li>Information effects - 別人只影響你下決策而已，不影響下完決策後能獲得的利益</li>
<li>Direct benefit effects - 別人除了影響你下決策之外，更會影響下完決策後能獲得的利益
<ul>
<li>例如電話普及之前，越多人使用，你就能跟越多人聯絡，因此越多人用，電話給你的利益越大</li>
</ul>
</li>
</ul>
<h1 id="實驗">實驗</h1>
<h2 id="實驗環境">實驗環境</h2>
<ul>
<li>實驗前告訴每個人，箱子裡的球是 兩藍色一紅色 或 兩紅色一藍色 的機率各半</li>
<li>每個人輪流上台抽球，並告訴大家他覺得箱子裡的球是哪種顏色比較多</li>
<li>每個人都只能看到他自己抽的球</li>
</ul>
<h2 id="推論">推論</h2>
<ol>
<li>第 1 號人，抽到啥顏色就猜主要是啥顏色，例如抽到<code>藍色</code>就猜<code>藍色</code></li>
<li>第 2 號人，
<ol>
<li>如抽到跟 1 號相同，就猜跟 1 號相同的顏色</li>
<li>如果不同，就猜自己抽到的顏色</li>
</ol>
</li>
<li>第 3 號人，
<ol>
<li>如果前兩者一致，說明箱子裡那個顏色的機率比較大，無論自己抽到啥顏色，都會猜跟前兩者一樣的顏色 - information cascade</li>
<li>如前二不一致，猜自己看到的顏色</li>
</ol>
</li>
<li>第 4 號人，
<ol>
<li>他知道第 3 號有可能受到 information cascade，因此只有前兩號資訊是真的，所以 4 的決策資訊跟 3 相同</li>
</ol>
</li>
<li>4 之後都跟 3 一樣</li>
</ol>
<h2 id="結論">結論</h2>
<ul>
<li>information cascade 容易形成 - 只要前兩個顏色相同，後面就會全部都猜一樣的顏色。全錯機率有 1/9</li>
<li>cascade 也是脆弱的，如果中間有兩個人亮出抽到的<code>不一樣顏色球</code>給所有人看，那 cascade 就會被打破，因為有用資訊就變成 兩藍兩紅</li>
<li>但是如果是 direct benefit effect 的 cascade 就很難打破了</li>
</ul>
<h2 id="數學表示">數學表示</h2>
<p>主要是條件機率<br>
$P[主要藍色|抽到甚麼顏色]$ 的機率 大於 1/2 時，就應該猜藍色$</p>
<h3 id="第一人">第一人</h3>
<p>$P[主要藍色|抽到藍色] = \frac{P[主要藍色]<em>P[抽到藍色|主要藍色時]}{P[抽到藍色]} = \frac{\frac{1}{2}</em>\frac{2}{3}}{\frac{1}{2}}=\frac{2}{3}$<br>
<img src="https://images.sappy.tw/Social_Network/%E8%B3%87%E8%A8%8A%E5%82%B3%E6%92%AD/proof1.png" alt="proof1"></p>
<p>其餘類似</p>
<h3 id="第三人">第三人</h3>
<p>$P[主要藍色|抽到藍色 藍色 紅色] = \frac{P[主要藍色]*P[抽到藍色 藍色 紅色|主要藍色時]}{P[抽到藍色 藍色 紅色]} = \frac{ \frac{1}{2} * ( \frac{2}{3}^2 * \frac{1}{3} ) }{\frac{6}{54}}=\frac{2}{3}$<br>
<img src="https://images.sappy.tw/Social_Network/%E8%B3%87%E8%A8%8A%E5%82%B3%E6%92%AD/proof2.png" alt="proof2"></p>
]]></content></item><item><title>Kubernetes 筆記</title><link>https://blog.sappy.tw/posts/%E5%BE%8C%E7%AB%AF/k8s/k8s_1/</link><pubDate>Sat, 02 May 2020 13:55:38 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E5%BE%8C%E7%AB%AF/k8s/k8s_1/</guid><description>安裝 我目前是用 Rancher 來安裝，目前 Rancher 會出現 master cpu 使用率高的 bug(大約 10%)，不過不影響正常使用 rancher kubespray 官方安裝說明 kubeadm kubespray 安裝 kubespray 安裝 kubeadm-kubelet-and-kubectl 這一步的 10.10.* 換成cl</description><content type="html"><![CDATA[<h1 id="安裝">安裝</h1>
<p>我目前是用 Rancher 來安裝，目前 Rancher 會出現 master cpu 使用率高的 bug(大約 10%)，不過不影響正常使用</p>
<ul>
<li><a href="https://rancher.com/">rancher</a></li>
<li><a href="https://github.com/kubernetes-sigs/kubespray">kubespray</a>
<ul>
<li><a href="https://kubernetes.io/docs/setup/production-environment/tools/kubespray/">官方安裝說明</a></li>
</ul>
</li>
<li><a href="https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/">kubeadm</a></li>
</ul>
<h2 id="kubespray">kubespray</h2>
<ol>
<li><a href="https://github.com/kubernetes-sigs/kubespray">安裝 kubespray</a></li>
<li><a href="https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#installing-kubeadm-kubelet-and-kubectl">安裝 kubeadm-kubelet-and-kubectl</a></li>
<li>這一步的 10.10.* 換成cluster 的 ip <code>declare -a IPS=(10.10.1.3 10.10.1.4 10.10.1.5)</code></li>
<li>在 hosts.yaml 設定 ansible_port
<pre tabindex="0"><code>node1:
   ansible_host: 140.114.77.150
   ansible_port: 2222
   ip: 140.114.77.150
   access_ip: 140.114.77.150
</code></pre></li>
<li>最後一行加上大 K，輸入 sudo 密碼<br>
<code>ansible-playbook -i inventory/mycluster/hosts.yaml  --become --become-user=root cluster.yml -K</code></li>
<li>移除 cluster <code>ansible-playbook -i inventory/mycluster/hosts.yaml  --become --become-user=root reset.yml -K</code></li>
</ol>
<h2 id="參考">參考</h2>
<p><img src="https://medium.com/bimap-elk/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8-kubespray-%E5%AE%89%E8%A3%9D-kubernetes-cluster-88c267bdfc3a" alt=""></p>
<h1 id="基本名詞">基本名詞</h1>
<ul>
<li>Node</li>
</ul>
<h1 id="services">Services</h1>
<ul>
<li><a href="https://godleon.github.io/blog/Kubernetes/k8s-Service-Overview/">很清楚的解釋</a></li>
</ul>
<h2 id="名詞">名詞</h2>
<ul>
<li>ClusterIP - K8S 內部才能連到</li>
<li>NodePort - 在每個 pod 運行的 node 上開 port，使外部可以透過 $(node ip):$(port number) 的方式連到 pod 上</li>
<li>Load Balancer - 感覺在 public cloud(GCP AWS &hellip;) 上用處比較大?</li>
<li>ExternalName - 將 內部 Domain name 映射到外部的方法? ()</li>
</ul>
<h2 id="其他有趣的東西">其他有趣的東西</h2>
<ul>
<li><a href="https://rio.io/">rio - 快速部屬 app By Rancher</a></li>
<li><a href="https://rook.io/">rook - 自動部屬分散式系統</a>
<ul>
<li><a href="https://blog.fleeto.us/post/the-ultimate-rook-and-ceph-survival-guide/">Rancher + Rook 安裝</a></li>
</ul>
</li>
</ul>
<h1 id="使用問題">使用問題</h1>
<ul>
<li><a href="https://www.cnblogs.com/mingbai/p/helmerr.html">helm 遇到權限問題</a></li>
<li><a href="https://stackoverflow.com/questions/27435479/pass-net-host-to-docker-build">docker build 網路不通</a>
<ul>
<li>build 加參數 <code>--network=host</code>，變成 <code>docker build . --network=host</code></li>
</ul>
</li>
</ul>
<h1 id="參考資料">參考資料</h1>
<ul>
<li><a href="https://kubernetes.io/docs/home/">官網 英文</a></li>
<li><a href="https://jimmysong.io/kubernetes-handbook/">kubernetes-handbook 中文</a></li>
<li><a href="https://godleon.github.io/blog/">小信豬的原始部落</a></li>
<li>[儲存空間類]
<ul>
<li><a href="https://godleon.github.io/blog/Kubernetes/k8s-PersistentVolume-Overview/"> [Kubernetes] Persistent Volume (Claim) Overview </a></li>
</ul>
</li>
</ul>
]]></content></item><item><title>Kubernetes 筆記 - Knative</title><link>https://blog.sappy.tw/posts/%E5%BE%8C%E7%AB%AF/k8s/k8s_knative/</link><pubDate>Sat, 02 May 2020 13:55:38 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E5%BE%8C%E7%AB%AF/k8s/k8s_knative/</guid><description>kubespray 按照上次安裝 istio 安裝 istioctl https://istio.io/docs/setup/getting-started/ 安裝 istio istioctl install https://istio.io/docs/setup/install/istioctl/ knative metalLB 安裝 https://metallb.universe.tf/installation/ 設定 Layer 2 (網路架構的L2) apiVersion: v1 kind: ConfigMap metadata: namespace: metallb-system name: config data: config: | address-pools: - name: default protocol: layer2 addresses: - 192.168.1.240-192.168.1.250 # 多 ip - 192.168.1.240/32 # 單 ip 當設定成功</description><content type="html"><![CDATA[<h1 id="kubespray">kubespray</h1>
<p>按照上次安裝</p>
<h1 id="istio">istio</h1>
<h2 id="安裝-istioctl">安裝 istioctl</h2>
<p><a href="https://istio.io/docs/setup/getting-started/">https://istio.io/docs/setup/getting-started/</a></p>
<h2 id="安裝-istio">安裝 istio</h2>
<p><code>istioctl install</code>
<a href="https://istio.io/docs/setup/install/istioctl/">https://istio.io/docs/setup/install/istioctl/</a></p>
<h1 id="knative">knative</h1>
<h1 id="metallb">metalLB</h1>
<h2 id="安裝">安裝</h2>
<p><a href="https://metallb.universe.tf/installation/">https://metallb.universe.tf/installation/</a></p>
<h2 id="設定-layer-2-網路架構的l2">設定 Layer 2 (網路架構的L2)</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">ConfigMap</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">namespace</span><span class="p">:</span><span class="w"> </span><span class="l">metallb-system</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">config</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">data</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">config</span><span class="p">:</span><span class="w"> </span><span class="p">|</span><span class="sd">
</span></span></span><span class="line"><span class="cl"><span class="sd">    address-pools:
</span></span></span><span class="line"><span class="cl"><span class="sd">    - name: default
</span></span></span><span class="line"><span class="cl"><span class="sd">      protocol: layer2
</span></span></span><span class="line"><span class="cl"><span class="sd">      addresses:
</span></span></span><span class="line"><span class="cl"><span class="sd">      - 192.168.1.240-192.168.1.250 # 多 ip
</span></span></span><span class="line"><span class="cl"><span class="sd">      - 192.168.1.240/32  # 單 ip
</span></span></span><span class="line"><span class="cl"><span class="sd">      </span><span class="w">    
</span></span></span></code></pre></div><p>當設定成功後輸入 <code>kubectl get service -n istio-system istio-ingressgateway</code>，便能看到EXTERNAL-IP從 PENDING 變成有 ip</p>
]]></content></item><item><title>社群網路筆記 Networks in Their Surrounding Contexts</title><link>https://blog.sappy.tw/posts/%E5%A4%A7%E5%AD%B8%E5%AD%B8%E7%BF%92/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF_network_with_context/</link><pubDate>Fri, 24 Apr 2020 20:23:30 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E5%A4%A7%E5%AD%B8%E5%AD%B8%E7%BF%92/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF_network_with_context/</guid><description>考慮 node 的 meta data，這會影響網路的演變 Homophily - 相似度 相似度越高，越容易相處在一起 要怎麼知道這個因素是否影響圖的連結 用 Homophily test Homophily test 跟純 random 比較，看看這因</description><content type="html"><![CDATA[<p>考慮 node 的 meta data，這會影響網路的演變</p>
<h1 id="homophily---相似度">Homophily - 相似度</h1>
<p>相似度越高，越容易相處在一起</p>
<p>要怎麼知道這個因素是否影響圖的連結<br>
用 Homophily test</p>
<h2 id="homophily-test">Homophily test</h2>
<p>跟純 random 比較，看看這因素是否會影響</p>
<p>假設男性占 p 成，女性佔 q 成 (q = 1-p)
一個 edge 兩端都是男性的機率是 $p^2$，都是女性是 $q^2$ ，一男一女是 $2pq$<br>
如果跨性別的 edge 顯著比 2pq 還少，那就說明是 homophily<br>
如下圖<br>
<img src="https://images.sappy.tw/Social_Network/network_with_context/homophily_test.png" alt="homophily_test.png"></p>
<h1 id="homophily-底下的機制---selection-and-social-influence">homophily 底下的機制 - selection and social influence</h1>
<ul>
<li>selection - 人會選擇有像似特質的做朋友</li>
<li>characteristics - 特質
<ul>
<li>immutable - 不可變，人種</li>
<li>mutable - 可變，興趣</li>
</ul>
</li>
<li>Socialization - 同化現象</li>
</ul>
<h2 id="朋友相似是因認識前就相似還是認識後被同化">朋友相似，是因認識前就相似，還是認識後被同化</h2>
<p>要觀察網路多個時間<br>
longitudinal study - 長時間的研究</p>
<p>假設同個特徵的是朋友，那可能是</p>
<ol>
<li>因這個特徵變朋友</li>
<li>變朋友後被同化</li>
<li>因其他原因變成朋友，但剛好有同樣特徵</li>
</ol>
<h1 id="affiliation">Affiliation</h1>
<p>把 surrounding context (node 的 meta data) 變成網路內部看待<br>
把 meta data 變成 node，稱為 focal point(或是 foci) ，這稱為 affiliation network<br>
<img src="https://images.sappy.tw/Social_Network/network_with_context/affiliation.png" alt="affiliation"></p>
<h2 id="social-affiliation-network">social-affiliation network</h2>
<p><img src="https://images.sappy.tw/Social_Network/network_with_context/social-affiliation.png" alt="social-affiliation"></p>
<p>擴展之前說的 triadic closure，讓他也能在 foci 跟 people 上使用<br>
<img src="https://images.sappy.tw/Social_Network/network_with_context/extend_triadic_closure.PNG" alt="extend_triadic_closure"></p>
]]></content></item><item><title>社群網路筆記 Positive and Negative Relationships</title><link>https://blog.sappy.tw/posts/%E5%A4%A7%E5%AD%B8%E5%AD%B8%E7%BF%92/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF_%E6%AD%A3%E8%B2%A0%E9%97%9C%E4%BF%82/</link><pubDate>Fri, 24 Apr 2020 20:23:30 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E5%A4%A7%E5%AD%B8%E5%AD%B8%E7%BF%92/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF_%E6%AD%A3%E8%B2%A0%E9%97%9C%E4%BF%82/</guid><description>Structurtally balance edge 有正負關係 左邊兩個穩定，右邊兩個不穩定 Structural Banalnce property 如果是 fully connected 的話，過一段時間後會變成穩定狀態 X 跟 Y 內部 edge 都 + 值，但 X-Y 的 edge 都是 - 值 或是只有一個</description><content type="html"><![CDATA[<h1 id="structurtally-balance">Structurtally balance</h1>
<p>edge 有正負關係<br>
左邊兩個穩定，右邊兩個不穩定<br>
<img src="https://images.sappy.tw/Social_Network/%E6%AD%A3%E8%B2%A0%E9%97%9C%E4%BF%82/structurally_balance.png" alt="structurally_balance.png"></p>
<h1 id="structural-banalnce-property">Structural Banalnce property</h1>
<p>如果是 fully connected 的話，過一段時間後會變成穩定狀態
X 跟 Y 內部 edge 都 + 值，但 X-Y 的 edge 都是 - 值<br>
或是只有一個 set，且都是 + 值<br>
<img src="https://images.sappy.tw/Social_Network/%E6%AD%A3%E8%B2%A0%E9%97%9C%E4%BF%82/structurally_balance_network.png" alt="structurally_balance_network.png"></p>
<h1 id="balance-theorem">Balance Theorem</h1>
<p>cluster network = Structural Banalnce property
證明 上述結果 (Structural Banalnce property)<br>
當選一個 A 點出來，用 Structurtally balance 帶進去找 ? 的值，就發現符合理論<br>
<img src="https://images.sappy.tw/Social_Network/%E6%AD%A3%E8%B2%A0%E9%97%9C%E4%BF%82/structurally_balance_network_proof.png" alt="structurally_balance_network_proof.png"></p>
<h2 id="general-版本的-不一定要是-fully-connected">General 版本的 (不一定要是 fully connected)</h2>
<ul>
<li>loop(A 點出發，繞一圈再回到 A 點) 是偶數的 - 值，就稱為 structurally balanced or balanced</li>
<li>clusterable - network 可被分為兩群(two disjoint set)
右邊不是 clusterable<br>
<img src="https://images.sappy.tw/Social_Network/%E6%AD%A3%E8%B2%A0%E9%97%9C%E4%BF%82/clusterable.png" alt="clusterable"></li>
<li>Harary&rsquo;s balance theorem =&gt; : A signed network is balanced = clusterable</li>
</ul>
<p>證明方法</p>
<ol>
<li>證明每個 sub graph 是 balanced</li>
<li>A B 兩點間經過的 edge 會是偶數個負值</li>
<li>就可從上面兩個推出來</li>
</ol>
]]></content></item><item><title>社群網路筆記 Strong and Weak Ties</title><link>https://blog.sappy.tw/posts/%E5%A4%A7%E5%AD%B8%E5%AD%B8%E7%BF%92/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF%E7%AD%86%E8%A8%98_strong_and_weak_ties/</link><pubDate>Fri, 24 Apr 2020 15:23:30 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E5%A4%A7%E5%AD%B8%E5%AD%B8%E7%BF%92/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF%E7%AD%86%E8%A8%98_strong_and_weak_ties/</guid><description>Triadic closure A-B，A-C 認識，則過一段時間後，B-C 很有可能也會互相認識 也有可能跨多點連結，如 D-G Clustering coefficient $三角形/只有兩個邊的三角形$ Bridges - 連結兩個 component 的</description><content type="html"><![CDATA[<ul>
<li>Triadic closure
A-B，A-C 認識，則過一段時間後，B-C 很有可能也會互相認識 <br>
<img src="https://images.sappy.tw/Social_Network/strong_and_weak_ties/triadic_closure.png" alt="triadic_closure"><br>
也有可能跨多點連結，如 D-G<br>
<img src="https://images.sappy.tw/Social_Network/strong_and_weak_ties/long-time.png" alt="long time">
<ul>
<li>Clustering coefficient
<ul>
<li>$三角形/只有兩個邊的三角形$</li>
<li><img src="https://images.sappy.tw/Social_Network/strong_and_weak_ties/coefficient.png" alt="只有兩個邊的三角形"></li>
</ul>
</li>
</ul>
</li>
</ul>
<h1 id="bridges---連結兩個-component-的邊">Bridges - 連結兩個 component 的邊</h1>
<h2 id="bridge">Bridge</h2>
<p>A-B 中間的即是 bridge<br>
<img src="https://images.sappy.tw/Social_Network/strong_and_weak_ties/bridge.png" alt="bridge"></p>
<h2 id="local-bridge">local bridge</h2>
<p>但是 bridge 在社群網路上非常稀少，因此放鬆定義<br>
兩個連線端點上無其他共同的點時，該連線即可稱為 local bridge<br>
A-B 即是 local bridge<br>
<img src="https://images.sappy.tw/Social_Network/strong_and_weak_ties/local-bridge.png" alt="local-bridge"></p>
<h2 id="span">Span</h2>
<p>當把 local bridge 刪除後 兩點的距離<br>
span 一定 &gt;= 3  (因為 local bridge 沒有共同點)</p>
<p>Bridge 類似於 Local bridge + 超大 span</p>
<h1 id="strong-ties-and-weak-ties">Strong ties and weak ties</h1>
<ul>
<li>Strong ties =&gt; 朋友</li>
<li>Weak ties =&gt; 認識的人</li>
</ul>
<h2 id="strong-triadic-closure-property">Strong triadic closure property</h2>
<p>如果 A-B，A-C 都是 strong ties，則 B-C 一定有 ties(strong or weak)<br>
左邊滿足 Strong triadic closure property，右邊不滿足  Strong triadic closure property<br>
<img src="https://images.sappy.tw/Social_Network/strong_and_weak_ties/strong_triadic_closure_property.png" alt="strong_triadic_closure_property.png"></p>
<h2 id="local-bridges-and-weak-ties">Local bridges and weak ties</h2>
<p>如一個 點 A 所在的 graph 滿足 Strong Triadic Closure，有兩個以上的 strong tie，如果有 local bridge 則 local bridge 一定是 weak ties<br>
用反證法來證明　　<br>
假設 A-B 是 local bridge，根據 Strong triadic closure property，B-C 一定有邊，但這違反了 local bridge 的定義<br>
<img src="https://images.sappy.tw/Social_Network/strong_and_weak_ties/Local_bridges_and_weak_ties.png" alt="Local_bridges_and_weak_ties"></p>
<h2 id="clusters">clusters</h2>
<p>大網路內的 clusters 其內部大多是 strong，並透過 weak ties 跟其他 cluster 連接
下面章節會證明</p>
<h1 id="tie-strength-and-network-structure-in-large-scale-data">Tie strength and network structure in large-scale data</h1>
<p>因為 local bridge 實在太少，又放寬定義
定義 nearborhood overlap<br>
$\dfrac{A \cap B}{A \cup B}$  !!注意 $A \ cup B$ 不包含 A B 本身<br>
<img src="https://images.sappy.tw/Social_Network/strong_and_weak_ties/nearborhood_overlap.png" alt="nearborhood_overlap"><br>
這樣還有個好處就是可以數值化ties 的強弱<br>
Example A-F 的 overlap 只有 1/6 (C / B, C, D, E, G, J)<br>
<img src="https://images.sappy.tw/Social_Network/strong_and_weak_ties/nearborhood_overlap_example.png" alt="nearborhood_overlap_example"></p>
<p>真實情況，確實 ties 強度(下方)跟 overlap(左邊) 是呈正比的<br>
<img src="https://images.sappy.tw/Social_Network/strong_and_weak_ties/overlap_real.png" alt="overlap_real"></p>
<p>當把 weak ties 移除時， giant component 會縮小得很快</p>
<h1 id="fb-上的探討">FB 上的探討</h1>
<p>左上是所有朋友<br>
右上是比較熟的人<br>
左下是事件<br>
右下是親密夥伴<br>
<img src="https://images.sappy.tw/Social_Network/strong_and_weak_ties/FB.png" alt="FB"></p>
<p>passive engagement - 介於 strong 跟 weak 中間的人</p>
<h1 id="closure--structural-holes--social-capital">closure &amp; structural holes &amp; social capital</h1>
<p>討論在社群網路中的位置提供的優勢</p>
<p><img src="https://images.sappy.tw/Social_Network/strong_and_weak_ties/social_capital.png" alt="social_capital"></p>
<p>A 的 cluster coefficient 很高</p>
<h2 id="embeddedness">Embeddedness</h2>
<p>用處跟 cluster coefficient 類似
edge 兩端的 node 的共同朋友
A-B 的 Embeddedness 是 2</p>
<h2 id="tightly-knit-groups">Tightly-knit groups</h2>
<p>共同朋友越多 -&gt; 互信程度越高</p>
<h2 id="zero-embeddedness">zero embeddedness</h2>
<p>B-C 的 embeddedness 是 0</p>
<h2 id="structural-holes">Structural holes</h2>
<p>B 的位置稱為 Structural holes，像是E-B-C C-B-D 的空洞</p>
<h2 id="b-的優勢">B 的優勢</h2>
<p>B 有機會拿到 early access - 拿到最新的外部訊息<br>
B 有更好的 Creativity (因能獲得新想法)<br>
B 也有機會過濾訊息 - social &ldquo;gatekeeping&rdquo;</p>
<h2 id="social-capital">social capital</h2>
<ul>
<li>physical capital - 技術優勢</li>
<li>human - 天賦</li>
<li>ecoomic - $$</li>
<li>cultural - 文化</li>
</ul>
]]></content></item><item><title>批次 ppt 轉 pdf</title><link>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/%E6%89%B9%E6%AC%A1ppt%E8%BD%89pdf/</link><pubDate>Fri, 24 Apr 2020 13:58:34 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/%E6%89%B9%E6%AC%A1ppt%E8%BD%89pdf/</guid><description>網路上的 powershell 程式碼，並修改了一下，使之能在最新版的 powershell + MS ppt 使用 # Batch convert all .ppt/.pptx files encountered in folder and all its subfolders # The produced PDF files are stored in the invocation folder # # Adapted from http://stackoverflow.com/questions/16534292/basic-powershell-batch-convert-word-docx-to-pdf # Thanks to MFT, takabanana, ComFreek # # If PowerShell exits</description><content type="html"><![CDATA[<p>網路上的 powershell 程式碼，並修改了一下，使之能在最新版的 powershell + MS ppt 使用</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="c"># Batch convert all .ppt/.pptx files encountered in folder and all its subfolders</span>
</span></span><span class="line"><span class="cl"><span class="c"># The produced PDF files are stored in the invocation folder</span>
</span></span><span class="line"><span class="cl"><span class="c">#</span>
</span></span><span class="line"><span class="cl"><span class="c"># Adapted from http://stackoverflow.com/questions/16534292/basic-powershell-batch-convert-word-docx-to-pdf</span>
</span></span><span class="line"><span class="cl"><span class="c"># Thanks to MFT, takabanana, ComFreek</span>
</span></span><span class="line"><span class="cl"><span class="c">#</span>
</span></span><span class="line"><span class="cl"><span class="c"># If PowerShell exits with an error, check if unsigned scripts are allowed in your system.</span>
</span></span><span class="line"><span class="cl"><span class="c"># You can allow them by calling PowerShell as an Administrator and typing</span>
</span></span><span class="line"><span class="cl"><span class="c"># ```</span>
</span></span><span class="line"><span class="cl"><span class="c"># Set-ExecutionPolicy Unrestricted</span>
</span></span><span class="line"><span class="cl"><span class="c"># ```</span>
</span></span><span class="line"><span class="cl"><span class="c"># Get invocation path</span>
</span></span><span class="line"><span class="cl"><span class="c"># $wdTypes = Add-Type -AssemblyName &#39;Microsoft.Office.Interop.PowerPoint.PpSaveAsFileType&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nv">$curr_path</span> <span class="p">=</span> <span class="nb">Split-Path</span> <span class="n">-parent</span> <span class="nv">$MyInvocation</span><span class="p">.</span><span class="py">MyCommand</span><span class="p">.</span><span class="py">Path</span>
</span></span><span class="line"><span class="cl"><span class="c"># Create a PowerPoint object</span>
</span></span><span class="line"><span class="cl"><span class="nv">$ppt_app</span> <span class="p">=</span> <span class="nb">New-Object</span> <span class="n">-ComObject</span> <span class="n">powerpoint</span><span class="p">.</span><span class="py">application</span>
</span></span><span class="line"><span class="cl"><span class="c"># Get all objects of type .ppt? in $curr_path and its subfolders</span>
</span></span><span class="line"><span class="cl"><span class="nb">Get-ChildItem</span> <span class="n">-Path</span> <span class="nv">$curr_path</span> <span class="n">-Recurse</span> <span class="n">-Filter</span> <span class="p">*.</span><span class="n">ppt</span><span class="p">?</span> <span class="p">|</span> <span class="nb">ForEach-Object</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nb">Write-Host</span> <span class="s2">&#34;Processing&#34;</span> <span class="nv">$_</span><span class="p">.</span><span class="py">FullName</span> <span class="s2">&#34;...&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="c"># Open it in PowerPoint</span>
</span></span><span class="line"><span class="cl">    <span class="nv">$document</span> <span class="p">=</span> <span class="nv">$ppt_app</span><span class="p">.</span><span class="py">Presentations</span><span class="p">.</span><span class="py">Open</span><span class="p">(</span><span class="nv">$_</span><span class="p">.</span><span class="n">FullName</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="c"># Create a name for the PDF document; they are stored in the invocation folder!</span>
</span></span><span class="line"><span class="cl">    <span class="c"># If you want them to be created locally in the folders containing the source PowerPoint file, replace $curr_path with $_.DirectoryName</span>
</span></span><span class="line"><span class="cl">    <span class="nv">$pdf_filename</span> <span class="p">=</span> <span class="s2">&#34;</span><span class="p">$(</span><span class="nv">$curr_path</span><span class="p">)</span><span class="s2">\</span><span class="p">$(</span><span class="nv">$_</span><span class="p">.</span><span class="n">BaseName</span><span class="p">)</span><span class="s2">.pdf&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="c"># Save as PDF -- 17 is the literal value of `wdFormatPDF`</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nv">$opt</span> <span class="p">=</span> <span class="p">[</span><span class="no">Microsoft.Office.Interop.PowerPoint.PpSaveAsFileType</span><span class="p">]::</span><span class="n">ppSaveAsPDF</span>
</span></span><span class="line"><span class="cl">    <span class="nv">$document</span><span class="p">.</span><span class="py">SaveAs</span><span class="p">(</span><span class="nv">$pdf_filename</span><span class="p">,</span> <span class="nv">$opt</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="c"># Close PowerPoint file</span>
</span></span><span class="line"><span class="cl">    <span class="nv">$document</span><span class="p">.</span><span class="py">Close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="c"># Exit and release the PowerPoint object</span>
</span></span><span class="line"><span class="cl"><span class="nv">$ppt_app</span><span class="p">.</span><span class="py">Quit</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="no">System.Runtime.Interopservices.Marshal</span><span class="p">]::</span><span class="n">ReleaseComObject</span><span class="p">(</span><span class="nv">$ppt_app</span><span class="p">)</span>
</span></span></code></pre></div>]]></content></item><item><title>社群網路筆記 拍賣</title><link>https://blog.sappy.tw/posts/%E5%A4%A7%E5%AD%B8%E5%AD%B8%E7%BF%92/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF_%E5%B8%82%E5%A0%B4%E4%BA%A4%E6%98%93/</link><pubDate>Tue, 21 Apr 2020 10:15:37 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E5%A4%A7%E5%AD%B8%E5%AD%B8%E7%BF%92/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF_%E5%B8%82%E5%A0%B4%E4%BA%A4%E6%98%93/</guid><description>Matching Markets - 市場交易 多人拍賣 人對不同貨品有不同程度的偏好 價格也是有偏好的 allocation 可以是最佳的 圖例 左邊是 賣家 右邊是 買家 實體線代表 賣家跟買家 之間有沒有可能有</description><content type="html"><![CDATA[<h1 id="matching-markets---市場交易">Matching Markets - 市場交易</h1>
<ul>
<li>多人拍賣</li>
<li>人對不同貨品有不同程度的偏好</li>
<li>價格也是有偏好的</li>
<li>allocation 可以是最佳的</li>
</ul>
<h1 id="圖例">圖例</h1>
<ul>
<li>左邊是 賣家</li>
<li>右邊是 買家</li>
<li>實體線代表 賣家跟買家 之間有沒有可能有交易</li>
<li>粗線 代表達成交易<br>
<img src="https://images.sappy.tw/Social_Network/market/graph.png" alt="graph"></li>
</ul>
<h1 id="perfect-matching">Perfect matching</h1>
<p>要完成以下兩個條件</p>
<ol>
<li>每個 node 都要用粗線連線到對面</li>
<li>一個 node 只能有一條粗線(即不能多點對一點)</li>
</ol>
<h1 id="constricted-sets">Constricted sets</h1>
<ol>
<li>找出 seller set - $S$</li>
<li>找出跟 $S$ 相連(near)的 node - $N(S)$</li>
<li>如果 $|N(S)|$ 比 $|S|$ 小，則代表是 Constricted sets，即 $|N(S)|&lt; |S|$<br>
<img src="https://images.sappy.tw/Social_Network/market/constricted_set.png" alt="constricted_set.png"></li>
</ol>
<ul>
<li>如果 $|N(S)|$ 比 $|S|$ 小，則不能能形成 perfect match，因為不可能將所有點連起來</li>
<li>Matching Theorem - 如果 graph 中存在 Constricted sets，則代表這個 graph 沒有 perfect match</li>
</ul>
<h1 id="valueation--optimal-assignments---加上偏好程度">Valueation &amp; optimal assignments - 加上偏好程度</h1>
<ul>
<li>右邊數字分別代表買家對 seller 1 2 3 的偏好(value)</li>
<li>Quality - 所有買家的偏好相加</li>
<li>optimal assignment - 買家偏好要最高<br>
<img src="https://images.sappy.tw/Social_Network/market/value-graph.png" alt="value-graph"></li>
</ul>
<p>如果是 binary 的話，就只是 value 變成 0 跟 1 而已<br>
<img src="https://images.sappy.tw/Social_Network/market/binary-value-graph.png" alt="value-graph"></p>
<h1 id="price---加上售價">Price - 加上售價</h1>
<ul>
<li>如果左邊出價格 p ，如果 value - price &lt; 0，那 payoff 就是 0 (因為可以不買)</li>
<li>買家想要最大化他的 payoff，即 value - price</li>
</ul>
<h2 id="preferred-seller---這個-buyer-偏好的-seller">preferred seller - 這個 buyer 偏好的 seller</h2>
<p>即使買家 payoff 最大化的賣家<br>
<img src="https://images.sappy.tw/Social_Network/market/perfer-seller.png" alt="perfer-seller.png"></p>
<h2 id="preferred-seller-graph--market-clearing">preferred-seller graph &amp; market clearing</h2>
<p>所有 buyer 跟其 preferred-seller 都連起來的 graph<br>
當 preferred-seller graph 能夠形成 perfect graph 就稱為 market clearing<br>
<img src="https://images.sappy.tw/Social_Network/market/perfer-seller-graph.png" alt="perfer-seller-graph"></p>
<h2 id="兩個問題">兩個問題</h2>
<ol>
<li>clear market 時， quality 好不好</li>
<li>給定任意的買方偏好價格，是否一定存在 prefect matching (buyer 跟 seller 數量要相同)</li>
</ol>
<h3 id="1-clear-market-時-quality-好不好">1 clear market 時， quality 好不好</h3>
<p>定義 total payoff M 是下面這樣<br>
<img src="https://images.sappy.tw/Social_Network/market/payoff_M.png" alt="perfer-seller-graph"></p>
<p>$\sum_{i,j}v_{ij}C_{ij}$ - M 的 total value<br>
$\sum_{i,j}p_{i}C_{ij}$  - 所有價格相加 (因為價格不會因為不同連線方式改變，所以是個常數)</p>
<p>當 clear market 時，每個 buyer 都一定是連到 perfect-seller (因 preferred-seller graph 是成立 market clear 的先決條件)，因此 M 的 total value 一定是最大值，而 payoff 相加是個常數，因此會是最大值</p>
<h3 id="2-作者稱之為-bipartitle-graph-auction-model">2 作者稱之為 bipartitle graph auction model</h3>
<p>演算法</p>
<ol>
<li>每個 seller 初始價格為 0</li>
<li>建立 perferred-seller graph</li>
<li>如果已經 market clear 了，那就做完了</li>
<li>不然就找一個 seller set S 的 constricted set</li>
<li>把 N(S) 的 buyer 的售價全部 + 1</li>
<li>將所有 seller 的售價減去所有 seller 售價的最小值， $p_i - min(p_1, p_2 &hellip;, p_n)$</li>
<li>重複做上述步驟，直到找到 perfect matching</li>
</ol>
<p>如下圖<br>
<img src="https://images.sappy.tw/Social_Network/market/bipartite-graph-auction.png" alt="bipartite-graph-auction"></p>
<p>那這會停止嗎?
會，因為這如同位能一樣，只會遞減，不會增加。
且最小值又是 0 ，因此迭代次數夠多的話就一定會停 (因為只會遞減)</p>
<h4 id="定義位能-potential">定義位能 (potential)</h4>
<ul>
<li>買家位能 = 買家的 payoff</li>
<li>賣家位能 = 賣家的出價</li>
<li>交易位能 = 買家 + 賣家的位能</li>
</ul>
<h4 id="證明">證明</h4>
<ol>
<li>初始位能都 &gt;= 0
<ol>
<li>因為初始所有 seller 初始 potential 都是 0</li>
<li>所有 buyer 的 payoff 都是正的 (因 seller 售價都是 0)</li>
</ol>
</li>
<li>會影響 potential 只有 step 5 跟 step 6
<ol>
<li>step 6 - 因為 buyer 跟 seller 的 potential 會抵消，因此不影響 potential</li>
<li>因為 $|S| &gt; |N(S)|$，故 整體 potential 會下降</li>
</ol>
</li>
</ol>
<h1 id="將-single-item--auction-轉匯成-multi-item-auction">將 single-item  auction 轉匯成 multi-item auction</h1>
<p>建立很多 fake additional seller，其他買家對 fake seller 的 value 都是 0<br>
如下圖<br>
<img src="https://images.sappy.tw/Social_Network/market/relation-single-item.png" alt="relation-single-item"></p>
<p>當 market clear　時，很像是 auction 的 Sealed-bid Second-price price</p>
]]></content></item><item><title>社群網路筆記 拍賣</title><link>https://blog.sappy.tw/posts/%E5%A4%A7%E5%AD%B8%E5%AD%B8%E7%BF%92/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF_auctions/</link><pubDate>Sat, 18 Apr 2020 00:00:00 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E5%A4%A7%E5%AD%B8%E5%AD%B8%E7%BF%92/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF_auctions/</guid><description>定義 True Value - 每個 bidder(買家) 都有自己的估價，買家不會買超過自己估價的東西 四種拍賣方式 Ascending-bid auction - 買家喊價，越出價越高，最高價者得標 Descending-bid auction - 賣家</description><content type="html"><![CDATA[<h1 id="定義">定義</h1>
<ul>
<li>True Value - 每個 bidder(買家) 都有自己的估價，買家不會買超過自己估價的東西</li>
</ul>
<h1 id="四種拍賣方式">四種拍賣方式</h1>
<ol>
<li>Ascending-bid auction - 買家喊價，越出價越高，最高價者得標</li>
<li>Descending-bid auction - 賣家喊價，價格越喊越低，直到有人接受</li>
<li>First-price sealed-bid auctions  - 同時出價，價格最高者得標，並付出喊價的價格</li>
<li>Second-price sealed-bid auctions - 同時出價，價格最高者得標，並付出喊價次高者喊的價格</li>
</ol>
<h1 id="拍賣適合的時機">拍賣適合的時機</h1>
<p>!! 買賣雙方都不知道真實的價格 !!</p>
<p>如果買方知道賣方的估價，就直接用賣方估價買就好了<br>
如果賣方知道買方的估價，就直接用買方估價賣就好了</p>
<h1 id="拍賣方式的關係">拍賣方式的關係</h1>
<p>Descending-bid auction 跟 First-price sealed-bid auctions 在數學上是一樣的<br>
因為假設 bidder 估價為 b，當賣方逐步降價時，如果降到有 bidder 能接受的價格 b 時，該 bidder 就會買下<br>
<img src="https://images.sappy.tw/Social_Network/auction/first-descending.png" alt="first-descending"></p>
<p>Ascending-bid auction 跟 Second-price sealed-bid auctions 在數學上是一樣的
因為假設 bidder 估價為 b，當買方逐步出價時，估價最高的 bidder 將會贏的拍賣，且因為是逐步出價的，所以最高出價的買方只要贏過次高出價的買方就好了，不需要出到自己的估價，因此跟 Second-price sealed-bid auctions 相同，贏得拍賣，並付出次高買方喊的價格即可<br>
<img src="https://images.sappy.tw/Social_Network/auction/second-ascending.png" alt="second-ascending"></p>
<p>!!! 改變規則會改變行為，因此 first-price 跟 second-prie 的收益會相等  !!!</p>
<h1 id="數學符號">數學符號</h1>
<ul>
<li>bidder - 買家</li>
<li>$b_i$ - 第 $i$ 個買家的出價</li>
<li>$v_i$ - 第 $i$ 個買家的估價</li>
<li>$b_i$ 的 payoff
<ul>
<li>如果贏了，則是 $v_i - b_i$</li>
<li>如果輸了，則是 $0$</li>
</ul>
</li>
<li>truthful bidding - 出的價格就是估價</li>
</ul>
<h1 id="second-price-auctions">Second-price auctions</h1>
<p>!!! Sealed-bid Second-price price auction 中，每個 bidder 的 dominant strategy 就是出自己的估價</p>
<h2 id="tie-breaking">Tie breaking</h2>
<p>如果前兩大的出價相等的話，要怎麼決定哪個能得標呢?</p>
<ol>
<li>用說好的順序決定輸贏</li>
<li>假設同樣價差之間差距 $\varepsilon$，而 $\varepsilon\approx0$</li>
</ol>
<h2 id="證明-truthful-bidding-在-second-price-sealed-bid-auctions-中視最好的策略">證明 truthful bidding 在 second-price sealed-bid auctions 中視最好的策略</h2>
<h3 id="觀察">觀察</h3>
<ol>
<li>要證明 $b_i=v_i$ 時，沒有其他 $b_i&rsquo;$ 能夠比 $b_i$ 還要好</li>
<li>$b_i$ 有兩種方式可以做偏移，上升或下降</li>
<li>$b_i$ 只影響輸贏，不影響 payoff</li>
</ol>
<h3 id="分段證明">分段證明</h3>
<p>第一章圖是教科書的證明，第二張圖是我自己的想法<br>
<img src="https://images.sappy.tw/Social_Network/auction/second-bid-proof.png" alt="second-bid-proof"> <br>
<img src="https://images.sappy.tw/Social_Network/auction/second-bid-proof-2.svg" alt="second-bid-proof-2"></p>
<h1 id="first-price-auctions">First-price auctions</h1>
<ul>
<li>如沒有贏， payoff 就是 0</li>
<li>如果贏了， payoff 就是 $v_i-b_i$</li>
</ul>
<p>因為 payoff 會隨 $b_i$(出價) 改變，因此 truthfulness 就不再是 dominant strategy<br>
也因此我們要把 bid 壓越地越好，但是要盡可能的贏得拍賣</p>
<h1 id="all-pay-auction---即使沒贏也要付出代價">All-pay auction - 即使沒贏，也要付出代價</h1>
<ul>
<li>如出價 $b_i$ 沒有贏， payoff 是 $-b_i$</li>
<li>如出價 $b_i$ 贏了， payoff 就是 $v_i-b_i$</li>
</ul>
<p>all pay auction 的 optimal bid 跟 first-price auction 類似</p>
<h1 id="common-values--winners-curse">Common Values &amp; winner&rsquo;s curse</h1>
<ul>
<li>Common Values - 物品有實際價值，但沒人知道實際價值是多少，像是油田等等</li>
<li>winner&rsquo;s curse - 如果買家的估價比實際價值高，那當買家實際開採或轉賣時，很可能賠錢，又因為是最高者得，所以買家高估實際價值的可能性比較高</li>
<li>也因此就算是 second-price auction，truthful bidding 也不會是 dominant strategy， 因為物品具有實際價值</li>
<li>因此 購買時要考慮 winner&rsquo;s curse</li>
</ul>
<p>模型</p>
<ul>
<li>$v_i$ - 估價</li>
<li>$v$ - 實際價值，但沒人知道實際價值是多少</li>
<li>$x_i$ - 誤差
$v_i = v + x_i$</li>
</ul>
]]></content></item><item><title>社群網路筆記 賽局理論</title><link>https://blog.sappy.tw/posts/%E5%A4%A7%E5%AD%B8%E5%AD%B8%E7%BF%92/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF_%E8%B3%BD%E5%B1%80/</link><pubDate>Sat, 11 Apr 2020 18:13:30 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E5%A4%A7%E5%AD%B8%E5%AD%B8%E7%BF%92/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF_%E8%B3%BD%E5%B1%80/</guid><description>賽局理論最大的特色在於，他有許多決策者 名詞 Player Strategies Payoff Payoff Matrix 目前先考慮 one shot game player 同時下決策，且 player 之間的決策過程是獨立的 幾個假設 player 只關注如何最大化自身利</description><content type="html"><![CDATA[<p>賽局理論最大的特色在於，他有許多決策者</p>
<h1 id="名詞">名詞</h1>
<ol>
<li>Player</li>
<li>Strategies</li>
<li>Payoff</li>
<li>Payoff Matrix</li>
</ol>
<p>目前先考慮 one shot game
player 同時下決策，且 player 之間的決策過程是獨立的</p>
<p>幾個假設</p>
<ol>
<li>player 只關注如何最大化自身利益 - rationality</li>
<li>player 不關心他人或集體的利益</li>
<li>player 能完整知道整個 game 的訊息(也有不知道所有訊息的 game)</li>
</ol>
<p>TODO 例子</p>
<h1 id="best-responses--dominant-strategies">Best Responses &amp; Dominant Strategies</h1>
<p>當其他人選 T 時， S 是最好的選擇</p>
<h1 id="strictly-dominant-strategy">Strictly Dominant Strategy</h1>
<p>無論其他怎麼選，都是最優的選項
最優的選項 - 大於其他所有選項</p>
<p>TODO 例子 - 囚犯困境 - 都有Strictly Dominant Strategy</p>
<p>TODO 例子 - 只有一方有 Strictly Dominant Strategy</p>
<h1 id="nash-equilibrium">Nash Equilibrium</h1>
<p>解決都不存在 Strictly Dominant Strategy 的狀況</p>
<p>在這組決策下，沒有任何一方能夠通過改變自己的決策獲取更多利益，使其他人沒有動機改變決策</p>
<p>TODO 三人例子</p>
<p>找 Nash 的方法</p>
<ol>
<li>暴力搜尋所有組合</li>
<li>找每一個人的所有 best responses，並交集所有人的 best responses - 比較好的方法</li>
</ol>
<h2 id="coordination-game---多個-nash-equilibrium">coordination game - 多個 Nash Equilibrium</h2>
<p>TODO 變種 + 特例
<a href="https://en.wikipedia.org/wiki/Coordination_game">https://en.wikipedia.org/wiki/Coordination_game</a></p>
<ol>
<li>Coordination game</li>
<li>Unbalanced coordination game</li>
<li>Battle of the sexes</li>
<li>Mis-coordination games - 如果沒協調好的話，追求最大利益的反而懲罰越大</li>
</ol>
<h1 id="mixed-strategies">Mixed strategies</h1>
<p>引入機率，讓對手更難預測自身的行為 -&gt; 讓對手選哪個選項 payoff 都相同(indifference)
透過引入機率，解決沒有 Nash Equilibrium 的問題
之前的決策沒有機率，所以撐過 pure strategies</p>
<p>TODO 例子 - pennies game</p>
<p>zero sum 零和遊戲 - payoff 加總唯一常數</p>
<p>TODO 例子</p>
<p>!!! 在有限的 player 跟 有限的策略時，一定有 mixed strategiy equilibrium</p>
<p>TODO 有兩個 mixed Nash Equilibrium 的例子</p>
<p>找Nash 的方法</p>
<ol>
<li>先用 pure strategies 方式去找</li>
<li>找不到再用 mixed</li>
</ol>
<h1 id="pareto-optimality">Pareto Optimality</h1>
<p>考慮整體的利益，不一定能達到整體最好，但能達到局部最好
當存在一種組合，使每個人的 payoff 都比現在的組合好的時候，現在的組合即不是 pareto optimality</p>
<p>TODO 例子</p>
<h1 id="social-optimal">Social Optimal</h1>
<p>把每個人的 payoff 加總，最大的那個組合</p>
<p>TODO 證明 如果是 social optimal 則一定是 pareto optimal</p>
<h1 id="dominated-strategies">Dominated Strategies</h1>
<p>注意 Dominated strategies != Dominant Strategies
即有選擇全面的比現有選擇還要好，主要用來降低 Game 的分析複雜度</p>
<p>TODO 例子</p>
<p>策略組合 = outcome = choice of strategy = joint strategy = strategy profile = strategy combination = action profile</p>
<h2 id="證明">證明</h2>
<ol>
<li>有沒有可能把 Nash Equilibrium 刪了?</li>
<li>有沒有可能剩下的 Nash Equilibrium 原本不是 Nash Equilibrium</li>
</ol>
<h1 id="weekly-dominate-strategies">Weekly Dominate Strategies</h1>
<p>即 &gt;=</p>
<h1 id="dynamic-game">Dynamic Game</h1>
<p>不同時執行
之前的 game 又叫做 normal form = strategic game = matrix game
現在 Game 叫做 Dynamic game = extensive form</p>
<p>解法</p>
<ol>
<li>動態規劃解，由下往上 - 這比較好 - Backward induction</li>
<li>轉成 matrix 解 - 有些解不存在，會有多的 Nash Equilibrium</li>
</ol>
<h1 id="subgame-perfect-equilibrium">Subgame perfect equilibrium</h1>
<p>在所有 subgame 中都是最好的
Subgame perfect equilibrium 是 Nash
但 Nash 不一定是 Subgame perfect equilibrium</p>
<p>QQAQQQQQQQQQQ</p>
]]></content></item><item><title>社群網路筆記 1</title><link>https://blog.sappy.tw/posts/%E5%A4%A7%E5%AD%B8%E5%AD%B8%E7%BF%92/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF%E7%AD%86%E8%A8%98_1/</link><pubDate>Tue, 31 Mar 2020 23:49:20 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E5%A4%A7%E5%AD%B8%E5%AD%B8%E7%BF%92/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF%E7%AD%86%E8%A8%98_1/</guid><description>社群網路的重要理論 The small world property - 六度空間法則，任兩點之間平均過六格就能抵達對面 ?? 但是，在規模多大內才有效? Scale-free, power-law degree distributions - power law，所有點的 degree 分布圖，</description><content type="html"><![CDATA[<h1 id="社群網路的重要理論">社群網路的重要理論</h1>
<ol>
<li>The small world property - 六度空間法則，任兩點之間平均過六格就能抵達對面 ?? 但是，在規模多大內才有效?</li>
<li>Scale-free, power-law degree distributions  - power law，所有點的 degree 分布圖，會呈現平方下降</li>
<li>Relatively large clustering coefficient - 三個點都相連會比只有兩條邊的數量要多</li>
<li>Assortative mixing and homophily - 相似度計算</li>
<li>Existence of community structures - 小群體的結構</li>
</ol>
<p>centralities - 中心，影響力，重要性</p>
<ol>
<li>Degree centrality , 用 degree 描述 =&gt; 不理想，不是所有 Neighbor 都一樣重要</li>
<li>pagerank</li>
<li>Closeness, 其他點到該點倒數距離的平方</li>
<li>Betweenness, 最多最短路徑經過的節點</li>
</ol>
<p>power law</p>
<p>small world - Six degrees of separation</p>
<p>[] TODO &ndash; 看影片
Homophily - 相似度</p>
<p>Community detection algorithms</p>
]]></content></item><item><title>用 QEMU 建立VM</title><link>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/%E7%94%A8qemu%E5%BB%BA%E7%AB%8Bvm/</link><pubDate>Sun, 29 Mar 2020 23:49:20 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/%E7%94%A8qemu%E5%BB%BA%E7%AB%8Bvm/</guid><description>緣由 練習 QEMU 安裝 目前有兩款比較熱門的跨平台 terminal hyper terminus 就顏質跟設定方便度而言，我選擇了後者，也就是 terminus 建立VM並開機 使用 chocolatey 安裝 choco install terminus 安裝 powershell core， choco</description><content type="html"><![CDATA[<h1 id="緣由">緣由</h1>
<p>練習 QEMU</p>
<h1 id="安裝">安裝</h1>
<p>目前有兩款比較熱門的跨平台 terminal</p>
<ol>
<li><a href="https://hyper.is/">hyper</a></li>
<li><a href="https://eugeny.github.io/terminus/">terminus</a></li>
</ol>
<p>就顏質跟設定方便度而言，我選擇了後者，也就是 <a href="https://eugeny.github.io/terminus/">terminus</a></p>
<h2 id="建立vm並開機">建立VM並開機</h2>
<ol>
<li>使用 <a href="https://chocolatey.org/">chocolatey</a> 安裝
<code>choco install terminus</code></li>
<li>安裝 <a href="https://github.com/PowerShell/PowerShell">powershell core</a>，
<code>choco install powershell-core</code></li>
<li>安裝 <a href="https://github.com/ryanoasis/nerd-fonts/tree/master/patched-fonts">nerd fonts</a> 中任意喜歡的字體
我個人比較推 <code>FiraCode</code> <code>SourceCodePro</code> <code>CascadiaCode</code> 這三款</li>
<li>打開 terminus，在 terminus 的設定 -&gt; 外觀 -&gt; 字體上選擇字體</li>
</ol>
<p>開機</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">qemu-img create -f qcow2 1.qcow2 40G
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">qemu-system-x86_64 --enable-kvm -hda 1.qcow2 -m <span class="m">1024</span> -net nic,model<span class="o">=</span>virtio -net user,hostfwd<span class="o">=</span>tcp::2223-:22 -cdrom ../ubuntu-16.04.6-desktop-amd64.iso -vga std -cpu host -smp 4,cores<span class="o">=</span>4,threads<span class="o">=</span>1,sockets<span class="o">=</span>4,maxcpus<span class="o">=</span><span class="m">16</span> -boot <span class="nv">strict</span><span class="o">=</span>on
</span></span></code></pre></div><p>alpine</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">qemu-img create -f qcow2 1.qcow2 40G
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">qemu-system-x86_64 --enable-kvm -hda 1.qcow2 -m <span class="m">1024</span> -net nic,model<span class="o">=</span>virtio -net user,hostfwd<span class="o">=</span>tcp::2223-:22 -cdrom alpine-virt-3.11.5-x86_64.iso -vga std -cpu host -smp 4,cores<span class="o">=</span>4,threads<span class="o">=</span>1,sockets<span class="o">=</span>4,maxcpus<span class="o">=</span><span class="m">16</span> -boot <span class="nv">strict</span><span class="o">=</span>on
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">https://wiki.alpinelinux.org/wiki/Alpine_Install:_from_a_disc_to_a_virtualbox_machine_single_only
</span></span></code></pre></div><p>必要安裝</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo apt install openssh-server
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">sudo sed -i <span class="s1">&#39;s/APT::Periodic::Update-Package-Lists &#34;1&#34;/APT::Periodic::Update-Package-Lists &#34;0&#34;/&#39;</span> /etc/apt/apt.conf.d/20auto-upgrades
</span></span></code></pre></div><p>安裝 tensorflow
&ndash;no-cache-dir tensorflow 是為了修正 memory error 的 bug</p>
<pre tabindex="0"><code>pip3 install --no-cache-dir tensorflow
</code></pre><p>編譯 kernel</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">uname -r
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">mkdir kernel
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> kernel
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.6.2.tar.xz
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">tar Jxvf linux-5.6.2.tar.xz
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">sudo mv linux-5.6.2/ /usr/src/
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">sudo apt install fakeroot build-essential libncurses5-dev kernel-package openssl bison flex libssl-dev
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> /usr/src/linux-5.6.2
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># sudo cp /boot/config-`uname -r` ./.config</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># make oldconfig</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">touch REPORTING-BUGS
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">make menuconfig
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">sudo fakeroot make-kpkg -j4 --initrd kernel_image kernel_headers
</span></span><span class="line"><span class="cl">sudo fakeroot make-kpkg -j32 --initrd kernel_image kernel_headers
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> ..
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">wget 192.168.122.1:8000/linux-image-5.6.2_5.6.2-10.00.Custom_amd64.deb
</span></span><span class="line"><span class="cl">wget 192.168.122.1:8000/linux-headers-5.6.2_5.6.2-10.00.Custom_amd64.deb
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">sudo dpkg -i linux-image-5.6.2_5.6.2-10.00.Custom_amd64.deb
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">sudo dpkg -i linux-headers-5.6.2_5.6.2-10.00.Custom_amd64.deb
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">sudo reboot now
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">uname -r
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">systemd-analyze 
</span></span></code></pre></div><p>compiler</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo apt install software-properties-common
</span></span><span class="line"><span class="cl">sudo add-apt-repository ppa:ubuntu-toolchain-r/test
</span></span><span class="line"><span class="cl">sudo apt update
</span></span><span class="line"><span class="cl">sudo apt install gcc-9 g++-9
</span></span><span class="line"><span class="cl">sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 <span class="m">90</span> --slave /usr/bin/g++ g++ /usr/bin/g++-9 --slave /usr/bin/gcov gcov /usr/bin/gcov-9
</span></span></code></pre></div><p>分析
systemd-analyze blame</p>
<h1 id="todo">Todo</h1>
<ul>
<li>[v] Compiler 優化</li>
<li>[[gdb簡易教學]]</li>
</ul>
]]></content></item><item><title>跨平台 terminal 設定</title><link>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/%E8%B7%A8%E5%B9%B3%E5%8F%B0terminal%E8%A8%AD%E5%AE%9A/</link><pubDate>Sat, 28 Mar 2020 23:49:20 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/%E8%B7%A8%E5%B9%B3%E5%8F%B0terminal%E8%A8%AD%E5%AE%9A/</guid><description>緣由 最近在因為 terminal 跨平台讓我有點煩躁，所以才寫下這篇備忘 安裝 目前有兩款比較熱門的跨平台 terminal hyper terminus 就顏質跟設定方便度而言，我選擇了後者，也就是 terminus Windows 安</description><content type="html"><![CDATA[<h1 id="緣由">緣由</h1>
<p>最近在因為 terminal 跨平台讓我有點煩躁，所以才寫下這篇備忘</p>
<h1 id="安裝">安裝</h1>
<p>目前有兩款比較熱門的跨平台 terminal</p>
<ol>
<li><a href="https://hyper.is/">hyper</a></li>
<li><a href="https://eugeny.github.io/terminus/">terminus</a></li>
</ol>
<p>就顏質跟設定方便度而言，我選擇了後者，也就是 <a href="https://eugeny.github.io/terminus/">terminus</a></p>
<h2 id="windows-安裝">Windows 安裝</h2>
<ol>
<li>使用 <a href="https://chocolatey.org/">chocolatey</a> 安裝
<code>choco install terminus</code></li>
<li>安裝 <a href="https://github.com/PowerShell/PowerShell">powershell core</a>，
<code>choco install powershell-core</code></li>
<li>安裝 <a href="https://github.com/ryanoasis/nerd-fonts/tree/master/patched-fonts">nerd fonts</a> 中任意喜歡的字體
我個人比較推 <code>FiraCode</code> <code>SourceCodePro</code> <code>CascadiaCode</code> 這三款</li>
<li>打開 terminus，在 terminus 的設定 -&gt; 外觀 -&gt; 字體上選擇字體</li>
</ol>
]]></content></item><item><title>ubuntu 上的中文輸入法設定 Chinese Input Method Setup on Ubuntu</title><link>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/chinese-input-install-on-ubuntu/</link><pubDate>Tue, 11 Feb 2020 12:33:20 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/chinese-input-install-on-ubuntu/</guid><description>緣由 最近在 Ubuntu 上做開發，便來安裝注音輸入法 安裝 此方法應該適用於 Ubuntu 12.10 以上版本（在 19.04 中測試過） 安裝 rime sudo apt-get install ibus-rime 安裝 注音 sudo apt-get install librime-data-terra-pinyin librime-data-bopomofo terminal 輸入 ibus-setup 會跳出 IBus Preferences 視</description><content type="html"><![CDATA[<h1 id="緣由">緣由</h1>
<p>最近在 Ubuntu 上做開發，便來安裝注音輸入法</p>
<h1 id="安裝">安裝</h1>
<p>此方法應該適用於 Ubuntu 12.10 以上版本（在 19.04 中測試過）</p>
<ol>
<li>安裝 rime <code>sudo apt-get install ibus-rime</code></li>
<li>安裝 注音 <code>sudo apt-get install librime-data-terra-pinyin librime-data-bopomofo</code></li>
<li>terminal 輸入 <code>ibus-setup</code> 會跳出 IBus Preferences 視窗</li>
<li>在 IBus Preferences -&gt; Input Method -&gt; Add -&gt; Chinese bopomofo</li>
<li>進入 settings -&gt; Region &amp; Language -&gt; Input Sources -&gt; + -&gt; Chinese (Bopomofo)</li>
<li>重新登入即可</li>
</ol>
<h1 id="參考資料">參考資料</h1>
<ul>
<li><a href="https://github.com/rime/home/wiki/RimeWithIBus">RimeWithIBus</a></li>
<li><a href="https://github.com/rime/plum">plum</a></li>
<li><a href="https://github.com/rime/rime-bopomofo">rime-bopomofo</a></li>
</ul>
]]></content></item><item><title>Docker 開發環境簡易教學</title><link>https://blog.sappy.tw/posts/%E5%BE%8C%E7%AB%AF/k8s/docker%E9%96%8B%E7%99%BC%E7%92%B0%E5%A2%83%E7%B0%A1%E6%98%93%E6%95%99%E5%AD%B8/</link><pubDate>Sun, 29 Dec 2019 11:55:38 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E5%BE%8C%E7%AB%AF/k8s/docker%E9%96%8B%E7%99%BC%E7%92%B0%E5%A2%83%E7%B0%A1%E6%98%93%E6%95%99%E5%AD%B8/</guid><description>簡介 最近在嘗試使用 docker 作為開發環境的選項，這篇只是單純紀錄可能遇到的問題跟常用用法 常駐 docker 並能連接上 terminal 用 {} 包起來代表變數 docker run -id {image} docker exec -it {id} bash 做 fuzz test</description><content type="html"><![CDATA[<h1 id="簡介">簡介</h1>
<p>最近在嘗試使用 docker 作為開發環境的選項，這篇只是單純紀錄可能遇到的問題跟常用用法</p>
<h2 id="常駐-docker-並能連接上-terminal">常駐 docker 並能連接上 terminal</h2>
<p>用 {} 包起來代表變數</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker run -id <span class="o">{</span>image<span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">docker <span class="nb">exec</span> -it <span class="o">{</span>id<span class="o">}</span> bash
</span></span></code></pre></div><h2 id="做-fuzz-test">做 fuzz test</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker run -id --ulimit <span class="nv">core</span><span class="o">=</span>-1 --privileged <span class="o">{</span>image<span class="o">}</span>
</span></span></code></pre></div><p><a href="https://ephrain.net/docker-%E5%9C%A8-container-%E8%A3%A1%E8%A8%AD%E5%AE%9A-core-dump-%E7%9A%84%E6%AA%94%E6%A1%88%E5%90%8D%E7%A8%B1%E6%A0%BC%E5%BC%8F/">參考</a></p>
<h2 id="打包現有環境到新-image">打包現有環境到新 image</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker commit <span class="o">{</span>old_running_docker<span class="o">}</span> <span class="o">{</span>newimagename<span class="o">}</span>
</span></span></code></pre></div><p><a href="https://stackoverflow.com/questions/28302178/how-can-i-add-a-volume-to-an-existing-docker-container">參考</a></p>
]]></content></item><item><title>pyspark 小技巧</title><link>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/pyspark%E5%B0%8F%E6%8A%80%E5%B7%A7/</link><pubDate>Sat, 28 Dec 2019 14:06:02 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/pyspark%E5%B0%8F%E6%8A%80%E5%B7%A7/</guid><description>簡介 最近在弄 spark 時遇到一堆破事，特此紀錄 collect 很久，甚至沒反應 conf = SparkConf().setMaster(&amp;#34;local[*]&amp;#34;) \ .setAppName(&amp;#34;App_Name&amp;#34;) \ .set(&amp;#39;spark.executor.memory&amp;#39;, &amp;#39;4G&amp;#39;) \ .set(&amp;#39;spark.driver.memory&amp;#39;, &amp;#39;45G&amp;#39;) \ .set(&amp;#39;spark.driver.maxResultSize&amp;#39;, &amp;#39;10G&amp;#39;) self.sc = SparkContext(conf=conf) saveAsFile 很久，甚至沒反應 conf = SparkConf().setMaster(&amp;#34;local[*]&amp;#34;) \ .setAppName(&amp;#34;App_Name&amp;#34;) \ .set(&amp;#39;spark.executor.memory&amp;#39;, &amp;#39;4G&amp;#39;) \ .set(&amp;#39;spark.driver.memory&amp;#39;, &amp;#39;45G&amp;#39;) \ .set(&amp;#39;spark.driver.maxResultSize&amp;#39;, &amp;#39;10G&amp;#39;) self.sc =</description><content type="html"><![CDATA[<h1 id="簡介">簡介</h1>
<p>最近在弄 spark 時遇到一堆破事，特此紀錄</p>
<h2 id="collect-很久甚至沒反應">collect 很久，甚至沒反應</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">conf</span> <span class="o">=</span> <span class="n">SparkConf</span><span class="p">()</span><span class="o">.</span><span class="n">setMaster</span><span class="p">(</span><span class="s2">&#34;local[*]&#34;</span><span class="p">)</span> \
</span></span><span class="line"><span class="cl">    <span class="o">.</span><span class="n">setAppName</span><span class="p">(</span><span class="s2">&#34;App_Name&#34;</span><span class="p">)</span> \
</span></span><span class="line"><span class="cl">    <span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s1">&#39;spark.executor.memory&#39;</span><span class="p">,</span> <span class="s1">&#39;4G&#39;</span><span class="p">)</span> \
</span></span><span class="line"><span class="cl">    <span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s1">&#39;spark.driver.memory&#39;</span><span class="p">,</span> <span class="s1">&#39;45G&#39;</span><span class="p">)</span> \
</span></span><span class="line"><span class="cl">    <span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s1">&#39;spark.driver.maxResultSize&#39;</span><span class="p">,</span> <span class="s1">&#39;10G&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="bp">self</span><span class="o">.</span><span class="n">sc</span> <span class="o">=</span> <span class="n">SparkContext</span><span class="p">(</span><span class="n">conf</span><span class="o">=</span><span class="n">conf</span><span class="p">)</span>
</span></span></code></pre></div><h2 id="saveasfile-很久甚至沒反應">saveAsFile 很久，甚至沒反應</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">conf</span> <span class="o">=</span> <span class="n">SparkConf</span><span class="p">()</span><span class="o">.</span><span class="n">setMaster</span><span class="p">(</span><span class="s2">&#34;local[*]&#34;</span><span class="p">)</span> \
</span></span><span class="line"><span class="cl">    <span class="o">.</span><span class="n">setAppName</span><span class="p">(</span><span class="s2">&#34;App_Name&#34;</span><span class="p">)</span> \
</span></span><span class="line"><span class="cl">    <span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s1">&#39;spark.executor.memory&#39;</span><span class="p">,</span> <span class="s1">&#39;4G&#39;</span><span class="p">)</span> \
</span></span><span class="line"><span class="cl">    <span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s1">&#39;spark.driver.memory&#39;</span><span class="p">,</span> <span class="s1">&#39;45G&#39;</span><span class="p">)</span> \
</span></span><span class="line"><span class="cl">    <span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s1">&#39;spark.driver.maxResultSize&#39;</span><span class="p">,</span> <span class="s1">&#39;10G&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="bp">self</span><span class="o">.</span><span class="n">sc</span> <span class="o">=</span> <span class="n">SparkContext</span><span class="p">(</span><span class="n">conf</span><span class="o">=</span><span class="n">conf</span><span class="p">)</span>
</span></span></code></pre></div><h2 id="for-loop-越跑越慢">for loop 越跑越慢</h2>
<p>使用 repartition() 或 checkpoint() 可以解決這問題<br>
<a href="https://changhsinlee.com/pyspark-dataframe-basics/">https://changhsinlee.com/pyspark-dataframe-basics/</a></p>
]]></content></item><item><title>Linux 開機自啟動 Jupyter</title><link>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/run-jupyter-on-boot/</link><pubDate>Wed, 07 Mar 2018 18:43:51 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/run-jupyter-on-boot/</guid><description>環境 Ubuntu 16.04 桌面版 Anaconda 3.6 方法 用管理員權限使用 emacs1 打開 /etc/rc.local sudo emacs /etc/rc.local 加入下面兩行(請隨自己的設定改變) 說明 $user_name 是指自己的使用者名稱 su $user_name 是要以該使用者的身分執行</description><content type="html"><![CDATA[<h1 id="環境">環境</h1>
<ul>
<li>Ubuntu 16.04 桌面版</li>
<li>Anaconda 3.6</li>
</ul>
<h1 id="方法">方法</h1>
<ol>
<li>
<p>用管理員權限使用 emacs<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> 打開 /etc/rc.local</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo emacs /etc/rc.local
</span></span></code></pre></div></li>
<li>
<p>加入下面兩行(請隨自己的設定改變)
說明</p>
<ul>
<li>$user_name 是指自己的使用者名稱</li>
<li>su $user_name 是要以該使用者的身分執行</li>
<li>/home/$user_name/anaconda3/envs/DL3/bin/jupyter 則是你執行 jupyter 的位置，這裡是以 ubuntu 下的 anaconda 為例</li>
<li>lab 跟 notebook 分別是執行 <a href="https://github.com/jupyterlab/jupyterlab">jupyter lab</a> 跟 <a href="http://jupyter.org/">jupyter notebook</a>，看個人需要使用</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">su <span class="nv">$user_name</span> -c <span class="s2">&#34;/home/</span><span class="nv">$user_name</span><span class="s2">/anaconda3/envs/DL3/bin/jupyter lab --no-browser;&#34;</span> <span class="p">&amp;</span>
</span></span><span class="line"><span class="cl">su <span class="nv">$user_name</span> -c <span class="s2">&#34;/home/</span><span class="nv">$user_name</span><span class="s2">/anaconda3/envs/DL3/bin/jupyter notebook --port 8889 --no-browser;&#34;</span> <span class="p">&amp;</span>
</span></span></code></pre></div><p>所以我是</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">su sappy -c <span class="s2">&#34;/home/sappy/anaconda3/envs/DL3/bin/jupyter lab --no-browser;&#34;</span> <span class="p">&amp;</span>
</span></span><span class="line"><span class="cl">su sappy -c <span class="s2">&#34;/home/sappy/anaconda3/envs/DL3/bin/jupyter notebook --port 8889 --no-browser;&#34;</span> <span class="p">&amp;</span>
</span></span></code></pre></div></li>
<li>
<p>可以使用下面的指令來協助除錯，詳細可以看<a href="http://linux.vbird.org/linux_basic/0510osloader.php#rc.local">這篇文章</a></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">systemctl status rc-local.service
</span></span></code></pre></div></li>
</ol>
<h1 id="結論">結論</h1>
<p>rc.local 雖然已經過時了，但是&hellip;&hellip;能用就好 😁 😁</p>
<h1 id="參考">參考</h1>
<ul>
<li><a href="http://linux.vbird.org/linux_basic/0510osloader.php">鳥哥的 Linux 私房菜</a></li>
<li><a href="https://stackoverflow.com/questions/44231789/run-jupyter-notebook-on-boot-on-ubuntu">server - Run Jupyter-notebook on boot on Ubuntu - Stack Overflow</a></li>
</ul>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>一種編輯器&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content></item><item><title>Pytorch 學習筆記</title><link>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/pytorch-learning-get-start/</link><pubDate>Tue, 06 Mar 2018 22:44:40 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/pytorch-learning-get-start/</guid><description>資源 官方教學 - 六十分鐘學會 Pytorch 六十分鐘學會 Pytorch - 中文翻譯 六十分鐘學會 Pytorch - 我的畫注 深度学习框架PyTorch：入门与实践 - 程式碼 這裡補充一些 Variable 的小</description><content type="html"><![CDATA[<h1 id="資源">資源</h1>
<ul>
<li>
<p><a href="http://pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html">官方教學 - 六十分鐘學會 Pytorch</a></p>
</li>
<li>
<p><a href="https://zhuanlan.zhihu.com/p/25572330">六十分鐘學會 Pytorch - 中文翻譯</a></p>
</li>
<li>
<p><a href="https://goo.gl/YBKk2s">六十分鐘學會 Pytorch - 我的畫注</a></p>
</li>
<li>
<p><a href="https://github.com/chenyuntc/pytorch-book">深度学习框架PyTorch：入门与实践 - 程式碼</a></p>
</li>
</ul>
<p>這裡補充一些 Variable 的小東西</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">a</span> <span class="o">=</span> <span class="n">Variable</span><span class="p">(</span><span class="n">torch</span><span class="o">.</span><span class="n">Tensor</span><span class="p">([</span><span class="mi">3</span><span class="p">]),</span> <span class="n">requires_grad</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">b</span> <span class="o">=</span> <span class="n">Variable</span><span class="p">(</span><span class="n">torch</span><span class="o">.</span><span class="n">Tensor</span><span class="p">([</span><span class="mi">4</span><span class="p">]),</span> <span class="n">requires_grad</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">d</span> <span class="o">=</span> <span class="n">a</span><span class="o">.</span><span class="n">pow</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> <span class="o">+</span> <span class="n">b</span> <span class="c1"># a^2 + b</span>
</span></span></code></pre></div><p>可以透過 算出 梯度</p>
<pre tabindex="0"><code class="language-pytohn" data-lang="pytohn">d.backward()
print(a.grad)
print(b.grad)
</code></pre><p>輸出是</p>
<pre tabindex="0"><code class="language-output" data-lang="output">Variable containing:
 6
[torch.FloatTensor of size 1]

Variable containing:
 1
[torch.FloatTensor of size 1]
</code></pre><p>透過 grad_fn 可以看出計算圖(Computation Graph)長成甚麼樣子</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">d</span><span class="o">.</span><span class="n">grad_fn</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">d</span><span class="o">.</span><span class="n">grad_fn</span><span class="o">.</span><span class="n">next_functions</span><span class="p">)</span>
</span></span></code></pre></div><p>輸出</p>
<pre tabindex="0"><code class="language-output" data-lang="output">&lt;AddBackward1 object at 0x7f73196e5eb8&gt;
((&lt;PowBackward0 object at 0x7f73196e5ba8&gt;, 0), (&lt;AccumulateGrad object at 0x7f73196e5b38&gt;, 0))
</code></pre>]]></content></item><item><title>安裝 markdown-it</title><link>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/markdown-it-install/</link><pubDate>Sun, 04 Mar 2018 19:47:58 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/markdown-it-install/</guid><description>起因 由於發現預設的 render 功能有點少，因此換了一下 renderer 安裝 主要參考 Hexo 研究筆記 1 hexo-next 使用hexo-renderer-markdown-it 但是發現 markdonw-it 的套</description><content type="html"><![CDATA[<h1 id="起因">起因</h1>
<p>由於發現預設的 render 功能有點少，因此換了一下 renderer</p>
<h1 id="安裝">安裝</h1>
<p>主要參考</p>
<ul>
<li><a href="https://dwatow.github.io/2017/06-18-about-hexo/re-equip-hexo1/#fn1">Hexo 研究筆記 1</a></li>
<li><a href="https://david6686.github.io/blog/Silentink/13325/">hexo-next 使用hexo-renderer-markdown-it</a></li>
</ul>
<p>但是發現 markdonw-it 的套件已經很久沒更新了
因此使用下面這行直接從 github 上安裝即可
<code>npm install git+https://github.com/hexojs/hexo-renderer-markdown-it.git —save</code></p>
]]></content></item><item><title>測試 markdown-it</title><link>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/markdown-it-test/</link><pubDate>Sun, 04 Mar 2018 18:46:32 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/markdown-it-test/</guid><description>markdown-it-footnote Footnote 1 link1. Footnote 2 link2. Inline footnote^[Text of inline footnote] definition. Duplicated footnote reference2. markdown-it-abbr This is HTML abbreviation example. It converts &amp;ldquo;HTML&amp;rdquo;, but keep intact partial entries like &amp;ldquo;xxxHTMLyyy&amp;rdquo; and so on. *[HTML]: Hyper Text Markup Language hexo-filter-github-emojis Hello✨Test 👽 Footnote can have markup and multiple paragraphs.&amp;#160;&amp;#x21a9;&amp;#xfe0e; Footnote text.&amp;#160;&amp;#x21a9;&amp;#xfe0e;&amp;#160;&amp;#x21a9;&amp;#xfe0e;</description><content type="html"><![CDATA[<h1 id="markdown-it-footnote">markdown-it-footnote</h1>
<p>Footnote 1 link<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>.</p>
<p>Footnote 2 link<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>.</p>
<p>Inline footnote^[Text of inline footnote] definition.</p>
<p>Duplicated footnote reference<sup id="fnref1:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>.</p>
<h1 id="markdown-it-abbr">markdown-it-abbr</h1>
<p>This is HTML abbreviation example.
It converts &ldquo;HTML&rdquo;, but keep intact partial entries like &ldquo;xxxHTMLyyy&rdquo; and so on.
*[HTML]: Hyper Text Markup Language</p>
<h1 id="hexo-filter-github-emojis">hexo-filter-github-emojis</h1>
<p>Hello✨Test
👽</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Footnote <strong>can have markup</strong></p>
<p>and multiple paragraphs.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Footnote text.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a>&#160;<a href="#fnref1:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content></item><item><title>protobuf install</title><link>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/protobuf-install/</link><pubDate>Sat, 14 Oct 2017 09:37:58 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/protobuf-install/</guid><description>前言 最近在弄 caffe 的安裝，過程中需要安裝到 opencv，但opencv又需要安裝到 protobuf 環境 ubuntu 17.04 過程 基本上按照官網做就好了，唯一需要注意的是，如果有</description><content type="html"><![CDATA[<h1 id="前言">前言</h1>
<p>最近在弄 caffe 的安裝，過程中需要安裝到 opencv，但opencv又需要安裝到 protobuf</p>
<h1 id="環境">環境</h1>
<ul>
<li>ubuntu 17.04</li>
</ul>
<h1 id="過程">過程</h1>
<p>基本上按照官網做就好了，唯一需要注意的是，如果有安裝 anconda ，可能會吃到anaconda內建的libtool，因此我的作法是更新anaconda的libtool，讓它版本相符合</p>
]]></content></item><item><title>update-alternatives 多版本控制</title><link>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/update-alternatives/</link><pubDate>Mon, 09 Oct 2017 18:14:32 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/update-alternatives/</guid><description>起因 因為要安裝 cuda ,但是我的 gcc/g++ 版本已經到了6.3了,因此得想辦法降回 4.x 解法 參考 注意: 優先度（install 最後的數字）是按照 大到小的 更詳細的參</description><content type="html"><![CDATA[<h1 id="起因">起因</h1>
<p>因為要安裝 cuda ,但是我的 gcc/g++ 版本已經到了6.3了,因此得想辦法降回 4.x</p>
<h1 id="解法">解法</h1>
<p><a href="https://askubuntu.com/a/26518/745445">參考</a>
注意: 優先度（install 最後的數字）是按照 大到小的</p>
<p><a href="http://blog.csdn.net/jasonding1354/article/details/50470109">更詳細的參數</a></p>
<p>可以用 &ndash;query 來找有沒有替代板</p>
]]></content></item><item><title>Tensorflow with Gpu 安裝教學</title><link>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/tensorflow-gpu-install/</link><pubDate>Thu, 28 Sep 2017 22:34:55 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/tensorflow-gpu-install/</guid><description>&lt;h1 id="起因">起因&lt;/h1>
&lt;p>因為教授要求要做物體辨識, 加上實驗室的Server目前暫時不能使用,所以只好先在自己的電腦上面跑&lt;/p>
&lt;h1 id="環境">環境&lt;/h1>
&lt;ul>
&lt;li>Ubuntu 17.04&lt;/li>
&lt;li>Tensorflow 1.3&lt;/li>
&lt;li>Cuda 9.0&lt;/li>
&lt;li>Cudnn 7.0&lt;/li>
&lt;/ul></description><content type="html"><![CDATA[<h1 id="起因">起因</h1>
<p>因為教授要求要做物體辨識, 加上實驗室的Server目前暫時不能使用,所以只好先在自己的電腦上面跑</p>
<h1 id="環境">環境</h1>
<ul>
<li>Ubuntu 17.04</li>
<li>Tensorflow 1.3</li>
<li>Cuda 9.0</li>
<li>Cudnn 7.0</li>
</ul>
<h1 id="過程">過程</h1>
<ol>
<li>
<p>安裝 nvidia 的驅動程式</p>
</li>
<li>
<p>安裝 cuda - 從官方網站上的 deb 包安裝即可</p>
</li>
<li>
<p>cudnn 要手動安裝,所以先下載 tar 檔案,</p>
<p>進到放著tar的資料夾</p>
<p>用 下面指令解壓縮</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">tar -xzvf cudnn-9.0-linux-x64-v7.tgz
</span></span></code></pre></div><p>複製到目錄</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">$ sudo cp cuda/include/cudnn.h /usr/local/cuda/include
</span></span><span class="line"><span class="cl">$ sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
</span></span><span class="line"><span class="cl">$ sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*
</span></span></code></pre></div><p>​</p>
</li>
<li>
<p>到 <code>/usr/local/cuda/lib64</code> 底下</p>
<p>使用下面指令, 創造一個軟連結 （因為 Tensorflow 使用 cudnn 6.0, 所以要用這方法把 讓它可以使用 libcudnn.so.6 這個檔案）</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">ln -s libcudnn.so.7.* libcudnn.so.6
</span></span></code></pre></div></li>
<li>
<p>用 pip 安裝 tensorflow with Gpu</p>
</li>
<li>
<p>在 <code>~/.bashrc</code> 最底下加上</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">CUDA_HOME</span><span class="o">=</span>/usr/local/cuda/
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">LD_LIBRARY_PATH</span><span class="o">=</span><span class="s2">&#34;</span><span class="nv">$LD_LIBRARY_PATH</span><span class="s2">:/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64&#34;</span>
</span></span></code></pre></div></li>
</ol>
<h2 id="選用">選用</h2>
<p>如要使用 pycharm 要記得幫它加上環境變數</p>]]></content></item><item><title>Ubuntu 調整硬碟大小教學</title><link>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/ubuntu-resize-disk/</link><pubDate>Thu, 14 Sep 2017 21:13:33 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/ubuntu-resize-disk/</guid><description>前言 最近在安裝 opencv 時，因為VM硬碟大小不夠，所以只好擴充硬碟大小，但是 root partition 好像沒辦法在開機時調整大小(不確定)，所以這次用 Gparted 過程 首先，先用 live cd</description><content type="html"><![CDATA[<h1 id="前言">前言</h1>
<p>最近在安裝 opencv 時，因為VM硬碟大小不夠，所以只好擴充硬碟大小，但是 root partition 好像沒辦法在開機時調整大小(不確定)，所以這次用 Gparted</p>
<h1 id="過程">過程</h1>
<p>首先，先用 live cd 做開機
<a href="http://xx3d2ybnf.pixnet.net/blog/post/128713507-vmware%25E8%2599%259B%25E6%2593%25AC%25E6%25A9%259F%25E5%2599%25A8%25E9%2580%25B2%25E5%2585%25A5bios%25E6%2588%2596%25E6%2598%25AF%25E9%2596%258B%25E6%25A9%259F%25E9%2581%25B8%25E5%2596%25AEboot-menu%25E7%259A%2584">參考這篇</a></p>
<p>然後打開 Gparted
會看到被紅色圈起來的部分，然後對她右鍵，按下 swapoff
<img src="images/snipaste_20170914_211549.png" alt="snipaste_20170914_211549">
然後把他移動到右邊(先擴充到右邊，移過去，再縮小)，並且在對他右鍵做swapon 就完成了(灑花花</p>
]]></content></item><item><title>OpenCV 安裝教學</title><link>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/opencv-install/</link><pubDate>Thu, 14 Sep 2017 16:07:33 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/opencv-install/</guid><description>前言 因為教授要求安裝 opencv，但是因為 opencv 安裝複雜，所以在此紀錄一下 環境要求 opencv3.3 ubuntu 17.04 安裝紀錄 首先，我是參考 How to install OpenCV 3.1 on Ubuntu 14.04 64bits 以及官方文件 一開</description><content type="html"><![CDATA[<h1 id="前言">前言</h1>
<p>因為教授要求安裝 opencv，但是因為 opencv 安裝複雜，所以在此紀錄一下</p>
<h1 id="環境要求">環境要求</h1>
<ul>
<li>opencv3.3</li>
<li>ubuntu 17.04</li>
</ul>
<h1 id="安裝紀錄">安裝紀錄</h1>
<p>首先，我是參考 <a href="https://gist.github.com/MarcWang/0547f87cf777b6576275">How to install OpenCV 3.1 on Ubuntu 14.04 64bits</a>
以及<a href="http://docs.opencv.org/trunk/d7/d9f/tutorial_linux_install.html">官方文件</a></p>
<p>一開始我是先 按照 <a href="https://gist.github.com/MarcWang/0547f87cf777b6576275">How to install OpenCV 3.1 on Ubuntu 14.04 64bits</a> 安裝</p>
<p>在下面這行遇到一些困難</p>
<pre tabindex="0"><code>sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev
</code></pre><p>首先，libjasper-dev 已經被從 ubuntu 17 上移除了，所以我是透過 <a href="https://stackoverflow.com/a/44488374/4754280">這個方法</a> 來安裝 ubuntu 16 版的 libjasper-dev
其次
libpng12-dev 已經被 libpng12-0 所取代了，所以把上面的這部分換掉即可</p>
<p>這裡說明一下比較會用到的編譯的參數( <a href="http://docs.opencv.org/trunk/d7/d9f/tutorial_linux_install.html">官方文件</a> 上都找的到)</p>
<pre tabindex="0"><code>cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D INSTALL_C_EXAMPLES=OFF \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \
    -D BUILD_EXAMPLES=ON ..
</code></pre><ul>
<li>CMAKE_BUILD_TYPE 可以設為 Release or Debug</li>
<li>最後的 .. 是指 opencv 原始碼的路徑</li>
<li>OPENCV_EXTRA_MODULES_PATH 要放 opencv_contrib/modules 的路徑</li>
</ul>
<p>之後參考<a href="http://cccharles.pixnet.net/blog/post/338054801-%25E5%259C%25A8ubuntu-16.04%25E5%25AE%2589%25E8%25A3%259Dopencv-3.1">這篇</a> 安裝 Anaconda 的 opencv 以及一些加速器</p>
<p>最後做完一些測試就OK了 ^^</p>
]]></content></item><item><title>[Onenote]把pdf列印在同一頁</title><link>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/onenote-print-pdf-in-one-page/</link><pubDate>Tue, 22 Aug 2017 10:39:58 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/onenote-print-pdf-in-one-page/</guid><description>前因 因為想讓Onenote的Pdf可以放在同一頁而不被切割成好幾頁，所以上網稍微找了一下方法 解法 到 檔案 -&amp;gt; 選項 -&amp;gt; 進階 (英文的話會是File -&amp;gt; Options</description><content type="html"><![CDATA[<h1 id="前因">前因</h1>
<p>因為想讓Onenote的Pdf可以放在同一頁而不被切割成好幾頁，所以上網稍微找了一下方法</p>
<h1 id="解法">解法</h1>
<p>到 檔案 -&gt; 選項 -&gt; 進階 (英文的話會是File -&gt; Options -&gt; Advanced)
找到 在多頁上插入長的列印成品 (Insert long printouts on multiple pages) 並把他取消打勾，這樣就可以了 ^^</p>
<h1 id="參考">參考</h1>
<p><a href="https://social.technet.microsoft.com/Forums/office/en-US/f5ac4d90-b92a-446f-b766-0e5ff3445187/how-to-print-multiple-page-pdfs-onto-a-single-onenote-page?forum=officeitpro">How to print multiple page PDFs onto a single Onenote Page?</a></p>
]]></content></item><item><title>cmder 設定</title><link>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/cmder-setting/</link><pubDate>Sun, 20 Aug 2017 14:33:20 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/cmder-setting/</guid><description>緣由 因為最近開始在找 windows 10 系統上好用的另列命令列工具, 在友人的推薦下使用了這個 安裝 由於他的安裝只是把它解壓縮而已, 在此就不多說了 設定 ls 中文資料</description><content type="html"><![CDATA[<h1 id="緣由">緣由</h1>
<p>因為最近開始在找 windows 10 系統上好用的另列命令列工具, 在友人的推薦下使用了這個</p>
<h1 id="安裝">安裝</h1>
<p>由於他的安裝只是把它解壓縮而已, 在此就不多說了</p>
<h1 id="設定">設定</h1>
<h2 id="ls-中文資料夾亂碼">ls 中文資料夾亂碼</h2>
<ol>
<li>打開Settings (快速鍵 win+ctrl+p)</li>
<li>在Settings &gt; Startup &gt; Environment裡加入：set LANG=zh_TW.UTF8</li>
<li>重開</li>
</ol>
<h2 id="更改初始資料夾">更改初始資料夾</h2>
<ol>
<li>切到 setting -&gt; Startup -&gt; Tasks -&gt; {cmd}</li>
<li>最後面加入(D:\Data 可以換成你想要的路徑)</li>
</ol>
<pre tabindex="0"><code>-new_console:d:&#34;D:\Data&#34;
</code></pre><h1 id="參考資料">參考資料</h1>
<p><a href="http://zwindr.blogspot.tw/2016/01/cmder-setting-1.html">子風的知識庫</a></p>
]]></content></item><item><title>dpkg: error processing archive *</title><link>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/dpkg-fail/</link><pubDate>Sat, 19 Aug 2017 12:39:58 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/dpkg-fail/</guid><description>前提 在更新時遇到 dpkg: error processing archive /var/cache/apt/archives/python-lldb-6.0_1%3a6.0~svn310966-1~exp1_amd64.deb (--unpack): trying to overwrite &amp;#39;/usr/lib/python2.7/dist-packages/lldb&amp;#39;, which is also in package python-lldb-4.0 1:4.0-1ubuntu1 看到網路上的解法 sudo dpkg --force-all -i /var/cache/apt/archives/linux-libc-dev_3.13.0-88.135_armhf.deb 於是稍微修改一下，變成 sudo dpkg --force-all -i /var/cache/apt/archives/python-lldb-6.0_1%3a6.0~svn310966-1~exp1_amd64.deb 就大功告成了</description><content type="html"><![CDATA[<h1 id="前提">前提</h1>
<p>在更新時遇到</p>
<pre tabindex="0"><code>dpkg: error processing archive /var/cache/apt/archives/python-lldb-6.0_1%3a6.0~svn310966-1~exp1_amd64.deb (--unpack): trying to overwrite &#39;/usr/lib/python2.7/dist-packages/lldb&#39;, which is also in package python-lldb-4.0 1:4.0-1ubuntu1
</code></pre><p>看到網路上的<a href="https://github.com/dnschneid/crouton/issues/2631">解法</a></p>
<pre tabindex="0"><code>sudo dpkg --force-all -i /var/cache/apt/archives/linux-libc-dev_3.13.0-88.135_armhf.deb
</code></pre><p>於是稍微修改一下，變成</p>
<pre tabindex="0"><code>sudo dpkg --force-all -i /var/cache/apt/archives/python-lldb-6.0_1%3a6.0~svn310966-1~exp1_amd64.deb
</code></pre><p>就大功告成了</p>
]]></content></item><item><title>如何在github上建立gitlab的鏡像</title><link>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/gitlab-mirror-to-github/</link><pubDate>Tue, 15 Aug 2017 14:47:27 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/gitlab-mirror-to-github/</guid><description>起因 因為 gitlab 上相對於 github 的可玩性跟福利都比較大所以打算逐漸遷移過去, 然而由於 github 上使用的人數依然比較多, 便想說能不能在 github 上面建立一個 gitlab 的複製版 設定</description><content type="html"><![CDATA[<h1 id="起因">起因</h1>
<p>因為 gitlab 上相對於 github 的可玩性跟福利都比較大所以打算逐漸遷移過去, 然而由於 github 上使用的人數依然比較多, 便想說能不能在 github 上面建立一個 gitlab 的複製版</p>
<!-- raw HTML omitted -->
<h1 id="設定">設定</h1>
<ol>
<li>先在 github 上新開一個對應的 repo</li>
<li><a href="https://github.com/settings/tokens/new?scopes=repo&amp;description=GitLab+mirror">產生 token</a></li>
<li>先進入這裡 <img src="http://i.imgur.com/ukP9eme.png" alt="gitlab ui"></li>
<li>打勾, 並且按照格式輸入 <img src="http://i.imgur.com/zUVMT7l.png" alt="gitlab ui"></li>
<li>按下存檔並且更新(可能要等一段時間), 如果你發現github上的repo有新檔案了(更新完後等 3~5分鐘),那就代表你成功了(灑花花)</li>
</ol>
<h1 id="參考資料">參考資料</h1>
<p><a href="https://espadav8.co.uk/2016/08/22/gitlab-mirror-pushing-to-github/">espadav8 blog</a></p>
]]></content></item><item><title>R RStudio 安裝教學</title><link>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/rstudio-install/</link><pubDate>Wed, 28 Jun 2017 00:22:33 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/rstudio-install/</guid><description>起因 因為之前在 Ubuntu 上安裝 RStudio 時遇到一點問題，便把過程記錄下來，並讓其他人參考 安裝過程 (2017 / 06 /27 安裝) 環境需求 硬體需求 至少 1GB RAM 軟體需求 Ubuntu 17.04 要有roo</description><content type="html"><![CDATA[<h1 id="起因">起因</h1>
<p>因為之前在 Ubuntu 上安裝 RStudio 時遇到一點問題，便把過程記錄下來，並讓其他人參考</p>
<h1 id="安裝過程">安裝過程</h1>
<blockquote>
<p>(2017 / 06 /27  安裝)</p>
</blockquote>
<h1 id="環境需求">環境需求</h1>
<ul>
<li>
<p>硬體需求</p>
<ul>
<li>至少 1GB RAM</li>
</ul>
</li>
<li>
<p>軟體需求</p>
<ul>
<li>Ubuntu 17.04</li>
<li>要有root or sudo 的權限</li>
</ul>
</li>
</ul>
<!-- raw HTML omitted -->
<h1 id="第一步---安裝-r">第一步 - 安裝 R</h1>
<p>因為 Ubuntu 預設的 R 通常版本都很舊，所以要用到外部別人包好的 R 套件
這裡使用 CRAN 維護的版本</p>
<p><!-- raw HTML omitted --><strong>注意!! 請選擇可信賴的外部團體維護的版本</strong><!-- raw HTML omitted --></p>
<p>輸入下列指令</p>
<pre tabindex="0"><code>sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9
</code></pre><p>你將會看到如下的輸出
<img src="https://i.imgur.com/MxCrJIr.png" alt=""></p>
<p>再來把套件來源加入到套件管理系統的列表中
<!-- raw HTML omitted --><strong>請把最後的zesty換成你ubuntu的版本</strong><!-- raw HTML omitted -->
請參考<a href="https://wiki.ubuntu.com/Releases">版本名稱對照表</a></p>
<pre tabindex="0"><code>sudo add-apt-repository &#39;deb [arch=amd64,i386] https://cran.rstudio.com/bin/linux/ubuntu zesty/&#39;
</code></pre><p>更新你的列表資訊</p>
<pre tabindex="0"><code>sudo apt-get update
</code></pre><p>如果成功你可能會看到如下輸出(get 後的數字不一定會一樣)
<img src="https://i.imgur.com/C6jkVzl.png" alt=""></p>
<p>最後就可以安裝R 了</p>
<pre tabindex="0"><code>sudo apt-get install r-base
</code></pre><p>如果一切順利，沒有跑出錯誤的訊息那應該就代表你成功了(灑花花</p>
<h1 id="第二步---安裝-rstudio">第二步 - 安裝 Rstudio</h1>
<p>他有分成兩個版本</p>
<ul>
<li>Server 版</li>
<li>Desktop 版
我只有安裝 Desktop版，所以Server板我不清楚怎麼安裝
所以要安裝Server版的請看</li>
</ul>
<p><a href="https://www.rstudio.com/products/rstudio/download-server/">Server 版安裝方式</a></p>
<p>Desktop 版安裝方式</p>
<ol>
<li>
<p>先去 Rstudio 的官網把 Rstudio 的安裝套件抓下來
a. <a href="https://www.rstudio.com/products/rstudio/download/">快速連結</a></p>
</li>
<li>
<p>找到你要的版本並下載
a. <img src="https://i.imgur.com/fDVGiIx.png" alt=""></p>
<p>b. 看你是 32 bit or 64 bit
c. Command Line (小黑窗) 底下可以用底下的命令</p>
<pre tabindex="0"><code>wget 下載網址 
</code></pre></li>
<li>
<p>因為 RStudio 的新版本加入了兩個相依套件，所以要先安裝
a. 到 <a href="https://packages.debian.org/jessie/amd64/libgstreamer-plugins-base0.10-0/download">https://packages.debian.org/jessie/amd64/libgstreamer-plugins-base0.10-0/download</a> ， 下載 libgstreamer-plugins-base0.10-0_0.10.36-2_amd64.deb</p>
<p>b. 到  <a href="https://packages.debian.org/jessie/amd64/libgstreamer0.10-0/download">https://packages.debian.org/jessie/amd64/libgstreamer0.10-0/download</a> 下載 libgstreamer0.10-0_0.10.36-1.5_amd64.deb</p>
<p>c.使用 sudo dpkg -i  剛剛下載的兩個套件名稱 安裝套件，大概長這樣 並補充一下，用tab鍵可以自動補全名稱，但是要在同一個目錄底下</p>
<pre tabindex="0"><code>sudo dpkg -i  libgstreamer-plugins-base0.10-0_0.10.36-2_amd64.deb libgstreamer0.10-0_0.10.36-1.5
</code></pre><p>d. 安裝另外兩個相依套件</p>
<pre tabindex="0"><code>sudo apt install libjpeg62 libedit2
</code></pre><p>e. 最後 安裝 Rstudio</p>
<pre tabindex="0"><code>sudo dpkg -i rstudio-1.0.143-amd64.deb
</code></pre><p><img src="https://i.imgur.com/TTSfnFF.png" alt=""></p>
</li>
</ol>
<p>到這裡就大功告成啦XDD</p>
]]></content></item><item><title>ycmd-install</title><link>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/ycmd-install/</link><pubDate>Sat, 27 May 2017 21:47:33 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/ycmd-install/</guid><description>什麼是ycmd ycmd原本是在vim上的You-Complete-Me, 而後作者把補全部分單獨分離出來做為一個後端,使其他編輯器也能享受這種</description><content type="html"><![CDATA[<h1 id="什麼是ycmd">什麼是ycmd</h1>
<p>ycmd原本是在vim上的You-Complete-Me, 而後作者把補全部分單獨分離出來做為一個後端,使其他編輯器也能享受這種神級的補全系統.
我目前主要是用它來補全c++,但是他還能夠補全像是go,JS之類的語言,可說是十分全能</p>
<!-- raw HTML omitted -->
<h1 id="安裝">安裝</h1>
<h2 id="安裝環境">安裝環境</h2>
<p>我的環境是spacemacs + ubuntu 17.04 , 由於spacemacs已經有人幫忙把常用的包都設定好了,所以設定起來可說是相當簡單</p>
<h2 id="安裝-1">安裝</h2>
<ol>
<li>首先,先安裝clang,因為這是ycmd的必要套件,這部分我們參考官網的<a href="https://github.com/Valloric/ycmd#building">安裝說明</a></li>
<li>在dotfile(快捷鍵Space f e d)中, 按照<a href="https://github.com/syl20bnr/spacemacs/tree/master/layers/%2Btools/ycmd#ycmd">spacemacs ycmd layer install</a>安裝</li>
<li>測試收工</li>
</ol>
<h2 id="常見問題">常見問題</h2>
<ul>
<li>如果出現這樣的錯誤訊息</li>
</ul>
<pre tabindex="0"><code>layout: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.20&#39; not found (required by layout)
</code></pre><p>那麼請先<a href="https://askubuntu.com/a/582910">更新你的函式庫</a>
如果你的 python 環境是 anaconda, 那麼<a href="https://askubuntu.com/a/786944">這樣更新</a></p>
<ul>
<li>路徑不正確  - 他的路徑是吃絕對路徑,所以要像是這樣子</li>
</ul>
<pre tabindex="0"><code>  ;;; ycmd 的路徑
  (set-variable &#39;ycmd-server-command &#39;(&#34;python&#34; &#34;/home/sappy5678/emacs_setting/require_plugin/ycmd/ycmd/&#34;))
  ;;; 把要用的資料夾加入白名單
  (setq ycmd-extra-conf-whitelist &#39;(&#34;~/hw/*&#34;))
  ;;; 使用ycmd裡面預設的配置
  (set-variable &#39;ycmd-global-config &#34;/.emacs.d/layers/+tools/ycmd/global_conf.py&#34;)
  ;;; 預設開始起自動補全
  (setq ycmd-force-semantic-completion t)
  (add-hook &#39;doc-view-mode-hook &#39;auto-revert-mode &#39;c++-mode-hook &#39;ycmd-mode)
</code></pre><ul>
<li>要記得安裝auto-complete 讓自動補全的前端顯示出來</li>
</ul>
]]></content></item><item><title>RancherOS安裝教學</title><link>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/rancheros%E5%AE%89%E8%A3%9D%E6%95%99%E5%AD%B8/</link><pubDate>Mon, 01 May 2017 00:14:25 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/rancheros%E5%AE%89%E8%A3%9D%E6%95%99%E5%AD%B8/</guid><description/><content type="html"></content></item><item><title>gdb簡易教學</title><link>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/gdb%E7%B0%A1%E6%98%93%E6%95%99%E5%AD%B8/</link><pubDate>Sat, 08 Apr 2017 17:12:01 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/gdb%E7%B0%A1%E6%98%93%E6%95%99%E5%AD%B8/</guid><description>簡介 gdb 是一種除錯的工具,經常在 Linux 環境中被使用 參考資料 Linux 除錯利器 - GDB 簡介 Debugging with GDB （入門篇） 小技巧 印出ascii或客製化輸出 輸出格式 使用方法 EX: p /c</description><content type="html"><![CDATA[<h1 id="簡介">簡介</h1>
<p>gdb 是一種除錯的工具,經常在 Linux 環境中被使用</p>
<!-- raw HTML omitted -->
<h1 id="參考資料">參考資料</h1>
<ul>
<li><a href="http://tetralet.luna.com.tw/?op=ViewArticle&amp;articleId=187&amp;blogId=1">Linux 除錯利器 - GDB 簡介</a></li>
<li><a href="http://www.study-area.org/goldencat/debug.htm">Debugging with GDB （入門篇）</a></li>
</ul>
<h2 id="小技巧">小技巧</h2>
<h3 id="印出ascii或客製化輸出">印出ascii或客製化輸出</h3>
<ul>
<li><a href="https://sourceware.org/gdb/onlinedocs/gdb/Output-Formats.html">輸出格式</a></li>
<li>使用方法
<ul>
<li>EX: p /c char_string</li>
</ul>
</li>
</ul>
<h3 id="中斷點條件">中斷點條件</h3>
<p><a href="http://stackoverflow.com/questions/4183871/how-do-i-set-a-conditional-breakpoint-in-gdb-when-char-x-points-to-a-string-wh">by StackOverFlow</a></p>
<pre tabindex="0"><code>break x:20 if strcmp(y, &#34;hello&#34;) == 0
</code></pre><p>20 是指行數, x 是可以是任何檔案名稱, 而 y 可以是任何變數</p>
]]></content></item><item><title>Python 簡略教學</title><link>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/python-%E7%B0%A1%E7%95%A5%E6%95%99%E5%AD%B8/</link><pubDate>Sun, 05 Mar 2017 10:39:58 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/python-%E7%B0%A1%E7%95%A5%E6%95%99%E5%AD%B8/</guid><description>安裝 請先到 Anaconda 安裝Anaconda (建議 Python 3.x 版本) 再來到 Pycharm 安裝 IDE (Community 版本是免費的) 安裝完成後, 打開 Pycharm 新增一個 .py 檔, 並輸入 print(&amp;ldquo;Hello World&amp;rdquo;), 之後執行看看, 看看有</description><content type="html"><![CDATA[<h1 id="安裝">安裝</h1>
<ol>
<li>請先到 <a href="https://www.continuum.io/downloads">Anaconda</a> 安裝Anaconda (建議 Python 3.x 版本)</li>
<li>再來到 <a href="https://www.jetbrains.com/pycharm/download/#section=windows">Pycharm</a> 安裝 IDE (Community 版本是免費的)</li>
<li>安裝完成後, 打開 Pycharm 新增一個 .py 檔, 並輸入 print(&ldquo;Hello World&rdquo;), 之後執行看看, 看看有沒有印出 Hello World</li>
</ol>
<!-- raw HTML omitted -->
<h1 id="基本語法">基本語法</h1>
<h2 id="使用方式">使用方式</h2>
<ul>
<li>我會盡量為每個部份都寫一些教學以及練習題, 讓大家可以更快速的上手</li>
<li><a href="https://repl.it/classroom/invite/DacYfXQ">練習題</a> 如果想要練習的人可以進來<a href="https://repl.it/classroom/invite/DacYfXQ">這邊</a>, 裡面有一些基礎題讓大家練習</li>
</ul>
<h2 id="基本輸入輸出">基本輸入輸出</h2>
<h3 id="輸出">輸出</h3>
<p>Python 是個很口語化的程式語言
如同你剛才所看到的</p>
<pre tabindex="0"><code class="language-python=" data-lang="python=">print(&#34;Hello World&#34;)
</code></pre><p>便代表著印出 Hello World 這幾個單字, 當然, 中文也是OK的, 只要你將他包裹在 &quot;&quot; 兩個引號之中
便可以將他印出來, 現在換你來試試看</p>
<!-- raw HTML omitted -->
<h3 id="輸入">輸入</h3>
<p>至於要如何輸入呢?
Python 也提供了很口語化的方法 &quot; input() &quot;
像是這樣</p>
<!-- raw HTML omitted -->
<h2 id="資料型態">資料型態</h2>
<p>但首先, 我們要認識一下變數
變數, 便是我們之前說過的, 給某些東西一個名子
也可以想成是數學中的 x = 1 這種代數
而資料型態則是告訴 Python 你那個東西是什麼, 例如 數字或是字串
Python 常見以下幾種資料型態</p>
<ul>
<li>int (整數): 例如 0 1 2 &hellip;. , 也可以是負數, 像是 -598 -753 -1 之類的</li>
<li>float (浮點數): 也是我們所謂的小數點, 例如 3.1415926 123.999 -3.784 等等,要注意的是, 小數點會有誤差, 所以使用時要特別小心</li>
<li>string (字串): 例如我們一開始的 &ldquo;Hello World&rdquo; 或者是 &ldquo;Input&rdquo; 等等, 這裡要注意的是,字串都要用 &quot;&quot; 兩個引號包起來, 而且你所有的 input() 的值, 都會被當成字串看待</li>
<li>bool (布林): 他只有兩個值, True 和 False, 常用來作為條件判斷用</li>
<li>list (列表): 用來同時存放很多資料的型態, 類似於數學上的矩陣,之後會有更詳細的介紹</li>
<li>tuple (元組): 跟 list 類似, 最大的不同在於這個是不能改變的, 之後會有更詳細的介紹</li>
<li>dict (字典): 存放很多資料的型態,常用於做出類似層級的概念, 之後會有更詳細的介紹</li>
</ul>
<h3 id="int-整數-float-浮點數">int (整數), float (浮點數)</h3>
<p>廢話不多說, 直接進入正題</p>
<!-- raw HTML omitted -->
<h3 id="list-列表-tuple-元組">list (列表), tuple (元組)</h3>
<!-- raw HTML omitted -->
<h3 id="dict-字典">dict (字典)</h3>
<!-- raw HTML omitted -->
<h2 id="流程控制">流程控制</h2>
<p>我們已經學會了那麼多的型態, 然而, 當情況變得更複雜時, 我們可能會遇到一些需要判斷的問題.  例如, 當我們要判斷考試的成績是否及格時, 要怎麼做呢?
所以我們接下來就要學到如何判斷.
希望大家還記得我們之前說道的 bool 嗎? 他只有 True 跟 False 兩種型態, 接下來我們就會使用他來做判斷
一些基本的條件判斷:
* &gt;= 大於等於
* &gt;  大於
* == 等於
* &lt;= 小於等於
* &lt;  小於
* != 不等於</p>
<h3 id="if-elif-else">if elif else</h3>
<ul>
<li>if - 如果, 你可以把他想像成如果條件為真的話, 要做些甚麼</li>
<li>elif - 當第一個條件不符合時, 就會來檢查這裡的條件, elif 是 else if 的縮寫</li>
<li>else - 其他, 就是當上面所有條件都不符合時, 就會來執行這裡面的動作
接下來是例行的範例時間XDD</li>
</ul>
<!-- raw HTML omitted -->
<h3 id="for-while">for while</h3>
<p>如果我們現在要印出 1 ~ 100 要怎麼辦呢?
如果只能夠 一個個慢慢印出來那不是要印 100 次嗎?
所以便出現了迴圈, 能夠讓我們執行一些步驟很多次
所以這樣就不需要打 100 次了
直接上範例 XDD</p>
<!-- raw HTML omitted -->
<h2 id="function">function</h2>
<h1 id="library">library</h1>
<h2 id="安裝-1">安裝</h2>
<h2 id="使用">使用</h2>
]]></content></item><item><title>Hello World</title><link>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/hello-world/</link><pubDate>Tue, 28 Jun 2016 00:22:33 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E9%9B%9C%E8%AB%87/hello-world/</guid><description>Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.
Quick Start Create a new post $ hexo new &amp;#34;My New Post&amp;#34; More info: Writing
Run server $ hexo server More info: Server
Generate static files $ hexo generate More info: Generating
Deploy to remote sites $ hexo deploy More info: Deployment</description><content type="html"><![CDATA[<p>Welcome to <a href="https://hexo.io/">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues">GitHub</a>.</p>
<h2 id="quick-start">Quick Start</h2>
<h3 id="create-a-new-post">Create a new post</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ hexo new <span class="s2">&#34;My New Post&#34;</span>
</span></span></code></pre></div><p>More info: <a href="https://hexo.io/docs/writing.html">Writing</a></p>
<h3 id="run-server">Run server</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ hexo server
</span></span></code></pre></div><p>More info: <a href="https://hexo.io/docs/server.html">Server</a></p>
<h3 id="generate-static-files">Generate static files</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ hexo generate
</span></span></code></pre></div><p>More info: <a href="https://hexo.io/docs/generating.html">Generating</a></p>
<h3 id="deploy-to-remote-sites">Deploy to remote sites</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ hexo deploy
</span></span></code></pre></div><p>More info: <a href="https://hexo.io/docs/deployment.html">Deployment</a></p>
]]></content></item><item><title>社群網路筆記 2</title><link>https://blog.sappy.tw/posts/%E5%A4%A7%E5%AD%B8%E5%AD%B8%E7%BF%92/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF%E7%AD%86%E8%A8%98_2/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://blog.sappy.tw/posts/%E5%A4%A7%E5%AD%B8%E5%AD%B8%E7%BF%92/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF/%E7%A4%BE%E7%BE%A4%E7%B6%B2%E8%B7%AF%E7%AD%86%E8%A8%98_2/</guid><description>社群網路的圖的定義 Node - 點, 個人 Edge - 邊, 人與人的關係 Undirected graph and directed graph undirected graph - 邊沒有特定方向 directed graph - 邊具有方向性 Adjacency matrix - 用矩陣來表達圖的關係, 1 代表有連接,</description><content type="html"><![CDATA[<h1 id="社群網路的圖的定義">社群網路的圖的定義</h1>
<ul>
<li>Node - 點, 個人</li>
<li>Edge - 邊, 人與人的關係
<img src="https://images.sappy.tw/Social_Network/ch2/node_and_edge.png" alt="node_and_edge"></li>
<li>Undirected graph and directed graph
<ul>
<li>undirected graph - 邊沒有特定方向</li>
<li>directed graph - 邊具有方向性
<img src="https://images.sappy.tw/Social_Network/ch2/directed_&amp;_undirected_graph.png" alt="directed_&amp;_undirected_graph"></li>
</ul>
</li>
<li>Adjacency matrix - 用矩陣來表達圖的關係, 1 代表有連接, 0 代表沒有連接
<ul>
<li><a href="http://www.csie.ntnu.edu.tw/~u91029/Graph.html#3">詳情可參考</a></li>
</ul>
</li>
<li>Paths - 路徑, 一連串由 Edge 連接起來的 Node 組成的東西
<ul>
<li>Simple Path - 無重複點的路徑</li>
<li>Cycles - 只有起點跟終點是同一點的路徑
<ul>
<li>特點是 - redundancy - 代表這個圈就算任一邊斷掉，也是相連的</li>
<li>在社群網路中 很常見</li>
</ul>
</li>
</ul>
</li>
<li>Connected Graph - 此 Graph 上任兩點間都有 path ，使之能夠抵達另一點
<ul>
<li>大部分的社群網路都是這樣，越大越是如此</li>
<li>在社群網路中 很常見</li>
</ul>
</li>
<li>Connected components
下面是有三個 node 的範例<br>
<img src="https://images.sappy.tw/Social_Network/ch2/components.png" alt="components"></li>
<li>Giant Components
<ul>
<li>有顯著影響力(很大的)的 Components</li>
<li>幾乎所有的 large network 都有 giant component</li>
<li>幾乎所有大網路都只有一個 giant component
<ul>
<li>因為兩邊所有點都沒連接的機率非常低</li>
<li>假設雙方各有 N 個點，點跟點連接的機率是 99%</li>
<li>則完全沒有點連接的機率是 $0.01*{N^2}$</li>
</ul>
</li>
</ul>
</li>
<li>Distance
<ul>
<li>兩點之間最短距離</li>
<li>用BFS演算法(breadth-first search)找最快
<ul>
<li>First find all friends at a distance of 1</li>
<li>Find all their friends (not including distance-1 friends), and declare these to be distance 2</li>
<li>Repeating this procedure to find friends of farther away<br>
<img src="https://images.sappy.tw/Social_Network/ch2/BFS.png" alt="BFS"></li>
</ul>
</li>
</ul>
</li>
<li>Small-world property
<ul>
<li>Giant Components 中任兩點距離比想像中短</li>
<li>Six degrees of separation
<ul>
<li>每個人走六個點就能夠到達另一點</li>
<li><img src="https://images.sappy.tw/Social_Network/ch2/6-drgrees.png" alt="6-drgrees"></li>
</ul>
</li>
</ul>
</li>
</ul>
]]></content></item></channel></rss>