<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>asterisks</title>
  
  
  <link href="/atom.xml" rel="self"/>
  
  <link href="http://asterisks.netlify.com/"/>
  <updated>2021-05-06T02:40:20.690Z</updated>
  <id>http://asterisks.netlify.com/</id>
  
  <author>
    <name>shundroid</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>TypeScriptで型推論やりすぎな足し算をする関数を作ってみた</title>
    <link href="http://asterisks.netlify.com/2021/05/06/ts-yabai-add/"/>
    <id>http://asterisks.netlify.com/2021/05/06/ts-yabai-add/</id>
    <published>2021-05-06T10:26:23.000Z</published>
    <updated>2021-05-06T02:40:20.690Z</updated>
    
    <content type="html"><![CDATA[<p>こんにちは。shundroidです。<br>最近TypeScriptの型レベルプログラミングにハマっています。</p><p>今回実装する「型推論やりすぎ足し算」をする関数はこちらです。<br>既出だったらごめんなさい。</p><p><img src="https://lh3.googleusercontent.com/pw/ACtC-3d0k0OE2gZtITyfmpsisK-MwM_Uw4p-_8I9DTOM35dhAy2kEOlOF2TR7W4cFwXkQUjonRzj8F-HnFPdD2Y5UH8XZBJG_hhD_sHEQfLRa_Brq2Onf-tRBW-A0op2kkAH13rlfFrKS6baOIR_Eq2IHsLXXA=w700-h104-no?authuser=0" alt></p><p>(画像が読み込めない時用のコード)<br><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 実装省略</span></span><br><span class="line"><span class="keyword">declare</span> <span class="function"><span class="keyword">function</span> <span class="title">add</span>&lt;<span class="title">T</span> <span class="title">extends</span> <span class="title">number</span>, <span class="title">U</span> <span class="title">extends</span> <span class="title">number</span>&gt;(<span class="params">a: T, b: U</span>): <span class="title">Add</span>&lt;<span class="title">T</span>, <span class="title">U</span>&gt;</span>;</span><br><span class="line"><span class="keyword">const</span> a = add(<span class="number">12</span>, <span class="number">34</span>); <span class="comment">// testの型が46になる</span></span><br></pre></td></tr></table></figure></p><p><code>a</code> の<strong>型</strong>が <code>46</code> になり、<strong>型レベルでも足し算をして、その結果を返します</strong>。<br><strong><code>Add&lt;T, U&gt;</code> という型は用意されていないので、これを工夫して作ります。</strong></p><p>TypeScriptには、<a href="https://typescript-jp.gitbook.io/deep-dive/type-system/literal-types" target="_blank" rel="noopener">リテラル型</a>というのがあり、 <code>&quot;hello&quot;</code> や <code>10</code> 、 <code>true</code> などの値も型となりえます。<br>このようにして、型レベルでも足し算を行うのが、この「やりすぎ」関数となっています。</p><p>ちなみに、普通にジェネリクスを使って実装しても、返り値は <code>number</code> となってしまいます。<br><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">add2</span>&lt;<span class="title">T</span> <span class="title">extends</span> <span class="title">number</span>, <span class="title">U</span> <span class="title">extends</span> <span class="title">number</span>&gt;(<span class="params">a: T, b: U</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">return</span> a + b;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">const</span> b = add2(<span class="number">12</span>, <span class="number">34</span>); <span class="comment">// 型はnumber</span></span><br></pre></td></tr></table></figure></p><p><img src="https://lh3.googleusercontent.com/pw/ACtC-3f5bBi62qp03aqewbWTFOdu3SF97nrUiuAkHQKtSInbfCE7PW0hSzsCWpsDibdZzW1RgxqgtYY14u7o4tFogd4_aYF5qBTGjSjDEl5jxPK1fKUGiGM85kYQSiPf-3Suu-sl5RC0kWcU2p6KAeXoGxaGwA=w700-h104-no?authuser=0" alt></p><p>この <code>a + b</code> という演算が返す型はリテラル型ではなく <code>number</code> にされてしまうのですね。</p><h2 id="使用したTypeScriptのバージョン"><a href="#使用したTypeScriptのバージョン" class="headerlink" title="使用したTypeScriptのバージョン"></a>使用したTypeScriptのバージョン</h2><p><strong>TypeScript 4.2.3</strong><br>型レベルプログラミングは、TypeScriptのバージョンの違いをもろに受けるので、気を付けてください。</p><h2 id="足し算部分の実装"><a href="#足し算部分の実装" class="headerlink" title="足し算部分の実装"></a>足し算部分の実装</h2><p>まず、型 <code>Add&lt;T, U&gt;</code> の実装ですが、ここでは簡単に載せます。</p><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">type</span> Repeat&lt;T <span class="keyword">extends</span> <span class="built_in">number</span>, R <span class="keyword">extends</span> <span class="built_in">any</span>[] = []&gt; = R[<span class="string">"length"</span>] <span class="keyword">extends</span> T ? R : Repeat&lt;T, [<span class="built_in">any</span>, ...R]&gt;;</span><br><span class="line"><span class="keyword">type</span> Add&lt;T <span class="keyword">extends</span> <span class="built_in">number</span>, U <span class="keyword">extends</span> <span class="built_in">number</span>&gt; = [...Repeat&lt;T&gt;, ...Repeat&lt;U&gt;][<span class="string">"length"</span>];</span><br></pre></td></tr></table></figure><p>Repeatで任意長(ただし再帰制限のため45程度まで)のTupleを作って、それを用いて足し算します。Tupleの長さが数値リテラル型で返ってくることから、それを足し算結果とします。</p><p>詳しくは別の記事で説明したので、そちらをご覧ください。</p><iframe class="hatenablogcard" style="width: 100%; height: 155px; max-width: 680px;" src="https://hatenablog-parts.com/embed?url=https://asterisks.netlify.app/2021/05/01/ts-tuple-calc/" width="300" height="150" frameborder="0" scrolling="no"></iframe><p>参考はいつもお世話になっているこのサイトのページです。<br><a href="https://kgtkr.net/blog/2020/09/02/typescript-disable-recursion-limit" target="_blank" rel="noopener">https://kgtkr.net/blog/2020/09/02/typescript-disable-recursion-limit</a></p><p>なお、再帰制限を回避してもっと大きな数まで扱いたい場合は、 <code>Multiple&lt;1, ...&gt;</code> を用いる手があります。内部的に文字列操作を行っているのです。この実装はややこしく、ちょっとテーマとそれるので、<a href="https://asterisks.netlify.app/2021/05/01/ts-tuple-calc/#おまけ：Multipleを用いて、より大きい数を作る" target="_blank" rel="noopener">先ほどの記事</a>を参照してください。</p><h2 id="関数部分の実装"><a href="#関数部分の実装" class="headerlink" title="関数部分の実装"></a>関数部分の実装</h2><p>後は、これを関数の定義に含めれば完成です。</p><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">declare</span> <span class="function"><span class="keyword">function</span> <span class="title">add</span>&lt;<span class="title">T</span> <span class="title">extends</span> <span class="title">number</span>, <span class="title">U</span> <span class="title">extends</span> <span class="title">number</span>&gt;(<span class="params">a: T, b: U</span>): <span class="title">Add</span>&lt;<span class="title">T</span>, <span class="title">U</span>&gt;</span>;</span><br></pre></td></tr></table></figure><p><code>T,U</code>は実は引数に応じてリテラル型に推論してくれるみたいです。助かった。</p><p>実装を含める場合は、次のようにします。</p><p><code>a + b</code> は <code>number</code> 型となってしまうので、 <code>as any as</code> が必要です。</p><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">add</span>&lt;<span class="title">T</span> <span class="title">extends</span> <span class="title">number</span>, <span class="title">U</span> <span class="title">extends</span> <span class="title">number</span>&gt;(<span class="params">a: T, b: U</span>): <span class="title">Add</span>&lt;<span class="title">T</span>, <span class="title">U</span>&gt; </span>&#123;</span><br><span class="line">  <span class="keyword">return</span> a + b <span class="keyword">as</span> <span class="built_in">any</span> <span class="keyword">as</span> Add&lt;T, U&gt;;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="まとめ"><a href="#まとめ" class="headerlink" title="まとめ"></a>まとめ</h2><p>型レベルプログラミングが、実際のプログラミングにも役に立ってくるともっと楽しいですね。<br>この関数の使いどころがあるかどうかはわかりませんがw</p><p>今回のプログラムは、<a href="https://www.typescriptlang.org/play?ts=4.2.3#code/C4TwDgpgBAShkENgB4AqUIA9gQHYBMBnKXAVwFsAjCAJwBpYNs8ioFcQBtAXSgF4oPAHz9YnAEQAbPAHNgAC3G8sOAsXQB+RgC5Y8CEjQNO7EAwB0lmNyEBuAFChIUAIL58aJqtZkqtBgCqXizEvtQ0IgKcluZwiCioQhZW+oYBQtwS0rhyitwOAGakuADGwACWAPa4bO6eKiEkFOGBwWpNfhEAFAi6qAyUugEAlLpuHv1Q6VAA3vZQC1A0EMCkNDUIUADUUJRsxKb7rnWT6Q4AvvYl1YTAbKII7l0AjABMDADMACzDDte4hEq0nMkkqMh6v3sQA" target="_blank" rel="noopener">こちら</a>で試すことができます。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;こんにちは。shundroidです。&lt;br&gt;最近TypeScriptの型レベルプログラミングにハマっています。&lt;/p&gt;
&lt;p&gt;今回実装する「型推論やりすぎ足し算」をする関数はこちらです。&lt;br&gt;既出だったらごめんなさい。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://l
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>TypeScriptの型レベルプログラミングで足し算・引き算・掛け算を実装する</title>
    <link href="http://asterisks.netlify.com/2021/05/01/ts-tuple-calc/"/>
    <id>http://asterisks.netlify.com/2021/05/01/ts-tuple-calc/</id>
    <published>2021-05-01T12:59:00.000Z</published>
    <updated>2021-05-06T02:40:20.690Z</updated>
    
    <content type="html"><![CDATA[<p>こんにちは。shundroidです。<br>最近型レベルプログラミングに興味があります。<br>TypeScriptの型機能、気づかぬうちにめちゃくちゃ強くなっていてすごいですね。最大限活用したいですが、実用上は使う機会あるのでしょうか。</p><p>変な型を作るのは楽しいですよね。<br>というわけで、今回は次のような型(<code>Add&lt;T, U&gt;</code> 型、 <code>Minus&lt;T, U&gt;</code> 型、 <code>Multiple&lt;T, U&gt;</code> 型)を実装しようと思います。</p><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">type</span> AddTest = Add&lt;<span class="number">3</span>, <span class="number">5</span>&gt;; <span class="comment">// 8</span></span><br><span class="line"><span class="keyword">type</span> MinusTest = Minus&lt;<span class="number">8</span>, <span class="number">4</span>&gt;; <span class="comment">// 4</span></span><br><span class="line"><span class="keyword">type</span> MultipleTest = Multiple&lt;<span class="number">6</span>, <span class="number">2</span>&gt;; <span class="comment">// 12</span></span><br></pre></td></tr></table></figure><p>さらに、より大きな数にも対応できるために工夫をします。<br>（大きな数には再帰制限が働きやすいので、工夫が必要なのです。後述します）</p><p>最終的には、次くらいの大きさの演算でも行けるようにします。<br><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">type</span> MultipleTest2 = Multiple&lt;<span class="number">20</span>, <span class="number">100</span>&gt;; <span class="comment">// 2000</span></span><br></pre></td></tr></table></figure></p><p>実装にはタプル型を用います。</p><h2 id="なぜタプル型なのか"><a href="#なぜタプル型なのか" class="headerlink" title="なぜタプル型なのか"></a>なぜタプル型なのか</h2><p>まず、型レベルプログラミングでよく扱われる<strong>タプル型</strong>について少し書きます。<br>型レベルプログラミングでは、 <code>0</code> や <code>1</code> 、 <code>2</code> などのリテラル型を、 <code>[]</code> や <code>[any]</code> 、 <code>[any, any]</code> のように、その長さを持ったタプル型に<strong>変換して処理する</strong>ことが多いです。</p><p>これはなぜかというと、タプルにおいて、演算をしていくうえで<strong>不可欠な操作</strong>が可能だからです。<br>この「不可欠な操作」は大きく次の３つになると思います。</p><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 操作1</span></span><br><span class="line"><span class="keyword">type</span> tupleA = [<span class="number">0</span>, <span class="number">1</span>];</span><br><span class="line"><span class="keyword">type</span> tupleB = [...tupleA, <span class="number">2</span>]; <span class="comment">// [0, 1, 2]</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 操作2</span></span><br><span class="line"><span class="keyword">type</span> tupleC = [tupleB] <span class="keyword">extends</span> [infer I, ...any[]] ? [I] : never; <span class="comment">// [0]</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 操作3</span></span><br><span class="line"><span class="keyword">type</span> len = tupleB[<span class="string">"length"</span>] <span class="comment">// 3 (literal type)</span></span><br></pre></td></tr></table></figure><p>すなわち、型プログラミングにおいて、要素の追加(操作1)と、一部取り出し(操作2)があり、<br>そして実用的な表現に戻す手法として、タプル長をリテラル型として取得する(操作3)が存在するのです。</p><h3 id="比較：再帰的な定義"><a href="#比較：再帰的な定義" class="headerlink" title="比較：再帰的な定義"></a>比較：再帰的な定義</h3><p>Haskell などでの関数型プログラミングでは、ペアノの公理的に自然数を次のように定義し、演算を作っていくのが自然でしょう。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Zero, Next&lt;Zero&gt;, Next&lt;Next&lt;Zero&gt;&gt;, ...</span><br></pre></td></tr></table></figure><p>ですが、TypeScriptでは <strong>再帰回数の制限が厳しく</strong> 、あまり値の定義に再帰を使いたくないのです。</p><p>また、既に演算が一部定義されていて、さらに操作3により実用的な表現に落とし込めるタプル型を上回るメリットが、このような再帰的な自然数定義にはありません。</p><p>何だかんだタプル型が強いので、これを使っていきます。</p><h2 id="実装していく"><a href="#実装していく" class="headerlink" title="実装していく"></a>実装していく</h2><h3 id="リテラル型→タプルへの変換"><a href="#リテラル型→タプルへの変換" class="headerlink" title="リテラル型→タプルへの変換"></a>リテラル型→タプルへの変換</h3><p>このサイトを参考に、 <code>Repeat</code> 型を用います。<br><iframe class="hatenablogcard" style="width: 100%; height: 155px; max-width: 680px;" src="https://hatenablog-parts.com/embed?url=https://kgtkr.net/blog/2020/09/02/typescript-disable-recursion-limit" width="300" height="150" frameborder="0" scrolling="no"></iframe><br>（ここに書かれているbrainf*ckインタプリタもなかなか気になっちゃいますね）</p><p>このサイトはマジで凄くて、型プログラミングをするうえで大事なヒントが沢山載っています。<br>眺めているだけでも楽しい。このブログもこういう風にしていきたいですね。</p><p>というわけで、上のサイトを参考に <code>Repeat</code> 型を実装します。<br>ここはそのままです。</p><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">type</span> Repeat&lt;T, N <span class="keyword">extends</span> <span class="built_in">number</span>, R <span class="keyword">extends</span> <span class="built_in">any</span>[] = []&gt; = R[<span class="string">"length"</span>] <span class="keyword">extends</span> N</span><br><span class="line">  ? R</span><br><span class="line">  : Repeat&lt;T, N, [T, ...R]&gt;;</span><br></pre></td></tr></table></figure><p>型プログラミングはかなり可読性が低いですが、このくらいなら分かりやすいですね。<br>再帰を利用して、所定の長さになるまでタプル型を伸ばしています。</p><p>これを用いて数値を表したいので、分かりやすくするため、エイリアスを用意しましょう。</p><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">type</span> ToTupleNum&lt;T <span class="keyword">extends</span> <span class="built_in">number</span>&gt; = Repeat&lt;<span class="built_in">any</span>, T&gt;;</span><br></pre></td></tr></table></figure><p>こうすると、 <code>toTupleNum&lt;4&gt;</code> は <code>[any, any, any, any]</code> 型になります。</p><h3 id="タプル→リテラル型の変換"><a href="#タプル→リテラル型の変換" class="headerlink" title="タプル→リテラル型の変換"></a>タプル→リテラル型の変換</h3><p>ここは簡単です。というかタプル型がやはり強すぎる。</p><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">type</span> TupleNum = <span class="built_in">any</span>[];</span><br><span class="line"><span class="keyword">type</span> ToNumber&lt;T <span class="keyword">extends</span> TupleNum&gt; = T[<span class="string">"length"</span>];</span><br></pre></td></tr></table></figure><p>こうすると、 <code>ToNumber&lt;TupleNum&lt;4&gt;&gt;</code> は <code>4</code> (リテラル型)になります。<br><code>ToNumber</code> は関数のように機能する型です。対して <code>TupleNum&lt;T&gt;</code> は変数のように機能しますね。意味論的には、TypeScript の型には色んな種類があるようです。</p><h3 id="足し算の実装"><a href="#足し算の実装" class="headerlink" title="足し算の実装"></a>足し算の実装</h3><p>もう簡単ですね。</p><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">type</span> _Add&lt;T <span class="keyword">extends</span> TupleNum, U <span class="keyword">extends</span> TupleNum&gt; = [...T, ...U];</span><br><span class="line"><span class="keyword">type</span> Add&lt;T <span class="keyword">extends</span> <span class="built_in">number</span>, U <span class="keyword">extends</span> <span class="built_in">number</span>&gt; = ToNumber&lt;_Add&lt;ToTupleNum&lt;T&gt;, ToTupleNum&lt;U&gt;&gt;&gt;;</span><br></pre></td></tr></table></figure><p>単純にextractしてあげればよいです。</p><p>これで足し算が実装できます。<br><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">type</span> testAdd = Add&lt;<span class="number">5</span>, <span class="number">8</span>&gt;; <span class="comment">// 13</span></span><br></pre></td></tr></table></figure></p><h3 id="引き算の実装"><a href="#引き算の実装" class="headerlink" title="引き算の実装"></a>引き算の実装</h3><p>引き算は色々実装方法があると思います。ここでは最も楽そうな方法を書きます。</p><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">type</span> _Minus&lt;T <span class="keyword">extends</span> TupleNum, U <span class="keyword">extends</span> TupleNum&gt; = T <span class="keyword">extends</span> [...U, ...infer X] ? X : never;</span><br><span class="line"><span class="keyword">type</span> Minus&lt;T <span class="keyword">extends</span> <span class="built_in">number</span>, U <span class="keyword">extends</span> <span class="built_in">number</span>&gt; = ToNumber&lt;_Minus&lt;ToTupleNum&lt;T&gt;, ToTupleNum&lt;U&gt;&gt;&gt;;</span><br></pre></td></tr></table></figure><p>これで引き算が実装できます。<br><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">type</span> testMinus = Minus&lt;<span class="number">10</span>, <span class="number">8</span>&gt;; <span class="comment">// 2</span></span><br></pre></td></tr></table></figure></p><p>ちなみに、負の数は定義していないので、 <code>Minus&lt;1, 2&gt;</code> のようにすると死にます。</p><h3 id="掛け算の実装"><a href="#掛け算の実装" class="headerlink" title="掛け算の実装"></a>掛け算の実装</h3><p><strong>足し算と引き算は出オチでしたね</strong>。<code>...T</code> と <code>infer</code> を用いて、簡単に足し算と引き算を定義することができました。</p><p><strong>問題は掛け算</strong>です。<br>最も計算理論的に思いつきやすいのは、やはり再帰による定義でしょう。</p><p>$$<br>Multiple(a, b)=<br>\begin{cases}<br>Multiple(a, b-1)+b &amp; (b&gt;1) \\<br>a &amp; (b=1)<br>\end{cases}<br>$$</p><p>ただし、$a\neq 0,b\neq 0$としています。（実際の実装では0の時を考慮しています）</p><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">type</span> _Multiple&lt;T <span class="keyword">extends</span> TupleNum, U <span class="keyword">extends</span> TupleNum&gt; = &#123;</span><br><span class="line">    <span class="string">"ifZero"</span>: [],</span><br><span class="line">    <span class="string">"ifUIsOne"</span>: T,</span><br><span class="line">    <span class="string">"else"</span>: _Add&lt;_Multiple&lt;T, _Minus&lt;U, [<span class="built_in">any</span>]&gt;&gt;, T&gt;</span><br><span class="line">&#125;[T <span class="keyword">extends</span> [] ? <span class="string">"ifZero"</span> : U <span class="keyword">extends</span> [] ? <span class="string">"ifZero"</span> : U <span class="keyword">extends</span> [<span class="built_in">any</span>] ? <span class="string">"ifUIsOne"</span> : <span class="string">"else"</span>];</span><br><span class="line"><span class="keyword">type</span> Multiple&lt;T <span class="keyword">extends</span> <span class="built_in">number</span>, U <span class="keyword">extends</span> <span class="built_in">number</span>&gt; = ToNumber&lt;_Multiple&lt;ToTupleNum&lt;T&gt;, ToTupleNum&lt;U&gt;&gt;&gt;;</span><br></pre></td></tr></table></figure><p>確かにこれでも行けます。ですが、先ほども書きましたが、<strong>TypeScriptは再帰回数に厳しい</strong>。<br>この計算では、僕の環境では高々×23くらいまでしか出来ませんでした。</p><p>そこで応急的な改善。こうしたら確かに×40くらいまではいけました。<br>$$<br>Multiple(a, b)=<br>\begin{cases}<br>Multiple(a, b-2)+2\times b &amp; (b&gt;1) \\<br>a &amp; (b=1) \\<br>0 &amp; (b=0)<br>\end{cases}<br>$$</p><p>ただし、$a\neq 0$としています。（実際の実装では0の時を考慮しています）</p><p>$2\times b$ の $\times$ は$Multiple(a,b)$ とは区別しています。これは実装が異なるからです。<br>$2\times b$ は、TypeScriptでは <code>[...T, ...T]</code> で実装しています。</p><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">type</span> _Multiple&lt;T <span class="keyword">extends</span> TupleNum, U <span class="keyword">extends</span> TupleNum&gt; = &#123;</span><br><span class="line">  <span class="string">"ifZero"</span>: [],</span><br><span class="line">  <span class="string">"ifUIsOne"</span>: T,</span><br><span class="line">  <span class="string">"else"</span>: _Add&lt;[...T, ...T], _Multiple&lt;T, _Minus&lt;U, [<span class="built_in">any</span>, <span class="built_in">any</span>]&gt;&gt;&gt;</span><br><span class="line">&#125;[T <span class="keyword">extends</span> [] ? <span class="string">"ifZero"</span> : U <span class="keyword">extends</span> [] ? <span class="string">"ifZero"</span> : U <span class="keyword">extends</span> [<span class="built_in">any</span>] ? <span class="string">"ifUIsOne"</span> : <span class="string">"else"</span>]</span><br><span class="line"><span class="keyword">type</span> Multiple&lt;T <span class="keyword">extends</span> <span class="built_in">number</span>, U <span class="keyword">extends</span> <span class="built_in">number</span>&gt; = ToNumber&lt;_Multiple&lt;ToTupleNum&lt;T&gt;, ToTupleNum&lt;U&gt;&gt;&gt;;</span><br></pre></td></tr></table></figure><p>確かに、これはやればやるほど確かに計算限界は上がります。<br>今はステップ数を2にしていますが、これを3,4,5,…という風にしていけば、線形に再帰数は減少するでしょう。</p><p>ですが、<strong>根本的解決にはなりません</strong>よね。そこで、次のような方式を取りました。<br>まずはコードを見てください。</p><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">type</span> DigitsStr = <span class="string">"0"</span> | <span class="string">"1"</span> | <span class="string">"2"</span> | <span class="string">"3"</span> | <span class="string">"4"</span> | <span class="string">"5"</span> | <span class="string">"6"</span> | <span class="string">"7"</span> | <span class="string">"8"</span> | <span class="string">"9"</span>;</span><br><span class="line"><span class="keyword">type</span> OtherThanLast&lt;T <span class="keyword">extends</span> <span class="built_in">string</span>&gt; = T <span class="keyword">extends</span> <span class="string">`<span class="subst">$&#123;infer X&#125;</span><span class="subst">$&#123;DigitsStr&#125;</span>`</span> ? X : never;</span><br><span class="line"><span class="keyword">type</span> Last&lt;T <span class="keyword">extends</span> <span class="built_in">string</span>&gt; = T <span class="keyword">extends</span> <span class="string">`<span class="subst">$&#123;OtherThanLast&lt;T&gt;&#125;</span><span class="subst">$&#123;infer X&#125;</span>`</span> ? X : never;</span><br><span class="line"><span class="keyword">type</span> Times&lt;T <span class="keyword">extends</span> TupleNum&gt; = &#123;</span><br><span class="line">  <span class="string">"0"</span>: [],</span><br><span class="line">  <span class="string">"1"</span>: [...T],</span><br><span class="line">  <span class="string">"2"</span>: [...T, ...T],</span><br><span class="line">  <span class="string">"3"</span>: [...T, ...T, ...T],</span><br><span class="line">  <span class="string">"4"</span>: [...T, ...T, ...T, ...T],</span><br><span class="line">  <span class="string">"5"</span>: [...T, ...T, ...T, ...T, ...T],</span><br><span class="line">  <span class="string">"6"</span>: [...T, ...T, ...T, ...T, ...T, ...T],</span><br><span class="line">  <span class="string">"7"</span>: [...T, ...T, ...T, ...T, ...T, ...T, ...T],</span><br><span class="line">  <span class="string">"8"</span>: [...T, ...T, ...T, ...T, ...T, ...T, ...T, ...T],</span><br><span class="line">  <span class="string">"9"</span>: [...T, ...T, ...T, ...T, ...T, ...T, ...T, ...T, ...T],</span><br><span class="line">&#125;;</span><br><span class="line"><span class="keyword">type</span> TenTimes&lt;T <span class="keyword">extends</span> TupleNum&gt; = [...T, ...T, ...T, ...T, ...T, ...T, ...T, ...T, ...T, ...T];</span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> _Multiple&lt;T <span class="keyword">extends</span> TupleNum, U <span class="keyword">extends</span> <span class="built_in">string</span>&gt; = &#123;</span><br><span class="line">  <span class="string">"ifZero"</span>: [],</span><br><span class="line">  <span class="string">"ifOneLen"</span>: U <span class="keyword">extends</span> keyof Times&lt;<span class="built_in">any</span>&gt; ? Times&lt;T&gt;[U] : never,</span><br><span class="line">  <span class="string">"else"</span>: Last&lt;U&gt; <span class="keyword">extends</span> keyof Times&lt;<span class="built_in">any</span>&gt; ?</span><br><span class="line">    _Add&lt;Times&lt;T&gt;[Last&lt;U&gt;], TenTimes&lt;_Multiple&lt;T, OtherThanLast&lt;U&gt;&gt;&gt;&gt; : never</span><br><span class="line">&#125;[T <span class="keyword">extends</span> [] ? <span class="string">"ifZero"</span> : U <span class="keyword">extends</span> [] ? <span class="string">"ifZero"</span> : U <span class="keyword">extends</span> <span class="string">`<span class="subst">$&#123;DigitsStr&#125;</span>`</span> ? <span class="string">"ifOneLen"</span> : <span class="string">"else"</span>];</span><br><span class="line"><span class="keyword">type</span> Multiple&lt;T <span class="keyword">extends</span> <span class="built_in">number</span>, U <span class="keyword">extends</span> <span class="built_in">number</span>&gt; = ToNumber&lt;_Multiple&lt;ToTupleNum&lt;T&gt;, <span class="string">`<span class="subst">$&#123;U&#125;</span>`</span>&gt;&gt;;</span><br></pre></td></tr></table></figure><p><a href="https://github.com/microsoft/TypeScript/pull/40336" target="_blank" rel="noopener">最近追加された</a> Template Literal Types を用いています。<br>こちらの記事をやや参考にしました。<br><iframe class="hatenablogcard" style="width: 100%; height: 155px; max-width: 680px;" src="https://hatenablog-parts.com/embed?url=https://techracho.bpsinc.jp/yoshi/2020_09_04/97108" width="300" height="150" frameborder="0" scrolling="no"></iframe></p><p>やっていることは、<strong>筆算</strong>です。</p><p>$$<br>12\times 345=12\times 5+(12\times 34)\times 10 \\<br>=12\times 5+(12\times 4 + (12\times 3)\times 10)\times 10<br>$$</p><p>一般化すると、次のようになります。</p><p>$$<br>Multiple(a, b)=<br>\begin{cases}<br>a\times last(b)+Multiple(a, otherthanlast(b))\times 10 &amp; (b\geq 10) \\<br>a\times b &amp; (otherwise)<br>\end{cases}<br>$$</p><p>ただし、$a\neq 0$としています。（実際の実装では0の時を考慮しています）<br>$last(a)$は<strong>文字としての</strong>aの最後の文字を取得し、それを数値にしています。<br>TypeScriptでも <code>Last</code> 型として定義しています。<br><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">type</span> testLast = Last&lt;<span class="string">"12345"</span>&gt; <span class="comment">// "5"</span></span><br></pre></td></tr></table></figure></p><p>$otherthanlast(a)$は<strong>文字としての</strong>aの最後の文字以外を取得し、それを数値にしています。<br>TypeScriptでも <code>OtherThanLast</code> 型として定義しています。<br><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">type</span> testOtherThanLast = OtherThanLast&lt;<span class="string">"12345"</span>&gt; <span class="comment">// "1234"</span></span><br></pre></td></tr></table></figure></p><p>$a\times b$は$Multiple(a, b)$とは分けています。$\times$のほうは<code>[...T, ...T]</code> のように、TypeScriptの機能を利用しています。</p><p>これで、掛ける数がとても大きくても掛け算ができるようになりました。めでたし。</p><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">type</span> testMultipleBig = Multiple&lt;<span class="number">2</span>, <span class="number">4999</span>&gt;; <span class="comment">// 9998</span></span><br></pre></td></tr></table></figure><p>どうやら、今度はタプルの長さの最大に引っかかるようで、<strong>10000</strong>以上の長さにタプルを作れず、<br>結果が10000を超えてしまう場合は計算できなくなってしまいます。<br>一難去ってまた一難。これはまた、データ形式を工夫するなどして、今度対処しましょう。</p><h2 id="おまけ：Multipleを用いて、より大きい数を作る"><a href="#おまけ：Multipleを用いて、より大きい数を作る" class="headerlink" title="おまけ：Multipleを用いて、より大きい数を作る"></a>おまけ：Multipleを用いて、より大きい数を作る</h2><p>先ほど、<code>ToTupleNum</code> ではRepeatを用いていたので、再帰制限のためせいぜい45くらいまでの数しかTupleにできませんでしたが、<br>このMultipleを用いれば、実はもっと大きな数が作れるようになります。</p><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">type</span> SuperToTupleNum&lt;T <span class="keyword">extends</span> <span class="built_in">number</span>&gt; = Multiple&lt;<span class="number">1</span>, T&gt;;</span><br></pre></td></tr></table></figure><h2 id="まとめ"><a href="#まとめ" class="headerlink" title="まとめ"></a>まとめ</h2><p>TypeScriptの型システムは、本当に奥が深いです。<br>こういう変なことをするのが大好きなので、もう少し調べてみたいと思います。</p><p>今回のコードは、<a href="https://www.typescriptlang.org/play?#code/PTAEiHlRgAMLH+AsBd4AcDOAuEBrA5vTAnAOgDsBTeYAIwBsB7bYAJgAYXhmBOdx4eATySkUAY3wBLJPAC0AEzEoAhjVJT8pYQFd8KMbWJTqYgLZj4AKH6DQAJVKCF8ADwAVADSgAcqFIAPeKWIZFFBiDSNKUnx3a28-AKDQBWI+AG0AXVAAXlB0gD4smxSAImoA3FgijN9-QOCPM1BQAH4bBtA0GztSBxd3D3cUt1BCEes03IBuCwFSUGdaZw0kUo8wl1iahNDwyPzs23snJL53Z0npq0Xl0lWjAuP0qctZ+duI-HXq+OCrlbC9ubFUrEcqVKYXWYAfQAgjIZJ84rU5ks-kZ3ABVDbfZHXW4AlIjQhDQnotJPGagWHw5xYpHbd4Y2lbMLvAGvFmRRwwuEuBYom5rM6nPm4tbo3IS8HPUD+FDwKkFKmOACs7gAHJNQCBQABGADMZghoEhAFkxKEUAjNj9+bdGV8kb8BUY2UzggSRuj3ITzQAzSKgAAaGRagfaIVIADdIuSrGaLVbsfTIvbEcydvg2bQ3pzTeaNJb5k7bi5csLi2KJecjbL4PGCwV65adcx1ZrtYxDdqoHBEKgMLx1LB8AphLBaIRKKhzcJCAArJDAPi0FCwMRMVjMSGcbcAFmAHAA7C21UaACJibCmFAAZXg+AKRWYRVAAB9QEUdS-30VGN+P3q-5FLuQHKkBABsQGHkBapARwRSxrMADy8CwJEziwEkAAyChyomSJyuIIKug6CQAAYACQAN5+gGgYAL7UReV7wLe970WRzRBuGZDRvgiGgDheE0qRwSEea2AkWmwSUVRKFofgGHYbhThnIxNHEP6D4MZxoY8VGMZGs4xhCPhCQVi6BRUW0T5FB06SuDZX72YSzhpI5jS-nZOSud6IxuR5AHeR6RJ+aFwz+e5NkgS5-lhcScURUSUWeWBsXhb5SUJRlkWBUUkHpdlRXxSVWUpR+0GFaVmU1YltXJXlsFVVl1V1W1OUdQFNnwc19XFS1A19fFUX0QJzgBMZRimSJ0k4qi+JDYN7X9YtfVkoa0qmho1DwBIpRmTaopoqAmKiaA4nEVZNliL6ABakS0MF5VFDdSFkFhATeads2YKQy6+nMJmWsc+QtJN025CkpL6XxeWkNQKCkN5QlOOKbqgL9-2A1NwPJKDbSNNy1JA6WKQo444ruXME0k1tO17aQvSgPJ6GYcQ5PilWMORGY9GDOj6RcS9d0PS+HTfdaOQhh+N33fgj3hhL2Kycx153vgHFC6972feGRTw4jYJGia227dcB0hByUQnejyaZgU7IZlyJv0+bRa2oKZagLJ6IcZKG0UrWKMFOTn6MHqu5gfk2pFGBNZCPALOKWzwfZEnSnsypjhhxHUdamAOcgfHcou2bpQAEKXo2psM44jDuLuHBN+2YBNxwp5AA" target="_blank" rel="noopener">こちら</a>で試すことができます。<br>型に計算結果が入っているので、カーソルをその型に合わせると、中身が分かると思います。</p><p><img src="https://lh3.googleusercontent.com/pw/ACtC-3f0A3vp_Q2l-z5sr6xzdJCUOr52CN9b3mD7Ki_Gpyyec4nm4ITLZYTfzS31z9PUAVZEFVLOkSB1-pBREQK4RhC_UJV3UC1a5zIo1MwcSEHd95Tf87T2H-TBg1CdgFCkme_Vxm2G6qElEBopILV80zde8w=w468-h72-no?authuser=0" alt></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;こんにちは。shundroidです。&lt;br&gt;最近型レベルプログラミングに興味があります。&lt;br&gt;TypeScriptの型機能、気づかぬうちにめちゃくちゃ強くなっていてすごいですね。最大限活用したいですが、実用上は使う機会あるのでしょうか。&lt;/p&gt;
&lt;p&gt;変な型を作るのは楽し
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>VuexをVue Composition APIで実装する！【NoVue】</title>
    <link href="http://asterisks.netlify.com/2021/04/13/vuex-no-vue/"/>
    <id>http://asterisks.netlify.com/2021/04/13/vuex-no-vue/</id>
    <published>2021-04-13T18:03:23.000Z</published>
    <updated>2021-05-06T02:40:20.692Z</updated>
    
    <content type="html"><![CDATA[<p>こんにちは。shundroidです。<br>大学の授業が始まって早1週間。<br>最初はガイダンスばかりですが、だんだん面白さが分かってきました。</p><p>また、今日は情報系の選抜授業の合格発表があって、<br>無事履修することができました～よかった。<br>倍率2倍強ですが、絶対に取りたい授業で、チャンスは１回だけだったので、<br>本当に良かったです。堪能したいと思います。</p><p>さて、今回は、<a href="https://github.com/vuejs/composition-api" target="_blank" rel="noopener">vue-composition-api</a>を使っていきたいと思います。<br>これが凄いんですよ。<br>おそらく、最初のモチベーションとしては、肥大化したViewModelを整理する、ということだったと思うんですが、<br>おなじみの <code>watch</code> や、リアクティブな変数を生成する <code>reactive</code> などをコンポーネントから分離して利用できるようになったことで、後で詳しく述べますが、<strong>幅広く使える可能性を備えた</strong>と思います。</p><p>特に、これはデータバインドを活用したアーキテクチャを設計し、プロトタイプを作るのにも向いていると考えたので、<br>ここでは、試しに<strong>Vuexをvue-composition-apiを使って実装してみたいと思います！</strong></p><h2 id="Composition-API-の基本的な機能"><a href="#Composition-API-の基本的な機能" class="headerlink" title="Composition API の基本的な機能"></a>Composition API の基本的な機能</h2><p>詳しくは、Vue.jsの公式ドキュメントが分かりやすくて、APIが作られた背景までわかるようになっているので、そちらを見てください。</p><iframe class="hatenablogcard" style="width: 100%; height: 155px; max-width: 680px;" src="https://hatenablog-parts.com/embed?url=https://v3.ja.vuejs.org/guide/composition-api-introduction.html" width="300" height="150" frameborder="0" scrolling="no"></iframe><p>今回特に使う機能を紹介していきます。</p><h3 id="ref"><a href="#ref" class="headerlink" title="ref"></a>ref</h3><p>リアクティブな変数を生成します。似たものに <code>reactive</code> というのがありますが、こちらは値がオブジェクトの時に使えて、 <code>.value</code> を省略できます。</p><p>コードの説明はTypeScriptで行っていきます。</p><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> &#123; ref, Ref &#125; <span class="keyword">from</span> <span class="string">'@vue/composition-api'</span>;</span><br><span class="line"><span class="comment">// (予めVueにComposition APIを登録する必要はある:後のstore.ts参照)</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// どういう型になるか説明するために、型指定を行っておきます。</span></span><br><span class="line"><span class="keyword">const</span> num1: Ref&lt;<span class="built_in">number</span>&gt; = ref(<span class="number">0</span>);</span><br><span class="line"><span class="keyword">const</span> num2 = num1;</span><br><span class="line"></span><br><span class="line"><span class="built_in">console</span>.log(num1.value, num2.value); <span class="comment">// 0, 0</span></span><br><span class="line">num2.value++;</span><br><span class="line"><span class="built_in">console</span>.log(num1.value, num2.value); <span class="comment">// 1, 1</span></span><br></pre></td></tr></table></figure><p>これだと、ただ参照値を渡しているだけで、例えば、次のようにしても良いのではないかと思うかもしれません。</p><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> num1 = &#123; value: <span class="number">0</span> &#125;;</span><br><span class="line"><span class="keyword">const</span> num2 = num1;</span><br></pre></td></tr></table></figure><p>ですが、 <code>ref</code> の強みは、<strong>Vueの便利なリアクティブシステムに値するものがすべて使える</strong>ところにあります。<br><code>watch</code>、<code>computed</code>などです。これを次に説明します。</p><h3 id="watch"><a href="#watch" class="headerlink" title="watch"></a>watch</h3><p>Vueでおなじみのものと同じです。</p><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> &#123; ref, watch, Ref &#125; <span class="keyword">from</span> <span class="string">'@vue/composition-api'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> num = ref(<span class="number">0</span>);</span><br><span class="line"></span><br><span class="line">watch(num, <span class="function"><span class="params">()</span> =&gt;</span> &#123;</span><br><span class="line">  <span class="built_in">console</span>.log(<span class="string">'changed!'</span>);</span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line">num.value--; <span class="comment">// changed!</span></span><br></pre></td></tr></table></figure><p>こういった機構を簡単に設計できるのです。<br><strong>Vueのコンポーネントシステム以上の可能性</strong>を感じますよね。</p><h3 id="おまけ：computed"><a href="#おまけ：computed" class="headerlink" title="おまけ：computed"></a>おまけ：computed</h3><p>今回は使いませんでしたが、 <code>computed</code> もシンプルに使えます。</p><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> &#123; ref, computed, Ref &#125; <span class="keyword">from</span> <span class="string">'@vue/composition-api'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> num1 = ref(<span class="number">0</span>);</span><br><span class="line"><span class="keyword">const</span> num2 = computed(<span class="function"><span class="params">()</span> =&gt;</span> num1.value + <span class="number">1</span>);</span><br><span class="line"></span><br><span class="line"><span class="built_in">console</span>.log(num1.value, num2.value); <span class="comment">// 0, 1</span></span><br><span class="line">num1.value++;</span><br><span class="line"><span class="built_in">console</span>.log(num1.value, num2.value); <span class="comment">// 1, 2</span></span><br></pre></td></tr></table></figure><p>すごいなあ。<br>こういうプログラムが普及すると、<strong>プログラムは上から実行されるんだよという説明が難しくなってきそう</strong>ですよね。<br>もちろん間違ってはいないですが、このようなcomputed内のコールバックが実行される順番等を踏まえると、もっと別の意味づけのほうが適切なのではないか、と思えてしまいます。</p><p>プログラミング言語の<strong>命令型→宣言型への移行</strong>が垣間見える気がします。<br><a href="https://asterisks.netlify.app/2021/04/05/interest-2021-04/#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%95%E3%83%AD%E3%83%BC%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0" target="_blank" rel="noopener">個人的には、データフロープログラミングに興味がある</a>ので、この流れは賛成です。</p><p>computedが内部的にどのようにコールバックの実行タイミングを見極めているか、については、下の記事が分かりやすかったです。一旦中身を実行してみて、どのリアクティブ変数が取得されたか、を記録しているようですね。</p><iframe class="hatenablogcard" style="width: 100%; height: 155px; max-width: 680px;" src="https://hatenablog-parts.com/embed?url=https://qiita.com/neutron63zf/items/506c7493a53cea44860e" width="300" height="150" frameborder="0" scrolling="no"></iframe><p>条件分岐などがcomputed内であった場合は、一旦実行するのみでは足りないのではないか、と思いましたが、条件自体がリアクティブだとこれで足りそうですね。よくできてるなあ。</p><h3 id="VuexをNo-Vueで実装していく"><a href="#VuexをNo-Vueで実装していく" class="headerlink" title="VuexをNo Vueで実装していく"></a>VuexをNo Vueで実装していく</h3><p>ここまでで Composition API の基本的な機能を見てきました。<br>Vueのコンポーネントに止まらず、<strong>もっと汎用的な使い道がある</strong>ということがわかりました。</p><p>というわけで、実際の応用例として、Vuex的アーキテクチャを実装してみましょう。</p><p><img src="https://lh3.googleusercontent.com/pw/ACtC-3fvBg56YBtBKrcmPsK3eIcwgKh4L0vFEf3eD04sThgCZkRDxDnFeu6qG5mdgLZ53Nla300Bz0an7Ku-R1NpiBIlWdbSklSzQ0Roezf5yBlfwCuokUUbVctkKNGfgWEeh2Enj-7t-CJxf1XWss2ioRkrNg=w955-h639-no?authuser=0" alt></p><p>今回はTodoアプリを作っていきますが、<br>あまり本質的でない部分は端折ります。<br><strong>Actionはごめんなさい、さようなら。</strong><br>そして本当はAction呼び出しは疎結合に行われますが、これはあまりメリットがないので、今回はMutation直呼びで代用します。</p><h3 id="store-tsの実装"><a href="#store-tsの実装" class="headerlink" title="store.tsの実装"></a>store.tsの実装</h3><p><code>/store.ts</code></p><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> Vue <span class="keyword">from</span> <span class="string">'vue'</span>;</span><br><span class="line"><span class="keyword">import</span> VueCompositionAPI, &#123; DeepReadonly, reactive, readonly, ref, Ref, UnwrapRef &#125; <span class="keyword">from</span> <span class="string">'@vue/composition-api'</span>;</span><br><span class="line"><span class="keyword">type</span> UnwrapNestedRefs&lt;T&gt; = T <span class="keyword">extends</span> Ref ? T : UnwrapRef&lt;T&gt;;</span><br><span class="line">Vue.use(VueCompositionAPI);</span><br><span class="line"></span><br><span class="line"><span class="keyword">interface</span> TodoItem &#123;</span><br><span class="line">  title: <span class="built_in">string</span>;</span><br><span class="line">  completed: <span class="built_in">boolean</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">interface</span> State &#123;</span><br><span class="line">  todoList: Ref&lt;TodoItem[]&gt;;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> state: State = &#123;</span><br><span class="line">  todoList: ref([])</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// mutations</span></span><br><span class="line"><span class="keyword">export</span> <span class="function"><span class="keyword">function</span> <span class="title">addTodo</span>(<span class="params">title: <span class="built_in">string</span></span>) </span>&#123;</span><br><span class="line">  state.todoList.value.push(&#123; title, completed: <span class="literal">false</span> &#125;)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> readonlyState: &#123; [P <span class="keyword">in</span> keyof State]: DeepReadonly&lt;UnwrapNestedRefs&lt;State[P]&gt;&gt; &#125; = &#123;</span><br><span class="line">  todoList: readonly(state.todoList)</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> readonlyState;</span><br></pre></td></tr></table></figure><p>Composition APIを使うために、仕方なくVueを呼び出していますが、<br>あくまでVueをアプリケーションで使うわけではないです。</p><p>stateの定義に <code>ref</code> を用いています。これは先ほど紹介した通りです。<br>本当は、Model部分はViewに影響されず、純粋なモデルにするべきですが、リアクティブ化する程度ならばいいかと思ってしまいました。どうですかね。<br>あと、 <code>reactive([])</code> では配列はリアクティブになりません。注意してください。</p><p>mutationは普通にstateを書き換えています。</p><p>そして、<strong>ここが肝</strong>なのですが、<br>stateをexportするときに、<strong>stateをreadonlyにしています！！！！！</strong><br>実は、ライブラリのほうのVuexはstateに双方向データバインドがかかっていて、<br><strong>Mutationを介さずにバインドによってstateが書き換えられてしまう</strong>のですが、<br>これはどう考えてもbadなので、今回は<strong>Composition APIの機能をフル活用して</strong>、<br>readonlyにしています。</p><p>readonlyStateの型ですが、Composition API内部で使われている型を拝借しました。<br><code>[P in keyof Type]</code> というのは、Mapped TypesというTypeScriptの機能です。<strong>反復処理の型バージョン</strong>みたいなやつです。<br>DeepReadonlyでは、 <code>T extends U ? A : B</code> という、<strong>型バージョンの条件分岐</strong>を使っているようです（参考：API内部）。<br>どうしてここまでして型を組みたいかというと、こうすることで、readonlyStateの値に関して保証ができるからです。<br>つまり、stateにあるのにreadonlyStateにない！とか、readonlyになっていない！とかいうことが、<strong>TypeScriptのエラーとして把握できます</strong>。<br>このように、ただ型がつくと嬉しい！楽しい！というだけでなく、開発上のミスが無いようにするために型を使うべきです。この使い方は <code>never</code> 型などでよくします。</p><h2 id="個々のコンポーネントの実装"><a href="#個々のコンポーネントの実装" class="headerlink" title="個々のコンポーネントの実装"></a>個々のコンポーネントの実装</h2><p>まずはインターフェース実装。<br><code>/components/component.ts</code><br><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> <span class="keyword">interface</span> Component &#123;</span><br><span class="line">  render(): HTMLElement</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><p>Todoを追加するやつ。<br><code>/components/todoList.ts</code><br><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> Component <span class="keyword">from</span> <span class="string">'./component'</span>;</span><br><span class="line"><span class="keyword">import</span> state <span class="keyword">from</span> <span class="string">'../store'</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; watch &#125; <span class="keyword">from</span> <span class="string">'@vue/composition-api'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> <span class="keyword">class</span> TodoList <span class="keyword">implements</span> Component &#123;</span><br><span class="line">  render() &#123;</span><br><span class="line">    <span class="keyword">const</span> ul = <span class="built_in">document</span>.createElement(<span class="string">'ul'</span>);</span><br><span class="line">    watch(state.todoList, <span class="function"><span class="params">()</span> =&gt;</span> &#123;</span><br><span class="line">      ul.innerHTML = <span class="string">''</span>;</span><br><span class="line">      <span class="keyword">for</span> (<span class="keyword">let</span> todoItem of state.todoList.value) &#123;</span><br><span class="line">        <span class="keyword">const</span> li = <span class="built_in">document</span>.createElement(<span class="string">'li'</span>);</span><br><span class="line">        li.textContent = <span class="string">`<span class="subst">$&#123;todoItem.title&#125;</span>`</span></span><br><span class="line">        ul.appendChild(li)</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;);</span><br><span class="line">    <span class="keyword">return</span> ul;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><p><strong>VuexなのにtextContentとかdocumentとか出てきてて草</strong><br>今回は、<strong>Composition APIの汎用性</strong>を説明したかったので、<br><strong>バニラでも十分役立つんだ！</strong>ということを説明したくてこうしています。</p><p>もちろん、バリバリVue使って実装してもらってもいいです。</p><p>ここでは、<code>state.todoList</code>を<code>watch</code>しています。<br>さすがに直DOMに流すのはリアクティブにはできないので仕方ない。<br>また、ご確認いただけると幸いですが、<code>state.todoList</code>はしっかりreadonlyになっているので、<strong>Viewからは改変できません！わーい</strong><br>じゃあViewからstateを変えるにはどうするの？というのが次のコンポーネントになります。</p><p><code>/components/addTodo.ts</code><br><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> Component <span class="keyword">from</span> <span class="string">'./component'</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; addTodo &#125; <span class="keyword">from</span> <span class="string">'../store'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> <span class="keyword">class</span> AddTodo <span class="keyword">implements</span> Component &#123;</span><br><span class="line">  render() &#123;</span><br><span class="line">    <span class="keyword">const</span> parent = <span class="built_in">document</span>.createElement(<span class="string">'div'</span>);</span><br><span class="line">    <span class="keyword">const</span> input = <span class="built_in">document</span>.createElement(<span class="string">'input'</span>);</span><br><span class="line">    input.type = <span class="string">'text'</span>;</span><br><span class="line">    parent.appendChild(input);</span><br><span class="line">    <span class="keyword">const</span> button = <span class="built_in">document</span>.createElement(<span class="string">'button'</span>);</span><br><span class="line">    button.textContent = <span class="string">'Add a task'</span>;</span><br><span class="line">    button.addEventListener(<span class="string">'click'</span>, <span class="function"><span class="params">()</span> =&gt;</span> &#123;</span><br><span class="line">      addTodo(input.value);</span><br><span class="line">      input.value = <span class="string">''</span>;</span><br><span class="line">    &#125;);</span><br><span class="line">    parent.appendChild(button);</span><br><span class="line">    <span class="keyword">return</span> parent;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><p>mutationをimportして使っています。</p><h2 id="エントリーポイント"><a href="#エントリーポイント" class="headerlink" title="エントリーポイント"></a>エントリーポイント</h2><p>ここはあまり大事ではないですが、コンポーネントを登録(物理)します。</p><p><code>/main.ts</code><br><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> AddTodo <span class="keyword">from</span> <span class="string">'./components/addTodo'</span>;</span><br><span class="line"><span class="keyword">import</span> TodoList <span class="keyword">from</span> <span class="string">'./components/todoList'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> app = <span class="built_in">document</span>.querySelector(<span class="string">'#app'</span>);</span><br><span class="line">app.appendChild(<span class="keyword">new</span> AddTodo().render());</span><br><span class="line">app.appendChild(<span class="keyword">new</span> TodoList().render());</span><br></pre></td></tr></table></figure></p><p>Vueが完全に隠れていて気持ちがいいですね。</p><h2 id="出来上がったものがこちらになります。"><a href="#出来上がったものがこちらになります。" class="headerlink" title="出来上がったものがこちらになります。"></a>出来上がったものがこちらになります。</h2><p><del>冷凍庫で3時間冷凍したものが</del>Githubにあります。</p><iframe class="hatenablogcard" style="width: 100%; height: 155px; max-width: 680px;" src="https://hatenablog-parts.com/embed?url=https://github.com/shundroid/vuex-no-vue-sample/" width="300" height="150" frameborder="0" scrolling="no"></iframe><p>実装には<a href="https://vitejs.dev/" target="_blank" rel="noopener">Vite</a>を用いました。<br>速いですね。今風でいいですね。webpackもそろそろ引退かな。</p><p>デモは<a href="https://shundroid-vuex-no-vue.netlify.app/" target="_blank" rel="noopener">こちら</a>で試すことができます。</p><h2 id="まとめ"><a href="#まとめ" class="headerlink" title="まとめ"></a>まとめ</h2><p>いかがでしたでしょうか。Composition APIの汎用性が伝われば幸いです。<br>個人的には、アーキテクチャの実装等に興味があるので、<br>データバインドを活用したアーキテクチャのプロトタイプ作成などにどんどん使っていこうかと思います。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;こんにちは。shundroidです。&lt;br&gt;大学の授業が始まって早1週間。&lt;br&gt;最初はガイダンスばかりですが、だんだん面白さが分かってきました。&lt;/p&gt;
&lt;p&gt;また、今日は情報系の選抜授業の合格発表があって、&lt;br&gt;無事履修することができました～よかった。&lt;br&gt;倍率2倍
      
    
    </summary>
    
      <category term="programming" scheme="http://asterisks.netlify.com/categories/programming/"/>
    
    
      <category term="vue,vuex,flux,vue-composition-api" scheme="http://asterisks.netlify.com/tags/vue-vuex-flux-vue-composition-api/"/>
    
  </entry>
  
  <entry>
    <title>大学の授業が始まる前日、興味があること</title>
    <link href="http://asterisks.netlify.com/2021/04/05/interest-2021-04/"/>
    <id>http://asterisks.netlify.com/2021/04/05/interest-2021-04/</id>
    <published>2021-04-05T20:50:15.000Z</published>
    <updated>2021-05-06T02:40:20.685Z</updated>
    
    <content type="html"><![CDATA[<p>こんにちは。shundroidです。<br>明日から大学の授業が始まります。<br>この後色々好きなものとかが変わっていくことが想定されますが、<br>とりあえず、現時点での自分の興味について書き記しておこうと思います。</p><h2 id="プログラミング言語のパラダイム"><a href="#プログラミング言語のパラダイム" class="headerlink" title="プログラミング言語のパラダイム"></a>プログラミング言語のパラダイム</h2><p>この前の記事にも書きましたが、プログラミング言語そのものへの興味が湧き始めました。</p><iframe class="hatenablogcard" style="width: 100%; height: 155px; max-width: 680px;" src="https://hatenablog-parts.com/embed?url=https://asterisks.netlify.app/2021/04/01/korekara-programming/" width="300" height="150" frameborder="0" scrolling="no"></iframe><p>言語の仕様や、プログラミングパラダイムなどに興味があります。<br>それらがコンピューターの構造や、後述するデザインパターンやアーキテクチャとどのような関係があるのか、について知りたいと思っています。</p><h2 id="データフロープログラミング"><a href="#データフロープログラミング" class="headerlink" title="データフロープログラミング"></a>データフロープログラミング</h2><p>プログラミングパラダイムの中でも、特に<a href="https://ja.wikipedia.org/wiki/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%95%E3%83%AD%E3%83%BC%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0" target="_blank" rel="noopener">データフロープログラミング</a>に興味があります。<br>実は、僕自身、Vueの双方向データバインドを使ってきた経験から、<br>受験期の前半に、データバインドのみしか使えないようなプログラミング言語を構想していました。<br>そうしたら、ひょんなことから、Lucidというデータフロープログラミング言語を見つけて、びっくりしています。</p><iframe class="hatenablogcard" style="width: 100%; height: 155px; max-width: 680px;" src="https://hatenablog-parts.com/embed?url=https://ja.wikipedia.org/wiki/Lucid_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E)" width="300" height="150" frameborder="0" scrolling="no"></iframe><p>色々Lucidについて調べていると、ちょっと古い言語のため、その時代のプログラミング言語に対する関心についても知ることができて楽しいですね。今より関心が数学的な証明可能性に向いているようです。</p><p>Lucid自体は、ちょっと現代プログラミングの仕様に合っていない面もある気はしますが、<br>Lucidの論文で、代数への命令型・手続き型アプローチが放棄された、と言われているように、<br>Webプログラミングにおいても、データバインディングの浸透により、命令型・手続き型から宣言型・非手続き型への移り変わりが起こるんじゃないかな、と思っています。</p><p>また、Nintendo LABOで使われるプログラミングがデータフローっぽいのも惹かれた理由の一つです。</p><h2 id="デザインパターン・アーキテクチャ"><a href="#デザインパターン・アーキテクチャ" class="headerlink" title="デザインパターン・アーキテクチャ"></a>デザインパターン・アーキテクチャ</h2><p>これらは、長年Webプログラミングをしてきて、<br>どう書いたらコードがきれいになるか、秩序立ったものになるか、をずっと考えてきたことが影響しています。</p><p>Web界隈では、近年まで目まぐるしく流行が変わる激動の時代でしたが、<br>そんな中、MVVMなどが、「とりあえず流行っているから」使われることが多かった気がします。</p><p>そんなMVVM、Flux、MVCなどが、比較してどんな特徴があるのか、<br>また、それらが、プログラミング言語の仕様、パラダイムにどう影響され、<br>そして我々の理解方式にどう基づいているのか、に興味があります。</p><p>例えば、MVVMは、データバインドという言語上の仕様(あるいはそれに準ずる技術)に<br>強く依存しています。</p><p>細かいミクロなアルゴリズム（ソートなど）より、このようなマクロな構造のほうに興味があります。</p><h2 id="合成生物学"><a href="#合成生物学" class="headerlink" title="合成生物学"></a>合成生物学</h2><p>ちょっとここだけ異色に見えるかもしれないのですが、僕はあまり違うものだとは思っていません。<br>合成生物学で、生物を作る、というより、生物でプログラミングをする、というほうに惹かれています。<br><strong>遺伝子でのプログラミングも、プログラミングパラダイムの一つ</strong>となるのではないか、と考えています。</p><p>高校では生物が好きでしたし、「生物」による世界の理解と、人間による世界の理解の違い、にも興味があります。</p><p>受験期に読んだ『数学する身体』という本に、面白い話が載っていました。</p><iframe class="hatenablogcard" style="width: 100%; height: 155px; max-width: 680px;" src="https://hatenablog-parts.com/embed?url=https://www.amazon.co.jp/%E6%95%B0%E5%AD%A6%E3%81%99%E3%82%8B%E8%BA%AB%E4%BD%93-%E6%A3%AE%E7%94%B0-%E7%9C%9F%E7%94%9F/dp/4103396512" width="300" height="150" frameborder="0" scrolling="no"></iframe><p>簡単にまとめると、次のような話です。</p><p>遺伝的アルゴリズムを用いて、回路パーツを組み合わせて、特定の処理を行える回路を構成するようにしたところ、人間が必要とする最小パーツ数を下回るパーツ数で回路を作れてしまった。これは、「人間」が与えた回路パーツの「機能」だけでなく、電磁的な漏出や磁束の効果を上手く使ったことによるのだ。</p><p>人間による設計では、「誤差」として捨象される漏出や磁束ですが、そもそも何が本質で何がそうでないのか、は人間が恣意的に決めたことです。進化のプロセスは、そのような分節化は行わず、<strong>使えるものは何でも使う</strong>、というスタイルです。</p><p>同じく受験期に読んだ『ひとは生命をどのように理解してきたか』にも、似た話があり、こちらは目的の遺伝子がなかなか見つからない問題を取り上げ、それが<strong>我々の日常の理解の論理と、遺伝子の論理が別物だからだ</strong>、と言っています。</p><iframe class="hatenablogcard" style="width: 100%; height: 155px; max-width: 680px;" src="https://hatenablog-parts.com/embed?url=https://www.amazon.co.jp/%E3%81%B2%E3%81%A8%E3%81%AF%E7%94%9F%E5%91%BD%E3%82%92%E3%81%A9%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E7%90%86%E8%A7%A3%E3%81%97%E3%81%A6%E3%81%8D%E3%81%9F%E3%81%8B-%E8%AC%9B%E8%AB%87%E7%A4%BE%E9%81%B8%E6%9B%B8%E3%83%A1%E3%83%81%E3%82%A8-%E5%B1%B1%E5%8F%A3-%E8%A3%95%E4%B9%8B/dp/4062585189" width="300" height="150" frameborder="0" scrolling="no"></iframe><p>このような、「別の論理」が働くプログラミングパラダイムが、合成生物学だと思います。<br>遺伝子を単位としてプログラムを作ると、関数型プログラミングなどでは忌避される<strong>副作用</strong>がどんどん出てくるでしょう。ですが、実際の生命はそれを副作用だとして切り捨てず、進化してきて、ここまで来たわけです。</p><p>そのようなプロセス――倫理で習った事を使えば、ショウペンハウアーの「盲目的意志」のような営み――から、プログラミングについて、学べることも多いのではないか、と感じています。</p><h2 id="数学基礎論"><a href="#数学基礎論" class="headerlink" title="数学基礎論"></a>数学基礎論</h2><p>出会いは高1の時の『数学ガール　ゲーデルの不完全性定理』です。</p><iframe class="hatenablogcard" style="width: 100%; height: 155px; max-width: 680px;" src="https://hatenablog-parts.com/embed?url=https://www.amazon.co.jp/%E6%95%B0%E5%AD%A6%E3%82%AC%E3%83%BC%E3%83%AB-%E3%82%B2%E3%83%BC%E3%83%87%E3%83%AB%E3%81%AE%E4%B8%8D%E5%AE%8C%E5%85%A8%E6%80%A7%E5%AE%9A%E7%90%86-%E6%95%B0%E5%AD%A6%E3%82%AC%E3%83%BC%E3%83%AB%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-3-%E7%B5%90%E5%9F%8E/dp/4797352965" width="300" height="150" frameborder="0" scrolling="no"></iframe><p>数学を数学によって再構築していく感覚が何とも楽しかったです。<br>1つ1つの演算を数学で実装し直していく感覚は、プログラミングにも似ていて面白かったです。<br>当時は、「数式でプログラミングってできるのかもしれない」といった純粋な好奇心を持っていました。</p><p>そして今、先述したようなプログラミング言語仕様などを調べていると、<br><strong>どうやら本当に、数式でプログラミングができるのかもしれず</strong>、<br>しかもそれができるかどうか、が実はかなり重要である、ということが分かってきました。</p><p>先ほどのLucidの話では、たびたび数学の論理と、プログラミングの記述が対比されています。<br>数式は静的（宣言的、非手続き的）な営みであり、プログラミングはマシンの制約（先ほど書いたように、マシンの制約とプログラミング言語仕様の関係性も好きです）上、動的（命令的、手続き的）になっている、とされています。</p><p>数学が、いったいどのようなものなのか、を数学する数学基礎論のメタ数学的議論と、<br>プログラミング言語はどういうものなのか、というメタプログラミング(とまではいきませんが、やはりメタい部分)的議論との間に、何か密接な関連性を感じています。</p><p>というわけで、こちらも合成生物学同様、<br><strong>プログラミング側から見た</strong>数学、としての楽しさを感じています。<br>数学も１プログラミングパラダイムと見ることができるかもしれません。</p><h2 id="身体性"><a href="#身体性" class="headerlink" title="身体性"></a>身体性</h2><p>これも『数学する身体』や『ひとはどのように生命を理解してきたか』の影響が大きいですが、<br>数学やプログラミング言語の体系が、どのように人の理解構造や身体性によって作られているか、に興味があります。</p><p>先ほど述べたように、生命が何でもありで目的を達成するのに対し、<br>例えばプログラミングでは、基本的に<strong>関数にはその機能を限定</strong>しますし、<br>オブジェクト指向、はまさに我々の物に対する理解方式を取り入れたものでしょう。</p><p>ここらへんは、<a href="https://digitalsoul.hatenadiary.org/entry/20100131/1264925022" target="_blank" rel="noopener">The DCI Architectureという論文(の日本語訳)</a>を読んで興味を持ちました。</p><p>関連して、そのように、数学やプログラミングが人間の身体性に依存していながらも、<br>本当に正しいと言えるのだろうか、という<strong>真理性</strong>についても気になっています。</p><p>なぜ、数学を用いた物理の予測、などが、人間の感覚基準なはずなのに、<br>これほど世界の現象を言い当てることができているのか、などです。</p><h2 id="数論"><a href="#数論" class="headerlink" title="数論"></a>数論</h2><p>ここだけちょっと特殊な気がします。<br>受験期の入試問題や、受験後に読んだ『大学入試問題で語る数論の世界』という本を読んで、<br>数論が好きになりました。（※得意ではないです）</p><iframe class="hatenablogcard" style="width: 100%; height: 155px; max-width: 680px;" src="https://hatenablog-parts.com/embed?url=https://www.amazon.co.jp/%E5%A4%A7%E5%AD%A6%E5%85%A5%E8%A9%A6%E5%95%8F%E9%A1%8C%E3%81%A7%E8%AA%9E%E3%82%8B%E6%95%B0%E8%AB%96%E3%81%AE%E4%B8%96%E7%95%8C%E2%80%95%E7%B4%A0%E6%95%B0%E3%80%81%E5%AE%8C%E5%85%A8%E6%95%B0%E3%81%8B%E3%82%89%E3%82%BC%E3%83%BC%E3%82%BF%E9%96%A2%E6%95%B0%E3%81%BE%E3%81%A7-%E3%83%96%E3%83%AB%E3%83%BC%E3%83%90%E3%83%83%E3%82%AF%E3%82%B9-%E6%B8%85%E6%B0%B4-%E5%81%A5%E4%B8%80/dp/4062577437" width="300" height="150" frameborder="0" scrolling="no"></iframe><p>特に、全く関係ないように見える2つの概念が、突然出会う不思議さ・美しさや、<br>意味的に無駄がなく、本質を突くような証明の構造に惹かれました。</p><p>自分で何か新しく証明をしよう、とは思わない（できない）ですが、<br>数論の様々な概念がどう大事なのか、を体得し、<br>他人の証明を鑑賞したいな、と思っています。</p><p>しいて言えば、こちらも数学基礎論的な証明の仕方や、<br>人間の理解を超えたような2つの概念の結びつき、に興味があるのかもしれないです。</p><h2 id="まとめ"><a href="#まとめ" class="headerlink" title="まとめ"></a>まとめ</h2><p>興味のあることはたくさんありますが、<br>これらには何か統一的テーマがあるのではないか、という気がしています。</p><ul><li>プログラミング言語のパラダイムと、他の概念（生物・数学）との比較</li><li>そして、それらと、コンピューターの構造やアーキテクチャ、身体性などとの関係性</li></ul><p>ただ、これが本当に自分の興味を言い当てられているのかは分かりません。<br>今日も大学の図書館で色んな本をあさってみましたが、何となく満たされないというか、<br>ちょっとかゆいところが残っている感覚がまだあります。</p><p>大学の授業などで、いろんな経験をして、だんだんわかってくるのかな、と思います。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;こんにちは。shundroidです。&lt;br&gt;明日から大学の授業が始まります。&lt;br&gt;この後色々好きなものとかが変わっていくことが想定されますが、&lt;br&gt;とりあえず、現時点での自分の興味について書き記しておこうと思います。&lt;/p&gt;
&lt;h2 id=&quot;プログラミング言語のパラダイ
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>これから、どういうプログラムを書いていきたいか</title>
    <link href="http://asterisks.netlify.com/2021/04/01/korekara-programming/"/>
    <id>http://asterisks.netlify.com/2021/04/01/korekara-programming/</id>
    <published>2021-04-01T15:16:14.000Z</published>
    <updated>2021-05-06T02:40:20.686Z</updated>
    
    <content type="html"><![CDATA[<p>こんにちは。shundroidです。<br>約1年ぶりの投稿です。<br>ブログ開始時は、すごくたくさん記事を書いていたのに、<br>素数の分布みたいな投稿頻度になってしまい、誠にすみません。</p><p>さて、今日で高校生は終わりです。（※書いていたときは3/31でした）<br>高校での3年間で、物の捉え方や、考え方、好み、楽しいこと、などが大きく変わったと思います。<br>プログラミングに対する姿勢も変わったと思います。</p><p>高校に入るまで、また高校に入ってからしばらくは、<br>プログラミングを、あくまで何か制作物を作るための手段と考えて、<br>そのためにいかにパフォーマンスが良いコードを、綺麗に書くか、ということを大事にしてきました。</p><p>ですが、最近は、<strong>プログラミングそのものを目的にしたい</strong>、と考えるようになりました。<br>今回は、そのことについて書こうと思います。</p><h2 id="Webプログラミングに飽きてきた？"><a href="#Webプログラミングに飽きてきた？" class="headerlink" title="Webプログラミングに飽きてきた？"></a>Webプログラミングに飽きてきた？</h2><p>高校では、ディベートシステム作成、文化祭の予約システム作成、<br>文化祭のサイト作成、発表会でのデモアプリ作成、など、<br>あらゆる場面で、HTML/CSS/JavaScriptを利用した、Webアプリを開発してきました。</p><p>ただ、色んなものを作っているうちに、<br><strong>やりたいことを形にする過程が単調化</strong>してしまい、<br>もう大体どう書けばよいのか分かってきてしまったので、<br>タイピングゲームのようになってしまいました。</p><p>思えば、Web界隈でプログラミングを始めてからは早7年が経とうとしています。<br>懐古厨みたいになってすみませんが、最初のころは、まだjQuery全盛期で、<br>デザインではbootstrapとかが流行っていた頃でした。jQuery UIとかもありました。<br>Ajaxが「すげー」みたいになっていて、HTML5がこれから、という頃でした。<br>FlashやSilverlightから脱却しようか、という流れになった所で、<br>まだできることは限られており、「幕開け」という感じだったでしょうか。<br>（YouTubeもFlashだったんです。今の子供たちは信じてくれなさそう）</p><p>徐々に、Web「アプリ」が盛んになってきて、Web界隈は大きく進化したと思います。<br>「アプリ」として設計をしやすくする、Angular.jsとか、knockout.jsとかを使うようになり、<br>その後node.jsの台頭で、browserifyが流行りました。<br>requireがクライアントでも使える！という事にワクワクしていました。</p><p>盛者必衰、browserifyが衰退してWebpackが流行り始め、<br>それを基盤として、Angular 2、React、Vue、と<strong>目まぐるしく流行が変化する時代</strong>になりました。<br>Webプログラミングでできることも、増えていきました。<br>node.jsによるサーバーサイドプログラム、<br>それを応用したElectronによるデスクトップアプリ開発、<br>（Firefox OSはあまり流行りませんでしたが）PWAによるスマートフォン向けアプリ開発、などです。<br>またそれらを支える、フリーで使えるクラウドサービス（Heroku、Firebaseなど）も増えていきました。</p><p>ですが、最近はどうでしょう。僕が受験期で離れていて流行に疎くなったからかもしれませんが、<br><strong>安定期に入ってきた</strong>のではないかな、と思います。<br>大体作りたいものは、Vue.js+Webpackで、かなり効率的に、綺麗に作れるようになってしまいました。<br>数あるサービスを使えば、デスクトップアプリも、スマホ向けアプリも、サーバーサイドも、これ一本でできてしまいます。</p><p>それらが発表され、最初に使い始めたときは、<br>新しいことができるようになり、また開発スタイルが大きく変わることに、<br>とても感動し、ワクワクしたものですが、<br>もう慣れてしまい、あまり目新しさを感じなくなってしまったのです。</p><p>Webプログラミングは、何かを作るための<strong>ツールとしては、</strong><br><strong>非常に強力なものになった</strong>と思います。<br>ただ、自分にとっては、そこでのプログラミング自体を楽しみとするのは、<br>もう終わりなのかな、と思うようになってしまいました。</p><h2 id="Webプログラミングで学んだこと"><a href="#Webプログラミングで学んだこと" class="headerlink" title="Webプログラミングで学んだこと"></a>Webプログラミングで学んだこと</h2><p>Webプログラミングを始める前の約2年間は、<br>Visual BasicやC#をやっていたので、そこであらゆるプログラミングの元となる、<br>基本的な考え方は身に着けることが出来ていました。</p><p>その後、JavaScriptで開発するようになって、一番学べたことは、<br>やはり、Mozillaで、皆さんと一緒に開発することができた経験だと思います。</p><p>Webプログラミングは、そのオープン性の高さにより、<br>他のプログラミングと比べても、共同開発との親和性が高いな、と思います。</p><p>皆さんと開発できたことで、それまでプログラムは<strong>動けばいいや</strong>、<strong>自分が読めればいいや</strong>と思っていたのが、<br><strong>どう実装したら綺麗だろうか</strong>、などの視点から考えるようになりました。</p><p>疎結合の大切さや、オブザーバーパターンなどを最初に学びました。<br>そして、MVCやMVVMのメリットなどを、実際の開発を通じて知ることができ、<br>大規模なサービス・アプリを作ることが多いWeb系だからこそ、の、<br><strong>大局的な構造の整理の重要さや、その設計・実装の楽しさ</strong>を感じることができました。</p><p>また、一分野が、時間を経てどのように変化するか、を生で見ていくことができたので、<br><strong>言語の成長過程や、どのようにライブラリが台頭してくるのか</strong>、などを体感できました。</p><p>そのほか、GitやGitHubにも慣れることができて、よかったです。</p><h2 id="SwiftとPythonに触れた経験"><a href="#SwiftとPythonに触れた経験" class="headerlink" title="SwiftとPythonに触れた経験"></a>SwiftとPythonに触れた経験</h2><p>受験が終わってからなので、最近ですが、<br>開発の都合で、SwiftやPythonに触れる機会がありました。</p><p><blockquote class="twitter-tweet"><p lang="ja" dir="ltr">この2か月、swiftとpythonを触ることが結構多かったんだけど、マジでこの2つ対極的だった<br>swiftは、文法レベルで仕様どんどん増やしていくから、<code>if case let</code>みたいな意味不明構文がたくさん、自由度低<br>pythonは、enumでさえライブラリレベル。metaclassすげえ。自由度高<br>かな</p>&mdash; shundroid (@shundroid_p) <a href="https://twitter.com/shundroid_p/status/1377139828026875907?ref_src=twsrc%5Etfw" target="_blank" rel="noopener">March 31, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p><p>これらは、結構javascriptとは趣が異なっており、またそれぞれ性格が特徴的で、面白かったです。</p><p>そして、これは受験勉強の影響な気もしますが、<br>社会系の教科で、「思想」や「歴史」「制度」などを体系的理解の対象としてきたのと同様に、<br><strong>「プログラミング言語」そのものも、体系的理解の対象として扱ってみたい</strong>、という気持ちが強くなりました。</p><p>その言語で書かれたもの、というより、<br>その<strong>言語自体が、どのような要請で設計され、どういう強みを持っているか</strong>、を、他の言語との対照の中で考えてみたい、と思うようになりました。</p><p><blockquote class="twitter-tweet"><p lang="ja" dir="ltr">最近色んな言語に触れることが多いのだけれど，色々比べることでそれぞれの言語が持つ特徴とかが見えてきてやっぱ面白いね<br>ただ1つ1つをもっと味わいたいとも思う</p>&mdash; shundroid (@shundroid_p) <a href="https://twitter.com/shundroid_p/status/1376871940158222336?ref_src=twsrc%5Etfw" target="_blank" rel="noopener">March 30, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p><p>最近は、<strong>ただ綺麗だ、パフォーマンスが良い</strong>、というだけでなく、<br>その<strong>言語の個性を生かしたプログラム</strong>を書こう、と意識しています。</p><p><blockquote class="twitter-tweet"><p lang="ja" dir="ltr">metaclassとdecoratorと__から始まるプロパティを多用した、pythonらしいコードが書けたような気がして喜んでいる</p>&mdash; shundroid (@shundroid_p) <a href="https://twitter.com/shundroid_p/status/1377223754699268097?ref_src=twsrc%5Etfw" target="_blank" rel="noopener">March 31, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p><h2 id="「目的」としてのプログラミング"><a href="#「目的」としてのプログラミング" class="headerlink" title="「目的」としてのプログラミング"></a>「目的」としてのプログラミング</h2><p>今までは、プログラミングを、何か制作物を作るための手段だと考えてきたわけで、<br>3年前には下のような記事も書いていたようです。(今読むと恥ずかしい)</p><iframe class="hatenablogcard" style="width: 100%; height: 155px; max-width: 680px;" src="https://hatenablog-parts.com/embed?url=https://asterisks.netlify.com/2018/08/23/for-programming-beginner/" width="300" height="150" frameborder="0" scrolling="no"></iframe><p>確かに、プログラミングを初めてする時は、手段として身につけた方が学びやすいでしょう。<br>これは確実にそうだと思います。</p><p>ただ、<strong>プログラミング自体を楽しみたい、深めたい</strong>、というふうに、目的が変化したときは、<br><strong>実際に何の言語で書くか、も重要</strong>だな、と思うようになりました。</p><p>そこで、 <del>最近作ろうと思うものがネタ切れ気味なのもあり、</del><br><strong>プログラミングを目的とし、制作物を手段とする</strong>、という風に、<br>目的と手段を反転させてみてはどうか、と思っています。</p><p>例えば、pythonでmetaclassを使うために、interface的なものを実装する練習をしてみる、といった感じです。</p><p>こうすることで、プログラミングの世界が広がるのではないか、と思っています。</p><h2 id="まとめ"><a href="#まとめ" class="headerlink" title="まとめ"></a>まとめ</h2><p>他言語との比較の上、そのプログラミング言語の固有性を味わう、という経験をしていきたい、と思っていますが、<br>これは、やはりWebプログラミング界隈で長い時間をかけ、その風土を体感してきたことが生きると思っています。<br>javascriptではこういう書き方は忌避されるけど、swiftだといいんだな、という風に、その体験を様々な発見の基準とすることができると思います。</p><p>この意味では、今までWebプログラミングをやってきて良かった、と感じています。<br>色々と貴重な経験をさせてくださった皆さま、ありがとうございました。</p><p>大学では、新しいプログラミング生活を過ごしていきたいです。</p><p>以下、今のところ迷っていることを書いておきます。</p><ul><li>新しい言語を味わう、となれば、何を味わうのか：Python, Swift, Rustあたりを考えている</li><li>1つをじっくり味わうのが良いのか、それとも複数を広く味わうのが良いのか</li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;こんにちは。shundroidです。&lt;br&gt;約1年ぶりの投稿です。&lt;br&gt;ブログ開始時は、すごくたくさん記事を書いていたのに、&lt;br&gt;素数の分布みたいな投稿頻度になってしまい、誠にすみません。&lt;/p&gt;
&lt;p&gt;さて、今日で高校生は終わりです。（※書いていたときは3/31でした
      
    
    </summary>
    
      <category term="programming" scheme="http://asterisks.netlify.com/categories/programming/"/>
    
    
  </entry>
  
  <entry>
    <title>Vue で Web Animations をかっこよく実装するライブラリを作ってみた</title>
    <link href="http://asterisks.netlify.com/2020/03/14/vue-animate-component/"/>
    <id>http://asterisks.netlify.com/2020/03/14/vue-animate-component/</id>
    <published>2020-03-14T19:39:57.000Z</published>
    <updated>2021-05-06T02:40:20.692Z</updated>
    
    <content type="html"><![CDATA[<p>こんにちは。shundroid です。<br>あけましておめでとうございます(遅)<br>10か月振りくらいの投稿ですね。</p><p>高校が休みになっているので、勉強・開発に励んでおりました。</p><p>そこで、Vue.js で <a href="https://jp.vuejs.org/v2/guide/transitions.html" target="_blank" rel="noopener">Transition</a> だけでなく、<br>Web Animations を取り入れたい状況が出てきました。</p><h2 id="現状で-Vue-js-で-Web-Animations-を使う場合"><a href="#現状で-Vue-js-で-Web-Animations-を使う場合" class="headerlink" title="現状で Vue.js で Web Animations を使う場合"></a>現状で Vue.js で Web Animations を使う場合</h2><p>そこで次のようなコードを書いたのですが、<br>これは Vue.js としてはふさわしくないですよね。</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">template</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">"app"</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">"rect"</span> <span class="attr">ref</span>=<span class="string">"rect"</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    &#123;&#123; active ? 'Animating' : 'Stopping' &#125;&#125;</span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> @<span class="attr">click</span>=<span class="string">"active = !active"</span>&gt;</span>Toggle<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">template</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span>&gt;</span><span class="undefined"></span></span><br><span class="line"><span class="javascript"><span class="keyword">export</span> <span class="keyword">default</span> &#123;</span></span><br><span class="line"><span class="undefined">  data() &#123;</span></span><br><span class="line"><span class="javascript">    <span class="keyword">return</span> &#123;</span></span><br><span class="line"><span class="javascript">      active: <span class="literal">false</span></span></span><br><span class="line"><span class="undefined">    &#125;</span></span><br><span class="line"><span class="undefined">  &#125;,</span></span><br><span class="line"><span class="undefined">  watch() &#123;</span></span><br><span class="line"><span class="undefined">    active() &#123;</span></span><br><span class="line"><span class="javascript">      <span class="keyword">if</span> (<span class="keyword">this</span>.active) &#123;</span></span><br><span class="line"><span class="javascript">        <span class="keyword">this</span>.$refs[<span class="string">'rect'</span>].animate([</span></span><br><span class="line"><span class="javascript">          &#123; <span class="attr">transform</span>: <span class="string">'translate(0,0)'</span>, <span class="attr">offset</span>: <span class="number">0</span> &#125;,</span></span><br><span class="line"><span class="javascript">          &#123; <span class="attr">transform</span>: <span class="string">'translate(100px,0)'</span>, <span class="attr">offset</span>: <span class="number">0.25</span> &#125;,</span></span><br><span class="line"><span class="javascript">          &#123; <span class="attr">transform</span>: <span class="string">'translate(50px,0)'</span>, <span class="attr">offset</span>: <span class="number">0.5</span> &#125;,</span></span><br><span class="line"><span class="javascript">          &#123; <span class="attr">transform</span>: <span class="string">'translate(120px,0)'</span>, <span class="attr">offset</span>: <span class="number">1</span> &#125;</span></span><br><span class="line"><span class="undefined">        ], &#123;</span></span><br><span class="line"><span class="undefined">          duration: 1000,</span></span><br><span class="line"><span class="javascript">          easing: <span class="string">'ease'</span></span></span><br><span class="line"><span class="undefined">        &#125;)</span></span><br><span class="line"><span class="undefined">      &#125;</span></span><br><span class="line"><span class="undefined">    &#125;</span></span><br><span class="line"><span class="undefined">  &#125;</span></span><br><span class="line"><span class="undefined">&#125;</span></span><br><span class="line"><span class="undefined"></span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">style</span>&gt;</span><span class="undefined"></span></span><br><span class="line"><span class="undefined">#rect &#123;</span></span><br><span class="line"><span class="undefined">  width: 100px;</span></span><br><span class="line"><span class="undefined">  height: 100px;</span></span><br><span class="line"><span class="undefined">  background-color: red;</span></span><br><span class="line"><span class="undefined">&#125;</span></span><br><span class="line"><span class="undefined"></span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br></pre></td></tr></table></figure><p>どこがふさわしくないのでしょうか。 <code>ref</code> を使っている辺りが明らかに良くないですけど、<br>問題はそれ以上にあると考えます。</p><h2 id="「動作」で書くか「状態」で書くか"><a href="#「動作」で書くか「状態」で書くか" class="headerlink" title="「動作」で書くか「状態」で書くか"></a>「動作」で書くか「状態」で書くか</h2><p>事を大きくしすぎた気もしますが、根本的な問題はここにあると思います。<br>アニメーションのような <strong>一過性</strong> のものは、一般的には「動作」で書くのがふさわしいですよね。<br>そのため、 <code>.animate</code> という <strong>メソッド</strong> によって「動作」を記述しているのです。</p><p>ただし、Vue.js は伝統的に、「動作」による記述よりも「状態」による記述を好みます。<br>例えば、View上の文字を変更するのに <code>element.updateText(&#39;hoge!&#39;)</code> みたいに書いたりはしませんよね。<br><code>&#123;&#123; text &#125;&#125;</code> のような <code>text</code> という <code>data</code> の「状態」の記述によって、UIの変更を行っています。<br>インラインテキストだけでなく、属性やスタイルの変更、また <code>Transition</code> についても同様に、「状態」による記述を行っています。</p><p>これはどうしてでしょうか。Vue.js の存在意義を考えるとこれは明らかです。<br>先ほども少し触れましたが、「動作」というのは一過的な概念です。<br>つまり、一回「動作」してしまえば、それが長い間ずっと続くようなことはありません。<br>ただし、Vue にとっては、これが長い間続いてほしいんですよね。これはなぜか。<br>まさしく、<strong>双方向データバインディング</strong> を保つためです。<br>データのリンクは、動作のように一回一回の時のみかろうじてつなぎ留められているようではいけないのです。</p><p>このように Vue で「状態」が重んじられている背景を踏まえると、そこに「動作」で記述されたプログラムを書くのは、<br>なんだか異物感を感じるわけです。もちろん動きはするんですけど、ちょっと消化不良というか、そういう感覚です。</p><p>HTML(XML) は非常に「状態」を書くのに優れた(マークアップ)言語です。<br>対してJSは「動作」を書くのを主としているわけなので、<br>例え <code>.animate</code> メソッドの引数で渡されているオブジェクトが状態だ！と主張したとしても、<br><code>&lt;template&gt;</code> タグ内で書けた方がよいですよね。</p><p>というわけで、Web Animation を「状態」で記述するようにしたのが、このライブラリです。<br>コードを見てみましょう。</p><p>※ もちろん Vue でも動作を好む場面はあります。 <code>v-on</code> などに代表されますが、これらで実行される処理は <code>View</code> の背後の、ロジック的な部分であって、Vue でなくても別に良い部分なわけなので、ここをとって「Vueは動作による記述を好む」というのは言いすぎな気がします。</p><h2 id="「状態」で-Web-Animations-を記述する。"><a href="#「状態」で-Web-Animations-を記述する。" class="headerlink" title="「状態」で Web Animations を記述する。"></a>「状態」で Web Animations を記述する。</h2><p>インストールは、yarn または npm で行ってください。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ yarn add vue-animate-component</span><br></pre></td></tr></table></figure><p>または</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ npm i --save vue-animate-component</span><br></pre></td></tr></table></figure><p>コードは次のようになります。</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">template</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">"app"</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">"rect"</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">animation</span> <span class="attr">v-model</span>=<span class="string">"active"</span> <span class="attr">:duration</span>=<span class="string">"1000"</span> <span class="attr">easing</span>=<span class="string">"ease"</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">keyframe</span> <span class="attr">transform</span>=<span class="string">"translate(0, 0)"</span> <span class="attr">:offset</span>=<span class="string">"0"</span> /&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">keyframe</span> <span class="attr">transform</span>=<span class="string">"translate(100px, 0)"</span> <span class="attr">:offset</span>=<span class="string">"0.25"</span> /&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">keyframe</span> <span class="attr">transform</span>=<span class="string">"translate(50px, 0)"</span> <span class="attr">:offset</span>=<span class="string">"0.5"</span> /&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">keyframe</span> <span class="attr">transform</span>=<span class="string">"translate(120px, 0)"</span> <span class="attr">:offset</span>=<span class="string">"1"</span> /&gt;</span></span><br><span class="line">      <span class="tag">&lt;/<span class="name">animation</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    &#123;&#123; active ? 'Animating' : 'Stopping' &#125;&#125;</span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> @<span class="attr">click</span>=<span class="string">"active = !active"</span>&gt;</span>Toggle<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">template</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span>&gt;</span><span class="undefined"></span></span><br><span class="line"><span class="javascript"><span class="keyword">import</span> &#123; Animation, Keyframe &#125; <span class="keyword">from</span> <span class="string">'vue-animate-component'</span></span></span><br><span class="line"><span class="javascript"><span class="keyword">export</span> <span class="keyword">default</span> &#123;</span></span><br><span class="line"><span class="undefined">  components: &#123;</span></span><br><span class="line"><span class="undefined">    Animation,</span></span><br><span class="line"><span class="undefined">    Keyframe</span></span><br><span class="line"><span class="undefined">  &#125;,</span></span><br><span class="line"><span class="undefined">  data() &#123;</span></span><br><span class="line"><span class="javascript">    <span class="keyword">return</span> &#123;</span></span><br><span class="line"><span class="javascript">      active: <span class="literal">false</span></span></span><br><span class="line"><span class="undefined">    &#125;</span></span><br><span class="line"><span class="undefined">  &#125;</span></span><br><span class="line"><span class="undefined">&#125;</span></span><br><span class="line"><span class="undefined"></span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">style</span>&gt;</span><span class="undefined"></span></span><br><span class="line"><span class="undefined">#rect &#123;</span></span><br><span class="line"><span class="undefined">  width: 100px;</span></span><br><span class="line"><span class="undefined">  height: 100px;</span></span><br><span class="line"><span class="undefined">  background-color: red;</span></span><br><span class="line"><span class="undefined">&#125;</span></span><br><span class="line"><span class="undefined"></span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br></pre></td></tr></table></figure><p>Web Animation をタグによって記述できます。 <code>v-model</code> が <code>true</code> になった時、</p><p>アニメーションの終了は <code>v-model</code> が <code>false</code> になったことを検知してください。今後 <code>@finish</code> などを実装するかもしれませんが。</p><p>詳細な利用法は、Github レポジトリをご覧ください。</p><iframe class="hatenablogcard" style="width: 100%; height: 155px; max-width: 680px;" src="https://hatenablog-parts.com/embed?url=https://github.com/shundroid/vue-animate-component.git" width="300" height="150" frameborder="0" scrolling="no"></iframe><h2 id="今後の課題"><a href="#今後の課題" class="headerlink" title="今後の課題"></a>今後の課題</h2><ul><li><code>v-model</code> が <code>false</code> になった時、アニメーションを <code>pause</code> する</li><li><code>@finish</code> などのイベントを実装する(「動作」による記述を奨励するようですが…)</li></ul><h2 id="余談：実装がスッカスカな話"><a href="#余談：実装がスッカスカな話" class="headerlink" title="余談：実装がスッカスカな話"></a>余談：実装がスッカスカな話</h2><p>この実装は Github で見られるんですけど、スッカスカなので試しに <code>keyframes.vue</code> を見てみましょう</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">template</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">div</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">template</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span>&gt;</span><span class="undefined"></span></span><br><span class="line"><span class="javascript"><span class="keyword">export</span> <span class="keyword">default</span> &#123; &#125;</span></span><br><span class="line"><span class="undefined"></span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">style</span> <span class="attr">scoped</span>&gt;</span><span class="undefined"></span></span><br><span class="line"><span class="undefined">div &#123;</span></span><br><span class="line"><span class="undefined">  display: none;</span></span><br><span class="line"><span class="undefined">&#125;</span></span><br><span class="line"><span class="undefined"></span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br></pre></td></tr></table></figure><p>えっ()</p><p>つまりそういうことなんです。察してください。<br><code>animation.vue</code> のほうでは、自分と子要素の <code>$attrs</code> をそのまま <code>.animate</code> の引数に丸投げしているだけです。</p><p>そんな意味あることなの？と思われるかもしれませんが、大事なのはその変換過程ではなく、<br>状態は <code>&lt;template&gt;</code> 内で書く、という役割分担がはっきりすることと、<br>またアニメーションの開始を <code>v-model</code> による状態変化で行えることであってほしいです(希望)</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;こんにちは。shundroid です。&lt;br&gt;あけましておめでとうございます(遅)&lt;br&gt;10か月振りくらいの投稿ですね。&lt;/p&gt;
&lt;p&gt;高校が休みになっているので、勉強・開発に励んでおりました。&lt;/p&gt;
&lt;p&gt;そこで、Vue.js で &lt;a href=&quot;https://j
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>「キャンベル生物学」を読んで</title>
    <link href="http://asterisks.netlify.com/2019/05/01/campbell/"/>
    <id>http://asterisks.netlify.com/2019/05/01/campbell/</id>
    <published>2019-05-01T22:25:02.000Z</published>
    <updated>2021-05-06T02:40:20.682Z</updated>
    
    <content type="html"><![CDATA[<p>こんにちは。shundroid です。<br>新年度・新時代が始まりましたね。</p><p>さて、昨日「キャンベル生物学」という太い本を読み終わったので<br>その感想をまとめようと思います。</p><h2 id="概要"><a href="#概要" class="headerlink" title="概要"></a>概要</h2><p>キャンベル生物学 原書11版は1444ページ、目測でA4サイズくらいの本で、<br>生物学の幅広い分野の基礎が学べる本です。</p><p>「高校生にとっても最適の教科書」とありますが、まさにその通りで、<br>解説が非常に丁寧でわかりやすかったです。(英訳だからか独特の言い回しがありますがそれは慣れます)</p><p>わざわざどうしてこの本を読んだのかといいますと、高校の生物の先生に勧められたからです。</p><p>最初は割と緩く読んでいたんですけど、このままだといつまでたっても読み終わらない気がしたので、<br>4月あたりからスパートをかけました。グラフにも必死さが現れていますね()</p><p><img src="https://lh3.googleusercontent.com/Yx2AA2EbhD7MKZxEbxISUAVXWIvzcQJ-6Z6POhSC9BDaPS4VgJ5JiDgGODObO4LEl1Gh3md205nD-_eyA4qYRutgg0RxbpCRAH3fZaI5qUvHDcFlu5VeUehu2NRap2Fp_13MY1EKKFz7UisjnznbChWyJJqs4rkyCy4crEh-8O58KJRrkdqm7GjO0j0S1m4vBZbv0MSNlgLqT9iTvOZLM-90-w3fP6cr5lhROrb0BZQ2md8CBAxGFH_AsTG7kKkGs5hveETBooVnbaWiC02cVHYQNE7vx9Wr0h7-21kbFBP4UjPX0-E2fUrnV2M5PTqM8ICXtLKo17-XA8h3y1f2TS1fu6SgftVwuXeDEE_BcHXTC0SAUL5dU_AwGrLx2nX2-AnygeXS3IEO18GLdXw1cbrEoegmA0GmCJTOu0JV45mWf3VSKOty6pDeqZc9FhGA8PSTPkiauTcIQ49H9Ox99vKB2wj5rim4FII4eGMNxxDtPn14oZkPzoVqOFB8tWgNTgupM2euub9WpGuCMeBkOmfabqDqz8QZHXmPjmc4S4Y1IZev6c3yvv_olRx5Wcyos1QsFYb2xiHKi6z1t97KDCg-HbhjtthBE421A7fEzDowAlTeSx7lYoD7buVghH2psskyO_PgvCzPVNu_1bWFJdUMWtDsCMiPJqnV8p-SHNjA0IUH69OF-J_JNn5h0VBEeN3hX2b0aLHnVutknZLZgi5xQw=w773-h464-no" alt></p><h2 id="キャンベル生物学のよさ"><a href="#キャンベル生物学のよさ" class="headerlink" title="キャンベル生物学のよさ"></a>キャンベル生物学のよさ</h2><p>全体的には「学校で習った分野」と「そうでない分野」に分かれていました。<br>前者は動物の形態と機能などで、復習になったほか、新たな概念などを取り入れて学びを深めることができました。<br>後者は生命史などで、少し負荷はありましたが、そこでも既習分野との関連性や相似性が見えてきて面白かったです。</p><p>次に、それぞれのテーマについて感想を書きたいと思います。</p><h3 id="ミクロ・マクロの視点の推移が面白い"><a href="#ミクロ・マクロの視点の推移が面白い" class="headerlink" title="ミクロ・マクロの視点の推移が面白い"></a>ミクロ・マクロの視点の推移が面白い</h3><p>「空間としての推移」では、生体分子の構造という非常にミクロな視点から、<br>細胞小器官の構造、細胞の構造、組織、器官、個体、個体群、群集、生態系、と、マクロな視点に移っていく様子がよく理解出来ました。<br>「時間としての推移」では、遺伝的変異の頻度変化（小進化）がどう種分化（大進化）につながってくるのかとして、<br>「ミクロ」と「マクロ」のつながりが捉えられました。</p><p>少しそれますが、進化と生態系は相互作用するので、ここで「空間」と「時間」のつながりも生まれます。<br>生物学は空間にも時間にも広がりを持っているのが強く認識できました。</p><h4 id="生命のフラクタル"><a href="#生命のフラクタル" class="headerlink" title="生命のフラクタル"></a>生命のフラクタル</h4><p>そこで気づいたことがあります。<br>生命が「フラクタル」のようであるということです。</p><p><img src="https://lh3.googleusercontent.com/Q66Ghm9nKn0aSNRN2K8MHkEjel-IOChZd63N3Qu0aac4oK143XDmhBGk2ToHvBZhCTNlz0ArFgFn1LNSUhDNHGj-zzgi-L-u1IrkzpFHwvZa7ZXQ08r0k5A861p8eY5QpM_87HtVlHAw9L3OP4f240YkvgOAHiCfISCe-Xx5j2csiwc0t156QqKJgEdBP5vIb8RzDFYYkrzY1_8PAah_ucDFVGUavz9mvO_hBriZPDTNFZ9uhJcvIFdTwV9NHiIPEA04U6NutIY7vkyCt50a0EwoGA5IBQV8Qo7KmKUKAF4IdzIE91Nha2PNYNWZEMWFcldsW-I-BzE64PHpzJFPCqEAVfjOH2CAN7QkYyjppZIamr_XbrFvG-2fE00YwDPxeE-kWkqNLMk9wqptCIZeAswY0DIuXlflDaX2Ug1lbYiAUPOZRmwB_fpPhSpxwSazqoyj2lEvbzlBC_axjGU-XHy9GN-SC-KhODIkPfECn7_jjbs1QQhwO8Gr_mQfrqdblXoXxUtMeiS9hStBMwUFUiqMZCPW-wvIA9eDtNWj3tZ3x-17U_tgyNuMyGq-M-TFrzW9YIMh-BKdxELJX6_9moCAcqRhNWlCfM9AAMkIYS05d-9K4WhR_EVvjREPesFsvYr8I6O1Iag7eD3ze0NXJjvNeL4jeU6xYKE4-o50eiMP6ET5k3s0Q29O6gU_Mucs-Kpp8XHjo-Pq-s_C_chxlW8yvQ=w704-h966-no" alt><br>(部活の先輩が作ってくださいました、マンデルブロ集合)</p><p>フラクタルとは Wikipedia によると、「部分と全体が自己相似」になっているもののことだそうです。<br>これは生物を通しても言えると思います。</p><p>例えば、空間としてのフラクタルを見てみましょう。<br>ミクロな視点で原子に注目します。原子は光を吸収して熱を放出することが<strong>多いです</strong>。<br>これをマクロな視点で考えると、生態系全体としても、やはりこのようなことが起きています。<br>生産者である主に緑色植物が光を吸収します。そのエネルギーは生態系内では化学エネルギーとして循環しますが、<br>生態系の外に出される形はやはり熱が多いです。</p><p>時間として考えてみてもこのことが当てはまります。<br>少し広い例となりますが、細胞は分裂し、死にます。また個体は誕生・死亡します。<br>同じように種は分化・絶滅します。<br>これらは同じような表し方がされています。p1194の細胞系譜や、よくある家系図、また種の系統樹は似た形をしています。<br>固有の例ですがミツバチはその個体群自身が一つの個体のようにふるまいます。女王バチが生殖細胞に当てはまったりします。</p><p>無限に続くフラクタルというわけではないですが、部分が全体に対応付けできます。<br>あくまで見方の１つですが、どうしてこのような見方ができるのか思うと不思議です。<br>１つ思っているのは、「全体」は「部分」より後にできるので、「部分」が環境に適合していた形態が、そのまま「全体」にも引き継がれるのかなっていうことです。<br>これも環境適合的な選択圧を受けているのでしょう。</p><p>本書にはこの視点の推移で「組織化」や「創発特性」という概念が取り上げられています。<br>創発特性は抽象度が上がる（＝よりマクロになる）ことで新たに特徴が生まれるということです。<br>例えばニューロン一本ではこうやってブログは書けませんが、組織化して脳となることでブログが書けるようになっています。<br>組織化により個々の特徴が再び現れること（＝フラクタル）と、新たな特徴が現れること（＝創発特性）の２つがあって、<br>それぞれ大切なのだろうと思います。</p><h3 id="分野横断的な学習ができて面白い"><a href="#分野横断的な学習ができて面白い" class="headerlink" title="分野横断的な学習ができて面白い"></a>分野横断的な学習ができて面白い</h3><p>読み進めるにあたって、生物学は様々な分野と連係しているのだと気づかされました。</p><p>例えば、統計などでは数学、化石記録などでは地学、バイオームでは地理、代謝には物理、環境保全では社会系、<br>シミュレーションなどでは情報、といった感じです。</p><p>生物学から見ると様々な分野とつながって、分野のカバー範囲の広さを感じさせられますが、<br>逆から見ると、様々な分野から生物学につながっています。<br>これは、私たちの生活の様々な場面に生物学が絡んでくるからなのでしょう。事実私たちは生物です。</p><h3 id="個々で興味を持ったこと"><a href="#個々で興味を持ったこと" class="headerlink" title="個々で興味を持ったこと"></a>個々で興味を持ったこと</h3><p>色々あります。</p><p>最初の方では<strong>代謝</strong>がエネルギーの吸収・放出で表せる感じが楽しかったです。<br>化学エネルギーって（少なくともここでは）電子の位置エネルギーなんですね。<br>ATPがどうして高エネルギーを持っているのか、そのエネルギーをどうやって酵素等に付与するのかがわかって<br>もやもやが消えました。</p><p><strong>ハーディ・ワインベルグ平衡</strong>や<strong>個体群生態学</strong>では数学とのつながりが個人的に好きでした。</p><p>最後に<strong>ガイア理論</strong>です。（本文中ではガイア仮説）<br>これは結構気になっています。先ほどフラクタルの話をしましたが、なんと「地球全体」を１つの生命体と捉えて、<br>そこでも恒常性を維持する働きがあると考えるそうです。賛否両論あるそうですが。<br>これから調べてみたいと思います。</p><h2 id="まとめ・これから読む人にアドバイス"><a href="#まとめ・これから読む人にアドバイス" class="headerlink" title="まとめ・これから読む人にアドバイス"></a>まとめ・これから読む人にアドバイス</h2><p>ただ知識を広げさせてくれるのではなく、それをもとに色々考えさせてくれたりする本でした。<br>忍耐力と読解力も上がったでしょう。</p><p>これから読む人へ<br>多分本気で読めば1か月くらいで終わります。僕は半年かかっちゃったんですけど()<br>あと、個々の章の話をそこで完結させないで、他の分野とのつながり、を意識して読むと見えてくるものが変わります。<br>結構疲れますが得られるものは大きいので頑張ってください(小並)</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;こんにちは。shundroid です。&lt;br&gt;新年度・新時代が始まりましたね。&lt;/p&gt;
&lt;p&gt;さて、昨日「キャンベル生物学」という太い本を読み終わったので&lt;br&gt;その感想をまとめようと思います。&lt;/p&gt;
&lt;h2 id=&quot;概要&quot;&gt;&lt;a href=&quot;#概要&quot; class=&quot;he
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>Nuxt v2 のビルドが重すぎるので軽くする</title>
    <link href="http://asterisks.netlify.com/2019/04/01/nuxt-v2-speed-up/"/>
    <id>http://asterisks.netlify.com/2019/04/01/nuxt-v2-speed-up/</id>
    <published>2019-04-01T17:51:40.000Z</published>
    <updated>2021-05-06T02:40:20.687Z</updated>
    
    <content type="html"><![CDATA[<p>こんにちは。shundroid です。お久しぶりです。<br>記事を書くたびにお久しぶりになりますねw</p><p>早いもので高校に入学してから1年になります。<br>この1年はプログラミング以外のことにもいろいろチャレンジして、<br>充実した高校生活を送ることができました。</p><p>クラス替えがドキドキ…</p><p>さて、今回は割と今年(少ない機会でも)愛用した <a href="https://ja.nuxtjs.org/" target="_blank" rel="noopener">Nuxt</a> のビルド速度を<br>向上させる方法を紹介します。</p><p>あ、そだそだ、今年はプログラミングを目的にしてプログラミングすることは少なかったんですけど、<br>割と学校の発表で(Nuxtを使って)デモアプリを作ったり、ディベートの授業で電子投票用のシステムを作ったりと、<br>「手段」としてプログラミングをすることが多かったです。</p><p>プログラミングのスキルを身に着けておいて、できることが広がったので、<br>2020年プログラミング必修化で、よりプログラミングが普遍的なものとなり、<br>学校での学びが深められるようになるとよいと思います。</p><h2 id="使うもの"><a href="#使うもの" class="headerlink" title="使うもの"></a>使うもの</h2><p>Webpack の <a href="https://github.com/mzgoddard/hard-source-webpack-plugin" target="_blank" rel="noopener">hard-source-webpack-plugin</a> です。<br>これを使うことで、ビルド時のキャッシュを取ってくれるので、二回目以降のビルドが爆発的に速くなります。</p><p>下の「参考」の記事では、DllPlugin というものも紹介しています。<br>しかし使ってみたものの、hard-source-webpack-plugin と比べると効果が少ないので、<br>今回は割愛したいと思います。</p><h2 id="ポイント"><a href="#ポイント" class="headerlink" title="ポイント"></a>ポイント</h2><h3 id="webpack-config-js-を-nuxt-を通していじる"><a href="#webpack-config-js-を-nuxt-を通していじる" class="headerlink" title="webpack.config.js を nuxt を通していじる"></a>webpack.config.js を nuxt を通していじる</h3><p>実際に上のリンクの readme を見ることで、生の webpack への導入手順は分かります。<br>が、今回は nuxt v2 で行いたいです。つまり、webpack の config を、nuxt を通していじる方法を知ることが大事になってきます。<br>これが分かれば、おそらく DllPlugin の導入方法もわかるでしょう。</p><h2 id="やってみる"><a href="#やってみる" class="headerlink" title="やってみる"></a>やってみる</h2><h3 id="プラグインの導入"><a href="#プラグインの導入" class="headerlink" title="プラグインの導入"></a>プラグインの導入</h3><p>yarn:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ yarn add --dev hard-source-webpack-plugin</span><br></pre></td></tr></table></figure><p>npm:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ npm i -D hard-source-webpack-plugin</span><br></pre></td></tr></table></figure><p>※ <code>i</code> は <code>install</code>、 <code>-D</code> は <code>--save-dev</code> の省略形</p><h3 id="nuxt-config-js-の変更"><a href="#nuxt-config-js-の変更" class="headerlink" title="nuxt.config.js の変更"></a>nuxt.config.js の変更</h3><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> pkg = <span class="built_in">require</span>(<span class="string">'./package'</span>)</span><br><span class="line"><span class="comment">// 以下、追加</span></span><br><span class="line"><span class="keyword">const</span> HardSourceWebpackPlugin = <span class="built_in">require</span>(<span class="string">'hard-source-webpack-plugin'</span>)</span><br><span class="line"><span class="comment">// ここまで</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">module</span>.exports = &#123;</span><br><span class="line">  <span class="comment">// ...</span></span><br><span class="line">  <span class="comment">/*</span></span><br><span class="line"><span class="comment">  ** Build configuration</span></span><br><span class="line"><span class="comment">  */</span></span><br><span class="line"> build: &#123;</span><br><span class="line">   <span class="comment">/*</span></span><br><span class="line"><span class="comment">   ** you can extend webpack config here</span></span><br><span class="line"><span class="comment">   */</span></span><br><span class="line">  extend(config, ctx) &#123;</span><br><span class="line">    <span class="comment">// ...</span></span><br><span class="line">    <span class="comment">// 以下、追加</span></span><br><span class="line">    config.plugins.push(<span class="keyword">new</span> HardSourceWebpackPlugin())</span><br><span class="line">    <span class="comment">// ここまで</span></span><br><span class="line">  &#125;</span><br><span class="line"> &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>予想以上に簡単でした。今回薄いな(確定)</p><h2 id="やってみた"><a href="#やってみた" class="headerlink" title="やってみた"></a>やってみた</h2><p>yarn:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ yarn dev</span><br></pre></td></tr></table></figure><p>npm:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ npm run dev</span><br></pre></td></tr></table></figure><h3 id="１回目（キャッシュ未反映）"><a href="#１回目（キャッシュ未反映）" class="headerlink" title="１回目（キャッシュ未反映）"></a>１回目（キャッシュ未反映）</h3><p><img src="https://lh3.googleusercontent.com/sFFqfshR7YA3_V95ObkPaZk0cCXpgHdIK16XA4nVFX4iIYY5Ii3XoWnCoIPbJAAqRWnuiXvHHoDYWH6LkaOjN46XCV6KWPMbtpr-QwFKvvCraXZ7JJ0Jwu3wPjRxBYqBjIQvmSyzTReSSNT1oPOPqpf0VLJIYO_ywYOM9hj3gRcmuY13N1MKlvb-fa6Aq6A7tL9Whi-xGJn1e_KKfY6PCZqpwNHTWBgt67R-ie8ewsv9wfYegGSLC2Bj8YS2988m4ju3Q9OxCJBTnlm4sBzGIQnLjCmEkmQ3Izd7o2pKCW90ip01Am95NPN4lm1jsEKy1-djQcG32gnhx02_eI3PIMa4_AxH1EAqNE8c2H6ZNlR5SEoIZEUOxaPahXC-_D-Okc4lmfw5tRQOFwU6gu6KYKGxfNYXoYljtHUdmWSCPRN38RoN28HVQ2JkX8bmRACZDAm24sE29HYS19dYCBfrcDm32l-mTKB_4tdsGhUiXb4T2CF8X04D6oWDt3rjq3a6VeGBs_Q4uOWXQSml6Q5EebhHiBbrd-BihgjiRyyWP3UVJOxkWVRQzcHO67dlw0asrsh9iZ4QDjJZkNQJ2E8_Fi8mEdg5mahhjt2CuXMQzA6PKmioBst5sQ_wlFa28Bu_nqn1XlHfF1Xzfi5Qr3pNqFIQsL_719Zno179I1FK7KscZTXZ0RmyQ1KMle3O2JgagI_PCVexW5KFmesVhNKmgQ7C=w592-h324-no" alt><br>Client 側が 1.27<strong>m</strong> です。単位はm。つまり分です。<br>Server 側が 58.34s です。遅いですね。</p><h3 id="２回目（キャッシュあり）"><a href="#２回目（キャッシュあり）" class="headerlink" title="２回目（キャッシュあり）"></a>２回目（キャッシュあり）</h3><p><img src="https://lh3.googleusercontent.com/YUsf51JNmr84RQXr3ubQRNWIo4nmTcVEATw0FIynuA8O1wUGI_iE7iNGzi0mepc1mJQa38rXKn9s8LllAQpV4oSHhtoqVfieBEuBE6ZPUj9kcRqPv-aR14KBuDMiCPA-7wvoPO0jbcSfAoqBIUxVmTyQQIODbATgwXhXK7V7RJZuXaRse3evEeewSRp5o83fq_82xRjrwBREXCeiuaP4e6e-raAHSFutOspADJey3GQfAWYZGzwRMv5NeHziKuK_he-Bbe1JVyXecy4hEg4FJhyT2dZkQsuXUgqIyguNbHXgj_2ynmbrvABbiO99ALHwv3gl4hD5IdERhp-UiNsgxuu_xTAbG3j4F-DSeU_GA362mpJWjwdts9pF44Q0myss37edNkGeL6yuX56c8G5kqaKYfb8okR-5lRQm0VZM07EbGyvGqBqHiCixh2Q3ycrNOPCvY2-7ftRy4PuiOJ_xcN6XQl3YZTe9fZxq37wdHnuwEY9ko5xIejQRbHS9p5FQUOyZgQ_Y_W0x5Yp-hOLMgrXpIUHzuVK6S1F09wHAWqP7kv4IsdVe7d5C5ndUVx6UqoyHhY_L1cc3KeRYmdIT5jdmkRLVA_xq3dbsDLuUz5Y8vpjDPsVZnExWnhJIMMA4PuXhzbUHFgslhRHHOg3F6JTas-Ad9mm3hM6m1Njtpxdl_E2vYfODb00g7BBghkDzVre1YwPnPCfgTYDwXG4oboL8=w550-h301-no" alt><br>えっ速い<br>Client 側が 2.14s、Server 側が 34.45s です。<br>かなり速度が上がっていることがわかります。</p><h2 id="まとめ"><a href="#まとめ" class="headerlink" title="まとめ"></a>まとめ</h2><p>これは頼もしいですね。<br>Nuxt は SSR にしてくれるのもありますが、<br>実際 express のサーバーをセットアップしてくれるのがずいぶん楽なので、<br>使っています。</p><p>これでより良い Nuxt ライフとともに、新学期を迎えられそう！</p><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><p><a href="https://qiita.com/kmdsbng/items/d23f9b5f5fbc8869baad#fnref1" target="_blank" rel="noopener">https://qiita.com/kmdsbng/items/d23f9b5f5fbc8869baad#fnref1</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;こんにちは。shundroid です。お久しぶりです。&lt;br&gt;記事を書くたびにお久しぶりになりますねw&lt;/p&gt;
&lt;p&gt;早いもので高校に入学してから1年になります。&lt;br&gt;この1年はプログラミング以外のことにもいろいろチャレンジして、&lt;br&gt;充実した高校生活を送ることができま
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>フリーで使えるクラウドIDE「Codenvy」を使って Vue.js の開発を始めてみる</title>
    <link href="http://asterisks.netlify.com/2018/11/09/codenvy-vue-starter/"/>
    <id>http://asterisks.netlify.com/2018/11/09/codenvy-vue-starter/</id>
    <published>2018-11-09T21:00:53.000Z</published>
    <updated>2021-05-06T02:40:20.683Z</updated>
    
    <content type="html"><![CDATA[<p>こんにちは。shundroid です。<br>高校生活が本格的になってきました。楽しいですが忙しいですね。</p><p>さて、今回は、友人とアプリを１つ開発することになりました。<br>そこで、環境構築などを友人の pc で行うのは手間がかかるため、<br>その必要がない、クラウドIDEを用いることにしました。<br>使い方などを記録しておこうと思います。</p><h2 id="サービス・ライブラリなど"><a href="#サービス・ライブラリなど" class="headerlink" title="サービス・ライブラリなど"></a>サービス・ライブラリなど</h2><ul><li><a href="https://jp.vuejs.org/index.html" target="_blank" rel="noopener">Vue.js</a> : Web アプリ開発のフレームワークです。最近ホットになってきてうれしいです。</li><li>クラウドIDE : クラウド上で動くIDEです。環境構築の手間がいらないので、スマホで動作するものもあります（codeanywhereなど）</li><li><a href="https://www.eclipse.org/che/" target="_blank" rel="noopener">Eclipse Che</a> : クラウドIDE の一種です。あの Eclipse の「Next-Generation IDE」だと公式サイトには書いてありますね。</li><li><a href="https://codenvy.com/" target="_blank" rel="noopener">Codenvy</a> Eclipse Che をホストしているサービスです。</li></ul><h2 id="Codenvy-と他サービスの比較"><a href="#Codenvy-と他サービスの比較" class="headerlink" title="Codenvy と他サービスの比較"></a>Codenvy と他サービスの比較</h2><p>同等のクラウドIDE サービスとして、AWS Cloud 9 と codeanywhere が有名です。<br>それぞれのサービスの特徴をあげておいます。</p><ul><li>AWS Cloud 9 は一番有名なクラウドIDEなのではないでしょうか。Amazon が買収して<strong>無料で使えなくなりました。</strong></li><li>codeanywhere は「anywhere」というだけあって Android などスマホ版のアプリがあります。しかし無料では１日2時間までしか使えないという制約があります。</li></ul><p>Codenvy は無料でわりと高機能に使えて、さらに友人と開発するのに必要な「チーム開発」機能があったので選びました。ただしバグが少しありますね…。</p><h2 id="Codenvy-を始めてみる"><a href="#Codenvy-を始めてみる" class="headerlink" title="Codenvy を始めてみる"></a>Codenvy を始めてみる</h2><p><a href="https://codenvy.io/site/login" target="_blank" rel="noopener">https://codenvy.io/site/login</a></p><p>ここにアクセスして、アカウントを取得します。</p><p><img src="https://lh3.googleusercontent.com/fgn2IlNpZzRnc2cxbqLFx5ZVn3ncPLhzZZWXA0FKULyCWJHpz084pmQAlEPRTJlPg3qUy1jFnjhzQ9hpOnPHOmsY0IPrrb-tGKuqwizXsVqb7TUHKuUeOQU9RpxH57NMNUtHZfOGJtPMs4TqjCgOj7mMz7HHa51s997Je-aYcbkWGE3JWLqZR12nZDJnfB-CzrGzOwKwZp2gCOVBKs-5iJYZ9KMu2Eq7AYXdj2nBmRzWh-8YihneVD9rNk73Olo5SsaGMG-wo0cLdjTqjKphTWBAPvuFyg-VSN-CgCNT1GP9M97ehNVh9YIjdbG9tnkD56hNv8LPYR0Rk7vdq_5St0NF5bqBoFx6VP5dfXMt5Fg2Cdi8grFIbB7Au6T_JLUKHC30Aj1agEpLbKGGLa368SeJxSUGiX_tA54F_lPvsWBaOY4k73GZV8MhSgDmQAuy7tDiz81GU4oaY5GaisqrIt7rrrMITIQW1RmXJIEs8sjguf9m2kffA2zqAcv4NdYys7XMBv8YR-WHnppaE3KYlGtcLnZ8z5s8gfICs2msiwIzUDJhBUTm2C06r4qD6zOtlgWkoAI4XMb_YIdAReGj4Gjx__AniU5vCAGde4iROcIIjgaVUrqXHQwZeyco8inC9nW5k148UGV61ELvyLU2A_1_zlPUASAdqZKadxdABLD2ZJjJmzWI2PVKEj01PTtV9xJ6auRI-91Owgb2g7eNR5eL0fMabcXgM4nk=w1304-h814-no" alt></p><p>そうするとこのような Dashboard が開きます。</p><h2 id="Team-の作成"><a href="#Team-の作成" class="headerlink" title="Team の作成"></a>Team の作成</h2><p>今回は友人との開発なので、まず Team を作ります。<br>一人でしか使わない方はこの節は飛ばしてください。</p><p>左側の「Create Team」をクリックして、</p><p><a href="https://codenvy.io/dashboard/#/team/create" target="_blank" rel="noopener">https://codenvy.io/dashboard/#/team/create</a></p><p>に移動します。</p><p><img src="https://lh3.googleusercontent.com/NWGxSw6vjq6KxtNYgsqgt68mpxi9hyL-cq3M5rWtsmRyQqWDEsaumnuqNmAs-07Ctc0F1358IxskVNC6OuCnbqBkbASif3ZZMAmuoWxoHfM0B8-6-xcW9rwUu7VqO45zz7oS5ImAn_LvuaIg1p6WMqDrKAU7HezXdlVN9kUnSjaOQrkGx-4iWIRlpPoVd3C56MSKq6rHtQCaFZglOxdxuKPrl6q_Bui3yELU1-FgvTHXJDL9mAi6YW_a2-2NELVW5trk1fwS30ls4Ih1SqbjVYbbR21KzhPR1ZPZUBUbUYvte8t-KC49gSK_e0C4ejzwiZR0G3iggYTs6MncUAwZppD5reMEQcKZl1O4rjO9jcd7xMQymgX6wqr__fVx7Lh4G70Q9Rswjs6UBWCrjeoidLI1TaOYzFb2xpoertmnRm0u48Hadb8isaQXSIt_lzHFv17DGjVsrlQuaYSDwvcItF2wHrJg4_GuRO4bDbo3n9_8IIF-Fyh0YTfcNLdaYnXhETvjXJhQTJreqyv_mtvvBBdwnd1HpULk3SpwMLWTo5cY-PtPI_pN_LJxprpdSYcuAyPrFkzLNOVbtFZpLhT_-YR_h2oNOjBSaUyA7JXaU16Z31v283DAoe_FkjxfmQC_0pOme_-8uEDNDi5ADUjQSiXOvKSWe4f69FscyAXE4o1rLRm_6zHt07YMBPgqp6RP_5tmjzrikt7oA2BZMUGbnZiiy4q_vV8jJRl4=w955-h484-no" alt></p><p>チーム名を入力したら終わりです。簡単。<br>メンバーは後から追加可能です。</p><h2 id="Workspace-の作成"><a href="#Workspace-の作成" class="headerlink" title="Workspace の作成"></a>Workspace の作成</h2><p>左側の「Create Workspace」をクリックして、</p><p><a href="https://codenvy.io/dashboard/#/create-workspace" target="_blank" rel="noopener">https://codenvy.io/dashboard/#/create-workspace</a></p><p>に移動します。<br>後はウィザード通りに進めればよいのですが、<br><strong>チーム開発をするときにとても気を付けなければならないところがあります。</strong></p><p><img src="https://lh3.googleusercontent.com/m71ZlwbQKpO7yVfswBNm4UIiu373h2-XNvjZjGFk7EdhFUN4VRrAevCR5zNm_rE9aS8ZylB8PlRJ8aa_7ESHJMg0WhoUg-aSxio4L6KfPOYjE2AT7lPNp9tquu8Kkt1-qGPB7a0jPn6PTHGKPj9DjL1sjdb0uEEJj4j4VRxKlinJxPnCgYRuBDuR6QV1EI_B5m3ZODPBk6TtXgm3Be0oSVEzKUNYP4vHHhdRyE-pZ6rcRnJMUr4gW25udmBACmf1jGrY0h_Sf937w1DzE4GMYSXg2GZ9oSY-j1YzurTlUr8PdXkP9XcPKlbsJWhd_F6HKIoipdyn0eJ61FhDV7nOtgpd1TKXTBC-_42qZCX4lTjk5mvjCi0uRAVonN9TeMSqI9qvOd2L0udkXR2NhK_zW0nFQDUF3SGYDOtGLDcVYyp7WvLr1az_7dI8Dzd_qThPazp2jt8oTyXX_iPzHdt6Y5nSBUgYqVSRKe3GAzzCcGlSurbTS0yCD8soFxRIjRV_Cf_whdF8ltZFDra_ueGU4We--rIJJGeYhhYGU4VQ6FYwxLXO7Dy9ed5GyBOgaVk0yPkOt1oQJJRWBkau5FUTI90EwhgzspEIW5e5FQDjT_w3ayQmBbJBxx7WchEK8psd02dz-jBUO14dsfTPbbLmvNTVnro6JVFI7RkNMg0GumFfILoZinHqys_-P8UJiSiuDDZkwO80P33U_wPgQALW9NOoU7rap9wbollw=w477-h125-no" alt></p><p>ここでWorkspaceを紐づけるTeamを決めることですね。なぜかこれは後から変える方法が見つからなかったので、ここでミスるとWorkspaceを作り直す必要があります。</p><p>Stack は Vue.js なので <strong>Node</strong> を選択してくださいね。</p><p><img src="https://lh3.googleusercontent.com/i7_xvQYr6BRphI4eEChaNCkdYoFnEG-k7RGjBHQ9WH3ZbiTEdhoZbn7VztMpbua0bAPp13HCSespKJUObOivB7f8mXNOPlW2watZ-BUWJl5Doy10bPdAb_VpApRJbuY_pAv9_3cwTj6BJbwAx6Km0v_F1w2gHkld5brLadeFyqsOWoVoM9arSjKF5srP-iE62soaWkIdxY01TC0AUp8rh4a6zqGdwOAKCawshYRtWje9pTIoT4RqLyFGv4uvfEMtDNZA4_RNkpWsmH9EQSR3vuKRYc9hqGzvTLR9Od7M15M3g5Xnv232vKQnw5X3G0qZdq__05_CCUKLu2ip3OzchCdwwGx7sq6GtuFPsbADWnRigexxdAphAV2GGMxO5ehKa7HcpSe5aSQM11YpjlIDQuh_YOKd9JZ5U7MYjDFx2rR7YWQUnzhrYs8YqtvLtpPWlc55I314cMkfGq4H-vwIdhvNM4qLKgSHcMTXeDjQJgrVr6oJnqOx3NHVLz4BxDeiHFi7oPBGODH0Sg0Uy-MmcVXd0I6NCr0rSFS-IQ7MbcOEdkjZ6F7wkI9dmbKT6-PlXOnwQl9mI3o3vU9vyOSYbURWydW8tdgcsO5h610y1ycSOS2AxTC14PgJ6j9d9bvEUNcyaUo3h0ezNjvb3sxpPXQAxUFG3oIAjqnpPrYoXJCXsZWc2ZH8syZjJTfJuOc19IcS-Q5xJpJgHGnQdsmhuIBN5xHnvPh2JFyc=w1079-h207-no" alt></p><p>なお、この Projects のところからは Github のリポジトリをインポートしたり、<br>Git を選択すると非公開の Bitbucket のリポジトリをインポートしたりすることもできます。</p><p>Project は後から Workspace に追加したり、作成したりすることも可能です。</p><h2 id="Workspace-を-Share-する"><a href="#Workspace-を-Share-する" class="headerlink" title="Workspace を Share する"></a>Workspace を Share する</h2><p>チームで Workspace を使う際、なんと Workspace を Team に紐づけるほかに、<br>Share という設定を変える必要があります。</p><p>左上の Workspaces をクリックして、</p><p><a href="https://codenvy.io/dashboard/#/workspaces" target="_blank" rel="noopener">https://codenvy.io/dashboard/#/workspaces</a></p><p>に移動します。</p><p>Workspace を選択して、設定に移ります。</p><p><img src="https://lh3.googleusercontent.com/IDGXYtM7u6K19ChPjiLnXPe-aoNqGNXedy6i88yqCLPj9t92a4QpkeNKsbGIWKqknx7NFlX19nG6WYYEKnGi7B5b28S9488_p7oHet9sEFgMKUMpIdGxgGnwgzOa0WRw2nP9wlyYDY0UkvMus3STZ1nOVfGRjZfrqZoQRR8-sjOQvl0f9YuJGtNdcmCDimE3bs4eUuxjc72e5B85ziGjqoazOcaIc_b5l_3Dvz7eiFceEIGosEaroPVkn--RC31yaBnRkAUwkhtLyoUBfgqwH_O19l3vugEWZC0Qw2dLBZDkLzHItYPwEOEFaRw7QWA5MNvjiKGqL8hwJp5lAR25nnzFcOM_L4EhyQM78dBJEASwOMdK6-zNElbhDLboblRoORSj-p4wPdiuku_pfLd9SJOgVYGf8MhuwDUq9tb8LJ-YLNxrHxQkObPtr5ogAT2bqPdxtcCttZR4cyzyFPct2QyIeeAdKPSUhwgJG1ns-d_Lx0SxPerBpqweLHkK50xY_F-Ci_VlZOyVxjKidweR6PBCJj2M57YbIFU7nvssWSO49SxwqpW9r3QKe2Fzih-WMSR-FClK11rZLoLjXx5ZShza3jWl-kM0Dc0PxGKTjCyZXynNHKGG7RKodkIMDIeyFkzEgc75nxNlSSFk-B5cKJke8VuGUNxsTkHRzVfR0cwH2zgRatIpWrXlMKg_MuL0CQlmRvrkNgKjEaUoMHtkfFy10OqKSfwa6vCS=w887-h386-no" alt></p><p>Share → Add Developer を選択して、Workspace を使う User を追加してください。</p><p>ここにつまづいて１時間くらいとられました…</p><h2 id="Port-の開放"><a href="#Port-の開放" class="headerlink" title="Port の開放"></a>Port の開放</h2><p>Codenvy ではどうやらポートごとにサーバーが割り当てられるそうです。<br>例えば、9000 番ポートにアクセスするため、3000 番ポートにアクセスするため、・・・という風にそれぞれサーバーが設定されています。</p><p><img src="https://lh3.googleusercontent.com/qwvXsXdnG4HjbxNkoxDPBCBVd8x7y-Dxz67jU1Tuz4I9h4mj-15QzcEdhvmzMxBQFEwXpLmGZjDN1eEsOKo7CVLpbXoYGwu0lRk2I6YFYbN0UrUNr3Xgo6zvlWsfzUmmemiTxDFjhpvQGq7jdH2EC-h6vQlyIrAU_L1i2NZ98uPNIzzBchH2a1fZXvYIwye08CWq30BRtqYkVbqLS57E8fgKL5LksAHDDsxtgIkDbB5NJ8PiNvsK7kM7KmihUxAm5Od6JPFES3ZeJ-68R6AcSsNuAJ00ulwP-ZvpMEnMzKT09kuKa4ktL9Q9hXbAjdyeLX0lGNPuthCn2UpCsx3u3Q9xxnB7nq_eyUtfiQNN7wUUvGwgNh8CpDomi2EL_2fpomiDlc-JOOPDzZO7-kFumNAUDwiBuwvuRFhAv9WLDhu_eNrKAozoLt9eumzHiz-LiLMoAf0V3DkEq9vlnEBTtIqTqXNVi5bag7Ggz66HSQQaBy63olBdLo9PAzWJ6KdrBq2dZqGcQ7skZvt4XR3BcrbJSCVObATM2yV61b3X0uIaC0qRBThxOICsJDAKF7vNETRDu0laDeboQqv2fyDsjeWnH37y63ear5elREO67YUWXDN59TuAFb__vKQbslqF-yld-Noie0IiGuUlFvCGINgR5M1nUn8rn-JPib7vuLV4mJnbD1wRgFOIzCVlLajOxfuMyFvNsS07mQoEn7GZuI741AR-NQQcredq=w561-h713-no" alt></p><p>デフォルトでは 9000 番や 3000 番が開けられています。他のポートを利用したい場合は、追加する必要があります。</p><p><img src="https://lh3.googleusercontent.com/iWE_qQl-G7F5yqujX08qyXPKSWHCW0pm3kSn8CtXgvkMlNT-9xUhHYgK978tRmpLPwBXh6sZcoT66NCU1nuUcNLh5SHMzui7tUROAQxAJnJEOffFnNOjAEDibv47LAMBm-woC88RExopg4-9qbR2fCNt-xQArBBEoRMN-MLob5rA1qqUnOE9lhYu_43k7-ty6NqeFuTgDz0oDyRhPuo_7sH5ccM8VnC333HEcajE9SAaZFTA-zLApw5k3bdFSvHci9GDSOYJuFOzpOv91Xe_-85A2aWYLXTCQW32ZvuXTd7ACHmmVOCFayoZGcfiWzQbahEXT0OCikZ9OSXjjU6LuLHecgBUAF0Y3_F2P0TPD_YXpfbgVYvfO6boV672CNES5MY01BE-qBAuO9f13GYNH2jUZWviNMZ5rx1Q2V330Y5u9968zC-WvMSG8akNI-AsWrwjTgZdtbLhkondhsMm3p-zLLPkYZV8Bij97lb-CjwKqjNMLWE5tQosE7OuFoIZr06GGXu4cpfxOjvrwfLKCNwZnDRkf4EwEWgvytD6aOBZOpal0u2bvXXv_mHVQmcEB_Nlj0-cimLHWtROdXQ_lPVw9JevPqNuwZIuikjlwk3J2JL6u1IN4Y67qLrhday2UxQU90Bipp1LUBbsSls_M6Ht5BLmxfG_GxVSmRLl_2gOiQER4LGdpZgUA3kVJXcEp3zb6S0kgYcUyEiN8dNQ7KMuyb9fMtVl_npB=w895-h202-no" alt></p><p>Workspace を Share するときの設定画面に移動して、「Server」→「Add Server」から追加します。</p><p><img src="https://lh3.googleusercontent.com/Co_2szRNmm1XNSqYEuQ4ea9BVBbS4y89Ghkn7KZ48hAXROlzpox9Id66sXWASijTTYjFfj-jogw7xDiU55ium-9UYQKObg4wma3elzExZgD3h1CGMHLsLd7XzKocvzT7IuMKhF1jbQQPqFPYNb3C-XQE7jJoJCE7mLFAK_lSRLCNj4a-qI60gDjQ2jU4VEpqrosU5hsTnoD8lJc-z9B45eAN9NsVT0uyGcCSBuzbb8ktGb67w5KcELo1KLLZszWHsDKIx1Xt2SQJ-XdCwhC8Y9_oC4UaBsddR4V_bLse2EWipX_Oo165L_e4I0aYbvK7wRFxRPImmtk78qlNxTsiosEahukBY0oSJs3LzCV6vgwGNy60tfmlB27uN-_HZ-jfzokb0v_AsE8PerSpT6cYqYpl4NGkBZz5ghzKptHqy4WhJsma8mt8qtjwST9_J6ycUGPQNqN8g0iHUcvB-_1mNBOGHPMm8zcImVbiNC5jKx9Jxu_ir50ls4ezkmif17wVrj-WBOdXJSaCR-cVOzBcGLuIaInnnR-arTybA0NtWby9NiAPnx0RrcyFBn_yjS70nfETGJqpxqS46GOL7HoZdTD06qzZdcB9zS_b4FcNof6bkMMgGPkCqN_HbEga5ITq0nLN6ABgz8wMYLrCNdLWnCIBzzhrDbmOMN-7mioIr1rrcklAj6y0KInN3zmrG0c9FvLK37oGrev6hY0CqTxDOvpnbFacIaJVnHf7=w595-h290-no" alt></p><p>Reference は何でもいいんですけど例えば「node-8080」、portに開放したいポート番号を入力します。（8080など）</p><h2 id="Webpack-の設定の変更"><a href="#Webpack-の設定の変更" class="headerlink" title="Webpack の設定の変更"></a>Webpack の設定の変更</h2><p>※ここは vue-cli v3 を利用して生成されたプロジェクトについての話です。そうでない場合は適宜なんか補ってください。</p><p>僕は Bitbucket から Project を import しているので、それがそのまま codenvy で使えているのですが、codenvy 上で vue-cli を利用してプロジェクトを作る場合は、ターミナルを開き、</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ npm i vue-cli</span><br><span class="line">$ ./node_modules/.bin/vue init webpack &lt;プロジェクト名&gt;</span><br></pre></td></tr></table></figure><p>を実行してください。<br>ターミナルは下のほう、もしくは Run → Terminal から開けます。</p><p>Codenvy で Webpack を利用して、App を実行するために必要となる変更は次の通りです。</p><ul><li><code>host</code> の変更</li><li><code>disableHostCheck</code> を <code>true</code> にする</li><li>(<code>port</code> の変更)</li></ul><h3 id="ホストを変更する"><a href="#ホストを変更する" class="headerlink" title="ホストを変更する"></a>ホストを変更する</h3><p>デフォルトでは <code>localhost</code> や <code>127.0.0.1</code> になっているかもしれませんが、外部からのアクセスを可能にするため、 <code>0.0.0.0</code> にします。</p><p>&lt;プロジェクト名&gt;/config/index.js を、次のように変更します。</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// ...</span></span><br><span class="line"><span class="built_in">module</span>.exports = &#123;</span><br><span class="line">  <span class="comment">// ...</span></span><br><span class="line">  dev: &#123;</span><br><span class="line">    <span class="comment">// ...</span></span><br><span class="line">    host: <span class="string">'0.0.0.0'</span></span><br><span class="line">    <span class="comment">// ...</span></span><br><span class="line">  &#125;</span><br><span class="line">  <span class="comment">// ...</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="disableHostCheck-を-true-にする"><a href="#disableHostCheck-を-true-にする" class="headerlink" title="disableHostCheck を true にする"></a>disableHostCheck を true にする</h3><p>ここはハマりました。このままでもアクセスは可能なのですが、<br>「Invalid Host Header」というレスポンスがされてしまいました。</p><p>&lt;プロジェクト名&gt;/build/webpack.dev.conf.js を、次のように変更します。</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// ...</span></span><br><span class="line"><span class="keyword">const</span> devWebpackConfig = merge(baseWebpackConfig, &#123;</span><br><span class="line">  <span class="comment">// ...</span></span><br><span class="line">  devServer: &#123;</span><br><span class="line">    disableHostCheck: <span class="literal">true</span></span><br><span class="line">    <span class="comment">// ...</span></span><br><span class="line">  &#125;</span><br><span class="line">  <span class="comment">// ...</span></span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><p>あまりジェネレートされたファイルは変更したくないのですが、仕方がないですね。</p><h3 id="ポートを変更する"><a href="#ポートを変更する" class="headerlink" title="ポートを変更する"></a>ポートを変更する</h3><p>先ほど Port の開放で、「8080」ポートを開放しているなら大丈夫なのですが、<br>9000 や 3000 ポートを利用したい場合はこの作業が必要です。</p><p>&lt;プロジェクト名&gt;/config/index.js を、次のように変更します。</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// ...</span></span><br><span class="line"><span class="built_in">module</span>.exports = &#123;</span><br><span class="line">  <span class="comment">// ...</span></span><br><span class="line">  dev: &#123;</span><br><span class="line">    <span class="comment">// ...</span></span><br><span class="line">    port: <span class="number">9000</span> <span class="comment">// or 3000, 8080, ...</span></span><br><span class="line">    <span class="comment">// ...</span></span><br><span class="line">  &#125;</span><br><span class="line">  <span class="comment">// ...</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="実行"><a href="#実行" class="headerlink" title="実行"></a>実行</h2><p>下のターミナル（出ていない場合は Run → Terminal）で、次のように実行します。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">cd</span> /projects/&lt;プロジェクト名&gt;</span><br><span class="line">$ npm i</span><br><span class="line">$ npm run dev</span><br></pre></td></tr></table></figure><p>こうすると、0.0.0.0 でアプリが実行されます。</p><h2 id="URL-の確認"><a href="#URL-の確認" class="headerlink" title="URL の確認"></a>URL の確認</h2><p>この 0.0.0.0 にアクセスする方法ですが、先ほどの設定画面、「Server」より、それぞれのポートに対応する Server の Url が貼られていて、確認することができます。</p><h2 id="できているはず"><a href="#できているはず" class="headerlink" title="できているはず"></a>できているはず</h2><p><img src="https://lh3.googleusercontent.com/cwEfndrkCCfKIE4UWJ851A3acX2oDelqIxsJv77w1IJyHUTCwW95V_8SOXLlTgCeVMoUuutEy0LDDOrmW_RAiATEGGrND3A-dNz-dCCK8_idPXf2z_T8saZh9I-4LfDm67d-XnZD3stv3k9L8bDeQ0E1GsCLCL9WdMjNgs4gSyPMaGTuMlVxdpmWCBuwKqOP1GtwOdCIDHmd4kdF9qCp9V6d5fiePWZJGYsPuNZkMhtgELf10HFOnXOIJgRjp_QyxWY1Lz96S2KYlSB9ALGBayCqtl28w_jWpXxuYY9ZwHqHC8gI_uo7hvlTJeQwDUz5h3sRY_BDMw2HmDigXGqe7A0xiIPLoC9NorBkDmX00YeuHVXE0nCLdJgGel9qedS7RivtdF3gB72Ln7klwM1ZCunyIK9zmgG1Ru-Agl0jTXGdPzJgzJ4pV5XuM29Q1eBw1AFOoxnJbFMzbZYbiulIj35DyLcjwswN6Uvw-MX2RkCX2tZAy8pD5Jo9S_pe3TrtVGLEG6VXfmP0epSYmEEqnJl_ofDC5w7w2Y_2EMBulWkFGKip7BJfaltDkhWcaX7dMHMT5MsNv2hxQiGb9Z1j-Kz6K2_o8hEOjrSalhyj9bot1LBDBVwdB4fsTkJ1k0HUQhQ_dA71iwiZ7zPysQOTTv1AQVCPZR9Mmjdj1F3D6IGtKBTCzI99ZwEfjztD0qXaudEKBTmYU08GaTXQwGJj7KkNN9NUa7p2b02w=w995-h607-no" alt></p><h2 id="まとめ"><a href="#まとめ" class="headerlink" title="まとめ"></a>まとめ</h2><p>Codenvy は便利ですが、情報が少ない面もあり、なかなか大変です。無料なので仕方がないのですが…</p><p>最後の URL の確認のところは、Commands という機能があって、それを利用すると手間が省けます。</p><p>それについてはいつか書くかもしれません。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;こんにちは。shundroid です。&lt;br&gt;高校生活が本格的になってきました。楽しいですが忙しいですね。&lt;/p&gt;
&lt;p&gt;さて、今回は、友人とアプリを１つ開発することになりました。&lt;br&gt;そこで、環境構築などを友人の pc で行うのは手間がかかるため、&lt;br&gt;その必要がない
      
    
    </summary>
    
    
      <category term="vue" scheme="http://asterisks.netlify.com/tags/vue/"/>
    
      <category term="codenvy" scheme="http://asterisks.netlify.com/tags/codenvy/"/>
    
  </entry>
  
  <entry>
    <title>Twitter で誤凍結されてから解除されるまでの道のり</title>
    <link href="http://asterisks.netlify.com/2018/09/30/twitter-frozen/"/>
    <id>http://asterisks.netlify.com/2018/09/30/twitter-frozen/</id>
    <published>2018-09-30T10:05:52.000Z</published>
    <updated>2021-05-06T02:40:20.690Z</updated>
    
    <content type="html"><![CDATA[<p>こんにちは。shundroid です。<br>昨日、本垢の Twitter アカウントが、なぜか凍結されてしまいました。</p><p>正直かなり焦ったのですが、今日の朝、凍結解除のお知らせが入っていました。<br>今回は、その道のりについて書きたいと思います。</p><h2 id="凍結の種類"><a href="#凍結の種類" class="headerlink" title="凍結の種類"></a>凍結の種類</h2><p>まず、Twitter の凍結の種類について書きます。</p><h3 id="警告凍結"><a href="#警告凍結" class="headerlink" title="警告凍結"></a>警告凍結</h3><p>一番軽いやつです。本人確認したら解除されます。</p><h4 id="c-f-ロック"><a href="#c-f-ロック" class="headerlink" title="c.f. ロック"></a>c.f. ロック</h4><p>「ロック」というものもありまして、僕が調べた限り、<br>ロックと警告凍結の違いがよくわかりませんでした。<br>わかる方は教えてください。</p><p><img src="https://lh3.googleusercontent.com/3VveY6CumlrQlwgweSX_TkFtRZy96qyAsDa_qTKfoCYdAKtjuvkSJnAzYMQXaD-K6ZMWDMhy3H2pA03iHJpyyNfb-QlGGGjBe-P0EKF0yExcsLn1LHdcmD5a24Dn5MDZ0axk05SUqJfvEb1A9kzWnIWrXsrdGNJtIGSzFnu3N7YuZsky4FM9dq0Ap_8Yp00MV2KZcb1CkzXXTfubDjjB5SnEk2-1ytixw-y5nre9J248Pam2Ks9-Lmq7Whk7jfegbF0o04hYOREMw4rxJNnCE-3v9hzc4srR-lwvvtwJjEqhRCL3fcc6vJUPPX188tE1ZxCvfY4eqyprpUz_xcKZTECXQqfofAi_q6QybABbJ48WPhULb74ucOYbJYEgCX_J7eycERhan_YMlLy7xmXghNhahu-MDe7mMO0x5t_fnd49AHx0oeAWTgUIW61GrVbrSCDqpKU9HMHQb3r7BC0Whn_4h_3CQ2DfWWUTdeSJXq9Y8KBHtzkPmrA-XPVO4kjP4hFTde2ml1T0-lTP0aK9dEN9MP_dh6UKhz2bmhtTlVYBQFwiuJyn_yqUVpufRRl2LjRzCbGo2trMguqSXpvQVsA6HkLaPCAu8Iq0mb3D7RsHUcRLzN9Pca1xFRTbFKgoQGEb0kBqfLuWL_489_JkcNPEeQQ7-no42tjgmV9tQoA8vu56ubXzAnWe=w660-h494-no" alt></p><p>画像は本垢が凍結されたとき、別垢を作ったらなぜかロックされたときの物です。<br>短時間にフォローをしすぎたのか「自動化」が引っ掛かったそうですね。</p><p>友達によると、最近はアカウントを作るとほぼ確実に最初にロックされるという情報もあるそうです。</p><h3 id="凍結"><a href="#凍結" class="headerlink" title="凍結"></a>凍結</h3><p><img src="https://lh3.googleusercontent.com/3HZh5t7UyeqaN_jsd6z0cLI1K2aA2J7Z3FaGtG45CA-Nzo_YLA_7iROEAt4UUHJchcIkwNceTgmERyHobFrRdBjrOLsCRMEZtYfVDe6Jl8X5Y80gYdHYIx1GWEJJpSrsouWLADXHeLatV91BQxvIRx2SHAcYShyYibHHfZIP9pSRY-UFJm_HuHrxQRVh-3daP2jCeOPbq96tIqOsUqB4s4yTmWNHPvp4CNF10S-9yjW5oBPBvfcA4MLihjhaTAtIdGRwyoCHC3JvIdeSAPkjSNIoydKEwQJgNAru8gPPKUXumpNwS4wDmdKgL1x81pmWgEqYJPyKvEM3Ktgej7Nf9cVznXyvlWDqXABZvLkO8qO6ghMk_lz3T_4wu_3gOg8M8KoexJEHk1YpJayX76ZaWasQvHi-A7Y-YJIavKCvaZ19wTq-f9NhbjQMI16Sdzx-kXmJHglq3YTRA5-3UFRkxWKctjgPBVVc9bi0MR982_NrtcQdPaHjwpTJWoCvE-wSxo5WxFlnKB1GgfTw2-yLhX4pu4htKd9hgpPU-oxG9qZvnwEK8EPyuuV6jQwrRK17Bu7vWz1MSTWeenrfYd1XjSEZ9kDptMtiJhPSVyLMYoUrEE8s-xvwk8a4F6LLiJQGUZm72yA8D9qS8DQ7O7xUPgxU3MoAfyqRN4oCwP6GGR1HBCPaRfHvEdT8=w662-h320-no" alt></p><p>今回僕の本アカがされたやつです。<br>ロックのように、本人確認だけでは解除できません。<br>異議申し立てをした後、メールのやり取りをして、<br>運が良ければ解除されるそうです。</p><h3 id="永久凍結"><a href="#永久凍結" class="headerlink" title="永久凍結"></a>永久凍結</h3><p>スプラトゥーンが上手なた〇じさんがやられたやつですね。<br>基本復活しないそうですが、解除されたって言っている人もネット上にはいますね。<br>僕は体験していないので詳しく述べることはできないです。</p><h2 id="今回の流れ"><a href="#今回の流れ" class="headerlink" title="今回の流れ"></a>今回の流れ</h2><h3 id="凍結-1"><a href="#凍結-1" class="headerlink" title="凍結"></a>凍結</h3><p>夕ご飯を食べた後、Twitter を見たところ、<br>なんか画面の上の方に赤いバーが・・・</p><p><img src="https://lh3.googleusercontent.com/x4SyhA2rn5dAbmBa1HD1hlV9XmRmhh2kcNlcJidew0xpe2orQ5hyCZ1kVp4dJOeLNlZsbhvOi7JXUT3FsMYYZyH4MjSblSROTR-tD7G9XCHDG94i6oEn3k09s5ZNrtgGJsSCUl3kmgwWqUfMtWrlMtKJ5x_-vNUkEvv1dYO8xfOEaUmRNCm4qebEPGV_Ypi_n8eCEYv_BN91m-tnRw6G6sPrM_88MuOTiWfqmNec_e0IUJSOucjzZZmnPiraZCN2BRD5MfmHOnyqvKGSFyFsyNsNRXC85qMzIOelOgUsxpUYyYc0efdI5OHlLecvyM30_1DVSVEk3mi1g6Cu5mnXb7qfeG8uxiHTO5Ft4K7X-SU7LLhPnFb-hsrPziRDQd9Q3Q952RC2c6trLXIrum8Kj7ldEmQ1Mn924EB4I_B51eQKz1te6OVw1PNL5ZohN4lMZFMF5ioHhM_vzlKUyHvzlhvN4tL7Hei39V8u3sw04B5Fpj3oJJBO36EqZj_eb0RccdraUrVYWpo_ojKkmrYca0TWZU4UiizgePp3sk-n1WG4DGYs5dYKSvUBabnHlmfuHJJh4cL04FCVxCfilu7aTCe1cRS9wPjiWJOvV3XMB2trJyaz3NiOYGbT5m4tv7XTS1L7_jW-UPA-LmKPpwPuY6lsunzv-gPrtC5SCF75AWpRHfgLeqoVOVaT=w865-h48-no" alt></p><p>えっ・・・凍結？</p><h3 id="異議申し立て"><a href="#異議申し立て" class="headerlink" title="異議申し立て"></a>異議申し立て</h3><p>思い当たることがないので、リンクをたどって、<br>異議申し立てをしました。</p><p><img src="https://lh3.googleusercontent.com/PibFx3Dh4DItqqGcMNflCG1tXBaOvwkxWbqvlrk6uuIknfRnyXdaeB8PO73SjtACkJEPxpkh5YH-9iTShF9E7fpSEem-Avh_qxEKPGkIA9vZDTdVuoiBUDVeSBvzh4Q2730Uv7xkTkWAJgZ26M49jvYszYcfyFT3UjbJlXHJ6yy3JRhvJdrvvagLLBlpiUwliQIoPl-K0MGzvIsm_Py_rXu53UifeYMO_dlpx10m3PVBB2ehL0Gows-2ekJlA-LcOdkfl8QLB9otysUsyx_UtW-ng0llkUhQj8fMZufE70RafXqMA_VPK4bSTllIvKP4DC8vBurFsTBPNbdvm9sxYdIFx39x18X-p9n_j9lmuq-P9tUxm5Muysw6o2wo6IWzjHW_sUKks-C86CckuGXRpyJHRuR5CLnYBa5RK_QMWFtJXrikaXG4KgJLYTTLvbArGFCQro36tcJCVjTBMBawL9ka1DS14J7qTEJMvvu66IGWVCF0DSE_yGnUo8k7JcDx15lYm_WNGUHrB-oHjNFV3V8AVQzLYHvr2b2kyGE69XSmd-fFpd3FCnJ-FSOBGkN4jFp9yXEHbbH1cqf80v05CnrqDXW6gqdpDUw1eg4V5e-2DDxMtIPAxHMiv58KZxEdQEWfjtUnQBaOWK--glO42r0hzQoHw8kN9LfoHkkqd__IE93c7rAuKqLI=w925-h700-no" alt></p><p>図のようなフォームに、必要事項を入力して送信しました。</p><h3 id="自動応答っぽいメールが届く"><a href="#自動応答っぽいメールが届く" class="headerlink" title="自動応答っぽいメールが届く"></a>自動応答っぽいメールが届く</h3><p>数分で届きました。なぜか英語でした。</p><p><img src="https://lh3.googleusercontent.com/79sNNljp1fXwIEelurVpwhHdl6ozq9RChffPY7V1t-PksqgGpStTNK-UZ0nxb_3LV-kub504p0LepVaebYWlfWtWT0v5fdm0gzomblMyUMY13yHaH1lHBDJTlEcvRPI4dKvkNmXXVVI02XoeXXq7SXPFWXlKQJ06nuC0TtODO_tDf-e1-0FPHOaacuC4HQ4GLdWPh5w5UgerwoX-BZfqWtqAKoOLYgk2Iz3LRbNbW_IuXUtuJWbMXgmh8i92t9kbHDq4ZUfuPN3S-ehKOxzqHZtBE-zx6hc4Z4EdvbeiOmDCoydzkBsc7t5zvk9RIupSxBX5RlWKkCzRsQsCZNvLmd0ONIETTj9yv8YC4LHrzcunuu-8rbGfn-fUW6tjqbPwly7BsADQ_Kr7u33MBvGS-bmShlnVwLw_rPqWiP45Kzo39x8uqBlqsidjbOQMaKzQYS-pXQNdB_wMubJ39uYaTiiGDkm5kdJX0rC7BCThVOkbdoNKRYP1xm2h9rVolri_HtYyTFnRpW8zF_RlBbcKNS_U97dEUpn3stwznUHjkm7KWyKcOwOhOVEXk1z1kjkn1zb45lwzqccfkKl6lHnQHW4UDla4orvEv8eRRNk1T8SdC5pw531ZdoEbbd-3loUCN_Qv5IQ0cEWB0urSVJKND0pEfM4Sm1ovDxREaCYUSL1u0QPhLtKZ9B0Y=w973-h276-no" alt></p><blockquote><p>It appears that your account is in violation of Twitter’s Rules.</p></blockquote><p>Twitter のルール違反があるそうですね。</p><h3 id="返信を書く"><a href="#返信を書く" class="headerlink" title="返信を書く"></a>返信を書く</h3><p>返信をしました。</p><p><img src="https://lh3.googleusercontent.com/AgiZsyIH_IShMkCQS1QI28aT0X_iNyDRtKXB1vmDq51pzI0VLc0YGKN1okZCXgW9Y3pOsLxlXwVsRMPAoyfLGhLkkkX7qm3rCaFRDWi_8X67uNqe22fjAbrm5H1oqBE9ovnhTOJXbTvmxQfKck9Y7AbZf3DRCGLS8xdzI5KScYaXSvcn8k6FYjy5_6WUaWRgb7FppoNK6zeH1ouGgYYeZspwsdNf8BAJKC_47sQhrBtJd9d4KS7_usQUDj45MGWcGbzoyAmOoQV8h0Lwb_vwXk72qdDV6qKHNDakmE78xDjUtTYcpNDOwouJ5GefJGiQ89m20a6On9Y3S3h1k4IsjCyI-x8zRppndvuRU4mI7xrNP3U5lfV_Lmp4fRKLl2L40-jVYaile-3AQA87Q53iNhIOd85CAI7M6HCeBMAr4Z1dBC1a1eqFA6F0FBcLQ2lheCKvCm2ZFKEORKq9Tt4qIsBiwAPnHpLCNNznHbtCaajIf6nPRaPLl1VHRqlNlGjQL4Cy67eMoVvGtKTz_dVzGZO8ldwiKM-ku7tbT0sS9ub4c_QC0GHxwsUZVeoJjeiDhD9Luvp4eJZQHNYO6cDpNjvoFxpoksU5VIItXZBHLpnXhL36i-mWChSEnVho2dm11vD2dCpqfaKQ78TNBIJOKlgc3DAANLTovB9i8ashwB1juQ8RNTMg-d0-=w756-h777-no" alt></p><p>最後「アカウントを解除」は正しくは「凍結を解除」ですね。<br>訂正します。</p><p>日本支部があるはずなので日本語で書きましたが、<br>一応最初に英語で少し書きました。</p><p>ルール違反はしていないはずですが、どこがルール違反に当たるのか<br>少し推察をして、それがルール違反でないという反論を書きました。</p><h3 id="c-f-新アカウント準備"><a href="#c-f-新アカウント準備" class="headerlink" title="c.f. 新アカウント準備"></a>c.f. 新アカウント準備</h3><p>その間に、新しいアカウントを準備しましたが、<br>ロックされました。↑で書いたのはこのタイミングです。</p><h3 id="返信が届く"><a href="#返信が届く" class="headerlink" title="返信が届く"></a>返信が届く</h3><p>翌日。朝起きるとメールが届いていました。</p><p><img src="https://lh3.googleusercontent.com/Z0-uezx2jKJbx0rMKAbRvm7L5mxxd4UDpGUwWy0-brwmRj9f_uc1fEwxhKRHJLCOY34WOdj0p6BS_e1kJWQTMf4h0x8uTIfWrPMawfcRZjFA10l6DnyJ1NnZmbh3phewVVtKKRh2vFh5aZxRwTsJISKg8mpVt093sKSwmvoUbIy2NMILeSFDUIZMy0RU9wi0LX45kmYpJXbyWrhGRZSr70fnvsaGl43_grLlNyxijy-a5gywBDRWioo9eiBt5M64qQD39OzVGK42VWNh-JbLp7jbhOp0oIsSVscbnrQbalE1chUFKIdQlGZ9Nf-XoydhyCnvfTfUDxo8O8EfS54uIk-CBZuPs3GQgG64otBl6BeGQKnxaM-6l-0ftSw1uMhVM9UeqRrSUbaQpNh4FAjTYuQq2zqO0y-kRG3VP4zFeCju9P53c0K3c6PMXLMM8qIBbTcDmgj4vUCPEjRuP59ivdE95QDRwnG9oxOs8Uuk3A-j1b1WPwoscQWSH1lF25dkCQbI-8tiBphi3-kDFe5Gy6BSvfXA3-i4C9tuEBweSUuWUiVgQfF7u45KvuS16EVeD1Y7BaNsSne6Sn5IZ5zPAcRInrrX3Uv5B17jyqECq6CdreXkFEF2CZC32IcLiIqAMyeGWbgfcPzAGM5Ds9YwCqRsPNg-1qWAgB_FEQIv4Gj_riMktHpJZBOK=w954-h230-no" alt></p><blockquote><p>さらなる調査の結果、ご利用のアカウントはTwitterルールに違反していないと思われるため凍結を解除しました。</p></blockquote><p>誤凍結だったようでした。</p><p>無事 Twitter のアカウントを開いて解除されていることを確認できました。</p><h2 id="まとめ"><a href="#まとめ" class="headerlink" title="まとめ"></a>まとめ</h2><p>今回は凍結が無事解除されたのでよかったですが、<br>友達には「何をやらかしたんだい」とか「なんで？」とか<br>色々聞かれました。</p><p>しかし「なんで？」と言いたいのは僕自身ですよねw<br>わからないとしか答えようがなかったです。</p><p>実際本当に<strong>何もやっていなかった</strong>ようですし…</p><p>というわけで、周りに凍結されてしまった人がいる場合は、<br>あまり悪く思わないであげてくださいｗ<br>誤凍結という可能性もあります。</p><p>とりあえず凍結解除されてよかったです。<br>ありがとうございました。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;こんにちは。shundroid です。&lt;br&gt;昨日、本垢の Twitter アカウントが、なぜか凍結されてしまいました。&lt;/p&gt;
&lt;p&gt;正直かなり焦ったのですが、今日の朝、凍結解除のお知らせが入っていました。&lt;br&gt;今回は、その道のりについて書きたいと思います。&lt;/p&gt;
&lt;
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>僕がプログラミングを始める人に、「言語なんて何でもいいのだ」という理由</title>
    <link href="http://asterisks.netlify.com/2018/08/23/for-programming-beginner/"/>
    <id>http://asterisks.netlify.com/2018/08/23/for-programming-beginner/</id>
    <published>2018-08-23T12:48:14.000Z</published>
    <updated>2021-05-06T02:40:20.684Z</updated>
    
    <content type="html"><![CDATA[<h2 id="追記-2021-04-01"><a href="#追記-2021-04-01" class="headerlink" title="追記:2021/04/01"></a>追記:2021/04/01</h2><p>確かに、プログラミングを始める段階では「言語は何でもよい」と思います。<br>ですが、プログラミングについて深く理解したい、と思う際は、どの言語か、が大事であるな、と最近痛感するようになってきました。<br>このことについて、新しく記事を書いたので、よろしければそちらもお読みください。</p><iframe class="hatenablogcard" style="width: 100%; height: 155px; max-width: 680px;" src="https://hatenablog-parts.com/embed?url=https://asterisks.netlify.com/2021/04/01/korekara-programming/" width="300" height="150" frameborder="0" scrolling="no"></iframe><p>こんにちは。shundroid です。<br>夏休みが終わりに近づいてきました。</p><p>この夏にプログラミングを始めようという友達がいて、<br>どのようにプログラミングを教えるのが効率的なのか、<br>改めて色々考える機会がありました。</p><p>そこで思ったことを今回は書きたいと思います。</p><h2 id="プログラミングを学習するときに大切なこと"><a href="#プログラミングを学習するときに大切なこと" class="headerlink" title="プログラミングを学習するときに大切なこと"></a>プログラミングを学習するときに大切なこと</h2><p><img src="https://lh3.googleusercontent.com/RSoro3rvGbaP6BjzlvTuXGdtnUGI9pS7JAD8aJhHfkUVQkLJCJIVtBaP9CdmnDtkOxLVD2SJXIzklzxDKlRN0EczVeD0xzZ0kYQxdihnYqjzn3EL_ZL20xdE5tS6S2sUZjFXsBfauCDvtvEH8zRz1qvvVjtD18Xf4YqwoBGuLIs5IiNb4mOG0kDH-_ysF9oBryG429NGCwXHhku9nIiw7arEjV6N1q_itnKsGTRneENi4kRupfdpL9ETv1T07NMTOmIv2AfV4z4d85ybkOGmhDWUnct7MrWHxsgIHIwq5fkQG8gO7JDFrSB64Dlj_NUCFvvdbWtWbc400492kC16Z5hbCIVlMgzjgV-EBcDjwqRlwB7rl1GVrnQlymk_Pbfg7SesRa5gfzoh20a3Zdwaz3yQBFsbw4TBHCjYUEp0wnCCKoI_LuvgJRQgDYpWWW3Ix4l5IOO9H3w2PpDBzEErJ8ZYvsQBZcquMNdHbVQOYmsgyBXyxqmWik1zNjppK0op2ZEkOcXyV-pV8u0CVYwvgiLJePN2ikVcv-aE5-U_2ymfNgsWZq_PmZNysHdy5IMPPb8KDL3htjphRVkPdT5Q3kBXzGP8uylt5jmCddV_gg3lA-zmthyEBitQVQQg15Vd2zR1jfCZ5WKSHeR25uYAkhdYLeNMrVSLUPph5zwmzvdLe5xne1UBgmU2=w640-h425-no" alt></p><p>よく「Python がおすすめだ」とか「Unity できるやつかっこいい」とかいう言葉を聞くことが多いのですが、<br>僕はこれらの意見はプログラミングを始めるにあたってはそれほど関係ないと思っています。</p><p>これらの意見の根拠で、例えば「構文が簡略だ」というのであれば、僕は Scratch をおすすめすればいいじゃない、と思います。</p><p>また、「Python は深層学習などに強いから」というのもよく聞きますが、<br><strong>果たしてプログラミングを始めた初心者は、本当にAIや深層学習の仕組みを理解し、自分で構築するレベルまで達するのでしょうか。</strong></p><p>「プログラミングをやったことがある」と言う人たちでも、<br>サンプルコードを写して実行してできただけ、あるいは小規模なアプリを作っただけ、ということもあります。</p><p>これらの人たちは、本当に Python を学ぶことのメリットを享受できているのでしょうか。</p><p>他にも、「今流行だから」というのもよく聞きますが、<strong>流行はよく変わります。</strong><br>流行に乗って選んだ言語でプログラミングを始めた人たちがその思考法を習得したころには、<br>もう流行はその言語ではなくなっているかもしれません。</p><p>だから、僕は、誰かが「この言語がいいぞ」などということは、そこまで重要なことではないのだと思います。</p><p><img src="https://lh3.googleusercontent.com/db62jWzDVHz26c2BXGbvyzqZaON7Cd7dPA3cbP7NWdVpnL-KSO5NLebrC32KUlRBGdI7sBfQKAwf2IWtcyjtoLiE9Fg4yRB8LFR7hsCbIKeC4rFFX_nhXFtkwa5aAdu-oD9XGQ3fyMHP7rl9RnBzK-wxKXLki9hdhEKGCV6TTuRRkEO5Se37F_u-U42AiREc0-b6xAoaobhcYb4iwXYF9kqaQA2qqkVGKSqZ57-472stKtIqSNPgWwHQdcPezezpfUi6n8d_yk11vHBINuKtxx9ZJi4JqiVxMFB-ae3tkNNiVKPbz4zYDKLllmDXStMHl2-QkZyKqyTvKQcHKddPRvELBoWt5SWfFdW1IyF_GvoFBBrFsWzU1lu5DGFm6XqRvB42pD8jN3E1kjA6I0glrxxtmHWY8R5EVv0qrxWTM35TdWVprv_wICWCYXZSwgIp8e5wIvRp0QkbG9xnb81ctk15D7RWe3GllSMYE5Gv6rWR6T8H-3yB4BfenwzvuZgpKMrhaFvQF0cP_5w4b7mAfh247IDo8c9Mug0MXX2wzAredByW2xXfytpBQkxUhidTYdeNcwjmxIMhgTA4MRN_db2P2UBz6Z4PyN-NNYQ62SkAIzgx4YMp3fzrgO91pTaJ2ZvCTdkl_P_fVpG0jM_5j77GFFNKWWYVBEFyBDC3YydFWWFm9L9l08Cd=w640-h427-no" alt></p><p>本当に大事なのは、<strong>プログラミングを通じて、自分が何を作りたいか</strong> ということです。</p><p>ゲームが作りたいわけではないのに Unity をおすすめするのは適していません。</p><p>スマホ向けアプリを作りたいなら、Java か Swift かを学んでみる、<br>自分が人工知能を作ってみたいなら Python を初めてみる、<br>Web サービスを作ってみたいなら HTML+CSS+JS を学んでみる、など。</p><p>プログラミングは <strong>目的ではなく手段</strong> なのです。<br>プログラミングを始めるにあたって、まず何を作るかを決めるのではなく、<br>言語を選び始める、というのは、僕は適切な手順ではないと思います。<br>言語ありきでプログラミングをしてはいけないと思います。<br>その意味で、僕は「言語なんて何でもいいのだ」と言っているのです。</p><h2 id="自分の作りたいものを形にしていく過程で、思考法を習得していく"><a href="#自分の作りたいものを形にしていく過程で、思考法を習得していく" class="headerlink" title="自分の作りたいものを形にしていく過程で、思考法を習得していく"></a>自分の作りたいものを形にしていく過程で、思考法を習得していく</h2><p>先ほど「プログラミングは目的ではなく手段」だと書きました。<br>これは、プログラミングを学んでいく姿勢にもつながります。</p><p>例えば、変数や関数の概念や構文について、座学のようにネット上の記事を読んで理解したり、<br>ネット上のサンプルコードをコピペして動かしたりしているだけでは、<br><strong>実際に思考法を身に着け、応用していく力には結びつかない</strong>と思っています。</p><p>「プログラミングって何なのか知りたい」という人で、割とそのような人がいるかもしれないのですが、<br>そのような学習方法をとっていると、進捗が生まれないか、あるいは挫折します。<br>また時間が空いて、ちょっとプログラミングしてみよっかなと思ったときに、忘れていたりします。</p><p>そこで、自分の<strong>作りたいものを開発しながら</strong>、プログラミングの基盤となる思考法を習得していく方法が、<br>最も効率の良い方法だと考えています。</p><p>もちろん、最初から壮大なアプリを作るわけではありません。<br>まずクイズアプリや Todo アプリなど、こういうのも作れるのだということを提示して、<br>それを自分なりにカスタマイズしながら製作していくうちに、プログラミングの「勘」がついていくものだと思います。</p><p>実際、僕も様々なアプリを製作していきながら、プログラミングを学んできました。<br>そこで学んだベースとなる考え方は、今も生きていると感じています。</p><h2 id="プログラミングができるというのは、写経して正しく実行できる能力ではない"><a href="#プログラミングができるというのは、写経して正しく実行できる能力ではない" class="headerlink" title="プログラミングができるというのは、写経して正しく実行できる能力ではない"></a>プログラミングができるというのは、写経して正しく実行できる能力ではない</h2><p>さて、少し話題が変わりますが、「プログラミングができる」と名乗っていいのは、<br>どれくらいのレベルの人以上だと思いますか？</p><ol><li>Hello, world! が実行できる</li><li>ネット上のサンプルコードをもとに、簡単なアプリを作れる</li><li>他人のサンプルをカスタマイズして、機能を追加したりできる</li><li>自分でアプリを設計して、中規模程度のアプリを作れる</li><li>有名なデザインパターンを駆使して、可読性やパフォーマンスの高いアプリの開発を目指せる</li><li>自分でアーキテクチャを組み立て、大規模なアプリを開発・運用できる</li><li>それ以上</li></ol><p>人それぞれだと思いますが、僕は <code>3.</code> 以上だと思います。<br><strong>「自分の考えているものを形にするプロセス」がプログラミング</strong>です。<br><code>1.</code> <code>2.</code> にはそのプロセスは含まれていないと思います。</p><p>誰かが書いたコードをコピペするのは誰だってできます。<br>それで正しく動いたとしても、そこには自分のクリエイティビティは入っていません。</p><p>何かを初めて自分の力で作れるようになった時、プログラミングができるようになったと言うのだと思います。</p><h2 id="まとめ"><a href="#まとめ" class="headerlink" title="まとめ"></a>まとめ</h2><p>今まで僕は、小学生から大学院生、また社会人など、<br>色々な人とプログラミングをさせていただきました。</p><p>その中でお互いの持っている知識や考えていることを伝え合ったりする機会もありました。</p><p>今回このように友達にプログラミングを本格的に教えるということを通じて、<br>そこで考えていたことを明確にすることができ、</p><p>「教える」ということは本当に自分自身にも学びをもたらすのだと分かりました。</p><p>ご意見・ご感想などありましたら下のコメント欄にお書きください。</p><p>※今回はやけにまじめですね。これで終わります。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;追記-2021-04-01&quot;&gt;&lt;a href=&quot;#追記-2021-04-01&quot; class=&quot;headerlink&quot; title=&quot;追記:2021/04/01&quot;&gt;&lt;/a&gt;追記:2021/04/01&lt;/h2&gt;&lt;p&gt;確かに、プログラミングを始める段階では「言語は何でも
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>ノートパソコンを直した話</title>
    <link href="http://asterisks.netlify.com/2018/08/08/fixed-my-note-pc/"/>
    <id>http://asterisks.netlify.com/2018/08/08/fixed-my-note-pc/</id>
    <published>2018-08-08T13:03:36.000Z</published>
    <updated>2021-05-06T02:40:20.683Z</updated>
    
    <content type="html"><![CDATA[<p><strong>※今回の記事の内容を実践することは本当に自己責任になります。というか分解しないことをおすすめします。</strong></p><p><blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ちなみにPC落としてから突然電源が落ちる問題が発生していたけど分解したら内部でねじが緩んでいたことが発覚しそこをきつくしたらなんと電源が落ちなくなりました。<br><br>つまりノートパソコン直した―――――――やったーーーーーーーーーーー</p>&mdash; shundroid (@shundroid_p) <a href="https://twitter.com/shundroid_p/status/1026795556696281090?ref_src=twsrc%5Etfw" target="_blank" rel="noopener">2018年8月7日</a></blockquote></p><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script><p>こんにちは。shundroid です。<br>2年前の夏、ノートパソコンを落としてしまい、<br>そこから<strong>突然電源が落ちる</strong>ようになっていた僕のノートパソコンが、</p><p>この度、なんと、<strong>直りました！</strong><br>今回はその報告です。</p><p>ノートパソコンが壊れた話は前も↓の記事でちょろっとしましたね。</p><iframe class="hatenablogcard" style="width: 100%; height: 155px; max-width: 680px;" src="https://hatenablog-parts.com/embed?url=https://asterisks.netlify.com/2016/08/15/serialport-without-vs/" width="300" height="150" frameborder="0" scrolling="no"></iframe><iframe class="hatenablogcard" style="width: 100%; height: 155px; max-width: 680px;" src="https://hatenablog-parts.com/embed?url=https://asterisks.netlify.com/2017/12/14/report-i-bought-my-pc/" width="300" height="150" frameborder="0" scrolling="no"></iframe><h2 id="分解した。"><a href="#分解した。" class="headerlink" title="分解した。"></a>分解した。</h2><p><blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">PC分解できたーー<br><br>落としたのもあって左上のねじ穴が死んでたけど、外側のケースをひねってナットを固定したらねじが外せた。そこが一番難しかった。 <a href="https://t.co/gBQRLNdyPG" target="_blank" rel="noopener">pic.twitter.com/gBQRLNdyPG</a></p>&mdash; shundroid (@shundroid_p) <a href="https://twitter.com/shundroid_p/status/1026735996694454272?ref_src=twsrc%5Etfw" target="_blank" rel="noopener">2018年8月7日</a></blockquote></p><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script><p>PC は Sony 製 VAIO の SVE14A3AJ なのですが、<br>裏面のねじをすべて外したら簡単にケースを外すことができました。</p><p>確か分解したら Sony での修理が受けられなくなった気がするので、<br>本当に試すなら自己責任でお願いします。</p><h2 id="分解したままPCを起動したらひらめいた"><a href="#分解したままPCを起動したらひらめいた" class="headerlink" title="分解したままPCを起動したらひらめいた"></a>分解したままPCを起動したらひらめいた</h2><p><img src="https://lh3.googleusercontent.com/5dhIoadZDBsZlroft2R85r80BsVqpPEzvBpEKSf0PaNseAl7EVWNfpStKmlcAAUb6aUDWWDFQgIk2MZfNSLKRCkjpSFsFveyuz1TDpdF62PFl3xApeZC1GOq6qhHDnYQcCW-9t0v_ZkTQ5v-R1yomYOUA5E5bspNEQd94gGnLWEwevhAwdcyeEZ7cOws6cVKsB68tmepKfj4W6x9uo3Z5eUx1Cy0xFfKzCy4BD0fahXgjl3NTnOmu0lsoAtYietqZQRlgkN74qbqzXlOx83voOc9ljWZ3GH5IfJre7IY68xCJtVp0XExYbqqdBiZrR8jphLk55qafYHg8EaNNbl-JF2Q0vBji-BjSrByKoyebkvX1T9OnwQ3-F9QE81t4rOIPEriW5gEqCct760IVkWB4JFHKKlAApKmYLpVSokGsD4rmkGw2QvYga3yNOBMd2xJyF151TcxmieEDXkf3pTRByibwdyj0AiBOZ_HJobVEed6GJcaiw4s7_zIm2QKDJNbQNqz_cUBXp4SD6SCBZ2_Y0JUECE_ZVh93aVwRdj3VREo3zkrSPTaFN0-Fs1i4NxZxTqs2vdb5OxKpG-Phx6yJVkb48tJ0_5xWIMwpqXy5Jy7S-pEoVIi2ToiZ9B5SjB8aslKbqmBICyNVECWInwL9j5714f0d9SylSPPDNEfUwY2I-INHCBNWHra=w1718-h966-no" alt></p><p>この部分が落とした時に一番ダメージを受けたらしく、<br>ケースにも穴が開いていました。</p><p>そこは、分解するときにもナットが空回りしちゃって<br>ねじがなかなか外せない難しいポイントだったのですが、<br>それはいい感じの角度にケースを固定したら外せたのでまあよかったっす。</p><p>そしてこの分解した状態でPCを起動したとき、あることに気づいたのです。</p><p>ーこの部分の形が変形したときに、電源が落ちると。</p><p>どうやらここの部分の２つのねじがゆるんでいたようで、それをきつくしめてあげました。</p><p>そしたらなんと、電源が落ちなくなりましたーーー</p><p>復活です。やったーー</p><h2 id="まとめ"><a href="#まとめ" class="headerlink" title="まとめ"></a>まとめ</h2><p>以上です。<br>まだ電源が落ちなくなってから１日しかたっていないので、<br>また再発するかもしれませんが、今のところいい感じです。</p><p>分解にはリスクも伴いますので、真似しないことをお勧めします。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;&lt;strong&gt;※今回の記事の内容を実践することは本当に自己責任になります。というか分解しないことをおすすめします。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;ja&quot;&gt;&lt;p lang=&quot;ja&quot; 
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>先生の名言を画像にして排出するだけの、誰得かわからないLINE BOT を作った話</title>
    <link href="http://asterisks.netlify.com/2018/07/14/line-teacher-bot/"/>
    <id>http://asterisks.netlify.com/2018/07/14/line-teacher-bot/</id>
    <published>2018-07-14T11:53:41.000Z</published>
    <updated>2021-05-06T02:40:20.686Z</updated>
    
    <content type="html"><![CDATA[<p>こんにちは。shundroid です。お久しぶりです。<br>期末考査も終わって、一段落したところです。</p><p>何かひと書きしてみたいところだったので、<br>クラスメートみんなで使える、何かを作ってみたいと思いました。</p><p>そこで LINE BOT の開発をしてみることにしました。</p><h2 id="作ったもの「某先生と会話bot」"><a href="#作ったもの「某先生と会話bot」" class="headerlink" title="作ったもの「某先生と会話bot」"></a>作ったもの「某先生と会話bot」</h2><p><blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">bot完成しました。近日中に仕組みをブログに公開します。 <a href="https://t.co/oxhvmIq1fe" target="_blank" rel="noopener">pic.twitter.com/oxhvmIq1fe</a></p>&mdash; shundroid (@shundroid_p) <a href="https://twitter.com/shundroid_p/status/1017964016885424130?ref_src=twsrc%5Etfw" target="_blank" rel="noopener">2018年7月14日</a></blockquote></p><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script><p>「（名前）、○○」と話すと、某先生の写真と文字を合成した画像を返すbotです。<br>特徴はただ一定の画像を返すのでなく、「○○」の内容によって文字が合成されるので、<br>新たに名言が生まれても画像と合成できるようにしていることです。</p><h2 id="仕組み"><a href="#仕組み" class="headerlink" title="仕組み"></a>仕組み</h2><p>次のようになっています。</p><p><img src="https://lh3.googleusercontent.com/UwtQILPQZAXev82RZIzZ3Oz8zacwiw8Fsyu77PSw5dMSgFjT0wkkwlplbOt929sGDFNER0rDLtUcohDDK23MTlQSlrFF14gJmtSsnSu5VHtm-ltLUGSIBO4MWevje_iBXZK9_4jFfiuLsNtmeuNZIHQ7HjezlbhYporWsEUlZww7MSlMsesYth6-L--8aH52zl0Mp49PK21BKj6d4AZnvXu8CU_lIJEUEz-wIUARip90ZeU1PJNptv57irMpslTLXwPSXqkUCdWZkmHngRfUl5TCvq8onJ2pdgcNGAy1zna7NzbmIIHwB81jACYNIPBhMr79T6k8ANdsTkd93hXIPLzwnxwDTG2uzcS5g-7BootW5jTl6tPuWcN0ylc7GN1F6QMOJne3ndiIIXIkxH7uJlYPmWMxdvlKG3WfKMoUZ84tNBu2r7beFxwSoYJh3s46Ktwo11AN5_yKToWCQ1TJnknpPe83L7vfnEvJ3bG1zAODWQWLqKNgdRKPxOn1Y7qiav09aPrlrDHciMyN8xRWQQQOdyBxYe2utl0EXNR_WYZVgM_Z3TVo2CBg9TftD1U4WuX8wMlYFp0leWUoTpEdAy5phPC2KYWkec2gY0HSiXqK2E_WGE54MUr9WacsjlU=w1073-h303-no" alt></p><h3 id="①②-メッセージ送信"><a href="#①②-メッセージ送信" class="headerlink" title="①② メッセージ送信"></a>①② メッセージ送信</h3><p>LINEユーザーがメッセージを送信します。</p><p>これを bot 側は、Messaging API のメッセージイベントとして受け取ることができます。</p><p>そして、bot 側で登録した Webhook URL に POST リクエストが飛ぶので、<br>それを使って Heroku でデプロイしている node.js アプリケーションにメッセージを送信します。</p><p><img src="https://lh3.googleusercontent.com/GEnuN3Dy8-0JCKzGfS8oaZ0ylqyJacZe45EbwTLVGs5g2sb4HrtiA5JJKJKo_xtLYIHlXXEEf7qz8a52clL4MMXjuxC7lWTedw3hJRkYr5l_ILsoYDxXuXOO9xcdTkYgwoUNcRqgUL3QmvBekYkE1jaROfhgq5RJH7ha0Aoc8zIRQF_V856f8dXAAK1MoAwel0pYmJZk_DOW7j89xTWO3qh3CLv2ZHYnex-6wPmPZNtP913Cr8nRtcelid2vuFYsTFERPVC2L4a5vn4DGca_yNBusjA2sjailKDXwEEBEUPLC4x5eC-utVUS2iU87rPS2jcO3tO5aeMYpVHKY3SPACsw_G84EvrNV344dCRockD7IZ4CoE7_FmEuOPR1kHiy_r04ugOgyUO9EO2u-KUJeDzFgAO93JHNFV9M96uUuf5zsHlg8up8DohWrNMxdSaOZU3uFh90-j0WWfZZy7HLVoslH0hoiNKLNReZD04KPDn_-qHlRVpZZjkevONaDn7tycEjaQMaoLyaMMJCsvf9KXFjJAmGG5XnbtttZDDdu4wOi6tg4-0_Lb6Zz2XS0CY6BtOeJpS-XoRCY569vgufcZgLW0ilcKIcRKcJZdsoTGk4JGGP00n06WMx918gZOA=w537-h85-no" alt></p><p>ここですね。</p><p>node.js のほうとしては、LINE の <a href="https://github.com/line/line-bot-sdk-nodejs" target="_blank" rel="noopener">Node.js SDK</a> を使うと簡単に書くことができます。<br>内容も example の中身を少し変えただけなので、<a href="https://github.com/line/line-bot-sdk-nodejs/tree/master/examples/echo-bot" target="_blank" rel="noopener">そっち</a>を参考にしてもらったほうがよいでしょう。</p><p>Express を使っています。</p><p>ちなみに、ここはどうでもいいかもしれないんですけど、<br>最初は <a href="https://zeit.co/now" target="_blank" rel="noopener">now</a> というのを使おうとしていました。<br>しかし、これだと後ほど出てくる node-canvas をなぜかコンパイルしに行き、失敗するということをするので、</p><p><blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">now 使おうとしたけど node-canvas をなぜかコンパイルしに行き失敗しちゃうから初めてトンネリングツール使ってみたけどかなり便利</p>&mdash; shundroid (@shundroid_p) <a href="https://twitter.com/shundroid_p/status/1017971362927820800?ref_src=twsrc%5Etfw" target="_blank" rel="noopener">2018年7月14日</a></blockquote></p><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script><p><a href="https://localtunnel.github.io/www/" target="_blank" rel="noopener">localtunnel</a> というトンネリングツールで自分のPCに直接アクセスするようにしました。<br>しかしこれだと自分の PC がついていないとだめなので、Heroku を使うようになった次第です。</p><p>初めて Heroku 使いましたけど、かなり便利ですね。すごい。</p><h3 id="③-メッセージ応答"><a href="#③-メッセージ応答" class="headerlink" title="③ メッセージ応答"></a>③ メッセージ応答</h3><p>画像形式でメッセージを送ります。<br>Messaging API の<a href="https://developers.line.me/ja/reference/messaging-api/#anchor-42120f44e51aa176dd60c34dc3719ff4fccc4b21" target="_blank" rel="noopener">リファレンス</a> を参考にして、</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  <span class="string">"type"</span>: <span class="string">"image"</span>,</span><br><span class="line">  <span class="string">"originalContentUrl"</span>: <span class="string">"https://example.com/original.jpg"</span>,</span><br><span class="line">  <span class="string">"previewImageUrl"</span>: <span class="string">"https://example.com/preview.jpg"</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>こういう形式で作ります。</p><p>ここで気を付けなければならないのは、画像の形式とサイズですね。<br>どちらも<strong>JPEG</strong>でなければなりません。なんと。<br>サイズは originalContentUrl のほうが<strong>1024x1024</strong>まで、<br>previewImageUrl のほうが<strong>240x240</strong>までです。</p><p>ここでの URL は今回は（original…、preview…どちらも）次のようにしました。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://xxxxx.herokuapp.com/image/&lt;名言&gt;</span><br></pre></td></tr></table></figure><p>後で URL を参照したとき、名言の文字が入っていないといけないからです。</p><h3 id="④-画像-URL-送信"><a href="#④-画像-URL-送信" class="headerlink" title="④ 画像 URL 送信"></a>④ 画像 URL 送信</h3><p>さっき作ったメッセージを送りますね。<br>これも example と同じなので<a href="https://github.com/line/line-bot-sdk-nodejs/tree/master/examples/echo-bot" target="_blank" rel="noopener">そっち</a>を見てください。</p><h3 id="⑤-画像-URL-参照"><a href="#⑤-画像-URL-参照" class="headerlink" title="⑤ 画像 URL 参照"></a>⑤ 画像 URL 参照</h3><p>bot 側が URL を参照してきます。ここで初めて画像の合成をするようにしています。</p><p>先ほど名言は URL に含まれていたので、</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">app.get(<span class="string">'/image/:text'</span>, (req, res) =&gt; &#123;</span><br><span class="line">  <span class="comment">// ...</span></span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><p>というようにパラメーターで指定しておきます。<br><code>:text</code> には <code>req.params.text</code> としてアクセスできます。</p><h3 id="⑥-画像合成・⑦⑧-画像送信"><a href="#⑥-画像合成・⑦⑧-画像送信" class="headerlink" title="⑥ 画像合成・⑦⑧ 画像送信"></a>⑥ 画像合成・⑦⑧ 画像送信</h3><p>HTML5 Canvas みたいな感じで合成出来たら手軽だと思ったので、<br><a href="https://github.com/Automattic/node-canvas" target="_blank" rel="noopener">node-canvas</a> というものを使いました。</p><p>使い勝手はほんとに HTML5 Canvas そっくりです。すごい。</p><p>はまりかけたところはまずフォントですね。</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> &#123; registerFont, createCanvas &#125; = <span class="built_in">require</span>(<span class="string">'canvas'</span>)</span><br><span class="line"><span class="keyword">const</span> ctx = createCanvas(<span class="number">100</span>, <span class="number">100</span>).getContext(<span class="string">'2d'</span>)</span><br><span class="line"><span class="comment">// ...</span></span><br><span class="line">registerFont(<span class="string">'&lt;フォントファイル&gt;.ttf'</span>, &#123; <span class="attr">family</span>: <span class="string">'&lt;フォント名&gt;'</span> &#125;)</span><br><span class="line">ctx.font = <span class="string">'17px &lt;フォント名&gt;'</span></span><br><span class="line"><span class="comment">// ...</span></span><br></pre></td></tr></table></figure><p>このような感じで使えます。</p><p>あと、JPEG 画像として返すところですね。</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> &#123; createCanvas &#125; = <span class="built_in">require</span>(<span class="string">'canvas'</span>)</span><br><span class="line"><span class="keyword">const</span> canvas = createCanvas(<span class="number">100</span>, <span class="number">100</span>)</span><br><span class="line"><span class="comment">// ...</span></span><br><span class="line">app.get(<span class="string">'xxx'</span>, (req, res) =&gt; &#123;</span><br><span class="line">  canvas.createJPEGStream(&#123; <span class="attr">quality</span>: <span class="number">100</span> &#125;).pipe(res)</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><p>こんな感じですね。createJPEGStream で Stream を作ったのを<br>pipe して res に渡すだけでおｋでした。</p><p>Express こんな方法にも対応しているのですね。さすがー</p><h2 id="まとめ"><a href="#まとめ" class="headerlink" title="まとめ"></a>まとめ</h2><p>本当に誰得かわかりませんが面白いものができました。</p><p>でもこういうものを通じて、今回は express、LINE bot の作り方、<br>Heroku、now、localtunnel、node-canvas など、様々なものについて学べました。</p><p>そして bot 作り自体はそこまで難しくなさそうですね。<br>これなら、身近な LINE ですし、プログラミングの入門としてもいいかもしれません。</p><p>今度部活のみんなでbot作ろう会をやってみよっかな。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;こんにちは。shundroid です。お久しぶりです。&lt;br&gt;期末考査も終わって、一段落したところです。&lt;/p&gt;
&lt;p&gt;何かひと書きしてみたいところだったので、&lt;br&gt;クラスメートみんなで使える、何かを作ってみたいと思いました。&lt;/p&gt;
&lt;p&gt;そこで LINE BOT の開
      
    
    </summary>
    
    
      <category term="javascript, nodejs, line" scheme="http://asterisks.netlify.com/tags/javascript-nodejs-line/"/>
    
  </entry>
  
  <entry>
    <title>ガロア理論ジェネレータを作った</title>
    <link href="http://asterisks.netlify.com/2018/06/03/galois-gen/"/>
    <id>http://asterisks.netlify.com/2018/06/03/galois-gen/</id>
    <published>2018-06-03T09:49:23.000Z</published>
    <updated>2021-05-06T02:40:20.684Z</updated>
    
    <content type="html"><![CDATA[<p><em>Dear Mr. Tomohide Suzuki</em></p><p><blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://t.co/rXsQJEGyF7" target="_blank" rel="noopener">https://t.co/rXsQJEGyF7</a><br><br>できた！！！！</p>&mdash; shundroid (@shundroid_p) <a href="https://twitter.com/shundroid_p/status/1002877350265012224?ref_src=twsrc%5Etfw" target="_blank" rel="noopener">2018年6月2日</a></blockquote></p><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script><p>こんにちは。お久しぶりです。shundroid です。<br>高校生になりました。</p><p>いやー忙しい。最近もテストがありましたが、<br>テスト範囲が広すぎて本当に大変でしたー。</p><p>そこで疲れを癒やしたいのもあり、１つサービスを作ってみました。<br>ガロア理論ジェネレーターです。</p><p><a href="https://galois-gen.netlify.com/" target="_blank" rel="noopener">https://galois-gen.netlify.com/</a></p><p>製作期間は２日です。<br>今回はどうやって作ったかなどを紹介したいと思います。</p><p><blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">これを入れておいたから許していただけるだろう <a href="https://t.co/ytq0QWOQCR" target="_blank" rel="noopener">pic.twitter.com/ytq0QWOQCR</a></p>&mdash; shundroid (@shundroid_p) <a href="https://twitter.com/shundroid_p/status/1002737176591794176?ref_src=twsrc%5Etfw" target="_blank" rel="noopener">2018年6月2日</a></blockquote></p><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script><h2 id="ソースコード"><a href="#ソースコード" class="headerlink" title="ソースコード"></a>ソースコード</h2><p><a href="https://github.com/shundroid/galois-gen" target="_blank" rel="noopener">https://github.com/shundroid/galois-gen</a></p><p>Github に上げておきました。参考にしてみてください</p><h2 id="基本構造"><a href="#基本構造" class="headerlink" title="基本構造"></a>基本構造</h2><p>スマートフォンやPCなど、多くのデバイスで動作させたいため、<br>Web アプリとして制作しました。</p><p>MVVM であり、<a href="https://jp.vuejs.org/" target="_blank" rel="noopener">Vue.js</a> で書いていますね。<br>いやーほんとに Vue はシンプルで素晴らしい。</p><p>仕組みとしては、既存の表紙の画像の上に、<br>文字を HTML 要素としてのっけてって、<br>エクスポートするときに <a href="https://html2canvas.hertzen.com/" target="_blank" rel="noopener">html2canvas</a> を使って画像にするようにしています。</p><p>UI は <a href="https://vuetifyjs.com/ja/" target="_blank" rel="noopener">Vuetify</a> で作りました。</p><h2 id="苦労したところ"><a href="#苦労したところ" class="headerlink" title="苦労したところ"></a>苦労したところ</h2><h3 id="レスポンシブルデザイン"><a href="#レスポンシブルデザイン" class="headerlink" title="レスポンシブルデザイン"></a>レスポンシブルデザイン</h3><p>スマートフォンでもPCでも動くようにしたかったので、<br>避けては通れぬ壁でした。</p><p><img src="https://farm2.staticflickr.com/1725/40717252540_6ff959e6e8_o_d.gif" alt></p><p>表紙の画像のサイズが可変なので、それに合わせて文字などを<br>相対的な座標で表す必要がありました。<br>em とか % とか使っていますね。</p><p><img src="https://farm2.staticflickr.com/1727/41802654054_aedac85cc2_o_d.png" alt></p><p>margin で em を使う日が来るなんて思いもしなかったですね。</p><p>ちなみに em は親要素の font-size に応じて自由にサイズ調整ができるので便利ですよ<br>これはサイズを要素間の比率を維持したまま一括変更したいときに、font-size を変えるだけでいいので<br>非常に便利です。ここの話は聞き流してもらっても構いませんでした。はい。</p><h3 id="html2canvas-のバグ"><a href="#html2canvas-のバグ" class="headerlink" title="html2canvas のバグ"></a>html2canvas のバグ</h3><p>HTML の要素として作られた冊子を画像に変換するときに、<br>このライブラリを使うんですけど、マジこれバグありすぎー</p><p><blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">縦書き死亡 <a href="https://twitter.com/hashtag/html2canvas?src=hash&amp;ref_src=twsrc%5Etfw" target="_blank" rel="noopener">#html2canvas</a> <a href="https://t.co/6aJjlB1Yfk" target="_blank" rel="noopener">pic.twitter.com/6aJjlB1Yfk</a></p>&mdash; shundroid (@shundroid_p) <a href="https://twitter.com/shundroid_p/status/1002863670982918144?ref_src=twsrc%5Etfw" target="_blank" rel="noopener">2018年6月2日</a></blockquote></p><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script><p>writing-mode で縦書き指定してたら作者名が死にました。</p><p>そのせいで縦書きにするのに苦労しなければならなくなりました。</p><h3 id="作者（日本語）"><a href="#作者（日本語）" class="headerlink" title="作者（日本語）"></a>作者（日本語）</h3><p><img src="https://lh3.googleusercontent.com/TzWNseX1biEXeqSUri4tmHDAChPCdHDlueiX4JMq8vWwyGqvKyG8RjjKAFIONaGDinspH8-keoDWz2PUEPsl8_d3dv3zmRf1-7IecHe04sh8bakDOIl1rCUgkLSl8hndQWufKS8xeGdRuaOHWTyMf7KPvAxnICKc6nXD6p9_lkEZB5xagEAMOM2DsrF7iHtRZAfPEdVhGSulngHYSEMBJ7EuaYSGfP5Y7EuEUQ-ih8qYeg-v9kwDXT-Zs6uLgtSewQF9DT1MkxMdCt321hFc18queFEjowNMfEaO1nsPNfNIYo0ole0inQrFcZXopA2-1X5K40yq2LES2PD74cpsSxun3rNiNc8xtJT8ZtfD9ow7WLIOGkRdCSfFMGXVSQ2jlJnv-VDHdQ0f45TOqylnZomaagj5luERgSwfmBGCEo1m3Deps6ctuDa36GNFPvixm6EOIQkrfV05GsaFpN9Z46kf3Xqjz2KqXg9UOYDsY2l589JMDBXYrWg6yxiydQDzcJ9bZXu8YLlaBm-MCm-U69uya7fAcwmRdwRaPywvjOAhL11_xJ7VP72fQzbs2l1PptIcrEGQ1p32nLtaYzG6MyQuM78pJ5o76iBlQuM=w473-h16-no" alt></p><p>これはもう１文字ごとに <code>&lt;br /&gt;</code> を打ち込むようにしました。<br>仕方がないですね。お許しください。<br>字間は line-height で調整ー</p><h3 id="作者（英語）"><a href="#作者（英語）" class="headerlink" title="作者（英語）"></a>作者（英語）</h3><p>英語はなんと、<strong>文字を回します</strong></p><p><img src="https://lh3.googleusercontent.com/AJnVEFyftBo_bGwf5pJyvPNb9MllnFySLdgu2RdDOEQcgkKBYrTrrrG0n1Z8ES4tJEohzAmbyixMwqs1v3EyNwFwGAz_ZsqRMtk97-_258IdbwGz3h5vTrju60DdqYz6tZzeXJHXrIXeVvuI_ChFWhy-Sindn86pFho9sgSX4AjF7Fra-TO_yk-z-39-15oZMXtc3euH5GZM59k6Q7T0f32ju3T1o7yua31oC5QNk1e8AEItnB12C4JSg9hJAcpMPDUOeymXN3ToJoB-1VumRClZUlyaHz2bgdwk6UW6hCItomu47PbK3CZHLFFwAiPUYt4wKPzhpkoX9VdIfhH1O6Yb5QHVlZfin8ifHHEZnN5JlJcn52IGUUGNZ5RyHVdyhvvY_Ir4ixZyQ47ZdZA6FHYrexF0UeMCd7PoyIFZBPtxxgCyEycH0G2DX7UvvJj3J1gHWTu7EFv6cO8oF_8dw0y8AFQKoN8MYBsxZ0CZz2ImH1OFA11f6Abf9p1GZErQhKDqR8haONmfXY7v0mwNIWhY5Zf-g-lyf7OH5dHW5lUGVDDXK-BgLuLCVsuo7L7kj0bp-dTNikEOdtdDU15a1xe8aS-QDW874It25qM=w87-h276-no" alt></p><p>あーこれ writing-mode つかえないとか<br>transform 使わなきゃいけない感じじゃねーと察しますよね。</p><p>そうなんです。使うんです。</p><p><img src="https://lh3.googleusercontent.com/tILl96040Ut24MNi0T5RbGGpel7--12LSMM529bftxuFFpQsUXykILLCh2YIutvQqFQsCSTHfMZ2vHy5Dwo2frQwJzdG1nyjcWFMDVw4LZGCTR52nZgsGO5gAsvfBYwN7_FhsivRpPdAPQ41t8JmdiGklsRfYD_xY0NTyfAB9Ywxb6FdTFIvYmbNS7QGnB4jbdirBfS1zbaGEiytdHKmxxcgoVLHogDpPI6jWqkZfJ5Y1LnUQ4XbN2YJm9F5VytzUAJcWmHA5_F5uP17dbrkQPYDhZh5MNFtRRn_CwoyWBSfSlA1wIhyaSlO0YcBfiuLDLfZqM83IfMEIoNewjllrKA9DhvqWUb4o3-8iSKVzqOUS54acV-SIN3MjEZVY6PEm4znLBGfxW0daXiKL5V5NUJpOHVtXr9XwwUrHI-BdpbmqUEHjE8IWmYFSTi5H1ddL0-ufx1thnnMocYEU9jC8NLpPKfK8mITDwXktiGMSYujXEWgy1DLZzLSw4mLqbroS07rwNoDpLcMCL8cfsowD4loSWNzS0nb1tlNLGIc4bgvGlvWgtn5sNoY_mWQga7yW3loxBl7XC-NAVdL9cx8hGFRS2_NL4G2hZKK8m4=w263-h54-no" alt></p><p>回しました。<br>最初は pivot がおかしくなりそうで苦労していましたが、<br>調べてみたら transform-origin とかいう神プロパティがあるそうで</p><p>それで意外とかんたんにできましたー。やったー</p><h2 id="まとめ"><a href="#まとめ" class="headerlink" title="まとめ"></a>まとめ</h2><p>皆さんガロア理論の本おすすめです。</p><p><a href="https://amzn.to/2LUYNHh" target="_blank" rel="noopener">https://amzn.to/2LUYNHh</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;&lt;em&gt;Dear Mr. Tomohide Suzuki&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;ja&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;&lt;a href=&quot;https://t.co/rX
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>Hexo で検索結果を表示するページを生成するプラグインを作った。</title>
    <link href="http://asterisks.netlify.com/2018/02/07/hexo-search-result/"/>
    <id>http://asterisks.netlify.com/2018/02/07/hexo-search-result/</id>
    <published>2018-02-07T16:43:47.000Z</published>
    <updated>2021-05-06T02:40:20.684Z</updated>
    
    <content type="html"><![CDATA[<p>こんにちは。shundroid です。お久しぶりです。</p><p>今回は新しく作った Hexo のプラグインについて、<br>仕組みや工夫したところなどを書きたいと思います。</p><h2 id="追記：2018-02-08"><a href="#追記：2018-02-08" class="headerlink" title="追記：2018/02/08"></a>追記：2018/02/08</h2><p>client 側の工夫したところが消えましたｗ<br>多分 vscode-vim で insert モードを解除せずに消しちゃったからかな<br>とりあえず大まかには書いておきました。</p><h2 id="概要"><a href="#概要" class="headerlink" title="概要"></a>概要</h2><p><a href="https://github.com/PaicHyperionDev/hexo-generator-search" target="_blank" rel="noopener">hexo-generator-search</a> で生成された search.xml を使って、<br>検索結果を表示するページを作成します。</p><p>このブログでも使用しています。<br>サイドバーの検索ボックスで検索すると、このプラグインで生成されたページが表示されます。</p><h2 id="リポジトリ"><a href="#リポジトリ" class="headerlink" title="リポジトリ"></a>リポジトリ</h2><iframe class="hatenablogcard" style="width: 100%; height: 155px; max-width: 680px;" src="https://hatenablog-parts.com/embed?url=https://github.com/shundroid/hexo-search-result" width="300" height="150" frameborder="0" scrolling="no"></iframe><h2 id="インストール"><a href="#インストール" class="headerlink" title="インストール"></a>インストール</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ npm install hexo-generator-search</span><br></pre></td></tr></table></figure><p>続きは<a href="https://github.com/shundroid/hexo-search-result" target="_blank" rel="noopener">上のリポジトリのREADME.md</a>に書いてあります。</p><h2 id="仕組み"><a href="#仕組み" class="headerlink" title="仕組み"></a>仕組み</h2><p>空のページを作成し、そこに <code>{% search_result %}</code> と書くことで、<br>ページが表示されるようにしています。<br>このタグが読み込まれると、そこに <code>&lt;div&gt;</code> <code>&lt;script&gt;</code> <code>&lt;style&gt;</code> が<br>挿入されるようになっています。</p><h3 id="Hexo-側"><a href="#Hexo-側" class="headerlink" title="Hexo 側"></a>Hexo 側</h3><p>index.js<br><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> fs = <span class="built_in">require</span>(<span class="string">'hexo-fs'</span>)</span><br><span class="line"><span class="keyword">const</span> path = <span class="built_in">require</span>(<span class="string">'path'</span>)</span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">insertSearchResult</span> (<span class="params">args</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">return</span> <span class="built_in">Promise</span>.all([fs.readFile(path.join(__dirname, <span class="string">'./client.js'</span>)),</span><br><span class="line">    fs.readFile(path.join(__dirname, <span class="string">'./style.css'</span>))]).then(<span class="function"><span class="params">contents</span> =&gt;</span> &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="string">'&lt;div id="plugin-search-result"&gt;&lt;/div&gt;'</span> +</span><br><span class="line">      <span class="string">'&lt;script&gt;'</span> + contents[<span class="number">0</span>] + <span class="string">'&lt;/script&gt;'</span> +</span><br><span class="line">      <span class="string">'&lt;style&gt;'</span> + contents[<span class="number">1</span>] + <span class="string">'&lt;/style&gt;'</span></span><br><span class="line">  &#125;)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">hexo.extend.tag.register(<span class="string">'search_result'</span>, insertSearchResult, &#123;</span><br><span class="line">  <span class="keyword">async</span>: <span class="literal">true</span></span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure></p><p>script、style の読み込みは、webpack などをつかってもよかったのですが、　<br>今回は小規模に作りたかったので、単純にファイル読み込み＋inline 出力で実装しました。</p><p>この時、タグの中身に非同期プロセスを含みますので、<br><code>tag.register</code> には引数で <code>{ async: true }</code> を渡しています。<br>また、fs は代わりに <a href="https://github.com/hexojs/hexo-fs" target="_blank" rel="noopener">hexo-fs</a> を利用して、それが <a href="https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise" target="_blank" rel="noopener">Promise</a> を返してくれています。<br>2ファイル読んでいるので、<a href="https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise/all" target="_blank" rel="noopener">Promise.all</a> を使用して並立にしています。</p><h3 id="ブラウザ側"><a href="#ブラウザ側" class="headerlink" title="ブラウザ側"></a>ブラウザ側</h3><p>ここで読み込んでいる script は、ブラウザ側で動作しますね。<br>そちらも見てみましょう。</p><p>流れは、</p><ol><li>hexo-generator-search で生成された search.xml を xhr で読み込む</li><li>そこから検索</li><li>検索結果を dom として生成</li></ol><p>という感じです。</p><h2 id="まとめ"><a href="#まとめ" class="headerlink" title="まとめ"></a>まとめ</h2><p>このような感じでプラグインを作りました。<br>よろしければ使ってみてください。<br>バグ・機能要望などは <a href="https://github.com/shundroid/hexo-search-result/issues" target="_blank" rel="noopener">Github Issues</a> へ。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;こんにちは。shundroid です。お久しぶりです。&lt;/p&gt;
&lt;p&gt;今回は新しく作った Hexo のプラグインについて、&lt;br&gt;仕組みや工夫したところなどを書きたいと思います。&lt;/p&gt;
&lt;h2 id=&quot;追記：2018-02-08&quot;&gt;&lt;a href=&quot;#追記：2018-02
      
    
    </summary>
    
    
      <category term="hexo" scheme="http://asterisks.netlify.com/tags/hexo/"/>
    
      <category term="javascript" scheme="http://asterisks.netlify.com/tags/javascript/"/>
    
  </entry>
  
  <entry>
    <title>【Spacechem】Sync-3 何回かに１回</title>
    <link href="http://asterisks.netlify.com/2018/01/04/spacechem-sync-3/"/>
    <id>http://asterisks.netlify.com/2018/01/04/spacechem-sync-3/</id>
    <published>2018-01-04T19:13:00.000Z</published>
    <updated>2021-05-06T02:40:20.688Z</updated>
    
    <content type="html"><![CDATA[<p>こんにちは。</p><iframe class="hatenablogcard" style="width: 100%; height: 155px; max-width: 680px;" src="https://hatenablog-parts.com/embed?url=https://asterisks.netlify.com/2017/12/31/spacechem-points/" width="300" height="150" frameborder="0" scrolling="no"></iframe><p>Spacechem の解法、Sync の３つ目です。</p><p>今回は Sync コマンドの応用の使用法の１つである、</p><p><strong>何回かに１回</strong></p><p>について説明しようと思います。</p><p>具体的には、</p><p>１つのウォルドが何回か実行するたびに、<br>もう１つのウォルドが１回処理する</p><p>というのを繰り返すことです。</p><h2 id="例：-ヘーパイストスIV-KOHCTPYKTOP"><a href="#例：-ヘーパイストスIV-KOHCTPYKTOP" class="headerlink" title="例： ヘーパイストスIV KOHCTPYKTOP"></a>例： ヘーパイストスIV KOHCTPYKTOP</h2><p>例として、ヘーパイストスIV のサイドストーリー、<br>KOHCTPYKTOP の、ケイ素の分子を作り出すところを見てみましょう。</p><p><img src="https://farm5.staticflickr.com/4599/24624685777_5bc4763e5b_o_d.gif" alt></p><p>めちゃくちゃ長い処理になってしまったので、<br>早送りしていますが、</p><p>赤のウォルドで２回輪の形をしたケイ素の分子を作った後、<br>青のウォルドで１回３×３の正方形を作っています。</p><p>ここでは、「２回に１回」という仕組みが使われています。<br>どのような仕組みになっているのでしょうか。</p><p><img src="https://farm5.staticflickr.com/4593/25621590808_81ec3c9a12_o_d.png" alt></p><p>このように、赤のウォルドに sync が２つあるのに対し、<br>青のウォルドに sync が４つあるので、<br>赤が２回回らないと、青が１回回らない、<br>つまり「２回に１回」が実現しています。</p><p><img src="https://farm5.staticflickr.com/4730/39491358761_9f5e8448fd_o_d.gif" alt><br>↑単純化してみました。</p><p><img src="https://farm5.staticflickr.com/4601/39491359011_707e89184f_z_d.jpg" alt><br>横が時間軸、赤と青が処理するウォルドを表しています。</p><h2 id="Sync-の数"><a href="#Sync-の数" class="headerlink" title="Sync の数"></a>Sync の数</h2><p>公式っぽくすると、</p><p><strong>赤がn回処理した後、青が1回処理する場合、</strong><br><strong>赤に sync を２つ、青に sync を 2n 個つける</strong></p><p>と、３回に１回、４回に１回、…でもできます。</p><h3 id="「交互に実行」も同じ"><a href="#「交互に実行」も同じ" class="headerlink" title="「交互に実行」も同じ"></a>「交互に実行」も同じ</h3><p>前回の<a href="https://asterisks.netlify.com/2017/12/31/spacechem-sync-2/">交互に実行</a>も、<br>今回の公式っぽいのを使えば、「１回に１回」として sync の数がわかります。</p><h2 id="何回かに１回、同時に処理を実行"><a href="#何回かに１回、同時に処理を実行" class="headerlink" title="何回かに１回、同時に処理を実行"></a>何回かに１回、同時に処理を実行</h2><p>こっちのほうが言葉通りな気もします。</p><p>何回かに１回、同時に実行します。</p><p><img src="https://farm5.staticflickr.com/4683/24624690747_b618d5ecf5_o_d.gif" alt></p><p><img src="https://farm5.staticflickr.com/4647/24624691107_2e601248dd_o_d.png" alt><br>２回目で重なって実行されます。</p><p>この２つ、何が違うのでしょうか。</p><h2 id="Sync-の位置が大事"><a href="#Sync-の位置が大事" class="headerlink" title="Sync の位置が大事"></a>Sync の位置が大事</h2><p>実は Sync の位置がとても重要になっています。<br>Sync の位置により、この２つの動作が変わってきます。</p><h3 id="１回処理するウォルドのどちらかに奇数個の-Sync-がある場合"><a href="#１回処理するウォルドのどちらかに奇数個の-Sync-がある場合" class="headerlink" title="１回処理するウォルドのどちらかに奇数個の Sync がある場合"></a>１回処理するウォルドのどちらかに奇数個の Sync がある場合</h3><p>この例でいえば青のウォルドの上下左右どれかに、奇数個の Sync があれば、<br>何回かに１回、別々に実行する、<br>先に書いたほうの動きをします。</p><h3 id="１回処理するウォルドのどちらかに偶数個の-Sync-がある場合"><a href="#１回処理するウォルドのどちらかに偶数個の-Sync-がある場合" class="headerlink" title="１回処理するウォルドのどちらかに偶数個の Sync がある場合"></a>１回処理するウォルドのどちらかに偶数個の Sync がある場合</h3><p>この例でいえば青のウォルドの上下左右どれかに、偶数個の Sync があれば、<br>何回かに１回、同時に実行する、<br>後に書いたほうの動きをします。</p><h3 id="左右にある-Sync-の数によって、タイミングが変わる"><a href="#左右にある-Sync-の数によって、タイミングが変わる" class="headerlink" title="左右にある Sync の数によって、タイミングが変わる"></a>左右にある Sync の数によって、タイミングが変わる</h3><p>次のような動きをするにはどうすればよいでしょう。<br>赤１回、青１回、赤１回、を繰り返します。<br><img src="https://farm5.staticflickr.com/4592/39491358871_f58233136b_z_d.jpg" alt></p><p>赤と青が同時に処理しないので、先に述べた方法で、<br>奇数個の sync が青の両側にあります。</p><p><img src="https://farm5.staticflickr.com/4636/24624691367_2a3ccb1529_o_d.gif" alt></p><p>そして、その sync の配分を替えると、タイミングが変わります。</p><h2 id="まとめ"><a href="#まとめ" class="headerlink" title="まとめ"></a>まとめ</h2><p>こんな感じで、Sync を使えば、様々な処理を自在にできます。<br>かなり奥深いです。ぜひ実践してみてください！</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;こんにちは。&lt;/p&gt;
&lt;iframe class=&quot;hatenablogcard&quot; style=&quot;width: 100%; height: 155px; max-width: 680px;&quot; src=&quot;https://hatenablog-parts.com/embed?u
      
    
    </summary>
    
      <category term="SERIES" scheme="http://asterisks.netlify.com/categories/SERIES/"/>
    
      <category term="Spacechem-Tips" scheme="http://asterisks.netlify.com/categories/SERIES/Spacechem-Tips/"/>
    
      <category term="Game" scheme="http://asterisks.netlify.com/categories/SERIES/Spacechem-Tips/Game/"/>
    
    
      <category term="steam" scheme="http://asterisks.netlify.com/tags/steam/"/>
    
      <category term="game" scheme="http://asterisks.netlify.com/tags/game/"/>
    
      <category term="spacechem" scheme="http://asterisks.netlify.com/tags/spacechem/"/>
    
  </entry>
  
  <entry>
    <title>Wercker を使って Hexo の deploy を自動化する</title>
    <link href="http://asterisks.netlify.com/2018/01/04/automatically-deploy-wercker/"/>
    <id>http://asterisks.netlify.com/2018/01/04/automatically-deploy-wercker/</id>
    <published>2018-01-04T13:11:34.000Z</published>
    <updated>2021-05-06T02:40:20.681Z</updated>
    
    <content type="html"><![CDATA[<p>こんにちは。shundroid です。</p><p><a href="https://hexo.io/" target="_blank" rel="noopener">Hexo</a> にブログを移行しましたが、<br>一回一回記事を上げるごとに、<code>git commit</code> して <code>hexo deploy</code> するのは<br>めんどくさいですよね。</p><p>そこで、今回は <a href="https://www.wercker.com/" target="_blank" rel="noopener">wercker</a> を使って git commit されると自動で<br>デプロイしてくれるようにします。</p><h2 id="目指す運営形態"><a href="#目指す運営形態" class="headerlink" title="目指す運営形態"></a>目指す運営形態</h2><p><img src="https://farm5.staticflickr.com/4635/24621049717_501df4a1cc_z_d.jpg" alt></p><p>上のような形を目指し、今回 Wercker に関するところを作っていきます。</p><p>間に通しすぎじゃないか！？と言われるかもしれませんが、それぞれ意味があります。</p><ul><li><a href="https://bitbucket.org/" target="_blank" rel="noopener">Bitbucket</a>: ブログ全体の非公開リポジトリ。</li><li><strong><a href="https://wwwwercker.com/" target="_blank" rel="noopener">Wercker</a>: Bitbucket の更新をチェックし、自動で Github にデプロイ</strong>←今回作ります</li><li><a href="https://github.com" target="_blank" rel="noopener">Github</a>: 生成されたサイトのリポジトリ。</li><li><a href="https://netlify.com" target="_blank" rel="noopener">Netlify</a>: Github の更新をチェックし、サイトをホスト。</li></ul><p>Github がいらなそうですが、<br>ぼくはこのサイトを、パスワードなどを含めない部分はオープンソースにして、<br>構造などを公開したいと思っているので、いります！</p><p>Netlify じゃなくて <a href="https://pages.github.com/" target="_blank" rel="noopener">Github Pages</a> でもよさそうですが、<br>性能が Netlify のほうがいいので、そっちを使っています。</p><h2 id="wercker-yml-を作成"><a href="#wercker-yml-を作成" class="headerlink" title="wercker.yml を作成"></a>wercker.yml を作成</h2><p>プロジェクトのルートディレクトリに、<br>wercker.yml を次のような内容で作成します。<br><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">box:</span> <span class="string">node</span></span><br><span class="line"><span class="attr">build:</span></span><br><span class="line"><span class="attr">  steps:</span></span><br><span class="line"><span class="bullet">    -</span> <span class="string">npm-install</span></span><br><span class="line"><span class="attr">    - script:</span></span><br><span class="line"><span class="attr">        name:</span> <span class="string">echo</span> <span class="string">nodejs</span> <span class="string">information</span></span><br><span class="line"><span class="attr">        code:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          echo "node version $(node -v) running"</span></span><br><span class="line"><span class="string">          echo "npm version $(npm -v) running"</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"></span><span class="attr">deploy:</span></span><br><span class="line"><span class="attr">  steps:</span></span><br><span class="line"><span class="attr">    - script:</span></span><br><span class="line"><span class="attr">        name:</span> <span class="string">configure</span> <span class="string">git</span></span><br><span class="line"><span class="attr">        code:</span> <span class="string">|-</span></span><br><span class="line">          <span class="string">git</span> <span class="string">config</span> <span class="bullet">--global</span> <span class="string">user.email</span> <span class="string">&lt;Github</span> <span class="string">メールアドレス&gt;</span></span><br><span class="line">          <span class="string">git</span> <span class="string">config</span> <span class="bullet">--global</span> <span class="string">user.name</span> <span class="string">&lt;Github</span> <span class="string">ユーザー名&gt;</span></span><br><span class="line"><span class="attr">    - script:</span></span><br><span class="line"><span class="attr">        name:</span> <span class="string">install</span> <span class="string">theme</span></span><br><span class="line"><span class="attr">        code:</span> <span class="string">|-</span></span><br><span class="line">          <span class="string">git</span> <span class="string">clone</span> <span class="attr">https://github.com/shundroid/hexo-theme-chan.git</span> <span class="string">themes/chan/</span> <span class="bullet">--depth=1</span></span><br><span class="line"><span class="attr">    - script:</span></span><br><span class="line"><span class="attr">        name:</span> <span class="string">install</span> <span class="string">hexo</span></span><br><span class="line"><span class="attr">        code:</span> <span class="string">|-</span></span><br><span class="line">          <span class="string">sudo</span> <span class="string">npm</span> <span class="string">install</span> <span class="bullet">-g</span> <span class="string">hexo</span></span><br><span class="line"><span class="attr">    - script:</span></span><br><span class="line"><span class="attr">        name:</span> <span class="string">deploy</span> <span class="string">to</span> <span class="string">github</span></span><br><span class="line"><span class="attr">        code:</span> <span class="string">|-</span></span><br><span class="line">          <span class="string">hexo</span> <span class="string">clean</span></span><br><span class="line">          <span class="string">hexo</span> <span class="string">generate</span></span><br><span class="line">          <span class="string">hexo</span> <span class="string">deploy</span></span><br></pre></td></tr></table></figure></p><p>build のほうはデフォルトから変えていません。（デフォルトはあとで登場します）<br>deploy 側が独自です。ここには僕がハマった経験がたくさん詰まっています。</p><h3 id="テーマの-clone-を忘れずに！"><a href="#テーマの-clone-を忘れずに！" class="headerlink" title="テーマの clone を忘れずに！"></a>テーマの clone を忘れずに！</h3><p>deploy 内で、install theme していますね。<br>これなのですが、テーマをクローンし忘れると、<br><code>WARN No layout: xxx</code> というエラーが出まくり、<br>空のブログが作成されますw</p><p>ちなみに、 <code>--depth=1</code> を入れると、深く log を取らないので、<br>パフォーマンスの改善になります。</p><p>ご自分のテーマに合わせて、クローン元・クローン先を変更してください。</p><h3 id="hexo-はグローバルインストールしなければならなかった"><a href="#hexo-はグローバルインストールしなければならなかった" class="headerlink" title="hexo はグローバルインストールしなければならなかった"></a>hexo はグローバルインストールしなければならなかった</h3><p>プロジェクトにインストールされている hexo を、<br><code>./node_modules/.bin/hexo</code> として実行しようとしましたが、全く反応しなかったです。<br>npm scripts にコマンドを追加してもやってみましたが、同様でした。<br>仕方なくグローバルインストールしました。</p><h2 id="Github-から-Personal-Token-を取得"><a href="#Github-から-Personal-Token-を取得" class="headerlink" title="Github から Personal Token を取得"></a>Github から Personal Token を取得</h2><p><a href="https://github.com/settings/tokens/new" target="_blank" rel="noopener">https://github.com/settings/tokens/new</a></p><p>↑にアクセスして、Token を作成します。<br>チェックは、public_repo にのみ入れてください。<br>トークンができたら、暗記してください（大嘘）</p><p>というか暗記できるくらいの記憶力が欲しいよ――</p><h2 id="チェック：プロジェクトは非公開になっていますか？"><a href="#チェック：プロジェクトは非公開になっていますか？" class="headerlink" title="チェック：プロジェクトは非公開になっていますか？"></a>チェック：プロジェクトは非公開になっていますか？</h2><p>これから、プロジェクトにトークンを書き込みますが、<br>この時、プロジェクトが公開されていると、かなりセキュリティ的に危険です。<br>非公開にしましょう。※ブログを非公開にするのではありません</p><p>Github は学生でなければ非公開リポジトリは作れませんが、<br>Bitbucket は<a href="https://asterisks.netlify.com/2016/02/16/git-private-bitbucket/">無料で作れます</a>。ぼくは Bitbucket を使っています。</p><p>また、プロジェクトを公開しなければならない場合は、<br>Wercker 側にトークンを非公開で設定し、それを使うという方法もあるそうです。</p><iframe class="hatenablogcard" style="width: 100%; height: 155px; max-width: 680px;" src="https://hatenablog-parts.com/embed?url=http://yuukichi.hatenablog.com/entry/2014/08/16/Hexo%2BGithub%2BWercker%E3%81%A7%E3%83%96%E3%83%AD%E3%82%B0%E6%A7%8B%E7%AF%89" width="300" height="150" frameborder="0" scrolling="no"></iframe><h2 id="config-yml-を変更"><a href="#config-yml-を変更" class="headerlink" title="_config.yml を変更"></a>_config.yml を変更</h2><p>プロジェクトのルートディレクトリにある、_config.yml を変更します。</p><p>deploy のところですね。</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">deploy:</span></span><br><span class="line"><span class="attr">  repo:</span> <span class="attr">https://先ほどのトークン@github.com/ユーザー名/リポジトリ.git</span></span><br></pre></td></tr></table></figure><h2 id="Wercker-で-Application-を登録"><a href="#Wercker-で-Application-を登録" class="headerlink" title="Wercker で Application を登録"></a>Wercker で Application を登録</h2><p><a href="http://www.wercker.com/" target="_blank" rel="noopener">http://www.wercker.com/</a></p><p>↑にアクセスして、Sign up しておいてください。</p><h3 id="Git-connections-を設定"><a href="#Git-connections-を設定" class="headerlink" title="Git connections を設定"></a>Git connections を設定</h3><p><a href="https://app.wercker.com/profile/connections" target="_blank" rel="noopener">https://app.wercker.com/profile/connections</a></p><p>ここにアクセスして、プロジェクトが使っているリモートのサービスとリンクしましょう。<br>ぼくは Bitbucket なので、Bitbucket とリンクしました。</p><h3 id="Application-を作成"><a href="#Application-を作成" class="headerlink" title="Application を作成"></a>Application を作成</h3><p><a href="https://app.wercker.com/applications/create" target="_blank" rel="noopener">https://app.wercker.com/applications/create</a></p><p>ここにアクセスして、アプリを作りましょう。<br>といっても超シンプルです。</p><p><img src="https://farm5.staticflickr.com/4730/27712999959_dcd673bd0a_z_d.jpg" alt></p><p>まず SCM を選びます。これはプロジェクトが使っているやつですね。<br>ぼくは Bitbucket なのでそれを選びました。<br>選んだら Next</p><p><img src="https://farm5.staticflickr.com/4636/24622953277_97c4afdca5_z_d.jpg" alt><br>リポジトリを選びます。これはそのプロジェクト自体ですね。<br>選んだら Next</p><p><img src="https://farm5.staticflickr.com/4690/24622954397_a245b5079b_z_d.jpg" alt><br>その次は deploy key に関するやつですが、recommended でいいので Next</p><p>その次は公開したいなら Make my app public ですが、<br>どっちでもいいです。</p><p><img src="https://farm5.staticflickr.com/4639/39458968172_e3a1a4b027_z_d.jpg" alt><br>これで完了です。<br>色々出ていますが、すでに wercker.yml は作っているので気にしなくていいです。</p><h3 id="Workflow-の設定"><a href="#Workflow-の設定" class="headerlink" title="Workflow の設定"></a>Workflow の設定</h3><p>あと少し！</p><p><img src="https://farm5.staticflickr.com/4681/38780826214_2977ef6400_z_d.jpg" alt><br>上のほうのタブの「Workflows」を押します。</p><p><img src="https://farm5.staticflickr.com/4601/38780827854_30ef8c496b_z_d.jpg" alt><br>「Add new pipeline」します。</p><p><img src="https://farm5.staticflickr.com/4599/39489549651_1e10f837f0_z_d.jpg" alt><br>写真のように、Name も YML Pipeline name も deploy でお願いします。<br>Create を押します。</p><p><img src="https://farm5.staticflickr.com/4681/38780826214_2977ef6400_z_d.jpg" alt><br>色々出るので、もう一度 Workflows を押します。</p><p><img src="https://farm5.staticflickr.com/4595/24623007457_cf7630a9aa_m_d.jpg" alt><br>Editor の + を押して、<br>Execute Pipeline を deploy にして、Add しましょう。</p><p>これで、build 後に deploy が走るようになりました。</p><h2 id="commit-amp-push-する"><a href="#commit-amp-push-する" class="headerlink" title="commit &amp; push する"></a>commit &amp; push する</h2><p>さて、これでコミットしてプッシュしたら、<br>deploy されるはずですね。</p><p>ローカルで、<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">$ git status</span><br><span class="line">&lt;wercker.ymlが追加されていることを確認&gt;</span><br><span class="line">$ git add .</span><br><span class="line">$ git commit -m <span class="string">"added wercker.yml"</span></span><br><span class="line">$ git push origin master</span><br></pre></td></tr></table></figure></p><p>ブランチ名、リモート名は自分の環境に合わせ変えてください。<br>コミット名は何でもいいですよ。</p><h2 id="確認"><a href="#確認" class="headerlink" title="確認"></a>確認</h2><p><img src="https://farm5.staticflickr.com/4681/25619668058_872b259928_z_d.jpg" alt><br>こんな感じで build、deploy ともに成功すれば多分おｋです。</p><p><img src="https://farm5.staticflickr.com/4687/25619626518_4335bee8f5_z_d.jpg" alt><br>Github のほうにも push されていることを確認しましょう。</p><h3 id="できていなかったら・・・"><a href="#できていなかったら・・・" class="headerlink" title="できていなかったら・・・"></a>できていなかったら・・・</h3><p>ぼくがハマったポイントを改めて書いておきます。</p><ul><li>テーマはあっていますか（wercker.yml）</li><li>Token は正しいですか（_config.yml）</li><li>git config の設定はできていますか（wercker.yml）</li><li>Pipeline の設定は正しいですか</li></ul><h2 id="今後：Wercker-の良さを最大限活かす"><a href="#今後：Wercker-の良さを最大限活かす" class="headerlink" title="今後：Wercker の良さを最大限活かす"></a>今後：Wercker の良さを最大限活かす</h2><p>さて、これで自動 deploy ができました。<br>しかし、まだ改善点はあります。</p><p>hexo を毎回グローバルインストールするのもあれなんで、<br>すでに hexo が入った box を使いたいですね。</p><p>wercker らしい感じもします。</p><p>やろうと思いましたが、ちょっと疲れちゃって挫折しました。<br>とりあえず現状で動くので、将来的に直します。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;こんにちは。shundroid です。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hexo.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Hexo&lt;/a&gt; にブログを移行しましたが、&lt;br&gt;一回一回記事を上げるごとに、&lt;code&gt;git co
      
    
    </summary>
    
      <category term="Blog Management" scheme="http://asterisks.netlify.com/categories/Blog-Management/"/>
    
    
      <category term="hexo" scheme="http://asterisks.netlify.com/tags/hexo/"/>
    
      <category term="wercker" scheme="http://asterisks.netlify.com/tags/wercker/"/>
    
      <category term="ci" scheme="http://asterisks.netlify.com/tags/ci/"/>
    
      <category term="javascript" scheme="http://asterisks.netlify.com/tags/javascript/"/>
    
  </entry>
  
  <entry>
    <title>ブログ移転しました！</title>
    <link href="http://asterisks.netlify.com/2018/01/03/moved-blog/"/>
    <id>http://asterisks.netlify.com/2018/01/03/moved-blog/</id>
    <published>2018-01-03T11:54:45.000Z</published>
    <updated>2021-05-06T02:40:20.686Z</updated>
    
    <content type="html"><![CDATA[<p>こんにちは。shundroid です。<br>あけましておめでとうございます。今年もよろしくお願いします。</p><p><img src="https://farm5.staticflickr.com/4598/38755022294_89ab7bb022_o_d.png" alt></p><p>さて、ブログを WordPress から <a href="https://hexo.io/" target="_blank" rel="noopener">Hexo</a> に移転しました！<br>ここではブログ移転の経緯などを説明していきたいと思います。</p><h2 id="今までメールアドレスで購読していただいた方"><a href="#今までメールアドレスで購読していただいた方" class="headerlink" title="今までメールアドレスで購読していただいた方"></a>今までメールアドレスで購読していただいた方</h2><p>いつもありがとうございます。<br>Hexo ではデフォルトでメールアドレスによる購読ができません。</p><p>今後プラグインを使い、対応させていくかもしれませんが、<br>それまで、前のサイトでも使っていた、<br><a href="https://feedly.com/" target="_blank" rel="noopener">Feedly</a> などの RSS リーダーによる購読をよろしくお願いします。</p><p><a data-flickr-embed="true" data-header="true" data-footer="true" href="http://www.flickr.com/photos/126344033@N06/25591704648" title="asterisks-feed" target="_blank" rel="noopener"><img src="https://farm5.staticflickr.com/4640/25591704648_47d880f8c0_z.jpg" alt="asterisks-feed" class="alignnone"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script></p><h2 id="移行の背景"><a href="#移行の背景" class="headerlink" title="移行の背景"></a>移行の背景</h2><h3 id="重かった"><a href="#重かった" class="headerlink" title="重かった"></a>重かった</h3><p>WordPress は、ページを表示する際、動的にサーバー側でいろいろするので、重いんです。<br>それに対し、このサイトでは、すでにある Web ページをただ単に表示しているだけなので、処理が少なく、軽いんです。</p><h3 id="自分の専門分野"><a href="#自分の専門分野" class="headerlink" title="自分の専門分野"></a>自分の専門分野</h3><p>WordPress は、プラグインの作成やテーマの編集に、php を使っていました。<br>Hexo では、すべて自分の専門分野である JavaScript で開発できるので、すごく楽なんです。</p><p>もうすでに１つ独自プラグインを使用しており、テーマも自分好みにがりがり改造しています。<br>それについても記事を上げたいと思います。</p><h3 id="URL-が単純に"><a href="#URL-が単純に" class="headerlink" title="URL が単純に"></a>URL が単純に</h3><p>今まで <code>polaris-bear.lolipop.jp</code> と、謎のドメイン名でしたね。<br>これは、母のサイトのドメインを使って、僕のブログをやっていたので、<br>こういう名前になってしまっています。<br>しかも lolipop って打ちにくいですよねｗ右手の薬指と小指がｗｗ</p><p>今回は URL が単純になります。ご安心ください。</p><h3 id="セキュリティが万全"><a href="#セキュリティが万全" class="headerlink" title="セキュリティが万全"></a>セキュリティが万全</h3><p>サーバーサイドで記事を追加したり削除したりできないので、<br>不正ログインなどの概念が（Github を除けば）なくなります。</p><h3 id="無料"><a href="#無料" class="headerlink" title="無料"></a>無料</h3><p>実はサイトの運営には一切お金がかかっておりません。<br>詳しくは、↓で書きたいと思います。</p><h2 id="このサイトの仕組み"><a href="#このサイトの仕組み" class="headerlink" title="このサイトの仕組み"></a>このサイトの仕組み</h2><p>何度か書いていますが、このサイトは <a href="https://hexo.io/" target="_blank" rel="noopener">Hexo</a> を利用して作られています。<br>Hexo とは、静的サイトジェネレーターで、<br>記事やテーマ、プラグインなどをもとに、静的なサイトを自動生成するものです。</p><p>その生成されたサイトが、<a href="https://github.com/shundroid/asterisks" target="_blank" rel="noopener">Github のレポジトリ</a>に送られ、<br>それが <a href="https://www.netlify.com/" target="_blank" rel="noopener">Netlify</a> によってホスティングされています。</p><p><a href="https://github.com/" target="_blank" rel="noopener">Github</a> のレポジトリを直接ホストする、<a href="https://pages.github.com/" target="_blank" rel="noopener">Github Pages</a> もありますが、<br>Netlify はよりパフォーマンスが良く、リポジトリをそのまま使えるので、使用しています。</p><p>Hexo による生成の処理は、ローカルで行っています。</p><p>Netlify の CI で自動生成もできるらしいのですが、タイムアウトがあるらしく、<br>15分以内にビルド＆デプロイできないと、強制停止されてしまうそうです。</p><iframe class="hatenablogcard" style="width: 100%; height: 155px; max-width: 680px;" src="https://hatenablog-parts.com/embed?url=https://photo-tea.com/p/17/netlify-github-pages-hexo/" width="300" height="150" frameborder="0" scrolling="no"></iframe><p>そのため、シンプルにローカルで生成するようにしました。</p><p>サイト全体のバージョン管理には、<br><a href="https://asterisks.netlify.com/2016/02/16/git-private-bitbucket/">無料で非公開リポジトリが作成できる</a> <a href="https://www.google.co.jp/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=1&amp;cad=rja&amp;uact=8&amp;ved=0ahUKEwjutOqO7brYAhVJhbwKHc-6DqMQFgg5MAA&amp;url=https%3A%2F%2Fbitbucket.org%2F&amp;usg=AOvVaw1dx8LgKM4mYI8whQ_0OU-L" target="_blank" rel="noopener">Bitbucket</a> を使用しています。</p><p>また、Github、Netlify、Hexo など、すべて無料で使用しています。<br>これがオープンソースの力よ！浮いたお金でいつかは独自ドメインとるぞ！</p><h2 id="今後"><a href="#今後" class="headerlink" title="今後"></a>今後</h2><p>自分でプラグインやテーマなどを作れるので、<br>どんどんカスタマイズして、自分らしいブログを作っていきたいです！</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;こんにちは。shundroid です。&lt;br&gt;あけましておめでとうございます。今年もよろしくお願いします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://farm5.staticflickr.com/4598/38755022294_89ab7bb022_o_d.png
      
    
    </summary>
    
      <category term="diary" scheme="http://asterisks.netlify.com/categories/diary/"/>
    
    
      <category term="hexo" scheme="http://asterisks.netlify.com/tags/hexo/"/>
    
      <category term="javascript" scheme="http://asterisks.netlify.com/tags/javascript/"/>
    
      <category term="wordpress" scheme="http://asterisks.netlify.com/tags/wordpress/"/>
    
  </entry>
  
  <entry>
    <title>【Spacechem-tips】Sync-2 交互に実行</title>
    <link href="http://asterisks.netlify.com/2017/12/31/spacechem-sync-2/"/>
    <id>http://asterisks.netlify.com/2017/12/31/spacechem-sync-2/</id>
    <published>2017-12-31T14:38:29.000Z</published>
    <updated>2021-05-06T02:40:20.688Z</updated>
    
    <content type="html"><![CDATA[<p>こんにちは。</p><iframe class="hatenablogcard" style="width: 100%; height: 155px; max-width: 680px;" src="https://hatenablog-parts.com/embed?url=https://asterisks.netlify.com/2017/12/31/spacechem-points/" width="300" height="150" frameborder="0" scrolling="no"></iframe><p>Spacechem の解法、Sync の２つ目です。</p><p>今回は Sync コマンドの応用の使用法の１つである、</p><p><strong>交互に実行</strong></p><p>について説明しようと思います。</p><p>具体的には、</p><p>１つのウォルドの処理が終わったら、もう１つのウォルドの処理を行う</p><p>というのを繰り返すことです。</p><h2 id="例-ヘーパイストスIV-KOHCTPYKTOP"><a href="#例-ヘーパイストスIV-KOHCTPYKTOP" class="headerlink" title="例: ヘーパイストスIV KOHCTPYKTOP"></a>例: ヘーパイストスIV KOHCTPYKTOP</h2><p>例として、ヘーパイストスIV のサイドストーリー、<br>KOHCTPYKTOP を見てみましょう。</p><p><img src="https://farm5.staticflickr.com/4647/39401220871_085e944a50_o.gif" alt="spacechem-sync-alternate"><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script></p><p>ヒ素とホウ素を、１つずつ交互に ψ に出力しています。</p><p>これも Sync コマンドを使って実装しています。</p><p>どのように実装しているのか見てみましょう。</p><p><img src="https://farm5.staticflickr.com/4680/27623938539_1832c5d166.jpg" alt="spacechem-sync-alternate-description"><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script></p><p>Sync コマンド２つが使われていますね。<br>これは前回、<a href="http://polaris-bear.lolipop.jp/shunroom/798" target="_blank" rel="noopener">「待機」としての「同期」</a>で説明したのと同じ方法で、<br><strong>片方の処理が終わるのを待機している</strong>、という意味です。</p><p><strong>注目すべきは Start ブロックの位置</strong>です。<br>赤のほうは Sync に挟まれて、<br>青のほうは Sync の手前にあります。</p><p>ここからわかるように、<strong>青のほうは赤の処理がすべて終わるのをまず待機していて、<br>その後、赤のほうは青の処理がすべて終わるのを待機している</strong>のです。</p><p>このようにすることで、交互に実行することができています。</p><h2 id="使い道"><a href="#使い道" class="headerlink" title="使い道"></a>使い道</h2><p>１つの物質を２つの反応装置へ分岐させたり、<br>あるいは２つの物質を１つの反応装置へ集めたりするときに使えます。</p><p>しかし、この方法は、後に出てくる Flip Flop で、<br>必要なくなってしまいます。<br>わざわざ２つのウォルドを使わなくても、１つのウォルドで交互に処理ができるようになるのです。</p><p>Flip Flop が使えるのはアトロポス基地以降なので、<br>それまではかなり使えて便利な解法パターンです。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;こんにちは。&lt;/p&gt;
&lt;iframe class=&quot;hatenablogcard&quot; style=&quot;width: 100%; height: 155px; max-width: 680px;&quot; src=&quot;https://hatenablog-parts.com/embed?u
      
    
    </summary>
    
      <category term="SERIES" scheme="http://asterisks.netlify.com/categories/SERIES/"/>
    
      <category term="Spacechem-Tips" scheme="http://asterisks.netlify.com/categories/SERIES/Spacechem-Tips/"/>
    
      <category term="Game" scheme="http://asterisks.netlify.com/categories/SERIES/Spacechem-Tips/Game/"/>
    
    
      <category term="steam" scheme="http://asterisks.netlify.com/tags/steam/"/>
    
      <category term="game" scheme="http://asterisks.netlify.com/tags/game/"/>
    
      <category term="spacechem" scheme="http://asterisks.netlify.com/tags/spacechem/"/>
    
  </entry>
  
  <entry>
    <title>【Spacechem-tips】Sync-1 「待機」としての「同期」</title>
    <link href="http://asterisks.netlify.com/2017/12/31/spacechem-sync-1/"/>
    <id>http://asterisks.netlify.com/2017/12/31/spacechem-sync-1/</id>
    <published>2017-12-31T14:09:23.000Z</published>
    <updated>2021-05-06T02:40:20.688Z</updated>
    
    <content type="html"><![CDATA[<p>こんにちは。</p><iframe class="hatenablogcard" style="width: 100%; height: 155px; max-width: 680px;" src="https://hatenablog-parts.com/embed?url=https://asterisks.netlify.com/2017/12/31/spacechem-points/" width="300" height="150" frameborder="0" scrolling="no"></iframe><p>Spacechem の解法、Sync の１つ目です。</p><p>今回は Sync コマンドの使い道の１つである、</p><p><strong>「待機」としての「同期」</strong></p><p>について説明したいと思います。</p><h2 id="Sync-の基本の使い方"><a href="#Sync-の基本の使い方" class="headerlink" title="Sync の基本の使い方"></a>Sync の基本の使い方</h2><p>その前に、まずは Sync の基本的な使い方を説明します。</p><p>Sync は、基本的に</p><p><strong>２つのウォルドのタイミングを合わせる</strong></p><p>ために使います。</p><p>例として、アルコノストの１ステージ目「検出の基本」を見てみましょう。</p><p><img src="https://farm5.staticflickr.com/4594/38692049194_d773d64f8c_o.gif" alt="spacechem-basic-of-sensing"><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script></p><p>このように、２つのウォルドが、自転車のペダルのように、<br>ぐるぐると回っていますね。</p><p><img src="https://farm5.staticflickr.com/4687/38692953324_2ca95715b4.jpg" alt="sync-description"><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script></p><p><strong>２つのウォルドのタイミングを合わせることで、原子同士の衝突を防いでいるのです。</strong></p><p>２つのウォルドで操作すると、<br>速度は２倍になりますから、<br>クリアに必要なサイクル数は２分の１と、減らすことができます。</p><p>もちろん、タイミングを合わせるのは、結合時など、<br>これ以外の使い方もできます。</p><h2 id="「待機」としての「同期」"><a href="#「待機」としての「同期」" class="headerlink" title="「待機」としての「同期」"></a>「待機」としての「同期」</h2><p>それでは、本題に移りましょう。<br>Sync コマンドは、<strong>「待機」としての使い方もできる</strong>のです。</p><p>例として、ダノプスのサイドストーリー、実験：その場で入れ替えを見てみましょう。</p><p><img src="https://farm5.staticflickr.com/4739/38692952924_fe26964343_o.gif" alt="sync-wait"><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script></p><p>いくつか Sync コマンドがありますが、下の Sync コマンドに注目してください。</p><p><img src="https://farm5.staticflickr.com/4733/27623557119_b0619281b9.jpg" alt="sync-wait-description"><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script></p><p>１ウォルドに２つずつ、Sync コマンドがありますね。<br>赤のウォルドが結合装置の手前に来た時に Sync して、<br>その後もう一度 Sync しています。<br>最初の Sync で、青のウォルドは結合の除去を開始していますね。<br>除去が終わったら再び Sync して、赤のウォルドを動かし始めます。</p><p>このように、Sync コマンドには、</p><p><strong>片方の処理が終わるまで待機する</strong></p><p>という使い方ができます。<br>このような場合、片方の処理を開始するため、<br><strong>通常２つ Sync をセットにして使うことが多い</strong>です。</p><p>この考え方は、ゲームの最後の最後まで使うことができるので、とても便利です。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;こんにちは。&lt;/p&gt;
&lt;iframe class=&quot;hatenablogcard&quot; style=&quot;width: 100%; height: 155px; max-width: 680px;&quot; src=&quot;https://hatenablog-parts.com/embed?u
      
    
    </summary>
    
      <category term="SERIES" scheme="http://asterisks.netlify.com/categories/SERIES/"/>
    
      <category term="Spacechem-Tips" scheme="http://asterisks.netlify.com/categories/SERIES/Spacechem-Tips/"/>
    
      <category term="Game" scheme="http://asterisks.netlify.com/categories/SERIES/Spacechem-Tips/Game/"/>
    
    
      <category term="steam" scheme="http://asterisks.netlify.com/tags/steam/"/>
    
      <category term="game" scheme="http://asterisks.netlify.com/tags/game/"/>
    
      <category term="spacechem" scheme="http://asterisks.netlify.com/tags/spacechem/"/>
    
  </entry>
  
</feed>
