<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Posts on Hello</title>
        <link>https://maekawatoshiki.github.io/posts/</link>
        <description>Recent content in Posts on Hello</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>ja-jp</language>
        <copyright>&lt;a href=&#34;https://creativecommons.org/licenses/by-nc/4.0/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;CC BY-NC 4.0&lt;/a&gt;</copyright>
        <lastBuildDate>Fri, 26 Dec 2025 10:44:29 +0900</lastBuildDate>
        <atom:link href="https://maekawatoshiki.github.io/posts/index.xml" rel="self" type="application/rss+xml" />
        
        <item>
            <title>2025</title>
            <link>https://maekawatoshiki.github.io/posts/2025/</link>
            <pubDate>Fri, 26 Dec 2025 10:44:29 +0900</pubDate>
            
            <guid>https://maekawatoshiki.github.io/posts/2025/</guid>
            <description>去年 掲げていた「来年の目標」 健康でいる
あまり良くなかった。
今はまぁまぁ。
研究の最終ゴールを定める
右往左往しつつ、一ヶ所に落ち着いたと思っている。
なにかしらの尺度で、自立する
ダメだね。
今年 明日は横浜行こうかなぁ
&amp;mdash; uint256_t (@uint256_t) January 24, 2025 横浜の技書博へ行った。
分岐予測むずかしすぎませんか
&amp;mdash; uint256_t (@uint256_t) February 10, 2025 分岐予測に苦戦。
そもそも現代のプロセッサをよくわかっていなかった。
AsiaLLVM に来ています pic.twitter.com/tdN3MniUoA
&amp;mdash; uint256_t (@uint256_t) June 9, 2025 AsiaLLVM に参加した。
最近会っていなかった人と話せて良かった。
念願の、Chris Lattner とのツーショットも撮れた。
Championship Branch Prediction 2025 で 1st place でした pic.twitter.com/jMOe6j7IK9
&amp;mdash; uint256_t (@uint256_t) June 21, 2025 私たちの分岐予測器が、性能を競うコンペティションで優勝（まさしく state of the art）した。
素晴らしいメンバーに恵まれたと思う。
論文: RUNLTS: Register-value-aware Predictor Utilizing Nested Large TableS</description>
            <content type="html"><![CDATA[<h1 id="去年httpsmaekawatoshikigithubioposts2024-掲げていた来年の目標"><a href="https://maekawatoshiki.github.io/posts/2024/">去年</a> 掲げていた「来年の目標」</h1>
<blockquote>
<p>健康でいる</p>
</blockquote>
<p>あまり良くなかった。<br>
今はまぁまぁ。</p>
<blockquote>
<p>研究の最終ゴールを定める</p>
</blockquote>
<p>右往左往しつつ、一ヶ所に落ち着いたと思っている。</p>
<blockquote>
<p>なにかしらの尺度で、自立する</p>
</blockquote>
<p>ダメだね。</p>
<h1 id="今年">今年</h1>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">明日は横浜行こうかなぁ</p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1882753976975917466?ref_src=twsrc%5Etfw">January 24, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>横浜の技書博へ行った。</p>
<hr>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">分岐予測むずかしすぎませんか</p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1888872862641262640?ref_src=twsrc%5Etfw">February 10, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>分岐予測に苦戦。<br>
そもそも現代のプロセッサをよくわかっていなかった。</p>
<hr>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">AsiaLLVM に来ています <a href="https://t.co/tdN3MniUoA">pic.twitter.com/tdN3MniUoA</a></p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1932222112904991204?ref_src=twsrc%5Etfw">June 9, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>AsiaLLVM に参加した。<br>
最近会っていなかった人と話せて良かった。</p>
<p>念願の、Chris Lattner とのツーショットも撮れた。</p>
<hr>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Championship Branch Prediction 2025 で 1st place でした <a href="https://t.co/jMOe6j7IK9">pic.twitter.com/jMOe6j7IK9</a></p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1936276666902544417?ref_src=twsrc%5Etfw">June 21, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>私たちの分岐予測器が、性能を競うコンペティションで優勝（まさしく state of the art）した。<br>
素晴らしいメンバーに恵まれたと思う。</p>
<p>論文: <a href="https://ericrotenberg.wordpress.ncsu.edu/files/2025/06/cbp2025-final44-Koizumi.pdf">RUNLTS: Register-value-aware Predictor Utilizing Nested Large TableS</a></p>
<hr>
<p>このあたりで仕事をすべてやめて、研究に専念し始めた。</p>
<hr>
<blockquote class="twitter-tweet"><p lang="zxx" dir="ltr"><a href="https://t.co/gbem29OHAi">pic.twitter.com/gbem29OHAi</a></p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1951891969917022649?ref_src=twsrc%5Etfw">August 3, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>研究会で高松へ行った。</p>
<hr>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">情報処理学会の山下記念研究賞を受賞しました.<a href="https://t.co/YD5op6DRT5">https://t.co/YD5op6DRT5</a></p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1962794235008307600?ref_src=twsrc%5Etfw">September 2, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<p><a href="https://www.ipsj.or.jp/award/yamasita2025-detail.html">情報処理学会の山下記念研究賞</a>を受賞した。</p>
<hr>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">こんなに大きな会議で話したのは初めてでした. <a href="https://t.co/zFUXGcBgfI">pic.twitter.com/zFUXGcBgfI</a></p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1981937493202350365?ref_src=twsrc%5Etfw">October 25, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>58th IEEE/ACM International Symposium on Microarchitecture (MICRO) の<a href="https://sarchlab.org/cams25">ワークショップ (CAMS25)</a>に参加した。</p>
<h1 id="今年の所感">今年の所感</h1>
<ul>
<li>論文を書くときに，トップダウンで考えることを意識できた
<ul>
<li>去年よりは構成が上手になったと思っている</li>
</ul>
</li>
<li>分岐予測器に詳しくなった
<ul>
<li>久しぶりに酷いコードを読む能力を使った気がする</li>
</ul>
</li>
<li>かなりいろんな場所へ行けて楽しかった
<ul>
<li>日本各地だけでなく韓国にも行った</li>
</ul>
</li>
</ul>
<h1 id="来年の目標">来年の目標</h1>
<ul>
<li>健康でいる</li>
<li>自立する</li>
<li>自分の手で、ものを作る</li>
</ul>
]]></content>
        </item>
        
        <item>
            <title>色々なツールを研究で使う際のtips</title>
            <link>https://maekawatoshiki.github.io/posts/research-tool-tips/</link>
            <pubDate>Sat, 22 Nov 2025 15:33:00 +0900</pubDate>
            
            <guid>https://maekawatoshiki.github.io/posts/research-tool-tips/</guid>
            <description>これは，名工大 Advent Calendar 2025 - 11日目の記事です．
世の中には、ソフトウェア・エンジニアリングを行う上で役立つツール（ツールと言わないものも含む）が様々あります。
この文書では、それらのツールを研究で使う際のTipsを紹介します。
きっと、研究に関係なく役立つ内容も多いかと思います。
シェルスクリプトの書き方 要約: スタイルガイドに従うこと、及び shellcheck を常用することを推奨します。
スタイルガイドに従う 誤読のなく、ポータブルなシェルスクリプトを書くためには、 Googler によるシェルスクリプトのスタイルガイドは 必読だと思います。
以下に、私が重要だと思った部分をスタイルガイドから抜粋します。 スタイルガイドにない項目もあるかも。
シェルとして bash を使う Shebang は #!/bin/bash で始めましょう。
スタイルガイドはこう述べています。
&amp;hellip; In particular, this means there is generally no need to strive for POSIX-compatibility or otherwise avoid “bashisms”.
POSIX 準拠を目指すとかなり書きづらくなるのは想像がつきます。 Bash は実質すべてのマシンで使えますから、このあたりが妥協点なのでしょう。
set -euxo pipefail オプションを使う Shebang の次の行に set -euxo pipefail と書きましょう。
set はシェルのビルトインコマンドであり、シェルのオプションを変更することができます。 オプションとは -euxo pipefail （-e -u -x -o pipefail と同じ意味）の部分を指しますが、それぞれの意味は以下の通りです。 以下の説明は荒いので、詳細は 4.</description>
            <content type="html"><![CDATA[<p><strong>これは，<a href="https://qiita.com/advent-calendar/2025/nitech">名工大 Advent Calendar 2025</a> - 11日目の記事です．</strong></p>
<hr>
<p>世の中には、ソフトウェア・エンジニアリングを行う上で役立つツール<small>（ツールと言わないものも含む）</small>が様々あります。</p>
<p>この文書では、それらのツールを研究で使う際のTipsを紹介します。</p>
<p>きっと、研究に関係なく役立つ内容も多いかと思います。</p>
<!-- 特に、一般的な使い方とは異なる、研究活動ならではの使い方に焦点を当てます。 -->
<h2 id="シェルスクリプトの書き方">シェルスクリプトの書き方</h2>
<p>要約: スタイルガイドに従うこと、及び shellcheck を常用することを推奨します。</p>
<h3 id="スタイルガイドに従う">スタイルガイドに従う</h3>
<p>誤読のなく、ポータブルなシェルスクリプトを書くためには、
<a href="https://google.github.io/styleguide/shellguide.html">Googler によるシェルスクリプトのスタイルガイド</a>は
必読だと思います。</p>
<p>以下に、私が重要だと思った部分をスタイルガイドから抜粋します。
<small>スタイルガイドにない項目もあるかも</small>。</p>
<h3 id="シェルとして-bash-を使う">シェルとして <code>bash</code> を使う</h3>
<p>Shebang は <code>#!/bin/bash</code> で始めましょう。</p>
<p>スタイルガイドはこう述べています。</p>
<blockquote>
<p>&hellip; In particular, this means there is generally no need to strive for POSIX-compatibility or otherwise avoid “bashisms”.</p>
</blockquote>
<p>POSIX 準拠を目指すとかなり書きづらくなるのは想像がつきます。
Bash は実質すべてのマシンで使えますから、このあたりが妥協点なのでしょう。</p>
<h3 id="set--euxo-pipefail-オプションを使う"><code>set -euxo pipefail</code> オプションを使う</h3>
<p>Shebang の次の行に <code>set -euxo pipefail</code> と書きましょう。</p>
<p><code>set</code> はシェルのビルトインコマンドであり、シェルのオプションを変更することができます。
オプションとは <code>-euxo pipefail</code> （<code>-e -u -x -o pipefail</code> と同じ意味）の部分を指しますが、それぞれの意味は以下の通りです。
以下の説明は荒いので、詳細は <a href="https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html">4.3.1 The Set Builtin</a> を参照してください。</p>
<ul>
<li><code>-e</code>: コマンド実行が失敗した場合にスクリプトを直ちに終了する</li>
<li><code>-u</code>: 未定義の変数を参照した場合にエラーにする</li>
<li><code>-x</code>: 実行する寸前のコマンドを標準エラーに出力する</li>
<li><code>-o pipefail</code>: パイプで繋いだコマンド群のうち、どれか一つでも失敗した場合に全体を失敗とする</li>
</ul>
<blockquote>
<p>注意：Shebang を <code>#!/bin/bash -euxo pipefail</code> とするのは、意図した動作とならないため避けましょう。</p>
<p>そのように記述すると、例えば
<a href="https://github.com/torvalds/linux/blob/b236920731dd90c3fba8c227aa0c4dee5351a639/fs/binfmt_script.c#L81-L85">Linux カーネルでは <code>/bin/bash</code> に一つの引数（<code>-euxo</code>）しか渡されず</a>、
<code>pipefail</code> は無視されてしまいます。</p>
</blockquote>
<h3 id="変数は-var-記法で展開する">変数は <code>${var}</code> 記法で展開する</h3>
<p>変数展開は <code>$var</code> ではなく <code>${var}</code> としましょう。<br>
ブレース <code>{</code> <code>}</code> で境界を明示すると読みやすく、変数名の終わりが明確になります。</p>
<p>（単文字の特殊変数 <em><code>$?</code> や <code>$#</code> など</em> は例外です）</p>
<h4 id="変数名と後続の文字列を明確に区別できる">変数名と後続の文字列を明確に区別できる</h4>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># ブレースなしだとエラー</span>
</span></span><span style="display:flex;"><span>prefix<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;test&#34;</span>
</span></span><span style="display:flex;"><span>echo <span style="color:#e6db74">&#34;</span>$prefix_file<span style="color:#e6db74">&#34;</span>  <span style="color:#75715e"># $prefix_file という変数を参照しようとしてエラー</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># ブレースありで正しく動作</span>
</span></span><span style="display:flex;"><span>echo <span style="color:#e6db74">&#34;</span><span style="color:#e6db74">${</span>prefix<span style="color:#e6db74">}</span><span style="color:#e6db74">_file&#34;</span>  <span style="color:#75715e"># test_file</span>
</span></span></code></pre></div><h4 id="デフォルト値の設定や未定義変数の検出にも使える">デフォルト値の設定や未定義変数の検出にも使える</h4>
<p>このほかにも、ブレース記法は文字列操作など色々な用途で使えます。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># 変数が未定義の場合にデフォルト値を設定</span>
</span></span><span style="display:flex;"><span>echo <span style="color:#e6db74">&#34;</span><span style="color:#e6db74">${</span>var<span style="color:#66d9ef">:-</span>default_value<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>  <span style="color:#75715e"># var が未定義なら default_value を出力</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 変数が未定義の場合にエラーにする</span>
</span></span><span style="display:flex;"><span>echo <span style="color:#e6db74">&#34;</span><span style="color:#e6db74">${</span>var:?var is not defined<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>  <span style="color:#75715e"># var が未定義なら `var is not defined` と出力</span>
</span></span></code></pre></div><h3 id="shellcheck-を使う"><code>shellcheck</code> を使う</h3>
<p>シェルスクリプトを書いたら、とりあえず <code>shellcheck</code> コマンドに通しましょう。</p>
<p><code>shellcheck</code> はシェルスクリプトの静的解析ツールであり、上記のスタイルガイドに反する箇所や潜在的なバグを指摘してくれます。<br>
スクリプト実行前の安全装置として有用です。</p>
<p>最近のエディタは LSP 経由で <code>shellcheck</code> と連携できることが多いので、設定しておきましょう。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>$ cat a.sh
</span></span><span style="display:flex;"><span><span style="color:#75715e">#/bin/bash</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>echo <span style="color:#e6db74">&#34;</span>$var<span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>$ shellcheck a.sh
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>In a.sh line 1:
</span></span><span style="display:flex;"><span><span style="color:#75715e">#/bin/bash</span>
</span></span><span style="display:flex;"><span> ^-- SC1113 <span style="color:#f92672">(</span>error<span style="color:#f92672">)</span>: Use <span style="color:#75715e">#!, not just #, for the shebang.</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>In a.sh line 3:
</span></span><span style="display:flex;"><span>echo <span style="color:#e6db74">&#34;</span>$var<span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>      ^--^ SC2154 <span style="color:#f92672">(</span>warning<span style="color:#f92672">)</span>: var is referenced but not assigned.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>For more information:
</span></span><span style="display:flex;"><span>  https://www.shellcheck.net/wiki/SC1113 -- Use <span style="color:#75715e">#!, not just #, for the sheba...</span>
</span></span><span style="display:flex;"><span>  https://www.shellcheck.net/wiki/SC2154 -- var is referenced but not assigned.
</span></span></code></pre></div><h3 id="最後に長い処理を書くなら他の言語を検討する">最後に：長い処理を書くなら他の言語を検討する</h3>
<p>シェルスクリプトは便利ですが、複雑で長い処理を書くには向いていません。</p>
<p>以下のどれかに当てはまる場合は Python / Perl / Ruby / ECMAScript などの言語を使いましょう。</p>
<ul>
<li>100行を超える</li>
<li>制御フローが単純でない</li>
<li>単なるラッパー以上のことをする</li>
<li>パフォーマンスが重要</li>
<li>今後も保守する可能性がある</li>
</ul>
<h2 id="git-の扱い方">git の扱い方</h2>
<h3 id="git-の操作に自信がない場合は-gui-で操作しよう">git の操作に自信がない場合は GUI で操作しよう</h3>
<p>私は普段コマンドラインから git を操作していますが、わざわざそうする理由は特にありません。</p>
<p>エディタに Visual Studio Code などを使っている方は、付属の git 操作機能を積極的に使うのが良いでしょう。
きっと良いプラグインもあるでしょうし。</p>
<p><strong>これ以降は、CLI で git を操作する際の tips を紹介します。</strong></p>
<h3 id="何かがおかしいと思ったら-git-status---ignored">何かがおかしいと思ったら <code>git status --ignored</code></h3>
<p>ビルドが上手くいかないなど、リポジトリの状態に違和感を覚えた時は <code>git status --ignored</code> を確認してみましょう。</p>
<p>通常の <code>git status</code> は（<code>.gitignore</code> により）無視されているファイルを表示しませんが、
<code>--ignored</code> オプションを付けると無視されているファイルも表示されます。</p>
<p>気付かぬうちに生成物や実験結果などがコミット対象になっていることはよくあります。<br>
そういった際は、まず落ち着いて、リポジトリがクリーンな状態かを確認しましょう。</p>
<h3 id="過去の変更を追うなら-git-blame--c--m">過去の変更を追うなら <code>git blame -C -M</code></h3>
<p>ある行の変更履歴を、移動やコピーも含めて追う場合は <code>git blame -C -M &lt;file&gt;</code> が便利です。</p>
<p>リファクタリングを繰り返したリポジトリであっても、ある行の起源を辿ることが容易になります。</p>
<p>それぞれのオプションの意味は以下の通りです。</p>
<ul>
<li><code>-M</code>: 同じファイル内での行の移動・コピーを追跡する</li>
<li><code>-C</code>: 別ファイルからの移動・コピーを追跡する</li>
</ul>
<h3 id="マージは-non-fast-forward-で行う">マージは non fast-forward で行う</h3>
<p>ブランチのマージは non fast-forward で行うことをおすすめします。<br>
<code>git merge --no-ff</code> でマージするか、グローバル設定を変更（<code>git config --global merge.ff false</code>）しておきましょう。</p>
<p>Non fast-forward マージはマージコミットを作成するため、マージが行われたことを明示的に履歴へ残すことができます。<br>
また、これによりマージ単位のrevertが容易になります。</p>
<h3 id="複数ブランチを同時に扱うなら-git-worktree">複数ブランチを同時に扱うなら <code>git worktree</code></h3>
<p>複数ブランチ間を頻繁に行き来したり、同時に複数のブランチを触りたい場合は <code>git worktree</code> を使いましょう。<br>
一つのリポジトリについて複数の作業ツリーを同時に扱うことができます。</p>
<p>似たことは複数回の <code>git clone</code> &amp; <code>git switch</code> でも実現できますが、<code>git worktree</code> は以下の点で優れています。</p>
<ul>
<li>リポジトリの実体は一つだけ
<ul>
<li>親となるディレクトリにしか <code>.git</code> が存在しないため、作業ツリーを増やしてもあまり容量を食いません</li>
<li><code>git fetch/remote/gc</code> といった操作を一度行えば、すべての作業ツリーに反映されます</li>
</ul>
</li>
<li>一つのブランチは一つの作業ツリーにしかチェックアウトできない
<ul>
<li>特定ブランチが複数のディレクトリでチェックアウトされることはないため、誤った編集を防げます</li>
</ul>
</li>
</ul>
<h3 id="git-stash-を避ける"><code>git stash</code> を避ける</h3>
<p><code>git stash</code> は気軽に使える反面、「stash したまま忘れる」ことがあるので避けた方がよいです。
メッセージを付けたとしても、大抵役に立ちません（主観）。</p>
<p>別の作業をしたいときは <code>git worktree</code> を使うか、素直に（ブランチを切って）Work in progressとしてコミットしましょう。<br>
コミットしておけば、簡単に remote へプッシュすることもできます<small>（後から force push で取り消す必要が生じますが）</small>。</p>
<h3 id="git-add--pu-でファイルをステージングする"><code>git add -pu</code> でファイルをステージングする</h3>
<p>誤った変更をコミットしないために、<code>git add -pu</code> を使って対話的に変更をステージングしましょう。</p>
<p>各オプションの意味は以下の通りです。</p>
<ul>
<li><code>-p</code> (<code>--patch</code>): 変更を一ブロック（hunk）ずつ確認しながらステージングする</li>
<li><code>-u</code> (<code>--update</code>): 追跡されているファイルのみ対象にする</li>
</ul>
<p>これらのオプションを使うことで、ファイルに複数種類の変更が混じっていても（リファクタとバグ修正など）、
意味のある粒度でコミットを分けることができます。</p>
<h3 id="最後にとりあえずコミットプッシュしておこう">最後に：とりあえずコミット・プッシュしておこう</h3>
<p>昼食前、帰宅前など、一区切りついたタイミングでとりあえず変更をコミット・プッシュしておきましょう。<br>
前日までの進捗を明示的にまとめられますし、バックアップにもなります。</p>
<p>最終的には適切な粒度でコミットし直すことをお忘れなく。</p>
<!-- ### `--ours` / `--theirs` -->
]]></content>
        </item>
        
        <item>
            <title>2024</title>
            <link>https://maekawatoshiki.github.io/posts/2024/</link>
            <pubDate>Sat, 28 Dec 2024 22:59:42 +0900</pubDate>
            
            <guid>https://maekawatoshiki.github.io/posts/2024/</guid>
            <description>去年 掲げていた「来年の目標」 大学をなんとか卒業する
