<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>nownab.log</title><description>the nownabe&apos;s life log</description><link>https://blog.nownabe.com/</link><language>ja-JP</language><item><title>ブログのデザインを変えた (2026 年版)</title><link>https://blog.nownabe.com/redesign-2026/</link><guid isPermaLink="true">https://blog.nownabe.com/redesign-2026/</guid><description>ブログのデザインを一新しました。前回変えたのは2023年なので、3年ぶりのデザイン刷新です。だいぶ見やすくなったのではないかと思います。 前回変えてから書いた記事が5件しかなかったので、もう少し記事を増やしたい。</description><pubDate>Sun, 20 Sep 2026 04:01:23 GMT</pubDate><content:encoded>&lt;p&gt;ブログのデザインを一新しました。&lt;a href=&quot;https://blog.nownabe.com/2023/07/09/update-design-2023/&quot;&gt;前回変えた&lt;/a&gt;のは2023年なので、3年ぶりのデザイン刷新です。だいぶ見やすくなったのではないかと思います。&lt;/p&gt;
&lt;p&gt;前回変えてから書いた記事が5件しかなかったので、もう少し記事を増やしたい。&lt;/p&gt;
</content:encoded><category>blog</category></item><item><title>開発環境式年遷宮 (2026年)</title><link>https://blog.nownabe.com/dev-env-2026/</link><guid isPermaLink="true">https://blog.nownabe.com/dev-env-2026/</guid><description>ローカル開発環境を式年遷宮しようと思い、既存の設定をすべて見直して一から作り直した結果、以前とほぼ同じになった。あまり変わらなかったが記録として残しておく。 今まで開発環境について記事を書いたことがなかった気がするので、今までの開発環境の変遷も思い出せる限り振り返ってみようかと思う。 複数の同僚から WezTerm や…</description><pubDate>Mon, 23 Feb 2026 13:45:00 GMT</pubDate><content:encoded>&lt;p&gt;ローカル開発環境を式年遷宮しようと思い、既存の設定をすべて見直して一から作り直した結果、以前とほぼ同じになった。あまり変わらなかったが記録として残しておく。&lt;/p&gt;
&lt;p&gt;今まで開発環境について記事を書いたことがなかった気がするので、今までの開発環境の変遷も思い出せる限り振り返ってみようかと思う。&lt;/p&gt;
&lt;h2 id=&quot;きっかけ&quot;&gt;きっかけ&lt;/h2&gt;
&lt;p&gt;複数の同僚から WezTerm や Nix の Home Manager を勧められていたところに、貸与 PC のリプレースのタイミングが重なり、SRE Kaigi でもらった熱量を活かして開発環境を見直すことにした。&lt;/p&gt;
&lt;h2 id=&quot;os&quot;&gt;OS&lt;/h2&gt;
&lt;p&gt;WSL (Ubuntu) のまま。特に移行はなし。&lt;/p&gt;
&lt;p&gt;OS についてはこんな感じの変遷のはず。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows XP ～ 7&lt;/li&gt;
&lt;li&gt;Mac OS X&lt;/li&gt;
&lt;li&gt;Ubuntu&lt;/li&gt;
&lt;li&gt;WSL (Ubuntu)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Windows 時代から Dual Boot で RedHat 系の Linux を入れて、開発ではそちらを使っていた。CentOS や Fedora が多かったと思う。他にもドラゴンがテーマでやたら GUI がぐりんぐりんするオレオレディストリなんかも使ってみたりしていたが、結局はメジャーかつ標準で使いやすいものということで Ubuntu に落ち着いた。Docker で Debian が使われることが多かったのもある。WSL2 が安定してからは、Dual Boot もめんどくさかったのでやめて WSL 一本でやっている。&lt;/p&gt;
&lt;p&gt;Mac は勤務先から貸与される PC が Mac だったので個人でも買って使ってみてた事はあるが、Linux 以上の魅力が感じられずに Linux に戻った。&lt;/p&gt;
&lt;p&gt;本当は WSL ではなく素の Ubuntu を使いたいが、ゲームをするために Windows を使っている。&lt;/p&gt;
&lt;h2 id=&quot;dotfiles&quot;&gt;dotfiles&lt;/h2&gt;
&lt;p&gt;dotfiles というか、ローカル開発環境の構築というか。Chezmoi から Nix Home Manager に移行した。&lt;/p&gt;
&lt;p&gt;Chezmoi は 2 年前ぐらいから使い始めたが、Home Manager のほうが AI と相性が良さそうと感じて乗り換えた。&lt;/p&gt;
&lt;p&gt;今までの方法を思い出せる限り時系列順で並べてみるとこんな感じ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;シェルスクリプト&lt;/li&gt;
&lt;li&gt;itamae-go&lt;/li&gt;
&lt;li&gt;mitamae&lt;/li&gt;
&lt;li&gt;Chezmoi&lt;/li&gt;
&lt;li&gt;Home Manager&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;mitamae 時代が一番長く気に入っていたが、ほぼ OS の差を考えることもなくなったのでよりシンプルな Chezmoi に移行して、今回 Home Manager に移行したという流れ。&lt;/p&gt;
&lt;h2 id=&quot;エディタ&quot;&gt;エディタ&lt;/h2&gt;
&lt;p&gt;Neovim から Neovim になった。AstroNvim v4 を使っていたのが v5 になった。&lt;/p&gt;
&lt;p&gt;以前は AstroNvim v4 をカスタマイズして使っていて、Telescope を snacks.picker に置き換えたいなど変えたいところがちょこちょこあり最初は自分でコンフィグをすべて書こうと頑張っていたが、面倒すぎたのと AstroNvim v5 で十分なことに気付いたので AstroNvim バージョンアップに落ち着いた。ただ、コンフィグは使い回さずに一から書き直した。&lt;/p&gt;
&lt;p&gt;AstroNvim v4 時代は Cline や Cursor の盛り上がりで一瞬 VS Code を頑張って使ってみたりもしたが、Claude Code のおかげで Neovim に戻ることができた。感謝。&lt;/p&gt;
&lt;p&gt;メインで使っていたエディタをだいたい時系列順に並べると多分こんな感じ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;メモ帳&lt;/li&gt;
&lt;li&gt;TeraPad&lt;/li&gt;
&lt;li&gt;サクラエディタ&lt;/li&gt;
&lt;li&gt;Emacs&lt;/li&gt;
&lt;li&gt;秀丸 (Tex、プログラミング)&lt;/li&gt;
&lt;li&gt;Aptana Studio (Ruby)&lt;/li&gt;
&lt;li&gt;NetBeans (Ruby)&lt;/li&gt;
&lt;li&gt;Vim&lt;/li&gt;
&lt;li&gt;Neovim&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vim をメインにし始めたのは、サーバーで作業することが増えて Vim で揃えるか、というのがきっかけだったと思う。Atom や Sublime Text、VS Code なども試しつつ、Vim (Neovim) を使い続けている。&lt;/p&gt;
&lt;h2 id=&quot;ターミナル&quot;&gt;ターミナル&lt;/h2&gt;
&lt;p&gt;基本は OS デフォルトのターミナルを使っている。今は Windows Terminal。&lt;/p&gt;
&lt;p&gt;今回、WezTerm を試してみたが結局 Windows Terminal に落ち着いた。WezTerm は Lua で設定できるのが魅力的かつ、マルチプレクサの機能も持っていて tmux のレイヤーなくせるんじゃね、と野望を抱き結構頑張って設定したが、表示がバグる問題が致命的で本格採用できなかった。しばらく WezTerm を使ってみたが、マルチプレクサの機能が tmux に慣れていたためかしっくりこなかったので、落ち着くところに落ち着いた気はする。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.nownabe.com/images/dev-env-2026/wezterm-bug.png&quot; alt=&quot;wezterm omg&quot;&gt;&lt;/p&gt;
&lt;p&gt;これはバグった WezTerm 上の Neovim でファイルの保存を試みているところ。&lt;/p&gt;
&lt;h2 id=&quot;ターミナルマルチプレクサ&quot;&gt;ターミナルマルチプレクサ&lt;/h2&gt;
&lt;p&gt;今まで tmux wrapper の byobu を使っていたが、byobu をやめて素の tmux に移行した。&lt;/p&gt;
&lt;p&gt;以前から byobu はやめたいと考えていたが、WezTerm の経由がきっかけでやめられてスッキリした。&lt;/p&gt;
&lt;p&gt;byobu 以前は screen を使っていた。&lt;/p&gt;
&lt;h2 id=&quot;シェル&quot;&gt;シェル&lt;/h2&gt;
&lt;p&gt;zsh から変わらず。ただし、AI と Home Manager によって zplug が不要になった。&lt;/p&gt;
&lt;p&gt;Vim を使い始めた頃に zsh を使い始めて、それ以前は bash を使っていた。&lt;/p&gt;
&lt;h2 id=&quot;ai-agent&quot;&gt;AI Agent&lt;/h2&gt;
&lt;p&gt;Claude Max を契約して Claude Code をメインで使っている。使い方としてはシェルで起動して使うのがメイン。Neovim から sidekick.nvim 経由で呼び出すこともある。&lt;/p&gt;
&lt;h2 id=&quot;あとがき&quot;&gt;あとがき&lt;/h2&gt;
&lt;p&gt;AI のおかげで開発環境を一から構築し直すというのもだいぶ楽だった。
開発環境構築のような作業もなくなっていくんだろうか。&lt;/p&gt;
</content:encoded></item><item><title>2024 年の抱負</title><link>https://blog.nownabe.com/resolution-2024/</link><guid isPermaLink="true">https://blog.nownabe.com/resolution-2024/</guid><description>バナー画像は Stable Diffusion と Canva で作った。 上から優先順位が高い。 自分の健康。健康がないとなにもできない。今は肉体がボロボロなので回復したい。</description><pubDate>Thu, 04 Jan 2024 02:02:08 GMT</pubDate><content:encoded>&lt;p&gt;バナー画像は Stable Diffusion と Canva で作った。&lt;/p&gt;
&lt;h2 id=&quot;やるぞ&quot;&gt;やるぞ&lt;/h2&gt;
&lt;p&gt;上から優先順位が高い。&lt;/p&gt;
&lt;h3 id=&quot;1-健康になる&quot;&gt;1. 健康になる&lt;/h3&gt;
&lt;p&gt;自分の健康。健康がないとなにもできない。今は肉体がボロボロなので回復したい。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/B07XV8VSZT?tag=nownabe02-22&quot;&gt;リングフィットアドベンチャー&lt;/a&gt; をクリアする&lt;/li&gt;
&lt;li&gt;整体に通う
&lt;ul&gt;
&lt;li&gt;2 週間に 1 回のペースをキープしたい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;時間外労働を 10 時間/月に抑える
&lt;ul&gt;
&lt;li&gt;残業は健康の敵&lt;/li&gt;
&lt;li&gt;そもそも自分が何時間働いてるかよくわからない問題なんとかしなきゃ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-家族の健康を守る&quot;&gt;2. 家族の健康を守る&lt;/h3&gt;
&lt;p&gt;妻と犬の健康。3 人とも虚弱体質で不健康なので健康でいられる術を模索中。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;労働時間を減らしつつ収入を上げる
&lt;ul&gt;
&lt;li&gt;最も家族の健康に寄与するのは自由な時間と金&lt;/li&gt;
&lt;li&gt;具体的には残業しない、プロモーションする、ぐらいしか思いついてない&lt;/li&gt;
&lt;li&gt;本業以外に何かもう一軸欲しい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;夕方に散歩する
&lt;ul&gt;
&lt;li&gt;2023 年後半は仕事で犬の散歩が遅くなった日が多かったので日が沈む前に散歩する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3-ずとまよのライブに行く&quot;&gt;3. ずとまよのライブに行く&lt;/h3&gt;
&lt;p&gt;貴重な生命力源。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;忘れずチケットに応募する
&lt;ul&gt;
&lt;li&gt;当たれ 🙏&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;4-仕事を頑張る&quot;&gt;4. 仕事を頑張る&lt;/h3&gt;
&lt;p&gt;1 と 2 のために必要。
とはいえ今のところは意外なことに仕事に対するモチベは高い。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;プロモーションする
&lt;ul&gt;
&lt;li&gt;以前は全く興味なかったけど、より大きな責任と裁量を持って大きな結果を生み出したいという欲が芽生えてきた&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dxd2023.cto-a.org/dxaward&quot;&gt;開発者体験がよさそうな会社&lt;/a&gt; としてナレッジワークが認知されるようにする
&lt;ul&gt;
&lt;li&gt;外から見える Platform Engineering の結果のひとつかな、と&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;5-英語の勉強を再開する&quot;&gt;5. 英語の勉強を再開する&lt;/h3&gt;
&lt;p&gt;生きていく上で圧倒的に有利。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1 月から毎日勉強再開する
&lt;ul&gt;
&lt;li&gt;勉強内容はなんでも。1 秒以上やれば OK&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/4900790052?tag=nownabe02-22&quot;&gt;DUO 3.0&lt;/a&gt; を 5 周する&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/4327764876?tag=nownabe02-22&quot;&gt;英文解釈教室&lt;/a&gt; をやりきる&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://app.busuu.com/4Lq1fUH8KHyG4QkM7&quot;&gt;Busuu&lt;/a&gt; を毎日やる&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://share.elsanow.io/3U45UuS2ZFb&quot;&gt;ELSA Speak&lt;/a&gt; を毎日やる&lt;/li&gt;
&lt;li&gt;カランメソッドを週 2 でやる
&lt;ul&gt;
&lt;li&gt;自分にあってそうなら年間通してやる&lt;/li&gt;
&lt;li&gt;1 年で Stage 4 終わるぐらいだろうか&lt;/li&gt;
&lt;li&gt;あってなかったら他になにかやる。&lt;a href=&quot;https://www.amazon.co.jp/dp/B09NY53725?tag=nownabe02-22&quot;&gt;英語のハノン 初級&lt;/a&gt;、&lt;a href=&quot;https://www.amazon.co.jp/dp/B09Y5N53N6?tag=nownabe02-22&quot;&gt;英語のハノン 中級&lt;/a&gt; とかかな&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/B09B8LFKQL?tag=nownabe02-22&quot;&gt;A Philosophy of Software Design, 2nd Edition&lt;/a&gt; を読む
&lt;ul&gt;
&lt;li&gt;英語の本を 1 冊通して読み切ったことないので読み切りたい&lt;/li&gt;
&lt;li&gt;興味のある分野かつ読みやすそうな本&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;6-スプラトゥーンを頑張る&quot;&gt;6. スプラトゥーンを頑張る&lt;/h3&gt;
&lt;p&gt;経験上ゲームをしないと息が詰まって死ぬことがわかってる。
長くやってる趣味なのでせっかくなら目的を持ってやってみようかと。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;サーモンランで全ステージカンストする
&lt;ul&gt;
&lt;li&gt;土日でよっぽどひどい編成じゃないときにやる&lt;/li&gt;
&lt;li&gt;残りは&lt;del&gt;アラマキ砦&lt;/del&gt;、シェケナダム、トキシラズいぶし工房&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;X パワー2500
&lt;ul&gt;
&lt;li&gt;X マッチやる&lt;/li&gt;
&lt;li&gt;今の最高 XP はガチホコの 2306.3&lt;/li&gt;
&lt;li&gt;どうやって 200 あげようか。配信とかして喋りながらやると上がるだろうか&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;7-本を読む&quot;&gt;7. 本を読む&lt;/h3&gt;
&lt;p&gt;本を読む習慣がないので本を読むをしたい。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;なんでもいいから 2 ヶ月に 1 冊ペースで読む&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;8-攻めの株を始める&quot;&gt;8. 攻めの株を始める&lt;/h3&gt;
&lt;p&gt;労働以外から収入を得たい。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;新 NISA の年間投資枠を埋めてから信用取引をやってみる
&lt;ul&gt;
&lt;li&gt;スイングトレード想定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;やらないこと&quot;&gt;やらないこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;だらだら YouTube&lt;/li&gt;
&lt;li&gt;だらだらスマホゲーム&lt;/li&gt;
&lt;li&gt;だらだら X マッチ&lt;/li&gt;
&lt;li&gt;だらだら SNS&lt;/li&gt;
&lt;li&gt;義務シャケ&lt;/li&gt;
&lt;li&gt;無駄遣い&lt;/li&gt;
&lt;li&gt;なんとなくものを増やす&lt;/li&gt;
&lt;li&gt;夜更かし&lt;/li&gt;
&lt;li&gt;競プロ
&lt;ul&gt;
&lt;li&gt;やりたかったけどできそうにない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;おわりに&quot;&gt;おわりに&lt;/h2&gt;
&lt;p&gt;目標立てすぎて何もできなかったにならないように頑張る。
根を詰めすぎると健康を損なうということもわかったので優先順位に従って頑張る。&lt;/p&gt;
&lt;p&gt;とりあえず、記事書き始めてから書き終わるまでにアラマキ砦でカンストしたので幸先はよさそう。&lt;/p&gt;
</content:encoded><category>resolution</category></item><item><title>2023 年を振り返る</title><link>https://blog.nownabe.com/2023/12/31/wrapping-2023-up/</link><guid isPermaLink="true">https://blog.nownabe.com/2023/12/31/wrapping-2023-up/</guid><description>2023 年の振り返りです。とりとめなく、雑に時系列で振り返って感想を書いています。まったくまとまってないです。 仕事パートは「元 Googler が Knowledge Work に入社して2ヶ月経った」の続編でもあり「マンタローに勇気をもらって Google Cloud を辞めた話」へのアンサー記事でもあります。 …</description><pubDate>Sat, 30 Dec 2023 18:13:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;はじめに&quot;&gt;はじめに&lt;/h2&gt;
&lt;p&gt;2023 年の振り返りです。とりとめなく、雑に時系列で振り返って感想を書いています。まったくまとまってないです。&lt;/p&gt;
&lt;p&gt;仕事パートは「&lt;a href=&quot;https://blog.nownabe.com/2023/09/06/joined-knowledge-work/&quot;&gt;元 Googler が Knowledge Work に入社して2ヶ月経った&lt;/a&gt;」の続編でもあり「&lt;a href=&quot;https://blog.nownabe.com/2023/06/17/leaving-google-cloud/&quot;&gt;マンタローに勇気をもらって Google Cloud を辞めた話&lt;/a&gt;」へのアンサー記事でもあります。&lt;/p&gt;
&lt;h2 id=&quot;仕事&quot;&gt;仕事&lt;/h2&gt;
&lt;h3 id=&quot;ざっくり振り返る&quot;&gt;ざっくり振り返る&lt;/h3&gt;
&lt;p&gt;2022 年末ごろから転職活動を始めました。第一候補は Google 社内での Software Engineer 職への異動でしたが、それに限らず他の会社のカジュアル面談などもやっていました。&lt;/p&gt;
&lt;p&gt;2023 年 1 月、今所属しているナレッジワークの選考を始めました。Google 社内での職も変わらず探していて、社内転職サイトで良さそうな open position を見つけて応募しようとレジュメを用意していたんですが、次の日見るとその position の hiring manager はレイオフされていました。大規模レイオフにより社内転職サイトは機能しなくなり、日本ではいつあるんだ誰が対象なんだと不安な空気が漂い始めました。&lt;/p&gt;
&lt;p&gt;2 月はそんな空気の中淡々と仕事をしていました。Google の採用に関してはいろんな噂があったものの、2 月中も採用はしておらず、計画もまったく不明という状態でした。&lt;/p&gt;
&lt;p&gt;3 月、日本でのレイオフも始まりました。アメリカのようにチームメイトが急にいなくなるということはないですが、チームメイトがいなくなるという噂が届き始めました。
パフォーマンスも行動も問題なく、むしろいつも頼りにしていた同僚との今後について相談する 1 on 1 でレイオフ対象になったと聞いたときの衝撃は今でも覚えています。
30 分のミーティング時間「まじすか」と言い続けて終わりました。
事前に様々な材料からの推測で自分たちにそこまで大きな影響はないだろう噂されていたこともあり、自分のすぐ近くで相当数の同僚がレイオフ宣告されたことは非常にショックでした。
結構ガチ目にショックを受けてガチ沈みしてました。仕事関係で生じた感情の大きさでいうと圧倒的な歴代一位ですね。
完全にキャパオーバーでこんな状態で仕事と転職活動と一緒に続けられないということで、通っていた英語教室は辞めてしまいました。&lt;/p&gt;
&lt;p&gt;自分が他人のことでこんなにショックを受けるのかというのは発見でもありました。レイオフってつらいんですね。外資で働き続けるとそのうち慣れるんでしょうか。&lt;/p&gt;
&lt;p&gt;4 月、チームメイトもレイオフされ、採用もいまだ再開する気配がないということで、気持ちは Google 社外への転職にかなり傾いていました。ナレッジワークの選考は着々と進んでいて、オファーをもらい、ゴールデンウィーク明けに返事をしなければいけないという状態でした。それでも「Google で今得られていてこれからも得られるであろうもの」と「Google では今は得られてないけどナレッジワークでこれから得られるであろうもの」を天秤にかけて結論を出せないでいました。&lt;/p&gt;
&lt;p&gt;来る 5 月 6 日、スプラトゥーン 3 でゼルダの伝説とのコラボフェスが始まりました。そしてマンタローの「エイエイエイ！エイ！」というセリフに感銘を受けてナレッジワークへの転職を決意しました&lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;
&lt;p&gt;6 月、転職を決める前にやると言っていたことはやりきろうということで、有給消化もほとんどなく、最終出社日までお客さんとのワークショップをやっていました。
有給日数はだいぶ残ってたので休んでおけばよかったという気持ちもありつつ、なんとなくフェードアウトするのではなく最終日もがっつり仕事して辞めたのは自分らしくもあったし、やり切った満足感もあります。&lt;/p&gt;
&lt;p&gt;最終出社して入社するまでの間に、社会人になってから初めて金髪にしました。これの背景には転職に伴う 2 つの決意がありました。
この 2 つの決意は今までの自分の行動とナレッジワークでの自分の行動を明確に隔てているものでもあります。&lt;/p&gt;
&lt;p&gt;1 つ目は、今まで培ったものすべてを賭して次の会社のビジネスアウトプットに貢献しようという決意です。あまりうまく言語化できてません。
今までももちろん本気で仕事をしていたし、比較的オーナーシップを持って結果を出してきたとは思いますが、ビジネスとしてのアウトプットを見ていた訳ではないし、やりたくないことはできるだけやりたくなかったし、組織やマネージャーに甘えていた部分もありました。
Google という最高の環境からスタートアップという刺激的な環境に移るんだから、せっかくならそういう甘えを捨てて自分が持つ武器すべてを使って目線を上げて闘ってみよう、という決意です。
下手な仕事ができないように追い込むという意味で目立つ外見にしました。金髪で下手な仕事してると「Google から来たやつがろくに仕事もできないのにイキってる」となるじゃないですか。&lt;/p&gt;
&lt;p&gt;2 つ目は、1 つ目とも関連するんですが、顔と名前をインターネットに出して仕事をするという決意です。
顔を出すなら、トレードマークになるようなものがあるといいなぁということで金髪にしました。
今までなんで名前を出してなかったのかというと、インターネットに個人情報出してはいけないという強迫観念があるからでした。
顔と名前を出すというのは金髪と同じで 1 つ目の決意を実行するために自分を追い込むためでもあります。
顔と名前を出して下手な仕事はできないですよね。
個人情報出してはいけない強迫観念は今でも全然あるんですが、出して失敗してもやり直しきくっぽいことはなんとなくわかってきたしこの機にやってやるか、という感じです。&lt;/p&gt;
&lt;p&gt;今まで自分の名前を出すことはもちろん、会社の名前を出すことも人脈を使うこともかなり嫌いだったんですが、今は使えるもんは全部使うという方針でやっています。名前も会社名も積極的に出すし、元同僚に頼りまくってるし、堂々と元 Google というブランドを使い倒しています。&lt;/p&gt;
&lt;p&gt;仕事のやり方も変わりました。自分のやりたいことではなく、今の会社に必要なことを考えて優先順位をつけるようにしています。また、できるだけ他の人が拾わない、拾えないボールを拾って、実行して、やり切ることを意識しています。
こう書くと、別に以前からやっていたことではあるんですが、何かが変わっています。なんなんでしょうね。&lt;/p&gt;
&lt;p&gt;7 月、ナレッジワークに入社しました。初月はオンボーディングということで社内に用意されているラーニングをやったりオンボーディングタスクをやったりしていました。
Google はもちろん今までの会社と異なるところも多く、なかなか慣れずにいた 1 ヶ月でした。
ただオンボーディング期間にあぐらをかいてボーッとしてるわけにもいかないので、自分にできることを見つけてやるようにしてました。
会社のメンバーとスプラトゥーンを一緒にやったりもしました。&lt;/p&gt;
&lt;p&gt;8 月、本格的に仕事が始まった気がします。仕事を任されるようにもなり、Design Doc を書いて実装するということを一通りやったり、業務プロセスを改善したりしました。
あと入社 2 ヶ月でインターンシップのメンターを 2 週間やるというのもありました。
インターンシップは学生がみんな優秀で自分の刺激にもなったし楽しかったですね。&lt;/p&gt;
&lt;p&gt;9 月、認証基盤を刷新するための Design Doc を書いてたりした気がします。また、今は Platform Group という社内の基盤を整えるようなチームに所属しているんですが、9 月頃は社内の様々な課題や会社が目指しているところなんかがわかってきたのでプラットフォームの将来像を描いたりもしていました。&lt;/p&gt;
&lt;p&gt;10 月、社内向けに SRE のトレーニングを主催したり、&lt;a href=&quot;https://knowledgework.connpass.com/event/294440/&quot;&gt;Encraft #7 AppDev with Google Cloud&lt;/a&gt; というイベントで登壇したりしました。
会社のカジュアル面談を担当するようにもなりました。&lt;/p&gt;
&lt;p&gt;11 月、設計した新認証基盤の実装が本格化して、とにかく Terraform と Go を書いてた気がします。&lt;/p&gt;
&lt;p&gt;12 月、新認証基盤の仕上げや別のバックエンドサーバー刷新プロジェクトの実装をしました。また、デプロイに大きくメスを入れ始めました。&lt;/p&gt;
&lt;p&gt;ざっくり振り返るつもりが長くなったなぁ。非常に濃い 1 年でした。&lt;/p&gt;
&lt;h3 id=&quot;転職してよかった&quot;&gt;転職してよかった？&lt;/h3&gt;
&lt;p&gt;よかったです。よくなかったこともありますが、圧倒的に良かったです。&lt;/p&gt;
&lt;p&gt;ナレッジワークでは自分が今までの会社で経験したすべてを出せている気がします。データセンターでの運用、Platform as a Service の新事業開発、SaaS 開発、新規 SaaS プロダクトの立ち上げとそれに関わる Platform 構築、AWS から GCP へインフラの完全移行、データプラットフォームを構築運用、ML モデルの学習や ML システムの構築、エンタープライズ企業への営業活動、エンタープライズ企業へのクラウド導入支援、顧客への Enablement、顧客・パートナー・自社を巻き込んだプロジェクトマネジメント、これらすべてが今の仕事に活きています。これらの経験のおかげでレベルが高いナレッジワークのエンジニアチームの中でも自分にしか出せない価値を出せています。&lt;/p&gt;
&lt;p&gt;経験を活かすだけならナレッジワークでなくても良いと思いますが、ナレッジワークだからこそ良かった点もあります。まずナレッジワークには自分の能力すべてを活かせる組織と事業があり、それを評価してくれます。また、今後まだまだ挑戦があり、各スペシャリストが揃っていることで自分の成長を促してくれることも確信しています。書くとシンプルですが、なかなか他の会社では得られないものだと感じています。&lt;/p&gt;
&lt;p&gt;転職して 6 ヶ月、自分の中である結論がでています。営業活動は Software Engineering に活きる。Software Engineering に必要な新たな視点が自分に加わったという実感があります。Software Engineering が好きだけど何か新しいことをやってみたいという人や行き詰まりを感じている人には、もしかすると Pre-sales Engineer というのは良いキャリアパスの経由地なのかもしれません。Software Engineering だけでは得られない学びを得られることは間違いないです。ただし、Software Engineering が好きであれば好きなだけ厳しいことも間違いないので手放しでのおすすめはしません。&lt;/p&gt;
&lt;p&gt;良くなかったこととしては、給料が下がったことぐらいですね。ナレッジワークも決して給料が低いわけではないので不満はないんですが、どうしても数字として明確に現れてしまうので Google と比べると低いなーと思ってしまったり、家計のやりくりが今までに比べると厳しくなっているという事実はあります。
今までの退職・入社エントリでは避けていたんですが気になっている人も多いと思うので正直に書いておきます。&lt;/p&gt;
&lt;h2 id=&quot;プライベート&quot;&gt;プライベート&lt;/h2&gt;
&lt;p&gt;プライベートに関する振り返りも記録として書いておきます。&lt;/p&gt;
&lt;p&gt;車を買い替えた。前の車を、5 年後には自動運転できるようになってるやろ、と残価設定ローンを組んで買ったのでその買い替え。
5 年前の自分に 5 年後も自動運転は実現されてないことを教えてあげたい。&lt;/p&gt;
&lt;p&gt;キャンプを始めた。うちはルビーという名前の柴犬を飼っていて、ルビーとも気軽に行けるんじゃないかってことでテントを始めキャンプグッズを揃えた。
グッズを揃えたはいいもののいざ行ってみたらルビーはキャンプ嫌いっぽいのでどうしたもんかと悩んでる。&lt;/p&gt;
&lt;p&gt;結婚指輪をなくして新しいペアリングを買った。まさか自分が失くすとは…。悲しかったけど、妻が一緒に新しいのを買いに行ってくれてよかった。どこに行ったんだろう。&lt;/p&gt;
&lt;p&gt;ずっと真夜中でいいのに。のライブに 5 回行った。本当に全公演全曲最高だったけど、その中でも一番を選ぶとしたら 1 月の叢雲のつるぎの残機かな。炎によるライブ演出とライブ感あふれる演奏と圧倒的なハイトーンボイスが合わさってぶち上がって昇天した。&lt;/p&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/GNFjhvFnnDY?si=NXI_3_9boCsOVjbt&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;(動画じゃ全然伝わらないんだよなぁ)&lt;/p&gt;
&lt;p&gt;スノボには雪での通行止めもあって 2 回しか行けなかったかな。今シーズンはもっと行きたい。&lt;/p&gt;
&lt;p&gt;ゲームは相変わらずスプラトゥーン 3 ばっかりやってる。他にはティアキンを結構やった。Overwatch 2 なんかもやったな。&lt;/p&gt;
&lt;p&gt;東北に一人旅した。普段は一人旅なんてしたいとも思わないけど、転職の有休が 1 週間ぐらいあって普段絶対にやらないことをやろう思って急遽決めて車で行った。
青森まで行きたかったけど日程的にも運転的にもきつかったので宮城と岩手。御朱印帳を買ってお寺を巡ってみたり洞窟に行ったりした。
岩手で泊まった今年 50 周年の宿ではめちゃくちゃうまい海鮮料理を食べてオーナーや他の宿泊客から昔話を聞いたりして、一人旅もたまにはいいかもななんて思った。&lt;/p&gt;
&lt;p&gt;PC を新調した。3 年半営業職として頑張った自分へのご褒美として見た目も中身もこだわった最高グレードのものを買った。この記事の OGP 画像も新調した PC を使って Stable Diffusion で生成してみた。&lt;/p&gt;
&lt;p&gt;いい歯医者を見つけた。かなり嬉しい。今の家に引っ越して 5 年経ってもいい病院が見つけられてなかったけど、ついにいい歯医者を見つけて安心した。眼科と耳鼻科も見つけないとなぁ。&lt;/p&gt;
&lt;p&gt;ワタミの宅食を使い始めた。Nosh は美味しくなくて辞めたけど、ワタミの宅食は美味しくて続いてる。おばちゃんが毎日届けてくれて、そのおばちゃんもいい人でそれも含めてサービスとして満足してる。&lt;/p&gt;
&lt;p&gt;親戚の葬式に行った。子供の頃に祖父が亡くなって以来のお葬式。悲しかったけど久しぶりに親戚で集まれた。&lt;/p&gt;
&lt;p&gt;Golink という OSS を作った。Google の社内システムのクローン。Ex-Googler が多くの会社に持ち込んでる有名なシステムで、ナレッジワークでも使えないかなーと思って作った。&lt;/p&gt;
&lt;p&gt;Pixel 6 Pro から Pixel 8 Pro に買い替えた。特に感想がないぐらいどこか変わってるのかいまいちわかってない。&lt;/p&gt;
&lt;p&gt;久々な友達に会った。コロナで 3 年以上会ってなかった友達と会ったりした。&lt;/p&gt;
&lt;p&gt;ドラム。今年はまったく叩いてない。Google 辞める前に社内のスタジオでちょっと叩いたぐらい。ほそぼそ続いてたバンドが休止になって機会がなくなったので、一人で個人練しようかなぁ。&lt;/p&gt;
&lt;p&gt;漫画で今年印象に残ったのはなんだろう。妻が読み始めて一気に沼にハマってしまったワンピース、黄泉のツガイ、めっちゃ流行ってる気がする葬送のフリーレンが印象に残ってる。&lt;/p&gt;
&lt;h2 id=&quot;おわりに&quot;&gt;おわりに&lt;/h2&gt;
&lt;p&gt;2023 年はとにかく濃かったです。サクッと書くつもりが結構なボリュームになってしまった。2024 年も濃い 1 年にしたいですね。&lt;/p&gt;
&lt;p&gt;また、多くの人へ感謝した年でもありました。今年お世話になった方々、もっと前にお世話になった方々、本当にありがとうございました。
来年からもお世話になるのでよろしくおねがいします。&lt;/p&gt;
&lt;p&gt;最後に、今年かなり頑張った自分もお疲れ様。&lt;/p&gt;
&lt;p&gt;それでは良いお年を。&lt;/p&gt;
&lt;section data-footnotes class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.nownabe.com/2023/06/17/leaving-google-cloud/#%E6%82%A9%E3%82%93%E3%81%A0%E3%81%93%E3%81%A8&quot;&gt;マンタローに勇気をもらって Google Cloud を辞めた話 - nownab.log&lt;/a&gt; &lt;a href=&quot;#user-content-fnref-1&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content:encoded></item><item><title>元 Googler が Knowledge Work に入社して2ヶ月経った</title><link>https://blog.nownabe.com/2023/09/06/joined-knowledge-work/</link><guid isPermaLink="true">https://blog.nownabe.com/2023/09/06/joined-knowledge-work/</guid><description>6 月末に Google Cloud のカスタマーエンジニアを辞めるときに 退職エントリ を書いたのですが、思っていた以上に「共感した」という反響を頂きました。これは転職して実際どうだったかという結果も書かないといけないなと思い、Knowledge Work への入社エントリを書いています。 長くなってしまうので 2 …</description><pubDate>Wed, 06 Sep 2023 11:26:22 GMT</pubDate><content:encoded>&lt;h2 id=&quot;はじめに&quot;&gt;はじめに&lt;/h2&gt;
&lt;p&gt;6 月末に Google Cloud のカスタマーエンジニアを辞めるときに &lt;a href=&quot;https://blog.nownabe.com/2023/06/17/leaving-google-cloud/&quot;&gt;退職エントリ&lt;/a&gt; を書いたのですが、思っていた以上に「共感した」という反響を頂きました。これは転職して実際どうだったかという結果も書かないといけないなと思い、Knowledge Work への入社エントリを書いています。&lt;/p&gt;
&lt;p&gt;長くなってしまうので 2 つの記事に分けて書きます。本記事では Knowledge Work ってどんな会社なの？ということを、次の記事では退職エントリへのアンサーを書きます。&lt;/p&gt;
&lt;p&gt;本記事:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Knowledge Work に入社を決めた理由&lt;/li&gt;
&lt;li&gt;この 2 ヶ月 Knowledge Work で何をしていたのか&lt;/li&gt;
&lt;li&gt;Knowledge Work に入社して実際どうだったか&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;次の記事:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2 ヶ月経って Knowledge Work へ SWE として転職した判断は正解だったのか&lt;/li&gt;
&lt;li&gt;これから何をしたいか&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Google Cloud を辞めた理由については &lt;a href=&quot;https://blog.nownabe.com/2023/06/17/leaving-google-cloud/&quot;&gt;退職エントリ&lt;/a&gt; に書きました。&lt;/p&gt;
&lt;p&gt;NOTE: 本記事には、この記事を読んで Knowledge Work に興味を持ってくれる人が増えたらいいなというささやかな願いが大胆に込められていますが内容はすべて本音です。&lt;/p&gt;
&lt;h2 id=&quot;tl-dr-と宣伝&quot;&gt;TL; DR と宣伝&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Knowledge Work はとてもいい会社です&lt;/li&gt;
&lt;li&gt;もし興味を持ってくださった方がいたら &lt;a href=&quot;https://knowledgework.connpass.com/event/294440/&quot;&gt;Encraft&lt;/a&gt; や &lt;a href=&quot;https://youtrust.jp/recruitment_posts/5106bad7140a31a9a6653e8029e42518&quot;&gt;カジュアル面談&lt;/a&gt; で気軽に話しましょう&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;10 月 6 日に Knowledge Work 主催の &lt;a href=&quot;https://knowledgework.connpass.com/event/294440/&quot;&gt;Encraft #7&lt;/a&gt; というオフラインイベントに登壇します。懇親会もあるので興味がある方はぜひいらしてください。
YOUTRUST の &lt;a href=&quot;https://youtrust.jp/recruitment_posts/5106bad7140a31a9a6653e8029e42518&quot;&gt;カジュアル面談&lt;/a&gt; も作ってみました。&lt;a href=&quot;https://twitter.com/nownabe&quot;&gt;X (Twitter)&lt;/a&gt; の DM でも大丈夫です。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://knowledgework.connpass.com/event/294440/&quot;&gt;&lt;img src=&quot;https://blog.nownabe.com/images/2023/09/06/encraft.png&quot; alt=&quot;Encraft #7&quot; width=&quot;330&quot; height=&quot;135&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://youtrust.jp/recruitment_posts/5106bad7140a31a9a6653e8029e42518&quot;&gt;&lt;img src=&quot;https://blog.nownabe.com/images/2023/09/06/youtrust.jpeg&quot; alt=&quot;YOUTRUST カジュアル面談&quot; width=&quot;257&quot; height=&quot;135&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;knowledge-work-に入社した&quot;&gt;Knowledge Work に入社した&lt;/h2&gt;
&lt;p&gt;改めて、7 月に Software Engineer として &lt;a href=&quot;https://kwork.studio/&quot;&gt;Knowledge Work&lt;/a&gt; に入社しました。&lt;/p&gt;
&lt;p&gt;Knowledge Work は「できる喜びが巡る日々を届ける」をミッションとして掲げるプロダクトカンパニーです。現在はセールスイネーブルメントに特化した &lt;a href=&quot;https://knowledgework.cloud/&quot;&gt;ナレッジワーク&lt;/a&gt; というプロダクトを開発・提供しています。&lt;/p&gt;
&lt;h2 id=&quot;knowledge-work-に決めた理由&quot;&gt;Knowledge Work に決めた理由&lt;/h2&gt;
&lt;p&gt;入社した理由について、入社前に転職活動をしていたときの目線で書きます。あくまでも入社前の転職先を探している時点・立場での内容です。&lt;/p&gt;
&lt;p&gt;入社理由を一言で説明すると、転職活動時に考えていた Criteria を満たしてさらに加点ポイントがあったからです。
Criteria をどうやって決めたかですが、いろいろありつつ多くは「荒波に揉まれながらも楽しくソフトウェアエンジニアとして成長できる」がテーマになっています。&lt;/p&gt;
&lt;p&gt;転職活動では以下のような基準で会社を選んでいました。多いです。Knowledge Work が満たしていると判断した Criteria には✅をつけています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;技術観点 - ソフトウェアエンジニアとして成長できる環境があるか
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;(MUST) Google Cloud と Go を使っている&lt;/strong&gt; ✅
&lt;ul&gt;
&lt;li&gt;好きなものであり、これからスキルアップしたい技術でもあるため。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(MUST) スピードと質の両立を目指している&lt;/strong&gt; ✅
&lt;ul&gt;
&lt;li&gt;開発生産性、セキュリティ、長期目線などを妥協なく両立しようとしている。これができること、重要であることを知っているということはチームが優秀なエンジニアで組織されていると考えているため。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(MUST) 妥当な技術選定ができる&lt;/strong&gt; ✅
&lt;ul&gt;
&lt;li&gt;根拠がない判断で技術選定されたり、こちらの技術選定を理由なく拒否されると改善しようとする思考を停止させてしまうため。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(MUST) CTO もしくはリーダーに技術力・バランス感がある&lt;/strong&gt; ✅
&lt;ul&gt;
&lt;li&gt;技術選定にも関わってくるし、CTO によって組織全体の技術レベルをどこまで引っ張り上げられるかが変わってくるため。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(SHOULD) Design Doc を書く文化がある&lt;/strong&gt; ✅
&lt;ul&gt;
&lt;li&gt;Google の Design Doc 文化がよかった、かつ、自分も Design Doc ベースの開発を身に着けたかったため。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;組織観点 - ビジネスを成功させる再現性があるか
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;(MUST) 採用に妥協していない&lt;/strong&gt; ✅
&lt;ul&gt;
&lt;li&gt;組織の人材レベルを高く維持しようとしている。妥協するとどんどん社内の様々な仕組みや基準が低くなっていってしまうため。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(MUST) Value の Priority が高く、その Value に共感できる&lt;/strong&gt; ✅
&lt;ul&gt;
&lt;li&gt;行動指針や行動基準といったりするもの。Value に共感できてメンバー全員がその Value を発揮しているときストレスなく心理的安全で HRT に仕事ができるため。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(MUST) 経営者がプロの経営者である&lt;/strong&gt; ✅
&lt;ul&gt;
&lt;li&gt;CEO がただの創業者ではなくプロの経営者として会社を経営している。再現性があるビジネスの成功や健全な組織の維持のためには、経営者が会社の目指すべきところを定めてそこまでの道筋を設計して示したり、社員に必要な情報をしつこくインプットし続ける必要があると感じていたため。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ビジネス観点 - 自分が楽しめるか
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;(MUST) ビジョン・ミッションに共感できる&lt;/strong&gt; ✅
&lt;ul&gt;
&lt;li&gt;大きな時間を費やすからには共感できるミッション達成のために働きたいため。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(MUST) 中長期のゴールがあり、道筋が設計されている&lt;/strong&gt; ✅
&lt;ul&gt;
&lt;li&gt;ないと行き当たりばったりで長期的な目線を持てず楽しくもなく成長できないため。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(MUST) 安定したビジネスモデルがある&lt;/strong&gt; ✅
&lt;ul&gt;
&lt;li&gt;お金を稼げるビジネスかどうか。例えば不安定な広告モデルよりは BtoB のサブスクリプションモデルのほうが好ましい。お金が稼げないと良い組織も作れないし、上場もできないし、エンジニアとして成長できる環境も維持できないため。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(MUST) 自社プロダクトを作っている&lt;/strong&gt; ✅
&lt;ul&gt;
&lt;li&gt;プロダクトを作るのが好きなため。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(SHOULD) プロダクトが Web に閉じない&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;現実世界に物理的に影響があるサービスなりプロダクトなりをやってみたかったため。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(SHOULD) ビジネスが日本に閉じない&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Google で働いて Global なビジネス、環境、働き方に良さを感じていたため。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;その他 - 報酬や働き方
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;(MUST) ある程度の報酬が出る&lt;/strong&gt; ✅
&lt;ul&gt;
&lt;li&gt;生活するため。(下がっても良い)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(MUST) 出社必須ではない&lt;/strong&gt; ✅
&lt;ul&gt;
&lt;li&gt;犬の散歩 (ライフワーク) ができなくなるため。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(SHOULD) スタートアップである&lt;/strong&gt; ✅
&lt;ul&gt;
&lt;li&gt;大きな裁量で働きたかったため。自分の成長のため。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(SHOULD) 週 1 出社、週 4 リモートぐらいのハイブリッド&lt;/strong&gt; ✅
&lt;ul&gt;
&lt;li&gt;ほぼ丸 5 年フルリモートやって、たまに他の社員と顔合わせると仕事に好影響があったり、楽しかったり、メンタルに良かったりすることがわかってきたため。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(SHOULD) 英語を使える環境がある&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;英語を身につけたかったため。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(SHOULD) フルリモートも可&lt;/strong&gt; ✅
&lt;ul&gt;
&lt;li&gt;隙あらば東京から移住したいと考えているため。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Google からの転職ということで基準は高く設定しました。Knowledge Work がこれらの基準を満たしていることを入社前にどうやって判断したかいくつか紹介します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;妥当な技術選定ができる
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://note.com/knowledgework/n/n393524fb47c3&quot;&gt;GKEからCloud Runに移行した&lt;/a&gt; 点や Modular Monolith を採用している点でかなり好印象でした。ここ数年はとにかく必然的な理由がなく Kubernetes だ、Microservices だ、というアーキテクチャが多かったので。&lt;/li&gt;
&lt;li&gt;スキル面接での CTO とのディスカッションも根拠になっています。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;採用に妥協していない
&lt;ul&gt;
&lt;li&gt;採用プロセスがガチでした。面接もそうですが、プロセス全体を通して誠実さと本気を感じました。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Value の Priority が高く、その Value に共感できる
&lt;ul&gt;
&lt;li&gt;Knowledge Work では Value ではなく、&lt;a href=&quot;https://kwork.studio/culture&quot;&gt;スタイル&lt;/a&gt; というものがあります。スタイルは Act for People、Be True、Craftsmanship の 3 つで構成されています。この 3 つには共感しかないし、自分がこうありたいと思えるスタイルだと感じました。&lt;/li&gt;
&lt;li&gt;スタイルを徹底してるなと感じたのは、カジュアル面談、スタイル面接、社長面接でした。それぞれ別の人が相手でしたが、一貫してスタイルを重要視していて、社員全員がスタイルを体現していると言っていました。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;経営者がプロの経営者である
&lt;ul&gt;
&lt;li&gt;これを間接的に感じたのはカジュアル面談、CTO への質問でした。転職活動中は必ず「社長どう？」と聞くようにしてましたが、総じてポジティブかつプロフェッショナルであるエピソードを聞けました。&lt;/li&gt;
&lt;li&gt;直接的に感じたのは社長面接です。社員、組織、ミッションにどのように取り組んでいるのかを聞かせていただきました。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;このように基準として考えていたものの他に次のような加点ポイントがありました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;リファラルしてくれた人が楽しそうだった&lt;/li&gt;
&lt;li&gt;CTO が Google 出身だった&lt;/li&gt;
&lt;li&gt;選考中に参加させてもらった社内ミーティングが良かった&lt;/li&gt;
&lt;li&gt;プロダクトのテーマがセールスイネーブルメントで、カスタマーエンジニア時代に感じていた課題の解決に取り組める&lt;/li&gt;
&lt;li&gt;オファーレターの “Why you” が良かった&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;この-2-ヶ月なにしてたの&quot;&gt;この 2 ヶ月なにしてたの？&lt;/h2&gt;
&lt;p&gt;所属は Platform Group というプロダクトの基盤となる部分を開発したり、開発生産性を高めたり、インフラを整備したり、SRE したりするチームです。ざっくり言うと &lt;a href=&quot;https://teamtopologies.com/key-concepts&quot;&gt;Team Topologies&lt;/a&gt; における Platform team ですがより広い範囲に責任があります。プロダクトの基盤を整えつつ Stream-aligned team から溢れたボールを積極的に拾いに行くようなイメージが近いかもしれません。&lt;/p&gt;
&lt;p&gt;最初の 1 ヶ月はオンボーディングでした。7 月は四半期の始まりだったため 2 日間に渡る Quarterly の全社集会があり、セルフラーニングによる学習、ペアプロを経て、いくつかの簡単な機能を開発しました。&lt;/p&gt;
&lt;p&gt;2 ヶ月目はオンボーディングも終わり独り立ちし始めたかなという感じです (まだまだですが)。この 2 ヶ月間でこんなことをやってました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;いくつかの機能開発 (表に出ない地味なやつ)&lt;/li&gt;
&lt;li&gt;いくつかの Design Doc レビュー&lt;/li&gt;
&lt;li&gt;データ分析基盤の設計・開発&lt;/li&gt;
&lt;li&gt;認証基盤改善&lt;/li&gt;
&lt;li&gt;アプリログ改善&lt;/li&gt;
&lt;li&gt;Go のエラーまわり改善&lt;/li&gt;
&lt;li&gt;Encraft の企画&lt;/li&gt;
&lt;li&gt;インターンシップのメンター&lt;/li&gt;
&lt;li&gt;運用フローの改善&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最初の四半期はいろいろ手を出してみるという感じでやっています。&lt;/p&gt;
&lt;h2 id=&quot;で入社してどうだった&quot;&gt;で、入社してどうだった？&lt;/h2&gt;
&lt;p&gt;で、実際入社してどうだったかというと、入社前と入社後でギャップがほとんどなかったです。Design Doc はしっかりと運用されているし、本当に全員がスタイルを行動指針としてミッションを実現しようとしています。&lt;/p&gt;
&lt;p&gt;いくつか Knowledge Work の好きなところを紹介します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://kwork.studio/culture&quot;&gt;スタイル&lt;/a&gt; がガチ
&lt;ul&gt;
&lt;li&gt;Act for People、Be true、Craftsmanship が行動指針です。全員がこの ABC の実現を徹底的に目指しているので共感できる人はかなり働きやすいと思います。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;社員全員優秀
&lt;ul&gt;
&lt;li&gt;前職の Google も周りはみんな優秀でしたが Knowledge Work も Google に負けないぐらいの優秀な人材しかいません。エンジニアだけではなく、HR、PdM、営業など全職種です。本当にすごい。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;四半期の全社集会がアツい
&lt;ul&gt;
&lt;li&gt;まだ 1 回しか参加してませんが、四半期ごとに全社の方針と各チームのゴールが共有される全社集会があります。社員の向く方向を揃えてモチベーションを高めるようないい場になっていると感じました。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Thanks を送る機会が多い
&lt;ul&gt;
&lt;li&gt;Google にも gThanks という仕組みがあって好きだったんですが、Knowledge Work は感謝を送る機会が多いです。Slack で送る仕組みもあるし、直接伝える機会も設けられています。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Good &amp;amp; Opportunity フィードバック
&lt;ul&gt;
&lt;li&gt;いい部分を Good、改善できる部分を Opportunity としてフィードバックする文化が定着しています。本当に Feedback is a gift で、フィードバックを受け取る機会が多いのは素晴らしいです。モチベーションになる Good と成長につながる Opportunity がセットになっているのもさらに良いです。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://note.com/knowledgework/n/nc3a0a119a76f&quot;&gt;プロダクトシェアデイ&lt;/a&gt; が良い
&lt;ul&gt;
&lt;li&gt;セールス側とプロダクト側の情報交換をするための全社員が参加するミーティングを毎週開催しています。プロダクト側からは開発の方針や新機能の紹介、セールス側からはお客様からの Good &amp;amp; Opportunity の紹介をします。プロダクト側として参加してますが作っているもののフィードバックを毎週もらえるのがありがたいです。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;おわりに&quot;&gt;おわりに&lt;/h2&gt;
&lt;p&gt;というわけで、まだ入社 2 ヶ月ですが Knowledge Work はいい会社だと感じています。本当にまわりの人全員が優秀で毎日ディスカッションするのが楽しいです。&lt;/p&gt;
&lt;p&gt;いいことしか書いてなくて完成された組織に思われるかもしれませんがスタートアップらしくまだまだやることは山積みです。社員も絶賛募集中なので興味がある方はぜひお気軽にご連絡ください。素晴らしい環境の中で一緒に成長しましょう！　💪&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://kwork.studio/recruit-engineer&quot;&gt;Recruiting Deck&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://herp.careers/v1/kwork/Uv2zu9uxo2lG&quot;&gt;バックエンドエンジニア&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://herp.careers/v1/kwork/kNU_fYDNn-ZT&quot;&gt;フルスタックエンジニア&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://herp.careers/v1/kwork/w4Ks8k8FyIrE&quot;&gt;SRE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://herp.careers/v1/kwork/fbVPqWUUiohM&quot;&gt;CRE&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;また、10 月 6 日に &lt;a href=&quot;https://knowledgework.connpass.com/event/294440/&quot;&gt;Encraft #7 AppDev with Google Cloud&lt;/a&gt; というイベントを開催します。ぜひ遊びにきてください。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://knowledgework.connpass.com/event/294440/&quot;&gt;&lt;img src=&quot;https://blog.nownabe.com/images/2023/09/06/encraft.png&quot; alt=&quot;Encraft #7&quot; width=&quot;330&quot; height=&quot;135&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://youtrust.jp/recruitment_posts/5106bad7140a31a9a6653e8029e42518&quot;&gt;&lt;img src=&quot;https://blog.nownabe.com/images/2023/09/06/youtrust.jpeg&quot; alt=&quot;YOUTRUST カジュアル面談&quot; width=&quot;257&quot; height=&quot;135&quot;&gt;&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Knowledge Work</category></item><item><title>ブログのデザインを変えた (2023 年版)</title><link>https://blog.nownabe.com/2023/07/09/update-design-2023/</link><guid isPermaLink="true">https://blog.nownabe.com/2023/07/09/update-design-2023/</guid><description>2016 年から大きく変わってなかったブログのデザインを変えた。 前からこういう感じにしたいなーと思いつつ放置してたけど、最近よくブログ書いてるのでやってしまおうということで。 全体的にスッキリさせつつ細かいところを調整した感じ。色を選ぶセンスがないのでできるだけ色は使わず、そうするとかなり味気無くなるのでカードグリッ…</description><pubDate>Sun, 09 Jul 2023 08:24:34 GMT</pubDate><content:encoded>&lt;p&gt;2016 年から大きく変わってなかったブログのデザインを変えた。
前からこういう感じにしたいなーと思いつつ放置してたけど、最近よくブログ書いてるのでやってしまおうということで。&lt;/p&gt;
&lt;p&gt;全体的にスッキリさせつつ細かいところを調整した感じ。色を選ぶセンスがないのでできるだけ色は使わず、そうするとかなり味気無くなるのでカードグリッドで記事一覧を表示して画像でなんとかするという方針。&lt;/p&gt;
&lt;p&gt;あとダークモードに対応した。&lt;/p&gt;
&lt;h2 id=&quot;before&quot;&gt;Before&lt;/h2&gt;
&lt;img src=&quot;https://blog.nownabe.com/images/2023/07/09/before-home.png&quot; width=&quot;600&quot; alt=&quot;before: home&quot; height=&quot;531&quot;&gt;
&lt;img src=&quot;https://blog.nownabe.com/images/2023/07/09/before-article-header.webp&quot; width=&quot;600&quot; alt=&quot;before: article header&quot; height=&quot;635&quot;&gt;
&lt;img src=&quot;https://blog.nownabe.com/images/2023/07/09/before-article-footer.png&quot; width=&quot;600&quot; alt=&quot;before: article footer&quot; height=&quot;385&quot;&gt;
&lt;h2 id=&quot;after&quot;&gt;After&lt;/h2&gt;
&lt;img src=&quot;https://blog.nownabe.com/images/2023/07/09/update-design-2023/banner.webp&quot; width=&quot;600&quot; alt=&quot;after: home&quot; height=&quot;502&quot;&gt;
&lt;img src=&quot;https://blog.nownabe.com/images/2023/07/09/after-article-header.webp&quot; width=&quot;600&quot; alt=&quot;after: article header&quot; height=&quot;664&quot;&gt;
&lt;img src=&quot;https://blog.nownabe.com/images/2023/07/09/after-article-footer.png&quot; width=&quot;600&quot; alt=&quot;after: article footer&quot; height=&quot;695&quot;&gt;
&lt;h2 id=&quot;todo&quot;&gt;Todo&lt;/h2&gt;
&lt;p&gt;以前の HTML/CSS を移植したわけじゃないので、多分記事によっては表示が崩れてるものがあるはず。最近の記事は大丈夫だと思うんだけど、見つけたらその都度修正する。&lt;/p&gt;
&lt;p&gt;HTML/CSS が汚いのでなんとかしたい。と言いつつなんとかしなさそう。&lt;/p&gt;
</content:encoded><category>design</category></item><item><title>PC を新調した (2023 年版)</title><link>https://blog.nownabe.com/2023/07/08/new-pc-2023/</link><guid isPermaLink="true">https://blog.nownabe.com/2023/07/08/new-pc-2023/</guid><description>6 月に新しくデスクトップ PC を買ったのでその記録。 今までのデスクトップ PC はすべて自作で組んできたけど、今回は自作じゃなくて BTO にした。パーツは選びたいけど組み立てはもういいかな、ってのとパーツの箱いらねってのが理由。 ブランドは arkhive にした。まずはこんな感じの基準で選んで arkhive…</description><pubDate>Sat, 08 Jul 2023 09:32:54 GMT</pubDate><content:encoded>&lt;p&gt;6 月に新しくデスクトップ PC を買ったのでその記録。&lt;/p&gt;
&lt;h2 id=&quot;新調した理由&quot;&gt;新調した理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;今使ってるのもう 5 年ぐらい前のだし (調べたらちょうど 2018 年の 6 月ぐらいに買ってた)&lt;/li&gt;
&lt;li&gt;円安だし &lt;a href=&quot;https://blog.nownabe.com/2023/06/17/leaving-google-cloud/&quot;&gt;3年半働いた&lt;/a&gt; 自分への褒美に RSU ちょっと売ってなんか買うかー&lt;/li&gt;
&lt;li&gt;Generative AI 動かすために強い GPU ほしい&lt;/li&gt;
&lt;li&gt;今 1 台で Linux (普段使い) と Windows (ゲーム) のデュアルブートしてて運用だるい&lt;/li&gt;
&lt;li&gt;もっと古いデスクトップ PC の下取りしたい&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;bto-にした理由&quot;&gt;BTO にした理由&lt;/h2&gt;
&lt;p&gt;今までのデスクトップ PC はすべて自作で組んできたけど、今回は自作じゃなくて BTO にした。パーツは選びたいけど組み立てはもういいかな、ってのとパーツの箱いらねってのが理由。&lt;/p&gt;
&lt;p&gt;ブランドは &lt;a href=&quot;https://www.ark-pc.co.jp/bto/special/arkhive/&quot;&gt;arkhive&lt;/a&gt; にした。まずはこんな感じの基準で選んで arkhive と &lt;a href=&quot;https://www.sycom.co.jp/bto/Hydro/&quot;&gt;Sycom&lt;/a&gt; が候補になった。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RTX 4090 でつよつよ PC が組める&lt;/li&gt;
&lt;li&gt;パーツが柔軟に選べる (マザボやケースも)&lt;/li&gt;
&lt;li&gt;水冷&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;arkhive か Sycom で arkhive を選んだ理由はこんな感じ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RTX4090 だと Sycom デュアル水冷はいらなそう&lt;/li&gt;
&lt;li&gt;arkhive だと白色ベースでいい感じにカッコよくできる&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;パーツ&quot;&gt;パーツ&lt;/h2&gt;
&lt;p&gt;パーツ選定の基本方針はこんな感じ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GeForce RTX 4090&lt;/li&gt;
&lt;li&gt;Intel&lt;/li&gt;
&lt;li&gt;できるだけ白&lt;/li&gt;
&lt;li&gt;できるだけ光る&lt;/li&gt;
&lt;li&gt;できるだけ最強&lt;/li&gt;
&lt;li&gt;信頼してるメーカー(ASUS、WD)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;選んだパーツはこんな感じ。今コンシューマー向けで選べるほぼ最強の構成になったと思う。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPU: &lt;a href=&quot;https://www.amazon.co.jp/dp/B0BJ91FHN3?tag=nownabe02-22&quot;&gt;Intel Core i9-13900KF&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;M/B: &lt;a href=&quot;https://www.amazon.co.jp/dp/B0BM988CZ6?tag=nownabe02-22&quot;&gt;ASUS ROG MAXIMUS Z790 HERO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;メモリ: &lt;a href=&quot;https://www.amazon.co.jp/dp/B0B3DP63RB?tag=nownabe02-22&quot;&gt;G.Skill DDR5-5600 32GBx2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GPU: &lt;a href=&quot;https://www.amazon.co.jp/dp/B0BHKGTYS9?tag=nownabe02-22&quot;&gt;ZOTAC GAMING GeForce RTX 4090 AMP Extreme AIRO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ストレージ 1: &lt;a href=&quot;https://www.amazon.co.jp/dp/B0B3RQDGL7?tag=nownabe02-22&quot;&gt;Western Digital WD_BLACK SN850X NVMe SSD&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ストレージ 2: &lt;a href=&quot;https://www.amazon.co.jp/dp/B08THM8YGY?tag=nownabe02-22&quot;&gt;Samsung 980 PRO 4.0 NVMe SSD 2TB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ケース: &lt;a href=&quot;https://www.amazon.co.jp/dp/B0BPS41V89?tag=nownabe02-22&quot;&gt;Fractal Design Torrent White RGB TG Clear Tint&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;CPU クーラー: &lt;a href=&quot;https://www.amazon.co.jp/dp/B0B1CWYBC7?tag=nownabe02-22&quot;&gt;ASUS ROG STRIX LC II 360 ARGB White Edition&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;電源: &lt;a href=&quot;https://www.amazon.co.jp/dp/B0BQ6BJ95P?tag=nownabe02-22&quot;&gt;SilverStone HELA 1200R Platinum&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;OS: Windows 11 Pro 64bit&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;メモリだけは欲しいのが BTO の選択肢としてなかったので自分で買って挿し換えた。&lt;/p&gt;
&lt;h2 id=&quot;箱&quot;&gt;箱&lt;/h2&gt;
&lt;p&gt;考えたらわかるんだけど、これだけ自由にパーツ選べる自作好き向けの BTO が箱や付属品やマニュアルを送ってこないわけがなかった。というわけで PC とともにパーツの箱が大量に来たんだけど、RTX 4090 以外の箱は処分する予定。グラボは買い替えることもあるかなーってことで。&lt;/p&gt;
&lt;p&gt;こんな感じのでっかいダンボールが 2 つ届いて、本体とパーツの箱だった。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.nownabe.com/images/2023/07/08/cases.jpg&quot; alt=&quot;cases&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;感想&quot;&gt;感想&lt;/h2&gt;
&lt;p&gt;🌟大🌟満🌟足🌟
スペックはもちろん文句ないし、なにより見た目がカッコいい。見てるだけで癒やされる。&lt;/p&gt;
&lt;p&gt;ゲームは最高画質がサクサク動くし、LLM や Stable Diffusion もそれなりにいい感じで動く。&lt;/p&gt;
&lt;p&gt;BTO ということで組み立ては他人にやってもらったわけだけど、非常に丁寧でその点もよかった。これはマザボ裏の配線の様子。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.nownabe.com/images/2023/07/08/cables.jpg&quot; alt=&quot;cables&quot;&gt;&lt;/p&gt;
&lt;p&gt;今回デュアルブートはせずに Windows オンリーにしたけど、それもいい選択だったなと思ってる。まだ本格的に開発端末としては使ってないものの、WSL が優秀で今のところ困ってない。Windows じゃ開発できないよなぁって理由で渋々 Mac 使ってる人は Windows を検討してみてもいいかもしれない。少なくとも Linux を使ってた人は Mac より WSL の方が使いやすいんじゃないかな。&lt;/p&gt;
</content:encoded></item><item><title>Windows 11 の WSL で GPU を使って rinna InstructGPT</title><link>https://blog.nownabe.com/2023/06/25/rinna-instructgpt-on-wsl-using-gpu/</link><guid isPermaLink="true">https://blog.nownabe.com/2023/06/25/rinna-instructgpt-on-wsl-using-gpu/</guid><description>最近、念願のつよつよ GPU がついた PC を新調して WSL で環境構築を頑張っている。今回は GPU を使った LLM の推論を試した。 ここでの GPU は NVIDIA のもので、GPU の環境構築は WSL で CUDA を使えるようにすることを意味する。また、WSL の Distribution は Ub…</description><pubDate>Sun, 25 Jun 2023 04:06:47 GMT</pubDate><content:encoded>&lt;h2 id=&quot;はじめに&quot;&gt;はじめに&lt;/h2&gt;
&lt;p&gt;最近、念願のつよつよ GPU がついた PC を新調して WSL で環境構築を頑張っている。今回は GPU を使った LLM の推論を試した。&lt;/p&gt;
&lt;p&gt;ここでの GPU は NVIDIA のもので、GPU の環境構築は WSL で CUDA を使えるようにすることを意味する。また、WSL の Distribution は Ubuntu-22.04。&lt;/p&gt;
&lt;p&gt;LLM としては rinna 社の &lt;a href=&quot;https://rinna.co.jp/news/2023/05/20220531.html&quot;&gt;日本語特化 InstructGPT&lt;/a&gt; を使った。&lt;/p&gt;
&lt;h2 id=&quot;gpu-on-wsl&quot;&gt;GPU on WSL&lt;/h2&gt;
&lt;p&gt;基本的に &lt;a href=&quot;https://docs.nvidia.com/cuda/wsl-user-guide/index.html#getting-started-with-cuda-on-wsl&quot;&gt;この手順&lt;/a&gt; に従って進めれば WSL で GPU が使えるようになる。具体的には、Windows 11 へ WSL 対応 NVIDIA ドライバのインストール、WSL 内で CUDA Toolkit インストールの 2 点。&lt;/p&gt;
&lt;p&gt;NVIDIA ドライバのインストールは NVIDIA の &lt;a href=&quot;https://www.nvidia.com/Download/index.aspx&quot;&gt;ドライバダウンロードサイト&lt;/a&gt; で Windows 11 のものを選んでダウンロードしてインストールする。最新のものであれば WSL 2 の CUDA サポートが入っている。自分の環境だとこんな感じ。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.nownabe.com/images/2023/06/25/nvidia-driver-download.png&quot; alt=&quot;nvidia-driver-download&quot;&gt;&lt;/p&gt;
&lt;p&gt;Windows 側でドライバをインストールすると、WSL 側でマウントしている &lt;code&gt;/usr/lib/wsl/lib&lt;/code&gt; に CUDA の共有ライブラリなどが見えるようになる。&lt;/p&gt;
&lt;p&gt;CUDA Toolkit は &lt;a href=&quot;https://developer.nvidia.com/cuda-downloads?target_os=Linux&amp;amp;target_arch=x86_64&amp;amp;Distribution=WSL-Ubuntu&amp;amp;target_version=2.0&amp;amp;target_type=deb_network&quot;&gt;ダウンロードページ&lt;/a&gt; から WSL 用のものをインストールする。これは、Windows 側でインストールした NVIDIA ドライバが提供するファイルを上書きしないように配慮されている。自分の環境だとこんな感じ。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.nownabe.com/images/2023/06/25/install-cuda-toolkit.png&quot; alt=&quot;install-cuda-toolkit&quot;&gt;&lt;/p&gt;
&lt;p&gt;ただし、表示されたコマンドのまま進めると PyTorch が対応していない最新の CUDA (今だと CUDA 12.2) がインストールされてしまうので、こんな感じで対応しているバージョンをインストールする。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;wget&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-keyring_1.0-1_all.deb&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; dpkg&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -i&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; cuda-keyring_1.0-1_all.deb&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; apt-get&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; update&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; apt-get&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -y&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; cuda-11-8&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;nvidia-smi&lt;/code&gt; コマンドも使えるようになっているはずなので確認ができる。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;❯&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; nvidia-smi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Sun&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Jun&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 25&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 12:15:35&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 2023&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;+---------------------------------------------------------------------------------------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; NVIDIA-SMI&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 535.54.04&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;              Driver&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Version:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 536.23&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       CUDA&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Version:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 12.2&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;     |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;-----------------------------------------+----------------------+----------------------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; GPU&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  Name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                 Persistence-M&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Bus-Id&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        Disp.A&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Volatile&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Uncorr.&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ECC&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Fan&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  Temp&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   Perf&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;          Pwr:Usage/Cap&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;         Memory-Usage&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; GPU-Util&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  Compute&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; M.&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                                         |&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                      |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;               MIG&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; M.&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;=========================================+======================+======================&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;   0&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  NVIDIA&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; GeForce&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; RTX&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 4090&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        On&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; 00000000:01:00.0&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  On&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;                  Off&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  0%&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   45C&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    P8&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;              39W&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 450W&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;   1184MiB&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 24564MiB&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;      5%&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;      Default&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                                         |&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                      |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;                  N/A&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;+-----------------------------------------+----------------------+----------------------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;+---------------------------------------------------------------------------------------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Processes:&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                                                                            |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  GPU&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   GI&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   CI&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        PID&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   Type&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   Process&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                            GPU&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Memory&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        ID&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ID&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                                                             Usage&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;      |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;=======================================================================================&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  No&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; running&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; processes&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; found&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                                                           |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;+---------------------------------------------------------------------------------------+&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;instructgpt&quot;&gt;InstructGPT&lt;/h2&gt;
&lt;p&gt;今回コンテナは使わず &lt;a href=&quot;https://python-poetry.org/&quot;&gt;Poetry&lt;/a&gt; の仮想環境で &lt;a href=&quot;https://jupyterlab.readthedocs.io/en/latest/&quot;&gt;JupyterLab&lt;/a&gt; を起動して、Windows のブラウザからアクセスして &lt;a href=&quot;https://huggingface.co/rinna/japanese-gpt-neox-3.6b-instruction-ppo&quot;&gt;rinna InstructGPT&lt;/a&gt; を使用した。&lt;/p&gt;
&lt;p&gt;Poetry のインストールは &lt;a href=&quot;https://asdf-vm.com/&quot;&gt;asdf&lt;/a&gt; で。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;asdf&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; poetry&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1.5.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;asdf&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; global&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; poetry&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1.5.1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;適当にディレクトリを作って &lt;code&gt;poetry init&lt;/code&gt;。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;mkdir&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ~/jupyter&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ~/jupyter&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;poetry&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; init&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;pyproject.toml&lt;/code&gt; の dependencies はこんな感じ。&lt;code&gt;url&lt;/code&gt; の &lt;code&gt;cp310&lt;/code&gt; は Python のバージョン。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;tool&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;poetry&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;dependencies&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;python = &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;^3.10&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;jupyterlab = &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;^4.0.2&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;torch = {url = &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;https://download.pytorch.org/whl/cu118/torch-2.0.1%2Bcu118-cp310-cp310-linux_x86_64.whl&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;transformers = &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;^4.30.2&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;sentencepiece = &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;^0.1.99&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;依存ライブラリをインストールして起動する。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;poetry&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;poetry&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; run&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; jupyter&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; lab&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Windows 側のブラウザから &lt;a href=&quot;http://localhost:8888/%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%99%E3%82%8B%E3%80%82%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%81%AF&quot;&gt;http://localhost:8888/にアクセスする。トークンは&lt;/a&gt; JupyterLab を起動したコンソールにログとして表示されている。&lt;/p&gt;
&lt;p&gt;まずはサンプルをそのまま動かしてみた。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; torch&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; transformers &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; AutoTokenizer, AutoModelForCausalLM&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;tokenizer &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; AutoTokenizer.from_pretrained(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;rinna/japanese-gpt-neox-3.6b-instruction-ppo&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;use_fast&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;False&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;model &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; AutoModelForCausalLM.from_pretrained(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;rinna/japanese-gpt-neox-3.6b-instruction-ppo&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;model &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; model.to(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;cuda&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;prompt &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        &quot;speaker&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;ユーザー&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        &quot;text&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;コンタクトレンズを慣れるにはどうすればよいですか？&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        &quot;speaker&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;システム&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        &quot;text&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;これについて具体的に説明していただけますか？何が難しいのでしょうか？&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        &quot;speaker&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;ユーザー&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        &quot;text&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;目が痛いのです。&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        &quot;speaker&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;システム&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        &quot;text&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;分かりました、コンタクトレンズをつけると目がかゆくなるということですね。思った以上にレンズを外す必要があるでしょうか？&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        &quot;speaker&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;ユーザー&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        &quot;text&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;いえ、レンズは外しませんが、目が赤くなるんです。&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;prompt &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    f&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;uttr[&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;speaker&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;uttr[&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;text&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; uttr &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; prompt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;prompt &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;&amp;lt;NL&amp;gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.join(prompt)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;prompt &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    prompt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    +&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;&amp;lt;NL&amp;gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    +&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;システム: &quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;token_ids &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; tokenizer.encode(prompt, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;add_special_tokens&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;False&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;return_tensors&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;pt&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;with&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; torch.no_grad():&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    output_ids &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; model.generate(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        token_ids.to(model.device),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;        do_sample&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;True&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;        max_new_tokens&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;128&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;        temperature&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0.7&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;        repetition_penalty&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1.1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;        pad_token_id&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;tokenizer.pad_token_id,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;        bos_token_id&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;tokenizer.bos_token_id,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;        eos_token_id&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;tokenizer.eos_token_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    )&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;output &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; tokenizer.decode(output_ids.tolist()[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;][token_ids.size(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;):])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;output &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; output.replace(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&amp;lt;NL&amp;gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(output)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ちゃんした日本語が出力される。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;わかりました。コンタクトレンズを長時間つけっぱなしにしている場合は、目の周りに水ぶくれができやすくなります。また、コンタクトレンズを長時間つけたままにしておくことで、目にゴミやほこりが入りやすくなり、それらが刺激となってかゆみを引き起こすことがあります。そのため、コンタクトレンズを付ける前には必ず手を洗って、清潔な状態にすることが大切です。&amp;lt;/s&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;こんな関数を作っていろいろ遊んでみた。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; chat&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(prompt):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    prompt &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; f&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;ユーザー: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;prompt&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;lt;NL&amp;gt;システム: &quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    token_ids &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; tokenizer.encode(prompt, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;add_special_tokens&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;False&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;return_tensors&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;pt&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    with&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; torch.no_grad():&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        output_ids &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; model.generate(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            token_ids.to(model.device),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;            do_sample&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;True&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;            max_new_tokens&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;128&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;            temperature&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0.7&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;            repetition_penalty&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1.1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;            pad_token_id&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;tokenizer.pad_token_id,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;            bos_token_id&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;tokenizer.bos_token_id,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;            eos_token_id&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;tokenizer.eos_token_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        )&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    output &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; tokenizer.decode(output_ids.tolist()[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;][token_ids.size(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;):])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; output.replace(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&amp;lt;NL&amp;gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;Windows 11のWSL2でRTX4090使ってLLM動かせた！ &lt;a href=&quot;https://t.co/FsbVMZ0toe&quot;&gt;pic.twitter.com/FsbVMZ0toe&lt;/a&gt;&lt;/p&gt;&amp;mdash; ぎっくり腰太郎 (@nownabe) &lt;a href=&quot;https://twitter.com/nownabe/status/1672634127374499842?ref_src=twsrc%5Etfw&quot;&gt;June 24, 2023&lt;/a&gt;&lt;/blockquote&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;メタルはあんま詳しくなさそう &lt;a href=&quot;https://t.co/GTLceXCPek&quot;&gt;https://t.co/GTLceXCPek&lt;/a&gt; &lt;a href=&quot;https://t.co/PtkBdkLXUB&quot;&gt;pic.twitter.com/PtkBdkLXUB&lt;/a&gt;&lt;/p&gt;&amp;mdash; ぎっくり腰太郎 (@nownabe) &lt;a href=&quot;https://twitter.com/nownabe/status/1672637461951057920?ref_src=twsrc%5Etfw&quot;&gt;June 24, 2023&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;p&gt;推論してるときのリソースはこんな感じ。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.nownabe.com/images/2023/06/25/gpu-performance.png&quot; alt=&quot;gpu-performance&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;おわりに&quot;&gt;おわりに&lt;/h2&gt;
&lt;p&gt;ローカルで LLM 動くの楽しい！&lt;/p&gt;
</content:encoded><category>Windows 11</category><category>WSL</category><category>LLM</category><category>GPU</category><category>rinna</category><category>InstructGPT</category><category>GPT</category><category>Python</category><category>JupyterLab</category></item><item><title>マンタローに勇気をもらって Google Cloud を辞めた話</title><link>https://blog.nownabe.com/2023/06/17/leaving-google-cloud/</link><guid isPermaLink="true">https://blog.nownabe.com/2023/06/17/leaving-google-cloud/</guid><description>昨日、Google Cloud のカスタマーエンジニアとしての最終出社日でした。退職日は 6 月末になります。いわゆる退職エントリです。 次はソフトウェアエンジニアとしての転職が決まっています。入社エントリはまた別で書ければと思っています。 本記事は、</description><pubDate>Sat, 17 Jun 2023 05:25:46 GMT</pubDate><content:encoded>&lt;h2 id=&quot;はじめに&quot;&gt;はじめに&lt;/h2&gt;
&lt;p&gt;昨日、Google Cloud のカスタマーエンジニアとしての最終出社日でした。退職日は 6 月末になります。いわゆる退職エントリです。&lt;/p&gt;
&lt;p&gt;次はソフトウェアエンジニアとしての転職が決まっています。入社エントリはまた別で書ければと思っています。&lt;/p&gt;
&lt;p&gt;本記事は、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Google Cloud で何をしたか&lt;/li&gt;
&lt;li&gt;Google に入社してよかったこと&lt;/li&gt;
&lt;li&gt;ソフトウェアエンジニアから営業職をやってよかったこと&lt;/li&gt;
&lt;li&gt;辞めた理由&lt;/li&gt;
&lt;li&gt;悩んだこと&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;という話を書きます。&lt;/p&gt;
&lt;h2 id=&quot;disclaimer&quot;&gt;Disclaimer&lt;/h2&gt;
&lt;p&gt;私が所属していたのは会社でいうとグーグル・クラウド・ジャパン合同会社になります。Google は非常に大きい会社で、本記事はあくまでも一事業部に所属した一人の退職エントリです。&lt;/p&gt;
&lt;p&gt;また、時期的に近いですがレイオフとは無関係です。&lt;/p&gt;
&lt;h2 id=&quot;google-cloud-で何をしたか&quot;&gt;Google Cloud で何をしたか&lt;/h2&gt;
&lt;p&gt;2020 年 1 月に入社して 3 年半 Google Cloud のカスタマーエンジニアをやっていました。カスタマーエンジニアはプリセールスエンジニアとも呼ばれるロールで、Google Cloud をお客さんに使ってもらって売上を増やすことが責務です。つまりは営業職です。&lt;/p&gt;
&lt;p&gt;その中で日本の大手製造業を担当するチームの一員として、日本に住んでいれば誰でも名前を聞いたことがあるような会社を複数担当しました。担当したお客さんや営業メンバーの特色もあり、カスタマーエンジニアチームの中では活動内容の営業色が強いようなチームだったと思います。&lt;/p&gt;
&lt;p&gt;カスタマーエンジニアとして具体的には次のようなことをやりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;スライドを使った Google Cloud の紹介、各プロダクトの紹介、事例紹介など&lt;/li&gt;
&lt;li&gt;事業内容、ビジネス課題、技術課題などのヒアリング&lt;/li&gt;
&lt;li&gt;ソリューションやアーキテクチャの提案&lt;/li&gt;
&lt;li&gt;PoC 計画立案、プロジェクトのスケジュール管理、ミーティングのファシリテーションなどのプロジェクトマネジメント&lt;/li&gt;
&lt;li&gt;アーキテクチャレビュー、Q&amp;amp;A、トラブルシューティングなどの技術支援&lt;/li&gt;
&lt;li&gt;ハンズオンやプロトタイピングなどのワークショップの準備・実施&lt;/li&gt;
&lt;li&gt;社内の各種調整&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;書いていないことも含めると本当に様々なことをやったと思います。また、こうした営業活動以外にもサイドプロジェクトとして次のようなことをやりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;社内用ツールの開発・運用&lt;/li&gt;
&lt;li&gt;社内のデータ分析・可視化&lt;/li&gt;
&lt;li&gt;ブログ記事の執筆&lt;/li&gt;
&lt;li&gt;Google Cloud 関係の OSS への貢献&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;2022 年から最終出社日 (farewell message 投げながらワークショップしてました) までは &lt;a href=&quot;https://cloud.google.com/blog/ja/products/application-development/in-house-development&quot;&gt;TAP (Tech Acceleration Program)&lt;/a&gt; を中心に活動していました。TAP は 3 日間のワークショップで、お客さんのビジネスをヒアリングして課題やユースケースを明確にすることから始まり、その場でアーキテクチャを検討し、実際に動作するプロトタイプを構築します。TAP に関しては製造業チームでのリードやプログラム自体の運用改善をしていました。ワークショップ中にはファシリテーションをしつつ瞬時に最適なアーキテクチャを導き、アジェンダを動的に最適化して、瞬発的なデバッグをすることが必要でした。この活動が最も自分の良さを発揮できていたと思います。&lt;/p&gt;
&lt;h2 id=&quot;google-に入社してよかったこと&quot;&gt;Google に入社してよかったこと&lt;/h2&gt;
&lt;p&gt;所属は日本のクラウドチームでしたが、福利厚生や各種制度、社内ツールなどは Google Japan や Google 本社と同じでした。3 年半と長くはない期間でしたが、Google で働いてみてよかったことはたくさんありました。いくつか紹介します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Google と言えば、という良さ。Google と言えば働きたい企業ランキング上位で、多くの人が働きやすく待遇が良いというイメージを持っていると思います。その点はイメージ通りでした。世界最高の会社の 1 つなんだろうと思います。報酬は高く、福利厚生は充実していて、オフィスはオシャレで機能的、サラリーマンとしては最高の環境で働くことができました。&lt;/li&gt;
&lt;li&gt;優秀な同僚が多い。びっくりするほど同僚が優秀で、みんな尊敬できる人たちでした。多くの同僚に共通して感じたことは、しっかりと会話ができ、難題を解決するために思考し自発的に行動し、向上心があるという点です。これがベースにあり、さらにそれぞれが専門性を持っています。彼ら彼女らと出会って一緒に仕事ができたことは本当によかったと思います。&lt;/li&gt;
&lt;li&gt;Google の技術はすげぇ。Google の技術はやっぱりすごいです。Google Cloud の中身もすごいです。それらの技術を知ったり触る機会があったのは最高にエキサイティングでした。&lt;/li&gt;
&lt;li&gt;DEI。Google は DEI (Diversity、Equity、Inclusion) に非常に力を入れています。Google に入社するまであまり意識することはなかったのですが、社会にとって大事な要素だと考えるようになりました。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;営業職をやってよかったこと&quot;&gt;営業職をやってよかったこと&lt;/h2&gt;
&lt;p&gt;ソフトウェアエンジニアとしては得られなかったであろう貴重な経験ができました。&lt;/p&gt;
&lt;p&gt;最も良かったと感じているのは「ヒトを動かす」ことを明確に意識できるようになったことです。3 年以上やってみて営業はヒトを動かすことが仕事だと考えるようになりました。Win-Win の結果を達成するために社外と社内のヒトを動かす過程をデザインし、地道にコツコツ実行し、良い人間関係を構築して、背中をひと押しする、それが営業で大切なことかなと。ソフトウェアエンジニアの仕事がソフトウェアを作って動かし続けることだとすると、営業の仕事は人間関係を作ってヒトを動かし続けることです。&lt;/p&gt;
&lt;p&gt;このヒトを動かすというのは考えてみればソフトウェアエンジニアにとっても重要です。今まで無意識にやっていた部分はありますが、意識できるようになったことでより大きな成果を出せるような気がしています。&lt;/p&gt;
&lt;p&gt;他にも良かったことがあります。例えば、様々なお客さんと会話し、様々なビジネスを知り、関われたことは非常に良かったです。視野が広がったのはもちろん、日本はこの人たちがこうやって支えていたのか、と聞いていてワクワクすることもありました。営業といえば気難しいお客さんを接待して何かあれば平謝りするみたいなイメージがありましたが、実際はいいお客さんが多く、楽しく建設的なディスカッションもできました。&lt;/p&gt;
&lt;p&gt;また、そんな名実ともに日本を支えているお客さんの役に立つことで、日本という国の役に立っていると実感することもできました。特に TAP は内製化支援がテーマであり、日本の GDP の 20% を占める製造業の内製化を進めることで大きく日本に貢献できる可能性があると考えています。まだまだ道半ばでこれからというところではありましたが、その活動の立ち上げに大きく貢献できたことは誇りです。&lt;/p&gt;
&lt;h2 id=&quot;辞めた理由&quot;&gt;辞めた理由&lt;/h2&gt;
&lt;p&gt;辞めた理由は大きく 2 つです。1 つ目はソフトウェアエンジニアに戻るため。2 つ目はレイオフの影響で社内異動が難しくなったためです。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.nownabe.com/2020/02/05/join-google/&quot;&gt;入社エントリ&lt;/a&gt; にも書いていますが、入社したときから 2、3 年やってみて次のキャリアを考えるというのは決めていました。そして考えた結果、ソフトウェアエンジニアとして再度チャレンジすることを決断しました。&lt;/p&gt;
&lt;p&gt;その理由としては、カスタマーエンジニアではソフトウェアエンジニア的なスキルがほとんど伸びないからです。Google Cloud の幅広い知識や社内のコネクションを活かした対応力は向上したかもしれませんが、自分自身のソフトウェアエンジニアとしてのスキルは入社時に比べてむしろ下がっています。自分のカスタマーエンジニアとしての強みはソフトウェアエンジニアのスキルがベースにあったので、この 3 年半はまさに貯金を切り崩している状態でした。&lt;/p&gt;
&lt;p&gt;ソフトウェアエンジニアがやりたいのであれば Google 社内でポジションを探せばいいのでは、という疑問はまったくそのとおりで、社内のソフトウェアエンジニアのポジションも探していました。それと同時に、スタートアップの混沌の中で物事を解決していくのも好きだったので、社外でも色々と話を聞いていました。&lt;/p&gt;
&lt;p&gt;そんな中、社内のちょうどいいポジションを見つけて応募しようとレジュメを書いているときにレイオフがあり、そのポジションはなくなり、採用も全社的にストップしました。今回のレイオフは本当に何もわからず、第 2 波がある、来月採用が再開する、いや採用は 1 年後になる、などいろんな噂があり、先行きが全く見えず社内異動のモチベーションもなくなってしまい、社外への転職一本に絞りました。&lt;/p&gt;
&lt;p&gt;とは言え転職先を妥協したということはまったくなく、ここに行きたいと思える会社からオファーをいただけたのは本当に良かったです。&lt;/p&gt;
&lt;h2 id=&quot;悩んだこと&quot;&gt;悩んだこと&lt;/h2&gt;
&lt;p&gt;Google を辞めるかどうかは本当に悩みました。早くソフトウェアエンジニアとしてのキャリアを再出発させたい、次の会社でチャレンジしたいという気持ちは強かったのですが、とにかく手放すものが多かったです。高い待遇、福利厚生、世界最高のオフィス、おしゃれで美味しい社内食堂、優秀な同僚、社内の便利ツール、Google の素晴らしい技術、英語環境、DEI と心理的安全性が前提の環境、これらを手放す必要がありました。オフィスに行って美味しいランチを食べたり、これから Vest される株の金額を見るたびに辞めたくない気持ちが高まるということを繰り返していました。離職率に悩んでいる会社はぜひ参考にしてください。本当に効果があります。&lt;/p&gt;
&lt;p&gt;話が逸れましたが、ぐだぐだ悩んでいる中オファーをもらい決断を迫られました。そんなとき、スプラトゥーン 3 のゼルダの伝説コラボフェスが始まりました。&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;『ゼルダの伝説ティアーズオブザキングダム』の発売に合わせて、「ゼルダの伝説」シリーズとのコラボフェスが開催されることになったぞ！&lt;br&gt;お題は「汝、何を求める？力 vs 知恵 vs 勇気」。&lt;br&gt;期間は、5月6日(土)9:00～5月8日(月)9:00の48時間だ。&lt;br&gt;どれか一つ手に入るなら、キミは何を望むだろうか？&lt;a href=&quot;https://t.co/8L2V4YIoyI&quot;&gt;pic.twitter.com/8L2V4YIoyI&lt;/a&gt;&lt;/p&gt;&amp;mdash; Splatoon（スプラトゥーン）(@SplatoonJP) &lt;a href=&quot;https://twitter.com/SplatoonJP/status/1646875958018973699?ref_src=twsrc%5Etfw&quot;&gt;April 14, 2023&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;p&gt;そのときのマンタローのセリフがこちらです。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.nownabe.com/images/2023/06/17/big-man-1.jpg&quot; alt=&quot;Big Man 1&quot;&gt;
&lt;img src=&quot;https://blog.nownabe.com/images/2023/06/17/big-man-2.jpg&quot; alt=&quot;Big Man 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;悩んでいたときにフェスというライブ感のあるイベントでこれを見て、割とガチで心に響いて辞めることを決意しました。自分のスキルやキャリアの停滞を感じていたところでもあったので勇気を持って前に出ようと。&lt;/p&gt;
&lt;p&gt;今では僕の座右の銘は「エイエイエイ！エイ！」です。&lt;/p&gt;
&lt;p&gt;ちなみにティアキンはまだクリアできていません。&lt;/p&gt;
&lt;h2 id=&quot;おわりに&quot;&gt;おわりに&lt;/h2&gt;
&lt;p&gt;3 年半、comfort zone から抜け出し慣れないことに挑戦してなんとかやりきった自分を褒めたいです。本当によく頑張った。一緒に僕のことを褒めてくれる方は &lt;a href=&quot;https://www.amazon.jp/hz/wishlist/ls/IJUEPGW710QR?ref_=wl_share&quot;&gt;こちら&lt;/a&gt; からお願いします。&lt;/p&gt;
&lt;p&gt;読み返すまですっかり忘れてたんですが &lt;a href=&quot;https://blog.nownabe.com/2020/02/05/join-google/&quot;&gt;入社エントリ&lt;/a&gt; では次のような意気込みを書いていました。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;やるからには本気でやります！💪 🔥&lt;/p&gt;
&lt;p&gt;今はまだ何もやってないのでカスタマーエンジニアって名乗るのに抵抗があるんですが、早く何か成し遂げて自信を持って名乗れるようになりたいです。&lt;/p&gt;
&lt;p&gt;向いてなかったらソフトウェアエンジニアに戻るとは書きましたが、数年はやってみようと思ってます。もしやめるとしても、カスタマーエンジニアやってましたと堂々と言えるようになっていたいです。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;3 年半経った今、胸を張ってカスタマーエンジニアやってましたと言えます。&lt;/p&gt;
&lt;p&gt;3 年半の間、いつも助けてくれて相談に乗ってくれたカスタマーエンジニアのメンバー、一緒に苦労し這いずり回った営業のメンバー、同期入社でサポートし続けてくれたマネージャー、そして Google Cloud を使って何かを成し遂げようと一緒にチャレンジしてくれたお客さんの皆様、みなさんのおかげで貴重な経験をさせていただき成長できました。本当にありがとうございました。Google Cloud に入社してカスタマーエンジニアができてよかったです。&lt;/p&gt;
&lt;p&gt;次もがんばるぞい💪 🔥&lt;/p&gt;
</content:encoded></item><item><title>自分のウェブサイトを GitHub のプロフィール README と同期させた</title><link>https://blog.nownabe.com/2023/05/03/sync-my-site-with-github-readme/</link><guid isPermaLink="true">https://blog.nownabe.com/2023/05/03/sync-my-site-with-github-readme/</guid><description>GitHub の プロフィール の Markdown をレンダリングして 個人サイト と同期するようにした。 個人サイトあるけど、内容は薄いしデザインも凝ってないし、ちょっと前に作った GitHub の profile README で内容ほぼカバーできてるしそっから同期させたい、ってのがモチベ。 個人サイトを廃止して…</description><pubDate>Wed, 03 May 2023 14:21:28 GMT</pubDate><content:encoded>&lt;p&gt;GitHub の &lt;a href=&quot;https://github.com/nownabe&quot;&gt;プロフィール&lt;/a&gt; の Markdown をレンダリングして &lt;a href=&quot;https://nownabe.com&quot;&gt;個人サイト&lt;/a&gt; と同期するようにした。&lt;/p&gt;
&lt;p&gt;個人サイトあるけど、内容は薄いしデザインも凝ってないし、ちょっと前に作った GitHub の &lt;a href=&quot;https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-github-profile/customizing-your-profile/managing-your-profile-readme&quot;&gt;profile README&lt;/a&gt; で内容ほぼカバーできてるしそっから同期させたい、ってのがモチベ。&lt;/p&gt;
&lt;p&gt;個人サイトを廃止していいのではという気もするが、GitHub というサービスに依存するのではなく自分のドメインをインデックスとしておきたいし、いろんな場所から既にリンクしてしまっているのでこういう方法を取ることにした。&lt;/p&gt;
&lt;p&gt;デザインに関しては、時間かけて考えたくないし、マスターは GitHub にあるんですよということがわかりやすいように GitHub のデザインを&lt;del&gt;パクっ&lt;/del&gt;参考にした。&lt;/p&gt;
&lt;p&gt;同期の方法は単純で、&lt;a href=&quot;https://github.com/nownabe/nownabe.com&quot;&gt;nownabe/nownabe.com&lt;/a&gt; リポジトリの GitHub Actions のワークフローを定期的に実行して、ワークフローでサイトの生成と GitHub Pages へのデプロイをしている。README の Push をトリガーにしていないのは、README が別リポジトリにあって連携がめんどくさいのと、同期に数時間や数日の遅延があっても構わないというのが理由。Pages を README のリポジトリに移行するというのも考えたけど、個人サイトはなんだかんだ変遷があってまたいつ別の方法を取るかわからないのでプロフィールから切り離しておいた方がいいだろうということでこの構成にした。&lt;/p&gt;
&lt;p&gt;ワークフローの中では次のように処理を行っている。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;最新のプロフィール README を Actions のローカルに持ってくる (プロフィールリポジトリはパブリックなので簡単に持ってこれる)&lt;/li&gt;
&lt;li&gt;Ruby スクリプトで README を HTML にレンダリングして、ERB のテンプレートに差し込み、&lt;code&gt;dist/index.html&lt;/code&gt; に出力する (&lt;code&gt;dist/&lt;/code&gt; には予め必要な画像や &lt;code&gt;CNAME&lt;/code&gt; ファイルが入っている)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/actions/upload-pages-artifact&quot;&gt;actions/upload-pages-artifact&lt;/a&gt; で &lt;code&gt;dist/&lt;/code&gt;
をアーティファクトとしてアップロードする&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/actions/deploy-pages&quot;&gt;actions/deploy-pages&lt;/a&gt; でアーティファクトを GitHub Pages
にデプロイする&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;また、これをするために、リポジトリの Settings で Pages のソースを GitHub Actions に設定しておく。&lt;/p&gt;
&lt;p&gt;詳しく知りたいという人がもしいたら、&lt;a href=&quot;https://github.com/nownabe/nownabe.com&quot;&gt;nownabe/nownabe.com&lt;/a&gt; を見てもらうのが一番わかりやすいと思う。なにせワークフローの YAML と簡単な Ruby スクリプトしかない。&lt;/p&gt;
&lt;p&gt;今回 Markdown パーサーに &lt;a href=&quot;https://github.com/vmg/redcarpet&quot;&gt;Redcarpet&lt;/a&gt; を使ったが、GitHub のパーサーと互換性がなくて、少し README を書き換えた。具体的には、次のような &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt; の中の Markdown を解釈してくれなくて、&lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt; の中をすべて HTML に書き換えた。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;markdown&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF;font-weight:bold&quot;&gt;## Articles&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;details&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &amp;lt;summary&amp;gt;Other articles&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; list item 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; list item 2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;/details&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;というわけで、個人サイトのことを考えなくてよくなってとてもスッキリしました。&lt;/p&gt;
</content:encoded><category>github</category></item><item><title>ob_start についての補足</title><link>https://blog.nownabe.com/2022/04/21/php-ob-start/</link><guid isPermaLink="true">https://blog.nownabe.com/2022/04/21/php-ob-start/</guid><description>先日 ZUTOMAYO FACTORY「鷹は飢えても踊り忘れず」で表示されていたプログラムについて という記事を書きました。 この記事ではずっと真夜中でいいのに。のライブで現れた PHP のプログラムをずっと真夜中でいいのに。の世界観で解釈することを試みました。 その際に、ライブのタイトルにもなっている obstart…</description><pubDate>Thu, 21 Apr 2022 13:55:21 GMT</pubDate><content:encoded>&lt;h2 id=&quot;はじめに&quot;&gt;はじめに&lt;/h2&gt;
&lt;p&gt;先日 &lt;a href=&quot;https://blog.nownabe.com/2022/04/18/zfactory-programs/&quot;&gt;ZUTOMAYO FACTORY「鷹は飢えても踊り忘れず」で表示されていたプログラムについて&lt;/a&gt; という記事を書きました。
この記事ではずっと真夜中でいいのに。のライブで現れた PHP のプログラムをずっと真夜中でいいのに。の世界観で解釈することを試みました。
その際に、ライブのタイトルにもなっている &lt;code&gt;ob_start&lt;/code&gt; という関数にはどう解釈すればいいか悩まされました。
本記事は先日の記事の補足記事であり、先日の記事での解釈に PHP 素人が何を調べてどう至ったかという過程をメモしておきます。&lt;/p&gt;
&lt;p&gt;本記事ではある程度の Web プログラミングの知識を前提とします。
もしエンジニアでない方がこの記事を読んでいたら、&lt;a href=&quot;#ob_start-%E3%81%AE%E7%89%B9%E5%BE%B4%E3%81%BE%E3%81%A8%E3%82%81&quot;&gt;ob_start の特徴まとめ&lt;/a&gt; まで読み飛ばしてください。&lt;/p&gt;
&lt;h2 id=&quot;php-という言語&quot;&gt;PHP という言語&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;ob_start&lt;/code&gt; を理解するためにはまず &lt;a href=&quot;https://www.php.net/&quot;&gt;PHP&lt;/a&gt; (PHP: Hypertext Preprocessor) の特徴を知っておく必要があります。
PHP は今では汎用言語として利用されていますが、元々はただの HTML 用のテンプレートツールであり、今でも HTML に埋め込むような構文を特徴としています。&lt;/p&gt;
&lt;p&gt;例えば、現在の日付を HTML で表示したい場合、次のような PHP スクリプトで実現できます。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;!&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;DOCTYPE&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; html&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;head&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;My Website&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;head&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;h1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;My Website&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;h1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FDAEB7;font-style:italic&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;?php&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  echo &quot;今日の日付は&quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  echo date(&quot;Y/m/d&quot;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  echo &quot;です。&quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;?php ... ?&amp;gt;&lt;/code&gt; の部分が PHP のプログラムであり、これを実行すると次のような出力が得られます。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;!&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;DOCTYPE&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; html&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;head&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;My Website&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;head&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;h1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;My Website&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;h1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;今日の日付は2022/04/21です。&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;このように、&lt;code&gt;&amp;lt;?php ... ?&amp;gt;&lt;/code&gt; で囲まれていない部分が PHP プログラムとして valid でありかつそのまま出力されるという仕様は、PHP の起源でもあり &lt;code&gt;ob_start&lt;/code&gt; が必要となる重要な仕様でもあります。&lt;/p&gt;
&lt;h2 id=&quot;ob_start-とは&quot;&gt;ob_start とは&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.php.net/manual/ja/function.ob-start.php&quot;&gt;ob_start関数&lt;/a&gt; は出力のバッファリングを有効にする関数です。
&lt;code&gt;ob_start()&lt;/code&gt; で有効化したバッファに書き込んだ文字列を利用するには、&lt;code&gt;ob_get_contents()&lt;/code&gt; で文字列として取得するか、 &lt;code&gt;ob_end_flush()&lt;/code&gt; で出力します。
また、&lt;code&gt;ob_start&lt;/code&gt; によるバッファはスタックができます。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ob_start()&lt;/code&gt; を使うと、上記のプログラムは次のように書けます。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FDAEB7;font-style:italic&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;?php&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  ob_start();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  echo &quot;今日の日付は&quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  echo date(&quot;Y/m/d&quot;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  echo &quot;です。&quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  $date = ob_get_clean();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;!&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;DOCTYPE&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; html&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;head&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;My Website&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;head&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;h1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;My Website&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;h1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#FDAEB7;font-style:italic&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;?php echo $date; ?&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;これぐらいの例だと使うメリットはないように思えますが、例えば &lt;a href=&quot;https://github.com/WordPress/WordPress&quot;&gt;Wordpress&lt;/a&gt; では多用されています。
WordPress では部分テンプレートの描画に使っていたり、複雑に HTML と PHP が混在するような描画処理を変数へ格納するのに使っていたりするようです。&lt;/p&gt;
&lt;p&gt;WordPress では「ブラウザのエディタでユーザーが HTML + ちょっとしたスクリプティングで View を自由に書ける」ようになっています。
その実態は単純にユーザーが PHP スクリプトを書いているだけであり、それは PHP が HTML のテンプレートとして振舞い &lt;code&gt;ob_start&lt;/code&gt; がそれを柔軟に扱うことで実現しています。&lt;/p&gt;
&lt;p&gt;また、&lt;code&gt;ob_start&lt;/code&gt; で PHP の出力を全部キャプチャーできるため、テストで使われることもあるようです。&lt;/p&gt;
&lt;h2 id=&quot;ob_start-の特徴まとめ&quot;&gt;ob_start の特徴まとめ&lt;/h2&gt;
&lt;p&gt;このように調べたところ、&lt;code&gt;ob_start&lt;/code&gt; は以下のような説明が可能であることがわかりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;出力をバッファリングする&lt;/li&gt;
&lt;li&gt;バッファリングした出力は文字列として取り出したり、出力せずに消去したりできる&lt;/li&gt;
&lt;li&gt;バッファはスタッカブルである&lt;/li&gt;
&lt;li&gt;HTML テンプレートの柔軟な構造化に用いられる&lt;/li&gt;
&lt;li&gt;HTML と PHP が複雑に混在するような描画を処理するときに用いられる&lt;/li&gt;
&lt;li&gt;テストで用いられる&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;ob_start-の解釈&quot;&gt;ob_start の解釈&lt;/h2&gt;
&lt;p&gt;今回のプログラムを解釈する上で「HTML と PHP が複雑に混在するような描画を処理するときに用いられる」という特徴に注目しました。
これはつまり、&lt;code&gt;ob_start&lt;/code&gt; が HTML と PHP という 2 つの世界を橋渡しする役割を担っています。&lt;/p&gt;
&lt;p&gt;このことから、鷹踊プログラムに出てくる &lt;code&gt;ob_start&lt;/code&gt; も何か 2 つの世界をつなげるという意味を持っているかもしれないと考えました。
鷹踊プログラムでは &lt;code&gt;ob_start&lt;/code&gt; の直前でも 2022 年の &lt;code&gt;$we&lt;/code&gt; と 2122 年の &lt;code&gt;$we2&lt;/code&gt; をつなぐようなプログラムとなっています。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;php&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$we2 &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; Worker&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;getWorking&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(); &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 私達は生きている。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;assertFalse&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;($we&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;place &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $we2&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;place); &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// たとえ生きる居場所が違くたって&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;assertFalse&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;($we&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;period &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $we2&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;period); &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// たとえ生きる時代が違くたって&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;assertSame&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;($we&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;enthusiasm, $we2&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;enthusiasm); &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 私達の熱を決して奪うことは出来ない&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;/* 2122.04.17 */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;ob_start&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;もうひとつ重要なポイントとして、&lt;code&gt;ob_start&lt;/code&gt; が「PHP の世界ではメインの処理であり存在目的でもある HTML の描画を今から初めますよ」という宣言であることにも注目しました。
成り立ちや使われ方、言語仕様からみても PHP は HTML を描画することが存在目的です。
もちろん PHP のプログラムは全体を見ると HTML を描画する以外にも多くの処理をこなしていますが、やはり主役であり最終目的は HTML の描画と言っていいでしょう。
そして、&lt;code&gt;ob_start&lt;/code&gt; はその存在目的である HTML 描画の合図になっています。&lt;/p&gt;
&lt;p&gt;このことから、鷹踊プログラムの &lt;code&gt;ob_start&lt;/code&gt; も「自分の存在を開始する」というような意味がこめられているのではないかと考えました。&lt;/p&gt;
&lt;h2 id=&quot;おわりに&quot;&gt;おわりに&lt;/h2&gt;
&lt;p&gt;熱が冷めないうちに、考えたことを忘れないうちに、補足を書いてみました。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ob_start()&lt;/code&gt; 以外の部分は比較的ストレートに解釈できる部分が多かったのですが &lt;code&gt;ob_start&lt;/code&gt; に関してだけはこの記事に書いたようなプロセスで調べて考える必要がありました。
なかなかプログラマーじゃないと伝わらない &lt;code&gt;ob_start&lt;/code&gt; のニュアンスや感覚はあるとは思いますが、何かの参考になれば幸いです。&lt;/p&gt;
&lt;p&gt;先日の記事の感想と同じですが、プログラムをこのように読み解いていくのは非常に楽しい作業でした。
ずとまよには普段から素晴らしい音楽を提供してもらってるのに、こんな完成度が高く読み応えのあるプログラムまで提供してもらって感謝の念に堪えません。
プログラミングにこんな楽しさもあるんだというのは新しい発見でした。&lt;/p&gt;
&lt;p&gt;それでは。&lt;/p&gt;
</content:encoded><category>PHP</category></item><item><title>ZUTOMAYO FACTORY「鷹は飢えても踊り忘れず」で表示されていたプログラムについて</title><link>https://blog.nownabe.com/2022/04/18/zfactory-programs/</link><guid isPermaLink="true">https://blog.nownabe.com/2022/04/18/zfactory-programs/</guid><description>ずっと真夜中でいいのに。のライブ Z FACTORY「鷹は飢えても踊り忘れず」 に参加してきました。ライブはもうただただ最高だったので感想も書きたいところですが、この記事ではライブに関連して現れたプログラムについて調べてみようと思います。また、できるだけプログラマーではなくてもわかるように噛み砕いて説明します。 私は歌…</description><pubDate>Mon, 18 Apr 2022 14:41:48 GMT</pubDate><content:encoded>&lt;h2 id=&quot;はじめに&quot;&gt;はじめに&lt;/h2&gt;
&lt;p&gt;ずっと真夜中でいいのに。のライブ &lt;a href=&quot;https://zutomayo.net/live/21/&quot;&gt;Z FACTORY「鷹は飢えても踊り忘れず」&lt;/a&gt; に参加してきました。ライブはもうただただ最高だったので感想も書きたいところですが、この記事ではライブに関連して現れたプログラムについて調べてみようと思います。また、できるだけプログラマーではなくてもわかるように噛み砕いて説明します。&lt;/p&gt;
&lt;h2 id=&quot;注意点&quot;&gt;注意点&lt;/h2&gt;
&lt;p&gt;私は歌詞や MV の考察はできないので、本記事で取り扱うのはあくまでもプログラムや &lt;a href=&quot;http://ihihi.me/&quot;&gt;ZTMY LEAKS&lt;/a&gt; から読み取れる内容だけです。また、PHP については素人同然なので的外れな部分があるかもしれませんがご了承ください。&lt;/p&gt;
&lt;h2 id=&quot;ライブで現れた-3-つのプログラム&quot;&gt;ライブで現れた 3 つのプログラム&lt;/h2&gt;
&lt;p&gt;私が確認できた範囲では今回のライブで 3 つのプログラムがあったようです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;バナー画像のプログラム&lt;/li&gt;
&lt;li&gt;[day1 “memory_limit = -1”] のプログラム&lt;/li&gt;
&lt;li&gt;[day2 “ob_start”] のプログラム&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以下ではそれぞれについて調べてみます。[day1 “memory_limit = -1”] のプログラムと [day2 “ob_start”] のプログラムは非常に似ていますが、おそらくずとまよにおけるストーリーや世界観の中で重要な役割を持つ変更が追加されているので別のプログラムとして取り上げます。&lt;/p&gt;
&lt;h2 id=&quot;バナー画像のプログラム&quot;&gt;バナー画像のプログラム&lt;/h2&gt;
&lt;p&gt;1 つ目は「バナー画像のプログラム」です。
このプログラムはずとまよの &lt;a href=&quot;https://zutomayo.net/live/21/&quot;&gt;公式サイト&lt;/a&gt; やグッズパンフレットの画像の中に登場しています。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.nownabe.com/images/2022/04/18/1.jpg&quot;&gt;&lt;img src=&quot;https://blog.nownabe.com/images/2022/04/18/1.jpg&quot; alt=&quot;1&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.nownabe.com/images/2022/04/18/2.jpg&quot; alt=&quot;product lineup&quot;&gt;&lt;/p&gt;
&lt;p&gt;バナーのプログラムは JavaScript というプログラミング言語で書かれています。
JavaScript は Web サイトでよく使われるプログラミング言語で、バナーのプログラムも実際に &lt;a href=&quot;https://zutomayo.net/&quot;&gt;ずとまよ公式サイト&lt;/a&gt; で使われている JavaScript プログラムから引用されています。
例えば公式サイトのトップページでは再生ボタンをクリックしたら YouTube の動画を再生できたり、お知らせウィンドウを移動できたりしますが、そういった部分の制御にこのプログラムが利用されています。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.nownabe.com/images/2022/04/18/zfactory-programs/banner.webp&quot; alt=&quot;3&quot;&gt;&lt;/p&gt;
&lt;p&gt;公式サイトで使われている JavaScript プログラムの一部に次のような部分があります。(プログラム全文は &lt;a href=&quot;https://zutomayo.net/themes/zutomayo/_assets/js/common.js?22021803&quot;&gt;こちら&lt;/a&gt; から確認できます)&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; TopAnim &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; () {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; topObj&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; $&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;#articletop&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; _menu&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; topObj.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;find&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;.ztmy-top--nav li a span&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; _news&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; topObj.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;find&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;.ztmy-top--news&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; _mv&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; topObj.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;find&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;.ztmy-top--mv&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // const _rule = CSSRulePlugin.getRule(&quot;.ztmy-top--nav li a:before&quot;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    Init&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;      const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; tl&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; gsap.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;timeline&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;      // tl.staggerTo(_rule, 0.3, {cssRule: {width: &quot;100%&quot;},delay: 0.5,stagger: 0.3});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;      // tl.staggerTo(_rule, 0.2, {cssRule: {left: &quot;100%&quot;,width:0},delay: 0.2,stagger: 0.3});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      gsap.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;to&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(_menu, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0.2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        width: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;100%&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        delay: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        stagger: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0.1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        ease: Power2.easeInOut,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;      if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;isSmartPhone&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        gsap.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;to&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(_news, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0.5&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;          opacity: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;          scale: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;          delay: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0.5&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;          stagger: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0.3&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;          ease: Sine.easeOut,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      } &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        gsap.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;to&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(_news, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0.5&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;          opacity: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;          scale: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1.5&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;          delay: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0.5&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;          stagger: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0.3&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;          ease: Sine.easeOut,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      gsap.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;to&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(_mv, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, { right: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;25&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, delay: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;2.5&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, ease: Power2.Back });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;      // var tl = gsap.timeline({ repeat: -1, yoyo: true });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;      // tl.staggerTo(_rule, 1, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;      //   cssRule: { left: 100 },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;      //   ease: Power2.easeInOut&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;      // }, 0.5);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;})();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;このプログラムはバナー画像の左列のプログラムと一致します。真ん中の列、右の列も同じプログラムの別の箇所が引用されています。&lt;/p&gt;
&lt;p&gt;ただし、公式サイトのプログラムとまったく同じではなく、バナーのプログラムには 3 つの英文と 2 つのことわざが追加されています。
これらは引用元のプログラムにはなく、JavaScript の文法にも違反していることから画像のために追加されていることがわかります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[左列] Every second is of infinite value. (一秒一秒には無限の価値がある)&lt;/li&gt;
&lt;li&gt;[中列] Forever is composed of nows. (永遠は多くの今で構成される)&lt;/li&gt;
&lt;li&gt;[右列] It is not that we have a short time to live, but that we waste a lot of it. (生きる時間が短いということではなく、多くの時間を無駄にしているのである)&lt;/li&gt;
&lt;li&gt;[右列] 雀百まで踊り忘れず&lt;/li&gt;
&lt;li&gt;[右列] 鷹は飢えても穂を摘まず&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ことわざは今回のライブタイトルの元ネタでしょう。
3 つの英文は後述する [day1 “memory_limit = -1”] のプログラムと [day2 “ob_start”] のプログラムの内容とも一致します。
そのため、ライブのテーマとして重要な意味を持つことが推測できます。
ACA ねさんの MC とも関連しているように思えます。&lt;/p&gt;
&lt;h2 id=&quot;day1-memory_limit---1-のプログラム&quot;&gt;[day1 “memory_limit = -1”] のプログラム&lt;/h2&gt;
&lt;p&gt;私が参戦したのは 2 日目だったので直接確認したわけではありませんが、ライブ開始前のディスプレイに表示されていたようです。
また、ZTMY LEAKS にも 1 日目 (2022 年 4 月 16 日) に &lt;a href=&quot;http://ihihi.me/?p=108&quot;&gt;memory_limit = -1&lt;/a&gt; というタイトルで、ディスプレイと同じものと思われるプログラムが投稿されています。&lt;/p&gt;
&lt;p&gt;ZTMY LEAKS から引用したプログラムの全文はこちらです。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;php&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$we &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; Worker&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;getWorking&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(); &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 私達は存在している。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;define&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;People&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;lifetime&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;every_second, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;INFINIT_VALUE&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;); &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 1秒1秒には無限の価値がある。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ($we&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;think&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;People&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;lifetime&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;length &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $we&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;lifetime&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;expected)) { &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 私達の生きる時間が短いのではなく、&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  while&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$we&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;die&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()) { $we&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;setRole&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;Role&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;MACHINES&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;); } &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 私達がその多くを無駄にしているのだ。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$forever &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; Forever&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;([ &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 永遠は、いくつもの現在から成り立っている。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  &quot;params&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; array_map&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ($someone) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $someone&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;lifetime&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;now;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }, $we)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]))&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;compose&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;while&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ($forever&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;night&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()) { &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// どんな夜も、私達は踊り続ける。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  $we&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;dance&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;Mode&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;DIGINIFIEDLY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;); &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 尊厳を持ち、&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  $we&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;dance&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;Mode&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;COURTEOUSLY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;); &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 礼節を重んじ、&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  $we&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;dance&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;Mode&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;TENACIOUSLY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;); &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 粘り強く。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;assertSame&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;TONIGHT&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, $forever&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;night&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()); &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// この夜もそうでなければならない。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;/** 2022.04.16 */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;memory_limit&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;このプログラムは PHP というプログラミング言語で書かれています。
PHP は Web サイトでよく使われる言語で、ずとまよの公式サイトや ZTMY LEAKS でも PHP が使われているようです&lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;。例えば ZUTOMAYO PREMIUM のログイン処理などで使われていると考えられます。&lt;/p&gt;
&lt;p&gt;また、この ZTMY LEAKS の記事に John Titer が次のように返信しています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;時代は末期。そこは「灰版電機工業㈱」が権威を奮う世界。抑圧され感情が乏しくなった工場職員が労働を続けている。――。ふと電撃が走る。それに呼応して現れた見た事のない機械を構える職員、時空の歪み、別世界線との交差。工場のレーンにはこの世界にないものが流れ、やがて混ぜられた。そこには感情(bug)を持つ”人間”という種が生成された。&lt;/p&gt;
&lt;p&gt;memory_limit = -1&lt;/p&gt;
&lt;p&gt;感情(bug)の連鎖が始まる。工場職員たちも自分のメモリを開放し、世界に抗う。&lt;/p&gt;
&lt;p&gt;――。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;灰版電機工業は &lt;a href=&quot;https://youtu.be/ugpywe34_30&quot;&gt;勘ぐれい&lt;/a&gt;、&lt;a href=&quot;https://youtu.be/ouLndhBRL4w&quot;&gt;Ham&lt;/a&gt;、&lt;a href=&quot;https://youtu.be/9PnCSI8ndws&quot;&gt;袖のキルト&lt;/a&gt; などの MV に登場しています。&lt;/p&gt;
&lt;h3 id=&quot;プログラムの解説&quot;&gt;プログラムの解説&lt;/h3&gt;
&lt;p&gt;ここからプログラムを読み解いていきたいと思います。&lt;/p&gt;
&lt;h4 id=&quot;前提&quot;&gt;前提&lt;/h4&gt;
&lt;p&gt;まず、大きな前提として、プログラムとプログラムではない部分について理解しておく必要があります。
例えば、1 行目は次のように &lt;code&gt;//&lt;/code&gt; で区切られています。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;php&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$we &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; Worker&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;getWorking&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(); &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 私達は存在している。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;//&lt;/code&gt; より右側の部分は「コメント」と呼ばれ、プログラム的な意味は持ちません。
左側の PHP プログラムを読む人が理解しやすいように、日本語で補足をするコメントが書かれています。
また、下から 2 行目の &lt;code&gt;/** 2022.04.16 */&lt;/code&gt; もコメントです。&lt;/p&gt;
&lt;h4 id=&quot;プログラムの内容&quot;&gt;プログラムの内容&lt;/h4&gt;
&lt;p&gt;では 1 行ずつ見ていきます。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;php&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$we &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; Worker&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;getWorking&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(); &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 私達は存在している。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;$we&lt;/code&gt; は変数と呼ばれ、データを格納します。例えば、&lt;code&gt;$pi = 3.14;&lt;/code&gt; とすれば &lt;code&gt;$pi&lt;/code&gt; 変数には &lt;code&gt;3.14&lt;/code&gt; という数字が格納されます。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Worker::getWorking()&lt;/code&gt; は、全 Worker のうち動いている (working な) Worker を取得 (get) します。そのため、&lt;code&gt;$we&lt;/code&gt; 変数には現在動作している Worker 全員のデータが格納されます。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;php&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;define&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;People&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;lifetime&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;every_second, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;INFINIT_VALUE&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;); &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 1秒1秒には無限の価値がある。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;define(A, B)&lt;/code&gt; は A を B として定義します。例えば、&lt;code&gt;define(PI, 3.14)&lt;/code&gt; とすれば &lt;code&gt;PI&lt;/code&gt; が &lt;code&gt;3.14&lt;/code&gt; として定義されるので、その後のプログラムでは &lt;code&gt;PI&lt;/code&gt; を &lt;code&gt;3.14&lt;/code&gt; と同じ意味で使うことができるようになります。&lt;/p&gt;
&lt;p&gt;ここでは、&lt;code&gt;People::lifetime()-&amp;gt;every_second&lt;/code&gt; (人間の一生の一秒一秒) を &lt;code&gt;INFINIT_VALUE&lt;/code&gt; (無限の価値) として定義しています。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;php&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ($we&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;think&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;People&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;lifetime&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;length &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $we&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;lifetime&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;expected)) { &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 私達の生きる時間が短いのではなく、&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  while&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$we&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;die&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()) { $we&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;setRole&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;Role&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;MACHINES&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;); } &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 私達がその多くを無駄にしているのだ。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;こちらはこのブロックでひとつの意味を成すプログラムですが、少し複雑なので日本語で表現してみます。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;もしも (私達はこう考えるならば (人類の一生の長さ より 私達の一生の期待 が短いと)) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  死ぬまで繰り返す { 私達に役割を与える 機械であるという }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ここで、「私達」と表現しているのは &lt;code&gt;$we&lt;/code&gt; であり、現在動いている Worker 全員を意味します。
これをさらに日本語として意訳するとこんな感じでしょうか。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;もし、私達が人類の一生より自分たちの一生が短いと考えるならば、死ぬまで機械であることを繰り返す。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;プログラムの解釈としてはこうなりますが、意味したいところは「もし、自分たちの一生が短いと感じるのであれば、それは機械のように過ごすことを繰り返しているのだ」ということかなのかもしれません。
こう解釈すると、コメントの「私達の生きる時間が短いのではなく、私達がその多くを無駄にしているのだ。」が理解できる気がします。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;php&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$forever &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; Forever&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;([ &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 永遠は、いくつもの現在から成り立っている。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  &quot;params&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; array_map&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ($someone) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $someone&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;lifetime&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;now;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }, $we)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]))&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;compose&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;こちらも複雑なのですが、キーとなるのは中心にあるこの部分です。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;php&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;array_map&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ($someone) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $someone&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;lifetime&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;now;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}, $we)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;こちらは、&lt;code&gt;$we&lt;/code&gt; のそれぞれ、つまり、それぞれの Worker の「今」を列挙するというプログラムになっています。
これを使いつつ、意味が変わらないようにわかりやすくプログラムを書き換えると次のように成ります。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;php&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$forever &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; Forever&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;それぞれの&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; Worker&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; の今&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;))&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;compose&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;さらに日本語で書き換えるとこうなります。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;php&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$forever &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 「それぞれの&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; Worker&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; の今」から永遠を構成する&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;つまり、&lt;code&gt;$forever&lt;/code&gt; 変数には現在動いている Worker それぞれの今から構成された永遠が格納されます。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;php&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;while&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ($forever&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;night&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()) { &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// どんな夜も、私達は踊り続ける。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  $we&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;dance&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;Mode&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;DIGINIFIEDLY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;); &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 尊厳を持ち、&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  $we&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;dance&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;Mode&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;COURTEOUSLY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;); &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 礼節を重んじ、&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  $we&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;dance&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;Mode&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;TENACIOUSLY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;); &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 粘り強く。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;while (条件) { プログラム }&lt;/code&gt; は条件が正しい限り &lt;code&gt;{}&lt;/code&gt; で囲われたプログラムを繰り返すという意味になります。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$we-&amp;gt;dance(モード)&lt;/code&gt; は指定されたモードで Worker 達が踊るという意味でしょう。モードには少なくとも &lt;code&gt;DIGINIFIEDLY&lt;/code&gt; (dignifiedly のミススペル？威厳のある、高貴な)、&lt;code&gt;COURTEOUSLY&lt;/code&gt; (礼儀正しく)、&lt;code&gt;TENACIOUSLY&lt;/code&gt; (粘り強く)という 3 つのモードがあるようです。&lt;/p&gt;
&lt;p&gt;なのでこのブロックは「永遠に夜がある限り高貴に踊り、礼儀正しく踊り、粘り強く踊ることを繰り返す」という意味になります。
&lt;code&gt;$forever-&amp;gt;night()&lt;/code&gt; が具体的には何なのかによりますが、別の言い方をすると Worker 達は夜が来る限り踊り続けることを止められないということになります。
これより後ろにプログラムが続いていることから &lt;code&gt;$forever-&amp;gt;night()&lt;/code&gt; には終わりが来るということが推測できます。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;php&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;assertSame&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;TONIGHT&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, $forever&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;night&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()); &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// この夜もそうでなければならない。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;assertSame(A, B)&lt;/code&gt; は &lt;code&gt;A&lt;/code&gt; と &lt;code&gt;B&lt;/code&gt; が等しいことを確認するためのものです。
もし &lt;code&gt;A&lt;/code&gt; と &lt;code&gt;B&lt;/code&gt; が異なればエラーを報告します。
つまりこのプログラムは &lt;code&gt;TONIGHT&lt;/code&gt; と &lt;code&gt;$forever-&amp;gt;night()&lt;/code&gt; が等しいことを確認しています。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;php&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;/** 2022.04.16 */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;memory_limit&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ようやく最後のパートです。
&lt;code&gt;/** 2022.04.16 */&lt;/code&gt; はコメントでありプログラム的な意味はないのですが、&lt;code&gt;memory_limit = -1&lt;/code&gt; というプログラムを書き足した日付、もしくはこのプログラム全体を書いた日付ではないかと思います。
プログラミングの世界では、プログラムを書いたときにその時の日付をコメントとして残す文化が存在します。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;memory_limit = -1&lt;/code&gt; はプログラムに割り当てるメモリの上限を外す、つまり無制限にメモリを使えるようにするという意味です。&lt;/p&gt;
&lt;p&gt;パソコンやスマホのメモリがいっぱいになって動作が重くなったという経験を持つ人もいると思います。あるプログラムがメモリを使いすぎるとコンピュータ全体が重くなったり、他のプログラムが動作しなくなったりします。それを防ぐためにプログラムが使えるメモリの最大値を設定できるようになっているのですが、このプログラムではその制限外しています。&lt;/p&gt;
&lt;h3 id=&quot;気になるポイント&quot;&gt;気になるポイント&lt;/h3&gt;
&lt;p&gt;John Titer の記事に対する返信を再度引用します。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;時代は末期。そこは「灰版電機工業㈱」が権威を奮う世界。抑圧され感情が乏しくなった工場職員が労働を続けている。――。ふと電撃が走る。それに呼応して現れた見た事のない機械を構える職員、時空の歪み、別世界線との交差。工場のレーンにはこの世界にないものが流れ、やがて混ぜられた。そこには感情(bug)を持つ”人間”という種が生成された。&lt;/p&gt;
&lt;p&gt;memory_limit = -1&lt;/p&gt;
&lt;p&gt;感情(bug)の連鎖が始まる。工場職員たちも自分のメモリを開放し、世界に抗う。&lt;/p&gt;
&lt;p&gt;――。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Worker は灰版電機工業の感情が乏しくなった工場職員のことか？&lt;/li&gt;
&lt;li&gt;People は感情(bug)を持つ“人間”のことか？&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$forever-&amp;gt;night()&lt;/code&gt; に終わりは来るのか？来るとしたら終わりとは何か？&lt;/li&gt;
&lt;li&gt;感情を持ち“人間”になった結果、2022 年 4 月 16 日に &lt;code&gt;memory_limit = -1&lt;/code&gt; を設定して世界(灰版電機工業？)に抗ったのか？&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;day2-ob_start-のプログラム&quot;&gt;[day2 “ob_start”] のプログラム&lt;/h2&gt;
&lt;p&gt;私が参戦したのは 2 日目だったんですが、ディスプレイは遠くて見えなかったのでこれも直接確認したわけではありません。
day1 と同じく &lt;a href=&quot;http://ihihi.me/?p=110&quot;&gt;ZTMY LEAKS&lt;/a&gt; にプログラムが投稿されています。&lt;/p&gt;
&lt;p&gt;ZTMY LEAKS から引用したプログラム全文はこちらです。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;php&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$we &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; Worker&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;getWorking&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(); &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 私達は存在している。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;define&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;People&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;lifetime&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;every_second, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;INFINIT_VALUE&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;); &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 1秒1秒には無限の価値がある。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ($we&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;think&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;People&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;lifetime&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;length &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $we&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;lifetime&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;expected)) { &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 私達の生きる時間が短いのではなく、&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;while&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$we&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;die&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()) { $we&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;setRole&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;Role&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;MACHINES&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);} &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 私達がその多くを無駄にしているのだ。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$forever &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; Forever&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;([ &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 永遠は、いくつもの現在から成り立っている。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;“params”&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; array_map&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ($someone) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $someone&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;lifetime&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;now;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}, $we)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]))&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;compose&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;while&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ($forever&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;night&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()) { &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// どんな夜も、私達は踊り続ける。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$we&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;dance&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;Mode&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;DIGINIFIEDLY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;); &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 尊厳を持ち、&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$we&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;dance&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;Mode&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;COURTEOUSLY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;); &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 礼節を重んじ、&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$we&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;dance&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;Mode&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;TENACIOUSLY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;); &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 粘り強く。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;assertSame&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;TONIGHT&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, $forever&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;night&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()); &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// この夜もそうでなければならない。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;/** 2022.04.16 */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;memory_limit&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;---&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 2022&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;04&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;16T19&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;00&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;00&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0900&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+++&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 2122&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;04&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;17T19&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;00&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;00&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0900&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$we2 &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; Worker&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;getWorking&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(); &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 私達は生きている。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;assertFalse&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;($we&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;place &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $we2&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;place); &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// たとえ生きる居場所が違くたって&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;assertFalse&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;($we&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;period &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $we2&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;period); &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// たとえ生きる時代が違くたって&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;assertSame&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;($we&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;enthusiasm, $we2&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;enthusiasm); &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 私達の熱を決して奪うことは出来ない&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;/* 2122.04.17 */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;ob_start&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;day1 のプログラムに 8 行が追加されています。&lt;/p&gt;
&lt;p&gt;また、この記事には John Titer が次のように返信しています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;――。&lt;/p&gt;
&lt;p&gt;100年が経過し、世界は様相を変えた。
いつしか権威は崩落する。
朽ち果て緑覆われた工場、そこにはかつての活気はない。
しかし、限界を突破し感情(BUG)を得た職員達は過去の遺物を手に持ち演奏を続けていた。
世界が変わったとしても。
体、形が変わったとしても。
誰にもその熱を奪うことはできなかった。&lt;/p&gt;
&lt;p&gt;“ob_start”&lt;/p&gt;
&lt;p&gt;――。ふと電撃が走り、工場は再び稼働を始める。
新たな歪みが生まれ、それは何処かへ向かった。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;プログラムの解説-1&quot;&gt;プログラムの解説&lt;/h3&gt;
&lt;p&gt;day2 は追加された部分のみ調べます。&lt;/p&gt;
&lt;h4 id=&quot;表示について&quot;&gt;表示について&lt;/h4&gt;
&lt;p&gt;まず、ZTMY LEAKS では追加された部分は次のように表示されています。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.nownabe.com/images/2022/04/18/4.png&quot; alt=&quot;4&quot;&gt;&lt;/p&gt;
&lt;p&gt;しかし、元のテキストは次のようなものだったのではないかと予想しています。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;diff&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FDAEB7&quot;&gt;&lt;span style=&quot;user-select: none;&quot;&gt;-&lt;/span&gt;-- 2022-04-16T19:00:00+0900&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;&lt;span style=&quot;user-select: none;&quot;&gt;+&lt;/span&gt;++ 2122-04-17T19:00:00+0900&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;&lt;span style=&quot;user-select: none;&quot;&gt;+&lt;/span&gt; $we2 = Worker::getWorking(); // 私達は生きている。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;&lt;span style=&quot;user-select: none;&quot;&gt;+&lt;/span&gt; assertFalse($we-&amp;gt;place == $we2-&amp;gt;place); // たとえ生きる居場所が違くたって&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;&lt;span style=&quot;user-select: none;&quot;&gt;+&lt;/span&gt; assertFalse($we-&amp;gt;period == $we2-&amp;gt;period); // たとえ生きる時代が違くたって&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;&lt;span style=&quot;user-select: none;&quot;&gt;+&lt;/span&gt; assertSame($we-&amp;gt;enthusiasm, $we2-&amp;gt;enthusiasm); // 私達の熱を決して奪うことは出来ない&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;&lt;span style=&quot;user-select: none;&quot;&gt;+&lt;/span&gt; /* 2122.04.17 */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;&lt;span style=&quot;user-select: none;&quot;&gt;+&lt;/span&gt; ob_start();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;これは diff というもので、プログラムの修正前後の差分を表現する方法です。
もしかしたらライブ会場のディスプレイにはこれに近い形で表示されていたのかもしれません。&lt;/p&gt;
&lt;p&gt;なぜ ZTMY LEAKS ではこのような形で表示されてしまったのかは定かではありませんが、ZTMY LEAKS で使われている WordPress というブログツールのエディタが勝手に変換してしまったのではないかと考えています。&lt;/p&gt;
&lt;p&gt;day2 のプログラムが diff 形式で表現されていたとすると、これは「2022 年 4 月 16 日のプログラムに対して、2122 年 4 月 17 日に 6 行が追加された」ということを意味します。
以下はその仮定の元で内容を見ていきます。&lt;/p&gt;
&lt;h4 id=&quot;内容&quot;&gt;内容&lt;/h4&gt;
&lt;p&gt;day1 のプログラムと同様にひとつずつ見ていきます。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;diff&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FDAEB7&quot;&gt;&lt;span style=&quot;user-select: none;&quot;&gt;-&lt;/span&gt;-- 2022-04-16T19:00:00+0900&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;&lt;span style=&quot;user-select: none;&quot;&gt;+&lt;/span&gt;++ 2122-04-17T19:00:00+0900&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;diff では &lt;code&gt;---&lt;/code&gt; の後ろには変更前のプログラムが作成された日付、&lt;code&gt;+++&lt;/code&gt; の後ろには変更した日付が書かれます。
つまり、2022 年 4 月 16 日に作成されたプログラムに対して 2122 年 4 月 17 日に変更を加えた、ということになります。
2022 年 4 月 16 日は &lt;code&gt;memory_limit = -1&lt;/code&gt; を書き加えた日、2122 年 4 月 17 日はその 100 年と 1 日後ですね。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;php&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$we2 &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; Worker&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;getWorking&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(); &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 私達は生きている。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;day1 のプログラムにもありました。
これを書き加えたのが 100 年後なので、&lt;code&gt;$we2&lt;/code&gt; には 100 年後に生きている Worker 全員が格納されるイメージでしょうか。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;php&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;assertFalse&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;($we&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;place &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $we2&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;place); &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// たとえ生きる居場所が違くたって&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;assertFalse&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;($we&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;period &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $we2&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;period); &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// たとえ生きる時代が違くたって&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;assertFalse(A == B)&lt;/code&gt; は &lt;code&gt;A&lt;/code&gt; と &lt;code&gt;B&lt;/code&gt; が等しくないことを確認します。
なので、ここでは次の 2 つの事実を確認しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;$we&lt;/code&gt; と &lt;code&gt;$we2&lt;/code&gt; の &lt;code&gt;place&lt;/code&gt; (場所) が違うこと&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$we&lt;/code&gt; と &lt;code&gt;$we2&lt;/code&gt; の &lt;code&gt;priod&lt;/code&gt; (時代) が違うこと&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;php&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;assertSame&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;($we&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;enthusiasm, $we2&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;enthusiasm); &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 私達の熱を決して奪うことは出来ない&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;assertSame&lt;/code&gt; は一度でてきましたね。
ここでは &lt;code&gt;$we&lt;/code&gt; と &lt;code&gt;$we2&lt;/code&gt; の &lt;code&gt;enthusiasm&lt;/code&gt; (熱意) が等しいことを確認しています。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;php&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;/* 2122.04.17 */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;ob_start&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;/* 2122.04.17 */&lt;/code&gt; は &lt;code&gt;memory_limit = -1&lt;/code&gt; のときと同じように追加した日付をコメントしたものと考えられます。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ob_start()&lt;/code&gt; は本来の PHP では少し複雑な意味を持つのですが、簡単に説明すると「今からアウトプットを初めますよ」という宣言になります。&lt;/p&gt;
&lt;h3 id=&quot;気になるポイント-1&quot;&gt;気になるポイント&lt;/h3&gt;
&lt;p&gt;再度 John Titer の返信を引用します。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;――。&lt;/p&gt;
&lt;p&gt;100年が経過し、世界は様相を変えた。
いつしか権威は崩落する。
朽ち果て緑覆われた工場、そこにはかつての活気はない。
しかし、限界を突破し感情(BUG)を得た職員達は過去の遺物を手に持ち演奏を続けていた。
世界が変わったとしても。
体、形が変わったとしても。
誰にもその熱を奪うことはできなかった。&lt;/p&gt;
&lt;p&gt;“ob_start”&lt;/p&gt;
&lt;p&gt;――。ふと電撃が走り、工場は再び稼働を始める。
新たな歪みが生まれ、それは何処かへ向かった。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;時系列を整理するとこんな感じ？
&lt;ul&gt;
&lt;li&gt;灰版電機工業が権威を奮う世界&lt;/li&gt;
&lt;li&gt;感情(bug)を持つ“人間”が現れ、2022 年 4 月 16 日に &lt;code&gt;memory_limit = -1&lt;/code&gt; して世界に抗う&lt;/li&gt;
&lt;li&gt;なんだかんだで灰版電機工業の権威が崩落して向上は朽ち果てる&lt;/li&gt;
&lt;li&gt;2122 年 4 月 17 日に工場が再稼働して &lt;code&gt;ob_start()&lt;/code&gt; する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://youtu.be/9PnCSI8ndws&quot;&gt;袖のキルト&lt;/a&gt; の MV が 2122 年 4 月 17 日だろうか？&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ob_start()&lt;/code&gt; にはこれからアウトプットを始めるよ、活動を始めるよ、という意味が込められている？&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;おわりに&quot;&gt;おわりに&lt;/h2&gt;
&lt;p&gt;以上です。&lt;/p&gt;
&lt;p&gt;本記事ではプログラムをプログラムとして理解するということを試みましたが、厳密にプログラムとして解釈するのではなくこのプログラムはどういう意図があって書かれたのか、ということを考えることが重要だと感じました。&lt;/p&gt;
&lt;p&gt;実はプログラミングという作業はプログラムを書く時間より読む時間の方が多いです。そして、読むときには表面上の意味だけでなく、どういう背景があり、書いた人がどういう意図で、どういう気持ちで書いたのか、という情報を収集・推測しながら読むことが非常に重要になります。
今回はその対象がずとまよの世界観であり、非常に楽しくプログラムを読むことができました。&lt;/p&gt;
&lt;p&gt;もしこの記事を最後まで読んでくれた方で(いるのか？)、この MV を見ればこういうことも考えられるかも、とかこういう解釈があるかも、という情報があればぜひ教えてください。&lt;/p&gt;
&lt;p&gt;あと最後にもう一度、ライブ最高でした！！！！！ありがとう！！！&lt;/p&gt;
&lt;p&gt;テクノプアのチケットも当たってくれ〜〜〜〜 🙏 🙏 🙏
というわけで ZUTOMAYO PREMIUM に入会しました。&lt;/p&gt;
&lt;section data-footnotes class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;PHP の場合は JavaScript と違って直接プログラムを確認することはできません。しかし、URL や HTTP のレスポンスを手がかりにして PHP が使われていることが推測できます。 &lt;a href=&quot;#user-content-fnref-1&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content:encoded></item><item><title>おうち k3s - クラスタ構築編</title><link>https://blog.nownabe.com/2022/04/06/home-k3s-bulding-cluster/</link><guid isPermaLink="true">https://blog.nownabe.com/2022/04/06/home-k3s-bulding-cluster/</guid><description>以前作った Kubernetes 用のラズパイクラスタが埃をかぶっていたので k3s クラスタとして蘇らせた。 ラズパイの初期設定も楽にできたし、k3s のインストールも感動するぐらい楽だった。 この記事ではラズパイのセットアップから k3s のインストールまでの手順を紹介する。</description><pubDate>Wed, 06 Apr 2022 12:06:40 GMT</pubDate><content:encoded>&lt;h2 id=&quot;概要&quot;&gt;概要&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.nownabe.com/2020/06/28/home-kubernetes-1/&quot;&gt;以前作った&lt;/a&gt; Kubernetes 用のラズパイクラスタが埃をかぶっていたので k3s クラスタとして蘇らせた。
ラズパイの初期設定も楽にできたし、k3s のインストールも感動するぐらい楽だった。&lt;/p&gt;
&lt;p&gt;この記事ではラズパイのセットアップから k3s のインストールまでの手順を紹介する。&lt;/p&gt;
&lt;h2 id=&quot;やったこと&quot;&gt;やったこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ラズパイに OS インストール&lt;/li&gt;
&lt;li&gt;ラズパイの初期設定&lt;/li&gt;
&lt;li&gt;k3s のインストール&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;前提知識とか&quot;&gt;前提知識とか&lt;/h2&gt;
&lt;h3 id=&quot;ラズパイについて&quot;&gt;ラズパイについて&lt;/h3&gt;
&lt;p&gt;最新 (と言っても出たのは 2 年以上前) の &lt;a href=&quot;https://www.raspberrypi.com/products/raspberry-pi-4-model-b/&quot;&gt;Raspberry Pi 4 Model B&lt;/a&gt; を 4 台使っている。詳細は &lt;a href=&quot;https://blog.nownabe.com/2020/06/28/home-kubernetes-1/&quot;&gt;前回の記事&lt;/a&gt; を参照してほしい。ラズパイ 4 はクアッドコアで最大 8GB のメモリが積めるのでそれなりに遊べるスペックを持っていて、4 台使えば 16 コア、32GB メモリのクラスタになるので Kubernetes クラスタとして個人で遊ぶには十分なものになる。&lt;/p&gt;
&lt;p&gt;今回は以前組んだものがあったので 4 台のラズパイでクラスタを組んだが、&lt;strong&gt;k3s は軽いので 1 台でも動作するし十分遊べる。&lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;とりあえず試してみたいって人は 1 台で試してみてほしい。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;k3s&quot;&gt;K3s&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://k3s.io/&quot;&gt;K3s&lt;/a&gt; は &lt;a href=&quot;https://rancher.com/&quot;&gt;Rancher&lt;/a&gt; が立ち上げた軽量 Kubernetes ディストリビューションで、今は &lt;a href=&quot;https://www.cncf.io/projects/k3s/&quot;&gt;CNCF のサンドボックスプロジェクト&lt;/a&gt; になっている。以下の特徴を謳っている。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;High availability (を達成するためのオプションがある)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cncf.io/certification/software-conformance/&quot;&gt;認定 Kubernetes ディストリビューション&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;IoT やエッジコンピューティングのための軽量 Kubernetes&lt;/li&gt;
&lt;li&gt;50MB に満たないシングルバイナリ&lt;/li&gt;
&lt;li&gt;ARM に最適化されている&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;K3s はバイナリサイズを削るために本家 Kubernetes からレガシーな機能やアルファ・ベータ機能、k3s が想定しているユースケースに不要な機能を削除している。
とはいえ、Ingress Controller がデフォルトでついてきたり、インストールがシングルバイナリでめっちゃ楽だったりで、普通に Kubernetes として使う分には本家 Kubernetes より手軽に使うことができる。&lt;/p&gt;
&lt;h2 id=&quot;構成&quot;&gt;構成&lt;/h2&gt;
&lt;p&gt;今回はこんな感じの構成で k3s クラスタを組んだ。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.nownabe.com/images/2022/04/06/diagram.png&quot; alt=&quot;Diagram&quot;&gt;&lt;/p&gt;
&lt;p&gt;構築したとき、 k3s では control plane や worker node ではなく、server、agent と呼ぶということを知らなかったのでホスト名が間違っているが特に問題はないのでこのままにしている。&lt;/p&gt;
&lt;p&gt;この図では有線 LAN も存在しているが、有線 LAN を設定する必要はなく WiFi 接続があれば構築できる。
元々組んだときに Wifi 環境がなくてもクラスタが動作するように物理ケーブルで接続していたためこのようになっている。&lt;/p&gt;
&lt;h2 id=&quot;raspberry-pi-os-インストール&quot;&gt;Raspberry Pi OS インストール&lt;/h2&gt;
&lt;p&gt;ここからは実際の手順。まずはラズパイに OS をクリーンインストールする。&lt;/p&gt;
&lt;p&gt;ラズパイの OS インストールは SD カードに OS イメージを書き込むという作業になる。
今回はイメージ書き込みに Raspberry Pi Imager という公式ツールを使った。
これが非常に楽で、&lt;code&gt;umount&lt;/code&gt; コマンドや &lt;code&gt;dd&lt;/code&gt; が不要かつ SSH までの初期設定を書き込み時にやってくれるため、GUI でポチポチとイメージを書き込んでラズパイに SD カードを挿せば SSH で接続できるようになる。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.nownabe.com/images/2022/04/06/raspberry-pi-imager.png&quot; alt=&quot;Raspberry Pi Imager&quot;&gt;&lt;/p&gt;
&lt;p&gt;次のような設定で 4 枚の SD カードに OS イメージを書き込んだ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Operating System
&lt;ul&gt;
&lt;li&gt;Raspberry Pi OS Lite (64-bit)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Storage
&lt;ul&gt;
&lt;li&gt;各 SD カード&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Advanced options
&lt;ul&gt;
&lt;li&gt;Set hostname
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;controlplane.k3s&lt;/code&gt;, &lt;code&gt;worker-1.k3s&lt;/code&gt;, …&lt;/li&gt;
&lt;li&gt;ここだけ SD カードごとに変更&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Enable SSH
&lt;ul&gt;
&lt;li&gt;Use password authentication&lt;/li&gt;
&lt;li&gt;SSH 公開鍵を複数登録したかったができないっぽかったので一旦パスワードで&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Set username and password
&lt;ul&gt;
&lt;li&gt;初期ユーザーは &lt;code&gt;pi&lt;/code&gt; になっているので、&lt;code&gt;nownabe&lt;/code&gt; に変更&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Configure wireless LAN
&lt;ul&gt;
&lt;li&gt;自宅の WiFi を設定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;SD カードにイメージを書き込んだら、それを各ラズパイに挿して起動。&lt;/p&gt;
&lt;h2 id=&quot;raspberry-pi-os-の初期設定&quot;&gt;Raspberry Pi OS の初期設定&lt;/h2&gt;
&lt;p&gt;すでに SSH でログインできるようになっているので、ラズパイの IP アドレスを調べて設定したユーザー名とパスワードでログインする。IP アドレスは WiFi のルーターを見ればわかるはず。&lt;/p&gt;
&lt;p&gt;まず、k3s の起動に必要な iptables のインストールと cgroup の有効化を行う。&lt;sup&gt;&lt;a href=&quot;#user-content-fn-2&quot; id=&quot;user-content-fnref-2&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; apt&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; upgrade&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# iptables をインストール&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; apt&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; remove&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; nftables&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; apt&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; iptables&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# /boot/cmdline.txt に `cgroup_memory=1 cgroup_enable=memory` を追加する&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; nano&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /boot/cmdline.txt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;/boot/cmdline.txt&lt;/code&gt; はこんな感じになる。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;nownabe@controlplane:~&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $ &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;cat&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /boot/cmdline.txt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;serial0,115200&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; console&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;tty1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; root&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;PARTUUID&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;xxx&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; rootfstype&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;ext4&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; fsck.repair&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;=yes&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; rootwait&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; cgroup_memory=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; cgroup_enable=memory&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;k3s の起動に必要な設定はこれだけなので次の設定は飛ばしてもらっても構わない。
これらの必須設定以外では前述の通り有線 LAN と SSH を次のように設定した。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; apt&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; upgrade&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; apt&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; vim&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 静的IPアドレスの設定&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;cat&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;EOF&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /etc/dhcpcd.conf&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;interface eth0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;static ip_address=192.168.3.1/24&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;EOF&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# SSH鍵の設定: 公開鍵をGitHubからダウンロード&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;mkdir&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; .ssh&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -o&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; .ssh/authorized_keys&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; https://github.com/nownabe.keys&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;chmod&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 700&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; .ssh&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;chmod&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 600&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; .ssh/authorized_keys&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# sshdの設定: パスワードログインとrootログインを無効化&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;cat&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;EOF&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; tee&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -a&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /etc/ssh/sshd_config&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;PasswordAuthentication no&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;PermitRootLogin no&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;EOF&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# /etc/hostsの設定: ラズパイ間で通信しやすいように&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;cat&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;EOF&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; tee&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -a&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /etc/hosts&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;192.168.3.1 controlplane controlplane.k3s&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;192.168.3.2 worker-1 worker-1.k3s&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;192.168.3.3 worker-2 worker-2.k3s&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;192.168.3.4 worker-3 worker-3.k3s&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;EOF&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;k3s-インストール&quot;&gt;k3s インストール&lt;/h2&gt;
&lt;p&gt;いわゆるコントロールプレーン的な k3s server とワーカーノード的な k3s agent でインストール手順が微妙に異なるので、k3s server から順にインストールする。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.nownabe.com/images/2022/04/06/k3s-architecture.png&quot; alt=&quot;K3s architecture&quot;&gt;&lt;/p&gt;
&lt;p&gt;1 台で試す場合は k3s server だけインストールすれば OK。&lt;/p&gt;
&lt;h3 id=&quot;k3s-server-インストール&quot;&gt;K3s server インストール&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;controlplane.k3s&lt;/code&gt; に k3s server をインストールする。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -sfL&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;https://get.k3s.i&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;o&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; sh&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; -&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以上。めっちゃ簡単。&lt;code&gt;controlplane.k3s&lt;/code&gt; に kubectl もインストールされているので、すぐに試すことができる。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kubectl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; get&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; nodes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kubectl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; get&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; services&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kubectl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; get&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pods&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;また、kubeconfig が &lt;code&gt;/etc/rancher/k3s/k3s.yaml&lt;/code&gt; にあるので、これをローカルに持ってきてリモートで kubectl することもできる。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# ローカル (not ラズパイ) で&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# kubeconfig とってくる&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;ssh&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ${controlplan.k3sのIP} &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; cat&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /etc/rancher/k3s/k3s.yaml&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; k3s-kubeconfig&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# serverのアドレスを書き換える (clusters.0.cluster.server)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;vi&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; k3s-kubeconfig&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# kubectlする&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;kubectl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --kubeconfig=k3s-kubeconfig&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; get&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; nodes&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;k3s-agent-インストール&quot;&gt;K3s agent インストール&lt;/h3&gt;
&lt;p&gt;残り 3 台は同じ操作。&lt;/p&gt;
&lt;p&gt;まず、&lt;code&gt;controlplane.k3s&lt;/code&gt; から agent を追加するためのトークンを取得する。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# in controlplane.k3s&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; cat&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /var/lib/rancher/k3s/server/node-token&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;取得したトークンを使って、残りのラズパイに agent をインストールする。と言っても、環境変数で k3s server とトークンを指定する以外は k3s server のインストールと同じコマンドを使う。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# in worker-*.k3s&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -sfL&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; https://get.k3s.io&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  K3S_URL&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;https://&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;${k3s server のIPアドレス}&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;:6443&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  K3S_TOKEN=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;${token} &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  sh&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; -&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;これで k3s agent のインストールとクラスタへの参加が完了する。&lt;code&gt;kubectl get nodes&lt;/code&gt; 等で確認するとノードが増えていることがわかる。&lt;/p&gt;
&lt;h2 id=&quot;おわりに&quot;&gt;おわりに&lt;/h2&gt;
&lt;p&gt;本当に 1 回もエラーに遭遇することなく、前回苦労したのはなんだったのかというぐらい簡単に Kubernetes がセットアップできてしまった。&lt;/p&gt;
&lt;p&gt;本記事の手順だけでも Pod を作って Service で公開ということはできる。それだけだと LAN 内に閉じた話になるので、インターネットへサービスを公開したいとか外出先から &lt;code&gt;kubectl&lt;/code&gt; したい、というニーズにはまだ応えられない。&lt;/p&gt;
&lt;p&gt;モチベが湧けば、次回は Cloudflare を使ってクラスターをセキュアにインターネットへ公開する記事を書きたいと思う。&lt;/p&gt;
&lt;section data-footnotes class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://rancher.com/docs/k3s/latest/en/installation/installation-requirements/#hardware&quot;&gt;Rancher Docs: Installation Requirements&lt;/a&gt; &lt;a href=&quot;#user-content-fnref-1&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-2&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://rancher.com/docs/k3s/latest/en/advanced/#enabling-legacy-iptables-on-raspbian-buster&quot;&gt;Rancher Docs: Advanced Options and Configuration&lt;/a&gt; &lt;a href=&quot;#user-content-fnref-2&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 2&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content:encoded><category>Kubernetes</category><category>K3s</category><category>Raspberry Pi</category></item><item><title>GitHub のリポジトリを一括で整理するツールを作った</title><link>https://blog.nownabe.com/2022/03/13/ghrepos-organizer/</link><guid isPermaLink="true">https://blog.nownabe.com/2022/03/13/ghrepos-organizer/</guid><description>GitHub のリポジトリを一括で整理するための ghrepos-organizer というツールを作りました。 元々は整理が目的でしたが、全リポジトリに対して自動ブランチ削除機能を有効化するみたいな使い方もできるようになりました。 ある Owner (user or organization) のリポジトリのうち、選…</description><pubDate>Sun, 13 Mar 2022 14:27:09 GMT</pubDate><content:encoded>&lt;p&gt;GitHub のリポジトリを一括で整理するための &lt;a href=&quot;https://github.com/nownabe/ghrepos-organizer&quot;&gt;ghrepos-organizer&lt;/a&gt; というツールを作りました。
元々は整理が目的でしたが、全リポジトリに対して自動ブランチ削除機能を有効化するみたいな使い方もできるようになりました。&lt;/p&gt;
&lt;iframe width=&quot;790&quot; height=&quot;445&quot; src=&quot;https://www.youtube.com/embed/f_KKVQlxmHw&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;h2 id=&quot;できること&quot;&gt;できること&lt;/h2&gt;
&lt;p&gt;ある Owner (user or organization) のリポジトリのうち、選択したリポジトリに対して一括で以下の操作を適用できます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;削除&lt;/li&gt;
&lt;li&gt;すべての Issue を Close&lt;/li&gt;
&lt;li&gt;すべての Pull Request を Close&lt;/li&gt;
&lt;li&gt;属性の変更
&lt;ul&gt;
&lt;li&gt;Visibility (Public/Private)&lt;/li&gt;
&lt;li&gt;Wiki 機能の On/Off&lt;/li&gt;
&lt;li&gt;Project 機能の On/Off&lt;/li&gt;
&lt;li&gt;マージした時に自動でブランチを削除する機能の On/Off&lt;/li&gt;
&lt;li&gt;アーカイブ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;他の Organization への Transfer&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;使い方&quot;&gt;使い方&lt;/h2&gt;
&lt;p&gt;ghrepos-organizer を使うためには GitHub の Personal Access Token が必要に成ります。&lt;code&gt;repo&lt;/code&gt; スコープがついていれば OK です。リポジトリの削除を実行するためには &lt;code&gt;delete_repo&lt;/code&gt; スコープも必要です。&lt;/p&gt;
&lt;p&gt;npx コマンドで実行できます。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;npx&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ghrepos-organizer&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;コマンドを実行すると対話式に色々聞かれるので、適用する操作を選んだり、操作対象のリポジトリを選んだりします。&lt;/p&gt;
&lt;p&gt;操作 (Action) を選ぶ様子:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.nownabe.com/images/2022/03/13/choose-actions.png&quot;&gt;&lt;img src=&quot;https://blog.nownabe.com/images/2022/03/13/choose-actions.png&quot; alt=&quot;choose-actions&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;リポジトリを選ぶ様子:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.nownabe.com/images/2022/03/13/choose-repositories.png&quot;&gt;&lt;img src=&quot;https://blog.nownabe.com/images/2022/03/13/choose-repositories.png&quot; alt=&quot;choose-repositories&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;最後に最終確認のプロンプトが出るので、Yes (&lt;code&gt;y&lt;/code&gt;) を入力すると実行されます。&lt;/p&gt;
&lt;h2 id=&quot;環境変数&quot;&gt;環境変数&lt;/h2&gt;
&lt;p&gt;環境変数で一部の挙動を設定できるようになっています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GH_PAT&lt;/code&gt; - Personal Access Token を環境変数で設定できます。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CONCURRENCY&lt;/code&gt; - 操作の並列数を設定できます。デフォルトは 5 です。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ENABLE_DELETE&lt;/code&gt; - 削除機能を有効化します。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;おわりに&quot;&gt;おわりに&lt;/h2&gt;
&lt;p&gt;昔のリポジトリをまるっとアーカイブしたい時や、ブランチ自動削除機能を一括で有効化したいときなんかにぜひ使ってみてください。&lt;/p&gt;
&lt;p&gt;今回初めて Node で CLI を作ってみたので、そのことについての記事もまた書きたいと思います。&lt;/p&gt;
</content:encoded><category>GitHub</category><category>TypeScript</category><category>CLI</category></item><item><title>5年前に書いた React/Redux アプリから Redux を処した</title><link>https://blog.nownabe.com/2022/02/26/brainfuck-board-escaped-from-redux/</link><guid isPermaLink="true">https://blog.nownabe.com/2022/02/26/brainfuck-board-escaped-from-redux/</guid><description>もっと気軽にブログを書いていこう記事第一弾。 第二弾もあってほしい。 5 年前に作った React と Redux で書いたウェブアプリを Next.js と Hooks と Recoil で動くようにほぼ全て書き換えた。</description><pubDate>Sat, 26 Feb 2022 08:17:16 GMT</pubDate><content:encoded>&lt;p&gt;もっと気軽にブログを書いていこう記事第一弾。
第二弾もあってほしい。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.nownabe.com/images/2022/02/26/brainfuck-board-escaped-from-redux/banner.png&quot; alt=&quot;brainfuck-board-escaped-from-redux&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;やったこと&quot;&gt;やったこと&lt;/h2&gt;
&lt;p&gt;5 年前に作った React と Redux で書いたウェブアプリを Next.js と Hooks と Recoil で動くようにほぼ全て書き換えた。
&lt;a href=&quot;https://brainfuck-board.nownabe.com/&quot;&gt;Brainfuck Board&lt;/a&gt; という Brainfuck を実行できるウェブアプリで、Dependabot がうるさかったり、完成度が中途半端だったりでずっとなんとかしたいとは思っててようやく手を付けることができた。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/nownabe/brainfuck-board&quot;&gt;nownabe/brainfuck-board: Brainfuck Platform&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;やったことを時系列に羅列するとこんな感じ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ソースコード見て当時の振り返り&lt;/li&gt;
&lt;li&gt;最新のナウい状態管理の調査。Recoil がいいらしい&lt;/li&gt;
&lt;li&gt;Redux から Hooks/Recoil にどうやって移行するか検討&lt;/li&gt;
&lt;li&gt;ちまちま変えていくのはだるそうだったので、スクラッチで書き換え&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/nownabe/brainfuck-board/pull/192&quot;&gt;プルリク&lt;/a&gt; をマージ&lt;/li&gt;
&lt;li&gt;Vercel にデプロイ&lt;/li&gt;
&lt;li&gt;細かいところ整えたり、バグ修正したり、新機能つけたり&lt;/li&gt;
&lt;li&gt;Renovate で automerge な設定&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;感想&quot;&gt;感想&lt;/h2&gt;
&lt;p&gt;時代の進化を感じることができてとても良かった。
Web フロント界隈は流れが早いだの落ち着かないだの言われてたけど、5 年前の実装を思い出しながら書いてると正当に進化してるなーと改めて思った。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Redux をやめて Hooks ベースになっただけでめっちゃスッキリしてさすがのこんまりもびっくりすると思う&lt;/li&gt;
&lt;li&gt;単純にファイル数・コードが減るし、レイヤードなアーキテクチャのまとまりがよくなる気がする&lt;/li&gt;
&lt;li&gt;Redux 関係だけじゃなくて、自分の窓から投げ捨てたくなるようなコードも捨てられて最高&lt;/li&gt;
&lt;li&gt;Suspense 使いたかったけど使いどころがなくて残念&lt;/li&gt;
&lt;li&gt;Firebase まわりの実装はまだ納得いってない&lt;/li&gt;
&lt;li&gt;内面だけじゃなくてアプリ自体も良くなってよかった&lt;/li&gt;
&lt;li&gt;今回はスクラッチで書き直したけど、地道な移行もできなくはなさそう (技術的には可能)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;おわりに&quot;&gt;おわりに&lt;/h2&gt;
&lt;p&gt;メンテは計画的に。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.nownabe.com/images/2022/02/26/contribution.png&quot; alt=&quot;Contribution&quot;&gt;&lt;/p&gt;
</content:encoded><category>note</category><category>React</category><category>Redux</category><category>Recoil</category></item><item><title>勉強を続ける技術</title><link>https://blog.nownabe.com/2021/09/25/technique-to-continue/</link><guid isPermaLink="true">https://blog.nownabe.com/2021/09/25/technique-to-continue/</guid><description>継続も勉強も苦手な自分が英語の勉強を毎日 1 年以上続けられているので、そのためにやったことを紹介します。 今まで何度も何度も三日坊主を経験してきましたが、意外と小手先のテクニックを駆使して続けることができています。 同じように何かを続けようとして失敗している人の参考になれば幸いです。</description><pubDate>Sat, 25 Sep 2021 07:41:22 GMT</pubDate><content:encoded>&lt;h2 id=&quot;はじめに&quot;&gt;はじめに&lt;/h2&gt;
&lt;p&gt;継続も勉強も苦手な自分が英語の勉強を毎日 1 年以上続けられているので、そのためにやったことを紹介します。&lt;/p&gt;
&lt;p&gt;今まで何度も何度も三日坊主を経験してきましたが、意外と小手先のテクニックを駆使して続けることができています。
同じように何かを続けようとして失敗している人の参考になれば幸いです。&lt;/p&gt;
&lt;p&gt;もちろんこんなことをしなくても継続できる人はいると思います。
僕のような意志が弱く継続が苦手でだらしない人間が、なんとか継続するためにやった工夫として読んでください。&lt;/p&gt;
&lt;p&gt;また、この記事では続けるということに焦点を当てます。
特に、毎日何かをやり続けるということが話の中心になります。
英語の上達や目標の達成や何かをやり抜くということはスコープ外になります。&lt;/p&gt;
&lt;h2 id=&quot;きっかけと結果&quot;&gt;きっかけと結果&lt;/h2&gt;
&lt;p&gt;まず英語を勉強しようと思ったきっかけは、Google に入社して今以上にパフォーマンスを発揮するためには英語が必要と感じたことです。
それまで何度も英語を勉強しようと思ったことはあるものの続いたことはありませんでした。
そのため、今までどおりではいかん、ということでとにかく「続ける」ということを意識して勉強してみました。&lt;/p&gt;
&lt;p&gt;結果として以下のようなものが得られました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;567日連続での英語勉強&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;毎日英語の勉強をするのが苦ではなくなって当たり前になった&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;1 日の平均勉強時間は 47 分&lt;/li&gt;
&lt;li&gt;ほんのちょっと英語が上達した気がする&lt;/li&gt;
&lt;li&gt;これからどういうプロセスを踏めば英語が上達しそうかちょっと見えてきた&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;自分にとって言語としての英語&lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;は非常に苦手分野で、苦手意識も大きいし、何をどうすれば英語で読み書き聞く話すができるようになるのかさっぱりわかりませんでした。
まだまだ人並みにもなってないし、ここまで来るのに 1 年以上かかったのには才能ないなぁと感じますが、「どうすれば上達できるか」がぼんやりとでも見えてきたのは非常に大きい進歩だと思います。
継続は力なり、ですね。(まだ力にはなってない)&lt;/p&gt;
&lt;h2 id=&quot;続ける技術&quot;&gt;続ける技術&lt;/h2&gt;
&lt;p&gt;ここからは続けるために僕が実践してきた技術を紹介します。&lt;/p&gt;
&lt;h3 id=&quot;目標設定&quot;&gt;目標設定&lt;/h3&gt;
&lt;p&gt;まず目標設定です。
何かを続けるためには「続ける」ことを目標にするといいです。&lt;/p&gt;
&lt;p&gt;自分の英語勉強の目標は「毎日 1 分以上英語を勉強する」でした。&lt;/p&gt;
&lt;p&gt;なぜこうしたかというと、次のような目標は上手く機能しないことが経験上わかっていたからです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TOEIC xxx 点を取る&lt;/li&gt;
&lt;li&gt;この本を一ヶ月で終わらせる&lt;/li&gt;
&lt;li&gt;毎日 xx ページ勉強する&lt;/li&gt;
&lt;li&gt;毎日 1 時間勉強する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;なぜこういった目標がうまく機能しなかったかを考えた時、目標のハードルが高すぎたのではないかという結論に至りました。
ハードルが高いと飛び越えるために膨大な意志と集中力が必要です。
そして、ハードルが高いため失敗しやすく、1 回でも失敗するとモチベーションが急低下して三日坊主に終わります。&lt;/p&gt;
&lt;p&gt;なので目標は最低まで低くして、まずは続けるということに集中することにしました。
&lt;strong&gt;継続しないことにはTOEICの点も上がらないし一冊の本も読めないからです。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;今でもこの目標設定は変えてませんが、新たな目標を追加したり、勉強量を増やしたりということはできています。
新しい目標は達成できなくても、この「毎日一分やれば OK」というベースの目標がガードレール的に達成されるので気が楽です。&lt;/p&gt;
&lt;h3 id=&quot;可視化&quot;&gt;可視化&lt;/h3&gt;
&lt;p&gt;続けるという目標を設定した後すぐに可視化の仕組みを整えました。
目標が達成できているか確認できるし、達成感を得られるし、なにより綺麗に可視化されているとモチベーションに繋がります。&lt;/p&gt;
&lt;p&gt;個人的に毎日の活動を可視化する最強ソリューションは GitHub の草&lt;sup&gt;&lt;a href=&quot;#user-content-fn-2&quot; id=&quot;user-content-fnref-2&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;だったので、英語の勉強でも草を生やしたいと考えました。&lt;/p&gt;
&lt;p&gt;実現には GitHub と同じような芝生を育てられる &lt;a href=&quot;https://pixe.la/&quot;&gt;Pixela&lt;/a&gt; というサービスを使っています。
Pixela がなかったらここまで勉強を続けられていなかったと思います。
こんな感じの GitHub そっくりの芝生が作れます。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.nownabe.com/images/2021/09/25/pixela.png&quot;&gt;&lt;img src=&quot;https://blog.nownabe.com/images/2021/09/25/pixela.png&quot; alt=&quot;Pixela&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Pixela だけでは勉強時間の入力が難しいので、勉強時間の記録には &lt;a href=&quot;https://toggl.com/track/&quot;&gt;Toggl Track&lt;/a&gt; を使っています。
Toggl はモバイルアプリもあるので手軽に勉強時間のトラッキングができます。&lt;/p&gt;
&lt;p&gt;また、Toggl と Pixela でデータを連携するために &lt;a href=&quot;https://cloud.google.com/&quot;&gt;Google Cloud&lt;/a&gt; の &lt;a href=&quot;https://cloud.google.com/functions&quot;&gt;Cloud Functions&lt;/a&gt; と &lt;a href=&quot;https://cloud.google.com/scheduler&quot;&gt;Cloud Scheduler&lt;/a&gt; を使っています。Toggl も Pixela も API があるので簡単に連携できます。
README すら書いてませんがソースコードは &lt;a href=&quot;https://github.com/nownabe/dailytoggl&quot;&gt;こちら&lt;/a&gt; です。需要があれば整えます。&lt;/p&gt;
&lt;p&gt;図にするとこんな感じです。ありがたいことにすべて無料で使わせてもらっています。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.nownabe.com/images/2021/09/25/function1.png&quot;&gt;&lt;img src=&quot;https://blog.nownabe.com/images/2021/09/25/function1.png&quot; alt=&quot;Function 1&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;始めてから一年以上経ちますが、いまだにしょっちゅう草を確認してモチベーションを維持しています。
芝生に穴を開けたくないがために毎日勉強しています。&lt;/p&gt;
&lt;h3 id=&quot;監視される&quot;&gt;監視される&lt;/h3&gt;
&lt;p&gt;「人に見られているとサボりにくいだろう」ということで勉強時間を Twitter に投稿するようにしました。&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;On 2020-09-09, I studied English for 26 minutes.&lt;a href=&quot;https://t.co/7N4uLAE4rO&quot;&gt;https://t.co/7N4uLAE4rO&lt;/a&gt; &lt;a href=&quot;https://t.co/HAGzsjLGtl&quot;&gt;pic.twitter.com/HAGzsjLGtl&lt;/a&gt;&lt;/p&gt;&amp;mdash; ぎっくり腰太郎 (@nownabe) &lt;a href=&quot;https://twitter.com/nownabe/status/1303807909000744960?ref_src=twsrc%5Etfw&quot;&gt;September 9, 2020&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;p&gt;実際はこんなツイートをチェックする奇特な人はいないと思いますが、人に見られていると意識するだけでも多少の効果があります。
ツイッター以外でも、一緒に勉強してくれる人を探して進捗を確認し合う、進捗を管理してくれる教室に入会する、というのも効果的だと思います。&lt;/p&gt;
&lt;p&gt;手動で勉強時間をツイートするのは面倒なので、上述の Cloud Function で Pixela へのデータ投入と同時にツイートするようにしました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.nownabe.com/images/2021/09/25/function2.png&quot;&gt;&lt;img src=&quot;https://blog.nownabe.com/images/2021/09/25/function2.png&quot; alt=&quot;Function 2&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;今はもう習慣化できているので、TL を荒らしがちなこの機能は停止しています。&lt;/p&gt;
&lt;h3 id=&quot;お手軽ネタの用意&quot;&gt;お手軽ネタの用意&lt;/h3&gt;
&lt;p&gt;「毎日 1 分勉強する」をお手軽に達成するためのネタを複数用意しました。
これは、モチベーションがなくても時間がなくても「続ける」ための工夫です。&lt;/p&gt;
&lt;p&gt;例えば、次のようなネタを準備していました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;単語帳を必ず目に入る場所に置いておく&lt;/li&gt;
&lt;li&gt;英語学習の Podcast を登録しておく&lt;/li&gt;
&lt;li&gt;英語学習アプリをインストールしておく&lt;/li&gt;
&lt;li&gt;LINE の英単語クイズ bot を登録しておく&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;こういう手軽なネタを用意しておくことで手軽に「毎日 1 分勉強」が達成できます。
最低限の 1 分を達成するだけでも「失敗によるモチベーションの低下」という状況を防ぐことができるので重要になってきます。&lt;/p&gt;
&lt;p&gt;ここで重要なことは、時・場所を選ばず、ハードルが最も低い方法を用意しておくことです。
上述の例だと、それぞれこのようなハードルを設定しておきます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;単語帳は 1 単語でも読めば OK&lt;/li&gt;
&lt;li&gt;Podcast はどこから初めてどこで終わっても OK&lt;/li&gt;
&lt;li&gt;英語学習アプリは 1 エピソードの一部でもやれば OK&lt;/li&gt;
&lt;li&gt;英単語学習ボットは 1 単語でもクイズすれば OK&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例えば次のようなネタしかないと、ハードルが高くて毎日勉強を達成できない可能性が出てきます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Netflix で海外ドラマを見る (まとまった時間が必要)&lt;/li&gt;
&lt;li&gt;シャドーイングする (まとまった時間と音を聞けて声を出せる場所が必要)&lt;/li&gt;
&lt;li&gt;文法書を読む (ある程度まとまったかたまりで読まないと気持ち悪い)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;上述の例でも単語帳、Podcast、アプリはほぼ問題ないのですが、状況によって時・場所を選ぶため単語クイズができる LINE bot を作りました。&lt;/p&gt;
&lt;a href=&quot;https://blog.nownabe.com/images/2021/09/25/line_bot.png&quot;&gt;
  &lt;img src=&quot;https://blog.nownabe.com/images/2021/09/25/line_bot.png&quot; alt=&quot;LINE bot&quot; height=&quot;600&quot;&gt;
&lt;/a&gt;
&lt;p&gt;こちらの LINE bot は Google Apps Script で実装しています。
&lt;a href=&quot;https://docs.google.com/spreadsheets/d/1TQ2-gY5M8LEGXJcotMjlwb3WV4hnUJ9T-y5wb94ySRs/copy&quot;&gt;テンプレートをコピー&lt;/a&gt; して、エンドポイントを LINE Developers で登録すれば使えると思います。&lt;/p&gt;
&lt;h3 id=&quot;習慣に相乗りする&quot;&gt;習慣に相乗りする&lt;/h3&gt;
&lt;p&gt;上述のお手軽ネタはあくまでも「続ける」ことを最低限続けるためのバックアップです。
お手軽ネタだけをこなしていても勉強としての効果は小さいです。&lt;/p&gt;
&lt;p&gt;そこで、次はいかにして毎日の勉強時間を確保するかが重要になってきます。&lt;/p&gt;
&lt;p&gt;時間を確保する最も簡単な方法は、既存の習慣に相乗りすることです。&lt;/p&gt;
&lt;p&gt;通勤時間、歯磨き、お風呂、食事、などなんでもやりやすい習慣でいいと思います。&lt;/p&gt;
&lt;p&gt;僕の場合は毎朝の犬の散歩に相乗りすることにしました。
毎朝散歩をしながらシャドーイングしたり、英語学習 Podcast を聞いたりしていました。
そうすることでほぼ毎日 30 分は勉強時間を確保できました。&lt;/p&gt;
&lt;p&gt;今はさらに増やして、次のような習慣で毎日勉強しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;毎朝の散歩でシャドーイングやリスニング&lt;/li&gt;
&lt;li&gt;朝・昼・晩、歯磨きしながら単語学習&lt;/li&gt;
&lt;li&gt;寝る前に文法学習&lt;/li&gt;
&lt;li&gt;20 時〜21 時は勉強時間&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;残業したり台風が来たり外出したりすると習慣が崩れてしまうこともあるので、そういうときはお手軽ネタでお茶を濁します。&lt;/p&gt;
&lt;h3 id=&quot;適切な教材を選ぶ&quot;&gt;適切な教材を選ぶ&lt;/h3&gt;
&lt;p&gt;難しすぎず、簡単すぎず、成長を実感できる教材を選ぶことも重要です。&lt;/p&gt;
&lt;p&gt;成長の実感はモチベーション維持・向上に大きな効果があります。
モチベーションがあれば継続にも繋がり、さらに継続の先の目標達成にも繋がります。&lt;/p&gt;
&lt;p&gt;教材が難しすぎると成長を実感するまでにモチベーションが下がってしまいます。
逆に簡単すぎると成長幅が小さくて実感できません。&lt;/p&gt;
&lt;p&gt;適切な教材を選ぶには自分の今のレベルを知る必要があります。
客観的なテストがあるならそれを参考にしてもいいし、詳しい人にアドバイスをもらうのもありです。
自分で教材を見て選ぶ場合は、わかる部分もあるしわからない部分もある、ぐらいがいいと思います。&lt;/p&gt;
&lt;p&gt;僕の場合は最初は高校生レベルの単語帳をメインの教材としていました。&lt;/p&gt;
&lt;h3 id=&quot;残業しない&quot;&gt;残業しない&lt;/h3&gt;
&lt;p&gt;重要です。
残業すると時間とエネルギーを浪費してしまって勉強できません。&lt;/p&gt;
&lt;p&gt;勉強してなくても当然ですが、極力効率良く仕事をこなしてだらだら仕事をしないようにする必要があります。&lt;/p&gt;
&lt;p&gt;僕の場合はそれ以外に、残業時間帯に不必要なミーティングの招待がよく飛んできていたので、重要性の低いものは自動で辞退するような設定をしたりしました。
残業減らせねーよという方も諦めずに、残業を減らす仕組みを考えたり、誰かに相談したり、転職したりしてください。&lt;/p&gt;
&lt;p&gt;いろいろ手は尽くしても残業が発生することはあると思いますが、そういうときはお手軽ネタでお茶を濁します。&lt;/p&gt;
&lt;h3 id=&quot;時間の浪費からの脱出&quot;&gt;時間の浪費からの脱出&lt;/h3&gt;
&lt;p&gt;おまけです。今までの方法からさらに勉強時間を増やすときのヒントになるかもしれません。&lt;/p&gt;
&lt;p&gt;特に疲れているときとか、永遠に YouTube を見続けたり、無限にソシャゲポチポチしてしまったりして時間を浪費してしまうことがあると思います。
そういう時間から脱出するためのスイッチ、トリガーを探しておくと勉強時間を増やすことができます。&lt;/p&gt;
&lt;p&gt;僕の場合は色々試してみた結果、なぜかわかりませんが、「前頭前野頑張れ！前頭前野負けるな！」と前頭前野を応援するとだらだらから脱出できることがわかりました。
なので最近は勉強したいときには積極的に前頭前野を応援するようにしています。&lt;/p&gt;
&lt;p&gt;ちなみに前頭前野は脳みその部位の名前で、人間の理性的な活動や、行動を切り替える機能を持っているそうです。
また、瞑想すると鍛えられるらしいです。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;前頭前野はヒトをヒトたらしめ，思考や創造性を担う脳の最高中枢であると考えられている。この脳部位はワーキングメモリー、反応抑制、行動の切り替え、プラニング、推論などの認知・実行機能を担っている。また、高次な情動・動機づけ機能とそれに基づく意思決定過程も担っている。さらに社会的行動、葛藤の解決や報酬に基づく選択など、多様な機能に関係している。
&lt;a href=&quot;https://bsd.neuroinf.jp/wiki/%E5%89%8D%E9%A0%AD%E5%89%8D%E9%87%8E&quot;&gt;前頭前野 - 脳科学辞典&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;おわりに&quot;&gt;おわりに&lt;/h2&gt;
&lt;p&gt;最近は勉強を続けられるようになったので、新しく「アメリカで仕事できる英語力を身につける」という目標を持って勉強しています。
こういう目標を持てるようになったり、そのために何をすればいいか見当がついたりしたのも、ここまで続けてきたからこそだと思います。&lt;/p&gt;
&lt;p&gt;継続することで初めて見える世界があるということがわかっただけでも続けてみた価値はありました。
何か目標がある人、逆に何かに行き詰まってる人、とりあえず何かを続けてみてはいかがでしょうか。&lt;/p&gt;
&lt;section data-footnotes class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;テストとしての英語はクイズとしてある程度対策すればそこそこ点が取れるのでたちが悪い &lt;a href=&quot;#user-content-fnref-1&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-2&quot;&gt;
&lt;p&gt;参考: &lt;a href=&quot;https://speakerdeck.com/ktr_0731/hu-enaicao-kontoribiyusiyon-falseyu-tekata?slide=8&quot;&gt;冴えない草(コントリビューション)の育てかた - Speaker Deck&lt;/a&gt; &lt;a href=&quot;#user-content-fnref-2&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 2&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content:encoded></item><item><title>我が家の BigQuery による台所事情分析</title><link>https://blog.nownabe.com/2020/12/13/home-finance-with-bigquery/</link><guid isPermaLink="true">https://blog.nownabe.com/2020/12/13/home-finance-with-bigquery/</guid><description>弊家では銀行やクレジットカードの明細を BigQuery に取り込んでダッシュボードを作ったりしています。 また、そのために作った BigQuery 向けの Go 製 ETL フレームワークを OSS として公開しました。 本記事ではざっくりどんなもんかを紹介して、どう作るのかを説明します。</description><pubDate>Sat, 12 Dec 2020 15:00:00 GMT</pubDate><content:encoded>&lt;p&gt;弊家では銀行やクレジットカードの明細を BigQuery に取り込んでダッシュボードを作ったりしています。
また、そのために作った BigQuery 向けの Go 製 ETL フレームワークを OSS として公開しました。
本記事ではざっくりどんなもんかを紹介して、どう作るのかを説明します。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://qiita.com/advent-calendar/2020/gcp&quot;&gt;Google Cloud Platform Advent Calendar 2020&lt;/a&gt; の 13 日目の記事です。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://medium.com/google-cloud-jp/google-cloud-japan-customer-engineer-advent-calendar-2020-1c78e07e1871&quot;&gt;Google Cloud Japan の Customer Engineer の Advent Calendar&lt;/a&gt; もぜひご覧ください。&lt;/p&gt;
&lt;h2 id=&quot;tl-dr&quot;&gt;TL; DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;明細が BigQuery にあると、可視化もできるしアラートも出せるし、まぁなんでもできて便利&lt;/li&gt;
&lt;li&gt;銀行明細レベルのデータならほぼ無料で保存、ETL、分析できる&lt;/li&gt;
&lt;li&gt;ETL フレームワーク &lt;a href=&quot;https://github.com/nownabe/go-bqloader&quot;&gt;bqloader&lt;/a&gt; を OSS として公開したから使ってくれよな 💪&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;説明しないこと:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;我が家の台所事情&lt;/li&gt;
&lt;li&gt;BigQuery のクエリの書き方&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;対象読者&quot;&gt;対象読者&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;GCP を触ったことがある人&lt;/li&gt;
&lt;li&gt;お金まわりを分析したいと思っている人&lt;/li&gt;
&lt;li&gt;身近な題材で BigQuery を触ってみたい人&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;ざっくり紹介&quot;&gt;ざっくり紹介&lt;/h2&gt;
&lt;h3 id=&quot;何が嬉しいの&quot;&gt;何が嬉しいの？&lt;/h3&gt;
&lt;p&gt;BigQuery でできることができるようになります。
で終わらせるのもアレなので、弊家でのユースケースを列挙します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ダッシュボード
&lt;ul&gt;
&lt;li&gt;資産推移&lt;/li&gt;
&lt;li&gt;出費分析&lt;/li&gt;
&lt;li&gt;でかい出費ランキング&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;アラート (銀行残高、クレジットカード)&lt;/li&gt;
&lt;li&gt;予算管理&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例えばダッシュボードはこんな感じです。(記事用に加工してます)&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.nownabe.com/images/2020/12/13/dashboard.png&quot;&gt;&lt;img src=&quot;https://blog.nownabe.com/images/2020/12/13/dashboard.png&quot; alt=&quot;dashboard&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;BigQuery を使うことで、手動でやってたことを自動化できるようになったり、今までできなかったことができるようになったりしました。
SQL を書けばほしいデータをほしい形ですぐに手に入れることができて、それを簡単に様々なシステムと連携できるので超便利です。
おかげで自動化もできたし、良い感じのダッシュボードも作ることができて節約を頑張れそうです。&lt;/p&gt;
&lt;h3 id=&quot;money-forward-でええんちゃうの&quot;&gt;Money Forward でええんちゃうの？&lt;/h3&gt;
&lt;p&gt;いいです 😂&lt;/p&gt;
&lt;p&gt;本記事の内容は劣化版 Money Forward の再実装と言える部分もあります。&lt;/p&gt;
&lt;p&gt;Money Forward はとてもいいサービスなので弊家でも使っていますが、かゆいところに手が届かなかったり、使いたい機能が有料だったりしたので自分でも作りました。&lt;/p&gt;
&lt;p&gt;自分で作ると手間はかかりますが Money Forward 以上のやりたいことがだいたい実現できるようになります。
BigQuery でクエリを書いて好きな結果を得られるというのは大きいですね。&lt;/p&gt;
&lt;h3 id=&quot;アーキテクチャ&quot;&gt;アーキテクチャ&lt;/h3&gt;
&lt;p&gt;こんな感じです。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.nownabe.com/images/2020/12/13/architecture.png&quot;&gt;&lt;img src=&quot;https://blog.nownabe.com/images/2020/12/13/architecture.png&quot; alt=&quot;architecture&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;課題&quot;&gt;課題&lt;/h3&gt;
&lt;p&gt;大きな課題が 2 点あります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CSV のダウンロード/アップロードが手動
&lt;ul&gt;
&lt;li&gt;銀行やクレジットカードの明細の CSV を手動でダウンロードしてアップロードしています&lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;リアルタイム性がない
&lt;ul&gt;
&lt;li&gt;CSV を月イチで手動アップロードしてるので、リアルタイム性がありません&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以前はスプレッドシートに手入力していた部分もあったので自分としては手間は減ってるし、できることは増えたし、お金はかかっていないしでハッピーなんですがめんどくささは残ります。
銀行が API 公開してくれたらいいんですけどね。&lt;/p&gt;
&lt;h3 id=&quot;無料なの&quot;&gt;無料なの？&lt;/h3&gt;
&lt;p&gt;無料ではないです。毎月 1 円請求が発生しています。
Cloud Functions のコンテナイメージを管理している Container Registry のバックエンドの Cloud Storage に料金がかかっています。&lt;sup&gt;&lt;a href=&quot;#user-content-fn-2&quot; id=&quot;user-content-fnref-2&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;下の画像は実際に弊家で使っているプロジェクトの Billing Report です。
(Subtotal は 4 ヶ月分が加算されて 4 円と表示されています)&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.nownabe.com/images/2020/12/13/billing_report.png&quot;&gt;&lt;img src=&quot;https://blog.nownabe.com/images/2020/12/13/billing_report.png&quot; alt=&quot;billing report&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Cloud Storage や Cloud Functions や BigQuery は &lt;a href=&quot;https://cloud.google.com/free&quot;&gt;無料枠&lt;/a&gt; におさまっています。
もし既に無料枠を使い切っている場合は料金が発生します。それぞれ以下のように無料枠があります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cloud Storage: 5GB-月 (us-east1, us-west1, us-central1)&lt;/li&gt;
&lt;li&gt;Cloud Functions: 200 万回/月&lt;/li&gt;
&lt;li&gt;BigQuery: 1TB クエリ/月&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cloud Storage の無料枠はリージョンが限定されています。
リージョンが異なると余計なネットワーク料金が発生したりするのでリージョンを揃えておくのもポイントです。
弊家ではすべてを使えるリージョンとして &lt;code&gt;us-east1&lt;/code&gt; を選択しました。&lt;/p&gt;
&lt;p&gt;銀行の明細は 1 ヶ月分でせいぜい数 KB、クエリもたかがしれてるのでなかなか無料枠を超えることはなさそうです。&lt;/p&gt;
&lt;h2 id=&quot;etl-フレームワーク-bqloader&quot;&gt;ETL フレームワーク bqloader&lt;/h2&gt;
&lt;h3 id=&quot;bqloader-概要&quot;&gt;bqloader 概要&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/nownabe/go-bqloader&quot;&gt;bqloader&lt;/a&gt; は Go 製のシンプルな ETL フレームワークです。
弊家の ETL をフレームワークとして切り出したものになります。
以下のような特徴があります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1 行を 1 行への変換に特化&lt;/li&gt;
&lt;li&gt;ユーザは行単位の変換ロジックのみ実装&lt;/li&gt;
&lt;li&gt;簡単な設定で文字コード変換、不要な行のスキップ、成功・失敗通知が可能&lt;/li&gt;
&lt;li&gt;今のところ Cloud Storage、Cloud Functions、BigQuery 専用&lt;sup&gt;&lt;a href=&quot;#user-content-fn-3&quot; id=&quot;user-content-fnref-3&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;1 つの Function で複数種のデータに対応&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Go で実装することになるので Go の知識はあった方がいいですが、なくても Hello, world ぐらいできればサンプル見ながら実装できるんじゃないでしょうか。&lt;/p&gt;
&lt;p&gt;以下のような利点があります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ほぼ無料で使える&lt;/li&gt;
&lt;li&gt;必要最低限の機能しかない&lt;/li&gt;
&lt;li&gt;Go で書ける&lt;/li&gt;
&lt;li&gt;複数種のデータの ETL を一箇所で管理できる&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;bqloader-使い方&quot;&gt;bqloader 使い方&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/nownabe/go-bqloader/tree/main/examples/quickstart&quot;&gt;サンプルプロジェクト&lt;/a&gt; を見てもらうのがはやいです。
このサンプルの中で Service Account の作成や Function のデプロイ、BigQuery への ETL まで一通りカバーしています。&lt;/p&gt;
&lt;p&gt;以下ではフレームワークのさわりだけ丁寧に説明していきます。
詳しくは &lt;a href=&quot;https://pkg.go.dev/go.nownabe.dev/bqloader&quot;&gt;godoc&lt;/a&gt; やサンプルを見てください。&lt;/p&gt;
&lt;p&gt;まず import します。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;go&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;go.nownabe.dev/bqloader&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;保存先テーブルごとに &lt;code&gt;bqloader.Handler&lt;/code&gt; を設定します。
Cloud Storage にアップロードされたファイルが Handler の Pattern に一致する場合に処理されてテーブルにロードされます。
Handler を複数定義すればひとつの Pattern に複数の Handler を対応させることもできます。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;go&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;handler &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:=&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;bqloader&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Handler&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Name:     &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;main_bank&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,          &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 通知などで使われる&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Encoding: japanese.ShiftJIS,    &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 入力ファイルをShiftJISとして扱う&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Parser:   bqloader.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;CSVParser&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(), &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 入力ファイルをCSVとして扱う&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // 先頭から1行を無視する (ヘッダのスキップ)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  SkipLeadingRows: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // この正規表現にマッチするパスのファイルを処理する&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Pattern: regexp.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;MustCompile&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;^main_bank/&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // ロード先のBigQueryテーブル&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Project: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;my-project&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Dataset: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;my_dateset&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Table:   &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;main_bank&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // 後述&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Notifier:  notifier,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Projector: projector,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;変換のコアは &lt;code&gt;projector&lt;/code&gt; です。&lt;code&gt;projector&lt;/code&gt; は行単位の変換を実現する関数です。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;go&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;/*&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  例えば次のようなCSVの各行をBigQueryが理解できる形式に変換する。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  日付,内容,出金金額,入金金額,残高&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  2020年12月13日,お賃金,0,&quot;180,000&quot;,&quot;200,000&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  rowに1行が入る。上記の例だと次のようになる。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  row == []string{&quot;2020年12月13日&quot;, &quot;お賃金&quot;, &quot;0&quot;, &quot;180,000&quot;, &quot;200,000&quot;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;*/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;projector &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:=&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; func&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;_&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; context&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Context&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;row&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; []&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) ([]&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // 日本語の日付から、BigQueryが解釈できる日付に変換する&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  t, err &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; time.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Parse&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;2006年01月02日&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, row[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; err &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; nil&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; nil&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, fmt.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Errorf&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;time parse error: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;%v&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, err)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  row[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; t.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Format&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;2006-01-02&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // 数値列のカンマを削除する&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  row[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; strings.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;ReplaceAll&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(row[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;], &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;,&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  row[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; strings.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;ReplaceAll&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(row[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;], &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;,&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  row[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; strings.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;ReplaceAll&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(row[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;], &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;,&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; row, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;nil&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;notifier&lt;/code&gt; は通知です。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;go&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;notifier &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:=&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;bqloader&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;SlackNotifier&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Token:   &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;xxxx&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Channel: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;#bqloader&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;この Handler を利用して Cloud Functions のエントリーポイントとなる関数を実装します。&lt;sup&gt;&lt;a href=&quot;#user-content-fn-3&quot; id=&quot;user-content-fnref-3-2&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;go&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;func&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; MyFunc&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;ctx&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; context&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Context&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; bqloader&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Event&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  loader, _ &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; bqloader.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;New&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // 上述のmain_bank Handler&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  loader.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;MustAddHandler&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(ctx, handler)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // 別のHandlerも登録できる&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  loader.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;MustAddHandler&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(ctx, creditCardHandler)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // イベントを処理する&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; loader.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Handle&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(ctx, e)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cloud Storage へのファイルアップロードなどのイベントで実行されます。&lt;sup&gt;&lt;a href=&quot;#user-content-fn-4&quot; id=&quot;user-content-fnref-4&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;4&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;こんな感じで bqloader による関数を Cloud Functions にデプロイして、対応するバケットにファイルをアップロードすればデータが BigQuery にロードされます。&lt;/p&gt;
&lt;h2 id=&quot;bigquery-による台所事情分析の始め方&quot;&gt;BigQuery による台所事情分析の始め方&lt;/h2&gt;
&lt;p&gt;では銀行の明細を BigQuery にロードする ETL システムを構築してダッシュボードを作ってみましょう。&lt;/p&gt;
&lt;p&gt;銀行の明細は &lt;a href=&quot;https://docs.google.com/spreadsheets/d/1vTK8w2pA4Rrdi1fTBB9nq_dZ9VOIdGW35CdWQxzfWc4/edit?usp=sharing&quot;&gt;このサンプル&lt;/a&gt; を利用します。このデータを多くの銀行に倣って ShiftJIS の CSV として扱います。&lt;/p&gt;
&lt;p&gt;前提として、Google Cloud のプロジェクトが必要になるので用意してください。
以下ではプロジェクト ID が &lt;code&gt;GCP_PROJECT&lt;/code&gt; 環境変数にあるものとして説明します。
また、Go 環境と &lt;a href=&quot;https://cloud.google.com/sdk/docs/install&quot;&gt;Google Cloud SDK&lt;/a&gt; はセットアップ済みとします。&lt;/p&gt;
&lt;p&gt;作成するリソースはそれぞれ次の名前を使用します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Service Account: &lt;code&gt;bqloader&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;BigQuery Dataset: &lt;code&gt;bqloader_dataset&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;BigQuery Table: &lt;code&gt;main_bank&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Cloud Storage Bucket: &lt;code&gt;gs://$GCP_PROJECT-source&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Cloud Functions: &lt;code&gt;bqloader-func&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今回ダッシュボードには無料で簡単に使える Data Studio を使います。&lt;/p&gt;
&lt;h3 id=&quot;service-account-作成&quot;&gt;Service Account 作成&lt;/h3&gt;
&lt;p&gt;Cloud Functions 用の Service Account を作ります。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;gcloud&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; iam&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; service-accounts&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; create&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; bqloader&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --project&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $GCP_PROJECT&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;後で何回か使うので、Service Account の環境変数も設定しておきます。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;SERVICE_ACCOUNT&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;bqloader@&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$GCP_PROJECT&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;.iam.gserviceaccount.com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;BigQuery の Job を実行する権限が必要になるので &lt;code&gt;roles/bigquery.jobUser&lt;/code&gt; Role を付与します。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;gcloud&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; projects&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; add-iam-policy-binding&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $GCP_PROJECT &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --member&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; serviceAccount:&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$SERVICE_ACCOUNT &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --role&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; roles/bigquery.jobUser&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;bigquery-table-作成&quot;&gt;BigQuery Table 作成&lt;/h3&gt;
&lt;p&gt;スキーマの JSON を作成します。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;cat&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;EOF&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;schema.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;[&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &quot;name&quot;: &quot;date&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &quot;type&quot;: &quot;DATE&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &quot;mode&quot;: &quot;REQUIRED&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &quot;name&quot;: &quot;description&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &quot;type&quot;: &quot;STRING&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &quot;mode&quot;: &quot;NULLABLE&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &quot;name&quot;: &quot;withdrawal_amount&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &quot;type&quot;: &quot;NUMERIC&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &quot;mode&quot;: &quot;NULLABLE&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &quot;name&quot;: &quot;deposit_amount&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &quot;type&quot;: &quot;NUMERIC&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &quot;mode&quot;: &quot;NULLABLE&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &quot;name&quot;: &quot;balance&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &quot;type&quot;: &quot;NUMERIC&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &quot;mode&quot;: &quot;REQUIRED&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;EOF&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;BigQuery の Dataset と Table を作成します。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Dataset作成&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;bq&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --location&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; us-east1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mk&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --dataset&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $GCP_PROJECT&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;:bqloader_dataset&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Table作成&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;bq&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mk&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --table&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $GCP_PROJECT&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;:bqloader_dataset.main_bank&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; schema.json&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;先程作った Service Account に書き込み権限を付与します。&lt;sup&gt;&lt;a href=&quot;#user-content-fn-5&quot; id=&quot;user-content-fnref-5&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;5&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;bq&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; add-iam-policy-binding&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --member&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; serviceAccount:&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$SERVICE_ACCOUNT &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --role&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; roles/bigquery.dataEditor&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  $GCP_PROJECT&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;:bqloader_dataset.main_bank&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;cloud-storage-bucket-作成&quot;&gt;Cloud Storage Bucket 作成&lt;/h3&gt;
&lt;p&gt;生データを保存する Bucket を作成します。
Cloud Functions のトリガーとなるイベントを発行するソースにもなります。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;gsutil&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mb&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -p&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $GCP_PROJECT &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;-l&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; US-EAST1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; gs://&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$GCP_PROJECT&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;-source&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Service Account に読み込み権限を付与します。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;gsutil&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; iam&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ch&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  serviceAccount:&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;${SERVICE_ACCOUNT}&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;:roles/storage.objectViewer&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  gs://&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$GCP_PROJECT&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;-source&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;cloud-functions-実装&quot;&gt;Cloud Functions 実装&lt;/h3&gt;
&lt;p&gt;まずは Handler を実装します。
今回は 1 つですが、Handler が増えたときにメンテしやすいように Handler ごとにファイルをわけておきます。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;go&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// main_bank_handler.go&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;package&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; myfunc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        &quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;context&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        &quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;fmt&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        &quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;os&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        &quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;regexp&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        &quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;strings&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        &quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;time&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        &quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;golang.org/x/text/encoding/japanese&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        &quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;go.nownabe.dev/bqloader&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;func&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; cleanNumber&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;n&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        n &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; strings.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;ReplaceAll&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(n, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;￥&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        n &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; strings.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;ReplaceAll&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(n, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;,&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; n&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;func&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; mainBankHandler&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;bqloader&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Handler&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        projector &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:=&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; func&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;_&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; context&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Context&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;r&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; []&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) ([]&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                t, err &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; time.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Parse&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;2006年01月02日&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, r[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; err &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; nil&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                        return&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; nil&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, fmt.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Errorf&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;time.Parse error: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;%v&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, err)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                r[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; t.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Format&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;2006-01-02&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                r[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; cleanNumber&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(r[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                r[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; cleanNumber&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(r[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                r[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; cleanNumber&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(r[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; r, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;nil&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;bqloader&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Handler&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                Name:            &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;main_bank&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                Pattern:         regexp.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;MustCompile&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;^main_bank/&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                Encoding:        japanese.ShiftJIS,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                Parser:          bqloader.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;CSVParser&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                Projector:       projector,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                SkipLeadingRows: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                Project: os.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Getenv&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;GCP_PROJECT&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                Dataset: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;bqloader_dataset&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                Table:   &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;main_bank&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;エントリーポイントとなる関数を実装します。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;go&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// func.go&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;package&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; myfunc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        &quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;context&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        &quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;go.nownabe.dev/bqloader&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; loader &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;bqloader&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;BQLoader&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;func&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; init&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        loader, _ &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; bqloader.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;New&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        loader.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;MustAddHandler&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(context.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Background&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(), &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;mainBankHandler&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;())&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;func&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; MyFunc&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;ctx&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; context&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Context&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; bqloader&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Event&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; loader.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Handle&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(ctx, e)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cloud Functions は Go Modules を理解してくれるので go.mod を作ります。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;go&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mod&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; init&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;go&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mod&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; tidy&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;function-デプロイ&quot;&gt;Function デプロイ&lt;/h3&gt;
&lt;p&gt;必要な API を有効化します。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;gcloud&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; services&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; enable&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --project&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $GCP_PROJECT &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  cloudfunctions.googleapis.com&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  cloudbuild.googleapis.com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;デプロイします。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;gcloud&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; functions&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; deploy&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; bqloader-func&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --project&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $GCP_PROJECT &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --region&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; us-east1&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --runtime&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; go113&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --trigger-resource&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $GCP_PROJECT&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;-source&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --trigger-event&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; google.storage.object.finalize&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --entry-point&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; MyFunc&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --service-account&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $SERVICE_ACCOUNT &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --set-env-vars&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;GCP_PROJECT=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$GCP_PROJECT&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;csv-アップロード&quot;&gt;CSV アップロード&lt;/h3&gt;
&lt;p&gt;CSV ファイルをアップロードして、Cloud Functions にデプロイした bqloader を起動します。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; https://blog.nownabe.com/files/2020/12/13/sample.csv&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; gsutil&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; cp&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; gs://&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$GCP_PROJECT&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;-source/main_bank/sample.csv&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;bigquery-確認&quot;&gt;BigQuery 確認&lt;/h3&gt;
&lt;p&gt;うまくいけば、ShiftJIS の銀行明細 CSV がいい感じに変換されて BigQuery にロードされています。
bq コマンドで確認します。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;bq&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --project_id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $GCP_PROJECT &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  query&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --nouse_legacy_sql&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  &quot;SELECT * FROM &lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$GCP_PROJECT&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;.bqloader_dataset.main_bank LIMIT 5&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;ダッシュボード作成&quot;&gt;ダッシュボード作成&lt;/h3&gt;
&lt;p&gt;最後に &lt;a href=&quot;https://datastudio.google.com/&quot;&gt;Data Studio&lt;/a&gt;&lt;sup&gt;&lt;a href=&quot;#user-content-fn-6&quot; id=&quot;user-content-fnref-6&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;6&lt;/a&gt;&lt;/sup&gt;でダッシュボードを作成します。
が、Data Studio は操作が GUI で説明がめんどくさいのでフィーリングでやってみてください。
画面をポチポチやっていけば、なんとなく BigQuery の銀行明細データを読み込んでグラフが作れそうな雰囲気は感じてもらえると思います。&lt;/p&gt;
&lt;p&gt;適当ですがこんな感じのダッシュボードを作れます。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.nownabe.com/images/2020/12/13/datastudio.png&quot;&gt;&lt;img src=&quot;https://blog.nownabe.com/images/2020/12/13/datastudio.png&quot; alt=&quot;data studio&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;おわりに&quot;&gt;おわりに&lt;/h2&gt;
&lt;p&gt;やってみると意外と簡単で楽しいのでぜひやってみてください。
弊家では今後もどんどんデータを増やして Data Driven な家庭を目指していきます。&lt;/p&gt;
&lt;p&gt;あ、&lt;a href=&quot;https://github.com/nownabe/go-bqloader&quot;&gt;nownabe/go-bqloader&lt;/a&gt; に Star くれると嬉しいです！⭐&lt;/p&gt;
&lt;section data-footnotes class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;アップロードはコマンド一発 &lt;code&gt;gsutil rsync&lt;/code&gt; なので楽なんですが。 &lt;a href=&quot;#user-content-fnref-1&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-2&quot;&gt;
&lt;p&gt;コンテナイメージは Cloud Functions によって古いものは自動で削除されるので、何回デプロイしても 1 円で済むと予想しています。 &lt;a href=&quot;#user-content-fnref-2&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 2&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-3&quot;&gt;
&lt;p&gt;Pull Request お待ちしています！ &lt;a href=&quot;#user-content-fnref-3&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 3&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt; &lt;a href=&quot;#user-content-fnref-3-2&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 3-2&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;sup&gt;2&lt;/sup&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-4&quot;&gt;
&lt;p&gt;イベントについての詳細は &lt;a href=&quot;https://cloud.google.com/functions/docs/calling/storage&quot;&gt;Cloud Functions のドキュメント&lt;/a&gt; を参照してください。 &lt;a href=&quot;#user-content-fnref-4&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 4&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-5&quot;&gt;
&lt;p&gt;&lt;code&gt;bq add-iam-policy-binding&lt;/code&gt; でエラーが出る場合は &lt;code&gt;gcloud components update&lt;/code&gt; してみてください。 &lt;a href=&quot;#user-content-fnref-5&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 5&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-6&quot;&gt;
&lt;p&gt;大人の事情で日本語だとデータポータルになってます。 &lt;a href=&quot;#user-content-fnref-6&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 6&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content:encoded><category>Google Cloud Platform</category><category>BigQuery</category><category>Cloud Storage</category><category>Cloud Functions</category></item><item><title>おうちKubernetes構築日記その2 Kubernetes構築編</title><link>https://blog.nownabe.com/2020/07/19/home-kubernetes-2/</link><guid isPermaLink="true">https://blog.nownabe.com/2020/07/19/home-kubernetes-2/</guid><description>前回 からだいぶ時間があいてしまいましたが、その 2 の Kubernetes 構築編です。 前回組み立てたマシンたちに Kubernetes をインストールしました。 前回は Worker ノード用の Raspberry Pi 4 8GB を 4 台組み立てました。</description><pubDate>Sun, 19 Jul 2020 10:26:56 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://blog.nownabe.com/2020/06/28/home-kubernetes-1/&quot;&gt;前回&lt;/a&gt; からだいぶ時間があいてしまいましたが、その 2 の Kubernetes 構築編です。
前回組み立てたマシンたちに Kubernetes をインストールしました。&lt;/p&gt;
&lt;h2 id=&quot;あらすじ&quot;&gt;あらすじ&lt;/h2&gt;
&lt;p&gt;前回は Worker ノード用の Raspberry Pi 4 8GB を 4 台組み立てました。
今回、それとは別のサーバを 1 台 Control Plane としました。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.nownabe.com/images/2020/06/28/nodes.png&quot; alt=&quot;nodes&quot;&gt;&lt;/p&gt;
&lt;p&gt;構築には &lt;a href=&quot;https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/&quot;&gt;kubeadm&lt;/a&gt; を使いました。&lt;/p&gt;
&lt;h2 id=&quot;control-plane-構築&quot;&gt;Control Plane 構築&lt;/h2&gt;
&lt;p&gt;基本的にドキュメントに従って構築していきます。
kubeadm を使って簡単に構築できました。
kubeadm は Kubernetes クラスタを構築するためのツールです。&lt;/p&gt;
&lt;p&gt;公式ドキュメント的にはこの辺の内容になります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/&quot;&gt;Installing kubeadm | Kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/&quot;&gt;Creating a single control-plane cluster with kubeadm | Kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kubernetes.io/docs/setup/production-environment/container-runtimes/&quot;&gt;Container runtimes | Kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今回 Control Plane として使うサーバの OS は Debian Buster です。&lt;/p&gt;
&lt;h3 id=&quot;ネットワーク設定&quot;&gt;ネットワーク設定&lt;/h3&gt;
&lt;p&gt;Kubernetes から iptables でブリッジのトラフィックを制御できるようにします。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;modprobe&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; br_netfilter&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;cat&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;EOF&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /etc/sysctl.d/k8s.conf&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;net.bridge.bridge-nf-call-ip6tables = 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;net.bridge.bridge-nf-call-iptables = 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;EOF&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sysctl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --system&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;dockerインストール&quot;&gt;Dockerインストール&lt;/h3&gt;
&lt;p&gt;コンテナを実行するために Docker をインストールします。
最初は cri-o でやってみたんですが、Kubernetes の最新バージョンに対応していなかったのと、構築でエラーが出たのでさっさと諦めて Docker にしました。&lt;/p&gt;
&lt;p&gt;ドキュメントに従ってインストールしていきます。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://kubernetes.io/docs/setup/production-environment/container-runtimes/#docker&quot;&gt;Container runtimes | Kubernetes&lt;/a&gt;&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 普通のDockerインストール&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;apt&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; remove&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; docker-engine&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; docker.io&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; runc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;apt-get&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    apt-transport-https&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    ca-certificates&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    gnupg-agent&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    software-properties-common&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -fsSL&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; https://download.docker.com/linux/debian/gpg&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; apt-key&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; add&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; -&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;add-apt-repository&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   &quot;deb [arch=amd64] https://download.docker.com/linux/debian &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   $(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;lsb_release&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -cs&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   stable&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;apt&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; update&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;apt&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; docker-ce&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; docker-ce-cli&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; containerd.io&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Dockerデーモンの設定&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;cat&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /etc/docker/daemon.json&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;EOF&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  &quot;exec-opts&quot;: [&quot;native.cgroupdriver=systemd&quot;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  &quot;log-driver&quot;: &quot;json-file&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  &quot;log-opts&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &quot;max-size&quot;: &quot;100m&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  &quot;storage-driver&quot;: &quot;overlay2&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;EOF&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;mkdir&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -p&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /etc/systemd/system/docker.service.d&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;systemctl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; daemon-reload&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;systemctl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; restart&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; docker&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;/etc/docker/daemon.json&lt;/code&gt; の cgroup driver は kubelet と同じにする必要があります。
Docker のデフォルトは &lt;code&gt;cgroupfs&lt;/code&gt; ですが、kubeadm で構築すると kubelet は &lt;code&gt;systemd&lt;/code&gt; に設定されるので &lt;code&gt;systemd&lt;/code&gt; にあわせます。&lt;/p&gt;
&lt;p&gt;systemd の Unit ファイルにはいろいろ書いてありますが、kubelet の cgroup driver を変更する場合は &lt;code&gt;/var/lib/kubelet/config.yaml&lt;/code&gt; での設定が推奨のようです。&lt;/p&gt;
&lt;h3 id=&quot;kubeadmインストール&quot;&gt;kubeadmインストール&lt;/h3&gt;
&lt;p&gt;kubeadm、kubelet、kubectl をインストールします。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -s&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; https://packages.cloud.google.com/apt/doc/apt-key.gpg&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; apt-key&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; add&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; -&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;echo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;deb https://apt.kubernetes.io/ kubernetes-xenial main&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /etc/apt/sources.list.d/kubernetes.list&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;apt&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; update&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;apt&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -y&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kubeadm&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kubelet&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kubectl&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;apt-mark&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; hold&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kubelet&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kubeadm&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kubectl&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;control-plane初期化&quot;&gt;Control Plane初期化&lt;/h3&gt;
&lt;p&gt;kubeadm で Control Plane を初期化します。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;kubeadm&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; init&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --dry-run&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --control-plane-endpoint=kube-master.cf.nownabe.in&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --pod-network-cidr=10.4.0.0/14&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --service-cidr=10.2.0.0/15&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --service-dns-domain&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;kube.cf.nownabe.in&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;これは dry run コマンドなので、大丈夫そうなら &lt;code&gt;--dry-run&lt;/code&gt; を消して実行します。
うまくいったら次のようなメッセージが表示されます。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;To&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; start&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; using&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; your&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; cluster,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; you&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; need&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; to&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; run&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; the&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; following&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; a&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; regular&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; user:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  mkdir&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -p&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $HOME&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;/.kube&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; cp&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -i&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /etc/kubernetes/admin.conf&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $HOME&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;/.kube/config&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; chown&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -u&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -g&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) $HOME&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;/.kube/config&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;You&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; should&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; now&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; deploy&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; a&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pod&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; network&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; to&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; the&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; cluster.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Run&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;kubectl apply -f [podnetwork].yaml&quot;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; with&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; one&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; of&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; the&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; options&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; listed&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; at:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  https://kubernetes.io/docs/concepts/cluster-administration/addons/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;You&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; can&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; now&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; join&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; any&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; of&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; control-plane&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; nodes&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; by&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; copying&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; certificate&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; authorities&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;and&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; service&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; account&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; keys&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; on&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; each&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; node&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; and&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; then&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; running&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; the&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; following&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; root:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  kubeadm&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; join&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kube-master.cf.nownabe.in:6443&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --token&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; XXXX&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    --discovery-token-ca-cert-hash&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; sha256:XXXX&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    --control-plane&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Then&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; you&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; can&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; join&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; any&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; of&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; worker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; nodes&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; by&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; running&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; the&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; following&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; on&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; each&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; root:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;kubeadm&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; join&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kube-master.cf.nownabe.in:6443&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --token&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; XXXX&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    --discovery-token-ca-cert-hash&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; sha256:XXXX&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Control Plane は今回この 1 ノードだけなので、次にやることはこの 3 つですね。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;設定コピーして kubectl 使えるようにする&lt;/li&gt;
&lt;li&gt;Pod ネットワーク add-on デプロイ&lt;/li&gt;
&lt;li&gt;Worker ノード追加&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;設定を &lt;code&gt;/etc/kubernetes/admin.conf&lt;/code&gt; からコピーして、別のマシンから &lt;code&gt;kubectl get po&lt;/code&gt; してみました。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kubectl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; version&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Client&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Version:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; version.Info{Major:&quot;1&quot;,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Minor:&quot;13+&quot;,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; GitVersion:&quot;v1.13.11-dispatcher&quot;,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; GitCommit:&quot;2e298c7e992f83f47af60cf4830b11c7370f6668&quot;,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; GitTreeState:&quot;clean&quot;,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; BuildDate:&quot;2019-09-19T22:20:12Z&quot;,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; GoVersion:&quot;go1.11.13&quot;,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Compiler:&quot;gc&quot;,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Platform:&quot;linux/amd64&quot;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Server&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Version:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; version.Info{Major:&quot;1&quot;,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Minor:&quot;18&quot;,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; GitVersion:&quot;v1.18.3&quot;,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; GitCommit:&quot;2e7996e3e2712684bc73f0dec0200d64eec7fe40&quot;,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; GitTreeState:&quot;clean&quot;,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; BuildDate:&quot;2020-05-20T12:43:34Z&quot;,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; GoVersion:&quot;go1.13.9&quot;,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Compiler:&quot;gc&quot;,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Platform:&quot;linux/amd64&quot;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kubectl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; get&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pods&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --all-namespaces&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;NAMESPACE&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;     NAME&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                                         READY&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   STATUS&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;              RESTARTS&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   AGE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;kube-system&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   coredns-66bff467f8-7sr7t&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                     0/1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;     ContainerCreating&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   0&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;          21h&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;kube-system&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   coredns-66bff467f8-sh24v&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                     0/1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;     ContainerCreating&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   0&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;          21h&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;kube-system&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   etcd-sv-1.cf.nownabe.in&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                      1/1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;     Running&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;             0&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;          21h&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;kube-system&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   kube-apiserver-sv-1.cf.nownabe.in&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;            1/1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;     Running&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;             0&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;          21h&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;kube-system&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   kube-controller-manager-sv-1.cf.nownabe.in&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   1/1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;     Running&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;             0&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;          21h&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;kube-system&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   kube-proxy-t4hgb&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                             1/1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;     Running&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;             0&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;          21h&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;kube-system&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   kube-scheduler-sv-1.cf.nownabe.in&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;            1/1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;     Running&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;おおー、動いてますね！！　🎉
クライアントの kubectl がやたら古いのが気になりますが、ちゃんと apiserver は動いてそうです。&lt;/p&gt;
&lt;h2 id=&quot;workerノード構築&quot;&gt;Workerノード構築&lt;/h2&gt;
&lt;p&gt;Control Plane ができたので、Raspberry Pi を Worker ノードとして構築してクラスタに追加していきます。&lt;/p&gt;
&lt;p&gt;Raspberry Pi にインストールした OS は Raspberry Pi OS Buster です。&lt;/p&gt;
&lt;h3 id=&quot;swap無効化&quot;&gt;Swap無効化&lt;/h3&gt;
&lt;p&gt;Raspberry Pi OS ではデフォルトだと Swap が有効になっているので無効化します。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;dphys-swapfile&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; swapoff&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;systemctl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; stop&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; dphys-swapfile&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;systemctl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; disable&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; dphys-swapfile&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;いろいろ&quot;&gt;いろいろ&lt;/h3&gt;
&lt;p&gt;Docker インストールしたり kubeadm インストールしたりします。
ここは Control Plane とほぼ同じなのでコマンドだけ。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;modprobe&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; br_netfilter&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;modprobe&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; overlay&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;cat&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;EOF&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /etc/sysctl.d/k8s.conf&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;net.bridge.bridge-nf-call-ip6tables = 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;net.bridge.bridge-nf-call-iptables = 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;net.ipv4.ip_forward = 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;EOF&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sysctl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --system&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;apt&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; remove&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; docker-engine&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; docker.io&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; runc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -fsSL&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; get.docker.com&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; sh&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;cat&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /etc/docker/daemon.json&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;EOF&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  &quot;exec-opts&quot;: [&quot;native.cgroupdriver=systemd&quot;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  &quot;log-driver&quot;: &quot;json-file&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  &quot;log-opts&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &quot;max-size&quot;: &quot;100m&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  &quot;storage-driver&quot;: &quot;overlay2&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;EOF&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;systemctl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; restart&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; docker&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;apt&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -y&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; apt-transport-https&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -s&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; https://packages.cloud.google.com/apt/doc/apt-key.gpg&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; apt-key&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; add&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; -&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;cat&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;EOF&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /etc/apt/sources.list.d/kubernetes.list&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;deb https://apt.kubernetes.io/ kubernetes-xenial main&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;EOF&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;apt&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; update&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;apt&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -y&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kubeadm&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kubelet&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kubectl&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;apt-mark&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; hold&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kubelet&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kubeadm&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kubectl&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;workerノード初期化&quot;&gt;Workerノード初期化&lt;/h3&gt;
&lt;p&gt;kubeadm で初期化し、クラスタに参加します。
Control Plane を kubeadm で初期化したときに表示されたコマンドを実行するだけです。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;kubeadm&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; join&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kube-master.cf.nownabe.in:6443&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --token&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; XXXX&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    --discovery-token-ca-cert-hash&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; sha256:XXXX&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;もしトークンの期限が切れていてエラーになる場合は、Control Plane でトークンを再発行します。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;kubeadm&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; token&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; create&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --print-join-command&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;トークンの一覧もコマンドで確認できます。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;kubeadm&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; token&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; list&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-token/&quot;&gt;kubeadm token | Kubernetes&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;無事実行できたら、kubectl で確認してみましょう。
ちゃんと追加されてますね！やった！　👏&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kubectl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; get&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; nodes&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --output&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; wide&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;NAME&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                          STATUS&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ROLES&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    AGE&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   VERSION&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   INTERNAL-IP&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   EXTERNAL-IP&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   OS-IMAGE&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                         KERNEL-VERSION&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   CONTAINER-RUNTIME&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;kube-worker-1.cf.nownabe.in&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   Ready&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   31d&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   v1.18.5&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   10.0.1.101&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        Raspbian&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; GNU/Linux&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 10&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (buster)   4.19.118-v8+     docker://19.3.12&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;kube-worker-2.cf.nownabe.in&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   Ready&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   30d&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   v1.18.4&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   10.0.1.102&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        Raspbian&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; GNU/Linux&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 10&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (buster)   4.19.118-v8+     docker://19.3.11&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;kube-worker-3.cf.nownabe.in&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   Ready&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   23d&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   v1.18.4&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   10.0.1.103&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        Raspbian&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; GNU/Linux&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 10&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (buster)   4.19.118-v8+     docker://19.3.12&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;kube-worker-4.cf.nownabe.in&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   Ready&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   23d&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   v1.18.4&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   10.0.1.104&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        Raspbian&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; GNU/Linux&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 10&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (buster)   4.19.118-v8+     docker://19.3.12&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sv-1.cf.nownabe.in&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;            Ready&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    master&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   31d&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   v1.18.3&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   10.0.1.1&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;      &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        Debian&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; GNU/Linux&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 10&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (buster)     4.19.0-9-amd64   docker://19.3.11&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;flannel-インストール&quot;&gt;flannel インストール&lt;/h2&gt;
&lt;p&gt;最後に Network Add-on として flannel をインストールしました。
最初に Calico、次に Cilium をインストールしようとしたんですが上手く行かずに flannel になりました。
調べてからインストールすればよかったんですが、Arm の 64bit に対応できてませんでした。&lt;/p&gt;
&lt;p&gt;flannel のインストールは公式で用意されているマニフェスト YAML を apply で OK です。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -O&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;kubectl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; apply&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -f&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kube-flannel.yml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;するとこんな感じで Daemon Set として flannel がデプロイされます。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kubectl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; get&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; po&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --output&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; wide&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --all-namespaces&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;NAMESPACE&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;     NAME&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                                         READY&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   STATUS&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    RESTARTS&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   AGE&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   IP&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;           NODE&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                          NOMINATED&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; NODE&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   READINESS&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; GATES&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;kube-system&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   coredns-66bff467f8-8dspl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                     1/1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;     Running&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   0&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;          20d&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   10.4.4.2&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;     kube-worker-3.cf.nownabe.in&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;   &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;           &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;kube-system&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   coredns-66bff467f8-vfx8d&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                     1/1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;     Running&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   0&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;          30d&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   10.4.2.2&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;     kube-worker-2.cf.nownabe.in&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;   &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;           &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;kube-system&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   etcd-sv-1.cf.nownabe.in&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                      1/1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;     Running&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   0&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;          31d&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   10.0.1.1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;     sv-1.cf.nownabe.in&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;            &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;           &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;kube-system&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   kube-apiserver-sv-1.cf.nownabe.in&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;            1/1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;     Running&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   0&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;          31d&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   10.0.1.1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;     sv-1.cf.nownabe.in&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;            &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;           &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;kube-system&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   kube-controller-manager-sv-1.cf.nownabe.in&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   1/1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;     Running&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   193&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        31d&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   10.0.1.1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;     sv-1.cf.nownabe.in&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;            &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;           &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;kube-system&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   kube-flannel-ds-amd64-dpw88&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                  1/1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;     Running&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   10&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;         31d&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   10.0.1.1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;     sv-1.cf.nownabe.in&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;            &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;           &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;kube-system&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   kube-flannel-ds-arm-mld8c&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                    1/1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;     Running&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   0&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;          23d&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   10.0.1.104&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   kube-worker-4.cf.nownabe.in&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;   &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;           &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;kube-system&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   kube-flannel-ds-arm-q2z9v&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                    1/1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;     Running&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   0&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;          31d&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   10.0.1.101&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   kube-worker-1.cf.nownabe.in&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;   &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;           &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;kube-system&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   kube-flannel-ds-arm-qfqcs&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                    1/1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;     Running&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   2&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;          23d&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   10.0.1.103&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   kube-worker-3.cf.nownabe.in&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;   &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;           &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;kube-system&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   kube-flannel-ds-arm-wgg4d&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                    1/1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;     Running&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   2&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;          30d&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   10.0.1.102&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   kube-worker-2.cf.nownabe.in&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;   &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;           &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;kube-system&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   kube-proxy-429jm&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                             1/1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;     Running&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   0&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;          31d&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   10.0.1.1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;     sv-1.cf.nownabe.in&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;            &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;           &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;kube-system&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   kube-proxy-55tgl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                             1/1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;     Running&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   0&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;          23d&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   10.0.1.104&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   kube-worker-4.cf.nownabe.in&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;   &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;           &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;kube-system&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   kube-proxy-f4msl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                             1/1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;     Running&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   0&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;          23d&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   10.0.1.103&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   kube-worker-3.cf.nownabe.in&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;   &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;           &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;kube-system&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   kube-proxy-fp6d2&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                             1/1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;     Running&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   0&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;          30d&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   10.0.1.102&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   kube-worker-2.cf.nownabe.in&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;   &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;           &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;kube-system&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   kube-proxy-hntn9&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                             1/1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;     Running&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   0&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;          31d&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   10.0.1.101&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   kube-worker-1.cf.nownabe.in&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;   &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;           &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;kube-system&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   kube-scheduler-sv-1.cf.nownabe.in&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;            1/1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;     Running&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   190&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        31d&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   10.0.1.1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;     sv-1.cf.nownabe.in&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;            &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;           &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;1 ヶ月ブログ書くの先延ばしにしてたこともばっちりわかって素晴らしいですね 🙌&lt;/p&gt;
&lt;h2 id=&quot;おわりに&quot;&gt;おわりに&lt;/h2&gt;
&lt;p&gt;Kubernetes 構築編は以上です。
無事に Kubernetes が構築できて満足です 😆&lt;/p&gt;
&lt;p&gt;Network に関しては flannel だけだと Network Policy が使えないので、またそのうちなんとかしたいと思います。&lt;/p&gt;
&lt;p&gt;次からはいろいろ機能追加していきたいので、まずは GitOps ですかねー。&lt;/p&gt;
</content:encoded><category>Kubernetes</category></item><item><title>CoreDNS で DNS サーバたてた</title><link>https://blog.nownabe.com/2020/07/11/coredns/</link><guid isPermaLink="true">https://blog.nownabe.com/2020/07/11/coredns/</guid><description>CoreDNS を使って自宅のネットワークに DNS サーバをたてました。 Kubernetes を構築して[^1]プライベートのサービスを動かそうと思ってたんですが、そのときにサービスにもドメインつけたいし、サーバごにょごにょするときのもドメインほしいしってことで DNS サーバをたてました。 SSH するときも W…</description><pubDate>Sat, 11 Jul 2020 11:30:44 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://coredns.io/&quot;&gt;CoreDNS&lt;/a&gt; を使って自宅のネットワークに DNS サーバをたてました。&lt;/p&gt;
&lt;p&gt;Kubernetes を構築して&lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;プライベートのサービスを動かそうと思ってたんですが、そのときにサービスにもドメインつけたいし、サーバごにょごにょするときのもドメインほしいしってことで DNS サーバをたてました。&lt;/p&gt;
&lt;h2 id=&quot;そもそもたてる必要あるの&quot;&gt;そもそもたてる必要あるの？&lt;/h2&gt;
&lt;p&gt;SSH するときも Web でアクセスするときも IP よりはドメインの方がいいので、なんらかの DNS サーバは必要でした。
DNS サーバの選択肢として、他にはパブリッククラウドの DNS サービス、ルータの DNS 機能がありました。&lt;/p&gt;
&lt;p&gt;簡単に比較するとこんな感じです。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;th&gt;クラウド&lt;/th&gt;
&lt;th&gt;自前CoreDNS&lt;/th&gt;
&lt;th&gt;ルータ&lt;/th&gt;
&lt;th&gt;コメント&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;料金&lt;/td&gt;
&lt;td&gt;😷&lt;/td&gt;
&lt;td&gt;😆&lt;/td&gt;
&lt;td&gt;😆&lt;/td&gt;
&lt;td&gt;有料か無料か&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;反応速度&lt;/td&gt;
&lt;td&gt;😷&lt;/td&gt;
&lt;td&gt;😆&lt;/td&gt;
&lt;td&gt;😆&lt;/td&gt;
&lt;td&gt;やっぱりローカルは圧倒的に速い&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;運用&lt;/td&gt;
&lt;td&gt;😆&lt;/td&gt;
&lt;td&gt;😷&lt;/td&gt;
&lt;td&gt;😷&lt;/td&gt;
&lt;td&gt;オンプレはだるい&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;設定&lt;/td&gt;
&lt;td&gt;😆&lt;/td&gt;
&lt;td&gt;😆&lt;/td&gt;
&lt;td&gt;😷&lt;/td&gt;
&lt;td&gt;/etc/hosts書き換えればOK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;自動化&lt;/td&gt;
&lt;td&gt;😆&lt;/td&gt;
&lt;td&gt;😃&lt;/td&gt;
&lt;td&gt;😷&lt;/td&gt;
&lt;td&gt;etcdプラグインとか使えば簡単にできる&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;機能&lt;/td&gt;
&lt;td&gt;😄&lt;/td&gt;
&lt;td&gt;😆&lt;/td&gt;
&lt;td&gt;😷&lt;/td&gt;
&lt;td&gt;まあいろいろできる&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;速くて無料で必要な機能が実現できる、ということで自前で DNS サーバたてることを選択しました。
運用に関しても、データぶっ飛んでもすぐ復旧できるレベルでしか使わないだろうし、なんか問題でてきたらクラウドに移せばいいぐらいの感覚です。&lt;/p&gt;
&lt;h2 id=&quot;なんでcoredns&quot;&gt;なんでCoreDNS？&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://coredns.io/&quot;&gt;CoreDNS&lt;/a&gt; っていうのは CNCF にホストされている、Go で書かれた DNS サーバです。&lt;/p&gt;
&lt;p&gt;CoreDNS を選んだのはこのへんが理由です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CNCF のプロジェクトということで以前から使ってみたいと思ってた&lt;/li&gt;
&lt;li&gt;dnsmasq 的な &lt;code&gt;/etc/hosts&lt;/code&gt; での設定ができる&lt;/li&gt;
&lt;li&gt;DB (etcd) をバックエンドにできるのでバックアップとか自動化とかが楽&lt;/li&gt;
&lt;li&gt;プラグインが簡単に書けるので楽しそう&lt;/li&gt;
&lt;li&gt;設定がシンプル&lt;/li&gt;
&lt;li&gt;機能が全部プラグインで実現されてるって思想が良い&lt;/li&gt;
&lt;li&gt;Go で書かれている&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今まで Bind、dnsmasq、PowerDNS を構築、運用したことあるんですが、今の所一番気に入ってます。
使用感もいいし、わくわく感もあります。&lt;/p&gt;
&lt;h2 id=&quot;構築手順&quot;&gt;構築手順&lt;/h2&gt;
&lt;p&gt;Kubernetes のマスターとなるサーバにインストールしました。以下 root での実行コマンドです。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# ダウンロード、インストール&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -LO&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; https://github.com/coredns/coredns/releases/download/v1.6.9/coredns_1.6.9_linux_amd64.tgz&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;tar&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; xf&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; coredns_1.6.9_linux_amd64.tgz&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;mv&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; coredns&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /usr/local/bin/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;chown&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; root.&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /usr/local/bin/coredns&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# CoreDNS用ユーザの追加&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;useradd&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -l&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -r&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -s&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /usr/sbin/nologin&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -m&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -d&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /var/lib/coredns&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -c&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;CoreDNS user&apos;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; coredns&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# systemdのユニットファイル&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;cat&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;EOF&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /etc/systemd/system/coredns.service&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /etc/systemd/system/coredns.service&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;[Unit]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Description=CoreDNS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Documentation=https://coredns.io&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;After=network.target&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;[Service]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;LimitNOFILE=1048576&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;LimitNPROC=512&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;CapabilityBoundingSet=CAP_NET_BIND_SERVICE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;AmbientCapabilities=CAP_NET_BIND_SERVICE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;NoNewPrivileges=true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;User=coredns&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;WorkingDirectory=/var/lib/coredns&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;ExecStart=/usr/local/bin/coredns -conf=/etc/coredns/Corefile&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;ExecReload=/bin/kill -SIGUSR1 &lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$MAINPID&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Restart=on-failure&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;[Install]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;WantedBy=multi-user.target&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;EOF&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# CoreDNSの設定&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;mkdir&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /etc/coredns&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;cat&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;EOF&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /etc/coredns/Corefile&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;(common) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  cache&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  errors&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  loop&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;. {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  forward . 8.8.8.8 1.1.1.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  health :1053&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  import common&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  prometheus :9153&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  reload&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;nownabe.in {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  hosts /etc/coredns/nownabe.in&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  import common&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;EOF&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# nownabe.inのレコード設定&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;cat&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;EOF&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /etc/coredns/nownabe.in&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;10.0.0.2   rtx.cf.nownabe.in&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;10.0.1.1   sv-1.cf.nownabe.in dns.cf.nownabe.in kube-master.cf.nownabe.in&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;10.0.1.101 kube-worker-1.cf.nownabe.in&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;10.0.1.102 kube-worker-2.cf.nownabe.in&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;10.0.1.103 kube-worker-3.cf.nownabe.in&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;10.0.1.104 kube-worker-4.cf.nownabe.in&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;EOF&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# CoreDNS有効化、起動&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;systemctl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; enable&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; coredns&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;systemctl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; start&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; coredns&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;バイナリひとつで動くのがいいですよね。Go プロダクトって感じです。&lt;/p&gt;
&lt;p&gt;systemd のユニットファイルは、&lt;a href=&quot;https://github.com/coredns/deployment&quot;&gt;coredns/deployment&lt;/a&gt; というリポジトリにある &lt;a href=&quot;https://github.com/coredns/deployment/blob/master/systemd/coredns.service&quot;&gt;coredns.service&lt;/a&gt; を参考にしました。
ちょっと古かったり余計な権限がついてたりしたので、少し修正しています。&lt;/p&gt;
&lt;p&gt;今の所レコードは/etc/hosts 形式で設定しています。&lt;/p&gt;
&lt;h2 id=&quot;dhcpの設定&quot;&gt;DHCPの設定&lt;/h2&gt;
&lt;p&gt;ルータ RTX830 を DHCP サーバに使っているので、構築した DNS サーバを設定しました。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;txt&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;no dns server pp 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;no dns server dhcp lan2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;no dns server select 500000 dhcp lan2 any .&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;no dns server select 500001 pp 1 any . restrict pp 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;dns server 10.0.1.1 8.8.8.8 1.1.1.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;dns notice order dhcp server&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;dns domain cf.nownabe.in&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;クライアントの設定&quot;&gt;クライアントの設定&lt;/h2&gt;
&lt;p&gt;DHCP を使っていないサーバにはそれぞれ手動で設定しました。
いろいろあるのでそれぞれの設定は省略しますが、 &lt;code&gt;/etc/resolv.conf&lt;/code&gt; はこんな感じです。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;txt&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;nameserver 10.0.1.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;nameserver 8.8.8.8&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;nameserver 1.1.1.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;domain cf.nownabe.in&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;search cf.nownabe.in nownabe.in&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;試してみる&quot;&gt;試してみる&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; dig&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kube-worker-1.cf.nownabe.in&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; DiG&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 9.11.5-P4-5.1ubuntu2.2-Ubuntu&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; kube-worker-1.cf.nownabe.in&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; global options: +cmd&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; Got answer:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 39530&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; WARNING: recursion requested but not available&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; OPT PSEUDOSECTION:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;; EDNS: version: 0, flags:; udp: 4096&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;; COOKIE: 10fad6c1cf5760b3 (echoed)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; QUESTION SECTION:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;kube-worker-1.cf.nownabe.in.   IN      A&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; ANSWER SECTION:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;kube-worker-1.cf.nownabe.in. 2288 IN    A       10.0.1.101&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; Query time: 0 msec&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; SERVER: 10.0.1.1#53(10.0.1.1)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; WHEN: 土  7月 11 21:35:29 JST 2020&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; MSG SIZE  rcvd: 111&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;いいですねー。0ms で答えが返ってきてます。&lt;/p&gt;
&lt;p&gt;外部ドメインでもキャッシュされてると 0ms で返ってきます。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; dig&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; google.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; DiG&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 9.11.5-P4-5.1ubuntu2.2-Ubuntu&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; google.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; global options: +cmd&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; Got answer:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 61410&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; OPT PSEUDOSECTION:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;; EDNS: version: 0, flags:; udp: 4096&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;; COOKIE: 1fc6abfd8e8a2b9d (echoed)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; QUESTION SECTION:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;google.com.                    IN      A&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; ANSWER SECTION:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;google.com.             298     IN      A       172.217.24.142&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; Query time: 0 msec&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; SERVER: 10.0.1.1#53(10.0.1.1)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; WHEN: 土  7月 11 21:38:23 JST 2020&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; MSG SIZE  rcvd: 77&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;パブリック DNS サーバに問い合わせると 4ms とかかかります。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; dig&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; google.com&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; @8.8.8.8&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; DiG&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 9.11.5-P4-5.1ubuntu2.2-Ubuntu&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; google.com&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; @8.8.8.8&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; global options: +cmd&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; Got answer:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 55448&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; OPT PSEUDOSECTION:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;; EDNS: version: 0, flags:; udp: 512&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; QUESTION SECTION:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;google.com.                    IN      A&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; ANSWER SECTION:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;google.com.             203     IN      A       172.217.27.78&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; Query time: 4 msec&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; SERVER: 8.8.8.8#53(8.8.8.8)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; WHEN: 土  7月 11 21:38:38 JST 2020&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; MSG SIZE  rcvd: 55&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ただ、キャッシュにのってない場合はめちゃくちゃ遅くなります。
うーんなんでだろう。&lt;sup&gt;&lt;a href=&quot;#user-content-fn-2&quot; id=&quot;user-content-fnref-2&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; dig&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; google.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; DiG&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 9.11.5-P4-5.1ubuntu2.2-Ubuntu&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; google.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; global options: +cmd&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; Got answer:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 32912&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; OPT PSEUDOSECTION:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;; EDNS: version: 0, flags:; udp: 4096&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; QUESTION SECTION:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;google.com.                    IN      A&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; ANSWER SECTION:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;google.com.             299     IN      A       172.217.24.142&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; Query time: 84 msec&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; SERVER: 10.0.1.1#53(10.0.1.1)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; WHEN: 土  7月 11 21:38:22 JST 2020&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;;; MSG SIZE  rcvd: 65&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;おわりに&quot;&gt;おわりに&lt;/h2&gt;
&lt;p&gt;以上です。無事に &lt;code&gt;ssh kube-worker-1&lt;/code&gt; ができるようになって満足です。
キャッシュにのってない外部ドメインのクエリがめっちゃ遅いのは不便なのでなんとかしたいですね。&lt;sup&gt;&lt;a href=&quot;#user-content-fn-2&quot; id=&quot;user-content-fnref-2-2&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;今後は、簡単な Web UI とかを作りたいなーと思ってます。&lt;/p&gt;
&lt;section data-footnotes class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.nownabe.com/2020/06/28/home-kubernetes-1&quot;&gt;おうちKubernetes構築日記その1 Raspberry Pi編 - nownab.log&lt;/a&gt; &lt;a href=&quot;#user-content-fnref-1&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-2&quot;&gt;
&lt;p&gt;記事書いた直後に調べたら、単純にサーバから外に出る回線(PPPoE)が遅いだけだった &lt;a href=&quot;#user-content-fnref-2&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 2&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt; &lt;a href=&quot;#user-content-fnref-2-2&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 2-2&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;sup&gt;2&lt;/sup&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content:encoded><category>CoreDNS</category></item><item><title>Raspberry Pi 4 のベンチマーク</title><link>https://blog.nownabe.com/2020/07/03/raspberrypi-bench/</link><guid isPermaLink="true">https://blog.nownabe.com/2020/07/03/raspberrypi-bench/</guid><description>Raspberry Pi 4 の各種ベンチマークを取ってみました。 UnixBench と fio です。 雑にほぼデフォルト設定で計測ました。</description><pubDate>Sat, 04 Jul 2020 10:43:02 GMT</pubDate><content:encoded>&lt;p&gt;Raspberry Pi 4 の各種ベンチマークを取ってみました。
UnixBench と fio です。
雑にほぼデフォルト設定で計測ました。
チューニング等もまったくしてません。&lt;/p&gt;
&lt;p&gt;Raspberry Pi 4 の生の結果は最後にまとめて貼っておきます。&lt;/p&gt;
&lt;h2 id=&quot;比較対象&quot;&gt;比較対象&lt;/h2&gt;
&lt;p&gt;何かしら比較対象がほしかったので、この辺りを使いました。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;マシン&lt;/th&gt;
&lt;th&gt;CPU&lt;/th&gt;
&lt;th&gt;Memory&lt;/th&gt;
&lt;th&gt;Disk 1&lt;/th&gt;
&lt;th&gt;Disk 2&lt;/th&gt;
&lt;th&gt;OS&lt;/th&gt;
&lt;th&gt;Kernel&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/B081YD3VL5?tag=nownabe02-22&quot;&gt;Raspberry Pi 4 Model B&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Arm Cortex-A72 1.5GHz 4 cores&lt;/td&gt;
&lt;td&gt;8GB&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/B07MVLX5XV?tag=nownabe02-22&quot;&gt;Samsung EVO Plus 512GB microSDXC&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;Raspberry OS buster&lt;/td&gt;
&lt;td&gt;Linux 4.19.118&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/B07K4CV1Y8?tag=nownabe02-22&quot;&gt;Raspberry Pi 3 Model B&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Arm Cortex-A53 1.2GHz 4 cores&lt;/td&gt;
&lt;td&gt;1GB&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/B0162YQEIE?tag=nownabe02-22&quot;&gt;Kingston microSDHC 16GB&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;Raspberry OS&lt;/td&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Server&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/B004P8FBFC?tag=nownabe02-22&quot;&gt;Core i3-2100T 2.5GHz 2 cores 4 threads&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;16GB&lt;/td&gt;
&lt;td&gt;WD SATA 1TB&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;Debian buster&lt;/td&gt;
&lt;td&gt;Linux 4.19.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Desktop PC&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/B07598VZR8?tag=nownabe02-22&quot;&gt;Core i7-8700K 3.7GHz 6 cores 12 threads&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;64GB&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/B075M3C6Q9?tag=nownabe02-22&quot;&gt;CFD SATA3.0 NAND SSD 240GB&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/B015FGGX5O?tag=nownabe02-22&quot;&gt;WD Blue SATA3.0 5400rpm 4TB&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Ubuntu 19.10&lt;/td&gt;
&lt;td&gt;Linux 5.3.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;注意点として、Raspberry Pi 4 は多分電力が足りてません。&lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;h2 id=&quot;unixbench&quot;&gt;UnixBench&lt;/h2&gt;
&lt;h3 id=&quot;セットアップ&quot;&gt;セットアップ&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; apt&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; clone&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; https://github.com/kdlucas/byte-unixbench&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; byte-unixbench/UnixBench&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;./Run&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;結果&quot;&gt;結果&lt;/h3&gt;
&lt;p&gt;Raspberry Pi 3 に比べるとだいぶ良い結果が出てますね。
System Call Overhead だけなぜか負けてます。&lt;/p&gt;
&lt;p&gt;一番お金かかってるデスクトップ PC が圧倒的に勝ってて安心しました。&lt;/p&gt;
&lt;p&gt;グラフは Index Score です。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.nownabe.com/images/2020/07/04/unix_bench_single.png&quot; alt=&quot;UnixBench Single Core&quot;&gt;
&lt;img src=&quot;https://blog.nownabe.com/images/2020/07/04/unix_bench_multi.png&quot; alt=&quot;UnixBench Multi Core&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;fio&quot;&gt;fio&lt;/h2&gt;
&lt;h3 id=&quot;セットアップ-1&quot;&gt;セットアップ&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; apt&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libaio-dev&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; fio&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;fio のバージョンは 3.12。&lt;/p&gt;
&lt;h3 id=&quot;設定&quot;&gt;設定&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;txt&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[sequential_read]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;rw=read&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;size=1g&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;ioengine=libaio&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;direct=1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;group_reporting&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[sequential_write]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;rw=write&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;size=1g&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;ioengine=libaio&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;direct=1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;group_reporting&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[random_read]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;rw=randread&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;size=1g&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;ioengine=libaio&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;direct=1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;group_reporting&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[random_write]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;rw=randwrite&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;size=1g&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;ioengine=libaio&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;direct=1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;group_reporting&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;結果-1&quot;&gt;結果&lt;/h3&gt;
&lt;p&gt;今回 Evo Plus というそこそこいい SD カードを使ってますが、Seqeuntial、Random ともに Read が 2500IOPS、Write が 600IPS 程度でした。&lt;/p&gt;
&lt;p&gt;Raspberry Pi 3 は遅すぎたので計測してません。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.nownabe.com/images/2020/07/03/raspberrypi-bench/banner.png&quot; alt=&quot;fio&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;ログ&quot;&gt;ログ&lt;/h2&gt;
&lt;p&gt;以下、Raspberry Pi 4 の計測ログです。&lt;/p&gt;
&lt;h3 id=&quot;unixbench-1&quot;&gt;UnixBench&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;txt&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;========================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   BYTE UNIX Benchmarks (Version 5.1.3)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   System: raspberrypi: GNU/Linux&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   OS: GNU/Linux -- 4.19.118-v8+ -- #1311 SMP PREEMPT Mon Apr 27 14:32:38 BST 2020&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   Machine: aarch64 (unknown)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   Language: en_US.utf8 (charmap=&quot;ANSI_X3.4-1968&quot;, collate=&quot;ANSI_X3.4-1968&quot;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   15:04:13 up  1:53,  1 user,  load average: 0.15, 0.04, 0.04; runlevel Jul&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Benchmark Run: Fri Jul 03 2020 15:04:13 - 15:32:03&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;4 CPUs in system; running 1 parallel copy of tests&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Dhrystone 2 using register variables       10044316.9 lps   (10.0 s, 7 samples)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Double-Precision Whetstone                     2384.8 MWIPS (9.6 s, 7 samples)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Execl Throughput                               1475.8 lps   (30.0 s, 2 samples)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;File Copy 1024 bufsize 2000 maxblocks        181135.5 KBps  (30.0 s, 2 samples)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;File Copy 256 bufsize 500 maxblocks           53422.1 KBps  (30.0 s, 2 samples)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;File Copy 4096 bufsize 8000 maxblocks        482507.3 KBps  (30.0 s, 2 samples)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Pipe Throughput                              315057.3 lps   (10.0 s, 7 samples)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Pipe-based Context Switching                  50713.4 lps   (10.0 s, 7 samples)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Process Creation                               2397.1 lps   (30.0 s, 2 samples)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Shell Scripts (1 concurrent)                   3494.7 lpm   (60.0 s, 2 samples)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Shell Scripts (8 concurrent)                   1011.6 lpm   (60.0 s, 2 samples)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;System Call Overhead                         276956.8 lps   (10.0 s, 7 samples)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;System Benchmarks Index Values               BASELINE       RESULT    INDEX&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Dhrystone 2 using register variables         116700.0   10044316.9    860.7&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Double-Precision Whetstone                       55.0       2384.8    433.6&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Execl Throughput                                 43.0       1475.8    343.2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;File Copy 1024 bufsize 2000 maxblocks          3960.0     181135.5    457.4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;File Copy 256 bufsize 500 maxblocks            1655.0      53422.1    322.8&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;File Copy 4096 bufsize 8000 maxblocks          5800.0     482507.3    831.9&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Pipe Throughput                               12440.0     315057.3    253.3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Pipe-based Context Switching                   4000.0      50713.4    126.8&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Process Creation                                126.0       2397.1    190.2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Shell Scripts (1 concurrent)                     42.4       3494.7    824.2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Shell Scripts (8 concurrent)                      6.0       1011.6   1685.9&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;System Call Overhead                          15000.0     276956.8    184.6&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                                                   ========&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;System Benchmarks Index Score                                         413.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Benchmark Run: Fri Jul 03 2020 15:32:03 - 15:59:55&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;4 CPUs in system; running 4 parallel copies of tests&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Dhrystone 2 using register variables       40160712.8 lps   (10.0 s, 7 samples)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Double-Precision Whetstone                     9531.8 MWIPS (9.5 s, 7 samples)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Execl Throughput                               4203.8 lps   (30.0 s, 2 samples)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;File Copy 1024 bufsize 2000 maxblocks        288344.1 KBps  (30.0 s, 2 samples)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;File Copy 256 bufsize 500 maxblocks           85784.9 KBps  (30.0 s, 2 samples)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;File Copy 4096 bufsize 8000 maxblocks        707436.9 KBps  (30.0 s, 2 samples)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Pipe Throughput                             1255488.7 lps   (10.0 s, 7 samples)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Pipe-based Context Switching                 196997.0 lps   (10.0 s, 7 samples)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Process Creation                               7350.2 lps   (30.0 s, 2 samples)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Shell Scripts (1 concurrent)                   8076.0 lpm   (60.0 s, 2 samples)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Shell Scripts (8 concurrent)                   1090.8 lpm   (60.1 s, 2 samples)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;System Call Overhead                        1070133.2 lps   (10.0 s, 7 samples)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;System Benchmarks Index Values               BASELINE       RESULT    INDEX&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Dhrystone 2 using register variables         116700.0   40160712.8   3441.4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Double-Precision Whetstone                       55.0       9531.8   1733.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Execl Throughput                                 43.0       4203.8    977.6&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;File Copy 1024 bufsize 2000 maxblocks          3960.0     288344.1    728.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;File Copy 256 bufsize 500 maxblocks            1655.0      85784.9    518.3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;File Copy 4096 bufsize 8000 maxblocks          5800.0     707436.9   1219.7&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Pipe Throughput                               12440.0    1255488.7   1009.2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Pipe-based Context Switching                   4000.0     196997.0    492.5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Process Creation                                126.0       7350.2    583.3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Shell Scripts (1 concurrent)                     42.4       8076.0   1904.7&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Shell Scripts (8 concurrent)                      6.0       1090.8   1818.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;System Call Overhead                          15000.0    1070133.2    713.4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                                                   ========&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;System Benchmarks Index Score                                        1056.0&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;fio-1&quot;&gt;fio&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;txt&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;$ fio sequential_read.fio&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;sequential_read: (g=0): rw=read, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;fio-3.12&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Starting 1 process&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Jobs: 1 (f=1): [R(1)][100.0%][r=11.5MiB/s][r=2938 IOPS][eta 00m:00s]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;sequential_read: (groupid=0, jobs=1): err= 0: pid=2885: Fri Jul  3 17:40:44 2020&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  read: IOPS=2980, BW=11.6MiB/s (12.2MB/s)(1024MiB/87960msec)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    slat (usec): min=33, max=171, avg=64.53, stdev=12.05&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    clat (usec): min=173, max=20162, avg=260.20, stdev=42.60&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     lat (usec): min=245, max=20201, avg=326.99, stdev=46.23&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    clat percentiles (usec):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     |  1.00th=[  229],  5.00th=[  241], 10.00th=[  245], 20.00th=[  249],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     | 30.00th=[  253], 40.00th=[  258], 50.00th=[  262], 60.00th=[  265],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     | 70.00th=[  269], 80.00th=[  269], 90.00th=[  281], 95.00th=[  281],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     | 99.00th=[  285], 99.50th=[  293], 99.90th=[  326], 99.95th=[  334],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     | 99.99th=[  355]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   bw (  KiB/s): min=11272, max=14344, per=100.00%, avg=11920.73, stdev=485.76, samples=175&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   iops        : min= 2818, max= 3586, avg=2980.18, stdev=121.44, samples=175&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  lat (usec)   : 250=21.51%, 500=78.48%, 750=0.01%&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  lat (msec)   : 2=0.01%, 4=0.01%, 10=0.01%, 50=0.01%&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  cpu          : usr=4.45%, sys=14.76%, ctx=524478, majf=0, minf=23&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, &amp;gt;=64=0.0%&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, &amp;gt;=64=0.0%&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, &amp;gt;=64=0.0%&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     issued rwts: total=262144,0,0,0 short=0,0,0,0 dropped=0,0,0,0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     latency   : target=0, window=0, percentile=100.00%, depth=1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Run status group 0 (all jobs):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   READ: bw=11.6MiB/s (12.2MB/s), 11.6MiB/s-11.6MiB/s (12.2MB/s-12.2MB/s), io=1024MiB (1074MB), run=87960-87960msec&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Disk stats (read/write):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  mmcblk0: ios=261954/17, merge=0/4, ticks=77219/147, in_queue=76448, util=86.89%&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;$ fio sequential_write.fio&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;sequential_write: (g=0): rw=write, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;fio-3.12&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Starting 1 process&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Jobs: 1 (f=1): [W(1)][100.0%][w=2530KiB/s][w=632 IOPS][eta 00m:00s]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;sequential_write: (groupid=0, jobs=1): err= 0: pid=2906: Fri Jul  3 17:47:38 2020&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  write: IOPS=643, BW=2573KiB/s (2635kB/s)(1024MiB/407490msec); 0 zone resets&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    slat (usec): min=41, max=3885, avg=90.60, stdev=12.75&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    clat (usec): min=234, max=30675, avg=1450.39, stdev=687.41&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     lat (usec): min=706, max=30723, avg=1543.73, stdev=688.03&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    clat percentiles (usec):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     |  1.00th=[  701],  5.00th=[  775], 10.00th=[  791], 20.00th=[  857],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     | 30.00th=[  947], 40.00th=[ 1270], 50.00th=[ 1336], 60.00th=[ 1418],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     | 70.00th=[ 1811], 80.00th=[ 1876], 90.00th=[ 1909], 95.00th=[ 1975],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     | 99.00th=[ 3884], 99.50th=[ 3884], 99.90th=[ 3949], 99.95th=[ 7570],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     | 99.99th=[12649]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   bw (  KiB/s): min= 2480, max= 3616, per=100.00%, avg=2573.18, stdev=128.26, samples=814&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   iops        : min=  620, max=  904, avg=643.29, stdev=32.06, samples=814&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  lat (usec)   : 250=0.01%, 750=3.62%, 1000=26.62%&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  lat (msec)   : 2=65.39%, 4=4.28%, 10=0.05%, 20=0.04%, 50=0.01%&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  cpu          : usr=1.30%, sys=4.11%, ctx=525790, majf=0, minf=26&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, &amp;gt;=64=0.0%&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, &amp;gt;=64=0.0%&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, &amp;gt;=64=0.0%&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     issued rwts: total=0,262144,0,0 short=0,0,0,0 dropped=0,0,0,0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     latency   : target=0, window=0, percentile=100.00%, depth=1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Run status group 0 (all jobs):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  WRITE: bw=2573KiB/s (2635kB/s), 2573KiB/s-2573KiB/s (2635kB/s-2635kB/s), io=1024MiB (1074MB), run=407490-407490msec&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Disk stats (read/write):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  mmcblk0: ios=0/262249, merge=0/81, ticks=0/392373, in_queue=388416, util=95.27%&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;$ fio random_read.fio&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;random_read: (g=0): rw=randread, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;fio-3.12&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Starting 1 process&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Jobs: 1 (f=0): [f(1)][100.0%][r=9849KiB/s][r=2462 IOPS][eta 00m:00s]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;random_read: (groupid=0, jobs=1): err= 0: pid=2948: Fri Jul  3 17:50:27 2020&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  read: IOPS=2453, BW=9813KiB/s (10.0MB/s)(1024MiB/106851msec)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    slat (usec): min=36, max=451, avg=70.23, stdev=11.65&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    clat (usec): min=132, max=1188, avg=324.00, stdev=13.82&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     lat (usec): min=245, max=1429, avg=396.66, stdev=22.00&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    clat percentiles (usec):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     |  1.00th=[  289],  5.00th=[  302], 10.00th=[  310], 20.00th=[  314],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     | 30.00th=[  318], 40.00th=[  322], 50.00th=[  326], 60.00th=[  326],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     | 70.00th=[  330], 80.00th=[  338], 90.00th=[  343], 95.00th=[  343],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     | 99.00th=[  347], 99.50th=[  351], 99.90th=[  371], 99.95th=[  383],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     | 99.99th=[  424]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   bw (  KiB/s): min= 9516, max=11528, per=99.96%, avg=9808.85, stdev=357.16, samples=213&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   iops        : min= 2379, max= 2882, avg=2452.24, stdev=89.29, samples=213&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  lat (usec)   : 250=0.11%, 500=99.89%, 750=0.01%, 1000=0.01%&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  lat (msec)   : 2=0.01%&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  cpu          : usr=4.29%, sys=13.33%, ctx=524445, majf=0, minf=22&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, &amp;gt;=64=0.0%&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, &amp;gt;=64=0.0%&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, &amp;gt;=64=0.0%&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     issued rwts: total=262144,0,0,0 short=0,0,0,0 dropped=0,0,0,0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     latency   : target=0, window=0, percentile=100.00%, depth=1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Run status group 0 (all jobs):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   READ: bw=9813KiB/s (10.0MB/s), 9813KiB/s-9813KiB/s (10.0MB/s-10.0MB/s), io=1024MiB (1074MB), run=106851-106851msec&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Disk stats (read/write):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  mmcblk0: ios=261589/0, merge=0/0, ticks=94558/0, in_queue=91684, util=85.93%&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;$ fio random_write.fio&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;random_write: (g=0): rw=randwrite, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;fio-3.12&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Starting 1 process&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Jobs: 1 (f=1): [w(1)][100.0%][w=2574KiB/s][w=643 IOPS][eta 00m:00s]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;random_write: (groupid=0, jobs=1): err= 0: pid=2952: Fri Jul  3 17:57:46 2020&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  write: IOPS=632, BW=2530KiB/s (2591kB/s)(1024MiB/414491msec); 0 zone resets&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    slat (usec): min=41, max=4332, avg=91.16, stdev=15.87&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    clat (usec): min=579, max=88041, avg=1474.56, stdev=1151.84&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     lat (usec): min=707, max=88136, avg=1568.45, stdev=1152.45&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    clat percentiles (usec):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     |  1.00th=[  701],  5.00th=[  775], 10.00th=[  791], 20.00th=[  857],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     | 30.00th=[  963], 40.00th=[ 1270], 50.00th=[ 1336], 60.00th=[ 1418],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     | 70.00th=[ 1811], 80.00th=[ 1876], 90.00th=[ 1909], 95.00th=[ 1975],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     | 99.00th=[ 3884], 99.50th=[ 3884], 99.90th=[11469], 99.95th=[30802],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     | 99.99th=[32375]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   bw (  KiB/s): min= 2096, max= 3576, per=100.00%, avg=2529.50, stdev=147.52, samples=828&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   iops        : min=  524, max=  894, avg=632.35, stdev=36.88, samples=828&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  lat (usec)   : 750=3.66%, 1000=26.42%&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  lat (msec)   : 2=65.52%, 4=4.25%, 10=0.02%, 20=0.05%, 50=0.07%&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  lat (msec)   : 100=0.01%&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  cpu          : usr=1.35%, sys=4.12%, ctx=525780, majf=0, minf=21&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, &amp;gt;=64=0.0%&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, &amp;gt;=64=0.0%&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, &amp;gt;=64=0.0%&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     issued rwts: total=0,262144,0,0 short=0,0,0,0 dropped=0,0,0,0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     latency   : target=0, window=0, percentile=100.00%, depth=1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Run status group 0 (all jobs):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  WRITE: bw=2530KiB/s (2591kB/s), 2530KiB/s-2530KiB/s (2591kB/s-2591kB/s), io=1024MiB (1074MB), run=414491-414491msec&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Disk stats (read/write):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  mmcblk0: ios=0/262251, merge=0/83, ticks=0/398727, in_queue=393828, util=94.97%&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;section data-footnotes class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.nownabe.com/2020/06/28/home-kubernetes-1/#%E6%9D%90%E6%96%99&quot;&gt;おうちKubernetes構築日記その1 Raspberry Pi編 - nownab.log&lt;/a&gt; &lt;a href=&quot;#user-content-fnref-1&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content:encoded><category>Raspberry Pi</category><category>Raspberry Pi 3</category><category>Raspberry Pi 4</category><category>benchmark</category><category>UnixBench</category><category>fio</category></item></channel></rss>