卒業できた
「決断」を下せるようになる
微妙。多少は決断できるようになったかもしれないが、結局時間が解決してくれた場合が多い。
将来何をしたいのかを考えるために、より多くの人と関わる
学会等で様々な人と話すことができた
今年 地震かな でか
&amp;mdash; uint256_t (@uint256_t) January 1, 2024 つらかった どうにか走り切らないといけない https://t.co/SuyPopM0xH
&amp;mdash; uint256_t (@uint256_t) January 5, 2024 今年はずっとパイプラインとにらめっこしていた きれい pic.twitter.com/qYyOO9gLKi
&amp;mdash; uint256_t (@uint256_t) January 31, 2024 卒業できたらしい 卒論発表 おわり
ありがとうございました
&amp;mdash; uint256_t (@uint256_t) February 15, 2024 👏 卒業できた pic.twitter.com/1N01QSNGAZ
&amp;mdash; uint256_t (@uint256_t) March 26, 2024 SWoPP 2024 へ行った 来週は SWoPP に参加します.
&amp;mdash; uint256_t (@uint256_t) August 3, 2024 徳島 pic.twitter.com/0u8efprDjk
&amp;mdash; uint256_t (@uint256_t) August 6, 2024 以前の研究会での賞をもらった ARC 研究会 の 若手奨励賞 を頂きました。 pic.</description>
            <content type="html"><![CDATA[<h1 id="去年httpsmaekawatoshikigithubioposts2023-掲げていた来年の目標"><a href="https://maekawatoshiki.github.io/posts/2023/">去年</a> 掲げていた「来年の目標」</h1>
<blockquote>
<p>大学をなんとか卒業する</p>
</blockquote>
<p>卒業できた</p>
<blockquote>
<p>「決断」を下せるようになる</p>
</blockquote>
<p>微妙。多少は決断できるようになったかもしれないが、結局時間が解決してくれた場合が多い。</p>
<blockquote>
<p>将来何をしたいのかを考えるために、より多くの人と関わる</p>
</blockquote>
<p>学会等で様々な人と話すことができた</p>
<h1 id="今年">今年</h1>
<ul>
<li>地震かな
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">でか</p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1741719050538136019?ref_src=twsrc%5Etfw">January 1, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
<li>つらかった
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">どうにか走り切らないといけない <a href="https://t.co/SuyPopM0xH">https://t.co/SuyPopM0xH</a></p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1743292619722285385?ref_src=twsrc%5Etfw">January 5, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
<li>今年はずっとパイプラインとにらめっこしていた
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">きれい <a href="https://t.co/qYyOO9gLKi">pic.twitter.com/qYyOO9gLKi</a></p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1752721138118197759?ref_src=twsrc%5Etfw">January 31, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
<li>卒業できたらしい
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">卒論発表 おわり<br>ありがとうございました</p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1757943438564286947?ref_src=twsrc%5Etfw">February 15, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
<li>👏
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">卒業できた <a href="https://t.co/1N01QSNGAZ">pic.twitter.com/1N01QSNGAZ</a></p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1772473151873548290?ref_src=twsrc%5Etfw">March 26, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
<li>SWoPP 2024 へ行った
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">来週は SWoPP に参加します.</p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1819727514123821201?ref_src=twsrc%5Etfw">August 3, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
<li>徳島
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="zxx" dir="ltr"><a href="https://t.co/0u8efprDjk">pic.twitter.com/0u8efprDjk</a></p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1820717898043629608?ref_src=twsrc%5Etfw">August 6, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
<li>以前の研究会での賞をもらった
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ARC 研究会 の 若手奨励賞 を頂きました。 <a href="https://t.co/V9G995mf2f">pic.twitter.com/V9G995mf2f</a></p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1821495601462489116?ref_src=twsrc%5Etfw">August 8, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
<li>10 年ツイートしているらしい
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">10年 <a href="https://t.co/KlvNcR8VGk">pic.twitter.com/KlvNcR8VGk</a></p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1828475393206296847?ref_src=twsrc%5Etfw">August 27, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
<li>夏のプログラミング・シンポジウムに参加した
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">来た <a href="https://t.co/LBaejm4c9I">https://t.co/LBaejm4c9I</a></p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1837302373456433653?ref_src=twsrc%5Etfw">September 21, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
<li>沖縄での研究会に参加した
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">沖縄 ☀️</p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1868942739926401455?ref_src=twsrc%5Etfw">December 17, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
</ul>
<h1 id="今年の反省">今年の反省</h1>
<ul>
<li>論文・スライドに取りかかるときは、まずトップダウンの構成を考える
<ul>
<li>３点プロットをよく練る（塩谷先生のスライドを見直す）</li>
<li>逆茂木型のパラグラフを書かない</li>
</ul>
</li>
</ul>
<h1 id="来年の目標">来年の目標</h1>
<ul>
<li>健康でいる</li>
<li>研究の最終ゴールを定める</li>
<li>なにかしらの尺度で、自立する</li>
</ul>
]]></content>
        </item>
        
        <item>
            <title>Tabbyによるコーディング支援を試した</title>
            <link>https://maekawatoshiki.github.io/posts/tabby/</link>
            <pubDate>Fri, 15 Nov 2024 14:58:50 +0900</pubDate>
            
            <guid>https://maekawatoshiki.github.io/posts/tabby/</guid>
            <description>これは，名工大 Advent Calendar 2024 - 3日目の記事です．
長らくこのブログに書き込んでいませんでしたね．2024年が終わってしまいそうです．
はじめに 昨今，GitHub Copilot 等の高度なコーディング支援ツールが普及しつつあります． 私もサービス開始当初から使っていますが，非常に賢いコード補完機能として，もはや手放せないほど手に馴染んでいます．
さて，GitHub Copilot は（ほとんどの人にとって）有料ですから，毎月（毎年）一定の金額を支払う必要があります． 加えて，GitHub の判断によって，明日から使えなくなる可能性もあります． 手放せないツールが突然使えなくなっては困りますよね．
世の中には，似たようなサービスを自らセルフホスティングするためのプロジェクトが存在します． 本記事では，その中でも Tabby というプロジェクトを実際に試してみます．
Tabby とは 以下に，リポジトリから引用した説明を載せておきます． 要約すると，お手元の GPU と Tabby さえあれば，GitHub Copilot に代わるコーディング支援環境を構築できるわけです．
Tabby is a self-hosted AI coding assistant, offering an open-source and on-premises alternative to GitHub Copilot. It boasts several key features:
Self-contained, with no need for a DBMS or cloud service. OpenAPI interface, easy to integrate with existing infrastructure (e.</description>
            <content type="html"><![CDATA[<p><strong>これは，<a href="https://adventar.org/calendars/10625">名工大 Advent Calendar 2024</a> - 3日目の記事です．</strong></p>
<p>長らくこのブログに書き込んでいませんでしたね．2024年が終わってしまいそうです．</p>
<h1 id="はじめに">はじめに</h1>
<p>昨今，GitHub Copilot 等の高度なコーディング支援ツールが普及しつつあります．
私もサービス開始当初から使っていますが，非常に賢いコード補完機能として，もはや手放せないほど手に馴染んでいます．</p>
<p>さて，GitHub Copilot は（ほとんどの人にとって）有料ですから，毎月（毎年）一定の金額を支払う必要があります．
加えて，GitHub の判断によって，明日から使えなくなる可能性もあります．
手放せないツールが突然使えなくなっては困りますよね．</p>
<p>世の中には，似たようなサービスを自らセルフホスティングするためのプロジェクトが存在します．
本記事では，その中でも Tabby というプロジェクトを実際に試してみます．</p>
<h1 id="tabbyhttpsgithubcomtabbymltabby-とは"><a href="https://github.com/TabbyML/tabby">Tabby</a> とは</h1>
<p>以下に，リポジトリから引用した説明を載せておきます．
要約すると，お手元の GPU と Tabby さえあれば，GitHub Copilot に代わるコーディング支援環境を構築できるわけです．</p>
<blockquote>
<p>Tabby is a self-hosted AI coding assistant, offering an open-source and on-premises alternative to GitHub Copilot. It boasts several key features:</p>
<ul>
<li>Self-contained, with no need for a DBMS or cloud service.</li>
<li>OpenAPI interface, easy to integrate with existing infrastructure (e.g Cloud IDE).</li>
<li>Supports consumer-grade GPUs.</li>
</ul>
</blockquote>
<h1 id="環境構築">環境構築</h1>
<p><a href="https://tabby.tabbyml.com/docs/quick-start/installation/docker/">ドキュメント</a>によると，Docker イメージが提供されており，以下のコマンドで Tabby サーバーを起動できるようです．
Docker から GPU を使えるよう設定しておく必要があります．</p>
<p>利用できるモデルは<a href="https://tabby.tabbyml.com/docs/models/">こちらにリストされています</a>．
また，リストされていない <code>Qwen2.5-Coder-1.5B</code> 等も，どうやら利用可能のようです（リストが更新されていない？）．</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># 初回起動時は巨大なファイル（=LLM）をダウンロードする</span>
</span></span><span style="display:flex;"><span>docker run -it <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>  --gpus all -p 8080:8080 -v $HOME/.tabby:/data <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>  tabbyml/tabby <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>  serve --model StarCoder-1B --device cuda <span style="color:#75715e"># --chat-model &lt;いらないかな&gt;</span>
</span></span></code></pre></div><p>うまく行けば，以下のような出力を得られます．
<strong>表示されているURLへアクセスし，初期設定を行ってください（トークンを得られます）．</strong></p>
<pre tabindex="0"><code>Writing to new file.
🎯 Downloaded https://huggingface.co/ikw/Qwen2.5-Coder-1.5B-GGUF/resolve/main/qwen2.5-coder-1.5b-q8_0.gguf to /data/models/TabbyML/Qwen2.5-Coder-1.5B/ggml/model-00001-of-00001.gguf.tmp
   00:05:00 ▕████████████████████▏ 1.53 GiB/1.53 GiB  5.22 MiB/s  ETA 0s.            ✅ Checksum OK.


████████╗ █████╗ ██████╗ ██████╗ ██╗   ██╗
╚══██╔══╝██╔══██╗██╔══██╗██╔══██╗╚██╗ ██╔╝
   ██║   ███████║██████╔╝██████╔╝ ╚████╔╝
   ██║   ██╔══██║██╔══██╗██╔══██╗  ╚██╔╝
   ██║   ██║  ██║██████╔╝██████╔╝   ██║
   ╚═╝   ╚═╝  ╚═╝╚═════╝ ╚═════╝    ╚═╝

📄 Version 0.20.0
🚀 Listening at http://0.0.0.0:8080
</code></pre><h3 id="補足サーバー側の計算機環境">（補足）サーバー側の計算機環境</h3>
<table>
<thead>
<tr>
<th>対象</th>
<th>バージョン等</th>
</tr>
</thead>
<tbody>
<tr>
<td>OS</td>
<td>Ubuntu 24.04 LTS</td>
</tr>
<tr>
<td>CPU</td>
<td>Ryzen Threadripper 2990WX</td>
</tr>
<tr>
<td>GPU</td>
<td>NVIDIA RTX 2080Ti 11GB</td>
</tr>
<tr>
<td>RAM</td>
<td>128GB</td>
</tr>
<tr>
<td>Docker</td>
<td>27.2.1 (Server)</td>
</tr>
<tr>
<td>Tabby</td>
<td>0.20.0</td>
</tr>
</tbody>
</table>
<h1 id="neovim-から使う">Neovim から使う</h1>
<h2 id="インストール">インストール</h2>
<p>私は Neovim をエディタとして使っているため，<a href="https://tabby.tabbyml.com/docs/extensions/installation/vim/">ここに従って</a> Tabby のプラグインをインストールしました．
VSCode や IntelliJ からも使えるようです．</p>
<p>プラグインがインストールし終わったら，<a href="https://tabby.tabbyml.com/docs/extensions/configurations/"><code>~/.tabby-client/agent/config.toml</code> へサーバーの設定を追加します</a>．</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-toml" data-lang="toml"><span style="display:flex;"><span>[<span style="color:#a6e22e">server</span>]
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">endpoint</span> = <span style="color:#e6db74">&#34;http://localhost:8080&#34;</span> <span style="color:#75715e"># 適切に書き換える</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">token</span> = <span style="color:#e6db74">&#34;auth_...&#34;</span> <span style="color:#75715e"># 適切に書き換える</span>
</span></span></code></pre></div><h2 id="動作">動作</h2>
<p>実際にコード補完している様子はこんな感じです（カーソルから下の部分）↓</p>
<p>モデルには <code>Qwen2.5-Coder-1.5B</code> を使いましたが，
さすがに GitHub Copilot よりは性能が悪いなぁと感じました．
意図しない補完を提案する頻度が高いように思います．
とはいえ，小型のモデルらしく Copilot よりも高速に補完してくれます．</p>
<p>GPU に余裕がある場合は，もっと巨大なモデルを試しても良いでしょう．</p>
<p><img src="../assets/vim.png" alt="vim"></p>
<p>追記：Tabby を有効にしながらこの記事を書いてみましたが，
小さなモデルであっても Markdown をいい感じに補完してくれるので便利でした．</p>
<h1 id="まとめ">まとめ</h1>
<p>GitHub Copilot に代わるコーディング支援ツールとして，Tabby を試してみました．</p>
<p>モデルの性能や所持している GPU の性能によって補完能力がかなり変化するため，GitHub Copilot の代替品として使えるかは人によると思います．</p>
<p>ただし，個人的にはほとんどの場合で GitHub Copilot 並の仕事をしてくれそうだと感じました．
おそらく，私はこういったツールを単なる（けっこう賢い）補完機能としてしか使っておらず，
コードのロジックや設計は結局自分で考えているからだと思います．
普段 GitHub Copilot 側へそういった部分を委ねている場合は，ローカルで動作する LLM では性能的に物足りないでしょう．</p>
]]></content>
        </item>
        
        <item>
            <title>2023</title>
            <link>https://maekawatoshiki.github.io/posts/2023/</link>
            <pubDate>Sat, 30 Dec 2023 20:42:47 +0900</pubDate>
            
            <guid>https://maekawatoshiki.github.io/posts/2023/</guid>
            <description>去年 掲げていた「来年の目標」 多少は健康を意識する 意識していたつもりはないが、大きな病気はない。 大学へいけば必然的に~1万歩くらい歩くことになるし。
おそらく大学院に行くための試験があるので頑張る 推薦のおかげで試験を受けなくて済んだ。 それが本当に良かったのかはよくわからない。
研究というものと仲良くなる これは全くダメ。仲良くなれていない。
今年 9年ツイートしているらしい
Do you remember when you joined X? I do!
そうなんだ pic.twitter.com/pwjciaOBdg
&amp;mdash; uint256_t (@uint256_t) August 28, 2023 今年はチューターとしてセキュリティ・キャンプに参加しました
pic.twitter.com/prLTXTTrD9
&amp;mdash; uint256_t (@uint256_t) August 7, 2023 Python から GIL がなくなったら嬉しいよね
GILとも もうすぐさよならなのかしら
&amp;mdash; uint256_t (@uint256_t) July 30, 2023 薄いキーボードが苦手だということにようやく気づき、結局これはあんまり使ってない
持ち運べるやつが欲しかったので。 pic.twitter.com/Aby7Uc8PsE
&amp;mdash; uint256_t (@uint256_t) July 18, 2023 これって今年だったのか
https://t.co/uBdR998kBk
「プログラミング言語処理系が好きな人の集まり」は Slack から Zulip へ移行しました。
&amp;mdash; uint256_t (@uint256_t) June 30, 2023 この頃は SPEC CPU95 を触っていたのかな（今は 2006, 2017 も触っている）</description>
            <content type="html"><![CDATA[<h1 id="去年httpsmaekawatoshikigithubioposts2022-掲げていた来年の目標"><a href="https://maekawatoshiki.github.io/posts/2022/">去年</a> 掲げていた「来年の目標」</h1>
<blockquote>
<ul>
<li>多少は健康を意識する</li>
</ul>
</blockquote>
<p>意識していたつもりはないが、大きな病気はない。
大学へいけば必然的に~1万歩くらい歩くことになるし。</p>
<blockquote>
<ul>
<li>おそらく大学院に行くための試験があるので頑張る</li>
</ul>
</blockquote>
<p>推薦のおかげで試験を受けなくて済んだ。
それが本当に良かったのかはよくわからない。</p>
<blockquote>
<ul>
<li>研究というものと仲良くなる</li>
</ul>
</blockquote>
<p>これは全くダメ。仲良くなれていない。</p>
<h1 id="今年">今年</h1>
<ul>
<li>
<p>9年ツイートしているらしい</p>
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Do you remember when you joined X? I do!<br><br>そうなんだ <a href="https://t.co/pwjciaOBdg">pic.twitter.com/pwjciaOBdg</a></p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1695971297833205880?ref_src=twsrc%5Etfw">August 28, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
<li>
<p>今年はチューターとしてセキュリティ・キャンプに参加しました</p>
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="zxx" dir="ltr"><a href="https://t.co/prLTXTTrD9">pic.twitter.com/prLTXTTrD9</a></p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1688377823759855616?ref_src=twsrc%5Etfw">August 7, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
<li>
<p>Python から GIL がなくなったら嬉しいよね</p>
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">GILとも もうすぐさよならなのかしら</p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1685665376586313729?ref_src=twsrc%5Etfw">July 30, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
<li>
<p>薄いキーボードが苦手だということにようやく気づき、結局これはあんまり使ってない</p>
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">持ち運べるやつが欲しかったので。 <a href="https://t.co/Aby7Uc8PsE">pic.twitter.com/Aby7Uc8PsE</a></p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1681256010563059713?ref_src=twsrc%5Etfw">July 18, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
<li>
<p>これって今年だったのか</p>
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://t.co/uBdR998kBk">https://t.co/uBdR998kBk</a><br><br>「プログラミング言語処理系が好きな人の集まり」は Slack から Zulip へ移行しました。</p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1674807727275782144?ref_src=twsrc%5Etfw">June 30, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
<li>
<p>この頃は SPEC CPU95 を触っていたのかな（今は 2006, 2017 も触っている）</p>
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">はじめて SPEC ベンチマークを触った</p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1652618546969726976?ref_src=twsrc%5Etfw">April 30, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
<li>
<p>qemu はとても便利で、研究でいつも使っている</p>
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">qemu 便利だね</p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1697982149197169041?ref_src=twsrc%5Etfw">September 2, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
<li>
<p>いまもそう</p>
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">結局短いスクリプトはpythonで書くようになってしまった。</p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1695450101614018911?ref_src=twsrc%5Etfw">August 26, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
<li>
<p>年の初めはレポートを書いていたらしい</p>
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">書き終わった</p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1609214820993359872?ref_src=twsrc%5Etfw">December 31, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</li>
</ul>
</li>
</ul>
<h1 id="来年の目標">来年の目標</h1>
<ul>
<li>大学をなんとか卒業する</li>
<li>「決断」を下せるようになる</li>
<li>将来何をしたいのかを考えるために、より多くの人と関わる</li>
</ul>
]]></content>
        </item>
        
        <item>
            <title>2022年</title>
            <link>https://maekawatoshiki.github.io/posts/2022/</link>
            <pubDate>Sat, 31 Dec 2022 15:52:23 +0900</pubDate>
            
            <guid>https://maekawatoshiki.github.io/posts/2022/</guid>
            <description>1 月 海からスタート pic.twitter.com/6fkbYD0CER
&amp;mdash; uint256_t (@uint256_t) January 1, 2022 まだ vicis をいじってたのかな Module::try_from(&amp;quot;...llvm assembly...&amp;quot;)って書けるようになってかなり良い
&amp;mdash; uint256_t (@uint256_t) January 30, 2022 2 月 わかる TLを見ていると、CPUからハイパーバイザ、人工衛星あたりまで色々なものが生み出されていてなんかすごい。
&amp;mdash; uint256_t (@uint256_t) February 12, 2022 pull request その理由はGit誕生以前からある用語だからだったと思いますが、もはやGitHub以前の &amp;quot;pull request&amp;quot; という言葉のユースケースを探すことも困難になっているような…。 https://t.co/C6HvMcHw6f
&amp;mdash; FUJI Goro (@__gfx__) February 7, 2022 3 月 いつも同じことを考えている 勉強ってどうやってするんだろう。
&amp;mdash; uint256_t (@uint256_t) March 25, 2022 Asahi Linux お試し Tweet from Asahi Linux! pic.twitter.com/A1rw8iFkuK
&amp;mdash; uint256_t (@uint256_t) March 20, 2022 いつ見ても好き この画像好きhttps://t.</description>
            <content type="html"><![CDATA[<h1 id="1-月">1 月</h1>
<ul>
<li>海からスタート
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="zxx" dir="ltr"><a href="https://t.co/6fkbYD0CER">pic.twitter.com/6fkbYD0CER</a></p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1477188372099923968?ref_src=twsrc%5Etfw">January 1, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</li>
</ul>
</li>
<li>まだ vicis をいじってたのかな
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Module::try_from(&quot;...llvm assembly...&quot;)って書けるようになってかなり良い</p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1487805271812370433?ref_src=twsrc%5Etfw">January 30, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
</ul>
<h1 id="2-月">2 月</h1>
<ul>
<li>わかる
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">TLを見ていると、CPUからハイパーバイザ、人工衛星あたりまで色々なものが生み出されていてなんかすごい。</p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1492447163317506050?ref_src=twsrc%5Etfw">February 12, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
<li>pull request
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">その理由はGit誕生以前からある用語だからだったと思いますが、もはやGitHub以前の &quot;pull request&quot; という言葉のユースケースを探すことも困難になっているような…。 <a href="https://t.co/C6HvMcHw6f">https://t.co/C6HvMcHw6f</a></p>&mdash; FUJI Goro (@__gfx__) <a href="https://twitter.com/__gfx__/status/1490504763066429441?ref_src=twsrc%5Etfw">February 7, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
</ul>
<h1 id="3-月">3 月</h1>
<ul>
<li>いつも同じことを考えている
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">勉強ってどうやってするんだろう。</p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1507401919261646850?ref_src=twsrc%5Etfw">March 25, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</li>
</ul>
</li>
<li>Asahi Linux お試し
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Tweet from Asahi Linux! <a href="https://t.co/A1rw8iFkuK">pic.twitter.com/A1rw8iFkuK</a></p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1505581908071104513?ref_src=twsrc%5Etfw">March 20, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
<li>いつ見ても好き
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">この画像好き<a href="https://t.co/3DO24CmmeQ">https://t.co/3DO24CmmeQ</a> <a href="https://t.co/8TxG7jLIfT">pic.twitter.com/8TxG7jLIfT</a></p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1500105658732974082?ref_src=twsrc%5Etfw">March 5, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
</ul>
<h1 id="4-月">4 月</h1>
<ul>
<li>筑波へ行っていた
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="zxx" dir="ltr"><a href="https://t.co/qPIGXp3MZD">pic.twitter.com/qPIGXp3MZD</a></p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1509723602744094734?ref_src=twsrc%5Etfw">April 1, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</li>
</ul>
</li>
<li>セキュリティ・キャンプの講師になった
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ということで、セキュリティ・キャンプ全国大会2022「Cコンパイラゼミ」の講師を <a href="https://twitter.com/uint256_t?ref_src=twsrc%5Etfw">@uint256_t</a> とともに担当します。みなさん応募しましょう<a href="https://t.co/4LGIwMB6t0">https://t.co/4LGIwMB6t0</a></p>&mdash; hsjoihs (はすじょい) @ 12月18日から東京 (@hsjoihs) <a href="https://twitter.com/hsjoihs/status/1513432457453875204?ref_src=twsrc%5Etfw">April 11, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</li>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">よろしくお願いします。 <a href="https://t.co/1dLvBbGOaX">https://t.co/1dLvBbGOaX</a></p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1513433307991588867?ref_src=twsrc%5Etfw">April 11, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</li>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">というわけでCコンパイラゼミ、新たな講師を迎えて復活です！！！<br>Cコンパイラゼミ卒業生である <a href="https://twitter.com/hsjoihs?ref_src=twsrc%5Etfw">@hsjoihs</a> さんと、Rustでブラウザを作れる <a href="https://twitter.com/uint256_t?ref_src=twsrc%5Etfw">@uint256_t</a> さんの最強タッグでお送りしますので、皆様ぜひぜひご応募ください！<br>（私が担当するOS自作ゼミも、よろしくお願いします！）<a href="https://twitter.com/hashtag/seccamp?src=hash&amp;ref_src=twsrc%5Etfw">#seccamp</a> <a href="https://t.co/6jAFMkd1Lt">https://t.co/6jAFMkd1Lt</a></p>&mdash; hikalium (@hikalium) <a href="https://twitter.com/hikalium/status/1513437578326081537?ref_src=twsrc%5Etfw">April 11, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</li>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ちゃんと伏線回収してくれた <a href="https://twitter.com/uint256_t?ref_src=twsrc%5Etfw">@uint256_t</a> さんと <a href="https://twitter.com/hsjoihs?ref_src=twsrc%5Etfw">@hsjoihs</a> には感謝感激です！！！（卒業生のみんなも、一緒にもっと講師やりましょう！！こわくないよ！！） <a href="https://t.co/f0HTy5hRYE">https://t.co/f0HTy5hRYE</a></p>&mdash; hikalium (@hikalium) <a href="https://twitter.com/hikalium/status/1513437888784265218?ref_src=twsrc%5Etfw">April 11, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
</ul>
<h1 id="5-月">5 月</h1>
<ul>
<li>けっこうすごい
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/vicis?src=hash&amp;ref_src=twsrc%5Etfw">#vicis</a> C++のクラスを使ったコードがインタプリタで動いた。 <a href="https://t.co/KNk4MPjeVP">pic.twitter.com/KNk4MPjeVP</a></p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1527680638501138433?ref_src=twsrc%5Etfw">May 20, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
<li>チルダも慣れた
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Keychron K6 しばらく使ってみたけど、チルダが打ちにくいこと以外は快適</p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1522080757472120832?ref_src=twsrc%5Etfw">May 5, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
</ul>
<h1 id="6-月">6 月</h1>
<ul>
<li>著者の方から献本される体験
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">「作って学ぶコンピュータアーキテクチャ」を著者の方からいただきました。ありがとうございます。(1/n) <a href="https://t.co/uPIdRlPLVO">pic.twitter.com/uPIdRlPLVO</a></p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1540559665561739264?ref_src=twsrc%5Etfw">June 25, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
<li>真面目に深層学習ランタイムを作っていた
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">何の役に立つのかよくわからないものを作るのは楽しい <a href="https://t.co/Aq0rMZcDlE">https://t.co/Aq0rMZcDlE</a></p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1539483213105868801?ref_src=twsrc%5Etfw">June 22, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/altius?src=hash&amp;ref_src=twsrc%5Etfw">#altius</a> 猫 <a href="https://t.co/Uyyk1RoR9A">pic.twitter.com/Uyyk1RoR9A</a></p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1538525697207312391?ref_src=twsrc%5Etfw">June 19, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
- このツイートした時はすごく遅かったのね（Convが0.7sくらいかかってる。今は0.02sくらい）
</li>
</ul>
</li>
<li>大学図書館便利だなあと思った
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">大学図書館が高い本を買ってくれた <a href="https://t.co/2hi5Q05e68">pic.twitter.com/2hi5Q05e68</a></p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1534069816062971905?ref_src=twsrc%5Etfw">June 7, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">薄い本なのに高くてすみません。内容はちゃんとあるつもりですが。 <a href="https://t.co/Z5e1WplFtY">https://t.co/Z5e1WplFtY</a></p>&mdash; Jun Makino (@jun_makino) <a href="https://twitter.com/jun_makino/status/1534076292785930240?ref_src=twsrc%5Etfw">June 7, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</li>
</ul>
</li>
</ul>
<h1 id="7-月">7 月</h1>
<ul>
<li>嬉しかった
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Preferred Networks でのインターンに受かりました。</p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1542872935039639553?ref_src=twsrc%5Etfw">July 1, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
<li>Keychron K6 を買ったばかりなのに、HHKB を買った
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">届いた。やっぱりこの配列じゃないとだめだね。 <a href="https://t.co/JXhgCOW97V">pic.twitter.com/JXhgCOW97V</a></p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1544559708799139840?ref_src=twsrc%5Etfw">July 6, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
<li>まだ迷ってるよ
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">うーん、やっぱり前言撤回するかもしれない。このあたりの分野におけるコンパイラについてもっと知りたくなってきた。 <a href="https://t.co/999Z4iUV1Z">https://t.co/999Z4iUV1Z</a></p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1548288942726070274?ref_src=twsrc%5Etfw">July 16, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
</ul>
<h1 id="8-月">8 月</h1>
<ul>
<li>いつもレポートで困っている
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">レポート、単純にやることが多くてつらい</p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1555260954442858496?ref_src=twsrc%5Etfw">August 4, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
<li>セキュリティ・キャンプ開始
<ul>
<li>オンラインだったからあまり開幕した感がない</li>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/seccamp?src=hash&amp;ref_src=twsrc%5Etfw">#seccamp</a> 今日からですね</p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1556440594930888704?ref_src=twsrc%5Etfw">August 8, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
<li>無事終了</li>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ひとまず終わり。<br>何はともあれ、受講生の皆さんから色々学べて良かった。</p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1558038963268747265?ref_src=twsrc%5Etfw">August 12, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
<li>インターン開始
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">きれい <a href="https://t.co/GCpCHR8Yfv">pic.twitter.com/GCpCHR8Yfv</a></p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1558727993736167424?ref_src=twsrc%5Etfw">August 14, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
<li>ホテルの回線が遅かった</li>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ホテルの回線がひどいよ...</p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1560973618699710464?ref_src=twsrc%5Etfw">August 20, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</li>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Stable Diffusion 楽しそう</p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1562033296389054466?ref_src=twsrc%5Etfw">August 23, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
- このころなのかぁ。世の中の移り変わりが激しい
</li>
</ul>
</li>
<li>東京にいたので色々なところへ行った
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">東大めぐりなどをした</p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1563448798588080130?ref_src=twsrc%5Etfw">August 27, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</li>
</ul>
</li>
</ul>
<h1 id="9-月">9 月</h1>
<ul>
<li>技術書典 楽しかった
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">技術書典の日</p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1568784537622315008?ref_src=twsrc%5Etfw">September 11, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
<li>Zulip を導入
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://t.co/djeNOvESR3">https://t.co/djeNOvESR3</a><br><br>プログラミング言語処理系が好きな人の集まり、の Zulip を実験的に作りました。</p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1568235879193530369?ref_src=twsrc%5Etfw">September 9, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</li>
</ul>
</li>
<li>インターンの成果
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">【PFN2022インターンブログ】今年度インターンの前川隼輝 <a href="https://twitter.com/uint256_t?ref_src=twsrc%5Etfw">@uint256_t</a> さんの寄稿です。JAXの内部表現からONNXへのトランスパイラを実装し、JAX-MDやJAX-CFDが深層学習用プロセッサーMN-Core™で動くようになりました! <a href="https://t.co/icOjZcNMVk">https://t.co/icOjZcNMVk</a> <a href="https://t.co/FKvWK6c0ZC">pic.twitter.com/FKvWK6c0ZC</a></p>&mdash; PFN Tech (@preferred_jp) <a href="https://twitter.com/preferred_jp/status/1575353852983148544?ref_src=twsrc%5Etfw">September 29, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
<li>嘘書いてすみません（記事の最後参照）</li>
</ul>
</li>
</ul>
<h1 id="10-月">10 月</h1>
<ul>
<li>トラックボールおすすめ
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">トラックボールを買いました。慣れれば便利そう</p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1575877964641619970?ref_src=twsrc%5Etfw">September 30, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
<li>誕生日
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="qst" dir="ltr">++age;</p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1581982612561985536?ref_src=twsrc%5Etfw">October 17, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
<li>ハロウィン
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ちょっと綺麗 <a href="https://t.co/bo2xSGWKtk">pic.twitter.com/bo2xSGWKtk</a></p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1586738746854035456?ref_src=twsrc%5Etfw">October 30, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
</ul>
<h1 id="11-月">11 月</h1>
<ul>
<li>スマホを変えた
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Pixel 7 がやってきた。</p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1587314261038346242?ref_src=twsrc%5Etfw">November 1, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
<li>はい
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">出来ることを地道にやるしかないね.</p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1589420713358012416?ref_src=twsrc%5Etfw">November 7, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
<li>全体的に、雑多なことをしていた感じ</li>
</ul>
<h1 id="12-月">12 月</h1>
<ul>
<li>ChatGPT で遊んでいた
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">笑っちゃった<a href="https://t.co/T6VRSx1VHw">https://t.co/T6VRSx1VHw</a></p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1599274348531306496?ref_src=twsrc%5Etfw">December 4, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
<li>大学の研究室に（仮）配属された
<ul>
<li>大学に自分専用の机が用意されているのは便利ですね</li>
</ul>
</li>
<li>寒そう
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">なんで青いの <a href="https://t.co/3Y8XZeFdrW">pic.twitter.com/3Y8XZeFdrW</a></p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1605223803059343360?ref_src=twsrc%5Etfw">December 20, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
<li>なにこれ
<ul>
<li>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">クリスマスツリーを作りたかった <a href="https://t.co/0guZIwOpKV">pic.twitter.com/0guZIwOpKV</a></p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1606888248756047875?ref_src=twsrc%5Etfw">December 25, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
</li>
</ul>
</li>
</ul>
<h1 id="総括">総括</h1>
<ul>
<li>相変わらずコンパイラのことを考えていた</li>
<li>セキュリティ・キャンプとインターンの印象が強かった</li>
</ul>
<h1 id="来年の目標">来年の目標</h1>
<ul>
<li>多少は健康を意識する</li>
<li>おそらく大学院に行くための試験があるので頑張る</li>
<li>研究というものと仲良くなる</li>
</ul>
]]></content>
        </item>
        
        <item>
            <title>セキュリティ・キャンプ 2022 参加記（講師視点）</title>
            <link>https://maekawatoshiki.github.io/posts/seccamp2022/</link>
            <pubDate>Sat, 24 Sep 2022 18:14:08 +0900</pubDate>
            
            <guid>https://maekawatoshiki.github.io/posts/seccamp2022/</guid>
            <description>はじめに 私は高校生の時にセキュリティ・キャンプ2018に参加 （参加記, 応募課題） しました。 流行り病のことを考える必要もなく、当たり前のように現地参加していた頃が懐かしいです。 いつの間にか大学生になってしまいました。
大勢が物理的に集まることが難しくなり、セキュリティ・キャンプがオンラインで開催されるようになってから久しいですが、 そんな今年、私は講師として セキュリティ・キャンプ全国大会2022 オンライン という場に帰ってくることができました。
この文章は、あまり見かけることのない「講師視点の参加記」という名目で、 率直な感想や反省などを述べていくものです。 自分の担当したゼミ（Cコンパイラゼミ）の話がほとんどなので、今年のキャンプの概観を知りたいのであれば他の方の記事を読んでみてください。
軽くゼミ紹介 私と hsjoihs さんがCコンパイラゼミの講師を担当しました。 このゼミでは以下のことを目指し、実際にある程度は達成しました。
本ゼミでは、実用的なプログラムをコンパイルできるC言語のコンパイラを開発します。 コンパイラを開発するための言語は問いません。そのため、C言語で開発しても良いですし、 ご自身の慣れ親しんだ言語を使って開発しても構いません。 目標は、C言語で書かれたOSSなどをコンパイルできるCコンパイラを開発し、 余裕があればより高度なものへと改造することです。コンパイラの基本的な要素はもちろん、 高度なコンパイラ最適化やコンピュータ自体についての理解が進むよう、講師が手助けをします。 大会期間前に多くの事前学習が必要となりますが、プログラミング言語やその処理系に関心を持つ皆さんの応募をお待ちしています。
引用元: https://www.ipa.go.jp/jinzai/camp/2022/zenkoku2022_program_list.html#list_s-l3
セキュリティ・キャンプでは、（私の参加した2018年から）Cコンパイラを自作するゼミが開講されていましたが、 2021年は開講されませんでした。2022年に再び開講したことになります。
応募課題 ゼミを開講するにあたっては色々とやることがあります。 特に、応募課題を作り、応募者の方の回答を評価することは重要です。
今年の応募課題は、過去の応募課題と似てはいますが、 応募者ごとに回答の内容に差が生まれやすい（であろう）問題を取り入れました。 （それが何問目なのかは、応募課題を確認していただければわかると思います。）
思惑通り、多種多様な回答をいただき、読んでいる側としても学ぶことが多かったです。 深くは述べませんが（=言っていいのかよくわからない; 確認が取れたら言うかもしれない）、回答の傾向をまとめると以下のようになりました。
質の低い回答（自分の{頭で考えていない, 手を動かして検証していない}回答）は少なかった （私の）想像以上に、（応募者が）普段コンパイラをいじっているのか（or いじっていないのか）が回答から伝わってきた 長すぎる回答はやめよう、とは最初に警告したものの、短い回答（を心掛けた結果内容が当たり障りのないものになってしまう）よりは、 分量があって熱意の伝わってくる回答のほうが、応募者の能力を評価しやすかった e.g. 問題の回答が思いつかなくても、「わからなかった」or それに類することを書くよりは、どこまで調べたのか・どこからがわからないのかを詳しく書いてもらったほうが評価しやすい 圧倒的に質の高い回答を創り出す方というのは本当に存在するのだなぁ、と感心した また、応募課題作成者のひとりとして、この問題はもうちょっと説明を加えるべきだったなぁと気づかせてくれる回答もいくつかありました。 問題を考えるのは難しいですね。
事前学習 応募課題を考えたり選考したりと忙しいですが、まだキャンプは始まってすらいません。 本番期間5日間の前には事前学習期間があり、開発に注力するゼミであればこの期間が非常に重要となります。
Cコンパイラゼミも例外ではありません。 事前学習期間には毎週進捗報告会を開き、受講生の方の進捗を確認したり、バグ取りを手伝ったりなどしました。 基本的には compilerbook や 事前に提供した本 を活用しながら、受講生の方が自主的にコンパイラ開発を進めるという流れだったため、 なるべく作業の手が止まらないように、 非同期なテキストチャットでの質疑応答も積極的に行っていました。
事前学習期間中にセルフホストまで到達した方もおり、 年々自作コンパイラ界隈のレベルが上昇しているなぁと実感しました。 ほんの10年前ならありえないことだったのではないでしょうか。
本番期間 事前学習期間は本番期間の5日間よりも長いですが、 受講生の方（や私）は試験期間などに重なって進捗を出しづらい 時期もあります。 やはりキャンプの真髄は、皆が集まって集中できる本番期間にあります。</description>
            <content type="html"><![CDATA[<h1 id="はじめに">はじめに</h1>
<p>私は高校生の時にセキュリティ・キャンプ2018に参加
（<a href="https://web.archive.org/web/20201104070559/http://maekawatoshiki.github.io/%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3-%E3%82%AD%E3%83%A3%E3%83%B3%E3%83%97%E5%8F%82%E5%8A%A0%E8%A8%98/">参加記</a>,
<a href="https://web.archive.org/web/20201104070547/https://maekawatoshiki.github.io/%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%82%AD%E3%83%A3%E3%83%B3%E3%83%97%E3%81%AE%E5%BF%9C%E5%8B%9F%E7%94%A8%E7%B4%99%E5%85%AC%E9%96%8B/">応募課題</a>）
しました。
流行り病のことを考える必要もなく、当たり前のように現地参加していた頃が懐かしいです。
いつの間にか大学生になってしまいました。</p>
<p>大勢が物理的に集まることが難しくなり、セキュリティ・キャンプがオンラインで開催されるようになってから久しいですが、
そんな今年、私は講師として
<a href="https://www.ipa.go.jp/jinzai/camp/2022/zenkoku2022_index.html">セキュリティ・キャンプ全国大会2022 オンライン</a>
という場に帰ってくることができました。</p>
<p>この文章は、あまり見かけることのない「講師視点の参加記」という名目で、
率直な感想や反省などを述べていくものです。
自分の担当したゼミ（Cコンパイラゼミ）の話がほとんどなので、今年のキャンプの概観を知りたいのであれば他の方の記事を読んでみてください。</p>
<h1 id="軽くゼミ紹介">軽くゼミ紹介</h1>
<p>私と <a href="https://twitter.com/hsjoihs">hsjoihs</a> さんがCコンパイラゼミの講師を担当しました。
このゼミでは以下のことを目指し、実際にある程度は達成しました。</p>
<blockquote>
<p>本ゼミでは、実用的なプログラムをコンパイルできるC言語のコンパイラを開発します。
コンパイラを開発するための言語は問いません。そのため、C言語で開発しても良いですし、
ご自身の慣れ親しんだ言語を使って開発しても構いません。
目標は、C言語で書かれたOSSなどをコンパイルできるCコンパイラを開発し、
余裕があればより高度なものへと改造することです。コンパイラの基本的な要素はもちろん、
高度なコンパイラ最適化やコンピュータ自体についての理解が進むよう、講師が手助けをします。
大会期間前に多くの事前学習が必要となりますが、プログラミング言語やその処理系に関心を持つ皆さんの応募をお待ちしています。</p>
<p>引用元: <a href="https://www.ipa.go.jp/jinzai/camp/2022/zenkoku2022_program_list.html#list_s-l3">https://www.ipa.go.jp/jinzai/camp/2022/zenkoku2022_program_list.html#list_s-l3</a></p>
</blockquote>
<p>セキュリティ・キャンプでは、（私の参加した2018年から）Cコンパイラを自作するゼミが開講されていましたが、
2021年は開講されませんでした。2022年に再び開講したことになります。</p>
<h1 id="応募課題">応募課題</h1>
<p>ゼミを開講するにあたっては色々とやることがあります。
特に、応募課題を作り、応募者の方の回答を評価することは重要です。</p>
<p><a href="https://www.ipa.go.jp/jinzai/security-camp/2022/zenkoku/qv6pgp0000002518-att/000097404.txt">今年の応募課題</a>は、過去の応募課題と似てはいますが、
応募者ごとに回答の内容に差が生まれやすい（であろう）問題を取り入れました。
（それが何問目なのかは、応募課題を確認していただければわかると思います。）</p>
<p>思惑通り、多種多様な回答をいただき、読んでいる側としても学ぶことが多かったです。
深くは述べませんが（=言っていいのかよくわからない; 確認が取れたら言うかもしれない）、回答の傾向をまとめると以下のようになりました。</p>
<ul>
<li>質の低い回答（自分の{頭で考えていない, 手を動かして検証していない}回答）は少なかった</li>
<li>（私の）想像以上に、（応募者が）普段コンパイラをいじっているのか（or いじっていないのか）が回答から伝わってきた</li>
<li><em>長すぎる回答はやめよう</em>、とは最初に警告したものの、短い回答（を心掛けた結果内容が当たり障りのないものになってしまう）よりは、
分量があって熱意の伝わってくる回答のほうが、応募者の能力を評価しやすかった
<ul>
<li>e.g. 問題の回答が思いつかなくても、「わからなかった」or それに類することを書くよりは、どこまで調べたのか・どこからがわからないのかを詳しく書いてもらったほうが評価しやすい</li>
</ul>
</li>
<li>圧倒的に質の高い回答を創り出す方というのは本当に存在するのだなぁ、と感心した</li>
</ul>
<p>また、応募課題作成者のひとりとして、この問題はもうちょっと説明を加えるべきだったなぁと気づかせてくれる回答もいくつかありました。
問題を考えるのは難しいですね。</p>
<h1 id="事前学習">事前学習</h1>
<p>応募課題を考えたり選考したりと忙しいですが、まだキャンプは始まってすらいません。
本番期間5日間の前には事前学習期間があり、開発に注力するゼミであればこの期間が非常に重要となります。</p>
<p>Cコンパイラゼミも例外ではありません。
事前学習期間には毎週進捗報告会を開き、受講生の方の進捗を確認したり、バグ取りを手伝ったりなどしました。
基本的には <a href="https://www.sigbus.info/compilerbook">compilerbook</a> や <a href="https://gihyo.jp/book/2017/978-4-7741-9381-6">事前に提供した本</a>
を活用しながら、受講生の方が自主的にコンパイラ開発を進めるという流れだったため、
なるべく作業の手が止まらないように、
非同期なテキストチャットでの質疑応答も積極的に行っていました。</p>
<p>事前学習期間中にセルフホストまで到達した方もおり、
年々自作コンパイラ界隈のレベルが上昇しているなぁと実感しました。
ほんの10年前ならありえないことだったのではないでしょうか。</p>
<h1 id="本番期間">本番期間</h1>
<p>事前学習期間は本番期間の5日間よりも長いですが、
受講生の方（や私）は試験期間などに重なって進捗を出しづらい
時期もあります。
やはりキャンプの真髄は、皆が集まって集中できる本番期間にあります。</p>
<p>オンラインでの開催とは言え、キャンプの開幕時は（主にテキストチャットが）大いに盛り上がり、
改めてこれが大きなイベントなんだと気付かされました。
そのままの勢いで、およそ3日間の集中開発が始まりました。</p>
<p>コミュニケーションには基本的に Zoom や Discord を使っていましたが、
ほぼ一日中リアルタイムで・相手の画面を見ながら会話出来たため、物理的に隣に座っているわけではないものの、
相手の状況（e.g. デバッグ中の画面など）を理解したり質問に答えたりすることに特段困ることはありませんでした。</p>
<p>印象的だったのは、とりとめのない会話から面白いアイデアが生まれることが多々あったことです。
例えば、このドーナツを自作 C コンパイラで動かそう、などのアイデアです。</p>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">浮動小数点数を実装していない自作 C コンパイラでも使えるように改造した、整数演算版 donut.c がこちらになります。皆様の自作コンパイラでも是非これを走らせてみてください（「このテストケースでバグを発見できました」という受講生の声を多数頂いております） <a href="https://twitter.com/hashtag/seccamp?src=hash&amp;ref_src=twsrc%5Etfw">#seccamp</a><a href="https://t.co/4zoDSo2pDQ">https://t.co/4zoDSo2pDQ</a> <a href="https://t.co/XFVsoXFqJ6">pic.twitter.com/XFVsoXFqJ6</a></p>&mdash; hsjoihs (はすじょい) @ 年度末まで低浮上 (@hsjoihs) <a href="https://twitter.com/hsjoihs/status/1557956754297655298?ref_src=twsrc%5Etfw">August 12, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>受講生の方に私がどれだけのことを教えられたかはわかりませんが、
少なくとも彼らは十分すぎるくらいの成果を生み出していました。</p>
<h1 id="感想">感想</h1>
<p>講師としてキャンプに参加する前は、人に何かを教える立場から距離をとっていました。
しかし、講師という立場をいざ体験してみると、色々な反省はあるものの、案外楽しいものだと思えるようになりました。</p>
<p>2018年に私がキャンプを終えた時に、将来講師として戻ってきてほしいと言われた気がしますが、その時は
本当に戻ってくるとは思ってもみませんでした。本当に。</p>
<p>今回のキャンプを卒業した方の中から、将来の講師になる方が出てくるといいなと思いました。</p>
<h1 id="反省">反省</h1>
<ul>
<li>もっとしっかりとした教材を用意したかった
<ul>
<li>質問に答えているだけでも一応ゼミとしては成り立つけど、もっとこう、読み物として面白い教材を作りたい</li>
<li>最適化の教材を途中まで作っていたけど、まだ完成していない</li>
</ul>
</li>
<li>hsjoihs さんにかなり頼っていた気がする
<ul>
<li>計算機科学含め、幅広い分野に精通したい</li>
<li>どの分野も繋がっているんだと改めて気付かされました</li>
</ul>
</li>
</ul>
]]></content>
        </item>
        
        <item>
            <title>DNN雑記</title>
            <link>https://maekawatoshiki.github.io/posts/ml/</link>
            <pubDate>Thu, 23 Dec 2021 19:47:09 +0900</pubDate>
            
            <guid>https://maekawatoshiki.github.io/posts/ml/</guid>
            <description>この記事は何？ いきなりDeep Neural Networkの世界に足を踏み入れた人がいろいろ語るだけ あまり細かい話はしない 丸と矢印 深層学習だとかニューラルネットワーク（以下NN）だとか検索すると、以下のような画像をよく見かけると思う。全結合層があって、多分最後の方に活性化関数が挟んである。
入力にデータを流し込んであげると出力を得ることができる、とてもシンプルな構造をしている。
丸と矢印と… しかし、近年実際に使われているDNNはこれほど簡単な構造はしていない。
例えば、以下は文字認識を行うモデル(MNIST1)をONNX2形式としてエクスポートしてnetron3で表示したもの。
一目瞭然だが、先ほどの画像のNNとはだいぶ見た目が違う。丸くないし、いや、でも矢印はある。 丸の代わりに角丸の四角が現れた。矢印の横には謎の数字の列が書いてある。
ぱっと見、グラフ（DAG）であることはわかると思う。
軽く説明すると以下の通り。
角丸の四角: 命令（Operator; ONNX用語？真に受けないでほしい）。命令はデータに対してなんらかの操作を行う。 例えば、上の画像中の Relu はデータの一要素づつ（数値一つ一つ）に ReLU4 を適用する 一方、Conv はデータ全体に対して畳み込み5 を行う 命令ごとに、一要素づつ(element-wise)に操作を行なうのか、部分的に({layer,channel,row,&amp;hellip;}-wise)操作を行なうのか違ってややこしい 矢印: データの流れる方向。データというのは画像だったり文字列だったり… 謎の数字の列: テンソル6のshape。要するにデータがどのような形（のテンソル）なのかを表す。 なんと静的じゃないこともある。画像中ではすべての矢印の横に数字の列（＝shape)が書いてあるが、これは運がいいだけ。shape inference（=shapeを推論する）しても静的に shape が決まらないこともある。でもそのおかげで文字列とか複数のbounding boxを扱えたりする。 より複雑なモデル（画像を分類したりとか）は、もちろんより複雑な構造をしている。netron で表示すると重い。
グラフを計算機が理解するまで DNN はネットワークであり、グラフであり、そのままでは計算機上で動かない。
PyTorch, TensorFlow, Chainer, &amp;hellip; などの機械学習フレームワークは、設計思想の差こそあれ結局はNNモデルを計算機上で実際に動作させるためのものである。そこにはコンパイラと呼べるものが必ずある。いわゆる機械学習コンパイラである。
機械学習コンパイラのやることは、簡単に言えば以下の通りである。
NNモデルのグラフをより簡単な表現に変換する。命令（ノード）同士をくっつけたり分離したり、大胆に順番を入れ替えたり。（数学的に正しくなくてもいい！） 命令の実行順序を決定する。動的に変える場合もある。グラフ中には並列に実行できる命令が含まれるので気を付ける。 CPU, GPU, 独自アクセラレータなどごとに命令列を機械語へ変換。アセンブリを吐いたり、（サボって）LLVMとかOpenCLとかでカーネル吐いたり。CUDAで頑張る？ このあと、CPU, GPU, &amp;hellip; などが複雑に絡み合うヘテロジニアスな環境でどうやって高速にデータを受け渡すか、などの話もあるけどコンパイラの役割じゃない気がしたので省略。
現実 DNN は実際はただのグラフで、そこにデータを流し込んでるだけ。学習時はちょっと違うのかもしれないけど、少なくとも推論時はそう。
計算機をいかに高速に・効率的に動かすかを考えるのは面白い。けど、これが人工知能って呼ばれてるのをみるとなんか微妙な気持ちになるね。
（p.s. DNNの量子化の話聞きたい人いるかな？モデルのパラメータ数を減らしたり、モデル自体を小さくコンパクトにする系の話）
脚注 MNISTデータセット&amp;#160;&amp;#x21a9;&amp;#xfe0e;
Open Neural Network Exchange の略。ここでは ONNX の定める、NNのモデルを表現するためのフォーマットを指す。&amp;#160;&amp;#x21a9;&amp;#xfe0e;</description>
            <content type="html"><![CDATA[<h1 id="この記事は何">この記事は何？</h1>
<ul>
<li>いきなりDeep Neural Networkの世界に足を踏み入れた人がいろいろ語るだけ</li>
<li>あまり細かい話はしない</li>
</ul>
<h1 id="丸と矢印">丸と矢印</h1>
<p>深層学習だとかニューラルネットワーク（以下NN）だとか検索すると、以下のような画像をよく見かけると思う。全結合層があって、多分最後の方に活性化関数が挟んである。</p>
<p><img src="https://miro.medium.com/max/4800/1*3fA77_mLNiJTSgZFhYnU0Q.png" alt="nn"></p>
<p>入力にデータを流し込んであげると出力を得ることができる、とてもシンプルな構造をしている。</p>
<h1 id="丸と矢印と">丸と矢印と…</h1>
<p>しかし、近年実際に使われているDNNはこれほど簡単な構造はしていない。</p>
<p>例えば、以下は文字認識を行うモデル(MNIST<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>)をONNX<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>形式としてエクスポートして<code>netron</code><sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>で表示したもの。</p>
<p><img src="https://cdn.thenewstack.io/media/2020/07/c601845f-onnx-mnist-0-328x1024.jpg" alt="mnist"></p>
<p>一目瞭然だが、先ほどの画像のNNとはだいぶ見た目が違う。丸くないし、いや、でも矢印はある。
丸の代わりに角丸の四角が現れた。矢印の横には謎の数字の列が書いてある。</p>
<p>ぱっと見、グラフ（DAG）であることはわかると思う。</p>
<p>軽く説明すると以下の通り。</p>
<ul>
<li>角丸の四角: <strong>命令</strong>（Operator; ONNX用語？真に受けないでほしい）。命令はデータに対してなんらかの操作を行う。
<ul>
<li>例えば、上の画像中の <code>Relu</code> はデータの一要素づつ（数値一つ一つ）に ReLU<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup> を適用する</li>
<li>一方、<code>Conv</code> はデータ全体に対して畳み込み<sup id="fnref:5"><a href="#fn:5" class="footnote-ref" role="doc-noteref">5</a></sup> を行う
<ul>
<li>命令ごとに、一要素づつ(element-wise)に操作を行なうのか、部分的に({layer,channel,row,&hellip;}-wise)操作を行なうのか違ってややこしい</li>
</ul>
</li>
</ul>
</li>
<li>矢印: データの流れる方向。データというのは画像だったり文字列だったり…</li>
<li>謎の数字の列: テンソル<sup id="fnref:6"><a href="#fn:6" class="footnote-ref" role="doc-noteref">6</a></sup>のshape。要するにデータがどのような形（のテンソル）なのかを表す。
<ul>
<li>なんと静的じゃないこともある。画像中ではすべての矢印の横に数字の列（＝shape)が書いてあるが、これは運がいいだけ。shape inference（=shapeを推論する）しても静的に shape が決まらないこともある。でもそのおかげで文字列とか複数のbounding boxを扱えたりする。</li>
</ul>
</li>
</ul>
<p>より複雑なモデル（画像を分類したりとか）は、もちろんより複雑な構造をしている。netron で表示すると重い。</p>
<h1 id="グラフを計算機が理解するまで">グラフを計算機が理解するまで</h1>
<p>DNN はネットワークであり、グラフであり、そのままでは計算機上で動かない。</p>
<p>PyTorch, TensorFlow, Chainer, &hellip; などの機械学習フレームワークは、設計思想の差こそあれ結局はNNモデルを計算機上で実際に動作させるためのものである。そこにはコンパイラと呼べるものが必ずある。いわゆる機械学習コンパイラである。</p>
<p>機械学習コンパイラのやることは、簡単に言えば以下の通りである。</p>
<ol>
<li>NNモデルのグラフをより簡単な表現に変換する。命令（ノード）同士をくっつけたり分離したり、大胆に順番を入れ替えたり。（数学的に正しくなくてもいい！）</li>
<li>命令の実行順序を決定する。動的に変える場合もある。グラフ中には並列に実行できる命令が含まれるので気を付ける。</li>
<li>CPU, GPU, 独自アクセラレータなどごとに命令列を機械語へ変換。アセンブリを吐いたり、（サボって）LLVMとかOpenCLとかでカーネル吐いたり。CUDAで頑張る？</li>
</ol>
<p>このあと、CPU, GPU, &hellip; などが複雑に絡み合うヘテロジニアスな環境でどうやって高速にデータを受け渡すか、などの話もあるけどコンパイラの役割じゃない気がしたので省略。</p>
<h1 id="現実">現実</h1>
<p>DNN は実際はただのグラフで、そこにデータを流し込んでるだけ。学習時はちょっと違うのかもしれないけど、少なくとも推論時はそう。</p>
<p>計算機をいかに高速に・効率的に動かすかを考えるのは面白い。けど、これが人工知能って呼ばれてるのをみるとなんか微妙な気持ちになるね。</p>
<p>（p.s. DNNの量子化の話聞きたい人いるかな？モデルのパラメータ数を減らしたり、モデル自体を小さくコンパクトにする系の話）</p>
<h1 id="脚注">脚注</h1>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><a href="https://ja.wikipedia.org/wiki/MNIST%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9">MNISTデータセット</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p><a href="https://onnx.ai/">Open Neural Network Exchange</a> の略。ここでは ONNX の定める、NNのモデルを表現するためのフォーマットを指す。&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p><a href="https://github.com/lutzroeder/netron">netron</a>。NNのモデルを可視化してくれる。&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:4">
<p><a href="https://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E5%8C%96%E7%B7%9A%E5%BD%A2%E9%96%A2%E6%95%B0">ReLU</a>。角が尖ってる。&#160;<a href="#fnref:4" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:5">
<p><a href="https://ja.wikipedia.org/wiki/%E7%95%B3%E3%81%BF%E8%BE%BC%E3%81%BF%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%A9%E3%83%AB%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF">Convolution</a>&#160;<a href="#fnref:5" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:6">
<p>行列は2階のテンソル。要するに高次元の行列だと思えばわかりやすい。 <a href="https://qiita.com/enoughspacefor/items/66982f595e2c71502062#%E8%B3%87%E6%96%993tensor">これがわかりやすい？</a>&#160;<a href="#fnref:6" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content>
        </item>
        
        <item>
            <title>Google Summer of Code 2021 を終えました</title>
            <link>https://maekawatoshiki.github.io/posts/gsoc3/</link>
            <pubDate>Thu, 09 Sep 2021 00:08:57 +0900</pubDate>
            
            <guid>https://maekawatoshiki.github.io/posts/gsoc3/</guid>
            <description>TL;DR Google Summer of Code 2021 を終えました First, Final Evaluation ともに通りました、という意味 LLVM むずかしい 成果 Google Summer of Code とは 前に書いた記事を参照してください。
何をしたのか 2021/May/20 から 2021/Aug/28 くらいまで、メンターの方たちと共に LLVM へ貢献していました。 （まだマージされていないパッチがあるんですけどね&amp;hellip;）
正確には、コーディングをはじめたのは６月くらいからみたいです。
LLVM? The LLVM Project is a collection of modular and reusable compiler and toolchain technologies. The LLVM Compiler Infrastructure
clang や lld などを傘下に持つ、コンパイラ基盤のプロジェクトです。
（以下 LLVM についてある程度詳しいことを前提として話を進めていきます；またいつか LLVM 自体の解説もしたい）
テーマ 提出した Proposal のタイトルは Utilize LoopNest Pass でした。
Pass というと、Module Pass, Function Pass, Loop Pass, &amp;hellip; など色々あります。 その中に、最近追加されたばかりの LoopNest Pass (New Pass Manager でのみ動作) というものがあります。 これは、ネストしたループを扱うための Pass なのですが、 まだほとんど使われていません（でした）。 私がこの夏にやったことは、LoopNest Pass として実装されている Pass を増やすことです。</description>
            <content type="html"><![CDATA[<h1 id="tldr">TL;DR</h1>
<ul>
<li>Google Summer of Code 2021 を終えました
<ul>
<li>First, Final Evaluation ともに通りました、という意味</li>
</ul>
</li>
<li>LLVM むずかしい</li>
<li><a href="https://docs.google.com/document/d/1ASGejJIL7rzEDwX2qZZqT4ATR2x3sd_aOTuMSCh2YTE/edit#heading=h.qv3zfxev18ag">成果</a></li>
</ul>
<h1 id="google-summer-of-code-とは">Google Summer of Code とは</h1>
<p><a href="../gsoc1">前に書いた記事</a>を参照してください。</p>
<h1 id="何をしたのか">何をしたのか</h1>
<p>2021/May/20 から 2021/Aug/28 くらいまで、メンターの方たちと共に LLVM へ貢献していました。
（まだマージされていないパッチがあるんですけどね&hellip;）</p>
<p>正確には、コーディングをはじめたのは６月くらいからみたいです。</p>
<h1 id="llvm">LLVM?</h1>
<blockquote>
<p>The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.
<a href="https://llvm.org/">The LLVM Compiler Infrastructure</a></p>
</blockquote>
<p>clang や lld などを傘下に持つ、コンパイラ基盤のプロジェクトです。</p>
<p>（以下 LLVM についてある程度詳しいことを前提として話を進めていきます；またいつか LLVM 自体の解説もしたい）</p>
<h1 id="テーマ">テーマ</h1>
<p>提出した Proposal のタイトルは <strong>Utilize LoopNest Pass</strong> でした。</p>
<p>Pass というと、Module Pass, Function Pass, Loop Pass, &hellip; など色々あります。
その中に、最近追加されたばかりの <strong>LoopNest Pass</strong> (New Pass Manager でのみ動作) というものがあります。
これは、ネストしたループを扱うための Pass なのですが、
まだほとんど使われていません（でした）。
私がこの夏にやったことは、LoopNest Pass として実装されている Pass を増やすことです。</p>
<p>Loop Pass とは別に LoopNest Pass が作られた理由にはいくつかあります。
例えば、ネストしたループ向けの最適化手法には、Loop Pass (や Function Pass) として実装するとコード量が増えてしまうものや、そもそも
うまく実装できないものが存在します。そのような最適化手法は、LoopNest Pass として簡単に実装できる可能性が高いです。</p>
<h2 id="loopnest-pass-と-loop-pass-の違い">LoopNest Pass と Loop Pass の違い</h2>
<p>Loop Pass Pipeline <em>X</em> に、Loop Pass <em>A, B</em> が順番に並んでいるとします。
ここで、<em>X</em> に以下のループを流してみます。（<em>X</em> に <code>outerL</code> に対応する <code>Loop</code> オブジェクトを渡す、の意）</p>
<pre tabindex="0"><code>outerL:
  innerL:
    body
</code></pre><p>すると、まず <code>innerL</code> が <em>A, B</em> によって最適化され、その後に <code>outerL</code> が <em>A, B</em> によって最適化されます。
要するに、最内ループから最外ループへ向かって最適化が行われるというわけです。</p>
<p>特に問題なさそうに見えますが、これはあくまで個別のループに個別の最適化を施す場合には問題がない、というだけです。</p>
<p>例えば、<code>outerL</code> と <code>innerL</code> を見比べてからループネスト全体に何らかの操作を施したい場合はどうしればいいのでしょうか。
（単純な解決法：<code>innerL</code> を無視して <code>outerL</code> の順番がやってきたらループネスト全体を見渡せば良い；
問題：<code>innerL</code> を飛ばすためのコードが必要になる。そもそも Loop Pass に渡される <code>Loop</code> オブジェクトはループネストを扱うのには適していない）</p>
<p>ここで LoopNest Pass の登場です。</p>
<p>Loop Pass Pipeline <em>Y</em> に、Loop Pass <em>A, B</em> と LoopNest Pass <em>C</em> が順番に並んでいるとします。
ここで、<em>Y</em> に先程のループを流してみます。</p>
<p>すると、まず <code>innerL</code> が <em>A, B</em> によって最適化され、その後に <code>outerL</code> が <em>A, B, <strong>C</strong></em> によって最適化されます。
要するに、<strong>LoopNest Pass は最外ループにのみ適用される</strong>のです。
しかも、LoopNest Pass は <code>Loop</code> オブジェクトではなく <code>LoopNest</code> オブジェクトを受けとります。
これにより、Loop Pass として実装する場合と比べて、ループネストを扱いやすくなります。</p>
<h2 id="もうちょっと具体例-loop-interchange">もうちょっと具体例: loop-interchange</h2>
<p>以下のようなループネストを考えます。</p>
<pre tabindex="0"><code>for k = 0, 10:
  for i = 0, 10:
    for j = 0, 10:
      A[i, j, k] += B[i, j, k]
</code></pre><p>見るからに何かがおかしいですよね？最外ループの添字が <code>k</code> となっていますが、これではキャッシュに当たる気がしません。</p>
<p>このようなループネストには、それぞれのループの順番を入れ替える loop-interchange という最適化を施すと良いです。</p>
<pre tabindex="0"><code># loop-interchange 後
for i = 0, 10:
  for j = 0, 10:
    for k = 0, 10:
      A[i, j, k] += B[i, j, k]
</code></pre><p>このような最適化は、ループネスト全体を見渡す必要があります。そのため LoopNest Pass として実装すると良いです。
（でないと、for-k を飛ばして・for-j を飛ばして、という処理を個々の Loop Pass 内に記述する必要が出てきます）</p>
<h1 id="何を学んだのか">何を学んだのか</h1>
<p>LLVM という大きな OSS プロジェクトに貢献する中で、色々なことを学びました。</p>
<p>例えば、私はいつも大きなソースツリーを見ると上から下まで読みたくなるのですが、
そんなことを LLVM に対してしていたら一生が終わってしまいます。
なので今回の GSoC ではそんなことはせず、自分の担当する部分に関連する部分だけを集中的に読みました。
大きなソフトウェアはその一部分のみを理解しているだけで十分（であることが望ましい…）なんだと実感しました。</p>
<p>もう一つ、痛感したことがあります。
それは、コーディング能力は確かに重要だけれども、それ以上にコミュニケーション能力が重要だということです。
パッチを投げる、レビューを受ける、変更の意図を説明する…、すべての過程で（英語での）わかりやすい説明を求められます。
自分の意図を正確に伝えられないと、相手に無駄な時間を取らせてしまうこともあります。</p>
<p>英語でのテキスト（&amp;できれば口頭での）コミュニケーション能力は身につけておかないと痛い目に合います。</p>
<h1 id="どうでもいいこと一覧">どうでもいいこと一覧</h1>
<ul>
<li>メンター２人（１人とはあんまり話さなかったけど）、プロジェクトメンバー２人、私の合計５人でプロジェクトを進めた
<ul>
<li>私とプロジェクトメンバーの１人がほとんどのパッチを作ったと思う</li>
</ul>
</li>
<li>連絡は Discord で行った</li>
<li>毎週 Webex でミーティングを行った。口頭での英語にほんの少しだけ慣れた。</li>
<li>LLVM のコミット権をもらえて嬉しかった</li>
<li>2700USD 貰った （<a href="https://developers.google.com/open-source/gsoc/help/student-stipends">国ごとに貰える量は違うみたい</a>）</li>
<li>お金は <a href="https://www.payoneer.com/ja/">Payoneer</a>ってやつで受け取った</li>
<li>CI が落ちると怖い（メールが来る）</li>
<li>Address/Memory Sanitizer は偉い</li>
<li>初めて master にコミットしたときは手が震えた
<ul>
<li>そしてそのコミットを何度も revert する羽目になって辛かった</li>
</ul>
</li>
</ul>
<p>以上。来年以降に参加する人の助けになればいいなあ。</p>
<p>（質問があれば twitter@uint256_t へ DM とか投げてください）</p>
]]></content>
        </item>
        
        <item>
            <title>GSoC 2021 の First Evaluation に通りました</title>
            <link>https://maekawatoshiki.github.io/posts/gsoc2/</link>
            <pubDate>Sun, 25 Jul 2021 01:16:16 +0900</pubDate>
            
            <guid>https://maekawatoshiki.github.io/posts/gsoc2/</guid>
            <description>TL;DR Google Summer of Code 2021 の First Evaluation に通りました 2700USD * 0.45 = 1215USD = 13万円くらい貰えました 詳しいこと あとで書きます</description>
            <content type="html"><![CDATA[<h1 id="tldr">TL;DR</h1>
<ul>
<li>Google Summer of Code 2021 の First Evaluation に通りました</li>
<li>2700USD * 0.45 = 1215USD = 13万円くらい貰えました</li>
</ul>
<h1 id="詳しいこと">詳しいこと</h1>
<p>あとで書きます</p>
]]></content>
        </item>
        
        <item>
            <title>Google Summer of Code 2021 に参加します</title>
            <link>https://maekawatoshiki.github.io/posts/gsoc1/</link>
            <pubDate>Wed, 19 May 2021 15:56:20 +0900</pubDate>
            
            <guid>https://maekawatoshiki.github.io/posts/gsoc1/</guid>
            <description>TL;DR Google Summer of Code に提出したProposalが採択されました 晴れてGSoCに参加できることとなりました 参加団体はLLVMです 嬉しい Google Summer of Codeとは Google Summer of Code is a global program focused on bringing more student developers into open source software development. Students work with an open source organization on a 10 week programming project during their break from school.
(https://summerofcode.withgoogle.com/)
Google Summer of Code は、OSSプロジェクトにメンター付きで参加することができ、さらに Google から報酬ももらえるイベントです。 その名の通り夏（休み）に行われるのですが、アメリカ規準であって、日本の大学などでは普通に授業が行われています。 本来であれば、学部2年生の私にとっては参加が少し厳しいはずでしたが、今年は新型コロナの影響でプロジェクトに取り組む時間の制約が緩くなった (40h/w→17h+/w) ので、思い切って参加してみました。(大学もずっとオンラインで、家にこもりっぱなしですし。)
Proposal採択までの流れ 3月の初めから、以下の作業を始めました。
参加団体を選ぶ 公式サイトを見れば、様々な団体がGSoCに参加しているとわかります。 私は、ずっと LLVM に貢献したかったので、無論それを選びました。
参加プロジェクトを選ぶ 各団体のほぼすべてが、学生向けのプロジェクト一覧を公開しているはずです。LLVM ならここ。 興味のあるプロジェクトは、初めのうちは複数個選んでおいた方がいいと思います。後になって、選んだプロジェクトが想像以上に難しいものだと判明すると、Proposalを書くのが大変ですし、不必要に自分を追い込んでしまいます。</description>
            <content type="html"><![CDATA[<h1 id="tldr">TL;DR</h1>
<ul>
<li>Google Summer of Code に提出したProposalが採択されました</li>
<li>晴れてGSoCに参加できることとなりました</li>
<li>参加団体はLLVMです</li>
<li>嬉しい</li>
</ul>
<h1 id="google-summer-of-codeとは">Google Summer of Codeとは</h1>
<blockquote>
<p>Google Summer of Code is a global program focused on bringing more  student developers into open source software development. Students work  with an open source organization on a 10 week programming project during their break from school.</p>
<p>(<a href="https://summerofcode.withgoogle.com/">https://summerofcode.withgoogle.com/</a>)</p>
</blockquote>
<p>Google Summer of Code は、OSSプロジェクトにメンター付きで参加することができ、さらに Google から報酬ももらえるイベントです。
その名の通り夏（休み）に行われるのですが、アメリカ規準であって、日本の大学などでは普通に授業が行われています。
本来であれば、学部2年生の私にとっては参加が少し厳しいはずでしたが、今年は新型コロナの影響でプロジェクトに取り組む時間の制約が緩くなった (40h/w→17h+/w) ので、思い切って参加してみました。(大学もずっとオンラインで、家にこもりっぱなしですし。)</p>
<h1 id="proposal採択までの流れ">Proposal採択までの流れ</h1>
<p>3月の初めから、以下の作業を始めました。</p>
<h2 id="参加団体を選ぶ">参加団体を選ぶ</h2>
<p><a href="https://summerofcode.withgoogle.com/organizations/">公式サイト</a>を見れば、様々な団体がGSoCに参加しているとわかります。
私は、ずっと <a href="https://llvm.org/">LLVM</a> に貢献したかったので、無論それを選びました。</p>
<h2 id="参加プロジェクトを選ぶ">参加プロジェクトを選ぶ</h2>
<p>各団体のほぼすべてが、学生向けのプロジェクト一覧を公開しているはずです。LLVM なら<a href="https://llvm.org/OpenProjects.html">ここ</a>。
興味のあるプロジェクトは、初めのうちは複数個選んでおいた方がいいと思います。後になって、選んだプロジェクトが想像以上に難しいものだと判明すると、Proposalを書くのが大変ですし、不必要に自分を追い込んでしまいます。</p>
<h2 id="メーリングリストと奮闘する">メーリングリストと奮闘する</h2>
<p>興味のあるプロジェクトを選んだら、各団体のメンターと連絡を取ります。ここから先は各団体の指示に従うべきです。
私の場合は、メーリングリストでメンターの方にプロジェクトの詳しい説明を聞いていました。<a href="https://lists.llvm.org/pipermail/llvm-dev/2021-March/149058.html">このあたり</a>から辿れます。</p>
<p>(英語のメールを書くのがかなり久しぶりだったので少し緊張しました。)</p>
<h2 id="proposalを書く">Proposalを書く</h2>
<p>各団体に提出するためのProposalを書きます。ネット上には過去GSoCに参加した方のProposalの例が沢山公開されています。</p>
<p><a href="https://docs.google.com/document/d/1HkpPIgvZ0h7OQSzNN-8OFS71MqwKCmH4QmhKFqOjaxw">もちろん私も公開します。</a></p>
<p>Proposalは、ある程度書いたらメンターの人に見てもらって、アドバイスを貰ったりしました。</p>
<h2 id="と同時並行で-小さめのパッチを送る">(↑と同時並行で) 小さめのパッチを送る</h2>
<p>Proposalの内容と関係のある<a href="https://reviews.llvm.org/D99149">小さめのパッチ</a>を送ったりもしました。
自分の能力を示すためにも、Issueを立てたり、PRを投げたりするのは重要だと思います。</p>
<h1 id="your-proposal-has-been-accepted">Your proposal has been accepted!</h1>
<p>May/18/2021 (JST) の深夜に、以下のメールが届きました。</p>
<blockquote class="twitter-tweet"><p lang="ja"  dir="ltr">[報告]<br>一層精進していきます。 <a  href="https://t.co/2yuJePuOYi">pic.twitter.com/2yuJePuOYi</a></p>— uint256_t (@uint256_t) <a  href="https://twitter.com/uint256_t/status/1394347867628703746?ref_src=twsrc%5Etfw">May 17, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js"  charset="utf-8"></script> 
<p>受験が終わった時のような気分でした。
頑張ります。</p>
<h1 id="次回予告">次回予告</h1>
<p>丁度今日の深夜にメンターの方と話すので、何か面白い話題が生まれたら書きたい。</p>
]]></content>
        </item>
        
        <item>
            <title>Play with LLVM-IR, without LLVM</title>
            <link>https://maekawatoshiki.github.io/posts/vicis/</link>
            <pubDate>Sun, 02 May 2021 22:04:08 +0900</pubDate>
            
            <guid>https://maekawatoshiki.github.io/posts/vicis/</guid>
            <description>TL;DR LLVMの代替実装をRustで作っています。(ただの趣味)
これを使って LLVM-IR とじゃれ合ってみよう、という記事です。
LLVM-IRに触れる。LLVM抜きで。 インターネットで放浪してたら、このような記事を見つけました。
RustのLLVM IRでプログラム分析ことはじめ - Toshihiro YAMAGUCHI’s Diary
私はこれまでに、rustcの吐くLLVM-IRを直接見たことがほとんどありませんでした。丁度よい機会なので、LLVMの復習がてら記事と同じようなことをしようとしたのですが、ただ真似るだけでは面白くない。
そうだ、LLVMをRustで実装して、同じようなことをしよう
というわけで、趣味として LLVMをRustで再実装し始めました。(Vicisと名付けた) この記事では Vicis を使って、LLVM-IRを、LLVM抜きで触っていきます。
とりあえずプロジェクトを作る 記事の中では、モジュールに含まれる関数を列挙していました。これと同じことをやってみます。
cargo new viewer --bin # viewerというプロジェクトにします プロジェクトを作ったら、Cargo.tomlにVicisを追加しておきましょう。
... [dependencies] vicis = { path = &amp;#34;/path/to/vicis&amp;#34; } IRを読み込む Vicisは現在、LLVM Assemblyの一部にしか対応できていません。(bitcode対応など頑張ります&amp;hellip;)
src/main.rsを以下のように変更します。
use std::{env, fs::read_to_string}; use vicis::ir::module; fn main() { let args: Vec&amp;lt;String&amp;gt; = env::args().collect(); let file = &amp;amp;args[1]; let asm = read_to_string(file).expect(&amp;#34;failed to read .ll file&amp;#34;); let module = module::parse_assembly(asm.</description>
            <content type="html"><![CDATA[<h1 id="tldr">TL;DR</h1>
<p><a href="https://github.com/maekawatoshiki/vicis">LLVMの代替実装</a>をRustで作っています。(ただの趣味)</p>
<p>これを使って LLVM-IR とじゃれ合ってみよう、という記事です。</p>
<h1 id="llvm-irに触れるllvm抜きで">LLVM-IRに触れる。LLVM抜きで。</h1>
<p>インターネットで放浪してたら、このような記事を見つけました。</p>
<p><a href="https://toyamaguchi.hatenablog.com/entry/2019/12/22/080000">RustのLLVM IRでプログラム分析ことはじめ - Toshihiro YAMAGUCHI’s Diary</a></p>
<p>私はこれまでに、rustcの吐くLLVM-IRを直接見たことがほとんどありませんでした。丁度よい機会なので、LLVMの復習がてら記事と同じようなことをしようとしたのですが、ただ真似るだけでは面白くない。</p>
<p><em>そうだ、LLVMをRustで実装して、同じようなことをしよう</em></p>
<p>というわけで、趣味として <a href="https://github.com/maekawatoshiki/vicis">LLVMをRustで再実装し始めました。(Vicisと名付けた)</a>
この記事では Vicis を使って、LLVM-IRを、LLVM抜きで触っていきます。</p>
<h2 id="とりあえずプロジェクトを作る">とりあえずプロジェクトを作る</h2>
<p>記事の中では、モジュールに含まれる関数を列挙していました。これと同じことをやってみます。</p>
<pre tabindex="0"><code>cargo new viewer --bin # viewerというプロジェクトにします
</code></pre><p>プロジェクトを作ったら、<code>Cargo.toml</code>にVicisを追加しておきましょう。</p>
<pre tabindex="0"><code>...
[dependencies]
vicis = { path = &#34;/path/to/vicis&#34; }
</code></pre><h2 id="irを読み込む">IRを読み込む</h2>
<p>Vicisは現在、LLVM Assemblyの一部にしか対応できていません。(bitcode対応など頑張ります&hellip;)</p>
<p><code>src/main.rs</code>を以下のように変更します。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-rust" data-lang="rust"><span style="display:flex;"><span><span style="color:#66d9ef">use</span> std::{env, fs::read_to_string};
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">use</span> vicis::ir::module;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">fn</span> <span style="color:#a6e22e">main</span>() {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">let</span> args: Vec<span style="color:#f92672">&lt;</span>String<span style="color:#f92672">&gt;</span> <span style="color:#f92672">=</span> env::args().collect();
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">let</span> file <span style="color:#f92672">=</span> <span style="color:#f92672">&amp;</span>args[<span style="color:#ae81ff">1</span>];
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">let</span> asm <span style="color:#f92672">=</span> read_to_string(file).expect(<span style="color:#e6db74">&#34;failed to read .ll file&#34;</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">let</span> module <span style="color:#f92672">=</span> module::parse_assembly(asm.as_str()).expect(<span style="color:#e6db74">&#34;failed to parse module&#34;</span>);
</span></span><span style="display:flex;"><span>    println!(<span style="color:#e6db74">&#34;{:?}&#34;</span>, module);
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>これだけで、コマンドライン引数として渡した <code>*.ll</code>ファイルの中身をパースして、内部表現としての<code>Module</code>に変換できます。
さっそく動かしてみましょう。</p>
<h2 id="hello-world">Hello World</h2>
<p>RustでHello Worldを書いて、そのIRを見てましょう。<code>hello.rs</code>というファイルを用意します。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-rust" data-lang="rust"><span style="display:flex;"><span><span style="color:#75715e">// hello.rs
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">fn</span> <span style="color:#a6e22e">main</span>() {
</span></span><span style="display:flex;"><span>	println!(<span style="color:#e6db74">&#34;hello world&#34;</span>)
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>そして、<code>rustc</code>でコンパイルします。IRを出力する点に注意。</p>
<pre tabindex="0"><code>rustc +stable hello.rs -o hello.ll --emit llvm-ir
</code></pre><p>できあがった <code>hello.ll</code> を引数として渡してみましょう。</p>
<pre tabindex="0"><code>cargo run hello.ll 
</code></pre><p>おそらくとっても長いIRが出力されたと思います。成功です。</p>
<h2 id="解析">解析</h2>
<p>長いIRを目grepするのは大変なので、関数名と関数の引数の数を出力するパスを作ってみます。</p>
<p><code>main.rs</code>を以下のように修正します。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-rust" data-lang="rust"><span style="display:flex;"><span><span style="color:#66d9ef">use</span> std::{any::Any, env, fs::read_to_string};
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">use</span> vicis::{
</span></span><span style="display:flex;"><span>    ir::{function, module},
</span></span><span style="display:flex;"><span>    pass::{AnalysisPass, PassManager},
</span></span><span style="display:flex;"><span>};
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">fn</span> <span style="color:#a6e22e">main</span>() {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">let</span> args: Vec<span style="color:#f92672">&lt;</span>String<span style="color:#f92672">&gt;</span> <span style="color:#f92672">=</span> env::args().collect();
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">let</span> file <span style="color:#f92672">=</span> <span style="color:#f92672">&amp;</span>args[<span style="color:#ae81ff">1</span>];
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">let</span> asm <span style="color:#f92672">=</span> read_to_string(file).expect(<span style="color:#e6db74">&#34;failed to read .ll file&#34;</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">let</span> module <span style="color:#f92672">=</span> module::parse_assembly(asm.as_str()).expect(<span style="color:#e6db74">&#34;failed to parse module&#34;</span>);
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">let</span> <span style="color:#66d9ef">mut</span> pm <span style="color:#f92672">=</span> PassManager::new();
</span></span><span style="display:flex;"><span>    pm.add_analysis(FunctionPrinterPass);
</span></span><span style="display:flex;"><span>  pm.run_analyses_on_module(<span style="color:#f92672">&amp;</span>module);
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">pub</span> <span style="color:#66d9ef">struct</span> <span style="color:#a6e22e">FunctionPrinterPass</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">impl</span> AnalysisPass<span style="color:#f92672">&lt;</span>function::Function<span style="color:#f92672">&gt;</span> <span style="color:#66d9ef">for</span> FunctionPrinterPass {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">fn</span> <span style="color:#a6e22e">run_on</span>(<span style="color:#f92672">&amp;</span>self, func: <span style="color:#66d9ef">&amp;</span><span style="color:#a6e22e">function</span>::Function, _result: <span style="color:#66d9ef">&amp;</span><span style="color:#a6e22e">mut</span> Box<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">dyn</span> Any<span style="color:#f92672">&gt;</span>) {
</span></span><span style="display:flex;"><span>        println!(
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;Visit: {} (takes {} args)&#34;</span>,
</span></span><span style="display:flex;"><span>            func.name(),
</span></span><span style="display:flex;"><span>            func.params().len()
</span></span><span style="display:flex;"><span>        );
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>パスマネージャとかの実装がまだまだ適当です。それはさておいて、実行すると以下のように表示されるはずです。</p>
<pre tabindex="0"><code>Visit: _ZN3std10sys_common9backtrace28__rust_begin_short_backtrace17h2840e0051141d5fcE (takes 1 args)
Visit: _ZN3std2rt10lang_start17h2fcf2a95611b6d93E (takes 3 args)
Visit: &#34;_ZN3std2rt10lang_start28_$u7b$$u7b$closure$u7d$$u7d$17h642830c734a0a093E&#34; (takes 1 args)
Visit: _ZN3std3sys4unix7process14process_common8ExitCode6as_i3217he311503d36a1dd10E (takes 1 args)
Visit: _ZN4core3fmt9Arguments6new_v117h8a113b20b098f88cE (takes 5 args)
Visit: &#34;_ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h32e55b47309d557aE&#34; (takes 1 args)
Visit: _ZN4core3ops8function6FnOnce9call_once17h2daf67ca1036ee98E (takes 1 args)
Visit: _ZN4core3ops8function6FnOnce9call_once17hcf10f9084cb14a26E (takes 1 args)
Visit: &#34;_ZN4core3ptr85drop_in_place$LT$std..rt..lang_start$LT$$LP$$RP$$GT$..$u7b$$u7b$closure$u7d$$u7d$$GT$17h74f0928264863a31E&#34; (takes 1 args)
Visit: _ZN4core4hint9black_box17h5fe2e550e252fbc3E (takes 0 args)
Visit: &#34;_ZN54_$LT$$LP$$RP$$u20$as$u20$std..process..Termination$GT$6report17h8ac75e0172be52beE&#34; (takes 0 args)
Visit: &#34;_ZN68_$LT$std..process..ExitCode$u20$as$u20$std..process..Termination$GT$6report17h63a57c0453f08cd5E&#34; (takes 1 args)
Visit: _ZN5hello4main17h391fdbb81e062d23E (takes 0 args)
Visit: rust_eh_personality (takes 5 args)
Visit: _ZN3std2rt19lang_start_internal17hd5b67df56ca01daeE (takes 4 args)
Visit: _ZN3std2io5stdio6_print17hfdac4ecf8a146755E (takes 1 args)
Visit: main (takes 2 args)
</code></pre><p>ちゃんと関数名と引数の数が表示されました。成功です。</p>
<h1 id="終わりに">終わりに</h1>
<p>Vicisはまだまだ実装されていない機能が沢山あります。Issue&amp;PR いつでも歓迎です。</p>
]]></content>
        </item>
        
        <item>
            <title>コンパイラと私</title>
            <link>https://maekawatoshiki.github.io/posts/compilerandi/</link>
            <pubDate>Thu, 29 Apr 2021 22:42:05 +0900</pubDate>
            
            <guid>https://maekawatoshiki.github.io/posts/compilerandi/</guid>
            <description>ここでは、私がどのようにして「コンパイラ」というものを認識し、そして夢中になったのかについて書いていこうと思う。
私が初めてプログラミングを体験したのは小学6年生のころだった。C言語を使って Hello World を画面（ターミナル、そのころは Windows を使っていたからコマンドプロンプトだった）に表示するという、いたって典型的な入門だった。正直あまり面白くなかったし、そもそもキーボードが打てない、ファイルをどこに保存したのかわからない、というレベルだった。
そんなレベルの私がなぜC言語を始めたかというと、もともと簡単な電子工作をしており、次はロボットを動かしたかったからである。C言語以外の言語を知らなかった私は、親に「猫でもわかるC言語プログラミング」を買ってもらい、どうにか Hello World をコンパイルできる程度の環境を構築したというわけだ。
それ以降の小学6年生の記憶はかなり曖昧だが、たしかある程度C言語を使えるようになり、Win32 APIでウィンドウを表示するサンプルが動いて喜んでいたと思う。同時に、「なぜこの英語の文章（＝プログラム）がウィンドウを表示したりできるんだ？」といった純粋な疑問も持っていた。「コンパイラ」という単語はうっすらと認識していたが、どちらかと言えば「コンパイルして実行」のような連続した語として記憶していたため、まだコンパイラというソフトウェア自体にはあまり興味を示していなかったと思う。
中学1年生になると、すっかりロボットを動かすという目標を忘れ、GUIプログラミングを楽しんでいた。 （物理的にも処理速度的にも）重たいパソコン上で Visual Studio を動かし、C言語を書いていた。F5を押せばプログラムは動いた。そこにコンパイラはなく、その存在は統合開発環境が隠蔽していた。 そのうちに HSP (Hot Soup Processor) を知り、簡単に GUI プログラミングができると興奮し、かなりの数のくだらないソフトウェアを作ったと思う。画面キャプチャ、ただファイルをゴミ箱に送るだけのソフト、画面端で常駐する電卓、円周率を計算するやつ&amp;hellip;..
そう、HSP で円周率を計算し始めたことで気づいた。HSP は遅い。C言語は速かったのに。
そのころになってようやく、世の中にはコンパイル型言語とインタプリタ型言語というものがあると知った。いや、知ったというよりは実感したと言うべきだろうか。とにかく、コンパイラというものに惹かれ始めたのは中学1年生のかなり後半だったと思う。ここから、私とコンパイラとの関係が始まったのだと思う。
最初のうちは、Ruby の VM に興味を持っていた。なぜ Ruby なのかはよく覚えていないが、おそらく英語が読めない私にとって、日本語の資料が落ちていたのは魅力的だったのだろう。YARV の内部構造を説明するサイト（たぶんこのあたり）に釘付けだった。この文章を書きながらリンク先を眺めていたが、今見ても面白い。第3回：命令ディスパッチの話は、当時は理解こそできなかったものの、こんなことができるのか！すごい！と興味津々だった。これが中学2年生の初めの話。
インタプリタやコンパイラのことを認識した以上、何らかの言語を作りたくなるのは避けられない。 （実は HSP で電卓を作っていた頃に、小さな言語のようなものは作っていたが、BASIC よりもしょぼい文法で、AST すら知らなかったためぐちゃぐちゃのコードだったと記憶している。もう手元にはコードが残っていない。そのコードが入っている80GB HDDは分解して、ディスクを手裏剣のように投げて遊んでいた。） 今手元に残っている言語処理系で、一番古いものは Lit だ。いつのまにか C++ を覚えたようで、C++ で書いてあるし、なんとご丁寧にGitHubに置いてある。 まったく思い出せないが、どうにかgitやGitHubの使い方を覚えたようである。最初のコミットは中学2年生の夏休み頃となっている。 Lit は Ruby っぽい言語で、なんと JIT コンパイルできる。初期は手動でアセンブラ（と言っても命令に対応する16進数をハードコードしているだけだが）のようなものを書いており、それを使って JIT していたようだ。結局 LLVM を導入してしまったようだが。そもそもどのような経緯でLLVMを知ったのかも思い出せない。
中学3年生になると、ほとんど理解できていなかったと思われるが、Python や Clang を読んでいたような気がする。また、中学生が終わろうとしているときに、CMake があまりにも嫌いで C++ ごと捨ててしまった。同時に Rust を本格的に使い始めた。</description>
            <content type="html"><![CDATA[<p>ここでは、私がどのようにして「コンパイラ」というものを認識し、そして夢中になったのかについて書いていこうと思う。</p>
<p>私が初めてプログラミングを体験したのは小学6年生のころだった。C言語を使って <code>Hello World</code> を画面（ターミナル、そのころは Windows を使っていたからコマンドプロンプトだった）に表示するという、いたって典型的な入門だった。正直あまり面白くなかったし、そもそもキーボードが打てない、ファイルをどこに保存したのかわからない、というレベルだった。</p>
<p>そんなレベルの私がなぜC言語を始めたかというと、もともと簡単な電子工作をしており、次はロボットを動かしたかったからである。C言語以外の言語を知らなかった私は、親に「猫でもわかるC言語プログラミング」を買ってもらい、どうにか Hello World をコンパイルできる程度の環境を構築したというわけだ。</p>
<p>それ以降の小学6年生の記憶はかなり曖昧だが、たしかある程度C言語を使えるようになり、Win32 APIでウィンドウを表示するサンプルが動いて喜んでいたと思う。同時に、「なぜこの英語の文章（＝プログラム）がウィンドウを表示したりできるんだ？」といった純粋な疑問も持っていた。「コンパイラ」という単語はうっすらと認識していたが、どちらかと言えば「コンパイルして実行」のような連続した語として記憶していたため、まだコンパイラというソフトウェア自体にはあまり興味を示していなかったと思う。</p>
<p>中学1年生になると、すっかりロボットを動かすという目標を忘れ、GUIプログラミングを楽しんでいた。
（物理的にも処理速度的にも）重たいパソコン上で Visual Studio を動かし、C言語を書いていた。F5を押せばプログラムは動いた。そこにコンパイラはなく、その存在は統合開発環境が隠蔽していた。
そのうちに HSP (Hot Soup Processor) を知り、簡単に GUI プログラミングができると興奮し、かなりの数のくだらないソフトウェアを作ったと思う。画面キャプチャ、ただファイルをゴミ箱に送るだけのソフト、画面端で常駐する電卓、円周率を計算するやつ&hellip;..</p>
<p>そう、HSP で円周率を計算し始めたことで気づいた。HSP は遅い。C言語は速かったのに。</p>
<p>そのころになってようやく、世の中にはコンパイル型言語とインタプリタ型言語というものがあると知った。いや、知ったというよりは実感したと言うべきだろうか。とにかく、コンパイラというものに惹かれ始めたのは中学1年生のかなり後半だったと思う。ここから、私とコンパイラとの関係が始まったのだと思う。</p>
<p>最初のうちは、Ruby の VM に興味を持っていた。なぜ Ruby なのかはよく覚えていないが、おそらく英語が読めない私にとって、日本語の資料が落ちていたのは魅力的だったのだろう。YARV の内部構造を説明するサイト（たぶん<a href="https://magazine.rubyist.net/articles/0007/0007-YarvManiacs.html">このあたり</a>）に釘付けだった。この文章を書きながらリンク先を眺めていたが、今見ても面白い。第3回：命令ディスパッチの話は、当時は理解こそできなかったものの、こんなことができるのか！すごい！と興味津々だった。これが中学2年生の初めの話。</p>
<p>インタプリタやコンパイラのことを認識した以上、何らかの言語を作りたくなるのは避けられない。
（実は HSP で電卓を作っていた頃に、小さな言語のようなものは作っていたが、BASIC よりもしょぼい文法で、AST すら知らなかったためぐちゃぐちゃのコードだったと記憶している。もう手元にはコードが残っていない。そのコードが入っている80GB HDDは分解して、ディスクを手裏剣のように投げて遊んでいた。）
今手元に残っている言語処理系で、一番古いものは <a href="https://github.com/maekawatoshiki/lit-x86">Lit</a> だ。いつのまにか C++ を覚えたようで、C++ で書いてあるし、なんとご丁寧にGitHubに置いてある。
まったく思い出せないが、どうにかgitやGitHubの使い方を覚えたようである。最初のコミットは中学2年生の夏休み頃となっている。
Lit は Ruby っぽい言語で、なんと JIT コンパイルできる。初期は手動でアセンブラ（と言っても命令に対応する16進数をハードコードしているだけだが）のようなものを書いており、それを使って JIT していたようだ。結局 LLVM を導入してしまったようだが。そもそもどのような経緯でLLVMを知ったのかも思い出せない。</p>
<p>中学3年生になると、ほとんど理解できていなかったと思われるが、Python や Clang を読んでいたような気がする。また、中学生が終わろうとしているときに、CMake があまりにも嫌いで C++ ごと捨ててしまった。同時に Rust を本格的に使い始めた。</p>
<p>そろそろこの文章を書くのも疲れてきた。ここからは簡潔にまとめよう。</p>
<p>高校生になると、本当に色々なことがあった。入門したての Rust でいきなり C言語のコンパイラを作ったり (8ccには本当にお世話になりました) 。 ブラウザを作ったり。JavaScript処理系を作ったり。JVMを作ったり。.NET VMを作ったり。型システムにも少しだけ詳しくなった。受験が嫌でコンパイラ基盤を作ったりもした。そうそう、<a href="https://prog-lang-sys-ja-slack.github.io/wiki/">プログラミング言語処理系が好きな人の集まり</a>というSlackワークスペースも開いた。受験期なのに地下鉄でLLVMのソースコードリーディングをしていた。</p>
<p>そして大学生になった。流行り病のことは完全に予想外だった。一年間完全にオンラインだったこともあり、家でずっとコンパイラのことを考えていられる生活ができたのは良かったかもしれない。これからもコンパイラのことを考え続けるだろう。</p>
<p>しかし、ひとつだけわからないのは、私はコンパイラの何が好きなのかということだ。ただ漠然と、好き、という感情があるだけで、それ以上何もない。
今後しばらくは、コンパイラの何に惹かれているのかを考えることになりそうだ。</p>
]]></content>
        </item>
        
        <item>
            <title>Third</title>
            <link>https://maekawatoshiki.github.io/posts/third/</link>
            <pubDate>Sun, 28 Feb 2021 23:30:39 +0900</pubDate>
            
            <guid>https://maekawatoshiki.github.io/posts/third/</guid>
            <description></description>
            <content type="html"><![CDATA[]]></content>
        </item>
        
        <item>
            <title>Second</title>
            <link>https://maekawatoshiki.github.io/posts/second/</link>
            <pubDate>Sun, 28 Feb 2021 23:26:09 +0900</pubDate>
            
            <guid>https://maekawatoshiki.github.io/posts/second/</guid>
            <description>my second page</description>
            <content type="html"><![CDATA[<p>my second page</p>
]]></content>
        </item>
        
        <item>
            <title>Welcome!!</title>
            <link>https://maekawatoshiki.github.io/posts/welcome/</link>
            <pubDate>Sun, 28 Feb 2021 14:00:00 +0000</pubDate>
            
            <guid>https://maekawatoshiki.github.io/posts/welcome/</guid>
            <description>hello world</description>
            <content type="html"><![CDATA[<p>hello world</p>
]]></content>
        </item>
        
    </channel>
</rss>
