<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://blog.satotaichi.info/</id>
    <title>さにあらず Blog</title>
    <updated>2025-12-14T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://blog.satotaichi.info/"/>
    <subtitle>さにあらず Blog</subtitle>
    <icon>https://blog.satotaichi.info/images/favicon.ico</icon>
    <rights>Copyright © 2025 sato taichi.</rights>
    <entry>
        <title type="html"><![CDATA[アイスの棒と体重管理]]></title>
        <id>https://blog.satotaichi.info/dapper-stick-chewer/</id>
        <link href="https://blog.satotaichi.info/dapper-stick-chewer/"/>
        <updated>2025-12-14T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[このエントリーは pyspa Advent Calendar 2025 の 14 日目の記事である。]]></summary>
        <content type="html"><![CDATA[<p>このエントリーは&nbsp;<a href="https://adventar.org/calendars/11686" target="_blank" rel="noopener noreferrer">pyspa Advent Calendar 2025</a>&nbsp;の 14 日目の記事である。</p>
<p>昨日は @kuenishi の「<a href="https://kuenishi.hatenadiary.jp/entry/2025/12/13/230215" target="_blank" rel="noopener noreferrer">RustのプロジェクトでDockerfileを書かなくてもよくする話 - kuenishi's blog</a>」だ。</p>
<p>今年もアドベントカレンダーの時期がやってきた。</p>
<p>最近は、仕事と趣味が高度に一体化してしまったせいで、大きな熱量を割いてやってる活動についてこっちに書くことがない。</p>
<p>という訳で、それほど熱量がある訳ではないけど、まぁまぁやっていってる事をダラダラ書いていく。</p>
<p>今日のお題は中年男性による体重管理の話だ。</p>
<p>体重管理を突き詰めれば摂取してる栄養と、生活で消費される栄養を合算して余りがあれば増えていくという話になる。</p>
<p>とはいえ、旨いものや気持ちいいものを自由に食いたいし、辛いトレーニングの果てに基礎代謝を向上するなんてのは、やりたくない。</p>
<p>このエントリでは、そういう生活の合間に捻りだしたちょっとしたノウハウを皆さんに共有する。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="食欲は本当に食欲か問題">食欲は本当に食欲か問題<a href="https://blog.satotaichi.info/dapper-stick-chewer/#%E9%A3%9F%E6%AC%B2%E3%81%AF%E6%9C%AC%E5%BD%93%E3%81%AB%E9%A3%9F%E6%AC%B2%E3%81%8B%E5%95%8F%E9%A1%8C" class="hash-link" aria-label="食欲は本当に食欲か問題 への直接リンク" title="食欲は本当に食欲か問題 への直接リ�ンク">​</a></h2>
<p>新型コロナ以来在宅ワークが一般化したが、皆さんは日々仕事をしながら、どんなものを口に入れているだろうか。</p>
<p>お茶や水、栄養ドリンクのような飲料。タバコやガムといった嗜好品。ちょっとしたお菓子のようなもの。</p>
<p>まぁ、色んなものを飲み食いしているでしょう。私も例に漏れず仕事をしながら色んなものを口に入れている。</p>
<p>昼夜を問わずに働きまくっていると生活サイクルがグダグダになってしまう。</p>
<p>生活サイクルとは、いつ起きて、いつ寝るのか？いつ食事をして、いつ排せつするのか？いつ風呂に入るのか？みたいな事だ。</p>
<p>色んな事の境界が曖昧になっていく過程で私が遭遇したのは、何か食っているけども、これは一体どういう活動なのか分からない、という状態だ。</p>
<p>要は腹が減ってるからメシを食っているのか、休憩としておやつを食べているのか、喉が渇いているからお茶を飲んでいるのか、よく分からない状態になっていた。</p>
<p>結果として体重が数年で激増し、174cm・78kgの運動不足中年が爆誕し健康診断で警告されることになる。</p>
<p>健康に長生きしたいとは思っているので、あまりきつくない方法で状況を改善しようという話になるわけだ。</p>
<p>という訳で、まずは仕事の合間を縫って自分と向き合う事から始めた。</p>
<p>まず、私は日常生活に困っていないとはいえ軽度の多動症があり、集中力が散漫になり易い。それを自律的にコントロールするために、意図的に意識を分散させるという事をやっている。</p>
<p>要は、一つの事、例えば仕事だけに意識の全てを向けることは出来ないので、足をバタバタしたりだとか、音楽を鳴らしたりだとか、何か食べたりだとかして、意識の一部を遊ばせているのだ。</p>
<p>特に何か口にものを入れておくというのは、本来向き合うべきことから大きく意識をそらさずに、一定量意識を逸らす習慣として極めて効率がいい。</p>
<p>20代の頃は、これが喫煙習慣だったが既に喫煙習慣は完全に失われている。もう一度煙草を吸い始めるというのも、出来れば避けたいという気持ちがある。</p>
<p>仕事中に何かずっと飲み食いし続けているのは、栄養が欲しい訳では無くて、この多動症への対処を行っているのではないか？</p>
<p>という仮説を元に、この1，2年は口に入れるものを徐々に栄養の無いものに置き換えて、仕事のパフォーマンスが低減するかどうかを観察してきた。</p>
<p>ソフトウェアエンジニアという仕事は、基本的に頭脳労働ではあるので、糖質を制限し過ぎると成果の出る量が低減する。なので、何でもかんでもやめればいい、という話ではない。</p>
<p>少なくとも、今の私は仕事のパフォーマンスを著しく劣後してでも、体重減少すべきであるという状況にはない。</p>
<p>単に継続的な体重の上昇が止まればよくて、毎月数百グラム程度ずつ減少傾向にあるなら、それは望ましい状態である。それよりも劇的な変化は求めていないのだ。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="欲望を代替するものたち">欲望を代替するものたち<a href="https://blog.satotaichi.info/dapper-stick-chewer/#%E6%AC%B2%E6%9C%9B%E3%82%92%E4%BB%A3%E6%9B%BF%E3%81%99%E3%82%8B%E3%82%82%E3%81%AE%E3%81%9F%E3%81%A1" class="hash-link" aria-label="欲望を代替するものたち への直接リンク" title="欲望を代替するものたち への直接リンク">​</a></h2>
<p>突然だが、私は醤油味を基調とした揚げ物であり、ある程度の歯ごたえがある<a href="https://www.e-amanoya.co.jp/kabukiage/" target="_blank" rel="noopener noreferrer">歌舞伎揚げ</a>とコカ・コーラが滅茶苦茶好きだ。</p>
<p>この二つの組合せの味や食感に加えて、若いころの過酷な労働において、これらが傍らにあったという成功体験が組み合わさり自分にとって特別な組み合わせになっている。</p>
<p>二つを取り揃えて並べると、自然と集中力が高まりいわゆるゾーンに入り易くなるのだ。BGMとしては、<a href="https://www.symphonyx.com/site/release/symphony-x/" target="_blank" rel="noopener noreferrer">Symphony X</a>をかけると更にいい。</p>
<p>ただ、今の職場にそんな過酷さがあるかと言われれば、そんなことは全くない。単に自分の過去の成功体験のうち苦しかった部分が曖昧になったり忘れたりして、良かったことだけを美化しているに過ぎない。</p>
<p>という訳で、これらを自分の中で特別なものとして意識することから始めた。コーラについては、既に別な理由で普段の生活からは遠ざけていたので、歌舞伎揚げを漫然と買うのをやめた。</p>
<p>一方で、自分が歌舞伎揚げに求めていたものが何かを探るために、要素分解して口に入れるようにしてみた。</p>
<p>例えば、「揚げ物」であることは重要なのかを確認するために、都昆布のようにある程度塩味と旨味は強いが脂の無いものを食べてみる、などだ。</p>
<p>毎日、根を詰めて考えていたわけではないけども、スーパーでおやつを買う際の指標として、少しずつ要素の欠けているものを選んでいく、という事をやっていった。</p>
<p>こういう時に、よく採用されるのがキシリトール入りのガムではあるけども、これは本当にうまくいかなかった。</p>
<p>キシリトール入りのガムは一日に数粒噛むくらいなら全く問題の無いものではあるけども、私の場合はボトル一つを一日で消費するようなペースでずっと噛み続けることになってしまった。</p>
<p>その結果、腹を下し易くなったので、ガムをかむのはやめた。</p>
<p>噛んでいるうちにかたくなっていく歯磨きガムを試していた時期もあったけども、一日の終わりに噛み過ぎて顎が痛くなるという事が頻発したのでこれもやめた。</p>
<p>何かを口に入れっぱなしにするという観点で考えると、乳幼児向けのおしゃぶりも良さそうに思えた。</p>
<p>しかし、これは毎日熱湯消毒する前提で使われている以上、衛生的に使い続ける事が難しいので候補から外れていった。</p>
<p>徐々に詰めていく中で、要は脂質と塩分は特に重要ではないという結論に至り、そうこうしているうちにアイスキャンディーがかなり良いのではないか、ということに気が付いた。</p>
<p>アイスキャンディーを要素分解すると、氷と砂糖と香料と棒だ。まず、一日中食べ続けるものとして氷はキシリトール入りのガムと同じ理由で望ましくない。</p>
<p>残ったうちの砂糖と香料が良いのかを試すために、一回分ずつ個包装されたかき氷シロップを水に溶かして飲んでみたりもした。これは悪くないがよくも無かった。</p>
<p>必然的に、最後に残るのは棒だ。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="たどり着いた答え">たどり着いた答え<a href="https://blog.satotaichi.info/dapper-stick-chewer/#%E3%81%9F%E3%81%A9%E3%82%8A%E7%9D%80%E3%81%84%E3%81%9F%E7%AD%94%E3%81%88" class="hash-link" aria-label="たどり着いた答え への直接リンク" title="たどり着いた答え への直接リンク">​</a></h2>
<p>製菓材料として販売されているアイスの棒は、当然ながら口の中に入れて問題ないものとして生産されている。</p>
<p>一方で、木製のアイスの棒は割りばしと同じで基本的には使い捨てされる想定のものだ。よって衛生面も問題ない。</p>
<p>気が付いたのは、夏だったのでコンビニやスーパーで買うアイスを買った時には、その棒まで丁寧に味わうようにしていった。</p>
<p>結論として、コンビニで買える<a href="https://parm-ice.jp/" target="_blank" rel="noopener noreferrer">パルム</a>の棒が自分にとってはベストなアイスの棒であることが分かった。スーパーで買える箱に入った個包装のパルムは、少し小さすぎる。</p>
<p>そう考えて探してみると、アイスの棒はAmazonやヨドバシなど、様々な場所で製菓材料として購入できるのだ。</p>
<p>面白いので、ネットで買えるアイスの棒を次々と購入しては試食してみた。</p>
<p>まず、アイスの棒には食べて良いものとそうでないものがある。食べてはいけないアイスの棒というのは、工作用の部材として売っているものだ。</p>
<p>「クラフトスティック」「DIY材料」などと名前の一部に工作を想起する名前付けられているものは、アイスの棒状であるというだけで、食べる事を想定していないものた。</p>
<p>これは、口に入れると大変に不快で刺激の強い味がするので、恐らく本当に食べてはいけない。</p>
<p>次に、アイスの棒といっても、品質は様々であるということだ。材料として使われている木材も様々であるし、面取り加工の精度も大きく違う。</p>
<p>竹や松などの材料で作られている事が多いようだが、恐らく白樺が最高級品である。</p>
<p>この話を会社の若い子にしたところ、彼から衝撃の質問が飛び出してきた「舌圧子って知ってます？」。その時は勿論、知らなかった。</p>
<p>舌圧子とは、例えば耳鼻咽喉科などで医者が喉の検査をする際に、患者の舌を抑えるために使われる棒状の器具だ。確かに、使われたことはある。名前は知らなかった。</p>
<p>舌圧子も、アスクルやモノタロウなどで簡単に購入できる。そして、大抵の舌圧子は医療用なので加工品質が極めて高い。加えて個包装されているケースが大半だし、材料は白樺が多い。</p>
<p>空前の舌圧子ブームがやってきて、手軽に買えるものをいくつか買って試してみた所、多くの舌圧子が少し長すぎるのと幅が広すぎることが分かった。</p>
<p>当然と言えば、当然なのだけども、舌圧子は医者が検査に使う道具なので、一人が口に入れっぱなしにするために使う訳では無いのだ。子ども用の舌圧子は、大人用よりも相対的に短いのだけども、それでも長すぎる。</p>
<p>具体的には、私が普段使っているアイスの棒は、幅9mmで長さ93mm、厚さが1.9mm弱だが、舌圧子は子供用でも幅が14mmで長さが140mm、厚さが1.6mm程度はある。</p>
<p>要は、舌圧子は長すぎる上に幅広で取り回しづらく、薄いので食べ応えがないということだ。なお、パルムの棒は厚さが2mm以上あるので直感的に厚みを感じられる。</p>
<h1>まとめ</h1>
<p>長くなってきたので、話を強制的に終わりにするが、今私が継続的に食べて？いるアイスの棒は松尾物産の<a href="https://www.amazon.co.jp/dp/B001UJNYXU" target="_blank" rel="noopener noreferrer">木製 アイススティック棒 (50本束) 93mm 0836-0901</a>だ。</p>
<p>色々試してみたが、簡単に買えるアイスの棒としては、これが今の所ベストである。もし、より良いものをご存じの方がいたら教えて欲しい。</p>
<p>ちなみに、いくつか試した中で唯一リピートした舌圧子は、<a href="https://www.amazon.co.jp/dp/B0CXCJ2ZHZ" target="_blank" rel="noopener noreferrer">OO Osaki(オオサキ) SF滅菌オオサキ舌圧子こども用1本入(100袋) 一般医療機器 74307</a>である。</p>
<p>これは、白樺材で作られているため、ごくわずかに甘みがあり旨い。炭酸水にある特有の苦みを日常的に経験していると、白樺材の甘みを感じられるようになるだろう。</p>
<p>棒自体の加工も大変に素晴らしい。数百本は味わったと思うが、一度もささくれのようなエラー品が無い上に、少々のことではささくれないので安心してくわえていられる。</p>
<p>医療機器なので当然ながら個包装されており、衛生面でも問題ない。梱包に使っている箱の上部3割くらいがパカっと開いて、そのまま机の上に置きやすいのも使い易くて好感だ。</p>
<p>では、みなさま、よいお年を。</p>]]></content>
        <author>
            <name>Sato Taichi</name>
            <uri>https://github.com/taichi</uri>
        </author>
        <category label="opinion" term="opinion"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Reactアプリケーション向けUIコンポーネントライブラリを比較検討する]]></title>
        <id>https://blog.satotaichi.info/compare-react-ui-components/</id>
        <link href="https://blog.satotaichi.info/compare-react-ui-components/"/>
        <updated>2025-04-20T23:11:06.000Z</updated>
        <summary type="html"><![CDATA[僕の利用形態としては、React Aria + Tailwind が最も妥当性が高いということになった。]]></summary>
        <content type="html"><![CDATA[<p>僕の利用形態としては、<strong>React Aria + Tailwind</strong> が最も妥当性が高いということになった。</p>
<p>という話を、ここから延々と説明する。何の話をするのかわかる人や結論だけ欲しい人向けの情報は、これ以降何も存在しないので、どうぞよしなに。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="はじめに">はじめに<a href="https://blog.satotaichi.info/compare-react-ui-components/#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB" class="hash-link" aria-label="はじめに への直接リンク" title="はじめに への直接リンク">​</a></h2>
<p>久しぶりにフロントエンド仕事をしようと思って、手元のテンプレートリポジトリを見たら、何もかもが時代遅れになっており大変につらい気持ちになったのがつい先月のことだ。</p>
<p>やれやれだが全部を選びなおすってのも、まぁ悪くないよなって考えた自分がいかに甘かったか、このエントリでは出来る限り説明していく。</p>
<p>なんのためかって？未来の自分のためだ。将来の自分から見て現在の自分がどのくらいの能力だったのかというのを、きちんと記録しておくことには重要な意味がある。</p>
<p>そして、この記録を有識者の皆さんに御覧頂くことで、何か有益な指摘をもらえるかもしれない、という微かな希望もある。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="議論の範囲と要件">議論の範囲と要件<a href="https://blog.satotaichi.info/compare-react-ui-components/#%E8%AD%B0%E8%AB%96%E3%81%AE%E7%AF%84%E5%9B%B2%E3%81%A8%E8%A6%81%E4%BB%B6" class="hash-link" aria-label="議論の範囲と要件 への直接リンク" title="議論の範囲と要件 への直接リンク">​</a></h2>
<p>まずフロントエンドアーキテクチャ全体を少ない時間で議論するのはもう無理だ。知識範囲が広くなりすぎてて全く追い切れる気がしない。アプリケーションが動作するためには、サーバサイドだってクラウドインフラだってあるのに、ユーザに接するフロントエンドにかけられる時間は、それほど多くはない。というわけで、今回はUIコンポーネントライブラリについてのみ議論することとする。それだって広すぎる。</p>
<p>また、基盤となるライブラリはReactのみとする。AngularやVue3、Svelteあたりは良いものだと思うが、いかんせん僕が知らなすぎる。そして、そのレイヤーからやり直すのはつらい。よってReactに特化したAPI構造をしていることは必須だ。色んなフレームワークに対応するための抽象化レイヤーなんてものは百害あって一利なし。</p>
<p>次に、CSSは自由にあてたいし、DOMの構造はいじりたい。要はスタイルをちょっと変な弄り方したいだとか、コンポーネントの一部にちょっとした機能追加したいだとか、そういうことのためにコンポーネントを丸っとコピペして作り直すみたいな事はやりたくないってこと。</p>
<p>そして、モバイル対応はしなくてもいいけども、ウェブアクセシビリティは確保したい。言い換えるとWAI-ARIAへの対応をできる限り少ない工数で実現したい。世の中に出回ってるスクリーンリーダーで読み上げして貰い易いようなDOMを作ってくれると良いんだけども、そんなことは可能なんだろうかね。</p>
<p>何でこんなことを言い出してるかって？そろそろ老眼がきつくなってきて、目が自在に見えるって事が当たり前じゃなくなってきてるんでね。僕が抱える体調不良の大きな原因の一つは眼精疲労によるものだ。音声だけでアプリケーションを操作できたら目を休ませられるかもしれない。それで、頭痛や肩こりを少しでも低減したい。その延長で色の違いが少々分からんかったり、視野が欠けても使えるようなアプリケーションが増えたらいいよね。</p>
<p>キーボードやマウスだけでなくタッチパネルみたいなデバイスに対応する際にもガイドになるような機能が用意されていると加点だね。今はまだキーボードやマウスを使えているけども、段々怪しくなってきてるんだよね。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="評価対象となる要素技術の洗い出し">評価対象となる要素技術の洗い出し<a href="https://blog.satotaichi.info/compare-react-ui-components/#%E8%A9%95%E4%BE%A1%E5%AF%BE%E8%B1%A1%E3%81%A8%E3%81%AA%E3%82%8B%E8%A6%81%E7%B4%A0%E6%8A%80%E8%A1%93%E3%81%AE%E6%B4%97%E3%81%84%E5%87%BA%E3%81%97" class="hash-link" aria-label="評価対象となる要素技術の洗い出し への直接リンク" title="評価対象となる要素技術の洗い出し への直接リンク">​</a></h2>
<p>Reactを前提に、CSSを自由にあてたいって時点でヘッドレスコンポーネントライブラリを選択することになる。その上でWAI-ARIAに対応するってなると選択肢は大きく絞り込まれる。</p>
<p>具体的には、この3つしか見つけられなかった。</p>
<ul>
<li><a href="https://www.radix-ui.com/primitives/docs/overview/introduction" target="_blank" rel="noopener noreferrer">Radix Primitives</a>
<ul>
<li>Radix UIというスタイリング済コンポーネント集が存在している。それを実現するためのスタイリングされていないコンポーネントライブラリが独立して使えるようになっているもの。</li>
<li>スタイリング済のコンポーネントが使いたい場合は、<a href="https://www.radix-ui.com/themes/docs/overview/getting-started" target="_blank" rel="noopener noreferrer">Radix Themes</a>を使う。</li>
</ul>
</li>
<li><a href="https://react-spectrum.adobe.com/react-aria/index.html" target="_blank" rel="noopener noreferrer">React Aria</a> + <a href="https://react-spectrum.adobe.com/react-stately/index.html" target="_blank" rel="noopener noreferrer">React Stately</a>
<ul>
<li>Adobeが定義した<a href="https://spectrum.adobe.com/" target="_blank" rel="noopener noreferrer">Spectrum</a>というデザインシステムをReactで実装したものが<a href="https://react-spectrum.adobe.com/index.html" target="_blank" rel="noopener noreferrer">React Spectrum</a> だ。これには４つのライブラリが含まれている。<!-- -->
<ul>
<li>React Spectrum</li>
<li>React Aria</li>
<li>React Stately</li>
<li>Internationalized</li>
</ul>
</li>
<li>React Aria と React Stately はデザインシステムとは独立して利用できるHooksのライブラリだ。</li>
<li>React Ariaの中にはそのまま使えるコンポーネントライブラリとして React Aria Componentsが含まれている。</li>
</ul>
</li>
<li><a href="https://ariakit.org/" target="_blank" rel="noopener noreferrer">ariakit</a>
<ul>
<li>コンパクトなライブラリでコンポーネントの状態管理用HookはAPIとして分離されている。</li>
<li>OSS版はコンポーネント数が少ないように見えるが上位の有償版が存在する。</li>
</ul>
</li>
</ul>
<p>この手のライブラリを選ぶときには、外側にあるエコシステムを無視することはできない。</p>
<p>例えば、最近人気のツールとして <a href="https://ui.shadcn.com/" target="_blank" rel="noopener noreferrer">shadcn/ui</a> がある。こいつは、RadixとTailwindで作ったサンプルコードを自分のプロジェクト内にコピペしてくれるのだ。</p>
<p>Radixのドキュメントは、よく出来ていてTailwindでスタイリングしたコンポーネントのサンプルコードをパッとコピペできるようになっている。それを効率化しつつ、新しいコンポーネントを追加したり、AIでUIコンポーネントを作れる <a href="https://v0.dev/" target="_blank" rel="noopener noreferrer">v0</a> と連携できるようにしたものが shadcn/ui だ。</p>
<p>大変に興味深い事に shadcn/ui が提供するツールでReact AriaとTailwindを基盤にしたコンポーネントをコピペすることもできる。それが、<a href="https://www.jollyui.dev/" target="_blank" rel="noopener noreferrer">JollyUI</a> だ。</p>
<p>React AriaとTailwindを基盤にしたコンポーネントライブラリとしては、<a href="https://www.heroui.com/" target="_blank" rel="noopener noreferrer">Hero UI</a> もある。React AriaのCopomnent APIよりも更にパッケージングされているので、自由度は下がるがさっさと作れる。OSS版はコンポーネント数が少ないけども上位の有償版が存在する。網羅性を確保するために紹介したが、柔軟性が相対的に低い事が明らかなので、今回は検討しない。</p>
<p>何の細工もなしにCSSを書くってのは大変につらい。というわけでCSSのユーティリティとして、Tailwind CSS を検討する必要があるだろう。他にもCSS フレームワークが沢山ある事は何となく知っているが追いきれていない。</p>
<p>ここまでに出てきた要素技術を図示するとこうだ。</p>
<p><img decoding="async" loading="lazy" alt="ライブラリ相関図" src="https://blog.satotaichi.info/assets/images/libraries-c6a37404882fdef0aa944055a9ca8266.png" width="1182" height="552" class="img_ev3q"></p>
<p>様々な課題設定があり、それぞれに対応している範囲が違う。選定基準を明確にしなければ、どれを選んでも後悔することになるだろう。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="要素技術の詳細な検討">要素技術の詳細な検討<a href="https://blog.satotaichi.info/compare-react-ui-components/#%E8%A6%81%E7%B4%A0%E6%8A%80%E8%A1%93%E3%81%AE%E8%A9%B3%E7%B4%B0%E3%81%AA%E6%A4%9C%E8%A8%8E" class="hash-link" aria-label="要素技術の詳細な検討 への直接リンク" title="要素技術の詳細な検討 への直接リンク">​</a></h2>
<p>ここからは、列挙した要素技術について詳細に検討していこう。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="デザインシステムについて">デザインシステムについて<a href="https://blog.satotaichi.info/compare-react-ui-components/#%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6" class="hash-link" aria-label="デザインシステムについて への直接リンク" title="デザインシステムについて への直接リンク">​</a></h3>
<p>まず明確にしておかないといけないのは、僕はデザイナではないし、その素養もない。よってデザインシステムそのものの是非についての意見はない。</p>
<p>今回の選定対象の中に含まれているデザインシステムの実装は Radix ThemesとReact SpectrumとTailwind CSSだ。Tailwind CSSだけがちょっと特殊でデザインシステムを作るためのフレームワークにデフォルトのデザインシステムが最低限付いてる、みたいな理解をしている。</p>
<p>作られているドキュメントの内容や質という意味では、React Spectrumが優れているようには感じる。しかし、Radix Themesで提供されているドキュメントがあればアプリケーションを作るうえでは十分だ。</p>
<p>この数か月対話している生成AIの皆さんが上手く扱えるのはどうやらTailwindっぽいという、あまり根拠のない肌感覚みたいなものはある。生のままのCSSは、どうも思い通りに作ってくれないのよね。僕が持つ語彙が足りない可能性は大いにあるだろう。</p>
<p>というわけで、デザインシステムの選定を棚上げしたい自分としてはTailwindを使っておこうという判断になる。</p>
<p>後は一緒に仕事をすることになるデザイナーさんがTailwind慣れしていてくれることを祈るばかりだ。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="ヘッドレスコンポーネントライブラリの比較">ヘッドレスコンポーネントライブラリの比較<a href="https://blog.satotaichi.info/compare-react-ui-components/#%E3%83%98%E3%83%83%E3%83%89%E3%83%AC%E3%82%B9%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E6%AF%94%E8%BC%83" class="hash-link" aria-label="ヘッドレスコンポーネントライブラリの比較 への直接リンク" title="ヘッドレスコンポーネントライブラリの比較 への直接リンク">​</a></h3>
<p>３つのライブラリを比較検討するにあたって利用できるコンポーネントの数は、まず比較対象になるだろう。使わないものが沢山あってもしょうがないが、使いたいものが無いなら作るしかない以上、基本的には多い方がいい。</p>
<ul>
<li>Radix Primitives は28個</li>
<li>React Aria は45個</li>
<li>ariakit は17個</li>
</ul>
<p>Radix Primitivesの特徴は何と言っても<code>asChild</code> だろう。このプロパティを有効にすることで、子要素として指定したコンポーネントが代わりにレンダリングされる。これによって、可読性を維持したままコンポーネントの振る舞いを大きく切り替えられる。型のサポートもばっちりだ。詳細は公式のドキュメントを確認して欲しい。cf. <a href="https://www.radix-ui.com/primitives/docs/guides/composition" target="_blank" rel="noopener noreferrer">Composition</a></p>
<p>各コンポーネントの状態管理は、コンポーネントの内部にカプセル化されており、調整の余地はあまりない。これがRadixの分かり易さであり、融通の利かない部分でもある。</p>
<p>既存コンポーネントのDOM構造を弄りたくなっても、それはできないので<code>asChild</code> を使って置き換えるという事になる。</p>
<p><code>asChild</code> は、大変にクレバー仕組みだが、僕には動作が難しすぎると感じる。</p>
<p>React Ariaの特徴はガチムチなHookベースAPIだろう。何に難しさを感じるかは人によるだろうが、Reactを正しく理解しているなら、React Ariaは正しく理解できるはずだ。React Hooksがそもそも難しすぎるだろうという指摘については同意する。</p>
<p>UIコンポーネントとしての振る舞いを定義したHooksをパッケージングしてあるのがReact Ariaである。UIコンポーネントの状態を管理するHooksをパッケージングしてあるのがReact Statelyだ。</p>
<p>問題なのは、Hookだけそうやって提供されたからって画面には何も表示されないってことだ。それらをJSXに適用するのはライブラリの利用者側の責任ってわけだ。それはつまり、ボイラープレートコードが爆増することが予想される。そんな分かりやすい問題がほったらかされてる訳もなく、React Aria Componentsというライブラリが提供されている。これで最低限DOMとHookが統合されたUIコンポーネントが使える。</p>
<p>ariakitは有償のコンポーネントがあるのであまりフェアな比較ではないけども、買ったからといって、それほど大きな差が発生するようには思えない。利用する状況が限定されている複雑なコンポーネントが多くでも使いようがないわけだし。金を払う前にどんなコンポーネントがあるのか確認できなかったので評価し辛い。</p>
<p>それほど大きな話ではないけども、ariakitはServer Side Renderingに対応しているかどうかについて言及が無かったのも残念。この時点でariakitを選択することは無くなった。</p>
<p>というわけで、基本的にはReact Aria Componentsででき合いのコンポーネントを使いつつ、必要な場所ではHook APIを組み合わせて、より状況に強く依存したコンポーネントを作っていくのが良いだろうと結論した。</p>
<p>React の Hooksについては、随分前に時間をかけて学習したので新しく覚えることは少ない。Radixの<code>asChild</code> が、どういう動作なのかは、少し調べてみたが正確には分からなかった。能力不足だと言われれば、残念だが否定しようがない。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="コピペツールの是非について">コピペツールの是非について<a href="https://blog.satotaichi.info/compare-react-ui-components/#%E3%82%B3%E3%83%94%E3%83%9A%E3%83%84%E3%83%BC%E3%83%AB%E3%81%AE%E6%98%AF%E9%9D%9E%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6" class="hash-link" aria-label="コピペツールの是非について への直接リンク" title="コピペツールの是非について への直接リンク">​</a></h3>
<p>shadcn/ui は大変に良いツールだ。UIコンポーネントライブラリが持つ根本的な課題を解決している。それは何かというとカスタマイズ性だ。こに対処するための根本的解決手段として、UIコンポーネントを提供するのではなく、コピペを効率よく実施するための手段を提供する。これは、かなりクレバーなアプローチと言える。</p>
<p>どうせカスタマイズのために、元のコードベースをコピペして必要な場所を変えて動かすことになるんだから、最初っからそうすればいいってこと。</p>
<p>これによって、画面の構成部品を作るという事に対する生産性は明確に向上する。コマンド一発で各コンポーネントがローカルディレクトリにバンバンコピペされるんだから、時間当たりの生産されるコード行数は目に見えて増える。なんてこったい、これはマジで最高だな。</p>
<p>だが、ちょっと待ってほしい。5個10個とコンポーネントをローカルにコピペしてるうちに気が付くことがある。これらは、どうやってメンテナンスするんだろか？見た目良い感じに動いてはいる。後の事は、後の人が何とかするっしょ。基盤部分はRadixなんだから最低限の品質は担保されてるさ。起きてもいない問題を解決しようとするべきでない。そういう考え方ができるならOK。v0でコンポーネントを作りまくろう。</p>
<p>残念ながら、僕はそういう風には考えない。基本的な振る舞いを確認するためのユニットテストすら付いてこないものを、正しく動作しているって自信を持って言えるほどの蛮勇はどっかに置いてきてしまった。これが老いってやつだ。細かいことが気になってしょうがない。</p>
<p>基盤はRadixだっていうけど、なんか気が付いたらTanStack Tableが依存性に入ってる、いつ入ったんだ？おいおい、話が違うじゃねぇか。いや、TanStack Tableは良いライブラリだよ。そこに疑問は無い。でもよ、知らんうちに入り込んでるのは違うんじゃねぇかな。これからも知らんものが知らうちに入ってくるのか？ローカルにコードがあるんだから、それは利用者側の自己責任ですってわけだ。勘弁してくれ。</p>
<p>コンポネントに何か脆弱性があっても、それに一々対処するには、ライブラリのアップデートじゃ済まなくて、自己責任でコピペしたものを逐一全部確認して回る必要があるってことね。きつすぎる。</p>
<p>コピペされてくるコンポーネントがpath aliasを前提にimportしてんのも大分気にいらない。こいつがいるだけで、開発環境のセットアップがとてつもなく複雑になる。import文の煩雑さをちょっと低減するというリターンに対して、path aliasがもたらすリスクは許容限界を超えてると個人的には感じる。</p>
<p>JavaScript界隈のモジュール名を解決するロジックは歴史的経緯によってアホほど複雑だ。tscみたいなコンパイラとESLintみたいなLinterとwebpackみたいなモジュールバンドラが、整合性をもってモジュール名を解決できるようプロジェクトを構成するには、とんでもない慎重さが求められる。</p>
<p>なんかよく分からんプラグインをあっちこっちに入れたり、設定を書いたり、処理順を正しくしたりする。一度動いてしまえば、何度でも動くようになるけども、すぐに誰も触れない禁断の領域になる。そして、使ってるツールをアップデートするとよく分からんプラグインが不要になったり、設定のデフォルト値が変わったりする。プロジェクトが成長してきたのでディレクトリ構成を整理しなおしたいとか思っても、その魔界は許してくれないだろう。</p>
<p>というわけで、コピペツールの導入は見送り。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="まとめ">まとめ<a href="https://blog.satotaichi.info/compare-react-ui-components/#%E3%81%BE%E3%81%A8%E3%82%81" class="hash-link" aria-label="まとめ への直接リンク" title="まとめ への直接リンク">​</a></h2>
<p>最近のUIコンポーネントライブラリってのは、すげぇもんだね。どれもこれも立派に動く。色んな事を詳細に考えてきちんと作りこまれている。</p>
<p>僕が認識していないUIに関する課題ってのは、まだまだ沢山あるだろうし、それを解決するために作られたライブラリはもっと沢山あるだろう。</p>
<p>このエントリ内に何か見当違いな事を書いている可能性については特に否定しないので、気が付いた人はXか何かにシュッと書いてくれると非常にありがたい。テキトーにエントリのURL何かを付けといてくれれば、こっちからエゴサしとくんでよろしくお願いしますね。</p>
<p>この長文に付き合ってくれるような忍耐力のあるあなたに感謝をささげて、エントリの〆とします。</p>]]></content>
        <author>
            <name>Sato Taichi</name>
            <uri>https://github.com/taichi</uri>
        </author>
        <category label="frontend" term="frontend"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[技術者教育について]]></title>
        <id>https://blog.satotaichi.info/training_for_software_engineers/</id>
        <link href="https://blog.satotaichi.info/training_for_software_engineers/"/>
        <updated>2024-12-12T11:00:06.000Z</updated>
        <summary type="html"><![CDATA[これはpyspa アドベントカレンダー 2024の12日目の記事です。11日目は@aodagの走るということについてでした。]]></summary>
        <content type="html"><![CDATA[<p>これは<a href="https://adventar.org/calendars/10523" target="_blank" rel="noopener noreferrer">pyspa アドベントカレンダー 2024</a>の12日目の記事です。11日目は@aodagの<a href="https://aodag.dev/posts/2024-12-11-running/" target="_blank" rel="noopener noreferrer">走るということについて</a>でした。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="はじめに">はじめに<a href="https://blog.satotaichi.info/training_for_software_engineers/#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB" class="hash-link" aria-label="はじめに への直接リンク" title="はじめに への直接リンク">​</a></h2>
<p>この15年くらいは、おおむね平均すると毎年2，3人程度の技術者をOn the Job Training（OJT）で教育する機会に恵まれており、その中で蓄積した知見や私の考えを散発的に説明していきます。</p>
<p>私自身は受託開発を主たるビジネスとするシステムインテグレータ（SIer）と呼ばれる企業で働いており、足掛け25年程度のキャリアがありますがソフトウェアについて専門的な教育を受けたことはありません。また、教育についても同様です。</p>
<p>このエントリに記載された内容について何らかのエネルギーを注いでくれる方がいるなら、XあたりのSNSでURL付きで指摘して頂ければ非常にありがたいです。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="教育によって形成される技術者像">教育によって形成される技術者像<a href="https://blog.satotaichi.info/training_for_software_engineers/#%E6%95%99%E8%82%B2%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E5%BD%A2%E6%88%90%E3%81%95%E3%82%8C%E3%82%8B%E6%8A%80%E8%A1%93%E8%80%85%E5%83%8F" class="hash-link" aria-label="教育によって形成される技術者像 への直接リンク" title="教育によって形成される技術者像 への直接リンク">​</a></h2>
<p>まずは、どのような技術者なら育てられるのでしょうか。私の考えを述べます。</p>
<p>一番最初に明確にしておくことは、ここでの議論はソフトウェア技術者を中心としたものです。強電や弱電といった分類が妥当な技術者の話はしません。また、ソフトウェアが動作するために必要な種々のインフラは全て揃っている前提で考えます。利用者としてオペレーティングシステム（OS）を扱います。しかし、OS自体を作ったり修正することは考えません。</p>
<p>OSIモデルで言うとネットワーク層（L3）あたりが最もプリミティブなレイヤーだと考え、日常的にはほぼ意識しないものとします。基本的にはプレゼンテーション層（L6）を利用します。セッション層（L5）については、業務で利用するコマンドラインアプリケーションやライブラリが露出してくる範囲については理解するくらいの温度感です。</p>
<p>正直言って、楕円曲線暗号がそれ以前の暗号に比べて何故強固なのかを数学的な根拠を持って説明することは私自身もできません。最新のスゴイやつだから使っておく方がいいくらいの気持ちでいます。</p>
<p>ここまでを前提にソフトウェア技術者としての期待値を定性的な基準で説明してみましょう。私は技術者の能力を以下に列挙する5+1段階で捉えています。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="ほぼ素人">ほぼ素人<a href="https://blog.satotaichi.info/training_for_software_engineers/#%E3%81%BB%E3%81%BC%E7%B4%A0%E4%BA%BA" class="hash-link" aria-label="ほぼ素人 への直接リンク" title="ほぼ素人 への直接リンク">​</a></h3>
<p>基本的に最初はみなほぼ素人です。稀に大学でプログラミングをそれなりにやってきた新卒採用の若手がいますが、業務としてのソフトウェア技術者を経験している新卒は恐らく私が所属する企業には来ないのでしょう。遭遇したことがありません。</p>
<p>未経験で他業種から転職してくる方も、基本的にほぼ素人です。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="半人前">半人前<a href="https://blog.satotaichi.info/training_for_software_engineers/#%E5%8D%8A%E4%BA%BA%E5%89%8D" class="hash-link" aria-label="半人前 への直接リンク" title="半人前 への直接リンク">​</a></h3>
<p>プロジェクト内で利用するツール類に習熟し、参画しているプロジェクトが採用している開発プロセスに則って報告・連絡・相談を必要に応じてできる状態になっている人です。</p>
<p>業務で求められるドキュメントを記述したり、プログラミングについては他人の成果物をコピー＆ペーストしつつ手直しすることで作業を完了できることを期待します。</p>
<p>私の経験上は、受託開発の業界ではこのレベルの人が最も多いです。経験年数は余り関係ありません。１０年やってても半人前の人は沢山います。</p>
<p>それでも今までは生きてこれたのですから、いい仕事なのかもしれないですね。今後どうなっていくのかは分かりませんが、すぐに状況が大きく変わるとは思えません。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="一人前">一人前<a href="https://blog.satotaichi.info/training_for_software_engineers/#%E4%B8%80%E4%BA%BA%E5%89%8D" class="hash-link" aria-label="一人前 への直接リンク" title="一人前 への直接リンク">​</a></h3>
<p>プロジェクト内で利用するツール類に習熟した上で、開発プロセスに則って作業見積りと業務遂行が出来る人です。</p>
<p>必要に応じた詳細さのドキュメントをドキュメントテンプレートから書き起こすことや、多少のサンプルコードがあれば、ゼロからアプリケーションコードを書くことを期待できる人です。</p>
<p>私が教育を行うなら最初に目指すのが、この状態です。ほぼ素人が対象なら半年から１年程度。半人前からなら最短で３か月程度の期間で一人前のソフトウェア技術者に育てられます。</p>
<p>ただ、所属する企業の新卒採用プロセスは突破するのが非常に難しいため、基礎的な能力の高い方が多く採用されていることは付記しておきます。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="チームリード">チームリード<a href="https://blog.satotaichi.info/training_for_software_engineers/#%E3%83%81%E3%83%BC%E3%83%A0%E3%83%AA%E3%83%BC%E3%83%89" class="hash-link" aria-label="チームリード への直接リンク" title="チームリード への直接リンク">​</a></h3>
<p>一人前に働いた上で、他人の面倒をみられる状態になった人です。他のメンバーから相談を受けたり、チーム内にある細かな解決すべき課題に気が付くことも期待します。</p>
<p>ドキュメントテンプレートを作ったり、通常の業務とは別に開発環境や業務環境の改善を必要な相手に提言し、実際に手を動かせるとより望ましいですね。</p>
<p>業務やソフトウェア技術について自発的に学習し、それをプロジェクト内に持ち込めるようになると十分な働きを期待できるでしょう。</p>
<p>学習する習慣を身につけられた人は、ここから更に伸びていきます。ただ、そういう人はごく少数です。</p>
<p>会社組織として考えた場合には、このチームリードを沢山輩出できることが望ましいのですが、私はそれが出来ると明確には言い切れない状況です。</p>
<p>私が教育を手掛けた人の中には、私の元を離れた後に本人の努力によってチームリードに成長する人は何名もいます。ただ、それは私の活動による成果だとは言い難いですよね。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="技術責任者">技術責任者<a href="https://blog.satotaichi.info/training_for_software_engineers/#%E6%8A%80%E8%A1%93%E8%B2%AC%E4%BB%BB%E8%80%85" class="hash-link" aria-label="技術責任者 への直接リンク" title="技術責任者 への直接リンク">​</a></h3>
<p>数億円規模以上のプロジェクトにおいて要素技術選定や非機能要件定義を主体的に実施できる人です。</p>
<p>体感ではソフトウェア技術者の1％程度しかいません。そういう人に遭遇したら逃がさないようにしましょう。</p>
<p>こういう人を教育によって再現性高く輩出することは原理的にできないと考えています。中途採用することも非常に難しいでしょう。</p>
<p>会社として出来ることは、そういう稀有な人が学習と訓練によって実績を重ね、それがきちんと評価される環境を作ることです。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="例外的な存在">例外的な存在<a href="https://blog.satotaichi.info/training_for_software_engineers/#%E4%BE%8B%E5%A4%96%E7%9A%84%E3%81%AA%E5%AD%98%E5%9C%A8" class="hash-link" aria-label="例外的な存在 への直接リンク" title="例外的な存在 への直接リンク">​</a></h3>
<p>いわゆるツヨツヨ人材については例外的な存在だと考えています。彼らは生活の中に組み込まれた強固な学習習慣を持っており、食事や入浴をするように学習するので、本人は負担感が少ないことが多いです。</p>
<p>昼だろうが夜だろうが、関係なく学習して前に進んでいくので、こういう人達と自分や教育対象を比較するのはやめましょう。比較してしまう時点で負担感なく夜昼構わず技術を触っていないので、そういうやり方には向いていません。</p>
<p>組織的な取組みとして考えた時には、ツヨツヨ人材を理想的な存在であると定義してしまうと、各種の法令を遵守することが難しくなるでしょう。</p>
<p>ツヨツヨ人材の多くは社内外で形成される技術者コミュニティに多く参加するため、会社に所属しているというよりは業界に所属している共有リソースの一種だと考える方が良いかもしれません。自分達のためだけに占有するよりは、業界全体にとって良い方向になるような業務に携わって貰う方がいいんじゃないでしょうか。</p>
<p>こういった人々を適切に処遇するというのは、極めて困難な課題で定式化できるようなものではありません。もし幸運にもそういった人材が社内にいるなら大切に扱いましょう。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="教育環境について">教育環境について<a href="https://blog.satotaichi.info/training_for_software_engineers/#%E6%95%99%E8%82%B2%E7%92%B0%E5%A2%83%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6" class="hash-link" aria-label="教育環境について への直接リンク" title="教育環境について への直接リンク">​</a></h2>
<p>継続的な学習や訓練の習慣を確立するには、本人が日常的に接する環境の影響が強いと私は考えています。</p>
<p>独学で必要な知識や技能を過不足なく得ることが出来る人もいますが、多くの人にとっては一緒に学習や訓練に取り組む同じくらいの能力を持つ同僚の存在は不可欠です。</p>
<p>そして、目先の業務をこなすだけでなく、学習や訓練を業務の中に組み込んでいくことが許される環境は組織が強靭であり続けるために必要な事です。</p>
<p>ここでは、教育環境について少し考えてみましょう。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="オンラインとオフラインの使い分け">オンラインとオフラインの使い分け<a href="https://blog.satotaichi.info/training_for_software_engineers/#%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E3%81%A8%E3%82%AA%E3%83%95%E3%83%A9%E3%82%A4%E3%83%B3%E3%81%AE%E4%BD%BF%E3%81%84%E5%88%86%E3%81%91" class="hash-link" aria-label="オンラインとオフラインの使い分け への直接リンク" title="オンラインとオフラインの使い分け への直接リンク">​</a></h3>
<p>新型コロナの蔓延をきっかけに私が所属する会社でもテレワークできる環境が急速に整えられました。例えば、私が所属する部門では出社率は25%程度です。大多数の従業員は出社せずにサテライトオフィスや自宅で仕事をしています。</p>
<p>そういった状況を前提に考えて下さい。リモートワークを継続したままで効果的な教育を行うことはできるでしょうか？</p>
<p>今現在の私の認識としては、リモートワークのみでの効果的な教育は極めて難しいと考えています。</p>
<p>特にほぼ素人の状態から一人前に育てるには、対面でのコミュニケーションが必須だと考えています。なぜなら、知識や経験が著しく不足していると自らの状況を適切に言語化できないからです。こちらから見れば、明確に知識不足や理解不足によって手が止まっているにも関わらず、それを認識できていないことが多く発生します。具体的な弊害としては、本人にとって助けが必要な時に自分で助けを呼べないのです。</p>
<p>これに対処するには、教育を行う側が能動的に教育を受ける側の状態を観察し必要な措置をとることが望ましいと私は考えています。そのために使うツールとして現代のリモートコミュニケーションツールは基礎的な性能が不足しています。カメラやマイクを通すと余りに多くの非言語的情報を削ぎ落してしまうのです。一時期は、オンライン会議を開いて接続したままずっと作業するというのを試してみたりもしましたが、あまり上手くいきませんでした。</p>
<p>私の所属企業が主に使っているツールはMS Teamsですが非言語的なコミュニケーションを取るための道具としては全く使い物になりません。そのために作られている訳ではないので当たり前と言えば当たり前ですが…。</p>
<p>話は少しずれますが、個々人が独立してタスクを遂行できるチームではリモートワークは有効に機能すると考えています。業務に集中できるよう作りこんだ自宅環境において言語化されたコミュニケーションのみで成果に向かって作業することは効率的で合理的なあり方です。そういった状況では、非言語的なコミュニケーションは業務をすすめる上で弊害になり易いので避ける方が望ましいでしょう。</p>
<p>チーム内で知識や考え方、価値観が統一され一定のルールが徹底された結果、言語化されたコミュニケーションを取らずとも、同じ課題設定に対して同じ結論に到達できることが理想です。しかし、非言語コミュニケーションによって、お互いの考えや状況を類推しあう事によって働くのは精神的なコストが非常に高く、また事故が起きやすいので望ましい状況ではありません。</p>
<p>ややこしいのは、前者と後者を外形的に区別する方法がほとんどないことです。チームの中心的な人物にとっては前者のような環境だと認識していても、単に周りが上手く合せていただけという状況は相応に存在します。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="コミュニティの作りこみ">コミュニティの作りこみ<a href="https://blog.satotaichi.info/training_for_software_engineers/#%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%83%86%E3%82%A3%E3%81%AE%E4%BD%9C%E3%82%8A%E3%81%93%E3%81%BF" class="hash-link" aria-label="コミュニティの作りこみ への直接リンク" title="コミュニティの作りこみ への直接リンク">​</a></h3>
<p>私の所属企業は、それなりに規模が大きいので基本的にはピラミッド型の組織構造をしています。</p>
<p>事業セグメント→事業部→部署→グループといった構造ですね。これによって、基本的な人間関係は縦の構造によって規定されます。</p>
<p>同じ部署内にいたことのある人の事は良く知っているけども、隣の事業部の事は概要レベルでも何をやっているのか分からないというのは、特に珍しい事ではありません。</p>
<p>一方で新卒採用者であれば同期入社と事業部を越えた繋がりを形成できる人達もいます。こういった関係性を横の繋がりと考えた時、会社の中にはより多くの横の繋がりが存在することが望ましいでしょう。私が所属する企業内では、横の繋がりを形成するための様々な取組みが存在します。</p>
<p>技術者教育にも、横の繋がりがあると能力が伸びやすい傾向があると考えています。教育担当者の能力に依存し過ぎるのは望ましくありません。</p>
<p>では、私が取り組んでいる横の繋がりを作る活動をいくつか説明しましょう。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="輪読会">輪読会<a href="https://blog.satotaichi.info/training_for_software_engineers/#%E8%BC%AA%E8%AA%AD%E4%BC%9A" class="hash-link" aria-label="輪読会 への直接リンク" title="輪読会 への直接リンク">​</a></h4>
<p>少し難しめだったり、分厚くて挫折し易い書籍を複数人で集まって読む会です。例えば「プログラマのためのSQL」や「コードコンプリート」といった書籍を題材にしたことがあります。これらは名著ですが軽い気持ちで読むには辛いですよね。</p>
<p>輪読会では事業部門横断で参加する人を公募して、多くても７，８人で1チームにします。</p>
<p>そして、キックオフの際におおむね10～20ページ程度ずつを、その一人ずつに担当範囲として割り付けます。章や節を基準にすると分かり易いことが多いです。</p>
<p>担当者は、その範囲における議論の中心になる役割を持ちます。具体的には、その範囲内において理解が難しかったことや、納得できなかった部分について輪読会当日までにメモ書きをまとめておきます。</p>
<p>輪読会は１枠１時間で実施し一人分の担当範囲について議論を行います。つまり、一回の輪読会で議論の対象になるのは、多くても20ページ分程度ということですね。</p>
<p>最近やってみてうまくいったのは最初の１５分～２０分を全員が黙読する時間にすることです。これによって、担当者以外の参加者は当該範囲を事前に読んでこなくてもよくなるので、輪読会参加のハードルを下げ心理的負担を低減する効果がありました。黙読が終わったら、担当者が自分の疑問点や納得性の低かった部分について説明し、担当者以外の参加者と議論していきます。</p>
<p>輪読会の主催者である私は基本的にファシリテーションを行うのですが、疑問の内容が複雑すぎたり、ごく単純であった場合には直接回答してしまうこともあります。しかし、重要なのは参加者同士が議論する事で理解を深めることです。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="ハイパフォーマーとの面談">ハイパフォーマーとの面談<a href="https://blog.satotaichi.info/training_for_software_engineers/#%E3%83%8F%E3%82%A4%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%BC%E3%81%A8%E3%81%AE%E9%9D%A2%E8%AB%87" class="hash-link" aria-label="ハイパフォーマーとの面談 への直接リンク" title="ハイパフォーマーとの面談 への直接リンク">​</a></h4>
<p>これは、社内でハイパフォーマーとして評価されている高度な技術者と、まだそこに至ってはいない中堅くらいの技術者が、直近の業務を題材に面談する場です。</p>
<p>私が所属する企業はSIerですが、技術的能力を評価されて高い職位にいる人（雑に言えば高い給料を貰っている人）は相応に存在します。しかし、あまり目立たない事が多いので組織内における縦の人間関係だけで暮らしていると、社内に高度な技術者はいないし、いても評価されていないと誤解し易い状況にあります。</p>
<p>この取組みでは、中堅技術者が他の事業部門で働いているハイパフォーマーと接点を持つことで、キャリア観を形成できるようにすることを第一の目的にしています。技術者として働き続けたいのに、先が無いと思ったら会社を辞めてしまいますよね。評価のあり方を誤解したまま退職してしまうのは会社にとっても本人にとっても不幸です。そういう不幸を少しでも減らしたいと活動しています。</p>
<p>面談の中ではプロジェクトに対する取り組み方や、採用した要素技術について議論していくことで、仕事への取り組み方を中堅技術者が学習していけるようにしています。ハイパフォーマー側も、自らが所属していない部門で採用されている技術の事例を学習する場として活用しています。</p>
<p>この取り組みを継続していくと、社内に学習意欲の高い技術者同士の繋がりが増えていくでしょう。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="雑談用ワークスペース">雑談用ワークスペース<a href="https://blog.satotaichi.info/training_for_software_engineers/#%E9%9B%91%E8%AB%87%E7%94%A8%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9" class="hash-link" aria-label="雑談用ワークスペース への直接リンク" title="雑談用ワークスペース への直接リンク">​</a></h4>
<p>所属部門の枠組みを超えて緩やかに雑談するために、ある種の社内X（twitter）みたいなものをイメージしたチャットスペースを運営しています。</p>
<p>そこでは、私が作ったチーム内にそれぞれのユーザが自分用のチャンネルを作るような形になっています。</p>
<p>全員が強制参加の「一般」チャンネルにはチームへの新規参加者がいると顔写真付きで自動投稿されます。また、給料日やボーナス時期に何か買物に困っていると「実質無料」などとコメントして購買を煽るボット（人力）がいたりと独自の文化を形成しています。</p>
<p>あまり有用な場所であることを目指してはいないのですが、社内の手続きについて困っていることを書くと詳細を相互に教え合うような空気感もあります。</p>
<p>私が気に入っている文化としては、チャンネル名の一部にアイコンを使う流行が数年前にあって以来、色彩豊かなチャンネルが作られるようになったことです。</p>
<p><img decoding="async" loading="lazy" alt="色彩豊かなチャンネル" src="https://blog.satotaichi.info/assets/images/channels-7e1753bb48c3cbf34c9be0a533a004e7.png" width="398" height="210" class="img_ev3q"></p>
<p>類似するようなチームが社内にはいくつかあるという話は聞いたことがあるのですが、私自身はそれらに参加していないので、どうなっているのかは知りません。</p>
<p>こういうものがいくつもあって、それぞれが独自の文化圏を形成するのも一つの多様性だと考えています。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="私のやり方における限界">私のやり方における限界<a href="https://blog.satotaichi.info/training_for_software_engineers/#%E7%A7%81%E3%81%AE%E3%82%84%E3%82%8A%E6%96%B9%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E9%99%90%E7%95%8C" class="hash-link" aria-label="私のやり方における限界 への直接リンク" title="私のやり方における限界 への直接リンク">​</a></h2>
<p>私が考える技術者教育のやり方には明らかな限界があります。それは、教育対象にする人数を増やせないことです。</p>
<p>非言語コミュニケーションを前提に時間をかけて対応するので、多くても７～８人までしか一度に対応できません。</p>
<p>教育対象となる人が持つ現在の能力に応じて、教える内容を柔軟に組み立てているので明文化したカリキュラムのようなものを作り出せていません。</p>
<p>持つべき知識や技能がどういったものであるのかを整理できていないために、再現性の無い活動になっているのです。</p>
<p>例え私に教育を受けた人でも、同じことを同じようにはやれません。</p>
<p>私のやり方では、自分が持つ知識や経験の１割程度、かなり都合よく考えても２，３割程度しか伝達できていないために再生産できていないのです。</p>
<p>現状はあくまでも技術者を教育しているのであって、教育者を教育している訳ではないという状況であるとも言えます。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="おわりに">おわりに<a href="https://blog.satotaichi.info/training_for_software_engineers/#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB" class="hash-link" aria-label="おわりに への直接リンク" title="おわりに への直接リンク">​</a></h2>
<p>本当は技術者教育における訓練の内容について書きたかったのですが、前提を整理するだけで随分と長くなってしまいました。一旦ここまでにしたいと思います。</p>
<p>年末年始は宴会も多いので、そこでの議論によって、続きを書く気力が生まれる可能性は高いでしょう。</p>
<p>私と直接対面する機会のある皆さまにおかれましては、ご協力のほどをよろしくお願いします。</p>
<p>明日以降の自分に期待して、このエントリの締めとさせてください。</p>]]></content>
        <author>
            <name>Sato Taichi</name>
            <uri>https://github.com/taichi</uri>
        </author>
        <category label="tech" term="tech"/>
        <category label="training" term="training"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[ITがつまらんとか言ってるのは老害だけ]]></title>
        <id>https://blog.satotaichi.info/Only_old_fossils_say_IT_is_boring/</id>
        <link href="https://blog.satotaichi.info/Only_old_fossils_say_IT_is_boring/"/>
        <updated>2024-08-21T21:00:00.000Z</updated>
        <summary type="html"><![CDATA[最近は、ITが面白いだとかつまらんだとか言って盛り上がってるけども、面白いってのは、どういうことか、ちょっと考えてみようか。]]></summary>
        <content type="html"><![CDATA[<p>最近は、ITが面白いだとかつまらんだとか言って盛り上がってるけども、面白いってのは、どういうことか、ちょっと考えてみようか。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="知識と学習">知識と学習<a href="https://blog.satotaichi.info/Only_old_fossils_say_IT_is_boring/#%E7%9F%A5%E8%AD%98%E3%81%A8%E5%AD%A6%E7%BF%92" class="hash-link" aria-label="知識と学習 への直接リンク" title="知識と学習 への直接リンク">​</a></h2>
<p>一つ目は、学習するに足るだけの知識体系がそこにあるかどうか。</p>
<p>知らない事を知る、出来なかったことが出来るようになる快感ってのは、何度経験しても最高なんであって、一人でも多くの人にこの体験をして欲しい。素晴らしいことに、ソフトウェア技術だけに範囲を絞ってもまだ理解できてない事は大量にあるし、増え続けてる。</p>
<p>生成AIがアシスタントしてくれるけど、ちょいちょい嘘をついてくるってのが、また熱いよね。AIが言ってる事だけを真に受けちゃダメで自分でちゃんと試さないといけない。そして、インターネット上に無い情報について、やつらは手も足もでない。</p>
<p>最近は新しい技術が出てこないなんて言ってる連中もいるようだが、現実の社会課題を解決し、それを付加価値として提供できて初めて新しい技術だろ。ゴミみたいなチュートリアル一通り触って、それでおしまいじゃ専門知識とは言えねぇよな、俺達はプロだぞ。</p>
<p>まともに使えるエディタがあり、Lintやコンパイラで細かい作業ミスやアンチパターンをきちんと潰せる。まともなバイナリを吐けるコンパイラがあり、それらを一貫したプロセスでビルドできるCI環境があり、各種デプロイ環境やツールがそのバイナリを受け入れる体制がそろってる。そして、細粒度の監視だの、実行プロセスの異常検知だの、エラー時の対応だのが現実的な工数で対処できる。そういうランタイムなんて、そう多くはねぇ。そして、その状態まで技術が進展するのには10年単位の時間がかかる。</p>
<p>んで、今挙げたような事を、全部一通りまともに扱えるような技術者なんて、ほとんどいない。つまんなくなったとか言ってねぇで学習と訓練をしろ。サボってるやつに限ってつまんなくなったとか言い出すんだよな。</p>
<p>俺たちのJavaは幸いこういう事が高度に実現されているから安心して使ってられるわけだな。最近だと、Goはあっという間にこのレベルまで育ったわけで大変に素晴らしい。Rustはまだまだ不足かな。個人的にはPythonなんかも安心して任せられる言語だと思ってる。</p>
<p>TypeScriptはJavaよりもJavaだなって思いながら使ってる、色んな意味で俺はTypeScript大好きだよ。UI作るのにも、サーバ作るのにもいい。NodeのGCはJavaに比べるとアホだけど、あんま重要な事を任せなければ可愛いもんよ。どうせ今時のアプリケーションは１プロセスで信頼性を担保することなんてできねーし、アプリケーションプロセスの手前にはちゃんとロードバランサがいるんだ。気にせずプロセスは落としていけ。</p>
<p>UI作るフレームワークはもう何年もReact中心だよな。もう飽きたなんて思ってるやつは少数派だよ。そうでなけりゃ、useEffectの使い方解説するだけで、みんなが大喜びするわけねぇだろ。どいつもこいつも雑に使いやがって、おかしな使い方するから画面がチラついてしょうがねぇんだよ。</p>
<p>そういうのは、実装の詳細であってバッドノウハウだから本質ではない、とか言っちゃう？おおー、上から物言えば後はどこからか集められた皆さんが勝手に作ってくれるアーキテクト様は偉いねぇ。俺は少なくとも、そういう所にはいねーんだわ。要件定義から運用まで見れる範囲のものは全部責任を持って最高の状態に仕上げる。こちとら、そういうスタイルで仕事してんだわ。だから、文字コードがおかしくてうまく動かねー古いJavaScriptと格闘したりもする。とは言え、こういうのはマジで最悪だからみんなはやんない方がいい。</p>
<p>サーバについても同じよ。Javaだと大体JAX-RS使っとけみたいな所で落ち着いてるけど、社会課題をまともに解決するレベルに使いこなすってのは大変な事よ。確かにチュートリアル動かして雑なアプリケーションデプロイする所までは1日でいける。色んな事が整備されまくってすげー簡単になったなって思うよ。生成AI様に、使い方教えてくださいって言えば、細かい嘘混じりだけど何でもポンポン教えてくれる。それをコピペして動く範囲のものなら簡単に作れる。</p>
<p>でもよ、そんなんじゃ仕事は始まってもねぇんだわ。いや、確かにその程度の事が出来れば良い役割ってのはある。あ？なに？僕ちんはすごい「ぎぢつりよく」あるのに、こんな簡単な仕事しか任せて貰えなくてつまんないでちゅーって事？残念なこったな。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="問題解決">問題解決<a href="https://blog.satotaichi.info/Only_old_fossils_say_IT_is_boring/#%E5%95%8F%E9%A1%8C%E8%A7%A3%E6%B1%BA" class="hash-link" aria-label="問題��解決 への直接リンク" title="問題解決 への直接リンク">​</a></h2>
<p>二つ目、その得た知識を実社会における問題解決に適用できるかどうか。</p>
<p>ソフトウェアが世界を侵食するようになったってのは、電車の中でみんなの手元を見ればすぐわかる。どいつもこいつも、スマホに嚙り付いていて完全に魂を奪われた状態だ。</p>
<p>勿論、俺自身もそう。ゲームで暇つぶしをするもよし、SNSで承認欲求を満たすもよし、買い物だってできる。勿論、学習のために本を読めるし、本を読んでるフリしながら漫画も読める。この片手に収まる小さいやつがいなかった頃の生活なんて、思い出したくもないってのが正直なところよな。</p>
<p>そして、ソフトウェア技術者ってのは、消費者でありながら、その提供者でもあるわけだな。自分は基本的にB2Bなソフトウェアしか作らないから、必ずしもみんなの手元にあるようなものを作ってる訳じゃないけどさ。</p>
<p>現代のソフトウェアシステムは、大前提としてインターネットがありウェブがある。一部のマニアしか使ってなかったおもちゃであった時代はとうの昔に終わって、今や上下水道と同じくらいにインターネットは生活と切り離せないものになってる。つまり、現代は人間側がインターネットに寄せてきてくれたので、ウェブで動作するアプリケーションを提供するだけで解決可能な社会課題が、それこそいくらでもあるんだよね。</p>
<p>ITつまんねーとか言ってる連中は仕事無くて暇なのかねって思うわ。</p>
<p>解決すべき社会課題がいくらでもあるって事は、それに対応するためにより高度な技術的知見や技能が必要になるって事。ビジネスが分かる必要があるだの、無いだのって話もあるようだが、現実社会の課題を解決できるだけの技能ってのは、よっぽど高度なものだよ。片手間にできるようなもんだと考えてんなら甘く見過ぎだろ。専門的な訓練が必要なものだし、一度訓練が終わったら一生使えるってわけでもない。継続的な課題解決への技術適用がありつつ、それに向けた準備も必要だ。これはソフトウェア技術者だけが特別だってんじゃねぇぞ、高度な付加価値を提供する専門職ってのはそういうもんだ。</p>
<p>最先端技術が生成AIでそれの応用の話ばっかり技術イベントで聞かされてウンザリしたなんてのも見たが、何言ってんだって話よ。生成AIが作れるシステムで解決できる範囲の社会課題なんて、ほんのちょっとだけじゃねぇか。便利で賢いエディタが増えたくらいの話よ。付加価値として提供できる課題解決に集中しろや。そのパートナーとして生成AIは信頼に値する存在か？</p>
<p>技術以外の事も分かる人間の方が金勘定だけやってる人間にとって使い易いってのは理解するとしても、技術者としてやってきたって人間が、それだけになってしまったなんて悲しんで見せるのは、了見が狭すぎる。流され過ぎだろ。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="報酬">報酬<a href="https://blog.satotaichi.info/Only_old_fossils_say_IT_is_boring/#%E5%A0%B1%E9%85%AC" class="hash-link" aria-label="報酬 への直接リンク" title="報酬 への直接リンク">​</a></h2>
<p>三つ目、解決した問題に応じた報酬があるかどうか。</p>
<p>ITで金を稼ぐのは広告一択とか言ってんのはどんだけ見えてる範囲が狭いんだって話よ。確かにB2Cビジネスでは広告を使って収益性を確保することが広く行われている。でもよ、有償のコンテンツ配信サービスに全く金を払わずに暮らしてる人の方がすくねぇだろ。アニメでも、漫画でもゲームでも良いんだけどさ。非接触IC使った決済なんかも地獄便利よな。俺は小銭ジャラジャラするのも好きだけどよ。NISAやるにもiDeCoやるにも書面だけじゃ出来なくてITの力は必須だよ。こういうビジネスはどれもこれも著しく収益性が低いとでも？そんなわけねぇ。みんなクッソ稼いでる。</p>
<p>自分の仕事はB2BでITによって課題解決する事で対価を貰う仕事をしてるけど、そこに広告の要素は一切ない。システム作るのに使ってAWSやGoogle Cloudには毎年億単位の金を会社は払ってるし、それの何倍もの売り上げを作って利益を出している。それを原資に十分な給料やボーナスを貰ってるよ。</p>
<p>スタンプ売ってるSNS屋さんは無理に広告出さなきゃシステム規模に応じた売上が立たなくてきついのか？そりゃご愁傷様。でも、それは社会全体の話じゃなくて御社の話よな。</p>
<p>ただ、猫スタンプを友達に送れなくなったら生活に支障がでるから頑張って欲しい。そのためなら、頑張って広告見るよ。お願いだから猫が出てくるやつを多めにしてくれ。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="まとめ">まとめ<a href="https://blog.satotaichi.info/Only_old_fossils_say_IT_is_boring/#%E3%81%BE%E3%81%A8%E3%82%81" class="hash-link" aria-label="まとめ への直接リンク" title="まとめ への直接リンク">​</a></h2>
<p>正直言って、良い年こいた大人が公衆の面前で「～～はつまらなくなった」とか言い出すのは老化だよ、老化。俯瞰的に物事を見れて、歴史も知ってる斜に構えた俺カッケーってか？そういうシラけた態度がかっこよかった時代はもう終わってんだよ。</p>
<p>社会の持続的な発展を担うものの一人として、後進の皆さまがこの仕事に夢や希望をもって取り組めるように、継続的な改善を行う責任についてもう少しまともに検討してはどうかね。</p>
<p>最先端のモードは物事に真っすぐ向かって真面目に取り組む。これ一択よ。</p>
<p>反省したら、明日からはオートミール食ってプロテイン飲んで筋トレしとけ。今日は風呂に入る前にスクワット10回、寝る前にストレッチ30分な。忘れんなよ。</p>]]></content>
        <author>
            <name>Sato Taichi</name>
            <uri>https://github.com/taichi</uri>
        </author>
        <category label="life" term="life"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Factorio Space Exploration modにおける宇宙船自動操縦について]]></title>
        <id>https://blog.satotaichi.info/spaceship-autopiloting-in-factorio/</id>
        <link href="https://blog.satotaichi.info/spaceship-autopiloting-in-factorio/"/>
        <updated>2023-12-19T08:31:57.000Z</updated>
        <summary type="html"><![CDATA[これはpyspa アドベントカレンダー 2023の19日目の記事です。昨日は@aodagのミス・マープルでした。]]></summary>
        <content type="html"><![CDATA[<p>これは<a href="https://adventar.org/calendars/8595" target="_blank" rel="noopener noreferrer">pyspa アドベントカレンダー 2023</a>の19日目の記事です。昨日は@aodagの<a href="https://aodag.dev/posts/2023-12-18-miss-marple/" target="_blank" rel="noopener noreferrer">ミス・マープル</a>でした。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="はじめに">はじめに<a href="https://blog.satotaichi.info/spaceship-autopiloting-in-factorio/#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB" class="hash-link" aria-label="はじめに への直接リンク" title="はじめに への直接リンク">​</a></h2>
<p>このエントリは<a href="https://factorio.com/" target="_blank" rel="noopener noreferrer">Factorio</a>の<a href="https://mods.factorio.com/mod/space-exploration" target="_blank" rel="noopener noreferrer">Space Exploration</a>というmodを導入して遊んでいる人向けのエントリである。</p>
<p>Factorioというゲームがどんなゲームであるかについては、多くの情報がネットにあふれているので、ここでは説明を繰り返すことはしない。</p>
<p><a href="https://mods.factorio.com/mod/space-exploration" target="_blank" rel="noopener noreferrer">Space Exploration</a> mod は、Factorioの何もmodを導入していない状態でロケットを打ち上げる所までは遊んだ人向けのmodだ。つまり、クリア後の世界を拡張するものである。</p>
<p>Factorioでロケットを打ち上げた後、この世界はどうなるんだろう？と思った事はないだろうか？開拓した星を飛び出して宇宙空間や更なる惑星を求めて冒険に出たいと思ったことは無いだろうか？</p>
<p>それをかなえてくれるのが<a href="https://mods.factorio.com/mod/space-exploration" target="_blank" rel="noopener noreferrer">Space Exploration</a>だ。このmodを導入することでどんな景色が見れるのか少し紹介させてほしい。</p>
<ul>
<li>衛星軌道にむかってそびえたつ軌道エレベーター</li>
</ul>
<p><img decoding="async" loading="lazy" alt="Space Elevator" src="https://blog.satotaichi.info/assets/images/SpaceElevator-ba3a367bb703bec11ac84dfc79e5d502.png" width="542" height="464" class="img_ev3q"></p>
<ul>
<li>衛星軌道上に作られた宇宙ステーションと地上の間を巡回する銀河鉄道</li>
</ul>
<p><img decoding="async" loading="lazy" alt="Galaxy Railway" src="https://blog.satotaichi.info/assets/images/GalaxyRailway-d1b0eae4f841b19a475f1b2258678a11.png" width="474" height="402" class="img_ev3q"></p>
<ul>
<li>水のない惑星に立つ謎のピラミッド</li>
</ul>
<p><img decoding="async" loading="lazy" alt="Mysterious Pyramid" src="https://blog.satotaichi.info/assets/images/MysteriousPyramid-4e0d58207678b96e0a5d143f887da332.png" width="401" height="320" class="img_ev3q"></p>
<p>膨大なコンテンツが含まれている大型modだが、信じられない事になんと<strong>無料</strong>だ。そして、日本語で遊べる。注意点としては、modはPC版のみ対応だ。もしPC版Factorioを一通り遊んだことのあるなら是非遊んでみて欲しい。</p>
<p>このエントリは、<a href="https://mods.factorio.com/mod/space-exploration" target="_blank" rel="noopener noreferrer">Space Exploration</a> modにおける中盤以降で建築することになる宇宙船に関する攻略情報つまり、ネタバレを含むものである。もし、完全に自力で攻略したいと思っているなら、読むのを避けて欲しい。</p>
<p>それでは本題に入っていこう。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="最小の宇宙船">最小の宇宙船<a href="https://blog.satotaichi.info/spaceship-autopiloting-in-factorio/#%E6%9C%80%E5%B0%8F%E3%81%AE%E5%AE%87%E5%AE%99%E8%88%B9" class="hash-link" aria-label="最小の宇宙船 への直接リンク" title="最小の宇宙船 への直接リンク">​</a></h2>
<p>まずは、テックレベルをSpaceship consoleが作れるところまでゲームを進めて欲しい。そうしたら、床と壁を作ってその中にSpaceship consoleを配置することで宇宙船を建築できる。</p>
<p>今回の説明で使う宇宙船は、そこからさらにテックレベルを進めてIon Engineを作成できるようになっている。</p>
<p>具体的にはこういうものだ。説明に使った宇宙船は最後のまとめでBlueprint Bookのインポート用文字列を用意してあるので、説明できなかった部分を詳細に知りたいという事であれば使って欲しい。</p>
<p><img decoding="async" loading="lazy" alt="Coffin" src="https://blog.satotaichi.info/assets/images/Coffin-7f47b7ae7806d64a821a25b68a165c71.png" width="433" height="655" class="img_ev3q"></p>
<p><strong>棺桶である</strong>。かっこよさは微塵もない事は認める。何せ筆者は絵心というものを気がついたら、どこか遠くに置いてきてしまったのだ。取りに戻ろうとしたが、もう分からなくなってしまった。</p>
<p>冗談はさておき、この棺桶は宇宙を飛び回れるし、惑星に着陸したうえで、大気圏を突破して宇宙に戻ることもできる。</p>
<blockquote>
<p>⚠️ Space Explorationを遊んだことのある人は違和感を覚えるかもしれない。
本来なら、液体ロケット燃料を使うロケットエンジンが無ければ、地表面から宇宙に出られない筈なのだが、現在の仕様ではなんと液体ロケット燃料のタンクだけ据え付けておけば大気圏脱出できる。このバグが修正されたらロケットエンジンを自分で追加して欲しい。</p>
</blockquote>
<p>レーザータレットは宇宙空間で飛んでくる隕石を打ち落とすために必須なので設置している。上を歩けるフラットな太陽光パネルと広域電柱を配置して電気系統は実装してある。</p>
<p>ここまでは特に難しいことは無いはずだ。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="手動スイッチによる発着">手動スイッチによる発着<a href="https://blog.satotaichi.info/spaceship-autopiloting-in-factorio/#%E6%89%8B%E5%8B%95%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81%E3%81%AB%E3%82%88%E3%82%8B%E7%99%BA%E7%9D%80" class="hash-link" aria-label="手動スイッチによる発着 への直接リンク" title="手動スイッチによる発着 への直接リンク">​</a></h2>
<p>Spaceship consoleに回路を接続して操作するための基本的な部分から理解していこう。</p>
<p>まずは、定数回路を使った離陸と着陸について説明する。</p>
<p>最小の宇宙船に定数回路を2個と宇宙船を係留するクランプを取り付けてある。クランプは宇宙船側に一つと港側に一つ付けると宇宙船の着陸を自動化できる。</p>
<p><img decoding="async" loading="lazy" alt="Minimum" src="https://blog.satotaichi.info/assets/images/Minimum-185114a3e3bf78ff2d62cbc4f069a75a.png" width="467" height="713" class="img_ev3q"></p>
<p>今回の回路で使うシグナルは、その他のタブに配置されているものを使う。</p>
<p><img decoding="async" loading="lazy" alt="Signals" src="https://blog.satotaichi.info/assets/images/Signals-83c7e2ee0cf696f7de8f5760a29b1927.png" width="451" height="928" class="img_ev3q"></p>
<p>二つの定数回路とSpaceship consoleは単一の回路ネットワークで接続してある。</p>
<p><img decoding="async" loading="lazy" alt="Operation Signals" src="https://blog.satotaichi.info/assets/images/OperationSignals-2d461e137cb657ce1fcabb4603721640.png" width="642" height="747" class="img_ev3q"></p>
<p>左側の定数回路には、宇宙船の離陸を表すシグナルを設定した。かっこいい宇宙船に上向きの黄色い三角がついているシグナルだ。値としては1以上の数値を設定すればなんでもいいので1を設定してある。この定数回路の電源をOnにしてシグナルをSpaceship consoleに送信すると宇宙船は離陸する。</p>
<p>右側の定数回路には、着陸するためのシグナルを設定してある。</p>
<p>シグナルパレットには、クランプを表すシグナルが４つあるが、三角の向きが同じ黄色と青のシグナルが対応関係にある。</p>
<p>黄色い三角がついているシグナルが宇宙船に設置してあるクランプを表す。青い三角がついているシグナルが港に設置してあるクランプを表す。</p>
<p>クランプの値は、クランプを一意に特定するためのIDを表す。黄色い三角形側のクランプは各宇宙船の中で一意になっていればよい。大抵の宇宙船はクランプが一つだけなので実質的にどんな値でも問題ない。青い三角形側のクランプに設定された値は、それぞれのマップごとに設置した複数のクランプの中で一意になっている必要がある。例えば、軌道衛星上と母星の地表はマップが違うので値が重複してもよい。</p>
<p>最初のうちは複数の宇宙船を単一のクランプに複数の宇宙船を係留しようとすることは事故につながるためやらない方が良いだろう。分かり易さのため宇宙船のクランプに付与するIDと港のクランプに付与するIDは同じにするのがおすすめだ。</p>
<p>なお、単一のクランプに対して、複数の宇宙船を係留しようとすると二つ目以降の宇宙船は該当するクランプが空くまで着艦しない。また、同一のIDを持つクランプが複数ある場合には空いているところに着艦する。</p>
<p>筆者にはFactorioで管制塔の制御システムを実装するだけの根性はないが、誰かが挑戦するのであれば見てみたいという気持ちはある。</p>
<p>この定数回路では、宇宙船に設置した500番のクランプを使って、港に設置した500番のクランプに係留するように指示している。</p>
<p>それでは、宇宙船に配置したクランプを見てみよう。クランプ本体をクリックして、シグナルのアイコンをさらにクリックするとIDを編集できる。ここでは500を設定している。</p>
<p><img decoding="async" loading="lazy" alt="Left Clamp" src="https://blog.satotaichi.info/assets/images/LeftClamp-65d505d6751665d7d4aca26c8130b9ee.png" width="846" height="656" class="img_ev3q"></p>
<p>同じように港側のクランプにも500番を設定した。</p>
<p><img decoding="async" loading="lazy" alt="Right Clamp" src="https://blog.satotaichi.info/assets/images/RightClamp-390698992cc7f5a4cc758e4838e55343.png" width="872" height="668" class="img_ev3q"></p>
<p>宇宙船は二か所以上の港を移動する。つまり、係留する可能性のある港側のクランプは全部同じIDを割り振るのがコツだ。違った値を割り当てても良いが、その分回路は複雑になる。</p>
<p>例えば、このケースでは軌道衛星上の宇宙港と、母星の地表にある港のクランプのIDとしてそれぞれ500を割り当てている。軌道衛星上と母星はマップが別なのでクランプの値が重複していても正しく動作する。</p>
<p><img decoding="async" loading="lazy" alt="Right Clamp on Nauvis" src="https://blog.satotaichi.info/assets/images/RightClampNauvis-483fa2f87d01d3def33b88e64a27569e.png" width="832" height="612" class="img_ev3q"></p>
<p>このクランプの仕様を理解するのに筆者は大分苦しんだが、これを読んでいるあなたはすんなり理解できただろうか？もしすぐに理解できたなら非常にうれしい。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="加速の自動化">加速の自動化<a href="https://blog.satotaichi.info/spaceship-autopiloting-in-factorio/#%E5%8A%A0%E9%80%9F%E3%81%AE%E8%87%AA%E5%8B%95%E5%8C%96" class="hash-link" aria-label="加速の自動化 への直接リンク" title="加速の自動化 への直接リンク">​</a></h2>
<p>宇宙船が惑星間を移動する際には、係留状態から離陸状態になり、その後加速状態なる。離陸状態の宇宙船は速度がゼロなので一切移動しない。ロケットエンジンやIon Engineが動作して加速状態になった宇宙船は一定の時間経過によって目的地に到着し、速度がゼロになる。</p>
<p>離陸シグナルを定数回路からSpaceship consoleに送信することで離陸するとすでに説明した。実はそれだけでは宇宙船は移動しない。宇宙船が加速を開始するにはSpaceship consoleに対して目標となる速度を入力する必要がある。</p>
<p>というわけで、宇宙船に新しい定数回路を配置して回路ネットワークに接続した。</p>
<p><img decoding="async" loading="lazy" alt="Add Speed Signal" src="https://blog.satotaichi.info/assets/images/AddSpeedSignal-ee19c12f3e656668ce6f50c33ac25f5a.png" width="563" height="857" class="img_ev3q"></p>
<p>速度を指定する定数回路では、タコメータのようなシグナルを選んで値として目標速度を設定する。船の最大速度は船自体の大きさやエンジンの数によって決まるので、ここで設定した値の速度で必ず船が飛ぶという訳ではない。</p>
<p>設定された速度を目標に頑張ってエンジンを動かすだけだ。つまり、無理な目標を設定しても、エンジン性能の限界を超えた速度がでることはない。</p>
<p><img decoding="async" loading="lazy" alt="Speed Signal" src="https://blog.satotaichi.info/assets/images/SpeedSignal-50b3aee48494bafd952d2583fbfd5a23.png" width="949" height="873" class="img_ev3q"></p>
<p>なお、離陸していない宇宙船は速度を設定しても単に無視する。係留状態のままエンジンをふかしたりはできないのだ。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="目的地設定の自動化">目的地設定の自動化<a href="https://blog.satotaichi.info/spaceship-autopiloting-in-factorio/#%E7%9B%AE%E7%9A%84%E5%9C%B0%E8%A8%AD%E5%AE%9A%E3%81%AE%E8%87%AA%E5%8B%95%E5%8C%96" class="hash-link" aria-label="目的地設定の自動化 への直接リンク" title="目的地設定の自動化 への直接リンク">​</a></h2>
<p>離陸と着陸、それに加速を定数回路のON/OFFで操作できるようになったので、次は少し複雑な回路を組んでみよう。</p>
<p>条件回路自体の使い方について詳しく知りたい人は、<a href="https://wikiwiki.jp/factorio/%E5%9B%9E%E8%B7%AF%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF" target="_blank" rel="noopener noreferrer">factorio@jp Wiki の 回路ネットワーク</a> を見て欲しい。</p>
<p>まずは、目的地の自動設定回路を組み込むために、宇宙船を少し拡張した。</p>
<p><img decoding="async" loading="lazy" alt="Automatic Direction" src="https://blog.satotaichi.info/assets/images/AutomaticDirection-d4d0bff8805e52b62ba5ddf6a506c604.png" width="664" height="785" class="img_ev3q"></p>
<p>この回路について説明する前にSpaceship consoleが出力するシグナルについて理解しておいた方が良いだろう。様々なシグナルが出力されているので一つずつ説明していく。</p>
<p>まず全体としては、例えばこんなふうにシグナルが出力されている。</p>
<p><img decoding="async" loading="lazy" alt="Spaceship console Signals" src="https://blog.satotaichi.info/assets/images/SpaceshipConsoleSignals-8701233049fa865ec412f826c3fbe008.png" width="949" height="877" class="img_ev3q"></p>
<p>左から順に説明する。</p>
<p>Spaceship consoleのアイコンで34が出力されているシグナルは、宇宙船のIDを表している。複数の宇宙船を建造したらこのIDが意味を持つようになるが、管制システムでも作らない限り使い道は無いと思う。</p>
<p>タコメーターのアイコンで-2が出力されているシグナルは、宇宙船の速度を表している。0未満は特別な値で、-1は宇宙船が停止していることを意味する。-2は港に係留していることを意味する。</p>
<p>定規のような目盛りのアイコンで-2が出力されているシグナルは、宇宙船に設定された目的地と現在地の距離を表している。0未満は特別な値で、-1は到着済み、-2は係留済み、-3は目的地が設定されていないことをそれぞれ表す。</p>
<p>惑星に木星のようなわっかがついているアイコンで475が出力されているシグナルは、宇宙船に設定された目的地を表している。これは、設定されたり入力された値がそのまま出力されているので、注意して欲しい。また、目的地の種類ごとにアイコンは変わる。</p>
<p>アルファベットのDアイコンで100が出力されているシグナルは、宇宙船の周りにある小惑星や隕石の密度を表している。このキャプチャを取った時には港に係留されている状態なのだけども、何か高密度な隕石の中にいると判定されているようだ。唯一使い方の分からない数字でもある。</p>
<p>アルファベットのAアイコンで475が出力されているシグナルは、宇宙船が係留されている時のみ出力される。これは係留された宇宙船の現在地を表す。</p>
<p>では、宇宙船の現在地とはどういうことだろうか。<a href="https://mods.factorio.com/mod/space-exploration" target="_blank" rel="noopener noreferrer">Space Exploration</a>で拡張される機能の中にUniverse Explorerという機能がある。これを使うと、探査衛星を打ち上げて発見した惑星や太陽、アステロイドベルトなどを一覧できる。</p>
<p>例えば、筆者がやっているゲームではNauvisが母星である。母星をマウスでクリックして選択状態にすると、選択した要素の詳細情報がウィンドウの右上あたりに表示される。</p>
<p><img decoding="async" loading="lazy" alt="Universe Explorer" src="https://blog.satotaichi.info/assets/images/UniverseExplorer-9675c4baac5647e57b73d47b0fd9ffe1.png" width="1314" height="802" class="img_ev3q"></p>
<p>では、母星の詳細情報を確認してみよう。色んな事が書いてあるが、今重要なのは、<strong>Automation signal</strong> という値だ。ここでは474となっている。つまり、宇宙船を母星の地表面に係留するとSpaceship consoleにおいてAの値が474になるということだ。ちなみに、目的地として使う際には、数字の左側についているアイコンも同じものにする必要がある。</p>
<p><img decoding="async" loading="lazy" alt="Nauvis Details" src="https://blog.satotaichi.info/assets/images/NauvisDetails-002513d4bed07025aea960d3f2fcba10.png" width="613" height="808" class="img_ev3q"></p>
<p>続いて、母星の軌道衛星を見てみよう。ここでも注目するのは、<strong>Automation signal</strong>だ。軌道衛星を表すアイコンと共に475という数字が読み取れる。つまり、Spaceship consoleの出力シグナルをキャプチャした際に、宇宙船が係留されていたのは母星の軌道衛星上であるというわけだ。</p>
<p><img decoding="async" loading="lazy" alt="Orbit Details" src="https://blog.satotaichi.info/assets/images/OrbitDetails-4271586a926b7c4eda1cfa11ae0f1e1c.png" width="610" height="815" class="img_ev3q"></p>
<p>これを踏まえて回路に設定された条件を確認してみよう。</p>
<p><img decoding="async" loading="lazy" alt="Automatic Direction Circuit" src="https://blog.satotaichi.info/assets/images/AutomaticDirectionCircuit-08d4b0191503e711077110384d238678.png" width="1186" height="1263" class="img_ev3q"></p>
<p>Spaceship consoleから出力されたシグナルは、右側の赤いケーブルから入力されてくる。</p>
<p>右上の条件回路では、現在地が474、つまり母星の地表面に宇宙船が係留されている時チェックシグナルを出力する。右下の条件回路では、現在地が475、つまり母星の軌道衛星上に宇宙船が係留されている時チェックシグナルを出力する。つまり、右列にある二つの条件回路はいずれか一つだけが成立する。</p>
<p>中央上の定数回路では、軌道衛星を表すシグナルで475の値を出力しており、左上の条件回路のみに接続している。中央下の定数回路では474の値を出力しており、左下の条件回路のみに接続している。</p>
<p>左列にある二つの条件回路は全く同じ条件と出力を設定している。つまり、チェックマークのシグナルが1の時に、定数回路と条件回路から入力されたシグナルを全て出力するというわけだ。</p>
<p>回路全体を俯瞰すると、母星の地上に宇宙船が係留されている時は目的地を軌道衛星上に設定し、宇宙船が軌道衛星上に係留されている時は母星の地上に目的地を設定するというわけだ。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="着陸と加速の自動化">着陸と加速の自動化<a href="https://blog.satotaichi.info/spaceship-autopiloting-in-factorio/#%E7%9D%80%E9%99%B8%E3%81%A8%E5%8A%A0%E9%80%9F%E3%81%AE%E8%87%AA%E5%8B%95%E5%8C%96" class="hash-link" aria-label="着陸と加速の自動化 への直接リンク" title="着陸と加速の自動化 への直接リンク">​</a></h2>
<p>宇宙船の現在地に応じて目的地を自動的に決められるようになったので、次は着陸と加速の自動化をやっていこう。</p>
<p>これは特に難しいことは無くて、すでに作りこんだ係留と加速の定数回路のスイッチをONにしっぱなしにするだけだ。これによって、宇宙船から定数回路が一つ減ることになる。</p>
<p>Spaceship consoleの左側にある定数回路が二つになっていることが確認できるだろう。</p>
<p><img decoding="async" loading="lazy" alt="Remove Combinator" src="https://blog.satotaichi.info/assets/images/RemoveCombinator-78dcabda19c86f10cf3d246265401653.png" width="430" height="581" class="img_ev3q"></p>
<p>減った定数回路の中に設定されていたシグナルを、Spaceship consoleのすぐ左隣りにある定数回路の中に統合した結果、このようになる。</p>
<p><img decoding="async" loading="lazy" alt="Combine Signals" src="https://blog.satotaichi.info/assets/images/CombineSignals-d254b052005c60814a73afdfd470e134.png" width="229" height="366" class="img_ev3q"></p>
<p>どちらかというと、何故着陸と加速という矛盾したシグナルをSpaceship consoleに送りっぱなしにしても正しく機能するのかを理解する方が難しい。</p>
<p>Space Explorationにおける宇宙船には、係留状態、停止状態、加速状態という3つの状態があると少し前に説明した。</p>
<p>まず、クランプアイコンの係留シグナルは、目的地の上空で停止状態の時にしか機能しない。係留状態や加速状態の時は勿論の事、目的地でない場所で停止していても単に無視される。つまり、係留シグナルはSpaceship consoleに送りっぱなしで問題ない。</p>
<p>次に、タコメーターの速度目標シグナルは、目的地以外の上空で停止状態の時にしか機能しない。係留状態でエンジンをフカそうとしても単に無視される。目的地上空で係留待ち状態になっている時も無視される。というわけで加速シグナルもSpaceship consoleに送りっぱなしで問題ない。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="入出荷の自動化">入出荷の自動化<a href="https://blog.satotaichi.info/spaceship-autopiloting-in-factorio/#%E5%85%A5%E5%87%BA%E8%8D%B7%E3%81%AE%E8%87%AA%E5%8B%95%E5%8C%96" class="hash-link" aria-label="入出荷の自動化 への直接リンク" title="入出荷の自動化 への直接リンク">​</a></h2>
<p>宇宙船の自動運行について説明するのもそろそろ大詰めだ。最後の説明を始める前にそもそも何で宇宙船を自動運行するのか忘れてしまわないように、荷物を載せたり下ろしたりする方法について確認しておこう。</p>
<p>まずは積込みだ。このキャプチャでは右側の大きい箱からインサーターを使って取り出したものを宇宙船内の箱に格納している。ベルトコンベヤを配置するにあたって邪魔になった広域電柱の位置を少々調節した。</p>
<p><img decoding="async" loading="lazy" alt="Shipping" src="https://blog.satotaichi.info/assets/images/Shipping-f7f893e88b3654874a8572f159f06d22.png" width="451" height="397" class="img_ev3q"></p>
<p>次は荷下ろしだ。積込みの際にはつながっていなかったベルトコンベヤの先に地下ベルトを通って物資が輸送されている様子が確認できるだろう。積込みの際に使っていた右側の地下ベルトの先には何もない。</p>
<p><img decoding="async" loading="lazy" alt="Arrival" src="https://blog.satotaichi.info/assets/images/Arrival-41d830a66d7d4e30eb85848980321e1d.png" width="674" height="500" class="img_ev3q"></p>
<p>離陸の際に使う液体ロケット燃料は、どこの惑星でも補充できるようにパイプを組むと紛れが無くなって宇宙船の運行状況が安定する。なお、宇宙用のパイプは地上用のパイプと問題なく接続できる。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="離陸の自動化">離陸の自動化<a href="https://blog.satotaichi.info/spaceship-autopiloting-in-factorio/#%E9%9B%A2%E9%99%B8%E3%81%AE%E8%87%AA%E5%8B%95%E5%8C%96" class="hash-link" aria-label="離陸の自動化 への直接リンク" title="離陸の自動化 への直接リンク">​</a></h2>
<p>ここまでは、宇宙船内に配置した定数回路のON/OFFを切り替えることで宇宙船を離陸してきたが、最後は宇宙船を自動的に離陸できるように回路を組もう。</p>
<p>クランプを中心に宇宙船の離陸と関係がありそうな設備をケーブルで接続している。ここでは、宇宙船の電力状況を安定させるために蓄電池（Accumulator）を追加している。</p>
<p>接続されたクランプ同士は、それぞれに入力されたシグナルを相手方に送信する。つまり、宇宙船内部の液体ロケット燃料やIon Stream、蓄電池の残量はクランプを通して外の回路に伝達されるのだ。すごい。</p>
<p><img decoding="async" loading="lazy" alt="Wired Spaceship" src="https://blog.satotaichi.info/assets/images/WiredSpaceship-616ef34cfaeb6b49f7fcc7f1beed8200.png" width="540" height="413" class="img_ev3q"></p>
<p>赤いケーブルで接続された各資源の情報がクランプにシグナルとして送信されていることを確認してみよう。このキャプチャでは赤い背景の入力シグナルとして、液体ロケット燃料、Ion Stream、蓄電池の残量割合が送信されている。この例では、Spaceship consoleの出力と、蓄電池の出力に同じ<strong>A</strong>シグナルを使っている。これらが同じ回路ネットワーク内に流れることで合算されてしまうと完全に意味のない値になってしまうので、回路の接続経路で混ざってしまわないよう注意して欲しい。</p>
<p><img decoding="async" loading="lazy" alt="Signals on Clamp" src="https://blog.satotaichi.info/assets/images/SignalsOnClamp-caa8af41ca29752547a47354591759ce.png" width="505" height="664" class="img_ev3q"></p>
<p>これらのシグナルを受け取る回路がどんな構成になるのか確認していこう。これが宇宙船の自動運行に関する最後の説明になる。もう少しだけ付き合って欲しい。</p>
<p><img decoding="async" loading="lazy" alt="Automatic Launching Circuit" src="https://blog.satotaichi.info/assets/images/AutomaticLaunchingCircuit-94a28ed9cd826d1dc66ceb081f923740.png" width="1119" height="1223" class="img_ev3q"></p>
<p>まず、宇宙船の離陸条件を検証する回路を宇宙船の外側に置くというアイディアこそが最も重要なことだ（なお、筆者のアイディアではない）。宇宙船の内部に離陸条件を検証する回路を置こうとするとどうしても回路が巨大になってしまうのだ。資源効率や横展開に関わるので、宇宙船は出来る限りコンパクトに実装したい。</p>
<p>次に重要なのはクランプのすぐ左にある条件回路だ。チェックシグナル３つを受け取ったら離陸シグナルを送るようになっている。なお、宇宙船は1tick離陸シグナルを受け取るだけで離陸する。つまり、離陸によって宇宙船が係留状態でなくなるので、左側のクランプから右側のクランプに離陸シグナルは送信されなくなるが、特に問題はない。</p>
<p>ちなみに、宇宙船内に定数回路で離陸シグナルを送れるようにしているのは、緊急避難的に宇宙船を離陸するためだ。自分のキャラクターから遠く離れた場所で宇宙船が動けなくなったとしても、Universe Explorerを使って宇宙船を表示したら定数回路のON/OFFをリモートで切り替えられる。なお、Spaceship consoleの離陸ボタンをリモートで押すこともできる。</p>
<p>残りの３つの条件回路は一つの資源ごとに条件を設定して、それぞれがチェックシグナルを1つずつ送るようにしてある。単一の回路ネットワーク内において複数の回路が同じシグナルを送信すると、そのシグナルの値は合算される。つまり、この回路においては３つの条件が成立した時に宇宙船が離陸するというわけだ。</p>
<p>より条件を複雑にしたければ、条件回路を単に増やしていけばいい。港側に条件回路を配置する構造なので、回路が大きくなってもほとんど問題はない。</p>
<p>というわけで、宇宙船の自動運行に関する説明はこれで終わりだ。残りは、細々としたTipsや回路の改良などを説明していく。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="自動運行する宇宙船の改良">自動運行する宇宙船の改良<a href="https://blog.satotaichi.info/spaceship-autopiloting-in-factorio/#%E8%87%AA%E5%8B%95%E9%81%8B%E8%A1%8C%E3%81%99%E3%82%8B%E5%AE%87%E5%AE%99%E8%88%B9%E3%81%AE%E6%94%B9%E8%89%AF" class="hash-link" aria-label="自動運行する宇宙船の改良 への直接リンク" title="自動運行する宇宙船の改良 への直接リンク">​</a></h2>
<p>ここまで説明に使った宇宙船を自分がプレイしているゲーム内のリソースを使って改良してみた。</p>
<p><img decoding="async" loading="lazy" alt="Improve Spaceship" src="https://blog.satotaichi.info/assets/images/ImproveSpaceship-f3c4bf56b3af93d447a1b5c8313d9c5c.png" width="443" height="680" class="img_ev3q"></p>
<p>改良点として分かり易いのは、太陽光パネルと蓄電池だ。テックレベルを上げていくとより強力なものが使えるようになる。ここでは色が赤いものに切り替えた。</p>
<p>次に、目的地を自動設定するための回路群をコンパクトにまとめた。二点間を移動するだけの回路であれば、合計10マス程度で実現できる。もしかしたら、これさえも港側で実装できるかもしれない、という気はするもののまだ試してみていない。</p>
<p>ちょっと分かりづらい改良としては、荷下ろしをするためのインサーターに対して、Spaceship consoleからの出力シグナルを接続するようにしたことだ。荷下ろし用の港に宇宙船が係留されている時だけ動作するようにインサーターの条件を設定している。これで意図しないものがベルトコンベヤ上に乗るのを避けられる。</p>
<p><img decoding="async" loading="lazy" alt="Inserter Condition" src="https://blog.satotaichi.info/assets/images/InserterCondition-f15cc136ca8a17d0b633cdf22d50f72f.png" width="500" height="605" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="まとめ">まとめ<a href="https://blog.satotaichi.info/spaceship-autopiloting-in-factorio/#%E3%81%BE%E3%81%A8%E3%82%81" class="hash-link" aria-label="まとめ への直接リンク" title="まとめ への直接リンク">​</a></h2>
<p>以上がSpace Exploration modにおいて筆者が持っている自動運行に関するノウハウの全てだ。それほど多くの情報がある訳ではないが、丁寧に説明したので文章量としては非常に多くなってしまった。全て読むのはすごく大変だったことだろう。この文章を書きあげるのは勿論すごく大変だった。</p>
<p>宇宙船の自動運行については、筆者自身もまだノウハウを積み上げ始めたばかりで、あまり複雑なことは出来ていない。今後三点間の巡行や、資源の少ない場所への優先的な巡行、条件回路を全て宇宙船の外側に配置するなどの方式に挑戦してみたいと考えている。</p>
<p>ここまで、読んでいただいた読者に感謝するとともに、説明で使った宇宙船を各バージョンごとにブループリントとして記録しておいた。Space Exploration modをすでに導入済みで、このエントリでは説明しきれなかった微細な部分に興味がある方は是非インポートして使ってみて欲しい。</p>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Details</summary><div><div class="collapsibleContent_i85q"><p></p><summary>説明に使った全ての宇宙船をBlueprint Bookにまとめたもの</summary>
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<p></p></div></div></details>]]></content>
        <author>
            <name>Sato Taichi</name>
            <uri>https://github.com/taichi</uri>
        </author>
        <category label="factorio" term="factorio"/>
        <category label="game" term="game"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[二年以上のリモートワークを生き残っている道具を紹介する]]></title>
        <id>https://blog.satotaichi.info/working-area/</id>
        <link href="https://blog.satotaichi.info/working-area/"/>
        <updated>2022-12-14T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[このエントリーは pyspa Advent Calendar 2022 の 14 日目の記事である。]]></summary>
        <content type="html"><![CDATA[<p>このエントリーは&nbsp;<a href="https://adventar.org/calendars/7432" target="_blank" rel="noopener noreferrer">pyspa Advent Calendar 2022</a>&nbsp;の 14 日目の記事である。</p>
<p>昨日は @kuenishi の「<a href="https://kuenishi.hatenadiary.jp/entry/2022/12/13/221636" target="_blank" rel="noopener noreferrer">我が家の生活物資事情コストコ編</a>」だ。</p>
<p>もはやこのブログがアドベントカレンダー用のサイトになって久しいが、今年もちょっと役に立つ話をしようと思う。</p>
<p>今回の話題は、在宅ワークにかかる環境整備の話だ。コロナが始まったころには盛んに皆さんが自宅の環境を整備するようなエントリを書いていたが、最近は一回りしたのか結構減ってきたように感じている。</p>
<p>単に私の生活環境が完成して、そちらの方面に対する興味関心が薄れただけかもしれないが。</p>
<p>というわけで、このエントリではすでに完成して久しい私の稼働環境について説明する。もう完成してから一年以上は経過しており、細かい変化はあるものの全体としては変わっていない。</p>
<p>少なくとも私が使い込んでいて間違いなく良いと感じているものを説明していく。</p>
<h1>机と椅子</h1>
<p>大きい物から紹介していこう。つまり、机と椅子だ。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="オフィスチェアオカムラ-コンテッサセコンダ">オフィスチェア（<a href="https://product.okamura.co.jp/ext/DispCate.do?volumeName=00001&amp;lv0=%E3%83%81%E3%82%A7%E3%82%A2%EF%BC%8F%E3%82%BD%E3%83%95%E3%82%A1&amp;lv2=%E3%82%BF%E3%82%B9%E3%82%AF%E3%83%81%E3%82%A7%E3%82%A2&amp;lv3=%E3%82%B3%E3%83%B3%E3%83%86%E3%83%83%E3%82%B5+%E3%82%BB%E3%82%B3%E3%83%B3%E3%83%80" target="_blank" rel="noopener noreferrer">オカムラ コンテッサセコンダ</a>）<a href="https://blog.satotaichi.info/working-area/#%E3%82%AA%E3%83%95%E3%82%A3%E3%82%B9%E3%83%81%E3%82%A7%E3%82%A2%E3%82%AA%E3%82%AB%E3%83%A0%E3%83%A9-%E3%82%B3%E3%83%B3%E3%83%86%E3%83%83%E3%82%B5%E3%82%BB%E3%82%B3%E3%83%B3%E3%83%80" class="hash-link" aria-label="オフィスチェアオカムラ-コンテッサセコンダ への直接リンク" title="オフィスチェアオカムラ-コンテッサセコンダ への直接リンク">​</a></h2>
<p>コンテッサは比較的高額な部類の椅子だが、デスクワーカーにとって椅子は体の一部とも言うべき存在なので妥協しない方がいいと私は考えているので、きちんとお金を払って買った。</p>
<p>食事、入浴、排せつ、睡眠以外の時間はほぼこの椅子に座っている。時間にすると毎日8時間～12時間程度だろうか。休日に集中してゲームをしている時などはもっと長時間座っていることもある。</p>
<p>自分に合った椅子を探すというのは比較的専門的な知識が必要になるので、オンラインで買わずに専門家の意見を聞いた方がいいだろう。そういうとき、<a href="https://www.iamworkaholic.jp/" target="_blank" rel="noopener noreferrer">WORKAHOLIC</a> はおすすめだ。完全予約制ということもあって極めて親身に対応してくれる。高額な商品を買う際には、コンシェルジュサービスにきっちり金を払って正しい知識でもって合うものを紹介して貰うべきだ。単なる消費者として分かっている事と、プロが持っている知見には大きな差がある。</p>
<p><a href="https://www.iamworkaholic.jp/" target="_blank" rel="noopener noreferrer">https://www.iamworkaholic.jp/</a></p>
<p>私の場合は、コロナ初期で混乱状況な時に椅子を買ったこともあり、会社で使っているのとほぼ同じ椅子を買った。つまり、体に合っていないことに対する懸念はなかったので、同じものを最も安価に買える<a href="https://e-aocinc.com/" target="_blank" rel="noopener noreferrer">アートオフィスクリエイト</a>で買った。このサイトを使う上での注意点は「金を払ってない人間には対応が雑」ということだ。例えば、金を払う前に在庫や納期について聞いても通り一辺倒の答えが返ってくるだけで全く意味はない。しかし、一度支払いが済んでしまえば最大限の対応をしてくれる。工場在庫を押さえて、できるかぎり早く商品が届くように手配してくれるし、質問に対する応答も速くて正確になる。</p>
<p><a href="https://e-aocinc.com/SHOP/122324/139843/list.html" target="_blank" rel="noopener noreferrer">https://e-aocinc.com/SHOP/122324/139843/list.html</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="電動昇降式デスクflexispot">電動昇降式デスク（FlexiSpot）<a href="https://blog.satotaichi.info/working-area/#%E9%9B%BB%E5%8B%95%E6%98%87%E9%99%8D%E5%BC%8F%E3%83%87%E3%82%B9%E3%82%AFflexispot" class="hash-link" aria-label="電動昇降式デスク（FlexiSpot） への直接リンク" title="電動昇降式デスク（FlexiSpot） への直接リンク">​</a></h2>
<p>昇降式デスクを買うなら、絶対に電動式を買うべきだ。理由は簡単、手動だと使うのがめんどくさくなるからだ。</p>
<p>私の場合は、3時間座って作業したら、1時間程度はスタンディングデスクとして使って、疲れたら座る、というような運用で使っている。仕事が少し忙しいような時は、1日に2回、3回上げ下げしているのだが、これは電動昇降式を選んだからこそ出来る生活サイクルである。</p>
<p>ただ、電動昇降式デスクは非常に高価な商品だ。様々なものを探したが、手ごろな価格で電動昇降式のデスクを買えるのは、ほぼFlexiSpotだけだった。当時私が買ったE3はすでに売っていないが後継商品のE7が今は売られている。天板の材質や形状のバリエーションも多いので大いに悩んだ上で購入して欲しい。</p>
<p><a href="https://flexispot.jp/e7-set.html" target="_blank" rel="noopener noreferrer">https://flexispot.jp/e7-set.html</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="ケーブルトレーcb-ct3">ケーブルトレー（CB-CT3）<a href="https://blog.satotaichi.info/working-area/#%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB%E3%83%88%E3%83%AC%E3%83%BCcb-ct3" class="hash-link" aria-label="ケーブルトレー（CB-CT3） への直接リンク" title="ケーブルトレー（CB-CT3） への直接リンク">​</a></h2>
<p>電動昇降式デスクを買ったら確実に問題になるのはケーブル類だ。</p>
<p>私の場合、ディスプレイ2台に、マイク、USB充電器、USBハブ、キーボードなどがあるため、机の下部がどうしてもケーブルだらけになってしまう。これを解決するために、クランプ式のケーブルトレーを使っている。サンワサプライのケーブルトレーはFlexiSpotと非常に良い組合せで収まるのでおすすめだ。</p>
<p><a href="https://www.sanwa.co.jp/product/syohin?code=CB-CT3" target="_blank" rel="noopener noreferrer">https://www.sanwa.co.jp/product/syohin?code=CB-CT3</a></p>
<p>このケーブルトレーを使うとゴテゴテとした電源系のケーブルを足元に散らかすのではなく、机の奥側の裏に収められるので、足元が落ち着いた感じになる。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="ディスプレイアームエルゴトロン">ディスプレイアーム（エルゴトロン）<a href="https://blog.satotaichi.info/working-area/#%E3%83%87%E3%82%A3%E3%82%B9%E3%83%97%E3%83%AC%E3%82%A4%E3%82%A2%E3%83%BC%E3%83%A0%E3%82%A8%E3%83%AB%E3%82%B4%E3%83%88%E3%83%AD%E3%83%B3" class="hash-link" aria-label="ディスプレイアーム（エルゴトロン） への直接リンク" title="ディスプレイアーム（エルゴトロン） への直接リンク">​</a></h2>
<p>良い机と椅子が揃ったら、次はディスプレイアームだ。ディスプレイアームを導入するとディスプレイの高さや配置の自由度が格段に向上する。特に二枚以上ディスプレイを使うならディスプレイアームの利用を強く推奨する。</p>
<p>ディスプレイの高さや傾きは細かく調整することで眼精疲労や肩こりが低減するので、納得いくまで調整できるようにすべきだ。ディスプレイとキーボードとマウスの位置関係に妥協はない。</p>
<p>ディスプレイアームは、安価なものから高価なものまで色々あるが私が使っているのはエルゴトロンのディスプレイアームだ。最近のディスプレイはデカくて重いことが多いので高品質なものを使うのが望ましい。そういった意味でエルゴトロンは非常に信頼できる。</p>
<p><a href="https://www.amazon.co.jp/dp/B07Q8TJ2KL/" target="_blank" rel="noopener noreferrer">https://www.amazon.co.jp/dp/B07Q8TJ2KL/</a></p>
<h1>入力デバイス</h1>
<p>デスクワーカーにとってキーボードとマウスは自らの意思をコンピュータに伝えるためのデバイスである。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="左右分離型キーボードmistel-barocco-md770-jp">左右分離型キーボード（Mistel BAROCCO MD770 JP）<a href="https://blog.satotaichi.info/working-area/#%E5%B7%A6%E5%8F%B3%E5%88%86%E9%9B%A2%E5%9E%8B%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89mistel-barocco-md770-jp" class="hash-link" aria-label="左右分離型キーボード（Mistel BAROCCO MD770 JP） への直接リンク" title="左右分離型キーボード（Mistel BAROCCO MD770 JP） への直接リンク">​</a></h2>
<p>全てのテレワーカーは左右分離型のキーボードを使うべきだ。私はそう考えている。</p>
<p>とはいえ、日本では左右分離型のキーボードは商品としての立ち位置を確立できていない。</p>
<p>自作キーボード界隈では左右分離型のキーボードは非常によく見るが、仕事で使う道具として完全に信頼できるものにはなりえない。基盤はむき出しで埃がたまれば火事になる可能性はあるし、はんだ付けが甘ければ期待通りに動作しない。ユーザ自身でファームウェアを書き換える以上、そのソフトウェア品質はそれほど高いとは言えない。</p>
<p>製品として一定以上の品質水準にある左右分離型のキーボードはほとんどが海外製品でつまり英字配列だ。私は、もう30年JIS配列でキーボードを使い続けているので、ここから英字配列のキーボードに乗り換えるという気持ちはほとんどない。</p>
<p>そういうわけで、左右分離型のキーボードでかつきちんとした製品になっているJIS配列の左右分離型キーボードは極めて貴重なものだ。</p>
<p><a href="https://archisite.co.jp/products/mistel/barocco-md770-jp/" target="_blank" rel="noopener noreferrer">https://archisite.co.jp/products/mistel/barocco-md770-jp/</a></p>
<p>JISキーボードを使っていて、まだ左右分離型キーボードを持っていない人は、これを是非買ってみて欲しい。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="リストレストgenuine-wood-wrist-rest">リストレスト（Genuine Wood Wrist Rest）<a href="https://blog.satotaichi.info/working-area/#%E3%83%AA%E3%82%B9%E3%83%88%E3%83%AC%E3%82%B9%E3%83%88genuine-wood-wrist-rest" class="hash-link" aria-label="リストレスト（Genuine Wood Wrist Rest） への直接リンク" title="リストレスト（Genuine Wood Wrist Rest） への直接リンク">​</a></h2>
<p>キーボードを分割したら、それに合うリストレストを使うことで手首に対する負担を大きく低減できる。リストレストはモチっとした柔らかいものが好まれているように思うが、実は少しくらい固い方が良いんじゃないかと個人的には感じている。</p>
<p>科学的な根拠のある話ではないが、柔らかいリストレストは、接触面の負荷は低いぶん、それによって周りの筋肉や腱に余分な力がかかってしまうことで、総合すると効果がマイナスなのではないかと疑っている。</p>
<p>FILCOのGenuine Wood Wrist Restは天然木で作られたリストレストだ。これはプラスチックや金属ほど固くはないが、一方で緩衝材のような柔らかさがあるわけでもない。</p>
<p><a href="https://www.diatec.co.jp/shop/new/2003bunri/" target="_blank" rel="noopener noreferrer">https://www.diatec.co.jp/shop/new/2003bunri/</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="大型マウスパッドhv-mp855">大型マウスパッド（HV-MP855）<a href="https://blog.satotaichi.info/working-area/#%E5%A4%A7%E5%9E%8B%E3%83%9E%E3%82%A6%E3%82%B9%E3%83%91%E3%83%83%E3%83%89hv-mp855" class="hash-link" aria-label="大型マウスパッド（HV-MP855） への直接リンク" title="大型マウスパッド（HV-MP855） への直接リンク">​</a></h2>
<p>キーボードを分割したら、次はマウスをどこに置くかが問題になる。</p>
<p>胸をしっかり開くような形で分割キーボードを配置したらキーボードの真ん中がマウスをおけるような空間になる。</p>
<p>こうなったとき、どんなマウスパッドがいいだろうか。小さすぎるマウスパッドは使いづらいし、中途半端な大きさのマウスパッドはキーボードと干渉するので収まりが悪い。</p>
<p>こういう時は、思い切って大きなマウスパッドを使おう。具体的には幅が90cm以上あるようなやつだ。一般的にはFPSのユーザが好んで使っているようだが、マウスとキーボードを丸ごとマウスパッドの上に置いてしまえばおさまりの悪さなどというものは、そもそも関係なくなる。</p>
<p>そういうわけで、90cm x 40cmあるようなマウスパッドはおすすめだ。</p>
<p>大型のマウスパッドをいくつか買ってみたが、長期間使うには上下左右がきちんと縫い込まれていてほつれないようになっているものがいい。</p>
<p>マウスパッドは大体ゴム製品なので、使い始めてから数か月はちょっと甘いような匂いがするものだが、気になるなら何度か洗濯すると匂いが消える。つまり、ゴムの匂いが苦手なら洗濯可能な製品を選ぼう。</p>
<p>私はゴムの匂いが苦手なので匂いが弱くてかつ選択できるHavitのマウスパッドは非常に気に入って使っている。</p>
<p><a href="https://www.amazon.co.jp/dp/B01M18UR54" target="_blank" rel="noopener noreferrer">https://www.amazon.co.jp/dp/B01M18UR54</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="マウスmarathon-mouse-m705m">マウス（MARATHON MOUSE M705m）<a href="https://blog.satotaichi.info/working-area/#%E3%83%9E%E3%82%A6%E3%82%B9marathon-mouse-m705m" class="hash-link" aria-label="マウス（MARATHON MOUSE M705m） への直接リンク" title="マウス（MARATHON MOUSE M705m） への直接リンク">​</a></h2>
<p>突然だが、私はトラックボールが苦手だ。仕事で使う分にはあまり問題ないのだけども、マウスを激しく動かすようなタイプ（ハクスラとか、RTSとか、FPSアクションとか）のゲームをする際には、トラックボールだと期待した速度で操作できなくてイライラする。</p>
<p>この数年間は、色んなマウスを試してみたが結局はいつもm705に戻って来てしまう。このマウスを私が使い続ける理由は３つだ。まず、手の中にうまく収まること。私は主に右手でマウスを操作しているが、右手と左手で握手したって、こんなに収まり良くはない。</p>
<p>そして、高速スクロール機能だ。マウス中央にあるボタンをカチっと押すとスクロールホイールが高速に回転するようになる。大量のソースコードやドキュメントをレビューする際には、この高速スクロール無しには業務が成り立たないと言える。</p>
<p>最後は、バッテリーの持ちが異様にいい事だ。今は相当回数充電してヘタったエネループプロでマウスを動かしているが、前回いつ充電したのか思い出せない。少なくとも直近2, 3か月は電池を入れ替えた覚えが無い。アルカリ乾電池なら、半年や一年は電池を交換する必要が無いのだ。なお、前回買った時には、電池より先にマウス本体の調子が悪くなったくらいだ。</p>
<p><a href="https://www.logicool.co.jp/ja-jp/products/mice/m705m-wireless-mouse.910-005303.html" target="_blank" rel="noopener noreferrer">https://www.logicool.co.jp/ja-jp/products/mice/m705m-wireless-mouse.910-005303.html</a></p>
<h1>音源</h1>
<p>リモートワークで高度な仕事を実現するには、高品質なリモートミーティングが重要だ。</p>
<p>特にマイクとイヤホンの品質が低いと会議における最低限の部分が満たされないので、会議の質が悪くなり易い。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="骨伝導式イヤホンaftershokz-aeropex">骨伝導式イヤホン（AfterShokz Aeropex）<a href="https://blog.satotaichi.info/working-area/#%E9%AA%A8%E4%BC%9D%E5%B0%8E%E5%BC%8F%E3%82%A4%E3%83%A4%E3%83%9B%E3%83%B3aftershokz-aeropex" class="hash-link" aria-label="骨伝導式イヤホン（AfterShokz Aeropex） への直接リンク" title="骨伝導式イヤホン（AfterShokz Aeropex） への直接リンク">​</a></h2>
<p>私は基本的に電話が嫌いで、その理由は耳をふさいでそこから音を出していると、ほんの2，3時間で酷い頭痛に襲われ何も出来なくなってしまうからだ。</p>
<p>また、密閉性の高いヘッドフォンをしていると、周りの音が聞こえなくなるので、自宅のインターフォンが鳴っていることに気が付かなかったりする。インターフォン程度なら良いが、自宅の周りで何か事件や事故が起きていることに気が付かないようなことは避けたい。</p>
<p>Shokz（私が買った時はAfterShokzだった）の骨伝導イヤホンは、こういった私のニーズを適切に満たしてくれる製品だ。骨伝導イヤホンなので大きな音を出さずとも聞こえるし、耳の穴をふさがないので、周囲の音もちゃんと聞こえる。2台の機器にBluetooth接続できるのでスマホとPCにペアリングして使っている。</p>
<p>私が使っているのはAeropexだが公式には販売終了済</p>
<p><a href="https://jp.shokz.com/products/aeropex" target="_blank" rel="noopener noreferrer">https://jp.shokz.com/products/aeropex</a></p>
<p>しかし、Amazonではまだ買える。</p>
<p><a href="https://www.amazon.co.jp/dp/B07RQLTFJ5/" target="_blank" rel="noopener noreferrer">https://www.amazon.co.jp/dp/B07RQLTFJ5/</a></p>
<p>マイクとセットになっているOpenCommはずっと気になっているものの、Aeropexが不調にならないので使ってはいない。</p>
<p><a href="https://jp.shokz.com/products/opencommuc" target="_blank" rel="noopener noreferrer">https://jp.shokz.com/products/opencommuc</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="ダイナミックマイク">ダイナミックマイク<a href="https://blog.satotaichi.info/working-area/#%E3%83%80%E3%82%A4%E3%83%8A%E3%83%9F%E3%83%83%E3%82%AF%E3%83%9E%E3%82%A4%E3%82%AF" class="hash-link" aria-label="ダイナミックマイク への直接リンク" title="ダイナミックマイク への直接リンク">​</a></h2>
<p>イヤホンと対になる道具がマイクだ。</p>
<p>マイクには、自分の声はきっちり拾ってミーティング参加者に伝える一方で、自宅に溢れるノイズは拾わないようにしてもらいたい。USB接続できるコンデンサマイクは、数万円するaudio-technicaやRODEのマイクを試してみたが、どちらも期待するようには動作しなかった。</p>
<p>結局、期待するような動作をしてくれたのは1500円で買えるダイナミックマイクだった。量産効果万歳。</p>
<p><a href="https://www.amazon.co.jp/gp/product/B07PNMRBJS" target="_blank" rel="noopener noreferrer">https://www.amazon.co.jp/gp/product/B07PNMRBJS</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="オーディオインターフェースevo-4">オーディオインターフェース（evo 4）<a href="https://blog.satotaichi.info/working-area/#%E3%82%AA%E3%83%BC%E3%83%87%E3%82%A3%E3%82%AA%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9evo-4" class="hash-link" aria-label="オーディオインターフェース（evo 4） への直接リンク" title="オーディオインターフェース（evo 4） への直接リンク">​</a></h2>
<p>ダイナミックマイクの多くはXLR接続なのでPCに直接は接続できない。つまり、PCとマイクの間に専用の機器を置くことになる。というわけで、オーディオインターフェースを買う必要がある。</p>
<p>オーディオインターフェースは、マイクに比べると少し高額なものが多い。私が使っているのはEvo4というUSB接続するだけでカジュアルに使えるものだ。</p>
<p><a href="https://allaccess.co.jp/audient/evo4/" target="_blank" rel="noopener noreferrer">https://allaccess.co.jp/audient/evo4/</a></p>
<p>evo 4は熱意をもっておススメできるというほどではない。もう少しオーディオ初心者でも使い易い構造で安価なものがあるように思う。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="マイクスタンド">マイクスタンド<a href="https://blog.satotaichi.info/working-area/#%E3%83%9E%E3%82%A4%E3%82%AF%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%89" class="hash-link" aria-label="マイクスタンド への直接リンク" title="マイクスタンド への直接リンク">​</a></h2>
<p>マイクと自分の口の距離は近ければ近いほどいい。しかし、一日中ミーティングしているわけではないので、使っていない時は横にどかしておきたい。そういう要望をかなえてくれるのがマイクブームだ。関節がいくつかあってクランプ式のものを選べばFlexiSpotの良い感じの場所に挟んで使えるだろう。私が使っているのはAmazonで買える非常に安価なものだ。消耗品のつもりで買ったが2年以上元気に使えている。</p>
<p><a href="https://www.amazon.co.jp/gp/product/B07F588GVF" target="_blank" rel="noopener noreferrer">https://www.amazon.co.jp/gp/product/B07F588GVF</a></p>
<h1>電源</h1>
<p>ソフトウェアエンジニアは電源と共にあるものだ。良い電源は良い仕事につながる。</p>
<p>私が使っている電源に関連する製品をいくつか紹介しよう。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="充電池エネループプロ">充電池（エネループ　プロ）<a href="https://blog.satotaichi.info/working-area/#%E5%85%85%E9%9B%BB%E6%B1%A0%E3%82%A8%E3%83%8D%E3%83%AB%E3%83%BC%E3%83%97%E3%83%97%E3%83%AD" class="hash-link" aria-label="充電池（エネループ　プロ） への直接リンク" title="充電池（エネループ　プロ） への直接リンク">​</a></h2>
<p>まずは充電池だ。電池を使う機器にはほぼ、エネループ プロを入れて使っている。例えば、マウスやゲームのコントローラがこれにあたる。</p>
<p>こいつは物理的な大きさは他の電池と同じだが容量が大きいので交換の頻度を下げられるので気に入っている。</p>
<p><a href="https://panasonic.jp/battery/charge/p-db/BK-3HCD2C.html" target="_blank" rel="noopener noreferrer">https://panasonic.jp/battery/charge/p-db/BK-3HCD2C.html</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="卓上充電器anker-powerport-atom-iii-slim">卓上充電器（Anker PowerPort Atom III Slim）<a href="https://blog.satotaichi.info/working-area/#%E5%8D%93%E4%B8%8A%E5%85%85%E9%9B%BB%E5%99%A8anker-powerport-atom-iii-slim" class="hash-link" aria-label="卓上充電器（Anker PowerPort Atom III Slim） への直接リンク" title="卓上充電器（Anker PowerPort Atom III Slim） への直接リンク">​</a></h2>
<p>スマホを始めとしたガジェットの類はバッテリーを内蔵しているものが多いので、机の上に置いてある最中は充電しておくとよい。私が気に入って使っている高速充電器はAnkerのものだ。</p>
<p><a href="https://www.ankerjapan.com/collections/charger/products/a2045" target="_blank" rel="noopener noreferrer">https://www.ankerjapan.com/collections/charger/products/a2045</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="無停電電源装置apc-rs-550va">無停電電源装置（APC RS 550VA）<a href="https://blog.satotaichi.info/working-area/#%E7%84%A1%E5%81%9C%E9%9B%BB%E9%9B%BB%E6%BA%90%E8%A3%85%E7%BD%AEapc-rs-550va" class="hash-link" aria-label="無停電電源装置（APC RS 550VA） への直接リンク" title="無停電電源装置（APC RS 550VA） への直接リンク">​</a></h2>
<p>この冬は寒い。そして電力が不足している。皆さんは家庭に届いている電圧がちょいちょい100Vを下回っていることに気が付いているだろうか。場合によっては、計画停電なんてこともあるかもしれない。</p>
<p>そうでなくても、最近のGPUは滅茶苦茶電力を食うので、ゲームしながらエアコンやヒーターに電源を入れた途端にうっかりブレーカーが落ちることもあるだろう（実際、私はそうやってブレーカーを何度か落とした）。</p>
<p>大抵の電子機器はちゃんとしたコンデンサを積んでいるので少々の電源断で壊れたりはしない筈だが、パソコンだけはそういうわけにもいかない。ブレーカーが落ちた後にPCをシャットダウンするだけの時間を稼ぐためにUPSを置こう。</p>
<p>APCのUPSならPowerChuteという電源管理用のソフトウェアが付いてくるのでシャットダウンも自動化できる。</p>
<p><a href="https://www.apc.com/jp/ja/product/BR550S-JP/apc-rs-550va-sinewave-battery-backup-100v/" target="_blank" rel="noopener noreferrer">https://www.apc.com/jp/ja/product/BR550S-JP/apc-rs-550va-sinewave-battery-backup-100v/</a></p>
<h1>その他おまけ</h1>
<p>今年は寅年だったのでネピアのパッケージが本当に最高だった。Amazonの購入履歴によると、11回買っているので、ほぼ毎月買っているようだ。</p>
<p>ネピア 鼻セレブ ティシュ 400枚(200組)x3箱 ネコ科動物パッケージ</p>
<p><a href="https://www.amazon.co.jp/dp/B09N33KMKZ" target="_blank" rel="noopener noreferrer">https://www.amazon.co.jp/dp/B09N33KMKZ</a></p>
<h1>まとめ</h1>
<p>以上が、私が自宅に作りこんだ環境だ。気になることや、もっと良いものがあるという方は、是非教えて欲しい。</p>
<p>テレワーク環境をより良くしたいと考える読者の皆さんに少しでもお役に立てれば幸いだ。</p>]]></content>
        <author>
            <name>Sato Taichi</name>
            <uri>https://github.com/taichi</uri>
        </author>
        <category label="opinion" term="opinion"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[冷凍食品でウキウキ引きこもり生活]]></title>
        <id>https://blog.satotaichi.info/frozen-food-for-a-joyful-Life/</id>
        <link href="https://blog.satotaichi.info/frozen-food-for-a-joyful-Life/"/>
        <updated>2021-12-11T18:44:57.000Z</updated>
        <summary type="html"><![CDATA[このエントリーは pyspa Advent Calendar 2021 の 13 日目の記事である。]]></summary>
        <content type="html"><![CDATA[<p>このエントリーは <a href="https://adventar.org/calendars/6234" target="_blank" rel="noopener noreferrer">pyspa Advent Calendar 2021</a> の 13 日目の記事である。</p>
<p>昨日は @drillbits の「<a href="https://neji.me/posts/pyspa-adventcalendar-2021/" target="_blank" rel="noopener noreferrer">作業用 BGM オブジイヤー 2021</a>」だ。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="はじめに">はじめに<a href="https://blog.satotaichi.info/frozen-food-for-a-joyful-Life/#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB" class="hash-link" aria-label="はじめに への直接リンク" title="はじめに への直接リンク">​</a></h2>
<p>みなさんは、新型コロナ感染症の蔓延による日々の外出が強く制限される生活には、もう慣れただろうか。</p>
<p>僕自身は、元々引きこもりがちで何か理由がない限りは家から出たくないタイプの人間なので、この世の春を謳歌している。</p>
<p>僕が所属する会社は、この状況に対して極めて柔軟に対応してくれているので、両手で収まる程度しか会社に出社せずに済んでいて、ほぼフルリモート生活である。ありがたいことだ。</p>
<p>とはいえ、引きこもり生活において一切の不自由がないとは言い難い。</p>
<p>以前は、腹が減ったら気ままに家から出て飲食店に入ったりしていたものだが、今はそういうわけにはいかない。</p>
<p>勿論、調子がいい日は真面目に飯を作って食うわけだが、一年中調子が良いってわけにはいかないだろう。</p>
<p>何せ MtG の新しい拡張は三ケ月に一回は発売されるし、Steam には毎月のように面白そうなゲームが発売される。既に買ったゲームの拡張がでることもある。</p>
<p>Kindle ストアには僕がまだ読んでない漫画がいくらでも並んでいる。そうそう Netflix に見たい動画が沢山あるけど、どれも手を付けられてない。</p>
<p>たまには仕事が立て込んだりもする。</p>
<p>そういうわけで、手軽に飯を食いたいと考える日は多い。</p>
<p>このエントリでは、手軽な食事として最近活用している冷凍食品のデリバリーサービスをいくつか紹介しようと考えている。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="旬をすぐに"><a href="https://shunsugu.jp/" target="_blank" rel="noopener noreferrer">旬をすぐに</a><a href="https://blog.satotaichi.info/frozen-food-for-a-joyful-Life/#%E6%97%AC%E3%82%92%E3%81%99%E3%81%90%E3%81%AB" class="hash-link" aria-label="旬をすぐに への直接リンク" title="旬をすぐに への直接リンク">​</a></h2>
<p>うちでは旬すぐさんと呼んで定期的に利用している。</p>
<p>旬すぐさんを利用する理由の根本的な部分は安価であることだ。つまり、過度な品質を期待してはいない。</p>
<p>とはいえ、食事として満足できるくらいの味ではあるので、月に一回程度は発注している。</p>
<p>そして、旬すぐさんには明確にハズレがある。そう、旬すぐさんを使うにはいくつか抑えるべきポイントがあり、それを外すと酷いものがくるのだ。</p>
<p>まず、揚げ物類は絶対にダメだ。恐らくこれは冷凍食品というものが揚げ物と相性が悪すぎるということであって、旬すぐさんだけの問題ではないのだろう。</p>
<p>次に、「～～丼」のようなおかずとごはんが合成された状態でパッケージされているものもダメだ。話にならない。</p>
<p>最後に、「～～汁」や「～～スープ」のような汁ものを頼むのもご法度だ。具の少ない何か残念なものが届く。ガッカリしたくなければ頼まないことだ。</p>
<p>どうしても汁ものが飲みたければ、フリーズドライのスープを Amazon で箱買いすべきである。</p>
<p>細かいのが色々入ってるセットは楽しいがおススメはしない。</p>
<p>何が自分に合ってるのか探すには色々食べられるのでいい。しかし、冷凍庫の中でかさばる。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="旬すぐさん攻略の鍵">旬すぐさん攻略の鍵<a href="https://blog.satotaichi.info/frozen-food-for-a-joyful-Life/#%E6%97%AC%E3%81%99%E3%81%90%E3%81%95%E3%82%93%E6%94%BB%E7%95%A5%E3%81%AE%E9%8D%B5" class="hash-link" aria-label="旬すぐさん攻略の鍵 への直接リンク" title="旬すぐさん攻略の鍵 への直接リンク">​</a></h3>
<p>旬すぐさんで注文すべきは肉団子系と煮込み系だ。鳥団子やハンバーグ、つみれや、もつ煮込み、そういったものを頼むと外れない。</p>
<p>あと、指定時間通りに温めて綺麗に解凍される等と考えてはいけない。30 秒や 1 分程度指定時間より長めに温めることだ。肉団子や煮込みはそういうことをしても問題は起きない。</p>
<p>そして、商品を食うたびに忘れてはいけないことがある。「旬すぐチャンス」だ。これは 2 次元バーコードをアプリで読込み、ガチャを回し当たると白飯が無料で貰える。</p>
<p>「旬すぐチャンス」が付いている商品とそうでないものがあり、どういう基準でそれらが付与されているのか僕には分からないが見逃さないようにすることだ。</p>
<p>商品購入時には「旬すぐチャンス」が付いているかどうかは表示がある。ガチ勢の皆様におかれましては、狙っていくといい。</p>
<p>先ほど、丼系はおすすめしないと書いたが、単品の白飯は結構いい。特に無料で貰えることを考えれば十分な品質の白飯が届く。</p>
<p>とはいえ、白飯は炊き立てが旨いし、うちには炊飯器があり米を炊くことはそれほどの手間ではないので、旬すぐさんの白飯に直接金を払ったことはない。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="フライパンそうめん">フライパンそうめん<a href="https://blog.satotaichi.info/frozen-food-for-a-joyful-Life/#%E3%83%95%E3%83%A9%E3%82%A4%E3%83%91%E3%83%B3%E3%81%9D%E3%81%86%E3%82%81%E3%82%93" class="hash-link" aria-label="フライパンそうめん への直接リンク" title="フライパンそうめん への直接リンク">​</a></h3>
<p>今年かなりネットでバズっていたので、フライパンでそうめんを茹でる方法についてご存じの方は多いだろう。</p>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">そうめんはもう茹でないでください！！<br><br>深めのフライパンにお湯を沸騰させ、そうめんを入れて10秒だけかき混ぜたら火をすぐに止めてフタをするだけ。数分後にはちゃんとそうめんになっています！<br><br>沸騰させ続けるよりもヌメリが少なく、つるんと美味しい仕上がりに<br><br>何より、暑くないのが良いです！！ <a href="https://t.co/SvoO3zAYwX">pic.twitter.com/SvoO3zAYwX</a></p>— Swind/神凪唐州@作家・名古屋めし料理家・ライター (@swind_prv) <a href="https://twitter.com/swind_prv/status/1408297189156130816?ref_src=twsrc%5Etfw">June 25, 2021</a></blockquote>
<script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>この方式は本当に便利で再現性が高く旨いそうめんが食える。完全に最高。</p>
<p>そして、うちでは茹でたそうめんを水洗いした後に、温めた旬すぐさんをかけて食っている。これは手軽で滅茶苦茶旨い。</p>
<p>僕としては和風の鳥団子系をそうめんにのせるのが気に入っている。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="茹で野菜">茹で野菜<a href="https://blog.satotaichi.info/frozen-food-for-a-joyful-Life/#%E8%8C%B9%E3%81%A7%E9%87%8E%E8%8F%9C" class="hash-link" aria-label="茹で野菜 への直接リンク" title="茹で野菜 ��への直接リンク">​</a></h3>
<p>冷凍食品を食うくらいのメンタルだが野菜を茹でるくらいのパワーが残ってることはある。</p>
<p>そういう時は、一口大に切ったブロッコリーを雑に旬すぐさんに混ぜて食うと栄養バランスが大きく改善するのでおすすめだ。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="chefbox"><a href="https://chefbox.jp/" target="_blank" rel="noopener noreferrer">CHEFBOX</a><a href="https://blog.satotaichi.info/frozen-food-for-a-joyful-Life/#chefbox" class="hash-link" aria-label="chefbox への直接リンク" title="chefbox への直接リンク">​</a></h2>
<p>定期利用というかサブスクリプション契約して使っているのが CHEFBOX だ。</p>
<p>CHEFBOX は凄いサービスで、何が届くのかを具体的に指定できない。紙製の弁当箱の中に冷凍されたおかずと主食が入った状態で届く。</p>
<p>サービス契約する際に、苦手なものやアレルギー、飯部分をブロッコリーにするかどうかを指定できる程度である。</p>
<p>そうすると、定めた期間ごとに旨い冷凍の弁当が届く。</p>
<p>僕が CHEFBOX を食うのは、特に疲れ切っていたり、気になる事があったりして、飯について全く何も考えたくない時だ。</p>
<p>何も考えたくないが、旨いものは食いたい。そういう矛盾した精神状態というのが、僕には時々ある。みなさんには、そういうことは無いだろうか？</p>
<p>そういう時にカップラーメンを食ってしまうと立ち直れなくなってしまう。そうなってしまうと、人生について考え直すふりをしながら、何時間も口を半開きにして twitter で猫画像をファボり続けるような廃人が誕生することになる。</p>
<p>勿論、今の僕には CHEFBOX があり精神が安定的な状態なので twitter で猫をファボり始めても 30 分程度で満足して現実に戻ってこれるので問題ない。</p>
<p>要は CHEFBOX は旨い上に栄養バランスに優れているので、極めて高い満足が得られる。満足した腹を抱えて冷静になったところで、風呂に入り歯を磨いて布団で寝られる。</p>
<p>以前は、密閉されていない状態で届くのが不満だったが、パッケージが改善されて密閉された状態で届くようになった。</p>
<p>最初の届いた時の見栄えは、以前のパッケージが良かったように思うが、初回だけの話だ。継続的に頼むなら新しいパッケージの方が断然いい。</p>
<p>具体的にはこんなふうにパッケージされている。</p>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/package-4106112e4518302929f854ba4520e98d.jpg" width="2164" height="1475" class="img_ev3q"></p>
<p>で開くとこうなる。</p>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/contents-3ccb915ae61c9c9d3b2da26122ffe835.jpg" width="2183" height="1361" class="img_ev3q"></p>
<p>完全に旨い。飯の写真は無いが五穀米なので腹もちがよいので間食する頻度を低減できる。</p>
<p>不満があるとすれば、少し味付けが濃いことだ。とはいえ、カップラーメンほどの濃さがあるという訳ではなく完全に好みの問題だ。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="スターゼンカナダ産冷凍バラスライス"><a href="https://www.starzen.co.jp/product/product_detail/index.html?id=130" target="_blank" rel="noopener noreferrer">スターゼンカナダ産冷凍バラスライス</a><a href="https://blog.satotaichi.info/frozen-food-for-a-joyful-Life/#%E3%82%B9%E3%82%BF%E3%83%BC%E3%82%BC%E3%83%B3%E3%82%AB%E3%83%8A%E3%83%80%E7%94%A3%E5%86%B7%E5%87%8D%E3%83%90%E3%83%A9%E3%82%B9%E3%83%A9%E3%82%A4%E3%82%B9" class="hash-link" aria-label="スターゼンカナダ産冷凍バラスライス への直接リンク" title="スターゼンカナダ産冷凍バラスライス への直接リンク">​</a></h2>
<p>最後はピンポイントな商品の紹介だ。これは冷凍バラ肉を一切れずつ丸めてあるので、滅茶苦茶使い易い。</p>
<p>スライスの生肉を、ジップロックに入れて冷凍することが多いのだけども、この丸まった豚肉の便利さは是非みなさんに体験して欲しい。</p>
<p>鍋だろうが、炒め物だろうが、煮ものだろうが、雑に袋から食いたい量だけ出して使えるというのは非常に素晴らしい冷凍肉体験だ。</p>
<p>スライスされていて火が通り易いので調理前に電子レンジで解凍してから使う必要もない。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="まとめ">まとめ<a href="https://blog.satotaichi.info/frozen-food-for-a-joyful-Life/#%E3%81%BE%E3%81%A8%E3%82%81" class="hash-link" aria-label="まとめ への直接リンク" title="まとめ への直接リンク">​</a></h2>
<p>このエントリでは、日常使いの旬すぐと、ちょっといいものとして食べている CHEFBOX を紹介した。</p>
<p>オマケとして冷凍バラ肉も紹介したが、これはこれで実にいいものなので、このエントリを読んだ人は試してみて欲しい。</p>
<p>恐らく近所のスーパーで買えるだろう。</p>
<p>それでは、みなさま良い年末を。</p>]]></content>
        <author>
            <name>Sato Taichi</name>
            <uri>https://github.com/taichi</uri>
        </author>
        <category label="food" term="food"/>
        <category label="life" term="life"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[ブログをDocusaurusに移行した]]></title>
        <id>https://blog.satotaichi.info/docusaurus/</id>
        <link href="https://blog.satotaichi.info/docusaurus/"/>
        <updated>2021-10-05T10:48:41.000Z</updated>
        <summary type="html"><![CDATA[今まではHexoで実装していたブログをDocusaurusに変えてみた。]]></summary>
        <content type="html"><![CDATA[<p>今までは<a href="https://hexo.io/" target="_blank" rel="noopener noreferrer">Hexo</a>で実装していたブログを<a href="https://docusaurus.io/" target="_blank" rel="noopener noreferrer">Docusaurus</a>に変えてみた。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="docusaurus-とは">Docusaurus とは<a href="https://blog.satotaichi.info/docusaurus/#docusaurus-%E3%81%A8%E3%81%AF" class="hash-link" aria-label="Docusaurus とは への直接リンク" title="Docusaurus とは への直接リンク">​</a></h2>
<p><a href="https://docusaurus.io/" target="_blank" rel="noopener noreferrer">Docusaurus</a> は、Facebook がリリースしているソフトウェアやライブラリのランディングページ用静的サイトジェネレータだ。
React ベースで実装されていて、デフォルトのテーマが結構いい感じなのでリファレンスやマニュアルをホストするサイトでは使い易いと話題になることが多いので使ってみたくなった。
例えば、<a href="https://reactnative.dev/" target="_blank" rel="noopener noreferrer">React Native</a>や<a href="https://jestjs.io/" target="_blank" rel="noopener noreferrer">Jest</a>は<a href="https://docusaurus.io/" target="_blank" rel="noopener noreferrer">Docusaurus</a>でランディングページが実装されている。</p>
<p><a href="https://www.11ty.dev/" target="_blank" rel="noopener noreferrer">Eleventy</a>も少し試してみたが、機能性がプリミティブ過ぎて辛いので早々に諦めた。サイトのデザインを細部までこだわるなら Eleventy の方が良いだろう。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="良くなったこと">良くなったこと<a href="https://blog.satotaichi.info/docusaurus/#%E8%89%AF%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8" class="hash-link" aria-label="良くなったこと への直接リンク" title="良くなったこと への直接リンク">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="table-of-contents-が見やすくなった">Table Of Contents が見やすくなった<a href="https://blog.satotaichi.info/docusaurus/#table-of-contents-%E3%81%8C%E8%A6%8B%E3%82%84%E3%81%99%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9F" class="hash-link" aria-label="Table Of Contents が見やすくなった への直接リンク" title="Table Of Contents が見やすくなった への直接リンク">​</a></h3>
<p>右側のサイドメニューに見やすい形で TOC が表示されるようになったのには非常に満足している。
特に現在読んでいる部分の色が変わっていくのが特に気に入っている。</p>
<p>今までは、markdown ファイルの一部として TOC を書いていたので、一番先頭に TOC があるのみである程度スクロールしてしまうと TOC が見えなくなっていた。
モバイルで見ると TOC は表示されなくなってしまったが、そこはデメリットとして受け入れることにした。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="progressive-web-apps-に対応した">Progressive Web Apps に対応した<a href="https://blog.satotaichi.info/docusaurus/#progressive-web-apps-%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%97%E3%81%9F" class="hash-link" aria-label="Progressive Web Apps に対応した への直接リンク" title="Progressive Web Apps に対応した への直接リンク">​</a></h3>
<p><a href="https://docusaurus.io/" target="_blank" rel="noopener noreferrer">Docusaurus</a>では公式な PWA プラグインがリリースされているので非常に簡単に対応できた。</p>
<p><a href="https://hexo.io/" target="_blank" rel="noopener noreferrer">Hexo</a>にも<a href="https://github.com/lavas-project/hexo-pwa" target="_blank" rel="noopener noreferrer">hexo-pwa</a>があるので対応できる。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="code-ブロックにコピペ機能が付いた">Code ブロックにコピペ機能が付いた<a href="https://blog.satotaichi.info/docusaurus/#code-%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%81%AB%E3%82%B3%E3%83%94%E3%83%9A%E6%A9%9F%E8%83%BD%E3%81%8C%E4%BB%98%E3%81%84%E3%81%9F" class="hash-link" aria-label="Code ブロックにコピペ機能が付いた への直接リンク" title="Code ブロックにコピペ機能が付いた への直接リンク">​</a></h3>
<p>Code ブロックを書くだけで、そのコードのコピペができるようになったのは凄く便利だと感じている。</p>
<p>Code ブロックの上にマウスカーソルをホバーすると右上のあたりに<code>コピー</code>というボタンが表示されるので、押すとクリップボードにコードがコピーされる。</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Hello, World"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="失われたこと">失われたこと<a href="https://blog.satotaichi.info/docusaurus/#%E5%A4%B1%E3%82%8F%E3%82%8C%E3%81%9F%E3%81%93%E3%81%A8" class="hash-link" aria-label="失われたこと への直接リンク" title="失われたこと への直接リンク">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="amp-対応">AMP 対応<a href="https://blog.satotaichi.info/docusaurus/#amp-%E5%AF%BE%E5%BF%9C" class="hash-link" aria-label="AMP 対応 への直接リンク" title="AMP 対応 への直接リンク">​</a></h3>
<p><a href="https://hexo.io/" target="_blank" rel="noopener noreferrer">Hexo</a>には<a href="https://github.com/tea3/hexo-generator-amp" target="_blank" rel="noopener noreferrer">hexo-generator-amp</a>があるので簡単に AMP 対応できたが、<a href="https://docusaurus.io/" target="_blank" rel="noopener noreferrer">Docusaurus</a>にはそういう仕組みが無いので簡単には対応できない。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="関連エントリの表示機能">関連エントリの表示機能<a href="https://blog.satotaichi.info/docusaurus/#%E9%96%A2%E9%80%A3%E3%82%A8%E3%83%B3%E3%83%88%E3%83%AA%E3%81%AE%E8%A1%A8%E7%A4%BA%E6%A9%9F%E8%83%BD" class="hash-link" aria-label="関連エントリの表示機能 への直接リンク" title="関連エントリの表示機能 への直接リンク">​</a></h3>
<p><a href="https://hexo.io/" target="_blank" rel="noopener noreferrer">Hexo</a>には<a href="https://github.com/tea3/hexo-related-popular-posts" target="_blank" rel="noopener noreferrer">hexo-related-popular-posts</a>があるので簡単に関連エントリを出せたが、<a href="https://docusaurus.io/" target="_blank" rel="noopener noreferrer">Docusaurus</a>にはそういう仕組みが無いので簡単には対応できない。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="docusaurus-に対する不満">Docusaurus に対する不満<a href="https://blog.satotaichi.info/docusaurus/#docusaurus-%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8B%E4%B8%8D%E6%BA%80" class="hash-link" aria-label="Docusaurus に対する不満 への直接リンク" title="Docusaurus に対する不満 への直接リンク">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="infima-が扱いづらい">Infima が扱いづらい<a href="https://blog.satotaichi.info/docusaurus/#infima-%E3%81%8C%E6%89%B1%E3%81%84%E3%81%A5%E3%82%89%E3%81%84" class="hash-link" aria-label="Infima が扱いづらい への直接リンク" title="Infima が扱いづらい への直接リンク">​</a></h3>
<p><a href="https://docusaurus.io/" target="_blank" rel="noopener noreferrer">Docusaurus</a>が使っている<a href="https://infima.dev/" target="_blank" rel="noopener noreferrer">Infima</a>という CSS Framework は、正直かなり奇妙な動作をする。</p>
<p>例えば、Spacing の css として以下のようなものが定義されている。</p>
<div class="language-css codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-css codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token selector class" style="color:#00009f">.margin-top--none</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">margin-top</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token important">!important</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token selector class" style="color:#00009f">.margin-left--xs</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">margin-left</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.25</span><span class="token unit">rem</span><span class="token plain"> </span><span class="token important">!important</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token selector class" style="color:#00009f">.padding-vert--md</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">padding-top</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.5</span><span class="token unit">rem</span><span class="token plain"> </span><span class="token important">!important</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">padding-bottom</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.5</span><span class="token unit">rem</span><span class="token plain"> </span><span class="token important">!important</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token selector class" style="color:#00009f">.padding--lg</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">padding</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token unit">rem</span><span class="token plain"> </span><span class="token important">!important</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>詳細な仕様は <a href="https://infima.dev/docs/layout/spacing" target="_blank" rel="noopener noreferrer">Spacing</a> を確認して欲しいが、正直言って私には奇妙に感じる。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="モバイル対応でパフォーマンスが悪い">モバイル対応でパフォーマンスが悪い<a href="https://blog.satotaichi.info/docusaurus/#%E3%83%A2%E3%83%90%E3%82%A4%E3%83%AB%E5%AF%BE%E5%BF%9C%E3%81%A7%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9%E3%81%8C%E6%82%AA%E3%81%84" class="hash-link" aria-label="モバイル対応でパフォーマンスが悪い への直接リンク" title="モバイル対応でパフォーマンスが悪い への直接リンク">​</a></h3>
<p>React のランタイムがゴソっとダウンロードされるのでファーストページビューにかかる時間が非常に大きい。</p>
<p>単なる静的コンテンツを並べているだけのサイトで 600ms とかかかるのはやり過ぎ感は否めない。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="検証に使ったツール">検証に使ったツール<a href="https://blog.satotaichi.info/docusaurus/#%E6%A4%9C%E8%A8%BC%E3%81%AB%E4%BD%BF%E3%81%A3%E3%81%9F%E3%83%84%E3%83%BC%E3%83%AB" class="hash-link" aria-label="検証に使ったツール への直接リンク" title="検証に使ったツール への直接リンク">​</a></h2>
<p>新しくサイト構築をしたら最新のベストプラクティスに従った作りになっているかを検証するツールを使う。</p>
<p>今回は、この三つのツールを使ってみた。基本的には PageSpeed Insights だけ使えば良いと思う。</p>
<ul>
<li><a href="https://developers.google.com/speed/pagespeed/insights/" target="_blank" rel="noopener noreferrer">PageSpeed Insights</a></li>
<li><a href="https://www.webpagetest.org/" target="_blank" rel="noopener noreferrer">WebPageTest</a></li>
<li><a href="https://gtmetrix.com/" target="_blank" rel="noopener noreferrer">GTmetrix</a></li>
</ul>
<p>WebPageTest には CSP ヘッダがねぇぞって怒られるんだけども対応は諦めた。
Google Analytics を使ってる状態でちゃんと CSP ヘッダを使おうとすると nonce を付けないといけないが、そのためのサーバを用意したくなかった。</p>
<p>来世では頑張っていくという気持ちはある。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="まとめ">まとめ<a href="https://blog.satotaichi.info/docusaurus/#%E3%81%BE%E3%81%A8%E3%82%81" class="hash-link" aria-label="まとめ への直接リンク" title="まとめ への直接リンク">​</a></h2>
<p>ブログを書きたいなら、自前でブログサイトを実装するのではなく SaaS を何か使いましょう。</p>
<p>例えば、はてなブログとか、Medium とか、世の中色々ある。</p>
<p>自前でブログサイトを実装するのは手段が目的になるタイプの人間だけにおすすめしたい。</p>]]></content>
        <author>
            <name>Sato Taichi</name>
            <uri>https://github.com/taichi</uri>
        </author>
        <category label="docusaurus" term="docusaurus"/>
        <category label="react" term="react"/>
        <category label="javascript" term="javascript"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Train Supply Managerで始める列車自動運行]]></title>
        <id>https://blog.satotaichi.info/train-supply-manager-for-beginners/</id>
        <link href="https://blog.satotaichi.info/train-supply-manager-for-beginners/"/>
        <updated>2020-12-14T18:44:57.000Z</updated>
        <summary type="html"><![CDATA[このエントリーは pyspa Advent Calendar 2020 の 16 日目の記事です。昨日は @kumagi の「ブロックチェーンは攻撃手法で分類するとよい」でした。]]></summary>
        <content type="html"><![CDATA[<p>このエントリーは <a href="https://adventar.org/calendars/5310" target="_blank" rel="noopener noreferrer">pyspa Advent Calendar 2020</a> の 16 日目の記事です。昨日は @kumagi の「<a href="https://zenn.dev/kumagi/articles/7085fd11bbacf5" target="_blank" rel="noopener noreferrer">ブロックチェーンは攻撃手法で分類するとよい</a>」でした。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="はじめに">はじめに<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB" class="hash-link" aria-label="はじめに への直接リンク" title="はじめに への直接リンク">​</a></h2>
<p>皆さんこんにちは。世界は疫病に覆われ行動変容を余儀なくされていますが、いかがお過ごしですか？</p>
<p>私は元々引きこもり体質で、家からできる限り出たくないタイプの人間なので我が世の春を謳歌しています。</p>
<p>このエントリでは、私が今年一年かなりの時間を使ったゲームである Factorio を拡張して便利にしてくれる MOD の紹介をします。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="factorio">Factorio<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#factorio" class="hash-link" aria-label="Factorio への直接リンク" title="Factorio への直接リンク">​</a></h3>
<p>そもそも Factorio というゲームをご存じでしょうか？</p>
<p>Factorio は、SF 的な世界観のゲームです。ゲームは不時着した宇宙船の横に一人だけで佇む主人公がいる所から始まります。（オンラインマルチプレイもあります。）</p>
<p><img decoding="async" loading="lazy" alt="beginning of the game" src="https://blog.satotaichi.info/assets/images/begin-d0470181812eb99a5e9abede893d6efa.png" width="1117" height="684" class="img_ev3q"></p>
<p>この不時着した惑星では、何故か鉄や銅、石炭といった資源が地表面に露出しており簡単に鉱石として掘り出せるのです。</p>
<p>そうやって掘り出した鉱石を溶かして機材を作り、設備を作り、それらを組み合わせて最終的には母星に対して SOS を送るためのロケットを打ち上げる。</p>
<p>そんな巨大なシステムを運用するには自動化が必須です。そうです、Factorio は自動化するゲームなのです。</p>
<p>興味が沸いてきたら、公式 Wiki の<a href="https://wiki.factorio.com/Tutorial:Quick_start_guide/ja" target="_blank" rel="noopener noreferrer">クイックスタートガイド</a>を読んでみてください。</p>
<p>すぐにでも遊んでみたいという気持ちになったら、まずはデモ版があります。サイトは英語ですが日本語の UI で遊べますよ。</p>
<ul>
<li><a href="https://factorio.com/download" target="_blank" rel="noopener noreferrer">Factorio のダウンロードページ</a></li>
</ul>
<p>初心者がゆっくりやっても 50 時間くらいでロケットは打ちあがると思います。</p>
<p>もしこれが楽しいと感じられるなら、もう後は何百時間でも引きこもっていられるでしょう。</p>
<p>何故でしょうか？それは、とても成熟した MOD のサポートと、それを提供するコミュニティがあるからです。</p>
<p>特に大型 MOD と呼ばれるタイプのものは、ゲームを何段階も複雑にします。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="pymods">PyMods<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#pymods" class="hash-link" aria-label="PyMods への直接リンク" title="PyMods への直接リンク">​</a></h3>
<p>私は今、PyMods という一連の MOD をインストールして Factorio を遊んでいます。</p>
<p>この MOD は、Factorio をとてつもなく重厚長大にしてくれるものです。</p>
<p>どんな内容なのかは、以下のエントリを読むと雰囲気が掴めます。</p>
<ul>
<li><a href="https://note.com/osama/n/n3a83d2cdc439" target="_blank" rel="noopener noreferrer">Factorio - PyMods @ 2020-07-18</a></li>
</ul>
<p>少なくとも Factorio で一度以上はロケットを打ち上げたことが無いと何を言っているか全く分からないでしょう。</p>
<p>そして、今日紹介するのは、PyMods をやるようなプレイヤー向けの MOD です。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="train-supply-managertsm-とは何か">Train Supply Manager（TSM） とは何か？<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#train-supply-managertsm-%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B" class="hash-link" aria-label="Train Supply Manager（TSM） とは何か？ への直接リンク" title="Train Supply Manager（TSM） とは何か？ への直接リンク">​</a></h2>
<p>一言で言うと、Factorio における列車の運行制御を効率化するための MOD です。</p>
<p>列車の運行制御を効率化する MOD としては、<a href="https://mods.factorio.com/mods/Optera/LogisticTrainNetwork" target="_blank" rel="noopener noreferrer">LTN - Logistic Train Network</a>が有名です。</p>
<p>こちらは日本語での解説文書や、解説動画が沢山揃っているので、探せば情報をすぐに見つけられるでしょう。</p>
<p>このエントリで紹介する TSM は LTN に比べるとかなり新しい MOD でユーザ数が少ないためか、日本語での情報がほとんどありません。</p>
<p>前述の、PyMods を紹介している ossan が書いたエントリがほぼ唯一の文書と言っていい状況です。</p>
<ul>
<li><a href="https://note.com/osama/n/nd68eb6a72217" target="_blank" rel="noopener noreferrer">Factorio @ 2020-08-27</a>
<ul>
<li>TSM を選んだ理由が説明されているエントリ</li>
</ul>
</li>
<li><a href="https://note.com/osama/n/n45ddc98fca5b" target="_blank" rel="noopener noreferrer">Factorio - Train Supply Manager (TSM) @ 2020-09-04</a>
<ul>
<li>TSM の使い方を説明したエントリ。ちょっと分かりづらい。</li>
</ul>
</li>
</ul>
<p>このエントリでは、私が TSM を理解する過程で ossan の説明では分かりづらかった部分や誤解した部分を再構成して説明します。</p>
<p>TSM を理解するにあたって、私が一番に誤解していたポイントは、Train Supply Manager の Supply が何を指すか？です。</p>
<p>これを、当初私は貨物列車に積載された資源を Supply するのだと勘違いしていました。</p>
<p>しかし、TSM はそのように動作しません。TSM が Supply するのはあくまでも Train つまり列車です。</p>
<p>そして、TSM は列車の停車駅および、そこでの待機条件を自動的に挿入したり削除したりするだけの MOD です。</p>
<p>これが、LTN との根本的な違いであり、TSM の動作が LTN に比べて軽い理由です。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="tsm-の使い方">TSM の使い方<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#tsm-%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9" class="hash-link" aria-label="TSM の使い方 への直接リンク" title="TSM の使い方 への直接リンク">​</a></h2>
<p>ここからは、TSM の使い方を説明します。ここでは、Factorio において鉄道を使いたくなる典型的な状況に沿って説明します。</p>
<p>ちなみに、Factorio で TSM を使い始めるには MOD としてインストールした後に、ゲーム内で TSM というテクノロジーを研究してください。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="tsm-の典型的な利用状況">TSM の典型的な利用状況<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#tsm-%E3%81%AE%E5%85%B8%E5%9E%8B%E7%9A%84%E3%81%AA%E5%88%A9%E7%94%A8%E7%8A%B6%E6%B3%81" class="hash-link" aria-label="TSM の典型的な利用状況 への直接リンク" title="TSM の典型的な利用状況 への直接リンク">​</a></h3>
<p>資源の採掘地と消費地が離れており、消費地では常に資源が要るわけではない、という状況です。</p>
<p>この状況では、列車は待機用の駅で出荷を待ちます。とは言え、大抵の場合に出荷すべき資源は溢れているので待機時間は限りなくゼロに近いでしょう。</p>
<p>待機駅にいる列車は、資源を出荷したい駅に移動して鉱石などの資材を積み込みます。</p>
<p>その後、当該資源を要求されるまで別な待機用の駅で待つことになります。資源を満載して待っている列車は、消費地から呼び出されればすぐにそこへ向かって移動していきます。</p>
<p>まずは、駅の配置を全景しておきましょう。5 つの駅が配置されていますね。</p>
<p><img decoding="async" loading="lazy" alt="all maps" src="https://blog.satotaichi.info/assets/images/all_maps-b1b52edd4ec4e75f1a11ad7d2fc7b0fd.png" width="1474" height="664" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="駅の配置">駅の配置<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#%E9%A7%85%E3%81%AE%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="駅の配置 への直接リンク" title="駅の配置 への直接リンク">​</a></h3>
<p>TSM は列車の運行制御を行う MOD なので駅の配置から始めます。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="空の列車用-supplier-train-stop-の設置">空の列車用 Supplier Train Stop の設置<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#%E7%A9%BA%E3%81%AE%E5%88%97%E8%BB%8A%E7%94%A8-supplier-train-stop-%E3%81%AE%E8%A8%AD%E7%BD%AE" class="hash-link" aria-label="空の列車用 Supplier Train Stop の設置 への直接リンク" title="空の列車用 Supplier Train Stop の設置 への直接リンク">​</a></h4>
<p>貨物を何も積載していない列車が停車する駅を配置します。地図上では、中央上部で EmptySupplier と表示されています。</p>
<p><img decoding="async" loading="lazy" alt="empty supplier" src="https://blog.satotaichi.info/assets/images/empty_supplier-2a70321c49e5b52afa5916f0b36279bb.png" width="1249" height="432" class="img_ev3q"></p>
<p>大きく<code>S</code>の字が刻印されている Supplier Train Stop を設置しましょう。</p>
<p>TSM において要求待ちをする列車が停車する駅が Supplier Train Stop です。これは、TSM 独自のオブジェクトです。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="出荷用-requester-train-stop-の設置">出荷用 Requester Train Stop の設置<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#%E5%87%BA%E8%8D%B7%E7%94%A8-requester-train-stop-%E3%81%AE%E8%A8%AD%E7%BD%AE" class="hash-link" aria-label="出荷用 Requester Train Stop の設置 への直接リンク" title="出荷用 Requester Train Stop の設置 への直接リンク">​</a></h4>
<p>次は、貨物を積載するために列車が停車する駅を配置します。地図上では、右側で IronProvider と表示されています。</p>
<p><img decoding="async" loading="lazy" alt="iron provider" src="https://blog.satotaichi.info/assets/images/iron_provider-6670f4e44be998b65867eef56de4e7fe.png" width="1084" height="883" class="img_ev3q"></p>
<p>大きく <code>R</code> の字が刻印されている Requester Train Stop を配置します。これは、TSM 独自のオブジェクトです。</p>
<p>加えて Requester Train Stop の隣に Train Requester を配置します。ランプのような見た目をしていますが、これは、TSM 独自のオブジェクトです。</p>
<p><img decoding="async" loading="lazy" alt="train requester" src="https://blog.satotaichi.info/assets/images/train_requester-ab750fc160df82d9f0c1bab9e404b8f3.png" width="970" height="447" class="img_ev3q"></p>
<p>そして Train Requester の隣に Decider combinator （条件回路）を配置します。このオブジェクトは Factorio に標準搭載されているものです。</p>
<p><img decoding="async" loading="lazy" alt="decider combinator" src="https://blog.satotaichi.info/assets/images/train_decider_combinator-e28b0fecbf8a5d2059e907f6993893a9.png" width="877" height="493" class="img_ev3q"></p>
<p>Train Requester と Decider combinator を配置したら、それらと駅をケーブルで接続します。</p>
<p><img decoding="async" loading="lazy" alt="train signal networks" src="https://blog.satotaichi.info/assets/images/train_connect_to_station-6ece2aeb5634e7f6895c1c7a36fc191a.png" width="630" height="625" class="img_ev3q"></p>
<p>列車に積み込みたい貨物が入った箱と Decider combinator もケーブルで接続しましょう。</p>
<p><img decoding="async" loading="lazy" alt="train signal networks with box" src="https://blog.satotaichi.info/assets/images/train_connect_to_box-1d38d81288a0b750dee09bed7ec9834d.png" width="637" height="697" class="img_ev3q"></p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="出荷用-requester-train-stop-における信号制御">出荷用 Requester Train Stop における信号制御<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#%E5%87%BA%E8%8D%B7%E7%94%A8-requester-train-stop-%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E4%BF%A1%E5%8F%B7%E5%88%B6%E5%BE%A1" class="hash-link" aria-label="出荷用 Requester Train Stop における信号制御 への直接リンク" title="出荷用 Requester Train Stop における信号制御 への直接リンク">​</a></h4>
<p>Requester Train Stop における回路ネットワークを構成したので、次はそれらを流れる信号制御を設定します。</p>
<p>まずは、Decider combinator をクリックして信号制御のダイアログを表示します。</p>
<p><img decoding="async" loading="lazy" alt="configure decider combinator" src="https://blog.satotaichi.info/assets/images/signal_from_box_pre-85e9d1a16f63e5c12b0df089ac528392.png" width="589" height="628" class="img_ev3q"></p>
<p>ここでは、iron ore が 1000 個より多く箱に入っている場合に、緑のチェックシグナルを送出し続けると設定しています。</p>
<p>条件式における不等号の向きに注意してください。</p>
<p><img decoding="async" loading="lazy" alt="signal conditions" src="https://blog.satotaichi.info/assets/images/signal_from_box-642c79f74136db2d8756ee84d79e48cf.png" width="634" height="642" class="img_ev3q"></p>
<p>次は、Train Requester をクリックして信号制御のダイアログを表示します。</p>
<p><img decoding="async" loading="lazy" alt="configure train requester" src="https://blog.satotaichi.info/assets/images/signal_from_requester_pre-aea886bc8fa35224256f19db37909a1d.png" width="523" height="310" class="img_ev3q"></p>
<p>ここでは、緑のチェックシグナルが入力されたら列車を要求する信号を送出すると設定しています。</p>
<p>条件式における列車アイコンと緑のチェックシグナルの位置に注意してください。列車アイコンが左辺です。</p>
<p><img decoding="async" loading="lazy" alt="circuit connection" src="https://blog.satotaichi.info/assets/images/signal_from_requester-824cda691b61ca5c23ad5180315885ab.png" width="517" height="516" class="img_ev3q"></p>
<p>これで、EmptySupplier に待機している列車を IronProvider に要求する準備ができました。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="荷物を積載した列車用-supplier-train-stop-の設置">荷物を積載した列車用 Supplier Train Stop の設置<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#%E8%8D%B7%E7%89%A9%E3%82%92%E7%A9%8D%E8%BC%89%E3%81%97%E3%81%9F%E5%88%97%E8%BB%8A%E7%94%A8-supplier-train-stop-%E3%81%AE%E8%A8%AD%E7%BD%AE" class="hash-link" aria-label="荷物を積載した列車用 Supplier Train Stop の設置 への直接リンク" title="荷物を積載した列車用 Supplier Train Stop の設置 への直接リンク">​</a></h4>
<p>IronProvider で貨物が積載された列車が停車して、その貨物を消費したい駅からの要求待ちをする駅を配置します。地図上では、中央下部で FullSupplier と表示されています。</p>
<p><img decoding="async" loading="lazy" alt="full supplier" src="https://blog.satotaichi.info/assets/images/full_supplier-2e7214c9b04cdfed0bf04c10659bbf2f.png" width="1449" height="529" class="img_ev3q"></p>
<p>大きく<code>S</code>の字が刻印されている Supplier Train Stop を設置します。</p>
<p>TSM では、このように荷物が積載された列車が待機するので、要求に対して迅速に応答できるのです。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="荷下ろし用-requester-train-stop-の設置">荷下ろし用 Requester Train Stop の設置<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#%E8%8D%B7%E4%B8%8B%E3%82%8D%E3%81%97%E7%94%A8-requester-train-stop-%E3%81%AE%E8%A8%AD%E7%BD%AE" class="hash-link" aria-label="荷下ろし用 Requester Train Stop の設置 への直接リンク" title="��荷下ろし用 Requester Train Stop の設置 への直接リンク">​</a></h4>
<p>最後は、貨物の消費地を設置します。地図上では、左側で IronConsumer と表示されています。</p>
<p><img decoding="async" loading="lazy" alt="iron consumer" src="https://blog.satotaichi.info/assets/images/iron_consumer-712cd15868b06715bc907073ff8154ad.png" width="906" height="576" class="img_ev3q"></p>
<p>大きく <code>R</code> の字が刻印されている Requester Train Stop を配置します。</p>
<p>この例では、分かりやすさのために、供給用車両が待機している駅と消費地の駅を 1:1 で対応させています。</p>
<p>実際の運用では Supplier Train Stop 1 つに対して Requester Train Stop を複数設置できますし、その逆も可能です。</p>
<p>このように列車を必要に応じて行ったり来たりさせるような設定を自動的に行うことが TSM の主たる機能です。</p>
<p>荷下ろし用の Requester Train Stop でも、Train Requester と Decider combinator を配置しケーブルで接続します。</p>
<p><img decoding="async" loading="lazy" alt="train signal networks with box" src="https://blog.satotaichi.info/assets/images/consumer_signal_networks_with_box-5485192720f71f95a02b31b136f65756.png" width="508" height="832" class="img_ev3q"></p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="荷下ろし用-requester-train-stop-における信号制御">荷下ろし用 Requester Train Stop における信号制御<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#%E8%8D%B7%E4%B8%8B%E3%82%8D%E3%81%97%E7%94%A8-requester-train-stop-%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E4%BF%A1%E5%8F%B7%E5%88%B6%E5%BE%A1" class="hash-link" aria-label="荷下ろし用 Requester Train Stop における信号制御 への直接リンク" title="荷下ろし用 Requester Train Stop における信号制御 への直接リンク">​</a></h4>
<p>荷下ろし用の Requester Train Stop でも信号制御を設定します。</p>
<p>まずは、Decider combinator の設定をしましょう。</p>
<p>ここでは、箱の中に入ってる iron ore が 200 個を下回ったら、緑のチェックシグナルを送出し続けると設定しています。</p>
<p>不等号の向きが出荷用の駅とは逆になっているので注意してください。
<img decoding="async" loading="lazy" alt="consumer decider combinator" src="https://blog.satotaichi.info/assets/images/consumer_signal_from_box-c7efa9d080299ef7617bca40e188d354.png" width="345" height="240" class="img_ev3q"></p>
<p>Train Requester の設定は出荷用の駅と同じです。</p>
<p><img decoding="async" loading="lazy" alt="consumer train requester" src="https://blog.satotaichi.info/assets/images/consumer_trainrequester_signal-cdaf18166382c65363339935d91b5b23.png" width="834" height="328" class="img_ev3q"></p>
<p>これで、FullSupplier に待機している列車を IronConsumer に要求する準備ができました。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="燃料補給用-train-stop-の設置">燃料補給用 Train Stop の設置<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#%E7%87%83%E6%96%99%E8%A3%9C%E7%B5%A6%E7%94%A8-train-stop-%E3%81%AE%E8%A8%AD%E7%BD%AE" class="hash-link" aria-label="燃料補給用 Train Stop の設置 への直接リンク" title="燃料補給用 Train Stop の設置 への直接リンク">​</a></h4>
<p>列車が走り続けるには、燃料の補給が必要です。</p>
<p>最初に列車を動かし始めるための燃料は手作業で充填しますが、その後は自動的に充填したいですよね。</p>
<p>それに対して、TSM では <code>FuelStop1</code> という名前の Train Stop を設置すると、必要に応じて列車の巡回ルートの中に燃料補給駅を組込んでくれるのです。</p>
<p><img decoding="async" loading="lazy" alt="Fuel Stop" src="https://blog.satotaichi.info/assets/images/fuelstop1-06272388b62ca37e825aafd82289dcba.png" width="804" height="684" class="img_ev3q"></p>
<p>燃料補給の閾値を変えたいなら、Mod settings の Map タブに設定があります。</p>
<p>列車に充填されている燃料の数が、Minimum Refuelling Amount を下回ると燃料補給駅に停車します。</p>
<p><img decoding="async" loading="lazy" alt="minimum refuel amount" src="https://blog.satotaichi.info/assets/images/mod_settings-3f91af21519851265296be91a7685404.png" width="583" height="337" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="列車の巡回ルートを設定する">列車の巡回ルートを設定する<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#%E5%88%97%E8%BB%8A%E3%81%AE%E5%B7%A1%E5%9B%9E%E3%83%AB%E3%83%BC%E3%83%88%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B" class="hash-link" aria-label="列車の巡回ルートを設定する への直接リンク" title="列車の巡回ルートを設定する への直接リンク">​</a></h3>
<p>駅を配置したので、次は列車を配備しましょう。列車は、EmptySupplier より少し手前に配置するのがコツです。</p>
<p>列車をクリックすると巡回する駅の設定画面が表示されます。駅の設定画面における初期状態は何も設定されていません。</p>
<p><img decoding="async" loading="lazy" alt="empty train configurations" src="https://blog.satotaichi.info/assets/images/train_pre-85941f339f18041861669c1e5d966baa.png" width="840" height="520" class="img_ev3q"></p>
<p>これに対して、巡回させたい Supplier Train Stop を設定します。今回は、EmptySupplier と FullSupplier です。</p>
<p>これらの駅で列車がどう振舞うかは TSM が決めますので、最初の設定状態としては、それぞれの駅では列車が永久に停車するよう設定します。</p>
<p>ここでは、待機条件（wait condition）を Circuit で不特定の資源が 0 個未満である時、停車し続けるという風に設定しています。</p>
<p>プログラミングなら、<code>while(true){}</code>と書いているようなものですね。</p>
<p><img decoding="async" loading="lazy" alt="configure stations" src="https://blog.satotaichi.info/assets/images/train_stations-a599be38979142f82d369f34b0d9cbbc.png" width="757" height="601" class="img_ev3q"></p>
<p>この画像では、運行制御が Manual になっていますが自動運行を開始する際には燃料を充填したうえで Automatic にします。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="貨物積載待ち列車用の-supply-source-priorities-を設定する">貨物積載待ち列車用の Supply Source Priorities を設定する<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#%E8%B2%A8%E7%89%A9%E7%A9%8D%E8%BC%89%E5%BE%85%E3%81%A1%E5%88%97%E8%BB%8A%E7%94%A8%E3%81%AE-supply-source-priorities-%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B" class="hash-link" aria-label="貨物積載待ち列車用の Supply Source Priorities を設定する への直接リンク" title="貨物積載待ち列車用の Supply Source Priorities を設定する への直接リンク">​</a></h3>
<p>Supply Source Priorities とは、各 Supplier Train Stop に停車している列車の振る舞いを定義し、優先順位付けする設定項目です。</p>
<p>TSM の設定で最も複雑で難しい部分は、この Supply Source Priorities の設定です。これを理解して乗り切れば後は、自由自在に列車を自動運行できますよ。</p>
<p>ここからは、TSM 固有の UI を使って設定します。TSM のメニューを表示するには画面の右上あたりにある列車アイコンのボタンを押しましょう。</p>
<p><img decoding="async" loading="lazy" alt="supply source priorities menu" src="https://blog.satotaichi.info/assets/images/TSM_SupplySourcePriorities_menu-003a7d6c6809754635a2e60c501ecaef.png" width="510" height="190" class="img_ev3q"></p>
<p>TSM のメニューを表示したら、左から三番目にあるオレンジ色の上向き矢印をクリックして、Supply Source Priorities のダイアログを表示します。</p>
<p>ここでは、Resource と Id と Station List を設定します。</p>
<p><img decoding="async" loading="lazy" alt="supply source priorities" src="https://blog.satotaichi.info/assets/images/TSM_SupplySourcePriorities_pre-48903d0a701f2a1d5f5a507b6f1fa922.png" width="529" height="192" class="img_ev3q"></p>
<p>Resource には、Supplier Train Stop から発車した列車が Requester Train Stop で停車する際に参照する貨物の種類を設定します。ここでは、iron ore を設定しました。</p>
<p>Id には、Resource と組合せて Train Requester が、Supplier Train Stop を一意に識別するためのアイコンを設定します。ここでは、Empty を意味する<code>E</code> を設定しましたが、単に名前付けするための設定なので何でもいいです。</p>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/TSM_SupplySourcePriorities_set_icons-be6d3aef4d47cd281c087798452fa8b1.png" width="511" height="192" class="img_ev3q"></p>
<p>次は、StationList の<code>-- Select --</code> ボタンを押すと表示されるダイアログで Wait Conditions（待機条件）を設定していきます。</p>
<p>ここで設定できる条件は、どれか 1 つでも満たすと待機状態を終了する（<code>OR</code>）か、全てを満たすまで待機状態を継続する（<code>AND</code>）です。</p>
<p>二行目の Include は、貨車の状態が空（Empty）か満タン（Full）を条件にしたい時、チェックボックスを有効化します。</p>
<p>三行目の Inactivity は、設定された数値の期間列車に対して操作が行われないことを条件にしたい時、チェックボックスを有効化します。単位は秒です。</p>
<p>四行目の Wait timer は、設定された数値の期間が経過したことを条件にしたい時、チェックボックスを有効化します。単位は秒です。</p>
<p>五行目の Count は、Supply Source Priorities で設定した Resource が貨車の中にどれだけあるかを条件にしたい時、チェックボックスを有効化します。単位は個数です。</p>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/TSM_SupplySourcePriorities_wait_conditions_pre-8269f77722ebf8f100dc4d399f4b1e3c.png" width="703" height="370" class="img_ev3q"></p>
<p>それでは、Wait Conditions を設定してみましょう。</p>
<p>ここで設定する Wait Conditions は、EmptySupplier に停車していた列車が要求されて IronProvider に移動して停車している間にどのように振舞うかを設定しています。</p>
<p>貨物の積み込みを行うので貨車が満タンになれば作業を終了して、次の駅に移動して欲しいので、Include は Full です。</p>
<p>次に、駅の箱に入っている資源が枯渇した場合にも正しく動作できるよう Inactivity を 5 秒に設定しています。これによって、iron ore が箱から無くなって 5 秒経過すると列車が発車します。</p>
<p>そして、貨車に積み込まれた iron ore の個数が 1000 個を超えたら列車が発車するように、Count を <code>&gt;</code> で 1000 に設定しています。</p>
<p>お気づきのことと思いますが、この条件は最初の Include と内容が重複しています。貨車には 1000 以上の iron ore を積載できますが、この設定によって 1000 個の iron ore が積載された時点で列車が発車します。</p>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/TSM_SupplySourcePriorities_wait_conditions-1c9b6f3f4d2eb2de7354f4827fb47e62.png" width="723" height="536" class="img_ev3q"></p>
<p>最後は、ここで設定した Wait Conditions を適用する駅を選択しています。今回は、貨物を何も積載していない列車が停車する駅である EmptySupplier ですね。</p>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/TSM_SupplySourcePriorities_wait_conditions_set_stations-d0cf97fb9e9f5aa2f9d9dbffaa301462.png" width="720" height="397" class="img_ev3q"></p>
<p>Wait Conditions を全て設定したら、最後は Save ボタンを押します。</p>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/TSM_SupplySourcePriorities_wait_conditions_post-f96489c609f46d90be68a7b2c1aadb00.png" width="744" height="640" class="img_ev3q"></p>
<p>これで、貨物を積み込むための列車が停車している駅である EmptySupplier の設定が終了しました。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="出荷用の駅に列車を呼ぶために-train-requester-を設定する">出荷用の駅に列車を呼ぶために Train Requester を設定する<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#%E5%87%BA%E8%8D%B7%E7%94%A8%E3%81%AE%E9%A7%85%E3%81%AB%E5%88%97%E8%BB%8A%E3%82%92%E5%91%BC%E3%81%B6%E3%81%9F%E3%82%81%E3%81%AB-train-requester-%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B" class="hash-link" aria-label="出荷用の駅に列車を呼ぶために Train Requester を設定する への直接リンク" title="出荷用の駅に列車を呼ぶために Train Requester を設定する への直接リンク">​</a></h3>
<p>TSM の設定はいよいよ大詰めです。ここでは、Supply Source Priorities で設定した駅から列車を呼び出すための設定をしていきます。</p>
<p>まずは、EmptySupplier で待機している列車を、IronProvider に呼び出す設定をしましょう。</p>
<p>TSM の専用メニューにある左から二番目の Train Requester ボタンを押すと Requesters の一覧が表示されます。</p>
<p>ここでは、IronProvider で設定した Train Requester に何も割り当てられていないことが表示されていますね。</p>
<p><img decoding="async" loading="lazy" alt="requesters" src="https://blog.satotaichi.info/assets/images/TSM_Requesters_pre-baaa2c19be26e4cbe0d2ddff0db098da.png" width="885" height="244" class="img_ev3q"></p>
<p>Requesters で、<code>e</code> ボタンを押すと Train Requester に Priority Schema を設定するダイアログが表示されます。</p>
<p><img decoding="async" loading="lazy" alt="provider train requester" src="https://blog.satotaichi.info/assets/images/TSM_TrainRequester_pre-8f10d17096d092e1ffa2750d6e7af628.png" width="1051" height="258" class="img_ev3q"></p>
<p>ここでは、iron ore を搭載するため EmptySupplier に待機している列車を呼び出したいので左側に iron ore を、右側に<code>E</code>を設定しています。</p>
<p><img decoding="async" loading="lazy" alt="configured provider train requester" src="https://blog.satotaichi.info/assets/images/TSM_TrainRequester_post-a729ec1ddafe6b6298efa5f755e7aa72.png" width="1053" height="280" class="img_ev3q"></p>
<p>これによって、列車が以下のように動作します。</p>
<ul>
<li>IronProvider に設置されている Train Requester が Decider combinator からの信号によって有効化されると、</li>
<li>EmptySupplier で待機している列車が IronProvider にやってきて停車します。</li>
<li>駅でインサータなどが動作した結果、Supply Source Priorities に設定された Wait Conditions が満たされたら、</li>
<li>列車は FullSupplier に向かって発車します。</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="貨物荷下ろし待ち列車用の-supply-source-priorities-を設定する">貨物荷下ろし待ち列車用の Supply Source Priorities を設定する<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#%E8%B2%A8%E7%89%A9%E8%8D%B7%E4%B8%8B%E3%82%8D%E3%81%97%E5%BE%85%E3%81%A1%E5%88%97%E8%BB%8A%E7%94%A8%E3%81%AE-supply-source-priorities-%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B" class="hash-link" aria-label="貨物荷下ろし待ち列車用の Supply Source Priorities を設定する への直接リンク" title="貨物荷下ろし待ち列車用の Supply Source Priorities を設定する への直接リンク">​</a></h3>
<p>荷物を満載した列車が停車している駅である FullSupplier についても設定していきましょう。</p>
<p>まずは、Supply Source Priorities ですね。</p>
<p>Resource には、Supplier Train Stop から発車した列車が Requester Train Stop で停車する際に参照する貨物の種類を設定します。ここでは、iron ore を設定しました。</p>
<p>Id には、Resource と組合せて Train Requester が、Supplier Train Stop を一意に識別するためのアイコンを設定します。ここでは、Full を意味する<code>F</code> を設定しました。</p>
<p><img decoding="async" loading="lazy" alt="consumer supply source priorities" src="https://blog.satotaichi.info/assets/images/consumer_TSM_SupplySourcePriorities-489921277829e86fb32cfe94b7e2716f.png" width="630" height="238" class="img_ev3q"></p>
<p>サクサクいきましょう。次は、FullSupplier 用の Wait Conditions（待機条件）を設定していきます。</p>
<p>貨物の荷下ろしを行うので貨車が空っぽになれば作業終了です。そうしたら、次の駅に移動して欲しいので Include は Empty を選んでいます。EmptySupplier で設定した内容とは逆ですね。</p>
<p>次に、荷受け用に用意された駅の箱が満タンになっても正しく動作できるよう Inactivity を 5 秒に設定しています。これによって、iron ore を貨車からインサータが取り出さなくなって 5 秒経過すると列車が発車します。</p>
<p>この Wait Conditions を使用する駅は、FullSupplier でしたね。</p>
<p><img decoding="async" loading="lazy" alt="consumer wait conditions" src="https://blog.satotaichi.info/assets/images/consumer_TSM_WaitConditions-56b500dcd1dcc51a9dca2c0b6dd9e5a6.png" width="820" height="402" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="荷下ろし用の駅に列車を呼ぶために-train-requester-を設定する">荷下ろし用の駅に列車を呼ぶために Train Requester を設定する<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#%E8%8D%B7%E4%B8%8B%E3%82%8D%E3%81%97%E7%94%A8%E3%81%AE%E9%A7%85%E3%81%AB%E5%88%97%E8%BB%8A%E3%82%92%E5%91%BC%E3%81%B6%E3%81%9F%E3%82%81%E3%81%AB-train-requester-%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B" class="hash-link" aria-label="荷下ろし用の駅に列車を呼ぶために Train Requester を設定する への直接リンク" title="荷下ろし用の駅に列車を呼ぶために Train Requester を設定する への直接リンク">​</a></h3>
<p>これが最後の設定です。TSM の専用メニューにある左から二番目の Train Requester ボタンを押して Requesters の一覧を表示します。</p>
<p><img decoding="async" loading="lazy" alt="requesters" src="https://blog.satotaichi.info/assets/images/consumer_TSM_Requesters-5a8f518997a9e58f5763e335dc5930fd.png" width="937" height="280" class="img_ev3q"></p>
<p>IronConsumer で設定した Train Requester に何も割り当てられていないことが表示されていますので、Priorities Schema を設定します。</p>
<p>iron ore を貨車に積んで FullSupplier で待機している列車を呼び出したいので、左側に iron ore を、右側に<code>F</code>を設定しています。</p>
<p><img decoding="async" loading="lazy" alt="consumer train requester" src="https://blog.satotaichi.info/assets/images/consumer_TSM_TrainRequester-ebecda401b3593d1fcde3aa4b87bbfbc.png" width="1105" height="291" class="img_ev3q"></p>
<p>お疲れさまでした。これで TSM の設定は完了です。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="tsm-で運行制御された列車の動作確認">TSM で運行制御された列車の動作確認<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#tsm-%E3%81%A7%E9%81%8B%E8%A1%8C%E5%88%B6%E5%BE%A1%E3%81%95%E3%82%8C%E3%81%9F%E5%88%97%E8%BB%8A%E3%81%AE%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D" class="hash-link" aria-label="TSM で運行制御された列車の動作確認 への直接リンク" title="TSM で運行制御された列車の動作確認 への直接リンク">​</a></h2>
<p>列車がどのように動作していくのか確認していきましょう。</p>
<p>まずは、列車に燃料を積んだ上で運行制御を Manual から Automatic に変更します。</p>
<p>そうすると、EmptySupplier 駅の少し手前に配置した列車が動きだします。ここでは、まだ TSM は動作していません。</p>
<p><img decoding="async" loading="lazy" alt="move to empty supplier" src="https://blog.satotaichi.info/assets/images/train_move_to_empty_supplier-1f7e03cf28560d1d2bb43a61913c2f29.png" width="1159" height="670" class="img_ev3q"></p>
<p>EmptySupplier に列車が停止すると、TSM によって IronProvider への運行がスケジュールされます。</p>
<p>EmptySupplier で設定した Supply Source Priorities の Wait Conditions が適用されていますね。</p>
<p><img decoding="async" loading="lazy" alt="move to iron provider" src="https://blog.satotaichi.info/assets/images/train_move_to_provider-ed9e80be1d5b9f38b696f8a5e38362cf.png" width="1072" height="583" class="img_ev3q"></p>
<p>IronProvider に停車した列車に iron ore が積み込まれていきます。</p>
<p><img decoding="async" loading="lazy" alt="filling" src="https://blog.satotaichi.info/assets/images/train_fill-894fb499d6dbd3cd53281492c254a59e.png" width="1018" height="649" class="img_ev3q"></p>
<p>iron ore が 1000 個貨車に積載されることで Wait Conditions を満たした列車は、IronProvider を発車し FullSupplier を目指します。</p>
<p><img decoding="async" loading="lazy" alt="move to full supplier" src="https://blog.satotaichi.info/assets/images/train_move_to_full_supplier-48b2ac12020af3e99daddda4cfd40b81.png" width="1096" height="666" class="img_ev3q"></p>
<p>FullSupplier に列車が停車すると、TSM によって IronConsumer への運行がスケジュールされます。</p>
<p>FullSupplier で設定した Supply Source Priorities の Wait Conditions が適用されていますね。</p>
<p><img decoding="async" loading="lazy" alt="move to iron consumer" src="https://blog.satotaichi.info/assets/images/train_move_to_consumer-514354ed3089a7a9e7b449e3d1fa7105.png" width="1021" height="814" class="img_ev3q"></p>
<p>IronConsumer に停車した列車から iron ore が積み出されていきます。</p>
<p><img decoding="async" loading="lazy" alt="shipping" src="https://blog.satotaichi.info/assets/images/train_ship-ceb831a0cdf1a797a5c1aef9f39b71e7.png" width="1014" height="844" class="img_ev3q"></p>
<p>iron ore が全て出荷されることで Wait Conditions を満たした列車は、IronConsumer を発車し EmptySupplier を目指します。</p>
<p><img decoding="async" loading="lazy" alt="move to empty supplier again" src="https://blog.satotaichi.info/assets/images/train_move_to_empty-d44f8dac775d6984498dbab461ca03e5.png" width="1185" height="844" class="img_ev3q"></p>
<p>最初の駅に戻ったので、後は燃料が不足するまで同じことを繰り返します。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="燃料が不足する場合">燃料が不足する場合<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#%E7%87%83%E6%96%99%E3%81%8C%E4%B8%8D%E8%B6%B3%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88" class="hash-link" aria-label="燃料が不足する場合 への直接リンク" title="燃料が不足する場合 への直接リンク">​</a></h4>
<p>IronConsumer で停車中に燃料が不足している状態になったらどうでしょうか？</p>
<p>FuelStop1 への運行がスケジュールされます。</p>
<p><img decoding="async" loading="lazy" alt="fuel shortage" src="https://blog.satotaichi.info/assets/images/fuel_move_to-645f06a26c582a3e1d29a8098c248614.png" width="1242" height="931" class="img_ev3q"></p>
<p>iron ore が全て出荷されることで Wait Conditions を満たした列車は、FuelStop1 を目指します。</p>
<p><img decoding="async" loading="lazy" alt="move to fuel stop" src="https://blog.satotaichi.info/assets/images/fuel_move_to_stop-79b9dafa367fc71fe9bba681bdf3ff3b.png" width="1212" height="907" class="img_ev3q"></p>
<p>FuelStop1 へ無事到達した列車は燃料の補給を受けます。</p>
<p><img decoding="async" loading="lazy" alt="refuelling" src="https://blog.satotaichi.info/assets/images/fuel_refuel-c4c813d4b40d0294f7a2da51539b08f6.png" width="1113" height="931" class="img_ev3q"></p>
<p>燃料が満タンになったので、EmptySupplier を目指して発車します。</p>
<p><img decoding="async" loading="lazy" alt="move to empty supplier from fuel stop" src="https://blog.satotaichi.info/assets/images/fuel_move_to_emptySpplier-d3e25f2017fc3f7069f4ba70fc9cc777.png" width="1072" height="814" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="上手くいかないときの確認点">上手くいかないときの確認点<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#%E4%B8%8A%E6%89%8B%E3%81%8F%E3%81%84%E3%81%8B%E3%81%AA%E3%81%84%E3%81%A8%E3%81%8D%E3%81%AE%E7%A2%BA%E8%AA%8D%E7%82%B9" class="hash-link" aria-label="上手くいかないときの確認点 への直接リンク" title="上手くいかないときの確認点 への直接リンク">​</a></h2>
<p>TSM には、それなりにややこしい部分があります。始めて使うときは細かい作業ミスによって、列車が思うように動いてくれないこともあるでしょう。</p>
<p>私自身、勘違いや作業ミスで列車が動かないことが多数ありました。</p>
<p>ここでは、私が実際に遭遇した作業ミスと対応策をまとめましたので、必要に応じて参照してください。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="列車が走りださない">列車が走りださない<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#%E5%88%97%E8%BB%8A%E3%81%8C%E8%B5%B0%E3%82%8A%E3%81%A0%E3%81%95%E3%81%AA%E3%81%84" class="hash-link" aria-label="列車が走りださない への直接リンク" title="列車が走りださない への直接リンク">​</a></h3>
<p>列車は様々な理由で止まったまま動かなくなります。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="燃料を確認する">燃料を確認する<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#%E7%87%83%E6%96%99%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B" class="hash-link" aria-label="燃料を確認する への直接リンク" title="燃料を確認する への直接リンク">​</a></h4>
<p>列車が動かない時は、まず燃料を確認しましょう。</p>
<p>列車をクリックして表示される画面の Fuel（燃料）タブで、木材や石炭などを充填します。</p>
<p><img decoding="async" loading="lazy" alt="fuel" src="https://blog.satotaichi.info/assets/images/train_fuel-2cd3462fa5c11e94956a043654779592.png" width="735" height="267" class="img_ev3q"></p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="列車の運行設定を見直す">列車の運行設定を見直す<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#%E5%88%97%E8%BB%8A%E3%81%AE%E9%81%8B%E8%A1%8C%E8%A8%AD%E5%AE%9A%E3%82%92%E8%A6%8B%E7%9B%B4%E3%81%99" class="hash-link" aria-label="列車の運行設定を見直す への直接リンク" title="列車の運行設定を見直す への直接リンク">​</a></h4>
<p>駅の再配置などで駅名が変わってしまったり、線路を付けたり外したりしているうちに列車が目的の駅へ運行不能になることはよくあります。</p>
<p>列車の Schedule（スケジュール）タブで、駅を再設定してみましょう。</p>
<p>TSM を使うのであれば、Supplier Train Stop を二つ設定するだけです。</p>
<p>ちなみに、TSM によって自動挿入される運行計画は消してしまっても、TSM の管理下で動き始めればまた追加されます。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="requester-train-stop-の-状態を確認する">Requester Train Stop の 状態を確認する<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#requester-train-stop-%E3%81%AE-%E7%8A%B6%E6%85%8B%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B" class="hash-link" aria-label="Requester Train Stop の 状態を確認する への直接リンク" title="Requester Train Stop の 状態を確認する への直接リンク">​</a></h4>
<p>Requester Train Stop には、最初から Constant combinator（定数回路） が組み込まれており、列車がその駅に停車しているかどうかを管理しています。</p>
<p>マニュアル操作で列車を Requester Train Stop に停車させたり、Requester Train Stop に停車している列車を作業途中に回収すると、Constant combinator の値がおかしくなったまま修復されないことがあります。</p>
<p>そういう時は、思い切って Requester Train Stop を再配置してみましょう。大体、それでなおります。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="train-requester-が光らない">Train Requester が光らない<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#train-requester-%E3%81%8C%E5%85%89%E3%82%89%E3%81%AA%E3%81%84" class="hash-link" aria-label="Train Requester が光らない への直接リンク" title="Train Requester が光らない への直接リンク">​</a></h3>
<p>Train Requester が光っていない Requester Train Stop には決して電車はやってきません。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="decider-combinator-条件回路-の設定を見直す">Decider combinator (条件回路) の設定を見直す<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#decider-combinator-%E6%9D%A1%E4%BB%B6%E5%9B%9E%E8%B7%AF-%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E8%A6%8B%E7%9B%B4%E3%81%99" class="hash-link" aria-label="Decider combinator (条件回路) の設定を見直す への直接リンク" title="Decider combinator (条件回路) の設定を見直す への直接リンク">​</a></h4>
<p>よくあるミスは、Decider combinator の不等号の向きが誤っていたり、評価しようとしている資源のアイコンを間違えていることです。</p>
<p>出荷用の駅では、箱に入っている資源の量が一定量を超えていることが条件になるので、不等号としては大なり（&gt;）を使います。</p>
<p>逆に、荷下ろし用の駅では、箱に入っている資源の量が一定量を下回っていることが条件になるので、不等号としては小なり（&lt;）を使います。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="train-requester-の設定を見直す">Train Requester の設定を見直す<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#train-requester-%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E8%A6%8B%E7%9B%B4%E3%81%99" class="hash-link" aria-label="Train Requester の設定を見直す への直接リンク" title="Train Requester の設定を見直す への直接リンク">​</a></h4>
<p>Train Requester に設定する列車アイコンの位置を間違えることもよくあります。左側に列車アイコンを設定してください。</p>
<p><img decoding="async" loading="lazy" alt="train requester" src="https://blog.satotaichi.info/assets/images/signal_from_requester-824cda691b61ca5c23ad5180315885ab.png" width="517" height="516" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="列車が一瞬で発車してしまう">列車が一瞬で発車してしまう<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#%E5%88%97%E8%BB%8A%E3%81%8C%E4%B8%80%E7%9E%AC%E3%81%A7%E7%99%BA%E8%BB%8A%E3%81%97%E3%81%A6%E3%81%97%E3%81%BE%E3%81%86" class="hash-link" aria-label="列車が一瞬で発車してしまう への直接リンク" title="列車が一瞬で発車してしまう への直接リンク">​</a></h3>
<p>列車が、どの駅でも停車して荷物が動き始める前にさっさと電車が走り出してしまうことがあります。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="supply-source-priorities-の-wait-conditions-の設定を見直す">Supply Source Priorities の Wait Conditions の設定を見直す<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#supply-source-priorities-%E3%81%AE-wait-conditions-%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E8%A6%8B%E7%9B%B4%E3%81%99" class="hash-link" aria-label="Supply Source Priorities の Wait Conditions の設定を見直す への直接リンク" title="Supply Source Priorities の Wait Conditions の設定を見直す への直接リンク">​</a></h4>
<p>列車がすぐに走り出してしまうパターンでは、Supply Source Priorities の設定が誤っていることが多いので内容をよく確認しましょう。</p>
<p>Wait Conditions は、その<strong>条件が満たされると列車が発車します</strong>。私は、その条件が満たされている間は列車が停車していると誤解していて苦しみました。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="おまけおすすめの便利な-mod-たち">おまけ：おすすめの便利な MOD たち<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#%E3%81%8A%E3%81%BE%E3%81%91%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%81%AE%E4%BE%BF%E5%88%A9%E3%81%AA-mod-%E3%81%9F%E3%81%A1" class="hash-link" aria-label="おまけ：おすすめの便利な MOD たち への直接リンク" title="おまけ：おすすめの便利な MOD たち への直接リンク">​</a></h2>
<p>最後に私が普段使っている MOD の中であまりゲームに強い影響がない便利な MOD を紹介します。</p>
<p>名前の横にある ★ の数 はおススメ度です。</p>
<ul>
<li>★★★ 明確におススメ。チュートリアルが終わったあたりで導入してもいいくらい</li>
<li>★★ 一度くらいロケットを飛ばした後にはおススメ</li>
<li>★ 大型 MOD を導入したらおススメ</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="ゲームバランスに影響が無いもの">ゲームバランスに影響が無いもの<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#%E3%82%B2%E3%83%BC%E3%83%A0%E3%83%90%E3%83%A9%E3%83%B3%E3%82%B9%E3%81%AB%E5%BD%B1%E9%9F%BF%E3%81%8C%E7%84%A1%E3%81%84%E3%82%82%E3%81%AE" class="hash-link" aria-label="ゲームバランスに影響が無いもの への直接リンク" title="ゲームバランスに影響が無いもの への直接リンク">​</a></h3>
<p>ゲームバランスに対して影響のない MOD で特におすすめできるものです。</p>
<p>Factorio 自体はかなり洗練された UI のゲームではありますが、これらの MOD を導入することでさらに快適に遊べるようになります。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="-alien-biomes">★★★ Alien Biomes<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#-alien-biomes" class="hash-link" aria-label="★★★ Alien Biomes への直接リンク" title="★★★ Alien Biomes への直接リンク">​</a></h4>
<p><a href="https://mods.factorio.com/mod/alien-biomes" target="_blank" rel="noopener noreferrer">Alien Biomes</a>は、単調な森と荒地ばかりの Factorio に豊かな色彩をもたらしてくれる MOD です。</p>
<p>これを導入したゲームではマップを上を歩き回って新しい資源を探すのが非常に楽しい体験になります。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="-bottleneck">★★★ Bottleneck<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#-bottleneck" class="hash-link" aria-label="★★★ Bottleneck への直接リンク" title="★★★ Bottleneck への直接リンク">​</a></h4>
<p>自動化という作業における解決しなければならない本質的な問題は、ボトルネックの発見と解消です。</p>
<p><a href="https://mods.factorio.com/mod/Bottleneck" target="_blank" rel="noopener noreferrer">Bottleneck</a>は、生産設備の動作状態を赤、黄、青の三色で見やすく表示してくれる MOD です。</p>
<p>赤や黄色が表示されている設備は何らかの問題があって正しく動作していません。改善しましょう。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="-fnei">★★ FNEI<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#-fnei" class="hash-link" aria-label="★★ FNEI への直接リンク" title="★★ FNEI への直接リンク">​</a></h4>
<p><a href="https://mods.factorio.com/mod/FNEI" target="_blank" rel="noopener noreferrer">FNEI</a> は、アイテムのレシピや特定のアイムを使って作れるものを調べられる MOD です。</p>
<p>PyMods では作れるアイテムが非常に多いのでかなり重要な MOD です。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="-helmod">★ Helmod<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#-helmod" class="hash-link" aria-label="★ Helmod への直接リンク" title="★ Helmod への直接リンク">​</a></h4>
<p><a href="https://mods.factorio.com/mod/helmod" target="_blank" rel="noopener noreferrer">Helmod</a> はアイテムの生産ライン計画を立てるための MOD です。</p>
<p>最終成果物に至るまでのステップ数が 5 段階くらいを越えたあたりから記憶しておくのは難しくなります。また使っている素材の種類が多いとそれぞれについて、生産工程が必要になりますので、短期記憶だけで工場のラインを構築するのは不可能です。</p>
<p>また、生産したい部材の生産量に応じて生産設備をいくつも並行稼働する必要がありますが、Helmod を使えば単位時間あたりの出力を設定するだけで、生産ライン上の設備をいくつ用意すればいいのか自動的に計算してくれます。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="ゲームバランスに影響があるもの">ゲームバランスに影響があるもの<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#%E3%82%B2%E3%83%BC%E3%83%A0%E3%83%90%E3%83%A9%E3%83%B3%E3%82%B9%E3%81%AB%E5%BD%B1%E9%9F%BF%E3%81%8C%E3%81%82%E3%82%8B%E3%82%82%E3%81%AE" class="hash-link" aria-label="ゲームバランスに影響があるもの への直接リンク" title="ゲームバランスに影響があるもの への直接リンク">​</a></h3>
<p>ここで挙げる MOD はゲームバランスに影響が少なからずあるものです。</p>
<p>とはいえ、PyMods のようにゲームバランスが根本から変わるようなものではなく、ちょっとした不満やストレスが解消されるようなものです。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="-squeak-through">★★★ Squeak Through<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#-squeak-through" class="hash-link" aria-label="★★★ Squeak Through への直接リンク" title="★★★ Squeak Through への直接リンク">​</a></h4>
<p>Factorio の資材には大別するとベルトコンベア上を流れる固体と、パイプの中を流れる流体があります。</p>
<p>MOD を全く導入していないとしても、ベルトコンベア上は自由に歩けます。しかし、パイプは一切通過できないのです。</p>
<p>工場が大規模化してくると、流体を使うために所せましとパイプを並べる必要が出てくるのですけども、パイプを横切れないせいで、作業効率が非常に悪いのですよね。</p>
<p>そういう地味なストレスを<a href="https://mods.factorio.com/mod/Squeak%20Through" target="_blank" rel="noopener noreferrer">Squeak Through</a>は、パイプを横切れるようにすることで解消してくれます。</p>
<p>最早、これなしに Factorio を遊ぶことなど考えられません。パイプを引いたせいで工場の中を遠回りするのは特に楽しい体験ではないのです。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="-long-reach">★★ Long Reach<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#-long-reach" class="hash-link" aria-label="★★ Long Reach への直接リンク" title="★★ Long Reach への直接リンク">​</a></h4>
<p>工場の規模がある程度大きくなって、部分的な作り直しを始めると画面を遠景にして設備を沢山同時に置いたり撤去したくなります。</p>
<p>そうしたとき、<a href="https://mods.factorio.com/mod/long-reach" target="_blank" rel="noopener noreferrer">Long Reach</a>を導入すると、手の届く範囲を広げられます。</p>
<p>私は、大体 200 くらいの距離で普段使っています。</p>
<p>序盤から使ってしまうと、人力でアイテムを運んでしまいがちになり自分自身がベルトコンベアの一部になってしまう危険があるので ★★ です。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="-adaptive-movement-speed">★ Adaptive Movement Speed<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#-adaptive-movement-speed" class="hash-link" aria-label="★ Adaptive Movement Speed への直接リンク" title="★ Adaptive Movement Speed への直接リンク">​</a></h4>
<p>実は Factorio には、レンガブロック系のアイテムを床に敷き詰めることで、その上を移動する際の速度を向上する機能があります。なので、工場の敷地内を歩き回るだけなら移動速度を上げる必要はほとんどありません。</p>
<p>しかし、PyMods のような大型 MOD を導入すると工場がとてつもなく巨大になります。その上、貴重な資源を探すために遠出する必要があります。</p>
<p>そういう状況では、<a href="https://mods.factorio.com/mod/adaptive_movement_speed" target="_blank" rel="noopener noreferrer">Adaptive Movement Speed</a>で、移動速度を上げるとゲームプレイが快適になります。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="-factorissimo2">★ Factorissimo2<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#-factorissimo2" class="hash-link" aria-label="★ Factorissimo2 への直接リンク" title="★ Factorissimo2 への直接リンク">​</a></h4>
<p><a href="https://mods.factorio.com/mod/Factorissimo2" target="_blank" rel="noopener noreferrer">Factorissimo2</a>は、マップ上に工場用の建物を配置して、それをマトリョーシカのように入れ子にできる MOD です。</p>
<p>建物の中に配置したベルトコンベアや生産設備をまとめて拾い上げてアイテムとして運ぶこともできます。ある種のモジュール化が実現できる MOD という訳です。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="まとめ">まとめ<a href="https://blog.satotaichi.info/train-supply-manager-for-beginners/#%E3%81%BE%E3%81%A8%E3%82%81" class="hash-link" aria-label="まとめ への直接リンク" title="まとめ への直接リンク">​</a></h2>
<p>このエントリでは、Factorio における鉄道の運行を自動制御する MOD である TSM を紹介しました。</p>
<p>MOD を全く入れていない Factorio において鉄道の能力は明らかにオーバースペックで、実際ほとんど使わなくてもロケットを打ち上げられます。</p>
<p>しかし、PyMods や Bob's Mods といった大型 MOD を導入すると話は全く変わります。それは工場が Mega Base と言われるくらいに大きくなるからです。</p>
<p>COVID-19 対策のワクチン接種が始まりましたが、少なくともこの冬の間は、それが有効に機能して COVID-19 が封じ込められるという所まではいかないでしょう。</p>
<p>つまり、必要最低限の外出だけで日々生活する必要があるのです。こういった状況では Factorio のように延々と作業できるゲームは非常に有効です。</p>
<p>このエントリが、大型 MOD を導入して Factorio を遊ぶ皆様の助けに少しでもなれば幸いです。</p>
<p>明日は、hirotaka hata です。</p>]]></content>
        <author>
            <name>Sato Taichi</name>
            <uri>https://github.com/taichi</uri>
        </author>
        <category label="factorio" term="factorio"/>
        <category label="TSM" term="TSM"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[TypeScriptによるアプリケーションの開発環境]]></title>
        <id>https://blog.satotaichi.info/typescript-development/</id>
        <link href="https://blog.satotaichi.info/typescript-development/"/>
        <updated>2019-12-10T22:20:57.000Z</updated>
        <summary type="html"><![CDATA[このエントリーは pyspa Advent Calendar 2019 の 11 日目の記事です。昨日は @chezou の「Vein の iOS ショートカット複数 URL 対応しました」でした。]]></summary>
        <content type="html"><![CDATA[<p>このエントリーは <a href="https://adventar.org/calendars/3896" target="_blank" rel="noopener noreferrer">pyspa Advent Calendar 2019</a> の 11 日目の記事です。昨日は @chezou の「<a href="https://memo.chezo.uno/Vein-iOS-URL-2eb0dd27aec5416b929c4c89f2f0537e" target="_blank" rel="noopener noreferrer">Vein の iOS ショートカット複数 URL 対応しました</a>」でした。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="はじめに">はじめに<a href="https://blog.satotaichi.info/typescript-development/#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB" class="hash-link" aria-label="はじめに への直接リンク" title="はじめに への直接リンク">​</a></h2>
<p>TypeScript は大変に素晴らしい言語で、僕の手によくなじむ。そのせいか最近はめっきり TypeScript ばかり書いている。</p>
<p>今回のエントリでは、僕がこの一年くらいの間に磨いた TypeScript のテンプレートプロジェクトについて説明する。かなり何度も使って必要十分なものだけを含めるようにしている。</p>
<p>しかし、僕の知識の偏りがそのままになっているので、万人に合うというわけではないだろう。</p>
<p>とはいえ、開発環境の初期構築はかなり面倒な作業なので参考にして貰えれば嬉しい。</p>
<p>細かい説明なんかよりもコードを見た方が早いってハードコアな方は、こちらへどうぞ。</p>
<ul>
<li><a href="https://github.com/taichi/ts-template" target="_blank" rel="noopener noreferrer">taichi/ts-template</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="os-とハードウェア">OS とハードウェア<a href="https://blog.satotaichi.info/typescript-development/#os-%E3%81%A8%E3%83%8F%E3%83%BC%EF%BF%BD%EF%BF%BD%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2" class="hash-link" aria-label="OS とハードウェア への直接リンク" title="OS とハードウェア への直接リンク">​</a></h3>
<p>テンプレートプロジェクトの説明をする前に、まずは僕の使っているハードウェアと OS について説明しておく。</p>
<p>Thinkpad X1 Carbon 2016 年モデルに Windows10 をインストールしてある。ハードウェアスペックは、こうだ。</p>
<ul>
<li>CPU i7 6600U @ 2.6GHz</li>
<li>メモリ 16GB</li>
<li>ストレージ SAMSUNG NVMe SSD 950 PRO 512GB</li>
</ul>
<p>流石に三年も経つと同等のスペックのものがかなり安価に購入できるようになってきていると感じる。</p>
<p>この環境で、PC 版の LINE と Slack と VS Code と GitKraken を動かしているが十分に快適だ。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="事前準備">事前準備<a href="https://blog.satotaichi.info/typescript-development/#%E4%BA%8B%E5%89%8D%E6%BA%96%E5%82%99" class="hash-link" aria-label="事前準備 への直接リンク" title="事前準備 への直接リンク">​</a></h3>
<p>このテンプレートプロジェクトでは、事前に必要なソフトウェアとして、</p>
<ul>
<li>git</li>
<li>Node.js</li>
<li>yarn</li>
<li>Visual Studio Code (VS Code)</li>
</ul>
<p>が必要だ。それぞれインストールしておいて欲しい。</p>
<p>僕と同じように OS として Windows を使っているなら scoop を使って簡単にインストールできる。</p>
<p>尚、scoop については以前に書いたので、そちらを参考にどうぞ。cf. <a href="https://blog.satotaichi.info/scoop/" target="_blank" rel="noopener noreferrer">Scoop で Windows における開発環境構築を最適化しよう</a></p>
<p>ついでに git の GUI クライアントとしては、<a href="https://www.gitkraken.com/" target="_blank" rel="noopener noreferrer">GitKraken</a> がおすすめだ。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="テンプレートプロジェクトについて">テンプレートプロジェクトについて<a href="https://blog.satotaichi.info/typescript-development/#%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6" class="hash-link" aria-label="テンプレートプロジェクトについて への直接リンク" title="テンプレートプロジェクトについて への直接リンク">​</a></h2>
<p>それでは、早速プロジェクトの内容について説明していこう。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="エディタ">エディタ<a href="https://blog.satotaichi.info/typescript-development/#%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF" class="hash-link" aria-label="エディタ への直接リンク" title="エディタ への直接リンク">​</a></h3>
<p>まずは、みんなが大好きなエディタの話題から取り上げるとしよう。</p>
<p>今、TypeScript の開発環境として一番強力なのは VSCode だ。</p>
<p>何せ VSCode 自体が TypeScript で書かれているので、機能不足を感じたら TypeScript で拡張が書ける。</p>
<p>加えて、入力補完やシンタックスハイライトも大変に優れている。</p>
<p>一部の機能については language server protocol 経由で他のエディタでも使えるというのも大変に素晴らしい。</p>
<p>また、開発も非常に活発で毎月のように最新版がリリースされる。リビジョン番号が上がってすぐはバギーで、一週間もしないうちに毎回パッチが降ってくるのがまた可愛い。</p>
<p>マイクロソフトらしく互換性に気を使ったリリースをしてくれるので、お気に入りの拡張がいきなり動かなくなることもほとんどない。</p>
<p>VSCode といえば拡張だけども、僕は別に拡張を山盛りして使っているわけではない。どんどん新しいものを入れてはいるが、使わないやつはどんどん消している。</p>
<p>なので、僕のローカルで長い時間生き延びた拡張だけをテンプレプロジェクトには推奨拡張として設定してある。</p>
<p>丁度いいので僕のおススメ拡張を軽く説明しておこう。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="tslint"><a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-typescript-tslint-plugin" target="_blank" rel="noopener noreferrer">TSLint</a><a href="https://blog.satotaichi.info/typescript-development/#tslint" class="hash-link" aria-label="tslint への直接リンク" title="tslint への直接リンク">​</a></h4>
<p>VS Code の TSLint 拡張は、エディタ用に作ったメモリ上の AST を流用してコード検査を行うので、コンピュータ資源を効率的に使える。</p>
<p>なので、動作が非常に高速で快適だ。これについては、後でも取り上げる。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="rest-client"><a href="https://marketplace.visualstudio.com/items?itemName=humao.rest-client" target="_blank" rel="noopener noreferrer">REST Client</a><a href="https://blog.satotaichi.info/typescript-development/#rest-client" class="hash-link" aria-label="rest-client への直接リンク" title="rest-client への直接リンク">​</a></h4>
<p>ウェブアプリケーションやウェブに対して何か要求を送信するようなアプリケーションを作っているなら、こいつはマジで最高の拡張だ。</p>
<p>UI がシンプル過ぎるので一見すると、とっつきにくさはあるけども、分かってしまえばどうということはない。</p>
<p>どう使うのかを説明する。まずは、.http とか.rest みたいな拡張子のファイルを作って中に HTTP リクエストを書く。HTTP リクエストというのは、こういう感じだ。</p>
<blockquote>
<p>GET <a href="https://www.google.com/" target="_blank" rel="noopener noreferrer">https://www.google.com/</a></p>
</blockquote>
<p>その行の上に Send Request というリンクが出てくるので、それをクリックする。</p>
<p>そうするとその HTTP リクエストが送信されて、結果を隣のタブで見られる。</p>
<p>ただ、それだけのものだ。HTTP ヘッダや POST ボディを付けたりもできる。</p>
<p>最近の HTTP リクエストは、GraphQL みたいに改行を伴う HTTP リクエストや Authorization ヘッダーをちゃんとつけないといけなかったりで、curl だけだとちょいとつらい。</p>
<p>以前から Chrome 拡張の<a href="https://www.getpostman.com/" target="_blank" rel="noopener noreferrer">Postman</a>を愛用しているが、REST Client が非常にお手軽なので気が付いたらこちらばかり使っている。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="regex-previewer"><a href="https://marketplace.visualstudio.com/items?itemName=chrmarti.regex" target="_blank" rel="noopener noreferrer">Regex Previewer</a><a href="https://blog.satotaichi.info/typescript-development/#regex-previewer" class="hash-link" aria-label="regex-previewer への直接リンク" title="regex-previewer への直接リンク">​</a></h4>
<p>正規表現を使うコードはソフトウェア開発において、ある種の油断というか矛盾というか、もやっとしたものが集約されやすい部分だ。</p>
<p>小規模な正規表現をチラっと使っているうちは特に問題がないのだけども、その小規模というのが曖昧で感じ方に大きな個人差がある。</p>
<p>正直言って、Regex Previewer を使って動作確認しないといけないような正規表現は小規模であるとは言えないだろう。</p>
<p>書いた本人は簡単なつもりで書いていても受け取った人間が、それを簡単だと感じるとは限らない。</p>
<p>そういう時、Regex Previewer はマジで便利だ。二週間前の自分は他人って話もある。</p>
<p>ノリノリで書いた正規表現のどこかに抜け漏れがあるんだけどヤバ過ぎてよく分からない、なんて愉快な事に遭遇したことは無いかな？僕はある。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="editorconfig-for-vs-code"><a href="https://marketplace.visualstudio.com/items?itemName=EditorConfig.EditorConfig" target="_blank" rel="noopener noreferrer">EditorConfig for VS Code</a><a href="https://blog.satotaichi.info/typescript-development/#editorconfig-for-vs-code" class="hash-link" aria-label="editorconfig-for-vs-code への直接リンク" title="editorconfig-for-vs-code への直接リンク">​</a></h4>
<p>改行コードとタブやスペースをエディタ関係なく同じ結果になるよう調整できるツールが EditorConfig で、それの VSCode 版だ。</p>
<p>特に Windows ユーザと Mac ユーザが混ざっている開発チームでは、ちゃんと調整しておかないと地獄のようなことが起きるので、こういうツールで統一するのが望ましい。</p>
<p>ただし、改行コードやインデントを何にするかは、EditorConfig が決めてくれる訳ではないので十分に揉めてくれたまえ。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="gitignore"><a href="https://marketplace.visualstudio.com/items?itemName=michelemelluso.gitignore" target="_blank" rel="noopener noreferrer">gitignore</a><a href="https://blog.satotaichi.info/typescript-development/#gitignore" class="hash-link" aria-label="gitignore への直接リンク" title="gitignore への直接リンク">​</a></h4>
<p>VSCode のエクスプローラ機能には、なぜ gitignore するメニューが標準でついて無いのかよくわからない。</p>
<p>頻繁に使うわけではないけど、無いと困る。これは、そういうちょっとしたツールだ。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="パッケージ管理ツール">パッケージ管理ツール<a href="https://blog.satotaichi.info/typescript-development/#%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E7%AE%A1%E7%90%86%E3%83%84%E3%83%BC%E3%83%AB" class="hash-link" aria-label="パッケージ管理ツール への直接リンク" title="パッケージ管理ツール への直接リンク">​</a></h3>
<p>パッケージ管理ツールとしては、デフォルトの npm もひところに比べると随分早くなったように感じる。しかし、やっぱりまだ yarn の方がキビキビ動く。</p>
<p>特にプロキシの内側にいるとそれを強く感じる。npm だとそもそもモジュールのダウンロードが終わらないことすらあるんだよね。</p>
<p>最近は、pnpm という新しいやつも出てきたけど、yarn ほど早くもないし便利でもないので使っていない。</p>
<p>蛇足だが、yarn は npm scripts を短いコマンドで実行できるところも気に入っている。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="モジュールバンドラ">モジュールバンドラ<a href="https://blog.satotaichi.info/typescript-development/#%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%83%90%E3%83%B3%E3%83%89%E3%83%A9" class="hash-link" aria-label="モジュールバンドラ への直接リンク" title="モジュールバンドラ への直接リンク">​</a></h3>
<p>モジュールをくっ付けたり圧縮したりするのに何を使うのか？というのは比較的ややこしい問題だよね。</p>
<p>一番人気なのは恐らく webpack だろう。ただ、こいつは凄い勢いで破壊的変更が入ってくるのでついていくのが大分しんどい。</p>
<p>二回メジャーバージョンアップに付き合ったが、正直もうやりたくない。はっきり言って、出来ることが同じままで名前を変えるみたいなことを頻繁にやらないで欲しい。
僕らはアプリケーションを開発しているのだから、ビルドスクリプトのメンテナンスに大きな工数をかけたくない。</p>
<p>どうしても webpack を使うなら、Next.js みたいに内部に webpack を抱え込んでいるツールにお任せしてしまうのが良いんだろうなぁと今は考えている。</p>
<p>設定ファイルをゴリゴリ書かなくてもそれなりに上手くバンドルしてくれるツールとして、Parcel が今はお気に入りだ。</p>
<p>Parcel 自体には設定ファイルが無く、設定が必要な時はその依存するツールの設定ファイルを読み込んで使うという動きをするのが大変に優れている。（例えば、TypeScript をビルドするときには、tsconfig.json を勝手に見つけて使う）</p>
<p>webpack に比べるとコード量も少ないしやっていることもシンプルなので、一度分かってしまえばどうということもない。</p>
<p>まぁ、シンプルであってイージーではないので、一度分かるまでが大変なのは間違いない。</p>
<p>適用範囲も広くウェブのフロントエンドから、AWS の Lambda 関数、バッチ処理と色んなケースで使える。一回分かれば色々使えるというのは、大変にありがたい。</p>
<p>破壊的変更の少ないバージョンアップをしてくれるので、ビルドスクリプト自体を延々とメンテナンスする必要もない。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="lint-ツール">Lint ツール<a href="https://blog.satotaichi.info/typescript-development/#lint-%E3%83%84%E3%83%BC%E3%83%AB" class="hash-link" aria-label="Lint ツール への直接リンク" title="Lint ツール への直接リンク">​</a></h3>
<p>TypeScript で真っ当に使える Lint ツールは３つある。</p>
<p>まずは、コンパイラのオプションを記述できる tsconfig.json で、新規のプロジェクトでこれに <code>strict: true</code> を必ず設定する。これによって、TypeScript を使ったプログラミングにおけるメリットを最大限に享受できる。</p>
<p>悩ましいのが、typescript-eslint を使うか、TSLint を使うかだ。</p>
<p>将来的に JavaScript の Lint は、eslint に集約されていくという事には同意する。しかし、それは今すぐという訳ではない。というのが僕の考えだ。</p>
<p>僕が TSLint を使い続けている理由はいくつかある。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="tslint-microsoft-contrib-が最高すぎる"><a href="https://github.com/microsoft/tslint-microsoft-contrib" target="_blank" rel="noopener noreferrer">tslint-microsoft-contrib</a> が最高すぎる<a href="https://blog.satotaichi.info/typescript-development/#tslint-microsoft-contrib-%E3%81%8C%E6%9C%80%E9%AB%98%E3%81%99%E3%81%8E%E3%82%8B" class="hash-link" aria-label="tslint-microsoft-contrib-が最高すぎる への直接リンク" title="tslint-microsoft-contrib-が最高すぎる への直接リンク">​</a></h4>
<p>一番大きい理由はこれだ。僕のテンプレートプロジェクトでは、この巨大なルールセットから不要なものを無効化する形で TSLint のルールを構成してある。</p>
<p>TypeScript には、歴史的経緯により沢山の落とし穴があり、それらに対する十分な知識を僕は持っていないのだ。</p>
<p>なので、自動的に検出できるプログラミング上のミスは出来る限り沢山見つけてほしい。</p>
<p>例えば、僕は Promise のインスタンスを await し忘れるみたいな単純なミスも結構やってしまう。このルールセットなら即座に Lint エラーになるので不要なドはまりを避けられる。</p>
<p>また、tslint-microsoft-contrib は宣言の省略を基本的に許していない。つまり、これに従ってコードを書いていると、コード全量の三割から四割くらいが型宣言になってしまうことさえある。</p>
<p>慣れないうちは、冗長に感じるかもしれないがコードベースが大きくなるに従って、型の情報がコードを理解する強力な助けになることを実感できるだろう。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="vs-code-の-tslint-拡張が最高">VS Code の TSLint 拡張が最高<a href="https://blog.satotaichi.info/typescript-development/#vs-code-%E3%81%AE-tslint-%E6%8B%A1%E5%BC%B5%E3%81%8C%E6%9C%80%E9%AB%98" class="hash-link" aria-label="VS Code の TSLint 拡張が最高 への直接リンク" title="VS Code の TSLint 拡張が最高 への直接リンク">​</a></h4>
<p>VS Code の TSLint 拡張は非常に高速に動作する。Lint ツールがエディタ上で迅速に動作するというのは開発作業における必須条件だ。</p>
<p>何故なら、Lint エラーは出力されてから出来る限り短い時間内に対処しなければ、結果的に対処されないことが多いからだ。CI サーバでエラーにしてから対処するのでは遅すぎる。</p>
<p>加えて、僕は自動的に解消できるエラーは全てファイル保存時に解決するという方針でコードを書いている。
セミコロンの自動入力や import 文の並び替え、タブからスペースへの変換などは頻繁に実行されるので、ちょっとでも引っ掛かりがあると、それぞれは短くても積み重なってストレスの原因になる。
なお、ファイルの保存は 15 秒に 1 回よりも早いペースで行っている。</p>
<p>TSLint 拡張は極めて迅速に動作するが、eslint 拡張は同じ速度感で動作しない。</p>
<p>僕としては、Lint エラーは基本的に全て手元で出来る限り早く手元で解消すべきだと考えているので、手元での動作が悪いツールは避けている。
もし、eslint 拡張が今の TSLint 拡張と同様の速度で動くようになったら、乗り換えるだろう。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="テスティングフレームワーク">テスティングフレームワーク<a href="https://blog.satotaichi.info/typescript-development/#%E3%83%86%E3%82%B9%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF" class="hash-link" aria-label="テスティングフレームワーク への直接リンク" title="テスティングフレームワーク への直接リンク">​</a></h3>
<p>テスティングフレームワークとしては、依然として AVA を使っている。</p>
<p>今からテスティングフレームワークを選ぶなら大方 Jest だろう。テスティングフレームワークとして求められる機能が全部入っているのだから選び易い。</p>
<p>好みの問題だが、僕は <code>expect</code> タイプのアサーションメソッドが本当に嫌いだ。これを使ったテストコードは英文のように読めなくもないが、実際には英文ではない。</p>
<p>また、やたらめったら比較のためのメソッドを覚えなければテストコードが書けないのも辛い。</p>
<p>加えて、 <code>describe</code> によるテストの構造化はスローテスト問題の発症を早めると僕は考えている。</p>
<p>TypeScript で用もないのに関数やラムダ式を延々と入れ子にするようなコードを気楽に書かせるべきではない。</p>
<p>そして、僕が Jest を使いたくない決定的な理由は、テストの実行が AVA に比べて数倍遅いからだ。</p>
<p>AVA については、以前のエントリにも書いたので、気になる方はそちらを呼んで欲しい。cf. <a href="https://blog.satotaichi.info/modern-javascript_201701/" target="_blank" rel="noopener noreferrer">Modern JavaScript 概観、そして Electron へ</a></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="便利ライブラリ">便利ライブラリ<a href="https://blog.satotaichi.info/typescript-development/#%E4%BE%BF%E5%88%A9%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA" class="hash-link" aria-label="便利ライブラリ への直接リンク" title="便利ライブラリ への直接リンク">​</a></h3>
<p>次は、最近気に入ってよく使っている便利なライブラリを紹介しよう。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="アプリケーション設定を記述する">アプリケーション設定を記述する<a href="https://blog.satotaichi.info/typescript-development/#%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E8%A8%AD%E5%AE%9A%E3%82%92%E8%A8%98%E8%BF%B0%E3%81%99%E3%82%8B" class="hash-link" aria-label="アプリケーション設定を記述する への直接リンク" title="アプリケーション設定を記述する への直接リンク">​</a></h4>
<p>アプリケーションの設定を読み出すためのコードを書くのは正直面倒だ。</p>
<p>とはいえ、 <code>process.env</code> から直接読み出してしまうと、全部が文字列になってしまって型システムもへったくれもない。加えて、その設定を使う時まで設定エラーを見つけられない。</p>
<p>要は、設定を構造化して読みやすくまとめた上で、アプリケーション起動時に設定情報が全て正しく構成されているのかチェックしたいのだ。</p>
<p>こういう要件を満たす便利なライブラリが <a href="https://github.com/mozilla/node-convict" target="_blank" rel="noopener noreferrer">convict</a> だ。型定義ファイルがよく出来ているので型付けされた設定を記述できる。ただ、これ単独だと環境変数の定義が若干面倒なので、<a href="https://github.com/motdotla/dotenv" target="_blank" rel="noopener noreferrer">dotenv</a> を組み合わせて環境変数への設定をファイルにしている。</p>
<p>convict と dotenv を組み合わせて使う方法については、少し長くなりそうなのでここでは説明しない。もしどうしても説明が欲しいということであれば、twitter なり対面なりで、要望して貰えればエントリを書くかもしれない。</p>
<p>環境変数を積極的に使うやり方は便利だが、少し気を付けて使って欲しい。</p>
<p>例えば、CloudFormation なんかでアプリケーションをデプロイする際には、環境変数の中身をテンプレートに記述しなければいけなくなる。</p>
<p>そういう状況では、環境変数から設定情報を取り出して使うのは望ましくない。Secrets Manager みたいな場所から読んできた値を設定するようにした方がいいだろう。</p>
<p>convict では load メソッドを使うと、そういう状況に対応できる。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="複雑な非同期処理を簡単に書く">複雑な非同期処理を簡単に書く<a href="https://blog.satotaichi.info/typescript-development/#%E8%A4%87%E9%9B%91%E3%81%AA%E9%9D%9E%E5%90%8C%E6%9C%9F%E5%87%A6%E7%90%86%E3%82%92%E7%B0%A1%E5%8D%98%E3%81%AB%E6%9B%B8%E3%81%8F" class="hash-link" aria-label="複雑な非同期処理を簡単に書く への直接リンク" title="複雑な非同期処理を簡単に書く への直接リンク">​</a></h4>
<p>Node.js のランタイム上で動作するコードにおいて非同期処理を免れるのは非常に難しい。</p>
<p>とはいえ、async/await だけを使ってあらゆる非同期処理を書くのは大分つらい。</p>
<p>例えば、50 件ずつバッファリングされたデータが非同期で複数回送信されてくるのを一件ずつ処理する。みたいなコードを想像して欲しい。<a href="https://developer.github.com/v3/#pagination" target="_blank" rel="noopener noreferrer">GitHub API の Pagination</a>みたいなやつだ。</p>
<p>こういう時に使うべきライブラリとして知られているのは RxJS だ。しかし、RxJS を一たび採用するとあらゆる部分に影響を及ぼす。</p>
<p>RxJS を使ったコードの動作を最適化するには、RxJS を出来る限り広く使わざるを得ないのだ。</p>
<p>そして、RxJS の学習コストは極めて高い。</p>
<p>これに対して、出来る限り少ない学習コストで複雑な非同期処理を記述できるライブラリが<a href="https://github.com/bustle/streaming-iterables" target="_blank" rel="noopener noreferrer">streaming-iterables</a>だ。RxJS ほどのボキャブラリは無いけども、それなりに難しいこともできる。</p>
<p>ライブラリに定義されている関数は generator はふんだんに使っていることを除けば単純なので理解し易い。</p>
<p>そういうわけで、RxJS に大きな学習コストを今すぐにはかけたくないが、複雑な非同期処理を書く必要があるなら streaming-iterables を試してみて欲しい。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="ロギング">ロギング<a href="https://blog.satotaichi.info/typescript-development/#%E3%83%AD%E3%82%AE%E3%83%B3%E3%82%B0" class="hash-link" aria-label="ロギング への直接リンク" title="ロギング への直接リンク">​</a></h4>
<p>ロギングライブラリというのは、作りやすいので氾濫し易い。</p>
<p>ただ、作りやすいこととちゃんと使えるものが作れることには余り関係がない。というか、まともなロギングライブラリを書くのは本当に難しい。</p>
<p>つまり、まともに動くロギングライブラリを見つけるのは難しい。だからといって、自前で実装するのは望ましくない、</p>
<p>というわけで、今の一押しロギングライブラリは<a href="https://github.com/pinojs/pino" target="_blank" rel="noopener noreferrer">pino</a> だ。</p>
<p>こいつは、ログのデフォルト出力が JSON になってるあたりクラウドサービスを組み合わせた運用監視を想定した作りになっており大変に素晴らしい。</p>
<p>いざとなれば手を入れて使える程度に処理はコンパクトにまとまっているので、他のロギングライブラリに乗り換えるのも難しくはない。</p>
<p>少し前まで winston をせっせと使っていたが、内部で使っている logform で実装されている奇妙な遅延ロードの仕組みにドはまりして以来使うのをやめた。</p>
<p>なお、その問題に関する Issue はこれ。<a href="https://github.com/winstonjs/logform/issues/66" target="_blank" rel="noopener noreferrer">https://github.com/winstonjs/logform/issues/66</a></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="開発関連の-saas">開発関連の SaaS<a href="https://blog.satotaichi.info/typescript-development/#%E9%96%8B%E7%99%BA%E9%96%A2%E9%80%A3%E3%81%AE-saas" class="hash-link" aria-label="開発関連の SaaS への直接リンク" title="開発関連の SaaS への直接リンク">​</a></h3>
<p>最後に、テンプレートプロジェクトが利用を前提としている開発用 SaaS を軽く紹介する。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="github-actions">GitHub Actions<a href="https://blog.satotaichi.info/typescript-development/#github-actions" class="hash-link" aria-label="GitHub Actions への直接リンク" title="GitHub Actions への直接リンク">​</a></h4>
<p>以前はビルドが失敗した OS に SSH や RDP 接続できるので、CircleCI や AppVeyor を使っていたが、今は GitHub Actions に移行しつつある。</p>
<p>移行における最初のモチベーションは、マルチ OS 対応だ。GitHub Actions は裏で Azure Pipelines が動いているので、Linux と Mac と Windows を気兼ねなく使える。</p>
<p>特に、node のランタイムと OS の組み合わせでマトリクスビルドが超簡単に構成できるのには感動した。</p>
<p>Linux と Windows の両方でビルドするために、複数の CI 用設定ファイルを書いていたのだから、本当にありがたい。</p>
<p>また、イベント毎にワークフローの設定ファイルを分割するという方針も大変に良い。</p>
<p>更に、複数の構成で共通的に使う処理は、Action という形でモジュール化できるので、ワークフロー定義が肥大化するのを防げるようになっている。</p>
<p>Action は Docker を使えばなんでも出来るし、気軽に書くなら JavaScript や TypeScript でも書ける。リポジトリ内に Action を配置して動かせるので泥臭い処理の共通化を気兼ねなくできる。</p>
<p>ワークフロー定義の中で使える変数や、 <code>if</code> 文は少々奇妙なところもあるが、そこは我慢のしどころだ。</p>
<p>つい最近自分のプロジェクトで使うために TypeScript で書いた Action はこれだ。このコードを読めば、TypeScript を使って Action を作るとどういう感じになるのか概観できるだろう。</p>
<ul>
<li><a href="https://github.com/taichi/approved-event-action" target="_blank" rel="noopener noreferrer">approved-event-action</a></li>
</ul>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="renovate">Renovate<a href="https://blog.satotaichi.info/typescript-development/#renovate" class="hash-link" aria-label="Renovate への直接リンク" title="Renovate への直接リンク">​</a></h4>
<p>依存ライブラリを自動的に更新するツールは、僕も以前に作ったことがある。しかし、Renovate はそれらを大きく上回る便利さだ。</p>
<p>特に自動マージ機能や、検査対象ライブラリのフィルタ機能、設定を他のリポジトリから読み出す機能なんかが大変に素晴らしい。</p>
<p>モジュール毎に分けてプルリクエストが飛んでくるというのもマージし易くて良い。</p>
<p>勿論、CI をちゃんとセットアップしておけば、その結果を見てマージするのか判断してくれる。</p>
<p>類似するサービスをいくつか試してはみたが、結局 Renovate が一番最高ということになった。</p>
<p>それとは別に、GitHub が提供してくれる<a href="https://help.github.com/en/github/managing-security-vulnerabilities" target="_blank" rel="noopener noreferrer">Managing security vulnerabilities</a> の機能は有効化している。</p>
<p>加えて、<code>yarn audit</code> をデイリービルドの中で実行している。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="まとめ">まとめ<a href="https://blog.satotaichi.info/typescript-development/#%E3%81%BE%E3%81%A8%E3%82%81" class="hash-link" aria-label="まとめ への直接リンク" title="まとめ への直接リンク">​</a></h2>
<p>今回は、僕が作った TypeScript のテンプレートプロジェクトについて長々と説明してきた。</p>
<p>最近は、ユーザインターフェースを作るようなコードは余り書いていないので、そちらの要素技術には言及できなかったのが少し悔やまれる。</p>
<p>テンプレートプロジェクトには入れていないが、aws-cdk はマジでお気に入りだ。</p>
<p>例えば、<code>@aws/dynamodb-data-mapper</code>でアノテーションしたオブジェクトをそのまま aws-cdk の construct として扱えるようなちょっとしたコードを書く程度には使い込んでいる。</p>
<p>内容に関する提案や、誤りの指摘、要望などがあるなら、Twitter などで連絡してくれると大変に嬉しいので気軽にメッセージを送信して欲しい。</p>
<p>TypeScript に限らず JavaScript 関連のフロントエンド界隈は、流れが随分と速いので余り無理せずについていきたい。そういう皆さんの助けに少しでもなれば良いなと考えています。</p>
<p>明日は、@drillbits です。</p>]]></content>
        <author>
            <name>Sato Taichi</name>
            <uri>https://github.com/taichi</uri>
        </author>
        <category label="javascript" term="javascript"/>
        <category label="typescript" term="typescript"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[運動不足だった技術者が筋トレを続けている話]]></title>
        <id>https://blog.satotaichi.info/keep_training_is_so_hard/</id>
        <link href="https://blog.satotaichi.info/keep_training_is_so_hard/"/>
        <updated>2018-12-11T13:35:25.000Z</updated>
        <summary type="html"><![CDATA[このエントリーは pyspa Advent Calendar 2018 の 11 日目の記事です。昨日は @shiumachi の転職エージェントの活用法でした。]]></summary>
        <content type="html"><![CDATA[<p>このエントリーは <a href="https://adventar.org/calendars/3018" target="_blank" rel="noopener noreferrer">pyspa Advent Calendar 2018</a> の 11 日目の記事です。昨日は @shiumachi の<a href="https://shiumachi.hatenablog.com/entry/2018/12/10/002820" target="_blank" rel="noopener noreferrer">転職エージェントの活用法</a>でした。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="はじめに">はじめに<a href="https://blog.satotaichi.info/keep_training_is_so_hard/#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB" class="hash-link" aria-label="はじめに への直接リンク" title="はじめに への直接リンク">​</a></h2>
<p>去年は、筋トレを始めた話を書いた。</p>
<p>この一年くらい途中で二回ほど離脱した時期もあったが、どうにかこうにか筋トレを継続できている。</p>
<p>と言う訳で、今日は僕が筋トレを継続できているという話をする。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="現状確認">現状確認<a href="https://blog.satotaichi.info/keep_training_is_so_hard/#%E7%8F%BE%E7%8A%B6%E7%A2%BA%E8%AA%8D" class="hash-link" aria-label="現状確認 への直接リンク" title="現状確認 への直接リンク">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="身長や体重など">身長や体重など<a href="https://blog.satotaichi.info/keep_training_is_so_hard/#%E8%BA%AB%E9%95%B7%E3%82%84%E4%BD%93%E9%87%8D%E3%81%AA%E3%81%A9" class="hash-link" aria-label="身長や体重など への直接リンク" title="身長や体重など への直接リンク">​</a></h3>
<p>殆ど何も変わっていない。素人がチョイチョイと一年くらいトレーニングした所で何かが変わったりはしないのだ。</p>
<p>体重は３～４ kg くらいは増加したように思うが、これがトレーニングの成果なのかはちょっと良く分からない。具体的に今の体重は、66kg±1kg くらいだ。</p>
<p>まぁ、３０代も後半なので衰えてないということだけでも評価して欲しいという気持ちはある。</p>
<p>尚、健康診断の結果における γGTP の値は大きく改善して 96 から 33 に下がった。まぁ、酒を飲まずにその時間をトレーニングに割り当てたのだから、そこだけは改善して貰わなければ本当に困るのだが。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="トレーニング頻度と時間">トレーニング頻度と時間<a href="https://blog.satotaichi.info/keep_training_is_so_hard/#%E3%83%88%E3%83%AC%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E9%A0%BB%E5%BA%A6%E3%81%A8%E6%99%82%E9%96%93" class="hash-link" aria-label="トレーニング頻度と時間 への直接リンク" title="トレーニング頻度と時間 への直接リンク">​</a></h3>
<p>今は大体、週に３回から４回フィットネスジムに行き、週に１回程度クライミングジムに行っている。</p>
<p>行くたびに全身のトレーニングをするのは体力的にきつすぎるので、今は３回を１セットにして全身トレーニングするようにした。</p>
<p>つまり、胸の日、脚の日、背中の日だ。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="胸の日">胸の日<a href="https://blog.satotaichi.info/keep_training_is_so_hard/#%E8%83%B8%E3%81%AE%E6%97%A5" class="hash-link" aria-label="胸の日 への直接リンク" title="胸の日 への直接リンク">​</a></h3>
<p>胸の日は大体ベンチプレスを中心に体の前面を鍛えるようなイメージでやっている。</p>
<p>レッグレイズや、ハンマーカール、アームカールなどだ。ベンチプレスが空いてない日は、ダンベルプレスなどで代用している。</p>
<p>ジムに半球のボールのようなものに背中を付けてレッグレイズできる器具があるのを発見して以来、レッグレイズで腹筋を鍛えるのは少し自分の中で流行っている。</p>
<p>ベンチプレスは、最大で 40kg くらいなので、まだまだ初心者だと言える。成人男性の平均的な重量らしい。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="脚の日">脚の日<a href="https://blog.satotaichi.info/keep_training_is_so_hard/#%E8%84%9A%E3%81%AE%E6%97%A5" class="hash-link" aria-label="脚の日 への直接リンク" title="脚の日 への直接リンク">​</a></h3>
<p>脚の日はレッグプレスに向けて準備をするようなイメージでトレーニングしている。</p>
<p>ヒップアダクションやヒップアブダクションから初めて足が温まってきたらレッグプレスをやっている。最後にレッグエクステンションだ。</p>
<p>しかし、今は午前中にトレーニングをしている都合上、ギリギリまで追い込んだりはしていない。非常に残念だが歩けないと会社には行けないのだ。</p>
<p>そういう訳で、レッグプレスは 60kg くらいしか上げられない。脚の筋肉は体の中でも特に大きいのだから、もっと大きな重量を上げたいものだ。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="背中の日">背中の日<a href="https://blog.satotaichi.info/keep_training_is_so_hard/#%E8%83%8C%E4%B8%AD%E3%81%AE%E6%97%A5" class="hash-link" aria-label="背中の日 への直接リンク" title="背中の日 への直接リンク">​</a></h3>
<p>背中の日はデッドリフトをする日だ。ストレッチをしっかりとやったら、まずデッドリフトをやる。軽いところから始めて重量を上げている。夕方にやるほどのパフォーマンスを朝に出せるだけの技量はまだ無いので、少し軽めだ。それでも、60kg 前後はあげられる。</p>
<p>その後に、ロー系の種目を一つ二つやって、背中の上側の筋肉を鍛えている。ラットプルダウンはどうにも苦手意識が抜けない。</p>
<p>なお、チンニングはやっていなかったら、あっという間に出来なくなった。本当に悲しい。背中の日はチンニングをやっているが、出来ても三回か四回くらいだ。３月くらいには１０回とかできてたのに…。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="一年継続して分かったこと">一年継続して分かったこと<a href="https://blog.satotaichi.info/keep_training_is_so_hard/#%E4%B8%80%E5%B9%B4%E7%B6%99%E7%B6%9A%E3%81%97%E3%81%A6%E5%88%86%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8" class="hash-link" aria-label="一年継続して分かったこと への直接リンク" title="一年継続して分かったこと への直接リンク">​</a></h2>
<p>まず、文章にすると当たり前すぎて笑ってしまうような話だが、ウェイトトレーニングを継続すると重いものを持ち上げる技術が身につく。つまり、継続的に筋トレすると、筋トレが上手になる。</p>
<p>つまり、ウェイトトレーニングで得た筋肉がすぐに他のことに役立つわけではない。</p>
<p>ただし、フォームがしっかりと身につかないと負荷をかけらずにケガをすることになる。そして、その前提条件として体の柔軟性が一定以上必要だ。</p>
<p>一週間に一回程度は理学療法士のトレーナーにストレッチを手伝って貰うことで少しずつ体が柔らかくなってきた感じはある。</p>
<p>子供の頃から体が固く、立位体前屈で-10cm 以上を記録したことは無かった。つまり、立った状態で体を前に倒して、手が地面に付いたことがない。</p>
<p>最近は-5cm くらいをウロウロしているので、現在が人生で最も柔軟な体をしていると言えなくもない。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="継続するのは難しい">継続するのは難しい<a href="https://blog.satotaichi.info/keep_training_is_so_hard/#%E7%B6%99%E7%B6%9A%E3%81%99%E3%82%8B%E3%81%AE%E3%81%AF%E9%9B%A3%E3%81%97%E3%81%84" class="hash-link" aria-label="継続するのは難しい への直接リンク" title="継続するのは難しい への直接リンク">​</a></h3>
<p>恐ろしいことに、筋トレで得られる筋肉は、日常生活ではほぼ全く使わないので、筋トレをしないとあっという間に失われる。</p>
<p>つまり、筋トレにおいて最も重要な要素は継続だ。しかし、みんな分かっていると思うが、筋トレを継続するには、とてつもない労力が必要になる。</p>
<p>僕の場合は、ジムに行くことに物凄い精神力を使う。ジムに行ってしまえば後は問題ない。ストレッチやら筋肉痛やらで痛かったりするが…。</p>
<p>色々試してみたが、どうやら継続的にジムに行くことを考えると、ジムに行く時間を夕方以降にするのは、どうやら無理っぽいということが分かってきた。仕事やら宴会やら、勉強会やら色々ありすぎて、ジムに行かない日がすぐに出来てしまう。そして、仕事終わりは精神力が失われていることが多いのでジムに行くための気力が無いことが多い。</p>
<p>そういう訳で、僕は午前中に短時間ジムへ行ってから働くことにした。今は二十四時間使えるジムが増えているので、こういう選択も取れるというのは大変素晴らしい。</p>
<p>お陰で夜寝るのがやたら早くなった。以前は、25 時くらいから就寝準備するような生活だったが、今は 22 時半には就寝準備している。遅くまで宴会をした日でもなければ、日付が変わる前に確実に寝ている。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="知らなかった副作用について">知らなかった副作用について<a href="https://blog.satotaichi.info/keep_training_is_so_hard/#%E7%9F%A5%E3%82%89%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%E5%89%AF%E4%BD%9C%E7%94%A8%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6" class="hash-link" aria-label="知らなかった副作用について への直接リンク" title="知らなかった副作用について への直接リンク">​</a></h3>
<p>トレーニングでちゃんと追い込むと、風邪を引きやすくなる。特に脚のトレーニングをしっかりやった翌日や翌々日は風邪を引く。</p>
<p>体は疲労するし、筋肉痛を治すために体の栄養素が回されるわけで、免疫系が一時的に低下するのは理にかなっている。</p>
<p>つまり、筋トレが終わった後の手洗いうがい、歯磨きは本当に大事だ。</p>
<p>尚、風邪を引いて何日か筋トレに行かないと、獲得するのにかかった時間の半分くらいの速度で筋力は衰える。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="期待した効果について">期待した効果について<a href="https://blog.satotaichi.info/keep_training_is_so_hard/#%E6%9C%9F%E5%BE%85%E3%81%97%E3%81%9F%E5%8A%B9%E6%9E%9C%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6" class="hash-link" aria-label="期待した効果について への直接リンク" title="期待した効果について への直接リンク">​</a></h3>
<p>健康な肉体を手に入れるという意味では、肉体が劣化する速度を低減できているようには感じているが、より若返っているというほどではない。</p>
<p>集中力を取り戻すという意味では、かなり取り戻せているように感じている。一日くらいなら大酒食らった後に徹夜でボードゲームするくらいのことは出来るところまで戻した。</p>
<p>週末に Magic Arena で 8 時間くらいノンストップで遊び続けるみたいなこともできている。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="情報収集の方法">情報収集の方法<a href="https://blog.satotaichi.info/keep_training_is_so_hard/#%E6%83%85%E5%A0%B1%E5%8F%8E%E9%9B%86%E3%81%AE%E6%96%B9%E6%B3%95" class="hash-link" aria-label="情報収集の方法 への直接リンク" title="情報収集の方法 への直接リンク">​</a></h2>
<p>筋トレやら健康やらの話は、兎に角デタラメな情報がネット上には溢れている。よくわからんサプリの類を売るために作られたアフィリエイトサイトみたいなやつが検索エンジンを完全に汚染しており話にならない。</p>
<p>そうは言っても、僕が読む限り真っ当なことが書いてあるように感じられるサイトはいくつかある。それが以下の二つだ。</p>
<ul>
<li><a href="https://www.rehabilimemo.com/" target="_blank" rel="noopener noreferrer">リハビリ memo</a></li>
<li><a href="https://toharabrothers.com/" target="_blank" rel="noopener noreferrer">東原兄弟＠筋トレと栄養のサイエンス | Science for the Benefit of Muscle</a></li>
</ul>
<p>僕自身は医療に関する専門教育を受けたことがあるわけでは無いので、彼らの書いてあることの正しさを検証する方法は持っていない。皆さん自分で判断して欲しい。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="使っている器具">使っている器具<a href="https://blog.satotaichi.info/keep_training_is_so_hard/#%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E5%99%A8%E5%85%B7" class="hash-link" aria-label="使っている器具 への直接リンク" title="使っている器具 への直接リンク">​</a></h2>
<p>基本的にはジムで運動しているので、家ではあまり何もやっていない。</p>
<p>ただ、ストレッチだけは家でも気が向いたらやっている。</p>
<p>色々器具の類は買った気がするが、結局継続的に使うものは限定される。</p>
<p>今でも使ってる器具はマジでおススメなので、使っていないなら是非試して欲しい。</p>
<ul>
<li><a href="http://stretchpole.com/" target="_blank" rel="noopener noreferrer">ストレッチポール</a></li>
<li><a href="http://selfbodycare.jp/rumble-roller/" target="_blank" rel="noopener noreferrer">ランブルローラー</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="飲んでいるサプリメント">飲んでいるサプリメント<a href="https://blog.satotaichi.info/keep_training_is_so_hard/#%E9%A3%B2%E3%82%93%E3%81%A7%E3%81%84%E3%82%8B%E3%82%B5%E3%83%97%E3%83%AA%E3%83%A1%E3%83%B3%E3%83%88" class="hash-link" aria-label="飲んでいるサプリメント への直接リンク" title="飲んでいるサプリメント への直接リンク">​</a></h2>
<p>次は僕が今飲んでいるサプリメントの紹介だ。別に成果が出ていると言える訳ではないが参考なればと考えている。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="ペプトプロ">ペプトプロ<a href="https://blog.satotaichi.info/keep_training_is_so_hard/#%E3%83%9A%E3%83%97%E3%83%88%E3%83%97%E3%83%AD" class="hash-link" aria-label="ペプトプロ への直接リンク" title="ペプトプロ への直接リンク">​</a></h3>
<p>加水分解カゼインというやつだ。これは値段が少々高いがマジでおススメである。</p>
<p>「ガリは飯を食い忘れ、デブは飯を食ったことを忘れる」</p>
<p>というが、僕は完全に前者だ。一度に食える飯の量も少ない。別に体が動くなら半日くらい飲まず食わずでも特に辛さを感じたりしない。間違いなく健康には悪いだろうが。</p>
<p>そういうタイプにとって、ペプトプロはマジでおススメだ。こいつは水にすごく綺麗に溶けるので満腹感が一切ない。水分による膨満感は少しあるが、普通のホエイプロテインを飲んだ時とは比べ物にならない。</p>
<p>プロテインはタンパク質に過ぎず、他の食事をとらなくても良いという訳ではないのだから、プロテインをとることが、他の食事を邪魔しないというのは幸いなことだ。</p>
<p>Amazon で変な業者のやつが買えるが、公式サイトで買う方が安いし確実だ。</p>
<ul>
<li><a href="https://www.myprotein.jp/sports-nutrition/peptopro-casein/1053017html" target="_blank" rel="noopener noreferrer">ペプトプロ</a></li>
</ul>
<p>最近パッケージが変わって、ベリーブラスト味が無くなってしまったのが問題だと感じている。</p>
<p>今はまだ、過去に買ったベリーブラスト味を新しいノンフレーバーに少し混ぜて飲んでいるが、これが無くなったら<a href="https://www.myprotein.jp/sports-nutrition/flavdrops/1053047html" target="_blank" rel="noopener noreferrer">フレーバードロップ</a>を買おうと考えている。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="オプチメン">オプチメン<a href="https://blog.satotaichi.info/keep_training_is_so_hard/#%E3%82%AA%E3%83%97%E3%83%81%E3%83%A1%E3%83%B3" class="hash-link" aria-label="オプチメン への直接リンク" title="オプチメン への直接リンク">​</a></h3>
<p>男性が必要なビタミンを中心とする栄養素の類が全部入ってるマルチビタミンと言われるようなタイプのサプリメントだ。錠剤が少し大きくて飲みづらいことを除けば一切の不満が無い。</p>
<p>こいつを毎食一錠くらいずつ飲んでいる。これを飲み始めてから数か月で InBody で計測できる体内のミネラル量が適正な量まで改善した。</p>
<ul>
<li><a href="https://iherb.co/rRfx3ok3" target="_blank" rel="noopener noreferrer">オプチメン</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="ccd">CCD<a href="https://blog.satotaichi.info/keep_training_is_so_hard/#ccd" class="hash-link" aria-label="CCD への直接リンク" title="CCD への直接リンク">​</a></h3>
<p>トレーニング用のドリンクとしては、後で説明するパープルラスを足して飲んでいる。</p>
<p>ポカリスエットよりも甘さが弱いのと口の中のべたつきが少ないので気に入っている。単に砂糖といえば砂糖なので、粉飴でも良いのではないかと思うが、こちらの方が味も良い。</p>
<p>水でも十分に溶けるし泡立ちも無いが、35 度くらいのぬるま湯だとかなりきれいに溶ける。</p>
<ul>
<li><a href="http://www.powerproduction.jp/products/ccd_dr/" target="_blank" rel="noopener noreferrer">CCD</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="パープルラス">パープルラス<a href="https://blog.satotaichi.info/keep_training_is_so_hard/#%E3%83%91%E3%83%BC%E3%83%97%E3%83%AB%E3%83%A9%E3%82%B9" class="hash-link" aria-label="パープルラス への直接リンク" title="パープルラス への直接リンク">​</a></h3>
<p>こいつは EAA に加えて、ベータアラニンが含まれているのでトレーニング中のパフォーマンスが改善するらしい。CCD に加えて飲むと味が物凄く良くなるので気に入っている。</p>
<p>俗にいうアラニンショックという飲んでから、手足の先がちょっとピリピリするような感覚が飲み始めて二週間か三週間くらいはあった。しかし、今はもうない。量を増やしてみたりもしたがアラニンショックを感じられなくなった。栄養状態が良くなるとアラニンショックは無くなるらしい。</p>
<ul>
<li><a href="https://iherb.co/dgbt5wsN" target="_blank" rel="noopener noreferrer">パープルラス</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="プロテインクリスプ">プロテインクリスプ<a href="https://blog.satotaichi.info/keep_training_is_so_hard/#%E3%83%97%E3%83%AD%E3%83%86%E3%82%A4%E3%83%B3%E3%82%AF%E3%83%AA%E3%82%B9%E3%83%97" class="hash-link" aria-label="プロテインクリスプ への直接リンク" title="プロテインクリスプ への直接リンク">​</a></h3>
<p>プロテインバーというやつだ。こいつは会社の自席に箱を置いて毎日一本ずつおやつとして食べている。何種類か味を試したが、チョコレートクランチが一番好みの味だった。</p>
<p>アメリカのお菓子なのに、甘みが穏やかなのが大変素晴らしい。</p>
<p>自席でペプトプロを飲んでいる時期もあったが、シェーカーの始末が面倒なのでやめてしまった。</p>
<p>コンビニで買ったペットボトルの水に漏斗で粉を注いで飲んでいた時期もあったが、やはり面倒になってやめてしまった。</p>
<ul>
<li><a href="https://iherb.co/iDEimquP" target="_blank" rel="noopener noreferrer">プロテインクリスプ</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="クレアチン">クレアチン<a href="https://blog.satotaichi.info/keep_training_is_so_hard/#%E3%82%AF%E3%83%AC%E3%82%A2%E3%83%81%E3%83%B3" class="hash-link" aria-label="クレアチン への直接リンク" title="クレアチン への直接リンク">​</a></h3>
<p>クレアチンを定期的に摂取すると短時間で強度の高い運動においてパフォーマンスが改善するらしいので、せっせと飲んでいる。こいつは白いカプセルで一回二錠なのでちょっと大変だ。</p>
<p>何せオプチメンと合わせて毎食三錠もサプリを飲んでる状況なのだ。</p>
<p>以前よりパフォーマンスが改善しているかと言われると、なんとも言えないところなので特におすすめはしない。</p>
<ul>
<li><a href="https://iherb.co/hSTeFRSf" target="_blank" rel="noopener noreferrer">クレアチン</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="クリルオイル">クリルオイル<a href="https://blog.satotaichi.info/keep_training_is_so_hard/#%E3%82%AF%E3%83%AA%E3%83%AB%E3%82%AA%E3%82%A4%E3%83%AB" class="hash-link" aria-label="クリルオイル への直接リンク" title="クリルオイル への直接リンク">​</a></h3>
<p>毎日とっている訳ではない。食事のなかで脂質が少し足りないかもしれないと感じた時にとっている。これ自体は、特に旨くも無ければまずくもない。</p>
<p>黒いカプセル錠なので極めて見た目が悪いが、見た目は少々悪くてもまぁ、問題は無いだろう。</p>
<ul>
<li><a href="https://iherb.co/5ktnPAHZ" target="_blank" rel="noopener noreferrer">クリルオイル</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="まとめ">まとめ<a href="https://blog.satotaichi.info/keep_training_is_so_hard/#%E3%81%BE%E3%81%A8%E3%82%81" class="hash-link" aria-label="まとめ への直接リンク" title="まとめ への直接リンク">​</a></h2>
<p>という訳で、当初思ってたほどに体がデカくなったりはしていないが、継続的に筋トレできるようにはなったという話を書いた。</p>
<p>週三回安定してジムに行くということそのものがまだまだキツい感じはあるので、成果らしい成果が出るにはまだまだ時間がかかるだろうが、ゆっくりと確実にやっていきたい。</p>
<p>明日は、<a href="https://twitter.com/shibu_jp" target="_blank" rel="noopener noreferrer">@shibu_jp</a> です。</p>]]></content>
        <author>
            <name>Sato Taichi</name>
            <uri>https://github.com/taichi</uri>
        </author>
        <category label="life" term="life"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[2018年における最高のゲームEverdellを紹介させてくれ]]></title>
        <id>https://blog.satotaichi.info/Everdell/</id>
        <link href="https://blog.satotaichi.info/Everdell/"/>
        <updated>2018-11-21T09:57:42.000Z</updated>
        <summary type="html"><![CDATA[はじめに]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="はじめに">はじめに<a href="https://blog.satotaichi.info/Everdell/#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB" class="hash-link" aria-label="はじめに への直接リンク" title="はじめに への直接リンク">​</a></h2>
<ul>
<li><a href="https://www.starling.games/everdell/" target="_blank" rel="noopener noreferrer">公式サイト</a></li>
<li><a href="https://www.kickstarter.com/projects/gamesalute/everdell-a-beautiful-board-game-of-cards-and-critt?lang=ja" target="_blank" rel="noopener noreferrer">Kickstarter の告知ページ</a></li>
</ul>
<p>まず、Kickstarter の告知ページにある動画を見て欲しい。</p>
<p>幻想的な雰囲気のなか二足歩行し言葉を交わす森の動物達が最高にかわいい。</p>
<p>このゲームは、動物の町を作るゲームで、ルールの難しい部分は全部カードに書いてあるワーカープレイスメントだ。</p>
<p>1 プレイにかかる時間は４人で遊ぶと２時間前後。初めての時は、３時間弱かかる。</p>
<p>初期セットアップすると大体こういう感じになる。</p>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/everdell_setup_top-5b3d528d4ee4cc7934292847f9f5db94.webp" width="4000" height="3000" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/everdell_setup_board-c81c32a15817920b4cb0d96db421f52d.webp" width="2187" height="1230" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="ゲームの構造">ゲームの構造<a href="https://blog.satotaichi.info/Everdell/#%E3%82%B2%E3%83%BC%E3%83%A0%E3%81%AE%E6%A7%8B%E9%80%A0" class="hash-link" aria-label="ゲームの構造 への直接リンク" title="ゲームの構造 への直接リンク">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="大まかなゲームのルール">大まかなゲームのルール<a href="https://blog.satotaichi.info/Everdell/#%E5%A4%A7%E3%81%BE%E3%81%8B%E3%81%AA%E3%82%B2%E3%83%BC%E3%83%A0%E3%81%AE%E3%83%AB%E3%83%BC%E3%83%AB" class="hash-link" aria-label="大まかなゲームのルール への直接リンク" title="大まかなゲームのルール への直接リンク">​</a></h3>
<p>詳細なルールはルールブックを読んで欲しいが、雑に図示するとこうなる。</p>
<p>非常にシンプルな構造のルールである。</p>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/everdell_rulestructure-452c16a1965e2cfd43ca868f5e420f82.png" width="681" height="971" class="img_ev3q"></p>
<p>プレイヤーが自分の手番になったら出来るのは３種類のアクションしかない。</p>
<ul>
<li>ワーカーの配置</li>
<li>カードのプレイ</li>
<li>季節の準備</li>
</ul>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="ワーカーの配置">ワーカーの配置<a href="https://blog.satotaichi.info/Everdell/#%E3%83%AF%E3%83%BC%E3%82%AB%E3%83%BC%E3%81%AE%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="ワーカーの配置 への直接リンク" title="ワーカーの配置 への直接リンク">​</a></h4>
<p>ワーカーの配置では資源を得るか、得点を得るかを選べる。最終的には得点が欲しいのだけど、その前に資源を膨らませたい。</p>
<p>イベントカードで得点するには、あらかじめカードをプレイしておく必要がある。</p>
<ul>
<li>通常のイベントカードは特定のカードタイプを指定枚数プレイすれば獲得できる。</li>
<li>特別なイベントカードは指定されたカード２枚をプレイすると獲得できる。</li>
</ul>
<p>秋のみプレイできる旅アクションは、余った手札とワーカーを勝利点に変えられる。</p>
<p>このゲームはそれぞれの季節を出来る限り長くプレイする方が得点が大きくなり易い構造をしているが、旅アクションで高得点するには、他のプレイヤーよりも早く季節を進める必要がある。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="カードのプレイ">カードのプレイ<a href="https://blog.satotaichi.info/Everdell/#%E3%82%AB%E3%83%BC%E3%83%89%E3%81%AE%E3%83%97%E3%83%AC%E3%82%A4" class="hash-link" aria-label="カードのプレイ への直接リンク" title="カードのプレイ への直接リンク">​</a></h4>
<p>カードのプレイでは、建物カードか動物カードがプレイできる。</p>
<p>建物カードは、それぞれのカードによって小枝、松ヤニ、小石が必要になる。動物カードは、ベリーでプレイできる。もし、対応する建物をプレイ済みならベリーを払わなくてもいい。</p>
<p>カードのタイプは５色あり、それぞれ効果が機能するタイミングが違う。</p>
<ul>
<li>茶は、盤面にあるカードやワーカーに触れるカードが多い。状況を変えられるのでプレイが少し難しい。</li>
<li>緑は、直接的に資源が発生するか、資源をその場で消費して何かするカードが多い。難しさはほぼ無く、見れば分かるものが多い。</li>
<li>赤は、カードをプレイした後にワーカーを配置することで機能するカードだ。派手な効果が多く、他のプレイヤーに使われてしまう可能性のあるものもある。</li>
<li>青は、条件が満たされると誘発する受動的なカードだ。例えば、建物をプレイした際に誘発する。効果が発生する回数が多いので、誘発忘れの無いようにプレイしよう。</li>
<li>紫は、特別な得点カードだが、盤面の状況によって獲得できる点数が違うので、強いことも弱いこともある。上手く自分の盤面とかみ合えば大きな得点になるのでプレイの指針になる。</li>
</ul>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="季節の準備">季節の準備<a href="https://blog.satotaichi.info/Everdell/#%E5%AD%A3%E7%AF%80%E3%81%AE%E6%BA%96%E5%82%99" class="hash-link" aria-label="季節の準備 への直接リンク" title="季節の準備 への直接リンク">​</a></h4>
<p>季節の準備はプレイ済みのワーカーを取り戻すアクションだ。</p>
<p>春と秋は緑の効果が発動する。夏は共有エリアからカードが獲得できる。</p>
<p>このゲームの面白いところは、全員が共通の森で町を作るゲームだが時間の流れは、それぞれ違うことだ。誰かが春のままなのに、誰かは秋が終わるといったことは起こりうる。</p>
<p>また、ワーカープレイスメントにおける最重要資源であるワーカーは季節の準備アクションでしか手に入らない。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="大まかなゲームのプレイ構造">大まかなゲームのプレイ構造<a href="https://blog.satotaichi.info/Everdell/#%E5%A4%A7%E3%81%BE%E3%81%8B%E3%81%AA%E3%82%B2%E3%83%BC%E3%83%A0%E3%81%AE%E3%83%97%E3%83%AC%E3%82%A4%E6%A7%8B%E9%80%A0" class="hash-link" aria-label="大まかなゲームのプレイ構造 への直接リンク" title="大まかなゲームのプレイ構造 への直接リンク">​</a></h3>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/everdell_playstructure-fbaa8aa52b1b94074983e76641d27417.png" width="641" height="261" class="img_ev3q"></p>
<p>ルールとは別にゲームプレイの構造を図示してみた。ルールがシンプルなのでプレイ構造も非常にシンプルだ。</p>
<p>ゲームの中心にあるのは、カードのプレイである。その準備として資源の獲得があり、その最終目的として得点の獲得がある。</p>
<p>一部の例外的な状況を除けば、ワーカーをプレイできる回数は全員同じである。</p>
<p>そこで獲得した資源によってプレイしたカードの相乗効果によって、より多くのカードをプレイ出来れば、多くの得点を得られる。</p>
<p>しかし、イベントカードは盤面に最初から提示される共有資源であるため、他のプレイヤーよりも効率よく条件を満たすことが望ましい。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="類似するゲームは何か">類似するゲームは何か？<a href="https://blog.satotaichi.info/Everdell/#%E9%A1%9E%E4%BC%BC%E3%81%99%E3%82%8B%E3%82%B2%E3%83%BC%E3%83%A0%E3%81%AF%E4%BD%95%E3%81%8B" class="hash-link" aria-label="類似するゲームは何か？ への直接リンク" title="類似するゲームは何か？ への直接リンク">​</a></h3>
<ul>
<li>アグリコラ<!-- -->
<ul>
<li>僕が最初に遊んだワーカープレイスメントはプエルトリコだが、繰り返し遊んだのはアグリコラだ</li>
<li>Everdell は最新のワーカープレイスメントゲームだ、但しアグリコラ程に繰り返しプレイできる強度を持っているわけではない</li>
</ul>
</li>
<li>ドミニオン<!-- -->
<ul>
<li>元 MtG プレイヤーには心の底から刺さるゲームでパックを開けなくても類似した体験ができるので最高だった。今は Arena でしっかり MtG を毎日２時間くらいは遊んでいるので、引退した筈が復帰しているのであった…</li>
<li>自分の町はデッキであり、そこに含まれるカードでコンボを作るという部分が似ている</li>
</ul>
</li>
<li>世界の七不思議<!-- -->
<ul>
<li>ドラフトでカードセットを作るゲーム</li>
<li>建物毎に無償で呼べる動物が設定されており、そのルールを上手く使うことで資源効率を上げられる部分が似ている</li>
</ul>
</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="おすすめポイント">おすすめポイント<a href="https://blog.satotaichi.info/Everdell/#%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88" class="hash-link" aria-label="おすすめポイント への直接リンク" title="おすすめポイント への直接リンク">​</a></h2>
<p>このゲームのおススメポイントをまとめるとこうだ。</p>
<ul>
<li>イラストがとにかくかわいいし、コンポーネントの作り込みが半端ない</li>
<li>中心となるルールは単純でゲームの難しい部分は全部カードに押し込んである</li>
<li>ワーカーで取った資源をカードにつなげて、そこから出力される資源で次のカードをいかに出すかを考えるのが楽しい</li>
<li>他のプレイヤーの状況を見ながら資源の拡大再生産する速度を調節するのが楽しい</li>
<li>資源の増加と速度調節はトレードオフなので正解はなく、終わった後に出来る動物の町を見て、もう一度プレイしたくなる</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="和訳ルールの入手方法">和訳ルールの入手方法<a href="https://blog.satotaichi.info/Everdell/#%E5%92%8C%E8%A8%B3%E3%83%AB%E3%83%BC%E3%83%AB%E3%81%AE%E5%85%A5%E6%89%8B%E6%96%B9%E6%B3%95" class="hash-link" aria-label="和訳ルールの入手方法 への直接リンク" title="和訳ルールの入手方法 への直接リンク">​</a></h2>
<ul>
<li><a href="https://twitter.com/godubdub/status/1022813525968707590" target="_blank" rel="noopener noreferrer">DUBDUB さん</a>による<a href="https://drive.google.com/file/d/1-C7aOHXp4IpwmcIbj3oY77t6RkWr1uoZ/view" target="_blank" rel="noopener noreferrer">和訳ルール</a></li>
<li><a href="https://twitter.com/u1bdg/status/1022738417199632384" target="_blank" rel="noopener noreferrer">U 壱さんたち</a>による<a href="https://t.co/7kH3cJMycM" target="_blank" rel="noopener noreferrer">和訳カードの画像データ</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="ゲームのおすすめな遊び方">ゲームのおすすめな遊び方<a href="https://blog.satotaichi.info/Everdell/#%E3%82%B2%E3%83%BC%E3%83%A0%E3%81%AE%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%81%AA%E9%81%8A%E3%81%B3%E6%96%B9" class="hash-link" aria-label="ゲームのおすすめな遊び方 への直接リンク" title="ゲームのおすすめな遊び方 への直接リンク">​</a></h2>
<ol>
<li>最初のゲームはビギナーバリアントで遊ぼう</li>
</ol>
<ul>
<li><a href="https://www.boardgamegeek.com/filepage/166773/everdell-spring-forward-beginner-variant" target="_blank" rel="noopener noreferrer">everdell-spring-forward-beginner-variant</a></li>
<li>サイコロを振って初期資源が貰えるのと、ルールがややこしいカードは全部除外して遊ぶってだけだ。</li>
<li>カードのルール解釈に振り回されることなく、ゲームルールと展開の把握に集中できる。</li>
</ul>
<ol start="2">
<li>通常ゲームは２ゲーム目から FAQ を手元において遊ぼう</li>
</ol>
<ul>
<li><a href="https://www.boardgamegeek.com/filepage/166740/faq" target="_blank" rel="noopener noreferrer">FAQ</a></li>
<li><a href="https://www.boardgamegeek.com/filepage/161327/everdell-official-rulebook" target="_blank" rel="noopener noreferrer">公式ルール</a></li>
<li><a href="https://www.boardgamegeek.com/filepage/169286/5th-player-basic-action-space-cards" target="_blank" rel="noopener noreferrer">5 人プレイ用のバリアントルール</a>もあるよ</li>
</ul>
<ol start="3">
<li>プレイヤーが十分に慣れてきたら２デックバリアントを試そう</li>
</ol>
<ul>
<li><a href="https://www.boardgamegeek.com/filepage/166936/everdell-2-deck-7-wonders-style-variant" target="_blank" rel="noopener noreferrer">everdell-2-deck-7-wonders-style-variant</a></li>
<li>大雑把に説明すると、生産系のカードを前半だけ、得点系のカードを後半だけに登場するよう制限されるので、ゲームの展開がまろやかになる。</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="買い方">買い方<a href="https://blog.satotaichi.info/Everdell/#%E8%B2%B7%E3%81%84%E6%96%B9" class="hash-link" aria-label="買い方 への直接リンク" title="買い方 への直接リンク">​</a></h2>
<ul>
<li>Amazon.com に <a href="https://www.amazon.com/dp/B07FYRQ4P7/" target="_blank" rel="noopener noreferrer">Collector's Edtion</a> と <a href="https://www.amazon.com/dp/B0792JY6G4/" target="_blank" rel="noopener noreferrer">通常版</a>の在庫もある。</li>
<li>Tabletop Direct Canada だと Standard Edtion が買える。<a href="https://ca.tabletop.direct/collections/card-drafting/products/everdell-standard-edition" target="_blank" rel="noopener noreferrer">everdell-standard-edition</a></li>
<li>PledgeManager で買うと 2019 年 9 月出荷。<a href="https://starlinggames.pledgemanager.com/projects/pearlbrook-the-first-expansion-for-everdell/participate/" target="_blank" rel="noopener noreferrer">pearlbrook-the-first-expansion-for-everdell/participate/</a></li>
</ul>
<p>Standard Edtion をとりあえず買える方法で買って、PledgeManager で次の拡張と Collector's Edition のコンポーネントをまとめて発注するというのが良いかもしれない。</p>
<p>来年の 9 月まで待てるなら Collector's Edtion と拡張をセットで買っても良いと思う。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="まとめ">まとめ<a href="https://blog.satotaichi.info/Everdell/#%E3%81%BE%E3%81%A8%E3%82%81" class="hash-link" aria-label="まとめ への直接リンク" title="まとめ への直接リンク">​</a></h2>
<p>最近遊んだゲームで気に入っているのは、テラフォーミングマーズだ。</p>
<p>しかし、Everdell をジャケ買いしてからは、完全に意識を支配されていると言っても過言ではない。</p>
<p>最初に Everdell をプレイした日は、そのまま連続してプレイし続け朝を迎えたくらいだ。</p>
<p>僕が観測する範囲では、Everdell は日本に１０個くらいしか入ってきていないのでは無いかと思う。</p>
<p>本当に雰囲気が良くて面白いゲームなので、みんな是非輸入して遊んで欲しい。</p>]]></content>
        <author>
            <name>Sato Taichi</name>
            <uri>https://github.com/taichi</uri>
        </author>
        <category label="boardgame" term="boardgame"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[eclipseで作るSpringアプリケーション開発環境]]></title>
        <id>https://blog.satotaichi.info/spring-application-with-eclipse/</id>
        <link href="https://blog.satotaichi.info/spring-application-with-eclipse/"/>
        <updated>2018-08-07T18:14:06.000Z</updated>
        <summary type="html"><![CDATA[はじめに]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="はじめに">はじめに<a href="https://blog.satotaichi.info/spring-application-with-eclipse/#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB" class="hash-link" aria-label="はじめに への直接リンク" title="はじめに への直接リンク">​</a></h2>
<p>ここ最近は、SUN が Oracle に買収されて Java 自体の開発に関する状況が大きく変わってきている。</p>
<p>安定的に動作することを期待されている Java が他の言語みたいにどんどん変化するって方向に変わりたいようだ。
新しいもの好きな人々にとっては話題が多いのは素晴らしいことだろうが、アプリケーションが確実に動いて欲しいと思ってる人々にとっては困った話だ。</p>
<p>僕は SIer の従業員なんで、安定的に動作するってことが Java や JVM の素晴らしさだと考えている。</p>
<p>とはいえ、大きく変化してるってんなら、ちゃんとキャッチアップしておかないと困ったことになるのは自分だ。</p>
<p>そういう訳で、今回は eclipse を使って Spring Boot のアプリケーションを開発するための環境構築について説明する。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="エントリの変更点">エントリの変更点<a href="https://blog.satotaichi.info/spring-application-with-eclipse/#%E3%82%A8%E3%83%B3%E3%83%88%E3%83%AA%E3%81%AE%E5%A4%89%E6%9B%B4%E7%82%B9" class="hash-link" aria-label="エントリの変更点 への直接リンク" title="エントリの変更点 への直接リンク">​</a></h3>
<p>最初にこのエントリを公開した時には、MockMvc と TestRestTemplate を使ってテストを書くように説明していた。
ところが、@making がより良い方法として、WebTestClient を使う方法を教えてくれたのでそちらを使うように書き換えた。</p>
<p>@making に感謝。</p>
<blockquote class="twitter-tweet" data-conversation="none" data-lang="en"><p lang="ja" dir="ltr">Spring Initializrを使わないの意図的です？<br>formatなんでもいいならspring teamがメンテナンスしているやつもあります<a href="https://t.co/po9eFXLRcK"></a><a href="https://t.co/po9eFXLRcK" target="_blank" rel="noopener noreferrer">https://t.co/po9eFXLRcK</a><br>MockMvcが嫌ならはWebTestClientはどうでしょうか？ (spring-boot-starter-webfluxも追加が必要ですが） <a href="https://t.co/9fprDo7ySA">pic.twitter.com/9fprDo7ySA</a></p>— Toshiaki Maki (@making) <a href="https://twitter.com/making/status/1027401302462976001?ref_src=twsrc%5Etfw">August 9, 2018</a></blockquote>
<script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="開発環境">開発環境<a href="https://blog.satotaichi.info/spring-application-with-eclipse/#%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83" class="hash-link" aria-label="開発環境 への直接リンク" title="開発環境 への直接リンク">​</a></h3>
<p>Thinkpad X1 Carbon 2016 年モデルに Windows10 をインストールしてある。</p>
<p>ハードウェアスペックは、こうだ。</p>
<ul>
<li>CPU i7 6600U @ 2.6GHz</li>
<li>メモリ 16GB</li>
<li>ストレージ SAMSUNG NVMe SSD 950 PRO 512GB</li>
</ul>
<p>少し高級かもしれないけど開発者用のマシンとしては普通だよね。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="アプリケーションのインストール">アプリケーションのインストール<a href="https://blog.satotaichi.info/spring-application-with-eclipse/#%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB" class="hash-link" aria-label="アプリケーションのインストール への直接リンク" title="アプリケーションのインストール への直接リンク">​</a></h2>
<p>基本的には Scoop を使ってインストールしていく。Scoop については、以前のエントリを参照して欲しい。</p>
<ul>
<li><a href="https://blog.satotaichi.info/scoop/" target="_blank" rel="noopener noreferrer">Scoop で Windows における開発環境構築を最適化しよう</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="jdk-のインストール">JDK のインストール<a href="https://blog.satotaichi.info/spring-application-with-eclipse/#jdk-%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB" class="hash-link" aria-label="JDK のインストール への直接リンク" title="JDK のインストール への直接リンク">​</a></h3>
<p>まず、Java 用の Bucket を Scoop に追加する。</p>
<blockquote>
<p>scoop bucket add java</p>
</blockquote>
<p>Bucket を追加したので、ローカルディスク上にある Bucket の情報を更新する。</p>
<blockquote>
<p>scoop update</p>
</blockquote>
<p>次に、Bucket に登録されている JDK を調べる。</p>
<blockquote>
<p>scoop search jdk</p>
</blockquote>
<p>大体こういう感じで出力されるだろう。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">'java' bucket:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ojdkbuild (10.0.2-1)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ojdkbuild10 (10.0.2-1)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ojdkbuild8 (1.8.0.181-1)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ojdkbuild9 (9.0.4-1)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    openjdk (10.0.2-13)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    openjdk10 (10.0.2-13)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    openjdk11 (11-25)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    openjdk12 (12-5)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    openjdk9 (9.0.4)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    oraclejdk-lts (8u181-b13)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    oraclejdk (10.0.2-13)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    oraclejdk10 (10.0.2-13)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    oraclejdk11 (11-25)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    oraclejdk8-ea (8u192-b02)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    oraclejdk8 (8u181-b13)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    oraclejdk8u (8u181-b13)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>今となっては OpenJDK と OracleJDK に大きな差分は無いので、OpenJDK を使えばいい。</p>
<p>というわけで、OpenJDK をインストールする。</p>
<blockquote>
<p>scoop install openjdk</p>
</blockquote>
<p>Java のインストールが成功しているか確認するために、バージョン番号を標準出力する。</p>
<blockquote>
<p>java -version</p>
</blockquote>
<p>インストール作業をした時期によって細かい部分は違うだろうが、大体こういう出力がされる。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">openjdk 10.0.2 2018-07-17</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">OpenJDK Runtime Environment 18.3 (build 10.0.2+13)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">OpenJDK 64-Bit Server VM 18.3 (build 10.0.2+13, mixed mode)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>マジでどうでもいい話だが、今は <code>--version</code> でもバージョン情報を得られる。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="gradle-のインストール">Gradle のインストール<a href="https://blog.satotaichi.info/spring-application-with-eclipse/#gradle-%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB" class="hash-link" aria-label="Gradle のインストール への直接リンク" title="Gradle のインストール への直接リンク">​</a></h3>
<p>Gradle をインストールするのは、プロジェクトを最初に作る人間だけでいい。</p>
<p>何故なら、プロジェクトを作った後は使う Gradle のバージョンを揃えるために <code>Gradle Wrapper</code> という仕組みを使うからだ。
要はプロジェクトディレクトリの直下に <code>gradlew.bat</code> とかある、あれを使うって事。</p>
<p>Scoop で Gradle をインストールする。</p>
<blockquote>
<p>scoop install gradle</p>
</blockquote>
<p>これで、ソースコード付きの Gradle がローカルインストールされる。
もし、ネットワークの帯域を節約したいなら、実行バイナリだけが含まれている <code>gradle-bin</code> をインストールしてもいい。
その場合、何かトラブルが起きた時には念力デバッグが必要になる。</p>
<p>Gradle のインストールが成功しているか確認するために、バージョン番号を標準出力する。</p>
<blockquote>
<p>gradle --version</p>
</blockquote>
<p>大体こういう風に出力される。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">WARNING: An illegal reflective access operation has occurred</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">WARNING: Illegal reflective access by org.codehaus.groovy.reflection.CachedClass (file:/C:/Users/taichi/scoop/apps/gradle/current/lib/groovy-all-2.4.12.jar) to method java.lang.Object.finalize()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">WARNING: Please consider reporting this to the maintainers of org.codehaus.groovy.reflection.CachedClass</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">WARNING: All illegal access operations will be denied in a future release</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">------------------------------------------------------------</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Gradle 4.9</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">------------------------------------------------------------</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Build time:   2018-07-16 08:14:03 UTC</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Revision:     efcf8c1cf533b03c70f394f270f46a174c738efc</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Kotlin DSL:   0.18.4</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Kotlin:       1.2.41</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Groovy:       2.4.12</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Ant:          Apache Ant(TM) version 1.9.11 compiled on March 23 2018</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">JVM:          10.0.2 ("Oracle Corporation" 10.0.2+13)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">OS:           Windows 10 10.0 amd64</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Java9 以来発生している警告で、Java10 を使っている限り出力される。Gradle5 になれば出力されなくなるらしい。cf. <a href="https://github.com/gradle/gradle/issues/2995" target="_blank" rel="noopener noreferrer">Upgrade to Groovy 2.4.12 for full Java 9 compatibility</a></p>
<p>ワークアラウンドとして <code>JAVA_OPTS</code> 環境変数を以下のように設定しておく。</p>
<blockquote>
<p>--add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED</p>
</blockquote>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/env-fbf96b7452e3744c5e9ed5535160cd79.png" width="1528" height="771" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="eclipse-のインストール">eclipse のインストール<a href="https://blog.satotaichi.info/spring-application-with-eclipse/#eclipse-%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB" class="hash-link" aria-label="eclipse のインストール への直接リンク" title="eclipse のインストール への直接リンク">​</a></h3>
<p>次は、eclipse のインストールだ。Scoop を使ってインストールしても良いがチューニングの経過を保存し易いように zip アーカイブをダウンロードして使う。</p>
<p>以下のページから <code>Windows 64-bit</code> のリンクをクリックしてダウンロードする。</p>
<ul>
<li><a href="http://www.eclipse.org/downloads/packages/release/photon/r/eclipse-ide-java-developers" target="_blank" rel="noopener noreferrer">Eclipse IDE for Java Developers</a></li>
</ul>
<p>Eclipse Installer はマジで素晴らしい仕組みだとは思うが、GUI 操作が多すぎて何度もインストールしたり捨てたりするような使い方には向いていない。</p>
<p>ダウンロードした zip ファイルを適当なディレクトリに展開すればインストールは完了だ。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="eclipse-のチューニング">eclipse のチューニング<a href="https://blog.satotaichi.info/spring-application-with-eclipse/#eclipse-%E3%81%AE%E3%83%81%E3%83%A5%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0" class="hash-link" aria-label="eclipse のチューニング への直接リンク" title="eclipse のチューニング への直接リンク">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="eclipseini">eclipse.ini<a href="https://blog.satotaichi.info/spring-application-with-eclipse/#eclipseini" class="hash-link" aria-label="eclipse.ini への直接リンク" title="eclipse.ini への直接リンク">​</a></h3>
<p>メモリの上限を変更しつつ、class の検証オプションを無効化する。
あまり変なプラグインは使っていないことが前提になる。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">-Xmx8g</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">-Xverify:none</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>自由にプラグインを追加したいなら、 <code>-Xverify:none</code> にはリスクがある。
クラスファイルが想定していないような書き換えが行われることで、そこから派生して情報漏洩したり、知らないうちに DDoS 攻撃に参加させられてしまうかもしれない。</p>
<p>eclipse のデフォルトだと G1GC を使う事になっている。
しかし、メモリが最大 8G 程度のアプリケーションで G1GC を使うのはちょっとオーバーヘッドが大きすぎないか？と思っている。
ただ、CMS やパラレル GC との差分を調べる気力が無いので、そのままにした。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="設定のチューニング">設定のチューニング<a href="https://blog.satotaichi.info/spring-application-with-eclipse/#%E8%A8%AD%E5%AE%9A%E3%81%AE%E3%83%81%E3%83%A5%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0" class="hash-link" aria-label="設定のチューニング への直接リンク" title="設定のチューニング への直接リンク">​</a></h3>
<p><code>General</code> の Show heap status を on</p>
<p>メモリが不足していたら分かるようにするためだ。バケツボタンを押して GC をトリガーすることもできる。</p>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/show-heap-status-427128977a2d79f4814f3b5c5c085aaf.png" width="936" height="469" class="img_ev3q"></p>
<p><code>General &gt; News</code> の Enable automatic new polling を off</p>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/news-polling-26b8cd1746344f94556aaa9f43a596cd.png" width="1090" height="476" class="img_ev3q"></p>
<p><code>General &gt; Startup and Shutdown</code> の 大半を off</p>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/start-and-shutdown-c16672d1c9ae5b67b4219cf261425e35.png" width="1099" height="643" class="img_ev3q"></p>
<p><code>General &gt; Workspace</code> の Text file encoding を <code>UTF-8</code></p>
<p>MS932 のままでコードを書くと、本当に沢山のトラブルに巻き込まれることになる。</p>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/encoding-8cde9d745a20bda6f42fc49d82c94010.png" width="1063" height="842" class="img_ev3q"></p>
<p><code>Install/Update &gt; Automatic Updates</code> の Automatically find new updates and notify me を off</p>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/automatic-updates-d3bb64e5ec23cee4b9a448f5317c53b3.png" width="994" height="604" class="img_ev3q"></p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="java-のコーディングを便利にするチューニング">Java のコーディングを便利にするチューニング<a href="https://blog.satotaichi.info/spring-application-with-eclipse/#java-%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%92%E4%BE%BF%E5%88%A9%E3%81%AB%E3%81%99%E3%82%8B%E3%83%81%E3%83%A5%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0" class="hash-link" aria-label="Java のコーディングを便利にするチューニング への直接リンク" title="Java のコーディングを便利にするチューニング への直接リンク">​</a></h4>
<p>Java プロジェクトを一つ作る。中身はなんでもいい。以下の設定が終わったら、当該プロジェクトは消す。</p>
<p><code>Java &gt; Appearance &gt; Type Filters</code> に <code>java.awt</code> と <code>javax.print</code> を追加</p>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/type-filters-428569ab99e4712b150f3c8217b00f0a.png" width="1023" height="514" class="img_ev3q"></p>
<p><code>Java &gt; Editor &gt; Content Asist &gt; Advanced</code> で 不要な入力補完機能を off。上と下に二つ同じ項目があるので、要注意。</p>
<ul>
<li>Java Proposals (Task-focused) は Mylyn 系の機能なので明確に不要</li>
<li>SWT Template Proposals は SWT 用なので明確に不要</li>
<li>Adaptive Template Proposals は 使ってみて邪魔なら後で off にする</li>
<li>Code Recommenders 系は、かなり重いので off にすると快適になる</li>
</ul>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/content-assist-7de63e4464e80fab72ec2bf38004163b.png" width="1123" height="881" class="img_ev3q"></p>
<p><code>Java &gt; Editor &gt; Save Actions</code> で Perform the selected actions on save を on</p>
<p>コードのフォーマットや import 文の整理などというのは、人間がやることではないのだよ。</p>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/save-actions-83b1711e81a419f731fe9d645b76a8af.png" width="1117" height="470" class="img_ev3q"></p>
<p><code>Java &gt; Editor &gt; Typing</code> で Automatically insert at current position の Semicolons を on
これで、行のどこでセミコロンキーを押しても正しい位置にセミコロンが入力される。</p>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/auto-insert-semicolon-fd70c5c94ac28eb95e847e3e261b5557.png" width="1112" height="778" class="img_ev3q"></p>
<p><code>Java &gt; Installed JREs</code> でローカルに複数の JRE や JDK をインストールしているなら登録する。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="便利なプラグインの導入">便利なプラグインの導入<a href="https://blog.satotaichi.info/spring-application-with-eclipse/#%E4%BE%BF%E5%88%A9%E3%81%AA%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%AE%E5%B0%8E%E5%85%A5" class="hash-link" aria-label="便利なプラグインの導入 への直接リンク" title="便利なプラグインの導入 への直接リンク">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="google-java-format-プラグイン">google-java-format プラグイン<a href="https://blog.satotaichi.info/spring-application-with-eclipse/#google-java-format-%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3" class="hash-link" aria-label="google-java-format プラグイン への直接リンク" title="google-java-format プラグイン への直接リンク">​</a></h4>
<p>ソースコードのフォーマットは、どんなルールでやろうが一貫性のあるルールなら好きなようにすればいいが、その作業自体は人間がやることではない。</p>
<p>エディタなり IDE なりに自動的にやってもらうものだ。</p>
<p>eclipse にもフォーマットの機能はあるけど、他の IDE やエディタを使っている人とその内容を共有するのが難しいのが問題だ。
それに eclipse のデフォルト設定だと最近のコア API やライブラリが採用しているスタイルのコードが読み易くにフォーマットされないという問題もある。</p>
<p>IntelliJ みたいな他の IDE と設定を共有できてまともに使えるコードフォーマッタは、僕が知っている限りでは google-java-format くらいしかない。</p>
<p>と言うわけで、google-java-format プラグインを導入しよう。</p>
<p>まずは、リリースページに行って、最新の jar ファイルをダウンロードする。<code>google-java-format-eclipse-plugin_x.x.x.jar</code> みたいなやつがそれだ。</p>
<ul>
<li><a href="https://github.com/google/google-java-format/releases" target="_blank" rel="noopener noreferrer">google/google-java-format/releases</a></li>
</ul>
<p>ダウンロードしてきた Jar ファイルを eclipse の dropins フォルダにコピーする。その後、eclipse を再起動するとプラグインがインストールされる。</p>
<ul>
<li><a href="http://help.eclipse.org/neon/index.jsp?topic=%2Forg.eclipse.platform.doc.isv%2Freference%2Fmisc%2Fp2_dropins_format.html" target="_blank" rel="noopener noreferrer">The dropins folder and supported file layouts</a></li>
</ul>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/dropins-96da19fea851190e57cd50d8a2be5c48.png" width="1054" height="271" class="img_ev3q"></p>
<p>プラグインがインストールされたら、<code>Java &gt; Code Style &gt; Formatter</code> の<code>Formatter Implementation</code>コンボボックスで、 <code>google-java-format</code> を選ぶ。</p>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/formatter-4046ee809e3a9ff481d868b71d27357b.png" width="847" height="471" class="img_ev3q"></p>
<p>最後に、eclipse デフォルトのフォーマッタと google-java-format を使った時の見た目がどう変わるのか確認しておこう。</p>
<p>どんなふうになっていると見易いかってのは、個人の主観によるところが大きいとは思うので、みんな見比べてみて欲しい。</p>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="eclipse-のデフォルト設定">eclipse のデフォルト設定<a href="https://blog.satotaichi.info/spring-application-with-eclipse/#eclipse-%E3%81%AE%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E8%A8%AD%E5%AE%9A" class="hash-link" aria-label="eclipse のデフォルト設定 への直接リンク" title="eclipse のデフォルト設定 への直接リンク">​</a></h5>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/format-eclipse-956d77146637660621c58d67d5f1d57c.png" width="1183" height="700" class="img_ev3q"></p>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="google-java-format">google-java-format<a href="https://blog.satotaichi.info/spring-application-with-eclipse/#google-java-format" class="hash-link" aria-label="google-java-format への直接リンク" title="google-java-format への直接リンク">​</a></h5>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/format-google-cbc05ba82c57b04c70b5894584910f17.png" width="838" height="772" class="img_ev3q"></p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="ターミナルを起動するプラグイン">ターミナルを起動するプラグイン<a href="https://blog.satotaichi.info/spring-application-with-eclipse/#%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E3%82%92%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3" class="hash-link" aria-label="ターミナルを起動するプラグイン への直接リンク" title="ターミナルを起動するプラグイン への直接リンク">​</a></h4>
<p><a href="https://github.com/anb0s/EasyShell" target="_blank" rel="noopener noreferrer">EasyShell</a> というプラグインを eclipse に導入すると、eclipse のプロジェクトビューから直接ターミナルが起動できる。</p>
<p>Help メニューから Eclipse Marketplace を起動して、検索エリアに <code>EasyShell</code> と入力すれば見つけられる。</p>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/EasyShell-9790f1c2274c8f75743324d55e88c2cf.png" width="1213" height="490" class="img_ev3q"></p>
<p>EasyShell のインストールが終わったら、コンテキストメニューの設定を変更する。</p>
<p>EasyShell &gt; (1) Menu から、一行目を選んだ状態にした後、<code>Edit</code> ボタンをクリック。</p>
<p>Filter に <code>Power</code> と入力すると、その一行下のセレクトボックスに <code>Open - PowerShell (Plugin)</code> と表示される。この状態で OK を押す。</p>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/EasyShell-add-PowerShell-c4dbbb845ab90f75e48e40d947163f31.png" width="966" height="539" class="img_ev3q"></p>
<p>こんな風に変わる。</p>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/EasyShell-After-Edit-51bb0f0295fea782b88487839fb3f3bf.png" width="1231" height="307" class="img_ev3q"></p>
<p><code>Run with Command Prompt</code> は使わないので、左側のチェックボックスを外している。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="プロジェクトの作成">プロジェクトの作成<a href="https://blog.satotaichi.info/spring-application-with-eclipse/#%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90" class="hash-link" aria-label="プロジェクトの作成 への直接リンク" title="プロジェクトの作成 への直接リンク">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="java-プロジェクトの作成">Java プロジェクトの作成<a href="https://blog.satotaichi.info/spring-application-with-eclipse/#java-%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90" class="hash-link" aria-label="Java プロジェクトの作成 への直接リンク" title="Java プロジェクトの作成 への直接リンク">​</a></h3>
<p>次は、eclipse で Java プロジェクトを作ろう。ここでは、説明のために <code>first-spring-boot</code> とする。
module-info を作るか聞かれるかもしれないが、 <code>Don't Create</code> を選んでいい。</p>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/create-project-f5c6bda3df2ec84fe3eac32efe91bc6e.png" width="900" height="1057" class="img_ev3q"></p>
<p>プロジェクトが出来たら、Java プロジェクトのコンテキストメニューから EasyShell &gt; Open PowerShell Here と選び PowerShell を起動する。</p>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/EasyShell-Open-PowerShell-0721681fa12ba17abbac36c7515f7d47.png" width="1019" height="408" class="img_ev3q"></p>
<p>起動した PowerShell で、以下のコマンドを実行する。</p>
<blockquote>
<p>gradle init</p>
</blockquote>
<p>これで、プロジェクトの直下に Gradle 関連のリソースがいくつか作られる。</p>
<ul>
<li>gradle フォルダ</li>
<li>build.gradle</li>
<li>gradlew</li>
<li>gradlew.bat</li>
<li>settings.gradle</li>
</ul>
<p>eclipse 側に戻って、Java プロジェクトのコンテキストメニューから Configure &gt; Add Gradle Nature を選ぶ。
これで、eclipse が当該プロジェクトを Gradle プロジェクトだと認識するようになる。</p>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/configure-gradle-nature-5022d01e4cc1c08b4d68f26e5aa70c55.png" width="799" height="889" class="img_ev3q"></p>
<p>最後に Java プロジェクトのプロパティで Gradle の設定を変える。</p>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/gradle-settings-09af4cf85d2c60d421070dd15f0c674e.png" width="922" height="530" class="img_ev3q"></p>
<p>まず、Override workspace settings のチェックボックスを on にする。
次に、Automatic Project Synchronization のチェックボックスを on にする。</p>
<p>何故、こんなややこしい手順で Gradle プロジェクトを作っているのかというと、eclipse の Gradle プラグインが内部に抱え込んでいる Gradle が古いからだ。</p>
<p>最後に、さっき起動した PowerShell で Gradle 標準のソースコードディレクトリを作る。</p>
<blockquote>
<p>mkdir -p src/main/java
mkdir -p src/main/resources
mkdir -p src/test/java
mkdir -p src/test/resources</p>
</blockquote>
<p>eclipse の外側でディレクトリを作ったので、Java プロジェクトのコンテキストメニューから Refresh を実行する。</p>
<p>次に、<code>src</code> ディレクトリのコンテキストメニューから Build Path &gt; Remove from Build Path を選ぶ。</p>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/remove-from-build-path-0501900e859fdfae9c0511dee7f2fa42.png" width="969" height="519" class="img_ev3q"></p>
<p>更に、さっき作ったディレクトリを全部展開する。コントロールキーを押しながら左クリックを四回繰り返して四つのフォルダを選択状態にした上で、 コンテキストメニューから Build Path &gt; Use as Source Folder を選ぶ。</p>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/use-as-source-folder-b66d440f593f278a11b3c1c503a5857f.png" width="877" height="586" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="gradle-のビルドスクリプトを初期設定する">Gradle のビルドスクリプトを初期設定する<a href="https://blog.satotaichi.info/spring-application-with-eclipse/#gradle-%E3%81%AE%E3%83%93%E3%83%AB%E3%83%89%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%92%E5%88%9D%E6%9C%9F%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B" class="hash-link" aria-label="Gradle のビルドスクリプトを初期設定する への直接リンク" title="Gradle のビルドスクリプトを初期設定する への直接リンク">​</a></h3>
<p>eclipse で build.gradle を開き以下の内容をコピペする。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">plugins {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	id 'java'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">repositories {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	maven {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		url 'https://maven-central-asia.storage-download.googleapis.com/repos/central/data/'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	jcenter()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	mavenCentral()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sourceCompatibility = targetCompatibility = 1.10</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">tasks.withType(AbstractCompile)*.options*.encoding = 'UTF-8'</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><code>repositories</code> ブロックでは、Google が用意している Maven Central リポジトリのミラーを参照するようにしている。
これは、僕がいるネットワーク内だと大抵の場合、Apache が運営しているものよりも高速にライブラリをダウンロードできるからだ。</p>
<ul>
<li><a href="https://storage-download.googleapis.com/maven-central/index.html" target="_blank" rel="noopener noreferrer">Maven Central mirror hosted on Google Cloud Storage</a></li>
</ul>
<p>今回は Java10 で作業しているので、 <code>sourceCompatibility</code> は <code>1.10</code> にしている。別に <code>1.8</code> くらいでも全然問題ない。</p>
<p>末尾にかなり奇妙なコードが書いてあるが、これはソースコードのエンコーディングを全て <code>UTF-8</code> で統一するまじないの一種だと考えてくれればいい。</p>
<p>尚、Gradle 側には eclipse プラグインは特に導入しない。</p>
<p>設定が正しくなされているかを確認するために、PowerShell で以下のコマンドを実行する。</p>
<blockquote>
<p>.\gradlew build</p>
</blockquote>
<p>ここからは、<code>Gradle Wrapper</code> を使って作業するのでプロジェクトディレクトリの直下にあるシェルスクリプトを使っている。
特に問題が無ければ、以下のように出力される。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">BUILD SUCCESSFUL in 1s</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">1 actionable task: 1 up-to-date</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="junit5-を導入する">JUnit5 を導入する<a href="https://blog.satotaichi.info/spring-application-with-eclipse/#junit5-%E3%82%92%E5%B0%8E%E5%85%A5%E3%81%99%E3%82%8B" class="hash-link" aria-label="JUnit5 を導入する への直接リンク" title="JUnit5 を導入する への直接リンク">​</a></h3>
<p>次は、JUnit5 を Gradle に導入しよう。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">test {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	useJUnitPlatform()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	systemProperty('java.awt.headless', true)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	jvmArgs '--add-opens=java.base/java.lang=ALL-UNNAMED', '--add-opens=java.base/java.lang.invoke=ALL-UNNAMED'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">dependencies {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	testImplementation 'org.junit.jupiter:junit-jupiter-api:5.2.+'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	testRuntimeOnly    'org.junit.jupiter:junit-jupiter-engine:5.2.+'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>JUnit5 を Gradle で使うには、 <code>test</code> ブロックで <code>useJUnitPlatform()</code> を呼ぶ必要がある。</p>
<p>ユニットテストの実行中は、AWT を使う気が無いのでシステムプロパティの <code>java.awt.headless</code> を有効化している。</p>
<p>Gradle のインストール辺りで触れたリフレクション周りの警告が出ないようにするワークアラウンドをここでも追加している。
Gradle5 になれば、このオプションは要らなくなる。</p>
<p><code>dependencies</code> ブロックでは、JUnit5 のライブラリを二つ追加している。</p>
<p>詳細な使い方や、ライブラリの意味なんかは <a href="https://junit.org/junit5/docs/current/user-guide/" target="_blank" rel="noopener noreferrer">JUnit 5 User Guide</a> を参照して欲しい。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="テストコードの動作確認">テストコードの動作確認<a href="https://blog.satotaichi.info/spring-application-with-eclipse/#%E3%83%86%E3%82%B9%E3%83%88%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D" class="hash-link" aria-label="テストコードの動作確認 への直接リンク" title="テストコードの動作確認 への直接リンク">​</a></h4>
<p>テストコードが上手く動作するか確認しておこう。</p>
<p><code>src/test/java</code> フォルダに、 FirstTest クラスを作成する。</p>
<p>以下のコードをコピーした後、当該フォルダを選択してペーストすれば eclipse がファイルを作ってくれる。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">import static org.junit.jupiter.api.Assertions.assertEquals;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">import org.junit.jupiter.api.BeforeEach;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">import org.junit.jupiter.api.Test;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">public class FirstTest {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	String message;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	@BeforeEach</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	public void setUp() throws Exception {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		this.message = "Hello";</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	@Test</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	public void hello() throws Exception {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		assertEquals("Hello", this.message);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>JUnit4 では、<code>@Before</code> だったものが JUnit5 では、 <code>@BeforeEach</code> に変ったので注意しよう。</p>
<p>ちなみに僕は <code>@Before</code> を付けた <code>setUp</code> メソッドが何回やっても実行されずにドハマりした。</p>
<p>まずは、 eclipse でこのテストコードが動かせるか確認しよう。</p>
<p>このコードのコンテキストメニューから、 Run As &gt; JUnit Test と選択する。
<img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/run-as-JUnit-Test-2c57df8b260ef33c2f0cd3d44374ee1a.png" width="994" height="976" class="img_ev3q"></p>
<p>上手く動作すればテストビューでグリーンバーが見られる。</p>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/junit-green-7e3aaed2e8c70bb6411ac7673407e762.png" width="642" height="283" class="img_ev3q"></p>
<p>次に、Gradle でこのテストコードが動かせるか確認しよう。</p>
<blockquote>
<p>.\gradlew test</p>
</blockquote>
<p>必ず失敗するようにテストコードを変更して動作確認するのも忘れずに。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="spring-boot-を導入する">Spring Boot を導入する<a href="https://blog.satotaichi.info/spring-application-with-eclipse/#spring-boot-%E3%82%92%E5%B0%8E%E5%85%A5%E3%81%99%E3%82%8B" class="hash-link" aria-label="Spring Boot を導入する への直接リンク" title="Spring Boot を導入する への直接リンク">​</a></h3>
<p>さて、本丸の Spring Boot 導入だ。</p>
<p>まずはシンプルに Spring Boot で開発するのに最小限必要な依存性を追加したビルドスクリプトがこれだ。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">plugins {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	id 'java'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	id 'org.springframework.boot' version '2.0.4.RELEASE'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	id 'io.spring.dependency-management' version '1.0.6.RELEASE'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">repositories {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	maven {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		url 'https://maven-central.storage.googleapis.com'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	jcenter()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	mavenCentral()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sourceCompatibility = targetCompatibility = 1.10</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">tasks.withType(AbstractCompile)*.options*.encoding = 'UTF-8'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">bootJar {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    baseName = 'first-spring-boot'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    version =  '0.1.0'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">test {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	useJUnitPlatform()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	systemProperty('java.awt.headless', true)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	jvmArgs '--add-opens=java.base/java.lang=ALL-UNNAMED', '--add-opens=java.base/java.lang.invoke=ALL-UNNAMED'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">dependencies {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	implementation 'org.springframework.boot:spring-boot-starter-web'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	testImplementation 'org.springframework.boot:spring-boot-starter-test'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	testImplementation 'org.junit.jupiter:junit-jupiter-api:5.2.0'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	testRuntimeOnly    'org.junit.jupiter:junit-jupiter-engine:5.2.0'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>まず、 Gradle の Spring Boot プラグインを導入している。 <code>plugins</code> ブロックに増えた二行がそれだ。</p>
<p>これによって、ビルドスクリプトの中で <code>bootJar</code> ブロックが使えるようになった。<code>baseName</code> と <code>version</code> は必須なので適当な値を設定しておく。</p>
<p>最後に依存ライブラリとして、 <code>spring-boot-starter-web</code> と <code>spring-boot-starter-test</code> を追加して完成だ。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="spring-boot-アプリケーションの作成">Spring Boot アプリケーションの作成<a href="https://blog.satotaichi.info/spring-application-with-eclipse/#spring-boot-%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E4%BD%9C%E6%88%90" class="hash-link" aria-label="Spring Boot アプリケーションの作成 への直接リンク" title="Spring Boot アプリケーションの作成 への直接リンク">​</a></h4>
<p>Spring Boot アプリケーションとして動作確認するためのコードを用意する。</p>
<p>以下のコードを <code>src/main/java</code> フォルダに eclipse でコピペすれば、パッケージも込みで自動的に作ってくれる。便利！</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">package hello;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">import org.springframework.boot.SpringApplication;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">import org.springframework.boot.autoconfigure.SpringBootApplication;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">@SpringBootApplication</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">public class Application {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  public static void main(String[] args) {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    SpringApplication.run(Application.class, args);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">package hello;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">import org.springframework.web.bind.annotation.RequestMapping;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">import org.springframework.web.bind.annotation.RestController;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">@RestController</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">public class HelloController {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  @RequestMapping("/")</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  public String index() {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    return "Greetings from Spring Boot!";</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Application クラスのコンテキストメニューで、 Run As &gt; Java Application を選択するとサーバが起動する。</p>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/run-as-Java-Application-8af9ae228bc7a201ca800742f778c85e.png" width="1023" height="930" class="img_ev3q"></p>
<p>Console ビューに出るログが止まった辺りでブラウザを使って <code>http://localhost:8080/</code> にアクセスしよう。</p>
<p>上手く動作しているなら、</p>
<blockquote>
<p>Greetings from Spring Boot!</p>
</blockquote>
<p>とブラウザに表示される。</p>
<p>Gradle を使ってアプリケーションを起動するなら、</p>
<blockquote>
<p>.\gradlew bootrun</p>
</blockquote>
<p>で、同じように実行できる。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="spring-boot-アプリケーションをテストする">Spring Boot アプリケーションをテストする<a href="https://blog.satotaichi.info/spring-application-with-eclipse/#spring-boot-%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E3%83%86%E3%82%B9%E3%83%88%E3%81%99%E3%82%8B" class="hash-link" aria-label="Spring Boot アプリケーションをテストする への直接リンク" title="Spring Boot アプリケーションをテストする への直接リンク">​</a></h4>
<p>次は、テストコードを書いてみよう。</p>
<p>まずは、サーバを使わずにコントローラをテストする。 その前に Spring WebFlux をテスト用の依存性に加えておく。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">dependencies {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	implementation 'org.springframework.boot:spring-boot-starter-web'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	testImplementation 'org.springframework.boot:spring-boot-starter-test'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	testImplementation 'org.springframework.boot:spring-boot-starter-webflux'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	testImplementation 'org.junit.jupiter:junit-jupiter-api:5.2.0'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	testRuntimeOnly    'org.junit.jupiter:junit-jupiter-engine:5.2.0'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><code>dependencies</code> ブロックだけ抜粋したが、 <code>spring-boot-starter-webflux</code> がそれだ。
Spring WebFlux はリアクティブアプリケーションを構築するための新しい枠組みだが、全てが非同期指向になるため使う場所を選ぶ。
具体的に言うと、JDBC を使うアプリケーションでは適用できない。</p>
<p>今回は、Spring WebFlux の一部である <code>WebTestClient</code> という便利な API をテストのときだけ使う。</p>
<p>こいつは、何が素晴らしいって僕の嫌いな Hamcrest に依存している MockMvc を使わなくて良くなる上に、
ユニットテストとインテグレーションテストを同じ API 体系の中でテストできるのだ。使わない理由はない。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">package hello;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">import org.junit.jupiter.api.BeforeEach;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">import org.junit.jupiter.api.Test;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">import org.junit.jupiter.api.extension.ExtendWith;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">import org.springframework.beans.factory.annotation.Autowired;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">import org.springframework.boot.test.context.SpringBootTest;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">import org.springframework.http.MediaType;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">import org.springframework.test.context.junit.jupiter.SpringExtension;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">import org.springframework.test.web.reactive.server.WebTestClient;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">@ExtendWith(SpringExtension.class)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">@SpringBootTest(webEnvironment = WebEnvironment.MOCK)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">public class HelloControllerTest {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  WebTestClient client;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  @Autowired HelloController target;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  @BeforeEach</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  public void setUp() throws Exception {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    this.client = WebTestClient.bindToController(this.target).build();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  @Test</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  public void getHello() throws Exception {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    this.client</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        .get()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        .uri("/")</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        .accept(MediaType.APPLICATION_JSON)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        .exchange()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        .expectStatus()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        .isOk()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        .expectBody(String.class)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        .isEqualTo("Greetings from Spring Boot!");</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>スッキリとテストを書けるのが分るだろう。テストの実行方法は既に説明したとおりだ。</p>
<p>次は、サーバを起動してテストするインテグレーションテストだ。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">package hello;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">import org.junit.jupiter.api.Test;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">import org.junit.jupiter.api.extension.ExtendWith;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">import org.springframework.beans.factory.annotation.Autowired;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">import org.springframework.boot.test.context.SpringBootTest;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">import org.springframework.test.context.junit.jupiter.SpringExtension;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">import org.springframework.test.web.reactive.server.WebTestClient;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">@ExtendWith(SpringExtension.class)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">public class HelloControllerIT {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  @Autowired WebTestClient client;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  @Test</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  public void getHello() throws Exception {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    this.client</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        .get()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        .uri("/")</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        .exchange()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        .expectStatus()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        .isOk()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        .expectBody(String.class)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        .isEqualTo("Greetings from Spring Boot!");</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>ローカルのサーバに接続して行うインテグレーションテストなら、更にコードは短くなる。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="spring-boot-を調整する">Spring Boot を調整する<a href="https://blog.satotaichi.info/spring-application-with-eclipse/#spring-boot-%E3%82%92%E8%AA%BF%E6%95%B4%E3%81%99%E3%82%8B" class="hash-link" aria-label="Spring Boot を調整する への直接リンク" title="Spring Boot を調整する への直接リンク">​</a></h3>
<p>さて、一通りテストまで動いたので Spring Boot アプリケーションは開発できるようになったと言いたい所だが、まだ続きがある。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="動作するサーブレットコンテナを変える">動作するサーブレットコンテナを変える<a href="https://blog.satotaichi.info/spring-application-with-eclipse/#%E5%8B%95%E4%BD%9C%E3%81%99%E3%82%8B%E3%82%B5%E3%83%BC%E3%83%96%E3%83%AC%E3%83%83%E3%83%88%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%82%92%E5%A4%89%E3%81%88%E3%82%8B" class="hash-link" aria-label="動作するサーブレットコンテナを変える への直接リンク" title="動作するサーブレットコンテナを変える への直接リンク">​</a></h4>
<p>Spring Boot がデフォルトで使うサーブレットコンテナは Tomcat だ。まぁ、猫さんはみんなに人気があるので仕方がない。</p>
<p>しかし、猫さんは動作がモッサリなのでキビキビ動く Undertow にサーブレットコンテナを切り替えよう。</p>
<p><code>dependencies</code> ブロックだけを抜粋して説明するが、こういう風になる。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">dependencies {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	implementation ('org.springframework.boot:spring-boot-starter-web') {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	runtimeOnly 'org.springframework.boot:spring-boot-starter-undertow'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	testImplementation 'org.springframework.boot:spring-boot-starter-test'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	testImplementation 'org.springframework.boot:spring-boot-starter-webflux'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	testImplementation 'org.junit.jupiter:junit-jupiter-api:5.2.+'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	testRuntimeOnly    'org.junit.jupiter:junit-jupiter-engine:5.2.+'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>まず、 <code>spring-boot-starter-web</code> の自動的な依存性から <code>spring-boot-starter-tomcat</code> を取り除く。これで Tomcat が自動的に使われることはなくなる。</p>
<p>次に、<code>spring-boot-starter-undertow</code> を依存性に追加して、Undertow が自動的に使われるようにする。</p>
<p>小さいアプリケーションだと差分は小さいけど、アプリケーションが大きくなると起動時間というのは、生産性に大きく関わってくる部分なので少しでも速くしたいよね。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="junit4-と-hamcrest-を推移的な依存性から排除する">JUnit4 と Hamcrest を推移的な依存性から排除する<a href="https://blog.satotaichi.info/spring-application-with-eclipse/#junit4-%E3%81%A8-hamcrest-%E3%82%92%E6%8E%A8%E7%A7%BB%E7%9A%84%E3%81%AA%E4%BE%9D%E5%AD%98%E6%80%A7%E3%81%8B%E3%82%89%E6%8E%92%E9%99%A4%E3%81%99%E3%82%8B" class="hash-link" aria-label="JUnit4 と Hamcrest を推移的な依存性から排除する への直接リンク" title="JUnit4 と Hamcrest を推移的な依存性から排除する への直接リンク">​</a></h4>
<p>JUnit4 と JUnit5 は、名前が似たクラスやアノテーションが多く存在している。</p>
<p>JUnit5 を使うと決めたプロジェクトの依存性の中に JUnit4 が含まれていると、クラス名が一意に定まらないせいで eclipse が上手く入力補完してくれないことがある。</p>
<p>Hamcrest については、特に使いやすくもなければ分かり易くもないと考えている。
assertEquals で済む話を static import を駆使して何か英語のように読めなくもないものをコードとして書く代わりに沢山の API を覚えるとか手段と目的が逆転してしまっている。
ユニットテストをするために覚える事は少なければ少ないほどいい。</p>
<p>というわけで、JUnit4 と Hamcrest には感謝を伝えると共に完全排除しよう。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">dependencies {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	implementation ('org.springframework.boot:spring-boot-starter-web') {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	runtimeOnly 'org.springframework.boot:spring-boot-starter-undertow'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	testImplementation ('org.springframework.boot:spring-boot-starter-test') {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		exclude group: 'junit'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		exclude group: 'org.hamcrest'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	testImplementation 'org.springframework.boot:spring-boot-starter-webflux'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	testImplementation 'org.junit.jupiter:junit-jupiter-api:5.2.+'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	testRuntimeOnly    'org.junit.jupiter:junit-jupiter-engine:5.2.+'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>と言っても、やることは簡単だ。<code>spring-boot-starter-test</code> の推移的依存性から <code>junit</code> と <code>org.hamcrest</code> を外すだけ。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="springfox-swagger-を追加する">Springfox (Swagger) を追加する<a href="https://blog.satotaichi.info/spring-application-with-eclipse/#springfox-swagger-%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B" class="hash-link" aria-label="Springfox (Swagger) を追加する への直接リンク" title="Springfox (Swagger) を追加する への直接リンク">​</a></h4>
<p>現代的なアプリケーションの実装において、API アクセスを全く想定しないってのは色々無理がある。
別に全く知らないどこかの誰かに向けて API を用意しようって話をしたいわけじゃない。</p>
<p>ユーザインターフェースを SPA っぽくしようってだけでも API アクセスは必要だし、
郵便番号から住所を引くみたいなちょっとしたウィジェットを動かすだけでも API アクセスしたくなるものだ。</p>
<p>とはいえ、できる限り少ない手間で API アクセスできるようにしたいし、ドキュメントや API アクセスの実験をする環境は欲しい。</p>
<p>そういう訳で<a href="http://springfox.github.io/springfox/docs/current/" target="_blank" rel="noopener noreferrer">Springfox (Swagger)</a>の登場だ。</p>
<p>動いたテストコードからのみドキュメントを作るみたいなアプローチなら、<a href="https://spring.io/projects/spring-restdocs" target="_blank" rel="noopener noreferrer">Spring REST Docs</a> を使うのも悪くない。</p>
<p>Springfox を導入するのは凄く簡単だ。</p>
<p>ビルドスクリプトの <code>dependencies</code> ブロックに二行追加して、エントリポイントのクラスに設定をちょっと書くだけ。</p>
<p>Springfox 関連のライブラリを追加した<code>dependencies</code> ブロックはこんな感じだ。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">dependencies {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	implementation ('org.springframework.boot:spring-boot-starter-web') {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	runtimeOnly 'org.springframework.boot:spring-boot-starter-undertow'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	implementation 'io.springfox:springfox-swagger2:2.9.2'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	runtimeClasspath 'io.springfox:springfox-swagger-ui:2.9.2'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	testImplementation ('org.springframework.boot:spring-boot-starter-test') {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		exclude group: 'junit'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		exclude group: 'org.hamcrest'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	testImplementation 'org.springframework.boot:spring-boot-starter-webflux'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	testImplementation 'org.junit.jupiter:junit-jupiter-api:5.2.+'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	testRuntimeOnly    'org.junit.jupiter:junit-jupiter-engine:5.2.+'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><code>springfox-swagger2</code> には、ビルド時に必要になるクラスがごっそり入っている。</p>
<p><code>springfox-swagger-ui</code> は、ブラウザでアクセスできる GUI アプリケーションだ。</p>
<p>ビルドスクリプトを変更したら、次はエントリポイントのクラスだ。こんな感じになる。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">package hello;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">import org.springframework.boot.SpringApplication;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">import org.springframework.boot.autoconfigure.SpringBootApplication;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">import org.springframework.context.annotation.Bean;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">import springfox.documentation.builders.PathSelectors;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">import springfox.documentation.builders.RequestHandlerSelectors;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">import springfox.documentation.spi.DocumentationType;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">import springfox.documentation.spring.web.plugins.Docket;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">import springfox.documentation.swagger2.annotations.EnableSwagger2;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">@SpringBootApplication</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">@EnableSwagger2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">public class Application {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  public static void main(String[] args) {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    SpringApplication.run(Application.class, args);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  @Bean</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  public Docket api() {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    return new Docket(DocumentationType.SWAGGER_2)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        .select()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        .apis(RequestHandlerSelectors.any())</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        .paths(PathSelectors.any())</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        .build();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><code>import</code> 文を除く変更点は二つ。 <code>@EnableSwagger2</code> をクラスに追加したのと、<code>@Bean</code>のついた<code>api</code>メソッドを追加したことだ。</p>
<p>この状態でアプリケーションを起動して、<code>http://localhost:8080/swagger-ui.html</code> にアクセスすれば、API のドキュメントやテスト環境を試せる。</p>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/swagger-5b8007e75f7b487c22e2236a583384e5.png" width="1527" height="997" class="img_ev3q"></p>
<p>ああ……ブラボー……</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="まとめ">まとめ<a href="https://blog.satotaichi.info/spring-application-with-eclipse/#%E3%81%BE%E3%81%A8%E3%82%81" class="hash-link" aria-label="まとめ への直接リンク" title="まとめ への直接リンク">​</a></h2>
<p>今回は、JDK のインストールから始めて Spring の開発環境を一通り揃えるところまでを説明した。</p>
<p>最近の Java 開発では、IDE として IntelliJ を使うことが多くなってきているような気がするけども、eclipse もまだまだ便利だ。</p>
<p>ただ、eclipse には動作を鈍重にしてしまうような罠が多い。その最たるものが Web Standard Tools(WST)だ。
サーバを起動する機能とかあって便利そうに見えるけど、こいつを入れた途端、eclipse が全体的に遅くなる。</p>
<p>Spring Tool Suite (STS) も推移的に WST をインストールするので、STS を使うという事は不快な eclipse を使うということに直結する。</p>
<p>Spring Boot ならアプリケーションを main エントリから起動できるので従来の J2EE サーバへのデプロイ的な作業はいらない。
つまり、WST が持っているサーバ管理機能みたいなものはそもそもいらないのだ。</p>
<p>STS で唯一便利な機能は、RequestMapping を一覧する機能だが、これも Springfox を追加してしまえばより見やすいものが得られる。</p>
<p>正直言えば、最近は JavaScript ばかり書いているので、VS Code で Java も書きたいのだけど、VS Code の Java 拡張は 2018 年 8 月現在だと、まだまだまともに使えるレベルに無い。
内部的には eclipse の機能が動作するし、設定ファイルとして eclipse らしさが露出してくるのでむしろ困惑する…みたいな状態だ。</p>
<p>僕としては Java のコードを書くなら eclipse が最高だと思っているんだけど、あなたはどうだろうか？</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="このエントリで説明しなかったこと">このエントリで説明しなかったこと<a href="https://blog.satotaichi.info/spring-application-with-eclipse/#%E3%81%93%E3%81%AE%E3%82%A8%E3%83%B3%E3%83%88%E3%83%AA%E3%81%A7%E8%AA%AC%E6%98%8E%E3%81%97%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8" class="hash-link" aria-label="このエントリで説明しなかったこと への直接リンク" title="このエントリで説明しなかったこと への直接リンク">​</a></h3>
<p>色々あるんだけども、みんなが余り知らなそうなものや、おススメを列挙しておく。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="ライブラリ">ライブラリ<a href="https://blog.satotaichi.info/spring-application-with-eclipse/#%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA" class="hash-link" aria-label="ライブラリ への直接リンク" title="ライブラリ への直接リンク">​</a></h4>
<ul>
<li><a href="https://github.com/domaframework/doma/" target="_blank" rel="noopener noreferrer">Doma</a></li>
<li><a href="http://micrometer.io/" target="_blank" rel="noopener noreferrer">Micrometer</a></li>
<li><a href="http://immutables.github.io/" target="_blank" rel="noopener noreferrer">Immutables</a></li>
<li><a href="https://github.com/SpectoLabs/hoverfly-java" target="_blank" rel="noopener noreferrer">Hoverfly Java</a></li>
<li><a href="https://github.com/zeroturnaround/zt-exec" target="_blank" rel="noopener noreferrer">ZT Process Executor</a></li>
</ul>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="ツール">ツール<a href="https://blog.satotaichi.info/spring-application-with-eclipse/#%E3%83%84%E3%83%BC%E3%83%AB" class="hash-link" aria-label="ツール への直接リンク" title="ツール への直接リンク">​</a></h4>
<ul>
<li><a href="https://github.com/google/error-prone" target="_blank" rel="noopener noreferrer">Error Prone</a></li>
<li><a href="http://www.benf.org/other/cfr/" target="_blank" rel="noopener noreferrer">CFR - another java decompiler</a></li>
<li><a href="http://pitest.org/" target="_blank" rel="noopener noreferrer">PIT</a></li>
</ul>]]></content>
        <author>
            <name>Sato Taichi</name>
            <uri>https://github.com/taichi</uri>
        </author>
        <category label="eclipse" term="eclipse"/>
        <category label="Java" term="Java"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[誰でも簡単、キマる邪悪なおやつ]]></title>
        <id>https://blog.satotaichi.info/sweets_for_depraved_people/</id>
        <link href="https://blog.satotaichi.info/sweets_for_depraved_people/"/>
        <updated>2018-06-05T23:42:32.000Z</updated>
        <summary type="html"><![CDATA[はじめに]]></summary>
        <content type="html"><![CDATA[<h3 class="anchor anchorWithStickyNavbar_LWe7" id="はじめに">はじめに<a href="https://blog.satotaichi.info/sweets_for_depraved_people/#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB" class="hash-link" aria-label="はじめに への直接リンク" title="はじめに への直接リンク">​</a></h3>
<p>現代人は突き詰めると砂糖と塩と油に脳をやられている。</p>
<p>現代人が短絡的に喜ぶ食事を考えた時、砂糖と塩と油の不快感を感じさせずに大量摂取させられる料理が幸福感をおおむね最大化する（要出典）。</p>
<p>今回は、その中で砂糖と油を効率よく摂取させられる、簡単で邪悪なおやつを紹介したい。</p>
<p>僕が今日説明する邪悪なおやつとはラスクである。しかも、パンの耳をつかったやつだ。</p>
<p>そもそも、食パンというのはかなり不健康な食い物だとされている（要出典）。</p>
<p>その中でも、特にパンの耳は極めて危険な部位で、パンの悪い部分が濃縮されていると言える。しかし、だからこそ旨い。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="基本の手順">基本の手順<a href="https://blog.satotaichi.info/sweets_for_depraved_people/#%E5%9F%BA%E6%9C%AC%E3%81%AE%E6%89%8B%E9%A0%86" class="hash-link" aria-label="基本の手順 への直接リンク" title="基本の手順 への直接リンク">​</a></h3>
<p>まず、パンの耳で作るラスクの基本的な調理方法について確認しておこう。
ラスクにするパンの耳は、はっきり言って何でもいい。しかし、ダブルソフトみたいに柔らかすぎるやつはダメだ。
同じヤマザキなら、超芳醇みたいなやつがいい。</p>
<ul>
<li>パンの耳を食い易い一口大に切る。</li>
<li>パンの耳がカリっとするまで油で炒める</li>
<li>砂糖をパンの耳の上から振りかけて、弱火でゆっくり加熱しながらパンの耳と溶けた砂糖が絡むように混ぜる</li>
<li>焦げない程度に炒めて、外側が固くなったらクッキングシートをしいた皿に並べて冷ます</li>
</ul>
<p>ラスクの基本的な作り方はこれだけだ。
人類の堕落要素である炭水化物と油と砂糖だけで構成される極めて純度の高い邪悪さを持つ食い物であることが分かって貰えるだろう。</p>
<p>砂糖は上白糖だろうが、三温糖だろうが、グラニュー糖だろうが、なんでも良い。
油も大体なんでもいい、オリーブオイルがおススメだが、サラダ油でもグレープシードオイルでもいい。ゴマ油は上級者向けなのでおススメしない。
油を食う料理なので、開封したての酸化していない油を使った方が旨いが、些細な問題だ。</p>
<p>ついでにちょっとしたコツを書き加えておくと、油は一気に使うんじゃなくて、パンの耳を炒めながら三回くらいに分けて使うといい。
全部のパンの耳に油がいきわたるようにすると、味が安定する。</p>
<p>何となく分かっているだろうが、これだけでは特においしいラスクにはならない。
基礎は大事だが、それだけで事を為せるわけではないのだ。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="食感の改善">食感の改善<a href="https://blog.satotaichi.info/sweets_for_depraved_people/#%E9%A3%9F%E6%84%9F%E3%81%AE%E6%94%B9%E5%96%84" class="hash-link" aria-label="食感の改善 への直接リンク" title="食感の改善 への直接リンク">​</a></h3>
<p>ところで、旨いラスクとは、どんなものだろうか？
外側は少し堅めで、中はサクサクと崩れるようなのが旨いラスクだと僕は考えている。</p>
<p>ちなみに、パンの耳を切って炒めるだけでは、そのような食感を得る事は難しい。
何故なら、パンの耳には多くの水分が含まれているからだ。</p>
<p>つまり、この水分を除去すればサクサクとした食感を生み出せる。
水分を排除する簡単な方法は何だろうか？まさかオーブンでラスクを真面目に焼くとか、レンジで水分を除去しながら加熱するとかはやりたくない。</p>
<p>例えば、袋を開けたまま部屋の中に放置することが考えられるが、これはおススメできない。
何故なら衛生的でないからだ。特に今のような梅雨の時期はパンがカビる。
カビたパンを食って大丈夫な人間はそう多くない、僕だってそうだ。腹をこわす。</p>
<p>梅雨の時期に食パンを比較的安全に保存する方法がある。そう、冷凍だ。
そして、冷凍した後にレンジで解凍したパンは残念なことに水分が抜けてボソボソとした食感になる。
つまり、冷凍保存してマズくなったパンは、ラスクに転用するとおいしいのだ。</p>
<p>では、手順を確認しよう。</p>
<ul>
<li>冷凍したパンの耳をレンジで解凍する</li>
<li>パンの耳を食い易い一口大に切る。</li>
<li>パンの耳がカリっとするまで油で炒める</li>
<li>砂糖をパンの耳の上から振りかけて、弱火でゆっくり加熱しながらパンの耳と溶けた砂糖が絡むように混ぜる</li>
<li>焦げない程度に炒めて、外側が固くなったらクッキングシートをしいた皿に並べて冷ます</li>
</ul>
<p>冷凍保存によって抜けた水分の代わりに油を埋めるのが、このラスクの肝だ。
十分に油を吸い込んだパンの耳を丁寧に炒めると、油が水分を排除するのでサクサク感を得られる。</p>
<p>これが、最初のラスク。<strong>スタートアップラスク</strong>である。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="キマる調味料">キマる調味料<a href="https://blog.satotaichi.info/sweets_for_depraved_people/#%E3%82%AD%E3%83%9E%E3%82%8B%E8%AA%BF%E5%91%B3%E6%96%99" class="hash-link" aria-label="キマる調味料 への直接リンク" title="キマる調味料 への直接リンク">​</a></h3>
<p>スタートアップラスクは、自分ひとりで食べるなら兎も角、友人や家族にドヤれるようなものではない。</p>
<p>ラスクの食材と調理法はシンプル過ぎる。つまり、調理する人間の技量が結果に直接影響する。
我々が求めているのは、そういうのではない。とはいえ、おやつなのであんまり手間をかけたくはない。</p>
<p>そこで、ラスクに使う定番のキマる調味料を紹介しよう。シナモンだ。
アッパー系の香辛料でカレーやお菓子によく使われる。ラスクでも砂糖の三割から五割程度の容量でシナモンを混ぜた上でパンの耳に絡めるとよい。</p>
<p>ついでに、油もキマるやつに変えよう。そう、みんな大好き有塩バターだ。パン一枚分の耳あたり 10g くらい使うと素晴らしい味わいになる。
素晴らしいことに有塩バターの塩味が、砂糖の甘味をより引き立ててくれるのだ。</p>
<p>シナモンとバターを使ったラスクの手順はこうだ。</p>
<ul>
<li>冷凍したパンの耳をレンジで解凍する</li>
<li>パンの耳を食い易い一口大に切る。</li>
<li>バターをレンジで温めて完全に溶かす</li>
<li>パンの耳がカリっとするまで溶かしたバターで炒める</li>
<li>シナモンと砂糖を適当な器で均等になるように混ぜる</li>
<li>砂糖とシナモンの混合物をパンの耳の上から振りかけて、弱火でゆっくり加熱しながらパンの耳と溶けた砂糖が絡むように混ぜる</li>
<li>焦げない程度に炒めて、外側が固くなったらクッキングシートをしいた皿に並べて冷ます</li>
</ul>
<p>これがキマるラスク。<strong>アッパーラスク</strong>だ。</p>
<p>そうは言っても昼間に食うようなアッパーラスクに後ろ暗さなどある筈もなく、大体平和な味であって特に危険はない。
ところで、堕落した人間がおやつを食べるのは、果たして昼間だけなんだろうか？</p>
<p>断じて否！</p>
<p>堕落した人間は日が落ちた後、深夜におやつを食べる。しかし、アッパーラスクに深夜性はない。
いや、夜に食っても旨いが闇夜の味わいではないのだ。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="中毒性のある調味料">中毒性のある調味料<a href="https://blog.satotaichi.info/sweets_for_depraved_people/#%E4%B8%AD%E6%AF%92%E6%80%A7%E3%81%AE%E3%81%82%E3%82%8B%E8%AA%BF%E5%91%B3%E6%96%99" class="hash-link" aria-label="中毒性のある調味料 への直接リンク" title="中毒性のある調味料 への直接リンク">​</a></h3>
<p>アッパーラスクに中毒性はなく、明るい昼間の味わいだ。
僕らが求めているのは、もっと中毒性のあるやつだ。一度食べたら忘れられず何度でも食いたくなるラスク。</p>
<p>こじゃれたレストランで出てくるが、実際にはかなり邪悪なあいつを自宅で簡単に作る方法は無いだろうか？</p>
<p>勘の良いあなたなら、次に出てくる食材を予想できるだろう。そう、ニンニクだ。
ニンニクはチューブに入ったペースト状のやつを使うと楽だが、自分ですりおろしてもいい。
パン一枚分の耳に対して 10g 程度のバターを使うことは変わり無いが、雑に溶かしたバターとニンニクを混ぜてガーリックバターを作る。</p>
<p>と言うわけで、ニンニクを使うラスクの手順はこうだ。</p>
<ul>
<li>冷凍したパンの耳をレンジで解凍する</li>
<li>パンの耳を食い易い一口大に切る。</li>
<li>バターを溶かしてガーリックバターを作る</li>
<li>弱火でガーリックバターを使って、パンの耳がカリっとするまで炒める</li>
<li>焦げない程度に炒めて、外側が固くなったらクッキングシートをしいた皿に並べて冷ます</li>
</ul>
<p>客に出す時は、見た目上のこじゃれ感が増すので乾燥バジルをガーリックバターに混ぜて使うと良いだろう。</p>
<p>これが、昼間の味わいであるラスクを反転させた邪悪なラスク、<strong>ジャンキーラスク</strong>である。
ジャンキーラスクは、飲酒を伴わない食事には合わないと考えてよい。ワインやビール、ウイスキーなどの洋酒と併せると簡単に堕落できるだろう。
もし、飲酒しながらジャンキーラスクを食べるなら、ガーリックバターを作る際に小さじ１程度食塩やクレイジーソルトを足すと、更に良い味になる。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="まとめ">まとめ<a href="https://blog.satotaichi.info/sweets_for_depraved_people/#%E3%81%BE%E3%81%A8%E3%82%81" class="hash-link" aria-label="まとめ への直接リンク" title="まとめ への直接リンク">​</a></h3>
<p>アッパーラスクとジャンキーラスクは、ある種のフレームワークでありガイドラインとなるものだ。
砂糖や油の組み合わせや、パンの種類を変えることで、よりオリジナリティのあるラスクを作れるだろう。
例えば、アッパーラスクであれば、ホイップクリームをつけながら食べると更にエネルギッシュな味わいが得られる。
ジャンキーラスクに是非追加して欲しいのは、粗挽きの黒胡椒だ。
ラスクに手をつける直前にミルで胡椒をふりながら食うと病みつきになる。</p>
<p>これを読んだあなたが新しいラスクの境地を開き、より多様性のある食生活に至ることを願って結びとする。</p>]]></content>
        <author>
            <name>Sato Taichi</name>
            <uri>https://github.com/taichi</uri>
        </author>
        <category label="meal" term="meal"/>
        <category label="life" term="life"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[ビジネスチャット初級編]]></title>
        <id>https://blog.satotaichi.info/beginners_guide_to_online_chatting/</id>
        <link href="https://blog.satotaichi.info/beginners_guide_to_online_chatting/"/>
        <updated>2018-03-15T17:54:33.000Z</updated>
        <summary type="html"><![CDATA[はじめに]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="はじめに">はじめに<a href="https://blog.satotaichi.info/beginners_guide_to_online_chatting/#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB" class="hash-link" aria-label="はじめに への直接リンク" title="はじめに への直接リンク">​</a></h2>
<p>最近、様々な分野でチャットツールのビジネス利用が試行されていますね。
筆者の会社でも例に漏れず多くの部門が Slack を利用したり、Microsoft Teams の検証をしています。
筆者は 20 年近く様々なチャットツールを使ってきました。1:1 のチャットツールだけでなく、複数人で使うチャットツールも様々な状況で利用しています。
そもそもインターネットを利用する筆者の主たる目的の一つは確実にチャットです。
一方で、会社に本格的なチャットツールを導入する過程で分かってきたのは、多くの人は思ったよりチャットツールに慣れてない、ということです。</p>
<p>このエントリでは、最近 Slack や Teams のようなチャットツールを使い始めた組織に所属するみなさんに向けて、チャットツールをより快適に使うための考え方や Tips を紹介します。</p>
<p>ここで紹介する知識は、筆者からの提案であり何らかの理想やマナーではありません。
これらの知識の中には、あなたの考えや組織に合わないものが確実に含まれているでしょう。それらは単に無視して下さい。
もし、あなたのチーム内におけるルールや運用を見直すきっかけになるなら、それは大変素晴らしいことです。
筆者としては、このエントリを読んだ皆さんが、ここで提示した知識を自分なりに改良して利用して貰えれば良いと考えています。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="全般的な使い方編">全般的な使い方編<a href="https://blog.satotaichi.info/beginners_guide_to_online_chatting/#%E5%85%A8%E8%88%AC%E7%9A%84%E3%81%AA%E4%BD%BF%E3%81%84%E6%96%B9%E7%B7%A8" class="hash-link" aria-label="全般的な使い方編 への直接リンク" title="全般的な使い方編 への直接リンク">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="多要素認証mfaを有効化しよう">多要素認証(MFA)を有効化しよう<a href="https://blog.satotaichi.info/beginners_guide_to_online_chatting/#%E5%A4%9A%E8%A6%81%E7%B4%A0%E8%AA%8D%E8%A8%BCmfa%E3%82%92%E6%9C%89%E5%8A%B9%E5%8C%96%E3%81%97%E3%82%88%E3%81%86" class="hash-link" aria-label="多要素認証(MFA)を有効化しよう への直接リンク" title="多要素認証(MFA)を有効化しよう への直接リンク">​</a></h3>
<p>チャットツールは様々なレベルの情報を扱う場所です。あなたのアカウントをより強力に防護するため必ず多要素認証(MFA)を有効化しましょう。</p>
<ul>
<li><a href="https://get.slack.help/hc/ja/articles/204509068-2%E8%A6%81%E7%B4%A0%E8%AA%8D%E8%A8%BC%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B" target="_blank" rel="noopener noreferrer">2 要素認証を設定する</a></li>
</ul>
<p>Slack の場合、有償のワークスペースでは管理者が MFA をユーザに対して強制できますが、無償のワークスペースでは強制できません。
多くのユーザは強制されない限り MFA を有効化しない傾向にありますが、特に理由が無ければ有効化しましょう。</p>
<p>おすすめのアプリケーションは<a href="https://authy.com/" target="_blank" rel="noopener noreferrer">Authy</a>です。複数のスマホや PC で二要認証の鍵を共有しているので、一つくらいなら一時的に紛失しても対応できます。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="定時の設定">定時の設定<a href="https://blog.satotaichi.info/beginners_guide_to_online_chatting/#%E5%AE%9A%E6%99%82%E3%81%AE%E8%A8%AD%E5%AE%9A" class="hash-link" aria-label="定時の設定 への直接リンク" title="定時の設定 への直接リンク">​</a></h3>
<p>退勤したら仕事用のチャットツールを見たり使ったりするのは基本的にやめましょう。
どこに居ようが、仕事用のチャットツールを見ているなら、それは労働時間とみなされるべきです。稼働時間をむやみに増やすのは、望ましくありません。
そのためには、定時を過ぎたら通知が来なくなるように設定するのが簡単です。</p>
<ul>
<li><a href="https://get.slack.help/hc/ja/articles/214908388-%E3%81%8A%E3%82%84%E3%81%99%E3%81%BF%E3%83%A2%E3%83%BC%E3%83%89%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%A8%E9%80%9A%E7%9F%A5%E3%81%AE%E4%B8%80%E6%99%82%E5%81%9C%E6%AD%A2" target="_blank" rel="noopener noreferrer">おやすみモードの設定と通知の一時停止</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="チャットを一切見ない時間を作ろう">チャットを一切見ない時間を作ろう<a href="https://blog.satotaichi.info/beginners_guide_to_online_chatting/#%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%82%92%E4%B8%80%E5%88%87%E8%A6%8B%E3%81%AA%E3%81%84%E6%99%82%E9%96%93%E3%82%92%E4%BD%9C%E3%82%8D%E3%81%86" class="hash-link" aria-label="チャットを一切見ない時間を作ろう への直接リンク" title="チャットを一切見ない時間を作ろう への直接リンク">​</a></h3>
<p>チャットツールは、慣れてくると中毒のような状態になり易いものです。特に参加者が多く活気のあるチャットでは、常に誰かが発言しています。
そこで発信されるメッセージを全て出来るだけ早く確認しようとすると、それ以外のことが一切出来なくなってしまいます。
そうなる前に、チャットを見ない時間帯を自分で決めるのが良いでしょう。</p>
<p>8 時間拘束の仕事では、毎日合計して 2 ～ 3 時間はチャットを見ない時間を作ると仕事が捗りますよ。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="情報のストックとフローという考え方">情報のストックとフローという考え方<a href="https://blog.satotaichi.info/beginners_guide_to_online_chatting/#%E6%83%85%E5%A0%B1%E3%81%AE%E3%82%B9%E3%83%88%E3%83%83%E3%82%AF%E3%81%A8%E3%83%95%E3%83%AD%E3%83%BC%E3%81%A8%E3%81%84%E3%81%86%E8%80%83%E3%81%88%E6%96%B9" class="hash-link" aria-label="情報のストックとフローという考え方 への直接リンク" title="情報のストックとフローという考え方 への直接リンク">​</a></h3>
<p>チャットツールは、流動的な対話を行うための場所です。チャットツールでの議論の結果は、別途保存した上で探し易い場所に議事録としてまとめ直した方がいいでしょう。
後からチャットの中身を時系列に追って、その内容を順次理解していくのは非常に大変な作業です。
議事録はその時いなかった人が分かり易いように書きましょう。</p>
<p>一番簡単な議事録の共有の仕方は、markdown などのテキストファイルで議事録を書いた上で、チャットツールにアップロードしてしまうことです。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="コミュニケーション効率について">コミュニケーション効率について<a href="https://blog.satotaichi.info/beginners_guide_to_online_chatting/#%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E5%8A%B9%E7%8E%87%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6" class="hash-link" aria-label="コミュニケーション効率について への直接リンク" title="コミュニケーション効率について への直接リンク">​</a></h3>
<p>チャットツールによるコミュニケーションは、対面によるコミュニケーションに比べて効率のよい部分と悪い部分があります。</p>
<p>チャットツールは文字によるコミュニケーションツールなので、感情や雰囲気のような感情的な部分は伝わり辛いです。
語尾を工夫したり、リアクションアイコンや、画像を使うことである程度感情を伝えられますが、感情はあまり伝わらないものとしてやり取りした方が、トラブルの発生を未然に防げますし効率的です。</p>
<p>チャットツールを使うなら、対面によるコミュニケーションよりも、応答速度を少し遅めに見積もってやりとりする方がいいでしょう。
会議中や電話中に質問者側が、質問してその回答を聞く前に離席したり、他の会議に行くなどという事はありえませんが、チャットツールならそれができます。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="メールマナー及びそれに類するものを排除しよう">メールマナー及びそれに類するものを排除しよう<a href="https://blog.satotaichi.info/beginners_guide_to_online_chatting/#%E3%83%A1%E3%83%BC%E3%83%AB%E3%83%9E%E3%83%8A%E3%83%BC%E5%8F%8A%E3%81%B3%E3%81%9D%E3%82%8C%E3%81%AB%E9%A1%9E%E3%81%99%E3%82%8B%E3%82%82%E3%81%AE%E3%82%92%E6%8E%92%E9%99%A4%E3%81%97%E3%82%88%E3%81%86" class="hash-link" aria-label="メールマナー及びそれに類するものを排除しよう への直接リンク" title="メールマナー及びそれに類するものを排除しよう への直接リンク">​</a></h4>
<p>電子メールが普及し、20 年近くが経過するなかで、マナーのようなものが広く普及しています。
例えば、「○○ さん」や「お世話になっております」、「以上、よろしくお願いします」など、情報として意味のない文章がメールの中には多く含まれています。
チャットツールを利用するなら、そのようなマナーを一旦全て無視してコミュニケーションしてみましょう。コミュニケーションの効率が大きく改善することを実感できるでしょう。
情報として意味の無い部分を欠く相手に対して失礼さを感じ、コミュニケーション効率を改善するより礼儀を重視したいのであれば、チャットツールを使うのは諦めてメールを使えばいいでしょう。
本当に効率よりも礼儀が大切なら、毎朝おろしたての墨を使って筆で手紙を手書きした方がよりよいでしょう。</p>
<p>本来、礼儀や礼節というものは不要な争いが起こる可能性を低減することで、効率よくコミュニケーションするための手段であって、目的ではありません。
本来の目的を逸脱し、それ自体が目的化したマナーの類は極めて醜悪なものだと筆者は考えています。</p>
<p>お互い意味が無いと思いつつ、多くの人が受け取っても読み飛ばしている文字列を送付し合うことは、礼儀正しいと言えるのか今一度考え直してもいいんじゃないでしょうか？</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="リマインダーの使い方">リマインダーの使い方<a href="https://blog.satotaichi.info/beginners_guide_to_online_chatting/#%E3%83%AA%E3%83%9E%E3%82%A4%E3%83%B3%E3%83%80%E3%83%BC%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9" class="hash-link" aria-label="リマインダーの使い方 への直接リンク" title="リマインダーの使い方 への直接リンク">​</a></h3>
<p>Slack では <code>/</code> で始まるメッセージを投稿すると、他のユーザには見えない特別な命令として解釈されます。
Slack には、標準で特別な命令がいくつか用意されていますが、 <code>/remind</code> はそういったものの一つです。
メッセージの入力欄に <code>/remind</code> と入力すると基本的な使い方は表示されます。
そこでは表示されないが個人的に有用だと思っている例を紹介します。</p>
<ul>
<li><a href="https://get.slack.help/hc/ja/articles/208423427-%E3%83%AA%E3%83%9E%E3%82%A4%E3%83%B3%E3%83%80%E3%83%BC%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B" target="_blank" rel="noopener noreferrer">リマインダーを設定する</a></li>
</ul>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="平日の-1200-にリマインド">平日の 1200 にリマインド<a href="https://blog.satotaichi.info/beginners_guide_to_online_chatting/#%E5%B9%B3%E6%97%A5%E3%81%AE-1200-%E3%81%AB%E3%83%AA%E3%83%9E%E3%82%A4%E3%83%B3%E3%83%89" class="hash-link" aria-label="平日の 1200 にリマインド への直接リンク" title="平日の 1200 にリマインド への直接リンク">​</a></h4>
<p>平日の 12 時になったら、自分にだけ Slack がリマインドしてきます。</p>
<blockquote>
<p>/remind me "お昼休みです" at 12PM every weekday</p>
</blockquote>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="終業時間をリマインド">終業時間をリマインド<a href="https://blog.satotaichi.info/beginners_guide_to_online_chatting/#%E7%B5%82%E6%A5%AD%E6%99%82%E9%96%93%E3%82%92%E3%83%AA%E3%83%9E%E3%82%A4%E3%83%B3%E3%83%89" class="hash-link" aria-label="終業時間をリマインド への直接リンク" title="終業時間をリマインド への直接リンク">​</a></h4>
<p>平日の 17 時になったら、 <code>#kintai</code> チャンネルにリマインドメッセージが自動投稿されます。
自動投稿されるメッセージ内で <code>@here</code> となっているので Slack にログインしており、<code>#kintai</code> チャンネルにいる人全員に通知が飛びます。</p>
<blockquote>
<p>/remind #kintai "@here そろそろ退勤時間です。日報を書きましょう。" at 1700PM every weekday</p>
</blockquote>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="メッセージ編">メッセージ編<a href="https://blog.satotaichi.info/beginners_guide_to_online_chatting/#%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E7%B7%A8" class="hash-link" aria-label="メッセージ編 への直接リンク" title="メッセージ編 への直接リンク">​</a></h2>
<p>ここからは、Slack を使ったメッセージのやりとりにおいて、筆者が気を付けていることを紹介していきます。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="メッセージを小分けにする">メッセージを小分けにする<a href="https://blog.satotaichi.info/beginners_guide_to_online_chatting/#%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E5%B0%8F%E5%88%86%E3%81%91%E3%81%AB%E3%81%99%E3%82%8B" class="hash-link" aria-label="メッセージを小分けにする への直接リンク" title="メッセージを小分けにする への直接リンク">​</a></h3>
<p>長文のメッセージの中には、全体として賛同できるものの個別には同意できないとか、個別には同意できるが全体としては賛同できないといったことはよくあります。
合意形成のためには主張を部分に分けた方が、それぞれに対してより精密な議論ができます。
チャットを使った議論では、文章を過度に装飾したり論理を敢えて曖昧にするようなやり方は合致しません。</p>
<p>長文で何かを主張するのであれば、markdown 等の読み易い形にまとめて配布する方がいいでしょう。
その場合には、ピクトグラムやダイアグラムなどの画像を適宜混ぜることで、読者がより理解し易い形にしましょう。</p>
<p>このようなことが出来るのは、Slack のワークスペース内において全てのメッセージを一意に特定できる ID が割当てられているからです。
Slack ではワークスペース内の全てのメッセージに対して一意になるような URL が付加されます。
その URL は、メッセージの右上にある「・・・」アイコンからクリップボードにコピーできます。</p>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/copy_link-ee2a4b62f3812a60002f27cdc5bd4cb5.png" width="325" height="332" class="img_ev3q"></p>
<p>そのメッセージに言及する際に、自分のメッセージ内に URL を含めると、自分が書き込んだメッセージが表示される際に併せて、言及対象となるメッセージが表示されます。</p>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/message_contains_url-c68f0a7470d5d4cbfcf37ed16c82afdb.png" width="604" height="143" class="img_ev3q"></p>
<p>また、個別のメッセージに対して返答できるスレッドという機能によって、個別具体的な議論を行えます。</p>
<ul>
<li><a href="https://get.slack.help/hc/ja/articles/115000769927-%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%81%AB%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E6%8A%95%E7%A8%BF%E3%81%99%E3%82%8B" target="_blank" rel="noopener noreferrer">スレッドにメッセージを投稿する</a></li>
</ul>
<p>Slack のチャンネル内でスレッドが多用されているなら、チャンネルを分けた方がいいかもしれませんよ。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="メッセージをリマインドする">メッセージをリマインドする<a href="https://blog.satotaichi.info/beginners_guide_to_online_chatting/#%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E3%83%AA%E3%83%9E%E3%82%A4%E3%83%B3%E3%83%89%E3%81%99%E3%82%8B" class="hash-link" aria-label="メッセージをリマインドする への直接リンク" title="メッセージをリマインドする への直接リンク">​</a></h3>
<p>Slack ではメッセージが次々と流れていくので、メールのように敢えて未読にしておくことが難しいことが多いですよね。
依頼されたことや、明確に自分に対して問いかけがあった訳ではないものの、反応しておきたいものの、今すぐには書き込めないという事はよくあります。</p>
<p>そういう時はリマインド機能を使いましょう。リマインド機能はメッセージの右上にある「・・・」アイコンから設定できます。</p>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/remind_me_later-b06c685eb419d77261461154c08f9938.png" width="981" height="353" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="リアクションを積極的に使おう">リアクションを積極的に使おう<a href="https://blog.satotaichi.info/beginners_guide_to_online_chatting/#%E3%83%AA%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E7%A9%8D%E6%A5%B5%E7%9A%84%E3%81%AB%E4%BD%BF%E3%81%8A%E3%81%86" class="hash-link" aria-label="リアクションを積極的に使おう への直接リンク" title="リアクションを積極的に使おう への直接リンク">​</a></h3>
<p>Slack を筆頭に最近のチャットツールには、簡単な応答を行うためのリアクションという機能が実装されています。
単純なお礼、同意や否定、賞賛などはメッセージとして書き込まずにリアクションすると気楽に応答できるようになります。</p>
<p>チャットツールで感情表現しようとするとコミュニケーションが煩雑になるのでオススメはしません。
しかし、常に感情を封じてコミュニケーションするというのも不健康な考え方ですので、リアクションで低コストに感情表現するのがいいでしょう。</p>
<p>ここでは、筆者がよく使っており、Slack に標準搭載されているリアクションアイコンを紹介します。
Slack にはリアクションアイコンを自分で作成して登録できるので、自分達のチームにあったリアクションアイコンを登録するとより愛着が湧きますよ。</p>
<ul>
<li><a href="https://get.slack.help/hc/ja/articles/206870317-%E7%B5%B5%E6%96%87%E5%AD%97%E3%81%A7%E3%83%AA%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%99%E3%82%8B" target="_blank" rel="noopener noreferrer">絵文字でリアクションする</a></li>
<li><a href="https://get.slack.help/hc/ja/articles/206870177-Create-custom-emoji" target="_blank" rel="noopener noreferrer">カスタム絵文字を作成する</a></li>
</ul>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="肯定賞賛承認">肯定、賞賛、承認<a href="https://blog.satotaichi.info/beginners_guide_to_online_chatting/#%E8%82%AF%E5%AE%9A%E8%B3%9E%E8%B3%9B%E6%89%BF%E8%AA%8D" class="hash-link" aria-label="肯定、賞賛、承認 への直接リンク" title="肯定、賞賛、承認 への直接リンク">​</a></h4>
<p><img decoding="async" loading="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAzCAIAAABaAcxDAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAVLSURBVFhH7ZdLbxtVFMdZTZImcWKbhqRtXk7TNIV0AWLRHWxYIFHBBiE+BRIS4iMgUVVCYgFSI4SI27wc2zg2dR7O++UgEgItAoumJGmT2BN7PGN7JrYn4ty5J+PYlTP22Isu/NdfV9czd+78cs6ZM5NXjl9KVbCKUQWrGFWwilF5sEQhJHJ7osDi75JVBqxoOHjo+TRird0ZeCvyZB2PlqZSsRJ8OPhj3bGvVV7sSM93iPaaXdcnopjA03pVMlZkLzLAnPhvnPz6BvH6jYTLyP12B0/rVZmw1q4TJn8vhROGq8RYFFfoUlmxTi3Y6qK7flyhSyVjHQUI1vrrBGj1morFP/8LV+hSqVjx/Y2EjSE0az2UCcwO1IuJOK7QpVKxuM1vZG89oYHComSr3SH3bTytV6VhifG9frMaJHgMYUyNV3Ob3+MCvSoJK7rxNW9rQKaVq7TCIver4webuEKv9GNFHw/y9hZMHG0NK1fltesRK5MQOFykV3qwJDEe8t8VRo3yUiehWe4io9Ij0is9h/b3YU0scsjvrgnbXjD/j50POMn8IEB30FTRWPzBo6OJj3ibAeNEOxakTwkYYAVtt4LuD/lBBm0zSO4GfkzxIHP0+z3c6FwVgSUIwo7jY9Kl5q8QlBe90g1nwbIbfTJ3KbfTDjH8879xx/zSxopzobD/q4ijj/2pPjXbpr5hcALjQiudi84L3P0MUxaW2mkdxshWP26dXxpYMXY3bO8T3WZ57jJ9/sltIGVgeicKp5SX5G1OjGZhyZPG3GiNGfinM7h7fmlg7dvekTxGJIBxtRsntNjhJ/12UBbIC62QQdHGpFyMOIaWPCZpuhXtMRfYaTWwwmO98mQjyQVEhRJAzDBaPVBM5AiYnjqtLc7KQDZVi44abugC+kH1M8cHktarqQCsiQaCBQYUgqUwgRc7yM/FdjxIotUGTKmfmfR4VirJtbCGGj7IvJeCM1/gDfKoECwDYi11nCxbsJhoWiFafqV0lGaR9LXmlDw1eQEoQEi/1BketeAN8qgorE4SGwCitwE+tZyVJEpuI7T4nFBlsHBlb3K2fX/4TbxBHhWEJc82IxkYAgZwMIERaCAGC20QhtRcOy0s8LEj225Dct4ClpcsqQVL3G7W/EgsDOthbQYLDO0U+gVgQRhor1eeQTAkEQJG59DTYVRjRg8Sb3yHu+dXAVjuKnnKLP9SI3vrsuAI32V5tiU6Ug8o8RFGdDXCM5h0ZlCIfU2ZDMLbafkaO9qHu+dXIViM7KkmI4TN1yRPmVQs+CmOG8EkywttkrM2Q6NaxaJvdPjyGTTg7vlVGJbitEshmzLJXqi2FnnmNdl3MYM405R8aIJoQQtVLyHOjpa8bDly3MLd80sD62jsJqFRboCFMtkINDRsZD5tJgchxUDsNUDTogUUGyYNjBr+rYUvi7SvJT3dzI80xp5O4O75pYEVCXihaLKwVEPBwTj9KmSQTCaNMMIawuHKMrwo4cMBJoT4jzJ92PBb30JqYF/YVLJnk3nryUgD5ibpg3aApxST/J7JIPS8kPNd3PdcaWOBYtEQ/2yDXb97MHwT/nTwiz0TDM9gVjv1VOdiLXexrvdw03NVENZZcYFJdvazsPPt8NAV1moKW2vOdk4IJ8nUaUdNei9CjaOXLBFrVfTxA9zoXBWNlaNocI/778/Q1jDrv8MufsnOf37guH3W2/1d+z8Y9vpN2/c62EdevExLpWJRSZIE/0aLMV4UwuBENJiIHlKL3I7A/iuGn8AE1uEFWioPVtlVwSpGFaxiVMEqRhWsYvRSYh0f/w9z2WUwioeWqAAAAABJRU5ErkJggg==" width="50" height="51" class="img_ev3q"></p>
<p>これは、英語圏における <code>thumbs-up</code> というアイコンで肯定や賞賛、承認を表すものです。
ポジティブな反応は、コミュニケーションを円滑にする効果がありますので、積極的に使っています。</p>
<p><img decoding="async" loading="lazy" src="data:image/png;base64,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" width="54" height="52" class="img_ev3q"></p>
<p>類似するものとして、お祝いの要素がより強い <code>tada</code> もあります。クラッカーを鳴らしているイメージですね。</p>
<p><img decoding="async" loading="lazy" src="data:image/png;base64,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" width="49" height="49" class="img_ev3q"></p>
<p>自分には無い考え方や発想に対する賞賛をおこなう際には <code>cool</code> を筆者は使っています。「なるほど！」や、「一本取られた」みたいな使い方です。</p>
<p><img decoding="async" loading="lazy" src="data:image/png;base64,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" width="51" height="46" class="img_ev3q"></p>
<p>同意を表す際には、 <code>ok</code> も使い易いアイコンです。文字として表現されているので、文脈を共有していない相手にも理解され易いのが良いですね。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="否定却下">否定、却下<a href="https://blog.satotaichi.info/beginners_guide_to_online_chatting/#%E5%90%A6%E5%AE%9A%E5%8D%B4%E4%B8%8B" class="hash-link" aria-label="否定、却下 への直接リンク" title="否定、却下 への直接リンク">​</a></h4>
<p><img decoding="async" loading="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC8AAAAuCAIAAAA3GddeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAVJSURBVFhH7ZfJbxtlGMY5OXsaJyRpSdO4aUKWRkggLkgIxAUkOLGo/wdcuCC4cQAuIHFijWgCWRwncfZ9d/aoVG0RbWhDMLHrZcYzsWecZCyeb77XzmJ7HMc5cMijR6Nvxp/f9/dt79jPhP9PuqBJrgua5DoHGhVSQmooqOwGdAvKrp8sP1UkNzf1NlRGNJLHKf5933vP5l392rvwqWf2Y7f9lqv3A1fv+9xPfmpwNZc6f77y+Ida3x/j9LXkSo8msDnlm//Eb3/F12bxtpQFrXmqzRSz0mUSbjPz2/BgiTZn0RaqNUcNGkJLVuBBBwVKotQ0QdEtOTd8a9+42l8IdZrggz6T1n/Sez0moeXYR5Hp5yKrTYdeuOG1v0lBkygFTeDud8gh/UYjjmWKOivWxsSEe2LPTdpgziHNwg3e8HS/TnGTyIhG/GsKEDx6rEEeytdGzdpEKVJqE2Vo82U6sB/vdsQYlXivmUInkRGNt+vF/Wh0RjNyiU3G+LOA0MaK2e1wPkMZzNFGCuH9XtYNltvZwnHvT13bn6vZH7u8P1YuWUvlrQmKnkhGNP6uhtjIGBbSjxYxjjEzrmwhMDGjZn16SveGijH6kJX6kyfKaLF0a/MWX8+rFD2RTkEzkMUIMCtRAuKYLFO6c9SBYm3qcmS2UunJPcbBzWmW6iIrN5lXm6T2PIqeSClpsDQl2mQ5fBRFd0VkpkJsy8XSBDtNSl+R2GLCYiWgic3NUr2v4yZFT6RUNNgQQ3kYPZuAGMdyQ2SxNjJfHZmrApM2fZVvF9CwBq4tJrmNXdlgBrJhoVU3NvLGtxQ9kVLTHELA89cZB7xUz5iW69mgVxqxVTkQzEtfzOG+gvCkhXtv2rJrLZKc65QgTqemAQdmAhBIz+vH4vMRRy1rLDfiqvabMfT4whhx1LA+Ue9NVe20v0QJ4nRqmtlrLD04kBv7caGaQ7AdqgOFJyrF1pMoMNHwb7Fjdd3fWU0J4nQ6Gpa1nuLOXGVXkOF61I5aLFN89aOvR62MVHjGP6QEcUpFgylBOL5LEI5f8ZC1abj0UKeBMUOBXw+t9uYFOgqY23Jgp+0t/OqgBHEyotmxvhYeKD6cBs60okPwh/yKJ1iC2Uqg4J2KQ44ayK30mTEZ8MF0BdqegfcodBIZ0ex6tvxd9epgKTKxlDhKMQKQLeo7Zt6iP6xTR64EO44v03AB7fqo5a5C6ck0RU8kIxooKHp8js+ETovvl9yDGQufBmag8APFtxE2RHf2iV1MS4xPUZn0PnK3Wfz9ewqdSCloSKoiCTvb3e8KrVmRmUoemh0rfqD0bYSfVGzfsIoXc9bJuWkzSc4HFDORTkcTlbi96h96B0OkNLz6wfryHTjqnna+7Ol5A1nJtiJ0Zrbm49a/blSIofRoIFUJuhxfyJ1mVA5CweHSabTFOrftbfTZFdzS9pL8eFja7Bce9gc2B9GWXQ95BAOlTcMl3m2WbeU0Q/ycs5diHVYqKIvUKX2dkQYS1z6Xui5xDmb9cOHVGHTfoR7p6+w0akhy/lhCKNGztmfPFu8YnRpjnZ0GEta+ZK8ODsTLj6MmZYkzUEY0wZ0N/DjXUfTao9t7u1AJhahHmsqIJuT9EzWGdjGv0Sgq1nzpX6OiYqDMaIR/GA0VXDrwoAlsL1OPNHV+NFHL7VmKLFCPNHV+NFiplcaQ3Syuf0Ufp6/MaCSfpzlPm63CX/+DuWq1O8cz+ZGiKPRx+sqIBgr43O6+W5ihreYm/6NFenpWZUoDqQFnyPcoJDrpPgOdA8056oImuS5okuuCJpnC4f8AC3L5ccDoIsYAAAAASUVORK5CYII=" width="47" height="46" class="img_ev3q"></p>
<p>ネガティブな反応をすることが、効果的な状況が少ないのであまり使いませんが、そういう時こそお互い精神に悪影響の少ない方法であるリアクションを使いましょう。</p>
<p><img decoding="async" loading="lazy" src="data:image/png;base64,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" width="51" height="50" class="img_ev3q"></p>
<p>一方で、悲しみや辛さに同意することが、コミュニケーションを円滑にする状況もあるでしょう。そういう時に筆者は、<code>cry</code> や <code>skull</code> を使っています。</p>
<p><img decoding="async" loading="lazy" src="data:image/png;base64,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" width="47" height="49" class="img_ev3q"></p>
<p>単純な否定や、同意できないことを表明する際には、 <code>ng</code> も <code>ok</code> と同じ理由で使い易いアイコンです。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="確認済完了済チェック">確認済、完了済、チェック<a href="https://blog.satotaichi.info/beginners_guide_to_online_chatting/#%E7%A2%BA%E8%AA%8D%E6%B8%88%E5%AE%8C%E4%BA%86%E6%B8%88%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF" class="hash-link" aria-label="確認済、完了済、チェック への直接リンク" title="確認済、完了済、チェック への直接リンク">​</a></h4>
<p><img decoding="async" loading="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADMAAAAuCAIAAAAKi7Y4AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAASiSURBVFhH7ZfrUxNXGIf713TamX7oVId6ASQxCKZWh046pVJbZ/DScgmgUBotpFyEKtqhDEagEIFNIJAUaRAIKaGpilNngAGtaAWTRi5JCEJjyIVv/cU9bdeQyG6A1A955szO5rzvyT45593D4bXVV5WoGXeiZtyJmr3Is2dO27J98S+Hz+clXWv4H8ygJemQiFvjc6mEyXsjpHcNkTZbdNgr1Ee+7k6s1B88r0+Rdgkn7436fD4SZhBRM6/XW92Xd6ZLcHFIdGEwpVJ/CHLi1t22p1aSwSCiZpSxTvLj3vODh8p0wsrbu8v6hRUDB2FmtptJBoPImY2PDkOi2pgKIdnwZ7heNIiKtUnoXF5aJEkMImd2SsGrMojKde99f/PDmpsfn9MduPRrSl5bclAtEAkzp3M5m/oAWpinfxvW8XR7/NCEliStYcvNvF7P1YGSLzt5sMH7WG7g02bF2n2age9IUjC23KxnrKmgI4G2oRvWsbRPKFFnkIwQcDCzzs2O3rnhdDrJZxb88WBc3BrH1EIr6d2Pqnc47CQpBGzNqjSZ+ao9RT/tw5caDa2k96W4nEuSduE315MDzAoo/tysiSSFhoWZz1ffIWauSK4idnzqBomGwL3iKlAK1mrlqxJ0EwMk6aWsb7bicuUrBcxvRzlrb8tIOBhut1vVfwmvHnMUGn5eu6GKJK3H+mbulZUCZSLWkfkMsSKVhINhnFDlKgLLC+2KMpNksIBVnXWrvw0ww6+fejRJwi8y/fsdMeXfIwKav+qXbCSJBazMHHY7vpf5mEI1v1Z3joQZLNisEur9gJ+BasPwadN9ksQOVmagTPGRtCeJfmRp337/tfMoiTEo0oj+yfE7YTvFNbM5bny4n2Swhq1Zs6EI84THYDdCw83Jxu2PLbMk/PyEo6FKs1p2whvHLzoT10I1r/7nQpLEBbZmlsdT6fVv40mYDHo+cMwq1/63oPpbnVnNO9GPRpshDeVYoUyHNEniAlszcIFK+0rDx2JhjXDMOnst8cSVXR6PG6Ex0xjtXdKbjKo607UX99A61ii0OJ7Qw7nCwazrlux0+x44odErm90SN2Oft87PFDYkQxT9WEHMJTY83B9reOeBKeQxf104mP356O6nl9+C0NlrAlouVxmr1smLVYdxDyF6njCv8DvZGDMyYiQjw4KDGaD3DlyhgkmCweGaN/AqQAunU4SkPVhKwYkftkm7S8iYcOFmdn1QDq1TbfGYmBwq9nnNJWG7x0dUPULoQb9UmYZjGRkTLtzMTJa7qdWvwwAqeUq/EJYVZxD8ncYN+qGV3sCzPpkmAzYANzOXy3W0jofdAVooc6igsPBa4CMOIFjftJo3f3s4SLI3BjczYNDUZcjfzaH8TjBjtsyrO/S/tJG8DcPZzOvxHLm8PcAJG/0X8pgsRUbQ/7bDg7MZEDfwA8zweubIkzyejVY9k3DMlL0y7KJMs+zauPlZCwlvEuGYuZzLx2U7Pm+KyW7ZhesntdsM94dIbPMIxwzMz8wcbxJhB0GbMz8kvZtKmGZg4anNbDcvLsx5vZtW9UzCN9tqombciZpx51U1W139GyJMsZQEqtoqAAAAAElFTkSuQmCC" width="51" height="46" class="img_ev3q"></p>
<p>メッセージに対して終了状態を表す際に使うのが <code>check</code> です。
リマインダーに <code>check</code> でリアクションを付けておくと状況を管理し易くなります。</p>
<p>発展的には、Slack に自分で書いたメッセージに <code>check</code> を付けていくことで TODO リストとして使えます。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="相槌">相槌<a href="https://blog.satotaichi.info/beginners_guide_to_online_chatting/#%E7%9B%B8%E6%A7%8C" class="hash-link" aria-label="相槌 への直接リンク" title="相槌 への直接リンク">​</a></h4>
<p>オンラインコミュニケーションにおいては、相手が自分の書いたメッセージを読んでいるのかいないのかが重要な状況はあります。
特に連続してメッセージを送信している際には、誰も見ていないとしたら空回りしているような感じになってしまい辛いことがあります。</p>
<p><img decoding="async" loading="lazy" src="data:image/png;base64,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" width="52" height="44" class="img_ev3q"></p>
<p>そういう風にならないよう、否定も肯定もしないけれどメッセージを見てはいることを相手に伝えるために、筆者は <code>eyes</code> アイコンをリアクションします。
LINE のように既読状況が自動的に管理されるツールは、便利ですが一方で圧迫感もあります。
筆者としては、仕事で使うチャットツールでは、自分に余裕がある時だけ能動的に既読をリアクションできる方がより使い易いなと感じています。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="簡易アンケートの作り方">簡易アンケートの作り方<a href="https://blog.satotaichi.info/beginners_guide_to_online_chatting/#%E7%B0%A1%E6%98%93%E3%82%A2%E3%83%B3%E3%82%B1%E3%83%BC%E3%83%88%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9" class="hash-link" aria-label="簡易アンケートの作り方 への直接リンク" title="簡易アンケートの作り方 への直接リンク">​</a></h4>
<p>Slack のリアクションは、同一のリアクションを複数回付けられないので、チャンネル内にいる人に対して簡易的な選択式アンケートを取れます。
メッセージとして選択肢を提示した後に、メッセージを書き込んだ人が <code>one</code>、<code>two</code>、<code>three</code>、<code>four</code>、などのリアクションを付けてしまいます。
アンケートの参加者は用意されたリアクションを選択するだけで回答できます。</p>
<ul>
<li><a href="https://get.slack.help/hc/ja/articles/229002507-Slack-%E3%81%AE%E6%8A%95%E7%A5%A8%E6%A9%9F%E8%83%BD" target="_blank" rel="noopener noreferrer">Slack の投票機能</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="デフォルトグループメンションの回避">デフォルトグループメンションの回避<a href="https://blog.satotaichi.info/beginners_guide_to_online_chatting/#%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%83%A1%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E5%9B%9E%E9%81%BF" class="hash-link" aria-label="デフォルトグループメンションの回避 への直接リンク" title="デフォルトグループメンショ��ンの回避 への直接リンク">​</a></h3>
<p>Slack では <code>@here</code> や <code>@gruop</code> を使うと、チャンネル内にいる人全てに通知を送信できます。しかし、これは出来る限り使わないようにしましょう。
理由は、邪魔だからです。当該チャンネルに参加していると言うことは、そこでの話題に興味があるということです。不特定多数へのメンションなど使わなくても見ている筈です。
特に興味があるわけではないが、チャンネルに参加しているという状態の人は、そもそも当該ワークスペースにログインしていません。
結局本来気が付いて欲しい相手には届かず、キチンとチャンネルを見ている人には、過剰な通知になってしまいます。</p>
<p>特に、本人の意志では退室できない <code>#general</code> チャンネルなどのデフォルトチャンネルでは、<code>@here</code> や <code>@gruop</code> を使うのはできる限り避けましょう。</p>
<p>とはいえ、複数のメンバーに対して一々ユーザ ID を指定して通知を送るのは面倒ですよね。
そういう時は、ユーザグループを作成して送信対象を少しでも限定しましょう。</p>
<ul>
<li><a href="https://get.slack.help/hc/ja/articles/212906697-%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B" target="_blank" rel="noopener noreferrer">ユーザーグループを作成する</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="メンションに対する応答の義務性について">メンションに対する応答の義務性について<a href="https://blog.satotaichi.info/beginners_guide_to_online_chatting/#%E3%83%A1%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8B%E5%BF%9C%E7%AD%94%E3%81%AE%E7%BE%A9%E5%8B%99%E6%80%A7%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6" class="hash-link" aria-label="メンションに対する応答の義務性について への直接リンク" title="メンションに対する応答の義務性について への直接�リンク">​</a></h3>
<p>チャットツールで自分宛にきたメンションに対して、すぐに答えようとするのはやめましょう。
勿論、自分の仕事に余裕がある状況ならすぐに回答すればいいのですが、そうでない時にはメッセージを見るだけにして応答しないことを選ぶと楽になります。
また、メンションを送る側の気持ちとしても、すぐに応答があることを期待しない方が気持ちが楽になりますよ。</p>
<p>チャットツールの電話に対する明確な優位性は、相手の時間を強制的に拘束しないことです。
自分にとっての要件の優先順位と、相手にとっての要件の優先順位が常に一致しているとは限りません。
もし、要件の優先順位においてお互いが最優先事項であると合意できるなら、電話で話した方がより効率よくコミュニケーションできますよ。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="プライベートコミュニケーションの回避">プライベートコミュニケーションの回避<a href="https://blog.satotaichi.info/beginners_guide_to_online_chatting/#%E3%83%97%E3%83%A9%E3%82%A4%E3%83%99%E3%83%BC%E3%83%88%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E5%9B%9E%E9%81%BF" class="hash-link" aria-label="プライベートコミュニケーションの回避 への直接リンク" title="プライベートコミュニケーションの回避 への直接リンク">​</a></h3>
<p>チャットツールを導入すると、多くの人が Slack でいうところのダイレクトメッセージや、プライベートチャンネルを使いたがります。
開かれた空間でのコミュニケーションに対する漠然とした恐怖感のようなものがあるのではないかと筆者は考えています。
ちょっとしたお願い事や、単純な質問をするのに公開の場所でするまでもないと考える人もいるでしょう。
しかし、業務でチャットツールを使っているのであれば、そのお願い事に対する応答や質問に対する回答は、本来チームの共有資産となるべきものです。</p>
<p>もし、特定の個人にちょっとしたお願い事が集中しているのであれば、業務上の資源配分に失敗している可能性があります。
また、単純な質問が様々な人間から繰返し行われるのであれば、プロセスに問題があるかもしれません。
単純な質問が特定の個人に集中していれば問題の芽に気が付くかもしれませんが、質問者と回答者がそれぞれ複数いれば、見逃されてしまいます。
プライベートコミュニケーションは、こういった組織的な問題の気配を全て覆い隠してしまいます。</p>
<p>情報統制などと言って、重要でもない情報に高い機密レベルのラベルを付けるのをやめてみましょう。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="引用のやりかた">引用のやりかた<a href="https://blog.satotaichi.info/beginners_guide_to_online_chatting/#%E5%BC%95%E7%94%A8%E3%81%AE%E3%82%84%E3%82%8A%E3%81%8B%E3%81%9F" class="hash-link" aria-label="引用のやりかた への直接リンク" title="引用のやりかた への直接リンク">​</a></h3>
<p>Slack には様々な記法があり、メッセージを装飾できます。
詳細な記法については公式のマニュアルを確認して欲しいのですが、議論する上で確実に覚えて欲しい記法が 1 つだけあります。
それが、引用記法です。メッセージの行頭に &gt; (大なり) を使うと引用表現になります。</p>
<p>以下のようにメッセージを書くと
<img decoding="async" loading="lazy" src="data:image/png;base64,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" width="280" height="83" class="img_ev3q"></p>
<p>こういう風に表示されます。
<img decoding="async" loading="lazy" src="data:image/png;base64,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" width="266" height="90" class="img_ev3q"></p>
<ul>
<li><a href="https://get.slack.help/hc/ja/articles/202288908-%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%AE%E6%9B%B8%E5%BC%8F%E8%A8%AD%E5%AE%9A" target="_blank" rel="noopener noreferrer">メッセージの書式設定</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="チャンネル編">チャンネル編<a href="https://blog.satotaichi.info/beginners_guide_to_online_chatting/#%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E7%B7%A8" class="hash-link" aria-label="チャンネル編 への直接リンク" title="チャンネル編 への直接リンク">​</a></h2>
<p>ここからは、Slack のチャンネルについて筆者が気を付けていることを紹介していきます。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="general-チャンネル利用の回避">general チャンネル利用の回避<a href="https://blog.satotaichi.info/beginners_guide_to_online_chatting/#general-%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E5%88%A9%E7%94%A8%E3%81%AE%E5%9B%9E%E9%81%BF" class="hash-link" aria-label="general チャンネル利用の回避 への直接リンク" title="general チャンネル利用の回避 への直接リンク">​</a></h3>
<p>Slack では、ワークスペースに入った際にデフォルトで参加するチャンネルがあります。標準では <code>#general</code> チャンネルです。
このチャンネルは、それぞれのユーザの判断においては退室できない特別なチャンネルなので、ワークスペース参加者全員が絶対に把握しなければならない情報だけをやりとりしましょう。
つまり、ワークスペース自体の運営に関わる話題だけを <code>#general</code> チャンネルでは実施すべきです。</p>
<p>新しい参加者が来たら、挨拶や簡単な情報共有用のチャンネルに誘導してあげましょう。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="チャンネルを分類する方法">チャンネルを分類する方法<a href="https://blog.satotaichi.info/beginners_guide_to_online_chatting/#%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E3%82%92%E5%88%86%E9%A1%9E%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95" class="hash-link" aria-label="チャンネルを分類する方法 への直接リンク" title="チャンネルを分類する方��法 への直接リンク">​</a></h3>
<p>Slack にはメールのように受信したメッセージやチャンネルを分類する機能はありません。
しかしながら、積極的に中身を確認したいチャンネルと、そうでないチャンネルはあるでしょう。
特に積極的に確認したいチャンネルは、チャンネルペインの左上にあるスターをクリックしてお気に入りにしましょう。
画面左側のチャンネル一覧ではスターを付けたチャンネルが上に優先的に表示されます。</p>
<p>スター済のチャンネルと入室済のチャンネルの双方において、チャンネルをミュートできます。
チャンネルをミュートすると、未読メッセージ数が更新されず、メンションが来ても通知が来なくなります。</p>
<p>ミュート済みのチャンネルは、チャンネル一覧において最下部に表示されるので、スターとミュートを組合わせるとチャンネルを 4 種類に分類できるのです。</p>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/channels-20cee29d1827f565adcbdf0e1db7e5aa.png" width="212" height="309" class="img_ev3q"></p>
<p>ここでは、 <code>zogzog</code>と<code>general</code>がスター付チャンネルになっています。加えて、<code>general</code>と<code>piyopiyo</code>が、ミュート済チャンネルです。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="全てのチャンネルに参加しようとするのはやめよう">全てのチャンネルに参加しようとするのはやめよう<a href="https://blog.satotaichi.info/beginners_guide_to_online_chatting/#%E5%85%A8%E3%81%A6%E3%81%AE%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%82%88%E3%81%86%E3%81%A8%E3%81%99%E3%82%8B%E3%81%AE%E3%81%AF%E3%82%84%E3%82%81%E3%82%88%E3%81%86" class="hash-link" aria-label="全てのチャンネルに参加しようとするのはやめよう への直接リンク" title="全てのチャンネルに参加しようとするのはやめよう への直接リンク">​</a></h3>
<p>Slack は話題毎にチャンネルを作ると効率よくコミュニケーションできるので、ワークスペース内のチャンネルは基本的に増加していきます。</p>
<p>新しく出来たチャンネルの全てに入室するのはやめましょう。
自分の知らない所で他の人が楽しくコミュニケーションしていると気になるかもしれませんが、そこはグッと我慢してください。
チャンネルに参加するからには、積極的に発言しましょう、そうする気にならないなら自分にとって余り価値の無い場所なのかもしれませんよ。</p>
<p>新しく出来たチャンネルに次々入っていると、未読メッセージがどんどん蓄積していき、それを読んでいるだけで一日が終わってしまいます。
これを防ぐために、自分にとってそれほど重要でないと感じたら、まずミュートしてみましょう。通知が来なくなります。</p>
<p>チャンネルを見ないまま一週間ほど経過したら、思い切ってそのチャンネルを退出しましょう。
自分にとって意味や価値の無いチャンネルに入室したままにせず、意味や価値のあるチャンネルでのコミュニケーションと本来の仕事に集中しましょう。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="パブリックチャンネルを作ろう">パブリックチャンネルを作ろう<a href="https://blog.satotaichi.info/beginners_guide_to_online_chatting/#%E3%83%91%E3%83%96%E3%83%AA%E3%83%83%E3%82%AF%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E3%82%92%E4%BD%9C%E3%82%8D%E3%81%86" class="hash-link" aria-label="パブリックチャンネルを作ろう への直接リンク" title="パブリックチャンネルを作ろう への直接リンク">​</a></h3>
<p>Slack でチャンネルを作るときは、基本的に誰もが参加できるパブリックチャンネルにしましょう。
パブリックチャンネルなら、その話題に興味がある人が誰でも参加できるし、開かれたコミュニケーションはチーム内に知識を蓄積します。</p>
<p>あらゆる意思決定は公開の場でなされるべきだとは考えてはいませんが、組織内の意思決定をフェアにしたいなら情報公開はその基盤になります。</p>
<p>多くの人が見ている前で、質問したり自分の意見を書いたりするのは、恥ずかしいと感じるかもしれません。
しかし、ダイレクトメッセージやプライベートチャンネルだけを使って狭い範囲でコミュニケーションするより、
多くの人が見ている場所でコミュニケーションする方が得るものが多くなり易いですよ。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="チャンネル名の考え方">チャンネル名の考え方<a href="https://blog.satotaichi.info/beginners_guide_to_online_chatting/#%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E5%90%8D%E3%81%AE%E8%80%83%E3%81%88%E6%96%B9" class="hash-link" aria-label="チャンネル名の考え方 への直接リンク" title="チャンネル名の考え方 への直接リンク">​</a></h3>
<p>Slack ではチャンネルを階層化する仕組みが無いので、命名規則をゆるく作って運用するとチャンネルを探し易くなります。
チャンネル名の接頭辞を工夫すると、そこから話題が類推できるようになります。</p>
<p>例えば、筆者が利用しているワークスペースには、<code>master-git</code>、 <code>master-slack</code>といった <code>master-</code>で始まる各種ツールのちょっとした便利情報を質問したり共有するチャンネルがあります。
似ているチャンネルでは、 <code>qa-jira</code> や <code>qa-cloud</code> といったより質問と回答に特化したチャンネルもあります。
他にも、 社内にある他の部門と協調作業する際には<code>clb-</code>という接頭辞を付けたチャンネルを作って、そこに他の部門の人を呼んでいます。
併せて、自部門内で協調作業の内容について協議するために <code>sprt-</code> という接頭辞を付けたチャンネルも作ります。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="チャンネルの設計パターン">チャンネルの設計パターン<a href="https://blog.satotaichi.info/beginners_guide_to_online_chatting/#%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E3%81%AE%E8%A8%AD%E8%A8%88%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3" class="hash-link" aria-label="チャンネルの設計パターン への直接リンク" title="チャンネルの設計パターン への直接リンク">​</a></h3>
<p>Slack では話題毎に新しいチャンネルを次々と作るのが望ましいのですが、最初のうちはチャンネルを分割する基準が分らないこともあるでしょう。
そこで、チャンネルを新しく作る際に参考にできるようなガイドラインを紹介します。
この基準は唯一絶対というものではなく、あくまでも参考情報として使って下さい。</p>
<p>筆者が利用しているワークスペースでも、これらの基準に当てはまらないチャンネルは日々増えています。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="キーワード基準チャンネル">キーワード基準チャンネル<a href="https://blog.satotaichi.info/beginners_guide_to_online_chatting/#%E3%82%AD%E3%83%BC%E3%83%AF%E3%83%BC%E3%83%89%E5%9F%BA%E6%BA%96%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB" class="hash-link" aria-label="キーワード基準チャンネル への直接リンク" title="キーワード基準チャンネル への直接リンク">​</a></h4>
<p>一番分かり易いチャンネルの作り方が、特定のキーワードを話題にするチャンネルを作ることです。
恐らく誰もが一番最初にやるだろうから、特に例示などは必要ないでしょう。</p>
<p>例えば、筆者が利用しているワークスペースでは <code>muscle</code> や <code>dinner</code>、<code>lunch</code> といったチャンネルがあります。</p>
<p>他にも、Jira や GitHub のチケット番号をチャンネル名として使っているチームもあります。
議論が紛糾するような状況では、タスク管理ツールのコメント欄では機能性が不足していることが多いので、チャットで議論した後、その議事録をタスク管理ツール側に転記すると、迅速に状況を収束させられますよ。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="話者基準チャンネル">話者基準チャンネル<a href="https://blog.satotaichi.info/beginners_guide_to_online_chatting/#%E8%A9%B1%E8%80%85%E5%9F%BA%E6%BA%96%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB" class="hash-link" aria-label="話者基準チャンネル への直接リンク" title="話者基準チャンネル への直接リンク">​</a></h4>
<p>内容ではなく、誰が話すのかを基準にチャンネルを作ると、Slack を使い易くなることがあります。</p>
<p>例えば、筆者が利用しているワークスペースでは、 <code>times_taichi</code> のように <code>times_</code>で始まるチャンネルは、特定の誰か主たる話者として扱うチャンネルです。
ここでは、主たる話者が自分の考えていることや、今困っていることを誰となく垂れ流します。
みんなが見ている自分の庭のような感覚で使うと良いでしょう。筆者は社内向けの Twitter のような感覚で使っています。
また、Slack には様々な機能が増えたり減ったりしていますので、それを余り他の人に迷惑をかけずに試す場所を確保しておくと、Slack への慣れが早くなります。</p>
<p>他の人の話者基準チャンネルに入室しておくのは、その人がちょっとした困りごとに遭遇しているのを見つけた時に、自分が出来る範囲で手助けするためです。
また、本人とって余り重要でないことでも、他の人がそれを見た時に創発的なトリガーになることがあります。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="情報共有チャンネル">情報共有チャンネル<a href="https://blog.satotaichi.info/beginners_guide_to_online_chatting/#%E6%83%85%E5%A0%B1%E5%85%B1%E6%9C%89%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB" class="hash-link" aria-label="情報共有チャンネル への直接リンク" title="情報共有チャンネル への直接リンク">​</a></h4>
<p>RSS フィードを流したり、気になったニュースの URL を貼るためのチャンネルは分けておいた方が良いでしょう。
ただ、何のフィルタリングもせずにニュースサイトの RSS フィードを流すのは、チャンネルの流量が増えすぎるため、参加者の負担になり易く余りよくないやり方です。
ニュースの URL をチャンネルにはる時は、200 文字以内程度のちょっとした意見を一緒に書く方が参加者にとって有意義なものになり易いでしょう。</p>
<p>例えば、筆者が利用しているワークスペースでは <code>tech</code> や <code>gadget</code> といったチャンネルが情報共有に使われています。
<code>tech</code>は、かなり雑多なソフトウェア技術に関する話題が流れています。
自分一人だけで Twitter やはてなブックマークのようなサービスを使っていると情報の偏りが出来やすいので、それを是正する意味で非常に便利です。</p>
<p><code>gadget</code>は、もう少し趣味に寄ったチャンネルで、新しいスマートフォンや、タブレット、スマートウォッチの新商品やキックスターターの記事が話題になります。
現在はキチンとした研究開発対象として認識されている VR 用のヘッドマウントディスプレイは、最初このチャンネルで話題になりました。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="依頼承認チャンネル">依頼/承認チャンネル<a href="https://blog.satotaichi.info/beginners_guide_to_online_chatting/#%E4%BE%9D%E9%A0%BC%E6%89%BF%E8%AA%8D%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB" class="hash-link" aria-label="依頼/承認チャンネル への直接リンク" title="依頼/承認チャンネル への直接リンク">​</a></h4>
<p>筆者の部門では、Slack を始め Jira や GitHub など様々な SaaS を利用しています。
当然ですが、ユーザ全員に管理者権限を割当てるような運用はしていません。それぞれの SaaS に対して、管理者を定めて特定の操作が限定されたユーザに集中するようにしています。</p>
<p>その時、管理者権限での操作を依頼するためのチャンネルが、依頼チャンネルです。
依頼者がチャンネルに依頼したい内容を書き込むと、それを確認した管理者が <code>eyes</code> リアクションを付けます。
作業が終わったら <code>heavy_check_mark</code> リアクションを付けるか、作業が終わった旨メッセージを書き込みます。
依頼者は、そのメッセージに <code>pray</code> アイコンを付けて依頼完了です。</p>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/request_accept-f2193b34aefd05ece1babaf541ff2566.png" width="393" height="140" class="img_ev3q"></p>
<p>これの変形として、管理職が所属員の依頼を承認するチャンネルも考えられます。</p>
<p>例えば、筆者が利用しているワークスペースでは <code>kintai</code> というチャンネルがあり、休暇や遅刻、テレワークの開始や終了などの報告を所属部員が書き込むと承認者たる部門長がリアクションを付ける事で承認しています。</p>
<p>このチャンネルの運用によって承認作業のコストが大きく低減しています。
一般に承認者は管理職であり、その作業時間は非常に貴重なので、この手の承認作業は出来るだけ少ない工数で処理できる事が望ましいでしょう。
また、部門の所属員は、このチャンネルをざっと見るだけで、誰が出社しており、誰がテレワークで、誰が休暇なのかすぐに分かるのでそれぞれの状態に併せたコミュニケーションツールを選び易くなります。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="ボットチャンネル">ボットチャンネル<a href="https://blog.satotaichi.info/beginners_guide_to_online_chatting/#%E3%83%9C%E3%83%83%E3%83%88%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB" class="hash-link" aria-label="ボットチャンネル への直接リンク" title="ボットチャンネル への直接リンク">​</a></h4>
<p>ワークスペースの中にいるプログラマの割合いが一定を越えている場合、多くのボットがワークスペース内に登録されるでしょう。
また、GitHub や Jira などのツールと連携する際に、無軌道に連携するとメッセージの流量が増えるため使い辛くなります。
そういったことを防ぐため、ボットの動作を一定期間確認するためのチャンネルを用意しましょう。</p>
<p>Slack のボットは権限次第で様々な情報を読み取れますし、そこで読み取った情報をユーザが想定しないサーバに送信することもあります。
機密情報を扱っているワークスペースにおいては、ボットがどんな動作をするのか確認しながら段階的に導入しましょう。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="通知チャンネル">通知チャンネル<a href="https://blog.satotaichi.info/beginners_guide_to_online_chatting/#%E9%80%9A%E7%9F%A5%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB" class="hash-link" aria-label="通知チャンネル への直接リンク" title="通知チャンネル への直接リンク">​</a></h4>
<p>電子メールからチャットツールへ移行する際には、通知先としてもチャットツールを使いたくなるでしょう。
Jira のタスク更新通知や、GitHub のコミット通知、<a href="https://statusgator.com/" target="_blank" rel="noopener noreferrer">利用している SaaS のサーバ状況を通知してくれるサービス</a>等々。</p>
<p>チャンネル内のメッセージ流量が通知メッセージは、かなり気を付けてフィルタリングしないとメッセージが増えすぎます。
まずは、通知を受信するための専用チャンネルを用意して、そこに通知を流すようにしましょう。
通知対象を十分に絞り込んだ後に、その通知設定を他のチャンネルに適用しても遅くはありません。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="リラックスチャンネル">リラックスチャンネル<a href="https://blog.satotaichi.info/beginners_guide_to_online_chatting/#%E3%83%AA%E3%83%A9%E3%83%83%E3%82%AF%E3%82%B9%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB" class="hash-link" aria-label="リラックスチャンネル への直接リンク" title="リラックスチャンネル への直接リンク">​</a></h4>
<p>リラックスチャンネルは説明が最も難しいタイプのチャンネルです。
ここでは、ワークスペース内にいるユーザが息抜きすることを主たる目的にしたチャンネルです。
あらゆるチャンネルでリラックスしてコミュニケーションできることが望ましいのですが、仕事で使う以上、そうもいかないこともあるでしょう。</p>
<p>人数が多ければ、そもそもリラックスしているとは、どういう状態なのか合意を取るのは難しくなります。
そこで、いわゆるマジレス禁止を掲げるチャンネルを作成して、その中では、どのような発言も許容されるものとして運用するのです。</p>
<p>例えば、筆者が利用しているワークスペースでは <code>poem</code> というチャンネルがあり、擬音やオノマトペ、誰かに伝える気の無い思いなどを書き込んでいます。
アスキーアートもよく書き込まれています。</p>
<p><code>vogue</code> というチャンネルでは、仕事中に発言された名言や迷言を記録しています。
面白さが強く状況に依存しますが、そういうチャンネルを作っておいて後で見返すと非常に楽しいですよ。
筆者が賛同はできないものの強い感銘を受けた発言を、少し古いのですが一つだけ紹介します。</p>
<blockquote>
<p>別に Suica が使いたいから買うのではない。Apple が新しい時計を出すから買うのだ。</p>
</blockquote>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="まとめ">まとめ<a href="https://blog.satotaichi.info/beginners_guide_to_online_chatting/#%E3%81%BE%E3%81%A8%E3%82%81" class="hash-link" aria-label="まとめ への直接リンク" title="まとめ への直接リンク">​</a></h2>
<p>このエントリでは、主に Slack を念頭において、チャットツールの使い方やその考え方について説明してきました。</p>
<p>繰り返しますが、ここで書いたノウハウは絶対的な基準となるべきものではなく、
あなたにとって受け入れ易く都合のいい部分だけを、取り入れて貰うことを意図して書いています。</p>
<p>全くのゼロからルールを作り出すのは非常に困難な作業ですが、
基準となる文書がありそれを基準に議論するのであれば比較的容易にできるものです。</p>
<p>このエントリを読んだ今までチャットツールをあまり使ってこなかった人が、
出来るだけ早くチャットツールに慣れて使いこなせるようになることを願っています。</p>]]></content>
        <author>
            <name>Sato Taichi</name>
            <uri>https://github.com/taichi</uri>
        </author>
        <category label="slack" term="slack"/>
        <category label="chat" term="chat"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[運動不足の技術者が筋トレを始めた話]]></title>
        <id>https://blog.satotaichi.info/building_muscles_for_beginners/</id>
        <link href="https://blog.satotaichi.info/building_muscles_for_beginners/"/>
        <updated>2017-12-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[このエントリーは pyspa Advent Calendar 2017 の 12 日目の記事です。昨日は @mururururu のエントリでした。]]></summary>
        <content type="html"><![CDATA[<p>このエントリーは <a href="https://adventar.org/calendars/2258" target="_blank" rel="noopener noreferrer">pyspa Advent Calendar 2017</a> の 12 日目の記事です。昨日は <a href="https://medium.com/@mururu/%E4%B8%80%E5%B9%B4%E3%81%AE%E6%8C%AF%E3%82%8A%E8%BF%94%E3%82%8A-8140d8d59a0" target="_blank" rel="noopener noreferrer">@mururururu のエントリ</a>でした。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="はじめに">はじめに<a href="https://blog.satotaichi.info/building_muscles_for_beginners/#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB" class="hash-link" aria-label="はじめに への直接リンク" title="はじめに への直接リンク">​</a></h2>
<p>僕はまごうこと無き運動不足である。週に一回は肩こりの症状を緩和するためにクライミングジムに通ってはいるが、それほど真剣にやっている訳ではないので、三級程度で二年くらい足踏みしている。</p>
<p>しかし、最近は体力の衰えを明確に感じるようになってきた。それは、集中力の低下や、好奇心の低下となって確実に表れている。以前なら、体力任せにコードを書き続けられたが、今はもう全くそんな事ができる気配もない。</p>
<p>と言う訳で、今日は僕が筋トレを始めたという話をする。</p>
<p><a href="https://blog.satotaichi.info/depravity_of_food/" target="_blank" rel="noopener noreferrer">去年は筋肉を溶かす話</a>をしたが、今年は筋肉を作る話をするってわけだ。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="筋トレを始めた理由">筋トレを始めた理由<a href="https://blog.satotaichi.info/building_muscles_for_beginners/#%E7%AD%8B%E3%83%88%E3%83%AC%E3%82%92%E5%A7%8B%E3%82%81%E3%81%9F%E7%90%86%E7%94%B1" class="hash-link" aria-label="筋トレを始めた理由 への直接リンク" title="筋トレを始めた理由 への直接リンク">​</a></h2>
<p>まずは、筋トレを始めた理由から説明していこう。と言っても、実にありふれた話だ。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="人間ドックで警告を受けた">人間ドックで警告を受けた<a href="https://blog.satotaichi.info/building_muscles_for_beginners/#%E4%BA%BA%E9%96%93%E3%83%89%E3%83%83%E3%82%AF%E3%81%A7%E8%AD%A6%E5%91%8A%E3%82%92%E5%8F%97%E3%81%91%E3%81%9F" class="hash-link" aria-label="人間ドックで警告を受けた への直接リンク" title="人間ドックで警告を受けた への直接リンク">​</a></h3>
<p>一番直接的な理由は、会社から年に一回福利厚生の一環として提供されている人間ドックの受診結果が著しく悪かったからだ。特に、尿酸値と γ-GTP の値で警告を受けた。</p>
<p>医者との面談で「かなりお酒を飲まれるようですが控えてはいかがでしょうか？」等と言われて、頭の中に最初に思いついた反論が「いや、そんなに酒を飲んでいるつもりはありません」だったのだ。何かおかしいと思って一旦言葉を飲み込んで考えてみると、これは完全に酒を飲み過ぎている人間の言葉である。</p>
<p>観測的事実を根拠とする指摘に対して、そのつもりは無い等と根拠なく言うのは問題を解決しないどころか悪化させる。</p>
<p>実際、僕はかなり酒を飲む。友人との宴会もあるし、それが無ければ一人でも飲み歩いている。自宅では酒を飲まないが、それはあるだけ全部飲むまで止められないからだ。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="ボルダリングが上手くなりたい">ボルダリングが上手くなりたい<a href="https://blog.satotaichi.info/building_muscles_for_beginners/#%E3%83%9C%E3%83%AB%E3%83%80%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%8C%E4%B8%8A%E6%89%8B%E3%81%8F%E3%81%AA%E3%82%8A%E3%81%9F%E3%81%84" class="hash-link" aria-label="ボルダリングが上手くなりたい への直接リンク" title="ボルダリングが上手くなりたい への直接リンク">​</a></h3>
<p>次に思い当たる理由は、趣味のボルダリングだ。僕がボルダリングを始めたのは、もう 6 年か 7 年前だ。月に 3 ～ 4 回のペースでジムに通っている。最初の 1 ～ 2 年は、どんどん難しい課題がクリアできて成長を実感できたものだが、最近はめっきり技能が向上しておらず、正直、少し飽きてきた。</p>
<p>ジムに行く回数をもう少し増やせば、技能が伸びるとは思うものの、そんなに真面目にやる気になる感じでもない。と言う訳で、筋肉量を別途増やすことで間接的にクライミングのパフォーマンスを向上できたらいいかもしれないと考えた。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="友人の肉体が見違えた">友人の肉体が見違えた<a href="https://blog.satotaichi.info/building_muscles_for_beginners/#%E5%8F%8B%E4%BA%BA%E3%81%AE%E8%82%89%E4%BD%93%E3%81%8C%E8%A6%8B%E9%81%95%E3%81%88%E3%81%9F" class="hash-link" aria-label="友人の肉体が見違えた への直接リンク" title="友人の肉体が見違えた への直接リンク">​</a></h3>
<p>次は、友人の<a href="https://twitter.com/ymotongpoo" target="_blank" rel="noopener noreferrer">@ymotongpoo</a>が、この一年半くらいで、物凄い量のトレーニングをした結果、ガチムチになったのを見たからだ。彼は元々体格が大きく骨格がしっかりしているため、少なくとも僕よりは才能があるだろう。</p>
<p>しかし、筋トレを始める前の彼は正直、かなりダラけた体格をしていた。それでも、適切なトレーニングによって結果を出したのを見て、自分でもやってみようという気になったのだ。</p>
<p>常駐しているチャットには、筋トレに関するレビューや情報交換を専門に扱っているチャンネルもあり、そこでの成果が彼の肉体だ。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="筋トレに期待する効果">筋トレに期待する効果<a href="https://blog.satotaichi.info/building_muscles_for_beginners/#%E7%AD%8B%E3%83%88%E3%83%AC%E3%81%AB%E6%9C%9F%E5%BE%85%E3%81%99%E3%82%8B%E5%8A%B9%E6%9E%9C" class="hash-link" aria-label="筋トレに期待する効果 への直接リ�ンク" title="筋トレに期待する効果 への直接リンク">​</a></h2>
<p>次は、筋トレによって僕が何を得たいのかを明確にしておく。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="より健康的な肉体を得る">より健康的な肉体を得る<a href="https://blog.satotaichi.info/building_muscles_for_beginners/#%E3%82%88%E3%82%8A%E5%81%A5%E5%BA%B7%E7%9A%84%E3%81%AA%E8%82%89%E4%BD%93%E3%82%92%E5%BE%97%E3%82%8B" class="hash-link" aria-label="より健康的な肉体を得る への直接リンク" title="より健康的な肉体を得る への直接リンク">​</a></h3>
<p>基礎代謝を向上し、筋肉量を増やすと共に体脂肪率を落とす。</p>
<p>これによって、将来起こりうる内臓疾患や、椎間板ヘルニアなど姿勢が悪い事や筋肉量が不足することによっておこる疾患を予防したい。</p>
<p>僕は、基本的に一日中座っている仕事しているし、極めて腰に悪い座り方をしている。この姿勢を改善するにも体幹の筋肉が足りないので、妥当な姿勢を維持できないのだ。かなり長い期間、この悪い姿勢を続けているので、その癖を抜くのもすぐには出来ないだろう。結果的に、本来なら緩やかなカーブを描いている筈の背骨がかなり真っすぐになってしまっている。これを改善するには、まず最低限の筋肉が必要だ。</p>
<p>こりをほぐしてくれるようなマッサージ店や整体に行くことで、状況を一時的に改善できるだろうが、そもそも日々の生活や自身の肉体を改善しなければ、永久に整体師や鍼灸師にお世話にならざるを得ない。それは、望ましくない。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="集中力を取り戻す">集中力を取り戻す<a href="https://blog.satotaichi.info/building_muscles_for_beginners/#%E9%9B%86%E4%B8%AD%E5%8A%9B%E3%82%92%E5%8F%96%E3%82%8A%E6%88%BB%E3%81%99" class="hash-link" aria-label="集中力を取り戻す への直接リンク" title="集中力を取り戻す への直接リンク">​</a></h3>
<p>筋肉量を増やすことで、失った体力と共に集中力を取り戻したい。僕は、好奇心と集中力によって活動しているので、もし、それらが完全に失われると活動出来なくなってしまう。</p>
<p>最近は集中力が失われることで、楽しいと思えることの幅が狭くなっているように感じる。以前から知っており、刺激は少ない代わりに、何か安心感のあるコンテンツを好んで摂取するようになったような気がするのだ。</p>
<p>何故集中力が失われたのかというと、それは体力が落ちているからだと考えている。</p>
<p>プログラマとしてのキャリアが長いので、様々なことを知ってはいるし、日々の仕事はそれでこなせる。しかし、ソフトウェアの業界は 20 年程度で全てを見渡せるほど狭くはない。つまり、問題なのは僕自身であり、集中力の欠如によって新しい知識を得られなくなりつつあるのだ。これは、僕の価値を相対的に減じることになるので望ましくない。</p>
<p>もっと新しい知識を獲得し、できる事の幅を広げ、より多くの挑戦をしたい。それを支えるのは体力であり、集中力であり、湧き出る好奇心だ。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="筋トレを始めて分かったこと">筋トレを始めて分かったこと<a href="https://blog.satotaichi.info/building_muscles_for_beginners/#%E7%AD%8B%E3%83%88%E3%83%AC%E3%82%92%E5%A7%8B%E3%82%81%E3%81%A6%E5%88%86%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8" class="hash-link" aria-label="筋トレを始めて分かったこと への直接リンク" title="筋トレを始めて分かったこと への直接リンク">​</a></h2>
<p>前提となる話は一通り終わったので、ここからは今現在の話をしよう。</p>
<p>まずは、現在の僕がどんなステータスなのかを把握して欲しい。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="トレーニング記録">トレーニング記録<a href="https://blog.satotaichi.info/building_muscles_for_beginners/#%E3%83%88%E3%83%AC%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E8%A8%98%E9%8C%B2" class="hash-link" aria-label="トレーニング記録 への直接リ�ンク" title="トレーニング記録 への直接リンク">​</a></h3>
<p>僕が使っているアプリケーションで確認できるトレーニングの記録がこれらだ。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="最古のトレーニング記録">最古のトレーニング記録<a href="https://blog.satotaichi.info/building_muscles_for_beginners/#%E6%9C%80%E5%8F%A4%E3%81%AE%E3%83%88%E3%83%AC%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E8%A8%98%E9%8C%B2" class="hash-link" aria-label="最古のトレーニング記録 への直接リンク" title="最古のトレーニング記録 への直接リンク">​</a></h4>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">2017/10/16</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">オリジナルメニュー</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">終了日時</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2017/10/16</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">チェストプレス</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット1 25.0kg x 3回</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット2 25.0kg x 3回</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット3 25.0kg x 3回 / 1RM 27 kg MAX!</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">消費カロリー</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2.0kcal</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">レッグプレス</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット1 75.0kg x 5回</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット2 75.0kg x 5回</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット3 75.0kg x 5回 / 1RM 84 kg MAX!</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">消費カロリー</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">4.9kcal</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ハックスクワット</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット1 40.0kg x 5回</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット2 40.0kg x 5回</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット3 40.0kg x 5回 / 1RM 45 kg MAX!</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">消費カロリー</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">4.9kcal</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ロータリートルソー</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット1 20.0kg x 5回</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット2 20.0kg x 5回</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット3 20.0kg x 5回 / 1RM 22 kg MAX!</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">消費カロリー</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">3.8kcal</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">シーテッドプーリーロー(シーテッドロウ)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット1 40.0kg x 5回</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット2 40.0kg x 5回</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット3 40.0kg x 5回 / 1RM 45 kg MAX!</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">消費カロリー</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">3.8kcal</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">合計消費カロリー</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">19.5kcal</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">体組成</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">測定日時</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2017/10/16</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">身長</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">175.0cm</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">体重</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">62.0kg</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="最新のトレーニング記録">最新のトレーニング記録<a href="https://blog.satotaichi.info/building_muscles_for_beginners/#%E6%9C%80%E6%96%B0%E3%81%AE%E3%83%88%E3%83%AC%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E8%A8%98%E9%8C%B2" class="hash-link" aria-label="最新のトレーニング記録 への直接リンク" title="最新のトレーニング記録 への直接リンク">​</a></h4>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">2017/12/08</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">平日基本トレーニング</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">終了日時</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2017/12/08 21:46</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ウォーキング</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット1 1500m / 15分</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">消費カロリー</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">57.9kcal</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ヒップアダクション</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット1 110.0kg x 10回</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット2 110.0kg x 10回</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット3 110.0kg x 10回 / 1RM 138 kg MAX!</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">消費カロリー</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">7.7kcal</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ヒップアブダクション</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット1 115.0kg x 10回</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット2 115.0kg x 10回</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット3 115.0kg x 10回 / 1RM 144 kg MAX!</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">消費カロリー</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">7.7kcal</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ワイドグリップチンニング</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット1 10回</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット2 7回</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット3 7回</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">消費カロリー</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">7.2kcal</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">チンニング(懸垂)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット1 4回</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット2 4回</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">消費カロリー</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2.4kcal</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">シーテッドプーリーロー(シーテッドロウ)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット1 27.3kg x 10回</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット2 34.1kg x 10回</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット3 34.1kg x 10回 / 1RM 43 kg MAX!</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">消費カロリー</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">7.7kcal</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">チェストプレス</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット1 15.0kg x 10回</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット2 20.0kg x 10回</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット3 20.0kg x 10回 / 1RM 25 kg MAX!</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">消費カロリー</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">6.9kcal</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ラットプルダウン</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット1 27.3kg x 10回</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット2 34.1kg x 10回</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット3 34.1kg x 10回 / 1RM 43 kg MAX!</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">消費カロリー</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">7.7kcal</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">レッグプレス</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット1 50.0kg x 10回</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット2 50.0kg x 10回</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット3 50.0kg x 10回 / 1RM 63 kg MAX!</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">消費カロリー</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">10.0kcal</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">プランク（スタビライゼーション）</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット1 40秒</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット2 40秒</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット3 40秒</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">消費カロリー</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">9.3kcal</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ハンマーカール</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット1 6.0kg x 10回</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット2 6.0kg x 10回</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">セット3 6.0kg x 10回 / 1RM 8 kg MAX!</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">消費カロリー</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">7.7kcal</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">合計消費カロリー</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">132.5kcal</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">体組成</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">測定日時</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2017/12/08 21:54</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">体重</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">63.8kg</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>ほぼ全ての種目で平均的な成人男性未満の身体的能力である。
これで分かるのは、僕が筋トレ初心者であり、大した成果がでている訳でないということだ。
やり始めた頃より重量が減っている種目が少なからずあるが、これは正しいフォームで狙うべき筋肉だけを使うようになった結果、高い重量で負荷をかけられなくなったからだ。</p>
<p>体重は、二か月で 2kg 弱増加しているが、体内の水分状況などで容易に変わるレベルなので、ほぼ変わってないと言える。尚、増加していること自体は問題ない。</p>
<p>高度な体組成計での計測も行っているが、筋肉量は特に増加していないし、体脂肪率も 18%前後で、ほぼ変化していない。つまり、二か月くらいでは、体組成計で観測可能な変化は起こらないということだ。</p>
<p>一方で、筋肉量は増えていないにも関わらず体にかけられる負荷の量は確実に増えている。特にチンニング（懸垂）は顕著だ。始めた時は、ワイドグリップチンニングは出来なかったが、今では 10 回くらい出来るようになった。</p>
<p>二か月程度でも簡単な技能を獲得することはできるし、筋肉の使い方を正しく理解し、使いこなすだけで、ある程度は成長するということだ。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="筋トレの面白いところ">筋トレの面白いところ<a href="https://blog.satotaichi.info/building_muscles_for_beginners/#%E7%AD%8B%E3%83%88%E3%83%AC%E3%81%AE%E9%9D%A2%E7%99%BD%E3%81%84%E3%81%A8%E3%81%93%E3%82%8D" class="hash-link" aria-label="筋トレの面白いところ への直接リンク" title="筋トレの面白いところ への直接リンク">​</a></h3>
<p>今は大体週に四回くらいスポーツジムでマシントレーニングをして、週一回はクライミングジムに行っている。</p>
<p>つまり、週に五回は何らかのジムに行っているのだ。何故、こんなにジムに行っているのかといえば、単純に面白いからだ。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="自らを理解する楽しみ">自らを理解する楽しみ<a href="https://blog.satotaichi.info/building_muscles_for_beginners/#%E8%87%AA%E3%82%89%E3%82%92%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B%E6%A5%BD%E3%81%97%E3%81%BF" class="hash-link" aria-label="自らを理解する楽しみ への直接リンク" title="自らを理解する楽しみ への直接リンク">​</a></h4>
<p>一番面白いのは、自分自身にとって最も身近な道具である自らの肉体について沢山の発見があるからだ。適切なトレーニングを積んでいない者は、自分の体を思い通りには動かせない。トレーニングを始める前は、そもそも自分の体を思い通りに動かせているかなんて考えもしなかった。つまり、自分の体に対する理解の解像度が著しく低かったのだ。</p>
<p>例えば、ジムに通い始めたころは、まず、広背筋がビタイチ言うことを聞いてくれなかった。シーテッドプーリーロウやラットプルダウンと言った広背筋を鍛える筈のマシンを使っても、フォームが誤っていることに加えて、広背筋を使えていないために、上腕二頭筋や上腕三頭筋と言った腕の筋肉が疲れてしまうのだ。</p>
<p>その状態から、パーソナルトレーナーを週に一回お願いして、三十分程度マッサージして貰ったうえで、フォームを細かくチェックして貰いながら丁寧に負荷をかけた。そうして五週間くらい経った頃だろうか、それは起きた。</p>
<p>何かがパチリとハマった感じがして、今まで動いている気がしなかった広背筋が少しだけ動くようになったのだ。かけられる負荷が突然 13kg 程度から 25kg 程度まで倍増、その日からはシーテッドプーリーロウで、腕より先に、広背筋の方が疲れるようになったのだ。その後も、ジムにいくたびに扱える負荷は増えている。</p>
<p>筋トレはこういう体験が次々とやってくるのだ。分からなかったことが分かるようになったり、出来なかったことが出来るようになる体験は、何にも代えがたい。</p>
<p>筋トレの成果として得たいものが、筋トレをしながらでも得られているので、良好なフィードバックサイクルが回っていると言える。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="マイクロチューニング的な楽しみ">マイクロチューニング的な楽しみ<a href="https://blog.satotaichi.info/building_muscles_for_beginners/#%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%83%81%E3%83%A5%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E7%9A%84%E3%81%AA%E6%A5%BD%E3%81%97%E3%81%BF" class="hash-link" aria-label="マイクロチューニング的な楽しみ への直接リンク" title="マイクロチューニング的な楽しみ への直接リンク">​</a></h4>
<p>筋トレでは、実に多くのものを数値化して管理できる。体重や体脂肪率、筋肉量といった項目は家庭用の体組成計で計量できるし、僕が行っているジムには<a href="https://www.inbody.co.jp/jp/product/InBody770.aspx" target="_blank" rel="noopener noreferrer">InBody</a>という、より本格的な体組成計があり、細胞内水分やミネラルといった異様に細かい項目まで計測できる。</p>
<a target="_blank" href="https://www.amazon.co.jp/gp/product/B01N9AZQEF/ref=as_li_tl?ie=UTF8&amp;camp=247&amp;creative=1211&amp;creativeASIN=B01N9AZQEF&amp;linkCode=as2&amp;tag=des-22&amp;linkId=7c9d83cb7a1dd867e3010676a51af16c"><img border="0" src="https://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;MarketPlace=JP&amp;ASIN=B01N9AZQEF&amp;ServiceVersion=20070822&amp;ID=AsinImage&amp;WS=1&amp;Format=_SL160_&amp;tag=des-22"></a>
<p>これらを一々記録して眺めるのは、とてつもなく楽しいものだ。自分にかける負荷の量は、自分で決められる。睡眠時間や食事の内容、その日の仕事ぶり、精神的な状況、様々な要因で変化する。</p>
<p>この記録した数字は、自分の振る舞いによって改善していく。この楽しさは、foreach とイテレータのどちらが速いのか調べたり、テストのコードカバレージを改善するのと非常に良く似ている。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="情報収集する楽しみ">情報収集する楽しみ<a href="https://blog.satotaichi.info/building_muscles_for_beginners/#%E6%83%85%E5%A0%B1%E5%8F%8E%E9%9B%86%E3%81%99%E3%82%8B%E6%A5%BD%E3%81%97%E3%81%BF" class="hash-link" aria-label="情報収集する楽しみ への直接リンク" title="情報収集する楽しみ への直接リンク">​</a></h4>
<p>筋トレに関する情報は、インターネット上に山ほどあふれている、それこそスポーツ医学としてキチンと研究されたものから、怠惰な人間を狙い撃ちするような疑似科学まであり、玉石混交だ。これらをより分けるべく、沢山のドキュメントを読むのは実に刺激的である。</p>
<p>この二か月で僕が知った情報のうち、筋トレを始めたばかりの頃にすぐ知りたいと思っていたものを少し列挙してみよう。</p>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="どのプロテインが良いの">どのプロテインが良いの？<a href="https://blog.satotaichi.info/building_muscles_for_beginners/#%E3%81%A9%E3%81%AE%E3%83%97%E3%83%AD%E3%83%86%E3%82%A4%E3%83%B3%E3%81%8C%E8%89%AF%E3%81%84%E3%81%AE" class="hash-link" aria-label="どのプロテインが良いの？ への直接リンク" title="どのプロテインが良いの？ への直接リンク">​</a></h5>
<p>筋トレの成果を得るには、摂取する栄養の改善が欠かせない。例えば、プロテインだ。ホエイだの、ソイだの、カゼインだの色々ある。それぞれ効果が違うし値段も違う。多くのメジャーな日本メーカの製品はどれも高額だ。何と海外から輸入した方が輸送量込みでも安くなったりする。</p>
<p>例えば、<a href="https://www.myprotein.jp/" target="_blank" rel="noopener noreferrer">MyProtein</a>というイギリスのメーカは、<a href="http://store.steampowered.com/" target="_blank" rel="noopener noreferrer">Steam</a>みたいな勢いで毎日セールをしており、そのおかげでやたら安くプロテインを買える。ただ、MyProtein のプロテインは味がとんでもなく甘い。イメージとしては、ぬるくなったマックシェイクと同じような甘さを想像して貰えばいい。ナチュラルチョコレート味を一度だけ試したが、僕には合わなかった。</p>
<p>僕が今飲んでいるプロテインは、<a href="https://www.bulksports.com/protein/isopro/" target="_blank" rel="noopener noreferrer">バルクスポーツ</a>という日本のメーカが作っているプロテインだ。ここは、MyProtein と同程度の価格だが、あまり甘くない。そして、袋のチャックが頑丈だ。僕が気に入っている味は、アーモンドチョコレート、イチゴミルク、バニラアイスだ。最近バニラアイス味を 6kg 程買った。</p>
<p>僕が飲んでいるのはホエイのアイソレートプロテインというやつだ。ホエイプロテインは牛乳から作られるプロテインで、アイソレートプロテインは乳糖が殆ど含まれないので、お腹にやさしい。</p>
<p>プロテインは、体重 x2.2g をめどに摂取するのが望ましいと言われている。僕の場合、140g 程度だ。なので食事とは別に一日三回二スクープずつ飲んでいる。起床後、就寝前、トレーニング直後だ。</p>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="プロテイン以外のサプリは">プロテイン以外のサプリは？<a href="https://blog.satotaichi.info/building_muscles_for_beginners/#%E3%83%97%E3%83%AD%E3%83%86%E3%82%A4%E3%83%B3%E4%BB%A5%E5%A4%96%E3%81%AE%E3%82%B5%E3%83%97%E3%83%AA%E3%81%AF" class="hash-link" aria-label="プロテイン以外のサプリは？ への直接リンク" title="プロテイン以外のサプリは？ への直接リンク">​</a></h5>
<p>トレーニング中に栄養不足にならないよう飲むドリンクもある。<a href="http://www.powerproduction.jp/products/ccd_dr500/" target="_blank" rel="noopener noreferrer">CCD</a>と<a href="https://www.bulksports.com/allitem/bcaa/" target="_blank" rel="noopener noreferrer">BCAA</a>を、10:1 で配合したものを 500ml 程度の水で溶かしてトレーニング中に飲んでいる。</p>
<a target="_blank" href="https://www.amazon.co.jp/gp/product/B00C39A5EM/ref=as_li_tl?ie=UTF8&amp;camp=247&amp;creative=1211&amp;creativeASIN=B00C39A5EM&amp;linkCode=as2&amp;tag=des-22&amp;linkId=55f0049fb786c92f1d364798d22c08b3"><img border="0" src="https://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;MarketPlace=JP&amp;ASIN=B00C39A5EM&amp;ServiceVersion=20070822&amp;ID=AsinImage&amp;WS=1&amp;Format=_SL160_&amp;tag=des-22"></a>
<p>何でこんなものを飲むのかと言うと、筋トレ中は大量にエネルギーを消費するのだが、そこでエネルギーが不足するとヤバいことに筋肉を燃料として使う。筋肉を増やすべくトレーニングしているのに、その筋肉が減るこのヤバい状態をカタボリックと言う。カタボを防ぐには、CCD のようなドリンクですぐにエネルギーになる炭水化物を適宜補給するのが望ましい。</p>
<p>他にも、普通に食事をしていると不足しがちなビタミンを<a href="https://jp.iherb.com/pr/Optimum-Nutrition-Opti-Men-150-Tablets/57069" target="_blank" rel="noopener noreferrer">Optimum Nutrition, オプティ-メン ®</a>という錠剤からとっている。オプティ-メンは、Amazon を含む様々な EC サイトから購入できるのだけど、値段が随分違う。もし、オプティ-メンを買うなら、iHerb で買うべきだ。</p>
<p>そうそう、トレーニング後に飲んでいるプロテインには、疲労回復を早める効果を期待して<a href="https://www.bulksports.com/amino/glutamine/" target="_blank" rel="noopener noreferrer">グルタミン</a>を混ぜている。</p>
<p>僕はまだ飲んでいないが、アルギニン、シトルリン、クリルオイル、デキストリン、クレアチン、HMB など筋トレをやっている人にオススメされているサプリは多い。これまた、どれも成分表示に細かい数字が沢山並んでおり、これを眺めて価格と成分量でコストパフォーマンスを比較するのは愉悦そのものと言っていい。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="筋トレの辛いところ">筋トレの辛いところ<a href="https://blog.satotaichi.info/building_muscles_for_beginners/#%E7%AD%8B%E3%83%88%E3%83%AC%E3%81%AE%E8%BE%9B%E3%81%84%E3%81%A8%E3%81%93%E3%82%8D" class="hash-link" aria-label="筋トレの辛いところ への直接リンク" title="筋トレの辛いところ への直接リンク">​</a></h3>
<p>勿論、筋トレが楽しいことばかりだと主張するつもりはない。辛い事だってある。</p>
<p>筋トレを始める前は、筋肉に負荷をかける作業そのものが辛いと考えていたが、どうも、そうではないことが分かってきた。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="食事もトレーニングに含まれる">食事もトレーニングに含まれる<a href="https://blog.satotaichi.info/building_muscles_for_beginners/#%E9%A3%9F%E4%BA%8B%E3%82%82%E3%83%88%E3%83%AC%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%AB%E5%90%AB%E3%81%BE%E3%82%8C%E3%82%8B" class="hash-link" aria-label="食事もトレーニングに含まれる への直接リンク" title="食事もトレーニングに含まれる への直接リンク">​</a></h4>
<p>筋トレで本当に辛いパートは、食事だ。</p>
<p>僕は、基礎代謝が低いので極端な話、休日は一日一食で十分に活動できる。活動と言っても、PC の前に座ってコードを書いているかゲームをしているだけで、一日の総移動距離が 10 メートルくらいだが。仕事をする日でも、一日二食も食べれば、特に問題無く活動できる。</p>
<p>しかし、筋トレの効果を最大化するなら、もっと多くの食事が必要だ。僕は胃が小さいので一度に沢山は食べられない。つまり、食事の回数を増やすしかない、プロテインなどのサプリを摂取するのとは別に、一日三回は食事をするのが望ましい。それくらい簡単だろって思えるあなたは素晴らしい、僕より筋トレの才能がある。</p>
<p>特にトレーニング後の食事が僕にとってはきつい。まず、トレーニング前にパフォーマンスアップとカタボ予防で、おにぎりを一つ食べている。更に、トレーニング中に CCD と BCAA のドリンクを二時間で 500ml 程飲んでいる。そして、二時間程度のトレーニング直後にプロテインを飲む。2 スクープを 300ml 程の水で溶いて飲んでいる。運動をした直後なので、空腹感は一切ない。</p>
<p>プロテインの吸収効率を上げるには炭水化物とセットにするのが望ましいので、プロテインを摂取したら直ちに、晩御飯を食べるのが望ましい。栄養バランスが出来る限り良いものを食べようとすると、どうしても量が多くなる。多量の食事を空腹感なしに摂取するのは、正直苦痛でしかないが慣れるしかない。</p>
<p>例えばこういう感じの食事している。これは、大戸屋の彩り野菜と炭火焼きバジルチキン定食だ。腹さえ減ってれば、本当に旨いのでおススメしておく。</p>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/supper-89aecadfc65f3ed1e8506fa3c219dd22.jpg" width="3840" height="2160" class="img_ev3q"></p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="トレーナーのストレッチで激痛">トレーナーのストレッチで激痛<a href="https://blog.satotaichi.info/building_muscles_for_beginners/#%E3%83%88%E3%83%AC%E3%83%BC%E3%83%8A%E3%83%BC%E3%81%AE%E3%82%B9%E3%83%88%E3%83%AC%E3%83%83%E3%83%81%E3%81%A7%E6%BF%80%E7%97%9B" class="hash-link" aria-label="トレーナーのストレッチで激痛 への直接リンク" title="トレーナーのストレッチで激痛 への直接リンク">​</a></h4>
<p>体が固いままではトレーニングにならない。そして、体が一定以上固いと自分ではストレッチできない。この状況を打開するには、専門知識を持つトレーナーにストレッチを手伝って貰うのが望ましい。</p>
<p>これが、とんでもなく痛い、というか痛くて毎回軽く泣いている。肩甲骨の裏辺りを押されて激痛。首の裏側辺りを押されて激痛。ストレッチポールの上で胸を押されて泣く。仰向けで、足をゆっくり持ち上げられただけで顔が歪むほど痛い。</p>
<p>週一回、30 分程度のマッサージを受けているが、マッサージを受けた日は、トレーニングのパフォーマンスは確実に向上するし、体の柔軟性は少しづつ改善している。</p>
<p>例えば、仰向けで足を上げるストレッチは最初 30 度くらいしか上がらなかったが、二か月かけて 60 度くらいまで上がるようになった。なお、90 度程度は誰でも上がるらしい。</p>
<p>三か月くらい続ければ、徐々に痛みは無くなって気持ち良くなるなどと言われているが、現状全く信じられない。しかし、今はそれを信じるしかない状況だ。少しでも早くマッサージ時の痛みを低減するために自宅でもストレッチを毎日やっている。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="使っている器具やアプリケーション">使っている器具やアプリケーション<a href="https://blog.satotaichi.info/building_muscles_for_beginners/#%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E5%99%A8%E5%85%B7%E3%82%84%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3" class="hash-link" aria-label="使っている器具やアプリケーション への直接リンク" title="使っている器具やアプリケーション への直接リンク">​</a></h2>
<p>次は、これから筋トレをやってみようって人に、僕が使っている道具の類を紹介する。</p>
<p>これは、周りの筋トレを沢山やっている友人たちに教えて貰って集めた情報だ。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="トレーニング器具">トレーニング器具<a href="https://blog.satotaichi.info/building_muscles_for_beginners/#%E3%83%88%E3%83%AC%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E5%99%A8%E5%85%B7" class="hash-link" aria-label="トレーニング器具 への直接リンク" title="トレーニング器具 への直接リンク">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="プッシュアップバー">プッシュアップバー<a href="https://blog.satotaichi.info/building_muscles_for_beginners/#%E3%83%97%E3%83%83%E3%82%B7%E3%83%A5%E3%82%A2%E3%83%83%E3%83%97%E3%83%90%E3%83%BC" class="hash-link" aria-label="プッシュアップバー への直接リンク" title="プッシュアップバー への直接リンク">​</a></h4>
<a target="_blank" href="https://www.amazon.co.jp/gp/product/B01ID7OP4I/ref=as_li_tl?ie=UTF8&amp;camp=247&amp;creative=1211&amp;creativeASIN=B01ID7OP4I&amp;linkCode=as2&amp;tag=des-22&amp;linkId=be0c534842e7fe13606f841cb979633a"><img border="0" src="https://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;MarketPlace=JP&amp;ASIN=B01ID7OP4I&amp;ServiceVersion=20070822&amp;ID=AsinImage&amp;WS=1&amp;Format=_SL160_&amp;tag=des-22"></a>
<p>いわゆる腕立て伏せするためのアレだ。自宅トレーニングでは少ない種目を短時間だけやるようにしているので、広範囲に負荷をかけられる腕立て伏せは効率がよい。ちなみに、他にやってる種目はプランクとスクワットだけだ。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="captains-of-crushキャプテンズオブクラッシュ-ハンドグリッパー">Captains of Crush(キャプテンズ・オブ・クラッシュ) ハンドグリッパー<a href="https://blog.satotaichi.info/building_muscles_for_beginners/#captains-of-crush%E3%82%AD%E3%83%A3%E3%83%97%E3%83%86%E3%83%B3%E3%82%BA%E3%82%AA%E3%83%96%E3%82%AF%E3%83%A9%E3%83%83%E3%82%B7%E3%83%A5-%E3%83%8F%E3%83%B3%E3%83%89%E3%82%B0%E3%83%AA%E3%83%83%E3%83%91%E3%83%BC" class="hash-link" aria-label="Captains of Crush(キャプテンズ・オブ・クラッシュ) ハンドグリッパー への直接リンク" title="Captains of Crush(キャプテンズ・オブ・クラッシュ) ハンドグリッパー への直接リンク">​</a></h4>
<a target="_blank" href="https://www.amazon.co.jp/gp/product/B0074DDYRM/ref=as_li_tl?ie=UTF8&amp;camp=247&amp;creative=1211&amp;creativeASIN=B0074DDYRM&amp;linkCode=as2&amp;tag=des-22&amp;linkId=ad7deefa9b021e835d3e490f35caa8a2"><img border="0" src="https://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;MarketPlace=JP&amp;ASIN=B0074DDYRM&amp;ServiceVersion=20070822&amp;ID=AsinImage&amp;WS=1&amp;Format=_SL160_&amp;tag=des-22"></a>
<p>握力を鍛えるハンドクリッパーだ。僕は握力が 30kg 前後なので、ガイドというレベルのやつをニギニギしている。</p>
<p>こいつは、トゲトゲしていて少しくらいの汗では滑らないので非常によい。単一の商品で、より上位のレベルが定義されており、攻略している感がある。</p>
<p>最高位の No.4 は世界で 5 人しか閉じられないとか、意味の分からん感じなのがまた良い。伝説の武器か何かなのかな…</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="ストレッチ器具">ストレッチ器具<a href="https://blog.satotaichi.info/building_muscles_for_beginners/#%E3%82%B9%E3%83%88%E3%83%AC%E3%83%83%E3%83%81%E5%99%A8%E5%85%B7" class="hash-link" aria-label="ストレッチ器具 への直接リンク" title="ストレッチ器具 への直接リンク">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="ストレッチポール">ストレッチポール<a href="https://blog.satotaichi.info/building_muscles_for_beginners/#%E3%82%B9%E3%83%88%E3%83%AC%E3%83%83%E3%83%81%E3%83%9D%E3%83%BC%E3%83%AB" class="hash-link" aria-label="ストレッチポール への直接リンク" title="ストレッチポール への直接リンク">​</a></h4>
<a target="_blank" href="https://www.amazon.co.jp/gp/product/B00F9VW8SC/ref=as_li_tl?ie=UTF8&amp;camp=247&amp;creative=1211&amp;creativeASIN=B00F9VW8SC&amp;linkCode=as2&amp;tag=des-22&amp;linkId=cb4769dddd6c58000d203720ad1d3bab"><img border="0" src="https://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;MarketPlace=JP&amp;ASIN=B00F9VW8SC&amp;ServiceVersion=20070822&amp;ID=AsinImage&amp;WS=1&amp;Format=_SL160_&amp;tag=des-22"></a>
<p>ウレタンの長い棒。類似商品でやたら安いのが色々あるが、あれらは全て柔らかすぎるのでダメだ。兎に角、一人で背中をマッサージする方法は少ないので、ストレッチポールは非常に良いものだ。</p>
<p>風呂上がりにこの上でゴロゴロしている。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="ランブルローラー">ランブルローラー<a href="https://blog.satotaichi.info/building_muscles_for_beginners/#%E3%83%A9%E3%83%B3%E3%83%96%E3%83%AB%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC" class="hash-link" aria-label="ランブルローラー への直接リンク" title="ランブルローラー への直接リンク">​</a></h4>
<a target="_blank" href="https://www.amazon.co.jp/gp/product/B004IRK09C/ref=as_li_tl?ie=UTF8&amp;camp=247&amp;creative=1211&amp;creativeASIN=B004IRK09C&amp;linkCode=as2&amp;tag=des-22&amp;linkId=ee31336094f4b5fce17a4613bba3b7ba"><img border="0" src="https://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;MarketPlace=JP&amp;ASIN=B004IRK09C&amp;ServiceVersion=20070822&amp;ID=AsinImage&amp;WS=1&amp;Format=_SL160_&amp;tag=des-22"></a>
<p>トゲトゲの短い棒。これは、短くて取り回しがし易いので、ストレッチポールではマッサージし辛い部位をストレッチするのに使う。こっちは、安い類似品でも相応の効果が得られるらしい。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="骨盤職人">骨盤職人<a href="https://blog.satotaichi.info/building_muscles_for_beginners/#%E9%AA%A8%E7%9B%A4%E8%81%B7%E4%BA%BA" class="hash-link" aria-label="骨盤職人 への直接リンク" title="骨盤職人 への直接リンク">​</a></h4>
<a target="_blank" href="https://www.amazon.co.jp/gp/product/B008J63ULS/ref=as_li_tl?ie=UTF8&amp;camp=247&amp;creative=1211&amp;creativeASIN=B008J63ULS&amp;linkCode=as2&amp;tag=des-22&amp;linkId=a95fd60ac425450e7a4c5614bc56151c"><img border="0" src="https://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;MarketPlace=JP&amp;ASIN=B008J63ULS&amp;ServiceVersion=20070822&amp;ID=AsinImage&amp;WS=1&amp;Format=_SL160_&amp;tag=des-22"></a>
<p>ザ・激痛。体が柔らかくなってくると気持ちいらしいが、僕はまだその境地にいない。パーソナルトレーナーにマッサージして貰わなかった日は、風呂上りにこいつで色んな所を刺激している。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="その他">その他<a href="https://blog.satotaichi.info/building_muscles_for_beginners/#%E3%81%9D%E3%81%AE%E4%BB%96" class="hash-link" aria-label="その他 への直接リンク" title="その他 への直接リンク">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="fitness-archiveフィットネス-アーカイブ"><a href="https://play.google.com/store/apps/details?id=jp.co.xebio.training&amp;hl=ja" target="_blank" rel="noopener noreferrer">FITNESS ARCHIVE（フィットネス アーカイブ）</a><a href="https://blog.satotaichi.info/building_muscles_for_beginners/#fitness-archive%E3%83%95%E3%82%A3%E3%83%83%E3%83%88%E3%83%8D%E3%82%B9-%E3%82%A2%E3%83%BC%E3%82%AB%E3%82%A4%E3%83%96" class="hash-link" aria-label="fitness-archiveフィットネス-アーカイブ への直接リンク" title="fitness-archiveフィットネス-アーカイブ への直接リンク">​</a></h4>
<p>ワークアウトの記録用アプリケーションは、10 個くらい試してみたが、フィットネスアーカイブが一番良かった。</p>
<p>アプリケーション内に組み込まれていない種目も、自分で定義できるのは本当に素晴らしい機能だと思う。</p>
<p>ただ、内部にため込んだ情報を一括で外に出力する方法が無いので、流行りの機械学習にかけたり統計処理するなら、何かひと手間必要になる。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="soundsport-free-wireless-headphones"><a href="https://www.bose.co.jp/ja_jp/products/headphones/earphones/soundsport-free-wireless.html" target="_blank" rel="noopener noreferrer">SoundSport Free wireless headphones</a><a href="https://blog.satotaichi.info/building_muscles_for_beginners/#soundsport-free-wireless-headphones" class="hash-link" aria-label="soundsport-free-wireless-headphones への直接リンク" title="soundsport-free-wireless-headphones への直接リンク">​</a></h4>
<a target="_blank" href="https://www.amazon.co.jp/gp/product/B074TCH8D9/ref=as_li_tl?ie=UTF8&amp;camp=247&amp;creative=1211&amp;creativeASIN=B074TCH8D9&amp;linkCode=as2&amp;tag=des-22&amp;linkId=63a0d31f210c430883e924b5ff34cd84"><img border="0" src="https://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;MarketPlace=JP&amp;ASIN=B074TCH8D9&amp;ServiceVersion=20070822&amp;ID=AsinImage&amp;WS=1&amp;Format=_SL160_&amp;tag=des-22"></a>
<p>完全ワイヤレスイヤホンというやつだ。少し大きくて不格好だが、首の周りにケーブルが無いのでジムでも安心して使える。最初はランニング用の首回りだけはケーブルのあるワイヤレスイヤホンを買おうとしていたのだが、友人に勧められてこちらにした。</p>
<p>新宿、渋谷、東京など巨大なターミナル駅の改札付近にいると、ブチブチ切れて大変不快だが、ジム内では快適だ。トレーニング中は寝っ転がったりするので、少しでもケーブルがあると、危なかったり不快だったりする。それが無い完全ワイヤレスイヤホンは、大変素晴らしい。</p>
<p>後、通信が切れた後に何もしなくても数秒で復帰してくるので、非常に使い易い。再充電しなくても 5 時間くらいはバッテリーが持続するのでトレーニング中にバッテリーが無くなってしまうこともない。</p>
<p>音質については、僕が音痴なのでよく分からない。少し高額な商品だが、ジムの中で音楽を聴くなら、こいつはマジでおススメだ。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="まとめ">まとめ<a href="https://blog.satotaichi.info/building_muscles_for_beginners/#%E3%81%BE%E3%81%A8%E3%82%81" class="hash-link" aria-label="まとめ への直接リンク" title="まとめ への直接リンク">​</a></h2>
<p>このエントリでは、この二か月間で僕が学んだことを出来るだけ全て書くようにした。</p>
<p>ジムに行った方が良いというのは分かっていても、そもそも契約が面倒だと思ったり、何かちょっとしたことでジムに行かなくなってしまうことはあるだろう。僕も以前はそうだった。</p>
<p>しかし、状況を整理し、目的意識をはっきりさせ、細かい記録を取り、認知の解像度を上げることで、筋トレを楽しめる状態になった。この調子なら当分継続できそうだ。</p>
<p>この記事を最後まで読んだあなたはどうだろうか？</p>]]></content>
        <author>
            <name>Sato Taichi</name>
            <uri>https://github.com/taichi</uri>
        </author>
        <category label="life" term="life"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[デスマサバイバルガイド]]></title>
        <id>https://blog.satotaichi.info/death-march_survival-guide/</id>
        <link href="https://blog.satotaichi.info/death-march_survival-guide/"/>
        <updated>2017-09-29T13:13:57.000Z</updated>
        <summary type="html"><![CDATA[はじめに]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="はじめに">はじめに<a href="https://blog.satotaichi.info/death-march_survival-guide/#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB" class="hash-link" aria-label="はじめに への直接リンク" title="はじめに への直接リンク">​</a></h2>
<p>僕がよく知っている業界は SI だが、これに限らずソフトウェア開発の現場には、過酷な現場…いわゆるデスマーチが多いと言われている。</p>
<p>一方で、そのような過酷な現場を渡り歩き生き残ることでしか、良いプログラマになる方法は無いと言った考え方もある。僕の個人的な経験則からすると、この理屈はある程度合っていると思う反面で、合っていて欲しくないという気持ちは強い。</p>
<p>高い技術力をもつプログラマの全てがデスマ職人という訳ではない。</p>
<p>デスマーチに巻き込まれたと気が付いた時の妥当で基本的な戦術は撤退戦だ。何か理由をつけて逃げ出すのが望ましい。つまり、休職なり退職なり、異動なりして、その職場から離れるのが望ましい、出社拒否も良い。しかしながら、何か様々な理由があって、そこから逃げ出せないことはあるだろう。</p>
<p>僕はもう長い事デスマーチに関わることなく生きられているが、徐々に忘れつつあるので、若いころに獲得したデスマーチを生き残る方法論について記録しておく。</p>
<p>最初に断っておくが、これから経験則に基づく医学的根拠のない知見を披露する。あなたが、それに基づいて行動した結果について僕は一切の責任を負わない。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="デスマーチとは何か">デスマーチとは何か<a href="https://blog.satotaichi.info/death-march_survival-guide/#%E3%83%87%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%81%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B" class="hash-link" aria-label="デスマーチとは何か への直接リンク" title="デスマーチとは何か への直接リンク">​</a></h2>
<p>ソフトウェア開発におけるデスマーチとは、おおむね終わる見込みが無いのに、様々な思惑がかみ合うことで何故か資金が投入され続けるプロジェクトのことである。</p>
<p>資金を獲得する際には、比較的過酷な努力目標が設定されるため、そこで稼働する労働者に対して高負荷を与えることが多い。</p>
<p>本稿ではデスマーチ（以後、デスマ）を生き残る技術について説明したいので、デスマが何であるかについては<a href="http://www.roukitaisaku.com/taisaku/gendojikan.html" target="_blank" rel="noopener noreferrer">３６協定の限度時間</a>を参照しておく。基準が厳しすぎると感じるかもしれないが、<code>時間外労働をさせる場合の基準時間</code>に抵触するプロジェクト、つまり一ケ月で時間外労働が４５時間を超えるプロジェクトは全てデスマであると考えるべきだ。</p>
<p>あなたが若かったり、経験豊富であったり、プロジェクトの人間関係が良好であったりと、様々な副次的な要件が満たされることによって、そのようなプロジェクトにいるにも関わらず特に危険を感じていないかもしれないが、それは大変幸運なことだと考えるべきである。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="病院を確認する">病院を確認する<a href="https://blog.satotaichi.info/death-march_survival-guide/#%E7%97%85%E9%99%A2%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B" class="hash-link" aria-label="病院を確認する への直接リンク" title="病院を確認する への直接リンク">​</a></h2>
<p>デスマに巻き込まれたかもしれないと感じたら、あなたが最初にやるべきことは病院を確認することである。</p>
<p>勤務先と自宅のそれぞれから最も近い病院の住所と電話番号をスマホの電話帳に登録しよう。
最低限、内科があればいい。消化器科や脳神経外科がある病院があるならより望ましい。
自宅にいる際に倒れた状態からインターネットで病院を探すことはできないだろうが、スマホを操作して電話するくらいはできるかもしれない。その差が生死を分けることもある。</p>
<p>デスマにいる間に虫歯になることは多いので、歯医者も確認しよう。
半年以内に歯科検診を受けていないなら、とりあえず歯医者には行くべきだ。</p>
<p>腹痛や頭痛などの痛みや、睡眠障害を感じたら即座に病院へ行くことだ。薬局で買える鎮痛剤や睡眠導入剤を安易に使ってはいけない。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="栄養ドリンクの飲み方">栄養ドリンクの飲み方<a href="https://blog.satotaichi.info/death-march_survival-guide/#%E6%A0%84%E9%A4%8A%E3%83%89%E3%83%AA%E3%83%B3%E3%82%AF%E3%81%AE%E9%A3%B2%E3%81%BF%E6%96%B9" class="hash-link" aria-label="栄養ドリンクの飲み方 への直接リンク" title="栄養ドリンクの飲み方 への直接リンク">​</a></h2>
<p>最近はコンビニや薬局などに栄養ドリンクのようなものが大量に並んでいる。具体的な商品名は避けるが、羽が生えるだの、なんだのと色々書いてある。まず、こういうものを飲むのをやめよう。</p>
<p>人間はおおむね、砂糖とカフェインを一定量以上摂取するとテンションが上がるように出来ている。
よく分からないが効きそうな薬品名が書いてあるかもしれないが、コンビニで買えるようなものはおおむね砂糖とカフェインが大量に入っているので、元気になると考えるべきだ。</p>
<p>まず、覚えておいて欲しいのだが、人間は体内の水分が３パーセント程度失われるだけで眠くなる。つまり、軽度な眠気への対応策としては水を飲むべきだ。いきなりコーヒーだのお茶だのカフェインが入ったものを飲まない方が良い。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="ポカリスエット">ポカリスエット<a href="https://blog.satotaichi.info/death-march_survival-guide/#%E3%83%9D%E3%82%AB%E3%83%AA%E3%82%B9%E3%82%A8%E3%83%83%E3%83%88" class="hash-link" aria-label="ポカリスエット への直接リンク" title="ポカリスエット への直接リンク">​</a></h3>
<p>テンションを上げられる砂糖が多く含まれており、水分を簡単に補給できて簡単に手に入る飲み物がある。</p>
<p>ポカリスエットだ。栄養ドリンクの類を飲み始める前に、まずはポカリスエットを飲んで欲しい。これで足りなくなってきたと感じたら、次の段階だ。</p>
<a target="_blank" href="https://www.amazon.co.jp/gp/product/B000K82WFI/ref=as_li_tl?ie=UTF8&amp;camp=247&amp;creative=1211&amp;creativeASIN=B000K82WFI&amp;linkCode=as2&amp;tag=des-22&amp;linkId=3e67ca2899dd797336a50053cd6a1526"><img border="0" src="https://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;MarketPlace=JP&amp;ASIN=B000K82WFI&amp;ServiceVersion=20070822&amp;ID=AsinImage&amp;WS=1&amp;Format=_SL250_&amp;tag=des-22"></a>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="ヘルシア緑茶">ヘルシア緑茶<a href="https://blog.satotaichi.info/death-march_survival-guide/#%E3%83%98%E3%83%AB%E3%82%B7%E3%82%A2%E7%B7%91%E8%8C%B6" class="hash-link" aria-label="ヘルシア緑茶 への直接リンク" title="ヘルシア緑茶 への直接リンク">​</a></h3>
<p>砂糖の次はカフェインだ。カフェインが大量に含まれており砂糖が余り含まれていない飲み物がある。</p>
<p>ヘルシア緑茶だ。ポカリスエットで水分と砂糖を取って足りないようならカフェインを追加する。
気を付けて欲しいのは、カフェインは刺激物なので胃にくる。一時期、眠くならないからと言ってヘルシア緑茶をデカいボトルで毎日ガブ飲みしていたことがあるが、結果的に胃に穴が開いて苦しむことになった。</p>
<a target="_blank" href="https://www.amazon.co.jp/gp/product/B01H0CVJY6/ref=as_li_tl?ie=UTF8&amp;camp=247&amp;creative=1211&amp;creativeASIN=B01H0CVJY6&amp;linkCode=as2&amp;tag=des-22&amp;linkId=c0856aa4a811ad08462b6cb1712bf0e2"><img border="0" src="https://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;MarketPlace=JP&amp;ASIN=B01H0CVJY6&amp;ServiceVersion=20070822&amp;ID=AsinImage&amp;WS=1&amp;Format=_SL250_&amp;tag=des-22"></a>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="リポビタン-d">リポビタン D<a href="https://blog.satotaichi.info/death-march_survival-guide/#%E3%83%AA%E3%83%9D%E3%83%93%E3%82%BF%E3%83%B3-d" class="hash-link" aria-label="リポビタン D への直接リンク" title="リポビタン D への直接リンク">​</a></h3>
<p>ポカリとヘルシアをがぶ飲みする生活に慣れてきただろうか。しかし、プロジェクトは終わらず相変わらず負荷は高いままだ。そうなったとき、初めて値段が安い栄養ドリンクに手を出そう。
茶色のガラス瓶に入ってないようなのは、基本的に光で分解するようなナイーブなものは含まれてないので、全部雰囲気ドリンクである。</p>
<p>効果が高いとは言えないが、それなりにまともで値段が安い栄養ドリンクの代表例がリポビタン D だ。</p>
<a target="_blank" href="https://www.amazon.co.jp/gp/product/B000GE51RW/ref=as_li_tl?ie=UTF8&amp;camp=247&amp;creative=1211&amp;creativeASIN=B000GE51RW&amp;linkCode=as2&amp;tag=des-22&amp;linkId=6ad2a1ec2f021f16e27a024f56beef87"><img border="0" src="https://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;MarketPlace=JP&amp;ASIN=B000GE51RW&amp;ServiceVersion=20070822&amp;ID=AsinImage&amp;WS=1&amp;Format=_SL250_&amp;tag=des-22"></a>
<p>シリーズには色々あるが、最初は兎に角安価なものを買うこと。気合いを入れて高価なものをいきなり買うのは避けるべきだ。体が不足を感じるまでは、ドリンクの価格を上げるべきではない。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="ユンケル黄帝液">ユンケル黄帝液<a href="https://blog.satotaichi.info/death-march_survival-guide/#%E3%83%A6%E3%83%B3%E3%82%B1%E3%83%AB%E9%BB%84%E5%B8%9D%E6%B6%B2" class="hash-link" aria-label="ユンケル黄帝液 への直接リンク" title="ユンケル黄帝液 への直接リンク">​</a></h3>
<p>空いたリポ D がディスプレイの下辺りにズラっと並ぶ姿がアタリマエみたいな雰囲気の生活になってきた頃には、もう効かなくなっているだろう。恐らく一日に何本もリポ D を飲んでいる筈だ。</p>
<p>そうなってしまったら、次のドリンクに手を出すしかない。次は、ユンケル黄帝液だ。</p>
<p>薬局で一際輝くパッケージに入っており、様々な商品がある上に、結構値段の高いアレがユンケル黄帝液だ。</p>
<a target="_blank" href="https://www.amazon.co.jp/gp/product/B001T69HWQ/ref=as_li_tl?ie=UTF8&amp;camp=247&amp;creative=1211&amp;creativeASIN=B001T69HWQ&amp;linkCode=as2&amp;tag=des-22&amp;linkId=4bc77806907b0babfce6bae4b075b7eb"><img border="0" src="https://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;MarketPlace=JP&amp;ASIN=B001T69HWQ&amp;ServiceVersion=20070822&amp;ID=AsinImage&amp;WS=1&amp;Format=_SL250_&amp;tag=des-22"></a>
<p>これも、飲み方はリポ D と同じだ。とにかく安いやつから飲んでいくべきだ。いきなり高価なものに手を出すと、効きすぎて鼻血を大量出血することになる。デスマでは粘膜が弱くなるので、強い栄養ドリンクをいきなり飲むと、その効果を出血によって失うことになる。そういうことは望ましくない。</p>
<p>まぁ、栄養ドリンクをガブ飲みしながら働いている状況が、そもそも望ましくないのは言うまでもないが。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="栄養ドリンクと睡眠の関係">栄養ドリンクと睡眠の関係<a href="https://blog.satotaichi.info/death-march_survival-guide/#%E6%A0%84%E9%A4%8A%E3%83%89%E3%83%AA%E3%83%B3%E3%82%AF%E3%81%A8%E7%9D%A1%E7%9C%A0%E3%81%AE%E9%96%A2%E4%BF%82" class="hash-link" aria-label="栄養ドリンクと睡眠の関係 への直接リンク" title="栄養ドリンクと睡眠の関係 への直接リンク">​</a></h3>
<p>きちんと睡眠するには、体力を少々残しておかなければならない。老人が早起きなのは体力が無いので寝続けられないのではないかと思う。</p>
<p>プロジェクトが佳境を迎え、うっかり３０時間とか長時間にわたって稼働した結果、疲労の蓄積がピークを迎えると、疲れすぎて眠れなくなる。３時間睡眠を何週間も続けていても同様だ。</p>
<p>重要なことなので繰り返しておく、人間は疲れすぎると眠れなくなる。</p>
<p>栄養ドリンクを飲んで体力を一時的に回復すると、急激な眠気に襲われる可能性がある。理想を言えば、眠いなら寝てしまった方が良いのだが、そうも言ってられない状況だってあるだろう。</p>
<p>自分の疲労がピークを越えており、うっかり間違って１６時間とか眠ってしまうことを避けたいなら、栄養ドリンクのランクを下げることを考慮にいれよう。起きて働き続けられる程度にのみ回復するのだ。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="睡眠について">睡眠について<a href="https://blog.satotaichi.info/death-march_survival-guide/#%E7%9D%A1%E7%9C%A0%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6" class="hash-link" aria-label="睡眠について への直接リンク" title="睡眠について への直接リンク">​</a></h2>
<p>長期間に渡るデスマを生き残るには、睡眠の技術は欠かせない。</p>
<p>ショートスリーパーを自称し２時間や３時間程度の睡眠でも十分に活動できる等と強がるものを沢山見てきたが、そういう人間はあっという間に様子がおかしくなる。
本人が単におかしくなって退場するだけなら良いが、睡眠不足でおかしな事になっている人間がプロジェクトの中に居座ると、周りの人間に悪影響を及ぼす。</p>
<p>睡眠不足な人間は言動や行動が極端になるので、極限状態では発言力を行使し易いのだ。そうやって行使された様々なことは、当然ながらプロジェクトに悪い影響を与える。</p>
<p>そうならないよう、毎日最低でも６時間程度の睡眠時間を確保しよう。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="椅子寝">椅子寝<a href="https://blog.satotaichi.info/death-march_survival-guide/#%E6%A4%85%E5%AD%90%E5%AF%9D" class="hash-link" aria-label="椅子寝 への直接リンク" title="椅子寝 への直接リンク">​</a></h3>
<p>デスマと言えば椅子寝だ。何故、椅子で寝るのだろうか？</p>
<p>まず、床で寝るのは不衛生だからだ。外の道路や、トイレの中を歩き回った靴で踏みしめた床が衛生的である筈がない。次に、床は固いので上手く眠れないからだ。カーペットが敷いてあったところで、それは変わらない。最後に、地面で寝ると体が冷えすぎるからだ。体が冷えると眠れないだけでなく、風邪をひきやすくなる。</p>
<p>長時間の稼働では、免疫力が低下するので風邪をひきやすくなる。プロジェクトルーム内で風邪などの感染症を引き起こした人間が発生すると、連鎖的に人が倒れる。
忙しいからデスマなのに、病人が大量発生すれば状況は当然悪化するだろう。</p>
<p>椅子を並べて寝る際に気を付けるのは、背中の関節、特に腰に無理がかからない状態を探そう。
椅子寝をするなら、体を変な風に固定したりするのはやめよう。非常に危ない。背面部分に足を通したりすると、寝返りをうってしまった時に、上手く床に落ちられず大けがをすることになる。</p>
<p>寝る際には全身が床とおおむね平行になるようにすること。机の上に突っ伏して寝ていいのは１５分までだ。
それ以上は、疲れが取れたりはしないし、腰や肩に強い負担がかかるので望ましくない。</p>
<p>加えて、靴や靴下はちゃんと脱いで寝た方が疲れがとれる。足を圧迫しないほうがいい。</p>
<p>最後に、足首の高さは心臓よりも高くなるように調整しよう。漫画の雑誌などを３冊程度積むとよい。
下半身の血液が寝ている間に上手く循環すると疲れが取れやすい。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="床寝">床寝<a href="https://blog.satotaichi.info/death-march_survival-guide/#%E5%BA%8A%E5%AF%9D" class="hash-link" aria-label="床寝 への直接リンク" title="床寝 への直接リンク">​</a></h3>
<p>既に説明したが、床で寝るのは基本的に望ましくない。</p>
<p>しかし、寝やすいソファや椅子がないこともあるだろう。そうした場合、どうしても床で寝ざるをえないことはある。</p>
<p>床で寝るのならまずは、コンビニで段ボール箱をもらってこよう。サーバが梱包されていた段ボール箱でもいい。
畳一畳程度の空間に潰した段ボール箱を並べ、その上で寝る事だ。厚みが５ cm 程度になるのが望ましい。薄い段ボールなら、３～４枚重ねる必要があるかもしれない。
段ボール箱は、紙の中に空気の層があるので、体が冷えづらいし、床で直接寝るよりは衛生的にマシだ。</p>
<p>段ボール箱を敷いたうえで寝袋を使うなら、より良いだろう。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="体の衛生状態を確保しよう">体の衛生状態を確保しよう<a href="https://blog.satotaichi.info/death-march_survival-guide/#%E4%BD%93%E3%81%AE%E8%A1%9B%E7%94%9F%E7%8A%B6%E6%85%8B%E3%82%92%E7%A2%BA%E4%BF%9D%E3%81%97%E3%82%88%E3%81%86" class="hash-link" aria-label="体の衛生状態を確保しよう への直接リンク" title="体の衛生状態を確保しよう への直接リンク">​</a></h2>
<p>ここまでは、家に帰らないことを前提に話をしてきたが、家に帰れるなら出来る限り帰ったほうが良い。</p>
<p>家に帰れるなら忘れずにやって欲しいことがある。</p>
<p>疲れていると家にたどり着くなり、布団に入って寝てしまいたいと思うだろうが、睡眠による回復の効率を最大化するなら、就寝前に歯を磨いて風呂に入るべきだ。</p>
<p>たった３分歯を磨き、３０分風呂に入るだけでいい。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="歯を磨く">歯を磨く<a href="https://blog.satotaichi.info/death-march_survival-guide/#%E6%AD%AF%E3%82%92%E7%A3%A8%E3%81%8F" class="hash-link" aria-label="歯を磨く への直接リンク" title="歯を磨く への直接リンク">​</a></h3>
<p>口腔内の衛生状態が悪化すると、風邪をひきやすくなるので、毎日歯を磨こう。</p>
<p>栄養ドリンクの類は、大体が酷い匂いがするので、それに慣れてしまわないためにもきちんと歯を磨くことは大切だ。</p>
<p>デスマで虫歯になったとしても、会社がそれを補填することは無いだろう。永久歯は虫歯になってしまえば、容易に失われるし、その治療費は高くつく。</p>
<p>普通の歯ブラシで磨いても良いが、疲れていると時間間隔がいい加減になるので、電動歯ブラシを使う方が良い。</p>
<p>僕のおススメ歯ブラシは、フィリップスのソニッケアーだ。</p>
<a target="_blank" href="https://www.amazon.co.jp/gp/product/B014A4QDEI/ref=as_li_tl?ie=UTF8&amp;camp=247&amp;creative=1211&amp;creativeASIN=B014A4QDEI&amp;linkCode=as2&amp;tag=des-22&amp;linkId=2964d0e99790543f4dc47ea4c10bf620"><img border="0" src="https://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;MarketPlace=JP&amp;ASIN=B014A4QDEI&amp;ServiceVersion=20070822&amp;ID=AsinImage&amp;WS=1&amp;Format=_SL250_&amp;tag=des-22"></a>
<p>歯間ブラシとしては、ジェットウォッシャードルツを愛用している。</p>
<a target="_blank" href="https://www.amazon.co.jp/gp/product/B00MFBGH3Q/ref=as_li_tl?ie=UTF8&amp;camp=247&amp;creative=1211&amp;creativeASIN=B00MFBGH3Q&amp;linkCode=as2&amp;tag=des-22&amp;linkId=76ce401ac86edd9df85b84636fac4e56"><img border="0" src="https://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;MarketPlace=JP&amp;ASIN=B00MFBGH3Q&amp;ServiceVersion=20070822&amp;ID=AsinImage&amp;WS=1&amp;Format=_SL250_&amp;tag=des-22"></a>
<p>歯磨き粉は、刺激が少なく味が余りないものが好みなので、チェックアップスタンダードを使っている。</p>
<a target="_blank" href="https://www.amazon.co.jp/gp/product/B0091FM076/ref=as_li_tl?ie=UTF8&amp;camp=247&amp;creative=1211&amp;creativeASIN=B0091FM076&amp;linkCode=as2&amp;tag=des-22&amp;linkId=b688aede6551a0651c7cb0e7298e45df"><img border="0" src="https://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;MarketPlace=JP&amp;ASIN=B0091FM076&amp;ServiceVersion=20070822&amp;ID=AsinImage&amp;WS=1&amp;Format=_SL250_&amp;tag=des-22"></a>
<p>歯磨きが終わった後は、コンクール F で仕上げのうがいをする。</p>
<a target="_blank" href="https://www.amazon.co.jp/gp/product/B002R5EVHY/ref=as_li_tl?ie=UTF8&amp;camp=247&amp;creative=1211&amp;creativeASIN=B002R5EVHY&amp;linkCode=as2&amp;tag=des-22&amp;linkId=83c29c791b0ea849d37b03a6823778eb"><img border="0" src="https://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;MarketPlace=JP&amp;ASIN=B002R5EVHY&amp;ServiceVersion=20070822&amp;ID=AsinImage&amp;WS=1&amp;Format=_SL250_&amp;tag=des-22"></a>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="風呂に入る">風呂に入る<a href="https://blog.satotaichi.info/death-march_survival-guide/#%E9%A2%A8%E5%91%82%E3%81%AB%E5%85%A5%E3%82%8B" class="hash-link" aria-label="風呂に入る への直接リンク" title="風呂に入る への直接リンク">​</a></h3>
<p>風呂に入るのは体や頭を洗うためだが、シャワーを浴びるだけでなく、しっかりと湯船に浸かるのが望ましい。</p>
<p>人間は体温が下がり始める時に、眠り易くなる。湯船に使って一時的に体温を上げると、簡単にその状況を作り出せる。</p>
<p>そして、就寝前に風呂に入るのは、スマホや液晶モニタの光から自分の目を遠ざけるという目的もある。強い光を見た直後に上手く眠るのは難しいので、風呂にはいることでそのインターバルを確保するのだ。
つまり、風呂上りにソシャゲをやったりメールをチェックしてはいけない。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="自宅の掃除をする">自宅の掃除をする<a href="https://blog.satotaichi.info/death-march_survival-guide/#%E8%87%AA%E5%AE%85%E3%81%AE%E6%8E%83%E9%99%A4%E3%82%92%E3%81%99%E3%82%8B" class="hash-link" aria-label="自宅の掃除をする への直接リンク" title="自宅の掃除をする への直接リンク">​</a></h2>
<p>デスマの最中だとしても、１週間から一度、悪くても１か月に一度くらいは丸１日ないし２日休める日ができるだろう。</p>
<p>まずは、十分な睡眠を確保すべきだが、人間は熊などの冬眠できる哺乳類と違って寝溜めすることはできない。起きたらインターネットやテレビを見て時間を溶かすのではなく、掃除をしよう。</p>
<p>具体的には、水回りの掃除をすべきだ。水回りとは、トイレ、風呂、キッチンのことだ。</p>
<p>特にトイレと風呂は汚れやすいので、休みの日に掃除をする。これは、肉体的な意味での衛生状態を確保すると共に精神的な意味での衛生状態を確保する意味もある。</p>
<p>疲れ切って帰ってきた家のトイレが汚いと、メンタルは確実にすり減るからだ。少しくらい汚れていても平気な人間がいることは否定しないが、精神状態がおかしくなった人間の家の水回りは確実に不衛生だ。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="まとめ">まとめ<a href="https://blog.satotaichi.info/death-march_survival-guide/#%E3%81%BE%E3%81%A8%E3%82%81" class="hash-link" aria-label="まとめ への直接リンク" title="まとめ への直接リンク">​</a></h2>
<p>デスマーチを生き残るには、何にせよ肉体と精神の健康を維持することが肝要だ。</p>
<p>このような知識を使うことなく一生をまっとうできることが望ましいが、そうでないことはあるだろう。</p>
<p>どんな場所でも、ほんのちょっとしたボタンの掛け違いでデスマーチは突如として現れる。</p>
<p>読者の皆様が、そのような状況になっても正気を保ったまま、そこから逃げ出せることを祈っている。</p>]]></content>
        <author>
            <name>Sato Taichi</name>
            <uri>https://github.com/taichi</uri>
        </author>
        <category label="life" term="life"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[ScoopでWindowsにおける開発環境構築を最適化しよう]]></title>
        <id>https://blog.satotaichi.info/scoop/</id>
        <link href="https://blog.satotaichi.info/scoop/"/>
        <updated>2017-09-13T12:42:12.000Z</updated>
        <summary type="html"><![CDATA[はじめに]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="はじめに">はじめに<a href="https://blog.satotaichi.info/scoop/#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB" class="hash-link" aria-label="はじめに への直接リンク" title="はじめに への直接リンク">​</a></h2>
<p>Windows には他の OS には無い致命的な問題が一つあった。そう、OS 標準のパッケージマネージャが無いことだ。</p>
<p>Windows10 では<a href="https://docs.microsoft.com/en-us/powershell/module/packagemanagement/?view=powershell-1" target="_blank" rel="noopener noreferrer">PackageManagement</a>という大変素晴らしい OS 標準のパッケージマネージャが搭載された。</p>
<p>これでコマンドラインだけで開発環境をガンガン作れるに違いない。そう考える人がいてもおかしくはない。正直、僕だってそう思いたい。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="packagemanagement-の問題点">PackageManagement の問題点<a href="https://blog.satotaichi.info/scoop/#packagemanagement-%E3%81%AE%E5%95%8F%E9%A1%8C%E7%82%B9" class="hash-link" aria-label="PackageManagement の問題点 への直接リンク" title="PackageManagement の問題点 への直接リンク">​</a></h2>
<p>僕は PackageManagement のアーキテクチャが難しすぎる事は大きな問題だと考えている。このエントリを是非読んで欲しい。</p>
<ul>
<li><a href="https://blogs.technet.microsoft.com/packagemanagement/2015/04/28/introducing-packagemanagement-in-windows-10/" target="_blank" rel="noopener noreferrer">Introducing PackageManagement in Windows 10</a></li>
</ul>
<p>もうね、何でこんなに大変なことになってるのかと。</p>
<p>いや、歴史的経緯を鑑みつつ、OS に標準搭載されるパッケージマネージャが持つべき仕組みをキチンと備えた妥当な設計になっているじゃないか、と強い調子で言われれば説得力があるようにも思える。</p>
<p>じゃあ、この素晴らしい抽象度で実装された PackageManagement 様におかれましては、それはそれは様々なバリエーションの動作をするんですよね？というと、実態はそうじゃない。</p>
<p>現在の PackageManagement は、雑に言えば<a href="https://chocolatey.org/" target="_blank" rel="noopener noreferrer">Chocolatey</a>の何かややこしいラッパーでしかない。確かに、<a href="https://www.powershellgallery.com/" target="_blank" rel="noopener noreferrer">PowerShell Gallery</a>には、沢山のモジュールがあるよ。あれ、便利なモジュールどんだけあんの？</p>
<p>僕としては、直接 Chocolatey 使えば良いと思うんだよね。ジッサイ。</p>
<p>「OS に標準搭載されたボキャブラリでアプリケーションをインストールし、アンインストールできることは大変すばらしい事だ！」</p>
<p>アア、ハイ、ソノトオリデスネ。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="chocolatey-の問題点">Chocolatey の問題点<a href="https://blog.satotaichi.info/scoop/#chocolatey-%E3%81%AE%E5%95%8F%E9%A1%8C%E7%82%B9" class="hash-link" aria-label="Chocolatey の問題点 への直接リンク" title="Chocolatey の問題点 への直接リンク">​</a></h2>
<p>Chocolatey 使ってて、まずダルいなって思うのは、UAC のポップアップ。コマンドラインで作業してるのに突然現れてマウスでクリックしないと先にすすめなくなるアレ。マジでイライラする。</p>
<p>Windows10 はマルチユーザ OS だけど、ユーザの切り替えなんてやってねぇよ。というか、複数の環境が必要なら Docker なり、Hyper-V なり使ってる。だからね、現在のユーザローカルにだけコマンドのパスが通れば良いんだよ。</p>
<p>次にダルいなって思うのは、結構な頻度でアンインストールが失敗すること。インストールが綺麗にできる以上に、大事なのはアンインストールが綺麗にできることだ。</p>
<p>いやいや、MSI 形式のインストーラの問題だろ、それって言われれば、確かにちゃんと切り分けてないから、これは言いがかりかもしれないけどね。</p>
<p>ある程度の規模感で Chocolatey 使おうと思うと、ローカルリポジトリ的なものが欲しくなると思うんだけど、それを用意するのがとんでもなく面倒なのも辛い。確かに、<a href="https://github.com/chocolatey/choco/wiki/How-To-Host-Feed" target="_blank" rel="noopener noreferrer">How To Host Feed</a>辺りをちゃんと読めば出来るよ。</p>
<p>面倒すぎるんで、僕としてはあんまやりたくない感じの手順だけどね。</p>
<p>というわけで、僕の個人的な趣向としては Chocolatey が嫌いだ。避けようが無くて使う事があるのは否定しないが、出来る限り使いたくないとさえ思っている。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="scoop-について">Scoop について<a href="https://blog.satotaichi.info/scoop/#scoop-%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6" class="hash-link" aria-label="Scoop について への直接リンク" title="Scoop について への直接リンク">​</a></h2>
<p>というわけで、今週のおススメは<a href="http://scoop.sh/" target="_blank" rel="noopener noreferrer">Scoop</a>だ。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="scoop-を使うべきか">Scoop を使うべきか？<a href="https://blog.satotaichi.info/scoop/#scoop-%E3%82%92%E4%BD%BF%E3%81%86%E3%81%B9%E3%81%8D%E3%81%8B" class="hash-link" aria-label="Scoop を使うべきか？ への直接リンク" title="Scoop を使うべきか？ への直接リンク">​</a></h3>
<p>まず、最初に言っておく。Scoop は真っ当なパッケージマネージャではない。そして、linux 文化圏にいるけど、色々理由があって今は Windows を使ってるって人間に向けて開発されている。</p>
<p>Scoop がどういう思想で作られているかみたいな話は、公式の Wiki に書いてある。</p>
<ul>
<li><a href="https://github.com/lukesampson/scoop/wiki/So-What%3F" target="_blank" rel="noopener noreferrer">So What?</a></li>
</ul>
<p>これを読めば、自分が Scoop を使うべきなのかは、ある程度ハッキリと理解できるだろう。</p>
<p>Windows しか使わないし、linux 文化圏のやり方を Windows 上でやることに意義を感じないなら、Scoop を使う必要はない。</p>
<p>そして、Scoop は開発環境を構築するためのツールだ。開発環境構築を楽にすることに強くフォーカスしているおかげで、色んなことがシンプルで簡単になっている。細かいことは、あまり考慮していない。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="scoop-の何が素晴らしいか">Scoop の何が素晴らしいか<a href="https://blog.satotaichi.info/scoop/#scoop-%E3%81%AE%E4%BD%95%E3%81%8C%E7%B4%A0%E6%99%B4%E3%82%89%E3%81%97%E3%81%84%E3%81%8B" class="hash-link" aria-label="Scoop の何が素晴らしいか への直接リンク" title="Scoop の何が素晴らしいか への直接リンク">​</a></h3>
<p>ユーザのローカルディレクトリに何でもインストールするので、あのうざったい UAC ポップアップが出ない。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">C:\Users\taichi\scoop\shims</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>みたいなディレクトリにコマンドをガンガン投げ込むスタイルだ。Scoop をインストールした時にこのディレクトリが PATH に追加される。</p>
<p>次に、ローカルディレクトリにファイルを展開していくスタイルなので、アンインストールが安定して動作する。特に難しい事をやってないので、それほど失敗する余地が無いってことなんだろう。</p>
<p>そして、Scoop でインストール可能なアプリケーションのメタデータは git リポジトリで管理している。だから、Scoop 標準のメタデータストア内に、欲しいものが無いなら比較的簡単に<a href="https://github.com/lukesampson/scoop/wiki/Buckets" target="_blank" rel="noopener noreferrer">オレオレ Scoop リポジトリ</a>を作れる。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="scoop-のダメなところ">Scoop のダメなところ<a href="https://blog.satotaichi.info/scoop/#scoop-%E3%81%AE%E3%83%80%E3%83%A1%E3%81%AA%E3%81%A8%E3%81%93%E3%82%8D" class="hash-link" aria-label="Scoop のダメなところ への直接リンク" title="Scoop のダメなところ への直接リンク">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="windows-インストーラ文脈にのっていないこと">Windows インストーラ文脈にのっていないこと<a href="https://blog.satotaichi.info/scoop/#windows-%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%A9%E6%96%87%E8%84%88%E3%81%AB%E3%81%AE%E3%81%A3%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E3%81%93%E3%81%A8" class="hash-link" aria-label="Windows インストーラ文脈にのっていないこと への直接リンク" title="Windows インストーラ文脈にのっていないこと への直接リンク">​</a></h4>
<p>一番ダメなところであり、素晴らしいところは、Windows のインストーラに関する文脈に全く乗っていないところだ。つまり、Scoop を使ってインストールしたアプリケーションは、Windows 標準の<code>アプリと機能</code>から参照できない。ただし、これは<code>main</code>バケットからインストールしたものに限る。</p>
<p><code>main</code>バケットは、scoop がデフォルトで参照するアプリケーションリポジトリで、<code>extras</code>バケットは、追加のコマンドを実行することで参照できるリポジトリだ。</p>
<p>中身をきちんと確認していないが<code>php</code>というバケットもある。流石の PHP だ。最近は、<code>java</code>というバケットもあり、その中に oraclejdk と openjdk の両方が入っている。</p>
<p><code>extras</code>バケットには、exe や msi といった Windows のインストーラに関する文脈に乗っているものが含まれている。例えば、oraclejdk をインストールするなら、あの忌々しい UAC ポップアップが普通にポロリーンだ。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="最新版しか使えないこと">最新版しか使えないこと<a href="https://blog.satotaichi.info/scoop/#%E6%9C%80%E6%96%B0%E7%89%88%E3%81%97%E3%81%8B%E4%BD%BF%E3%81%88%E3%81%AA%E3%81%84%E3%81%93%E3%81%A8" class="hash-link" aria-label="最新版しか使えないこと への直接リンク" title="最新版しか使えないこと への直接リンク">​</a></h4>
<p>アプリケーションは基本的に最新版しか使えないし、細かくリビジョンを切り替えることは出来ない。みんなが大好きな pyenv だの nvm だのといった仕組みとは違うってことだ。</p>
<p>Scoop ではメジャーバージョンが違うものは、違うアプリケーションとして管理している。例えば、</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">scoop install ruby</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>とすると、今なら 2.4.1-2 が入るし</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">scoop install ruby19</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>とすれば、今なら 1.9.3-p551 が入る。</p>
<p>両方入れた時に、<code>ruby</code>コマンドで実行されるバイナリを切り替えるには、 <code>scoop reset</code>というサブコマンドが用意されているので、それを使って切り替えればいい。詳細は公式マニュアルを見て欲しい。</p>
<ul>
<li><a href="https://github.com/lukesampson/scoop/wiki/Switching-Ruby-And-Python-Versions" target="_blank" rel="noopener noreferrer">Switching Ruby and Python Versions</a></li>
</ul>
<p>細かいバージョンの差異に伴う再現テストなんて、ローカルでやらずに CI サーバでマトリックステストすれば良くない？僕としては、そういう気持ちです。</p>
<p>ちなみに、scoop を使えば、みんなが大好きな anaconda もコマンド一発でインストールできるよ。僕は使わんけど。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="さぁscoop-を使おう">さぁ、Scoop を使おう<a href="https://blog.satotaichi.info/scoop/#%E3%81%95%E3%81%81scoop-%E3%82%92%E4%BD%BF%E3%81%8A%E3%81%86" class="hash-link" aria-label="さぁ、Scoop を使おう への直接リンク" title="さぁ、Scoop を使おう への直接リンク">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="scoop-のインストール">Scoop のインストール<a href="https://blog.satotaichi.info/scoop/#scoop-%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB" class="hash-link" aria-label="Scoop のインストール への直接リンク" title="Scoop のインストール への直接リンク">​</a></h3>
<p>こんな所まで長文を読んだって事は、Scoop を使おうって気になったってことだろうから、Scoop をインストールしてみよう。</p>
<p>Powershell3 以上の環境で、こういうコマンドを実行する。Chocolatey のインストールと大体一緒だよね。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">iex (new-object net.webclient).downloadstring('https://get.scoop.sh')</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>エラーが出てインストールできないなら、こういうコマンドで、ExecutionPolicy を少し緩めて欲しい。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Set-ExecutionPolicy RemoteSigned -scope CurrentUser</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>これで、<code>scoop</code> コマンドが実行できるようになった。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="scoop-でアプリケーションをインストール">Scoop でアプリケーションをインストール<a href="https://blog.satotaichi.info/scoop/#scoop-%E3%81%A7%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB" class="hash-link" aria-label="Scoop でアプリケーションをインストール への直接リンク" title="Scoop でアプリケーションをインストール への直接リンク">​</a></h3>
<p>じゃあ、試しに node でもインストールしてみようか。その前に、Scoop のバケットを検索してみよう。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">scoop search node</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>今の時点では、こういう感じの出力がなされる。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">'main' bucket:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    eventstore (4.0.2) --&gt; includes 'EventStore.ClusterNode.exe'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    nodejs-lts (6.11.3)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    nodejs (8.5.0)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    sliksvn (1.9.7) --&gt; includes 'svn-populate-node-origins-index.exe'</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>あなたは最新の node をガンガン使って行く Node ジャンキーだろうか？それとも、しっかりと動作する LTS 版を好むタイプだろうか？</p>
<p>僕は、もちろん Node ジャンキーなので、最新版の nodejs を使いたい。こういうコマンドを入力しよう。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">scoop install nodejs</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>こういう感じの出力がなされて、最新版の nodejs がインストールされた。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Installing 'nodejs' (8.5.0).</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">node-v8.5.0-win-x64.7z (8.7 MB) [=============================================================================] 100%</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Checking hash of node-v8.5.0-win-x64.7z... ok.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Extracting... done.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Linking ~\scoop\apps\nodejs\current =&gt; ~\scoop\apps\nodejs\8.5.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Persisting bin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Persisting cache</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Running post-install script...</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">'nodejs' (8.5.0) was installed successfully!</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>素晴らしい。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="scoop-でアプリケーションをアンインストール">Scoop でアプリケーションをアンインストール<a href="https://blog.satotaichi.info/scoop/#scoop-%E3%81%A7%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E3%82%A2%E3%83%B3%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB" class="hash-link" aria-label="Scoop でアプリケーションをアンインストール への直接リンク" title="Scoop でアプリケーションをアンインストール への直接リンク">​</a></h3>
<p>次は、アンインストールだ。今入れたばかりのアプリケーションを何でアンインストールするのかって？</p>
<p>それは、僕がインストールジャンキーだから、というのは冗談で単に説明のためだ。</p>
<p>予想できると思うけど、こういうコマンドでアンインストールできる。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">scoop uninstall nodejs</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>こういう感じの出力がなされて、さっきインストールしたばかりの nodejs がきれいさっぱりいなくなった。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Uninstalling 'nodejs' (8.4.0).</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Unlinking ~\scoop\apps\nodejs\current</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Removing ~\scoop\apps\nodejs\current from your path.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Removing ~\scoop\apps\nodejs\current\bin from your path.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">'nodejs' was uninstalled.</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>キマるぜぇ！！</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="scoop-で複数バージョンをインストールしたい">Scoop で複数バージョンをインストールしたい<a href="https://blog.satotaichi.info/scoop/#scoop-%E3%81%A7%E8%A4%87%E6%95%B0%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%9F%E3%81%84" class="hash-link" aria-label="Scoop で複数バージョンをインストールしたい への直接リンク" title="Scoop で複数バージョンをインストールしたい への直接リンク">​</a></h3>
<p>どうしてもローカルに複数バージョンのアプリケーションをインストールしたいって呪われた性癖を持つ人はいると思う。</p>
<p>そういうあなたには、<code>versions</code>バケットというものが用意されている。こういうコマンドを実行すると、最新版ではないアプリケーションの情報を検索できるようになる。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">scoop bucket add versions</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>これで、もう一度 node を検索してみよう。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">scoop search node</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>ようこそ、バージョニング地獄へ。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">'main' bucket:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    eventstore (4.0.2) --&gt; includes 'EventStore.ClusterNode.exe'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    nodejs-lts (6.11.3)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    nodejs (8.5.0)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    sliksvn (1.9.7) --&gt; includes 'svn-populate-node-origins-index.exe'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">'versions' bucket:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    nodejs010 (0.10.48)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    nodejs012 (0.12.18)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    nodejs4 (4.8.4)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    nodejs6 (6.11.3)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    nodejs7 (7.10.1)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    nodejs8 (8.5.0)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>安心してくれ。どのメジャーバージョンでもコマンド一発で最新版が入れ放題だ！</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="もっと-scoop-を知りたい">もっと Scoop を知りたい！<a href="https://blog.satotaichi.info/scoop/#%E3%82%82%E3%81%A3%E3%81%A8-scoop-%E3%82%92%E7%9F%A5%E3%82%8A%E3%81%9F%E3%81%84" class="hash-link" aria-label="もっと Scoop を知りたい！ への直接リンク" title="もっと Scoop を知りたい！ への直接リンク">​</a></h3>
<p>公式の Wiki を見てほしい。すごく丁寧にドキュメントが書かれていて、知りたい事はなんでも分かるようになっている。</p>
<ul>
<li><a href="https://github.com/lukesampson/scoop/wiki" target="_blank" rel="noopener noreferrer">https://github.com/lukesampson/scoop/wiki</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="まとめ">まとめ<a href="https://blog.satotaichi.info/scoop/#%E3%81%BE%E3%81%A8%E3%82%81" class="hash-link" aria-label="まとめ への直接リンク" title="まとめ への直接リンク">​</a></h2>
<p>僕は、かなり Linux 文化に染まっているとは言え、GNU 信者ではないのでゲームができない Linux デスクトップを使ったりはしない。普通の Windows ユーザだ。</p>
<p>なので、Bash on Windows に喜んだりする一方で、ある程度は PowerShell を使って作業したい。</p>
<p>とはいえ、いくら設計に優れていても、ややこしいだけのものを我慢して使いたくはない。</p>
<p>こういう気持ちに同調してくれる Windows ユーザは多い筈だ。コマンドラインベースで、開発環境のセットアップを自動化したいが、どうもしっくりこないって人は多いんじゃないかな。</p>
<p>そういうあなたは、是非 Scoop を試してみて欲しい。</p>]]></content>
        <author>
            <name>Sato Taichi</name>
            <uri>https://github.com/taichi</uri>
        </author>
        <category label="Windows" term="Windows"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[初学者としてJavaScriptを学ぶ]]></title>
        <id>https://blog.satotaichi.info/learning_javascript_for_beginners/</id>
        <link href="https://blog.satotaichi.info/learning_javascript_for_beginners/"/>
        <updated>2017-03-26T16:54:33.000Z</updated>
        <summary type="html"><![CDATA[はじめに]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="はじめに">はじめに<a href="https://blog.satotaichi.info/learning_javascript_for_beginners/#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB" class="hash-link" aria-label="はじめに への直接リンク" title="はじめに への直接リンク">​</a></h2>
<p>僕が以前書いた<a href="https://blog.satotaichi.info/modern-javascript_201701/" target="_blank" rel="noopener noreferrer">Modern JavaScript 概観、そして Electron へ</a>は、読んで貰えただろうか？</p>
<p>あれは初学者には全く向いてないエントリだ。</p>
<p>あのエントリは、僕の理解したモダンな JavaScript 全体について概観することを目的としているからね。</p>
<p>あれを読んで、「今の JavaScript ってこんなに大変なのか…」と感じた人は多いだろう。</p>
<p>しかし、ある程度のソフトウェアを開発するために技術全般を概観しようとすれば、ああいう分量になるのは致し方ない。</p>
<p>と言う訳で、今回はちゃんと初心者向けのエントリを書いた。</p>
<p>少し多く感じるかもしれないが、丁寧に説明しようとしたからだと好意的に解釈して欲しい。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="開発環境">開発環境<a href="https://blog.satotaichi.info/learning_javascript_for_beginners/#%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83" class="hash-link" aria-label="開発環境 への直接リンク" title="開発環境 への直接リンク">​</a></h3>
<p>Thinkpad X1 Carbon 2016 年モデルに Windows10 をインストールしてある。</p>
<p>ハードウェアスペックは、こうだ。</p>
<ul>
<li>CPU i7 6600U @ 2.6GHz</li>
<li>メモリ 16GB</li>
<li>ストレージ SAMSUNG NVMe SSD 950 PRO 512GB</li>
</ul>
<p>少し高級かもしれないけど開発者用のマシンとしては普通だよね。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="node-をインストールしよう">Node をインストールしよう<a href="https://blog.satotaichi.info/learning_javascript_for_beginners/#node-%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%82%88%E3%81%86" class="hash-link" aria-label="Node をインストールしよう への直接リンク" title="Node をインストールしよう への直接リンク">​</a></h2>
<p>Windows に Node をインストールする方法は色々あるんだけど、<a href="http://scoop.sh/" target="_blank" rel="noopener noreferrer">scoop</a> を使ってほしい。</p>
<p>Scoop をインストールするには、以下のコマンドを Powershell で実行する。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Set-ExecutionPolicy RemoteSigned -scope CurrentUser</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">iex (new-object net.webclient).downloadstring('https://get.scoop.sh')</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>scoop のインストールが終わったら、以下のコマンドを入力する。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">scoop install nodejs</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>そうすると、細かいバージョンやディレクトリ名は違うかもしれないが、こういうメッセージが出力されるはずだ。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Installing 'nodejs' (8.5.0).</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">node-v8.5.0-win-x64.7z (8.7 MB) [=============================================================================] 100%</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Checking hash of node-v8.5.0-win-x64.7z... ok.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Extracting... done.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Linking ~\scoop\apps\nodejs\current =&gt; ~\scoop\apps\nodejs\8.5.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Persisting bin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Persisting cache</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Running post-install script...</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">'nodejs' (8.5.0) was installed successfully!</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>これで、最新版の Node がインストールされた。</p>
<p>バージョンアップする時は、Powershell で以下のようなコマンドを実行すればいい。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">scoop update nodejs</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピ�ー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Node はかなり頻繁に新しいバージョンがリリースされるから、定期的にアップデートして欲しい。</p>
<p>パフォーマンスが改善したり、細かい問題が解決されたりしているかもしれないからね。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="vs-code-をインストールする">VS Code をインストールする<a href="https://blog.satotaichi.info/learning_javascript_for_beginners/#vs-code-%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B" class="hash-link" aria-label="VS Code をインストールする への直接リンク" title="VS Code をインストールする への直接リンク">​</a></h2>
<p>Node のランタイムをインストールしたら次はエディタをインストールしよう。</p>
<p>世の中 JavaScript を快適に書けるエディタは色々あるけど、今は<a href="https://code.visualstudio.com/" target="_blank" rel="noopener noreferrer">VS Code</a>がおススメだ。</p>
<p><a href="https://code.visualstudio.com/Download" target="_blank" rel="noopener noreferrer">ここ</a>から、自分の OS に合ったインストーラをダウンロードして実行しよう。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="リファレンスをブックマークする">リファレンスをブックマークする<a href="https://blog.satotaichi.info/learning_javascript_for_beginners/#%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9%E3%82%92%E3%83%96%E3%83%83%E3%82%AF%E3%83%9E%E3%83%BC%E3%82%AF%E3%81%99%E3%82%8B" class="hash-link" aria-label="リファレンスをブックマークする への直接リンク" title="リファレンスをブックマークする への直接リンク">​</a></h2>
<p>エディタをインストールしたので、さぁコードを書こうと言いたいところだけど、まだ少しやる事がある。</p>
<p>ちゃんとしたリファレンスサイトをブラウザでブックマークして、困った時はそこを見るようにしてほしいんだ。</p>
<ul>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript" target="_blank" rel="noopener noreferrer">JavaScript</a> / <a href="https://developer.mozilla.org/ja/docs/Web/JavaScript" target="_blank" rel="noopener noreferrer">日本語</a></li>
<li><a href="https://nodejs.org/dist/latest-vx/docs/api/" target="_blank" rel="noopener noreferrer">Node</a></li>
<li><a href="http://azu.github.io/promises-book/" target="_blank" rel="noopener noreferrer">JavaScript Promise の本</a></li>
<li><a href="https://github.com/avajs/ava#documentation" target="_blank" rel="noopener noreferrer">AVA</a></li>
<li><a href="https://docs.npmjs.com/files/package.json" target="_blank" rel="noopener noreferrer">package.json</a></li>
<li><a href="https://code.visualstudio.com/docs" target="_blank" rel="noopener noreferrer">VS Code</a></li>
</ul>
<p>Mac には、<a href="https://kapeli.com/dash" target="_blank" rel="noopener noreferrer">Dash</a>って便利なアプリがあると聞いた覚えがあるのだけど、僕は使ったことが無いので分からない。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="プロジェクトを構成する">プロジェクトを構成する<a href="https://blog.satotaichi.info/learning_javascript_for_beginners/#%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E6%A7%8B%E6%88%90%E3%81%99%E3%82%8B" class="hash-link" aria-label="プロジェクトを構成する への直接リンク" title="プロジェクトを構成する への直接リンク">​</a></h2>
<p>プロジェクトをきちんとセットアップするのは、面倒だと感じるかもしれないけど便利なことが多いから少し頑張ってほしい。</p>
<p>まずは、作業用のディレクトリを作ろう。好きなパスにディレクトリを作ってくれればいい。</p>
<p>ここでは、<code>C:/dev/js/projects/js_for_beginner</code> というディレクトリを作った。</p>
<p>エクスプローラで、このディレクトリを右クリックすると <code>Open with Code</code> というメニューを選ぶ。</p>
<p><img decoding="async" loading="lazy" src="https://blog.satotaichi.info/assets/images/open_with_code-3fde496fefa270a54cee174889fd0146.png" width="575" height="363" class="img_ev3q"></p>
<p>VS Code が起動したら、Ctrl キーを押しながら@キーを押す。これで、VS Code 内に PowerShell が起動するはずだ。</p>
<p>ここで以下のようなコマンドを入力する。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">npm init -y</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>これでデフォルトの<code>package.json</code>が生成される。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="babel-を導入する">Babel を導入する<a href="https://blog.satotaichi.info/learning_javascript_for_beginners/#babel-%E3%82%92%E5%B0%8E%E5%85%A5%E3%81%99%E3%82%8B" class="hash-link" aria-label="Babel を導入する への直接リンク" title="Babel を導入する への直接リンク">​</a></h2>
<p><a href="http://node.green/" target="_blank" rel="noopener noreferrer">Node は ES2015 の構文が殆ど使える</a>ので、Babel を使う強いモチベーションは<code>import</code>文を使いたいかどうかだけなんだけども、まぁ、使いたい。</p>
<p>Babel を導入するために、以下のようなコマンドを VS Code 上に開いた PowerShell で入力する。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">npm install babel-cli babel-preset-env -D</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>このコマンドが終了すると<code>package.json</code>の中身はこういう風になっているはずだ。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "name": "js_for_beginner",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "version": "1.0.0",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "description": "",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "main": "index.js",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "dependencies": {},</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "devDependencies": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "babel-cli": "^6.24.0",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "babel-preset-env": "^1.2.2"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "scripts": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "test": "echo \"Error: no test specified\" &amp;&amp; exit 1"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "author": "",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "license": "ISC"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>ここに Babel 用の設定を追加すると、こうなる。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "name": "js_for_beginner",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "version": "1.0.0",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "description": "",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "main": "index.js",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "dependencies": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "source-map-support": "^0.4.14"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "devDependencies": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "babel-cli": "^6.24.0",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "babel-preset-env": "^1.2.2"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "scripts": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "compile": "babel src --out-dir .",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "exec": "node -r babel-register src/index.js",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "test": "echo \"Error: no test specified\" &amp;&amp; exit 1"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "author": "",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "license": "ISC",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "babel": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "sourceMaps": "inline",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "presets": [</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      ["env", { "targets": {"node": 7}, "useBuiltIns": true}]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>npm script に<code>compile</code>タスクと<code>exec</code>タスクを追加した。併せて、<code>babel</code>というエントリを一番最後に追加した。</p>
<p><code>compile</code>タスクは実行すると、src ディレクトリにある JavaScript がコンパイルされてプロジェクトのルートディレクトリに出力される。</p>
<p><code>exec</code>タスクを実行する、コンパイルせずに直接 src ディレクトリにある index.js を動かせる。</p>
<p><code>babel</code>エントリの<code>sourceMaps</code>は、コンパイルした JavaScript の末尾にデバッグ用の SourceMap を付加するという設定だ。</p>
<p><code>presets</code>の<code>env</code>は、Node と最新の JavaScript の差分だけをコンパイル時に取り込むようにする設定だ。これによってコンパイル後のモジュールが不用意に大きくなるのを避けられる。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="source-map-support-の導入">Source Map Support の導入<a href="https://blog.satotaichi.info/learning_javascript_for_beginners/#source-map-support-%E3%81%AE%E5%B0%8E%E5%85%A5" class="hash-link" aria-label="Source Map Support の導入 への直接リンク" title="Source Map Support の導入 への直接リンク">​</a></h3>
<p>Babel を導入するだけだと、エラーが起きた時のスタックトレースが自分の書いたコードと合わないので、<code>source-map-support</code> も導入する。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">npm install source-map-support -S</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>src ディレクトリに、index.js というファイルを以下の内容で作ってみよう。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">import "source-map-support/register";</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">import * as fs from "fs";</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">console.log(fs.readFileSync("package.json").toString());</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">throw new Error();</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>これを動かすには、VS Code の PowerShell で以下のコマンドを入力する。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">npm run exec</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>一行目の<code>import "source-map-support/register";</code>をコメントアウトした時と、そうでない時でスタックトレースの行番号が微妙に変わるので確認して欲しい。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="ava-を導入する">AVA を導入する<a href="https://blog.satotaichi.info/learning_javascript_for_beginners/#ava-%E3%82%92%E5%B0%8E%E5%85%A5%E3%81%99%E3%82%8B" class="hash-link" aria-label="AVA を導入する への直接リンク" title="AVA を導入する への直接リンク">​</a></h2>
<p>最後は、テスティングフレームワークの導入だ。これで最後なので頑張ってほしい。</p>
<p>いい加減なスクリプティングで言語を勉強するよりは、テストコードを動かしながら言語を勉強した方がよりよい作法が身につくからね。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">npm install ava -D</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>モジュールをインストールしたら、<code>package.json</code>に AVA 用の設定を追加する。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "name": "js_for_beginner",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "version": "1.0.0",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "description": "",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "main": "index.js",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "dependencies": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "source-map-support": "^0.4.14"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "devDependencies": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "babel-cli": "^6.24.0",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "babel-preset-env": "^1.2.2"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "scripts": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "compile": "babel src --out-dir .",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "exec": "node -r babel-register src/index.js",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "test": "ava"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "author": "",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "license": "ISC",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "babel": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "sourceMaps": "inline",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "presets": [</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      ["env", { "targets": {"node": 7}, "useBuiltIns": true}]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "ava": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "files": [ "test/**/*.js" ],</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "source": [ "src/**/*.js" ]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピ��ー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>npm script の<code>test</code>タスクの中身を AVA を実行するように変更した。</p>
<p>併せて、AVA がテスト実行する際に、テスト対象コートと、テストコードをどういう基準で探すのかを<code>ava</code>エントリに定義する。</p>
<p>test ディレクトリに、index.js というファイルを以下の内容で作ってみよう。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">import test from "ava";</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">test(async t =&gt; {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  let foo = Promise.resolve("foo");</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  t.is(await foo, "foo");</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">});</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコ��ードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>これを動かすには、VS Code の PowerShell で以下のコマンドを入力する。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">npm run test</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="クリップボードにコードをコピー" title="コピー" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>AVA 自体の説明については、前回のエントリや<a href="https://github.com/avajs/ava#documentation" target="_blank" rel="noopener noreferrer">公式のドキュメント</a>を参照して欲しい</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="まとめ">まとめ<a href="https://blog.satotaichi.info/learning_javascript_for_beginners/#%E3%81%BE%E3%81%A8%E3%82%81" class="hash-link" aria-label="まとめ への直接リンク" title="まとめ への直接リンク">​</a></h2>
<p>僕の気持ちとしては、<a href="https://yarnpkg.com/" target="_blank" rel="noopener noreferrer">Yarn</a>、<a href="https://flowtype.org/" target="_blank" rel="noopener noreferrer">Flow</a>、<a href="http://eslint.org/" target="_blank" rel="noopener noreferrer">ESlint</a>、<a href="http://documentation.js.org/" target="_blank" rel="noopener noreferrer">documentation.js</a>あたりは必須ですと書きたい。</p>
<p>でも、これらは無くても少し不便なだけでコードが書けない訳じゃないので今回は紹介しなかった。</p>
<p>よりよい環境を目指すんなら、必須だけど初学者にいきなり要素技術を沢山積んでも学習しきれないだけで、意味が無いからね。</p>
<p>そういう揃ってる環境が欲しいなら、僕が作った<a href="https://github.com/taichi/js-boilerplate/tree/master" target="_blank" rel="noopener noreferrer">js-boilerplate</a>の master ブランチを参考にして欲しい。</p>]]></content>
        <author>
            <name>Sato Taichi</name>
            <uri>https://github.com/taichi</uri>
        </author>
        <category label="javascript" term="javascript"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[RDBとスキーマレスDBの使い分けについて]]></title>
        <id>https://blog.satotaichi.info/rdb_or_schemalessdb/</id>
        <link href="https://blog.satotaichi.info/rdb_or_schemalessdb/"/>
        <updated>2017-02-22T14:22:53.000Z</updated>
        <summary type="html"><![CDATA[はじめに]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="はじめに">はじめに<a href="https://blog.satotaichi.info/rdb_or_schemalessdb/#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB" class="hash-link" aria-label="はじめに への直接リンク" title="はじめに への直接リンク">​</a></h2>
<p>RDB とスキーマレス DB をどういう基準で使い分けるのかを、会社で聞かれた際に答えた雑な回答をメモ書きしておく。</p>
<p>他にも多くの基準があるだろうし、スキーマレス DB というか KVS は様々な実装があり、そのそれぞれが微妙に違うので議論として曖昧な部分はある。</p>
<p>特に、運用面やデータ量がペタバイトクラスになる状況については考慮していない。</p>
<p>僕は SI 戦士なので、最終的には金を無限に突っ込んだ Oracle 先生が最高のデータベースであると考えている。</p>
<p>そういうバイアスのある人間の意見だと思って以下の文章は読んで欲しい。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="念頭に置いているデータベースについて">念頭に置いているデータベースについて<a href="https://blog.satotaichi.info/rdb_or_schemalessdb/#%E5%BF%B5%E9%A0%AD%E3%81%AB%E7%BD%AE%E3%81%84%E3%81%A6%E3%81%84%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6" class="hash-link" aria-label="念頭に置いているデータベースについて への直接リンク" title="念頭に置いているデータベースについて への直接リンク">​</a></h3>
<p>このエントリを書くにあたって念頭においているデータベースは以下の通り</p>
<ul>
<li>RDB<!-- -->
<ul>
<li><a href="http://www.oracle.com/jp/database/overview/index.html" target="_blank" rel="noopener noreferrer">Oracle</a></li>
<li><a href="https://www.postgresql.org/" target="_blank" rel="noopener noreferrer">PostgreSQL</a></li>
<li><a href="https://www.mysql.com/" target="_blank" rel="noopener noreferrer">MySQL</a></li>
</ul>
</li>
<li>スキーマレス DB<!-- -->
<ul>
<li><a href="https://www.mongodb.com/" target="_blank" rel="noopener noreferrer">MongoDB</a></li>
<li><a href="https://aws.amazon.com/jp/dynamodb/" target="_blank" rel="noopener noreferrer">Amazon DynamoDB</a></li>
</ul>
</li>
</ul>
<p>最初は Redis を DB と書いていたけども、僕の認識違いが明らかになったので DB でない方に移した。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="念頭に置いていないデータベースについて">念頭に置いていないデータベースについて<a href="https://blog.satotaichi.info/rdb_or_schemalessdb/#%E5%BF%B5%E9%A0%AD%E3%81%AB%E7%BD%AE%E3%81%84%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6" class="hash-link" aria-label="念頭に置いていないデータベースについて への直接リンク" title="念頭に置いていないデータベースについて への直接リンク">​</a></h3>
<p>このエントリを書くにあたって念頭においていないデータベースのようなものは以下の通り</p>
<ul>
<li><a href="https://hbase.apache.org/" target="_blank" rel="noopener noreferrer">HBase</a></li>
<li><a href="https://www.elastic.co/products/elasticsearch" target="_blank" rel="noopener noreferrer">Elasticsearch</a></li>
<li><a href="https://memcached.org/" target="_blank" rel="noopener noreferrer">Memcached</a></li>
<li><a href="https://redis.io/" target="_blank" rel="noopener noreferrer">Redis</a></li>
</ul>
<p>これらをデータベースだと言う人もいるだろうが、僕はこれらをデータベースとは考えていない。</p>
<p>意見の相違がある方はアンサーエントリを書いて頂けると勉強になるのでありがたい。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="スキーマを事前定義するか">スキーマを事前定義するか？<a href="https://blog.satotaichi.info/rdb_or_schemalessdb/#%E3%82%B9%E3%82%AD%E3%83%BC%E3%83%9E%E3%82%92%E4%BA%8B%E5%89%8D%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B%E3%81%8B" class="hash-link" aria-label="スキーマを事前定義するか？ への直接リンク" title="スキーマを事前定義するか？ への直接リンク">​</a></h3>
<p>一番大きな違いは、スキーマを事前定義するのか、事後定義つまり、格納されているデータがスキーマなのである、というアプローチをとるのかが違う。</p>
<p>スキーマを事前定義するためには、ストレージされるデータの構造を厳密に規定しなければアプリケーションを作り始められない。</p>
<p>一方で、スキーマを定義しないのであれば、手に入れたデータを JSON か何かにシリアライズすれば、とりあえず DB に格納できる。</p>
<p>つまり、これから作ろうとするアプリケーションをどれだけ厳密に設計したいか？というのが、最初の使い分け基準になる。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="トランザクションを使いたいか">トランザクションを使いたいか？<a href="https://blog.satotaichi.info/rdb_or_schemalessdb/#%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B6%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E4%BD%BF%E3%81%84%E3%81%9F%E3%81%84%E3%81%8B" class="hash-link" aria-label="トランザクションを使いたいか？ への直接リンク" title="トランザクションを使いたいか？ への直接リンク">​</a></h3>
<p>次にトランザクションモデルが違う。</p>
<p>RDB では、トランザクションを使えるので複数のデータを追加したり更新する時の整合性を取るのが非常に簡単だ。データの整合性を保障するのはデータベースの役割となる。</p>
<p>一方で、スキーマレスな DB の殆どはまともなトランザクションをサポートしていないので、複数のデータを追加したり更新する時の整合性を取るのはアプリケーションコード側でやらなければいけない。</p>
<p>トランザクションモデルの違いは、DB に格納するデータ構造の違いにも表れる。</p>
<p>RDB では、ユーザや、部署、会社のようないわゆるマスタデータは、それぞれ正規化して独立したテーブルにするのが望ましいとされる。これは、ユーザと部署と、その連関テーブルを同時に更新するのが容易いからだといえる。</p>
<p>一方で、スキーマレスな DB では、一つのビジネストランザクション内で必要なデータは一つの塊として保存してしまうのがよい。</p>
<p>データは正規化されている訳では無いので、複数のビジネストランザクション間で、同じ筈のデータが同じでなくなってしまう可能性はある。それが問題になるようなアプリケーションではスキーマレス DB を使わなければいい。</p>
<p>これから作るアプリケーションにおいてトランザクションは必要か？必要ない場合に、データが非正規なままでも問題が置き辛いようなアプリケーションか？が二番目の使い分け基準になる。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="高度なクエリ言語を使いたいか">高度なクエリ言語を使いたいか？<a href="https://blog.satotaichi.info/rdb_or_schemalessdb/#%E9%AB%98%E5%BA%A6%E3%81%AA%E3%82%AF%E3%82%A8%E3%83%AA%E8%A8%80%E8%AA%9E%E3%82%92%E4%BD%BF%E3%81%84%E3%81%9F%E3%81%84%E3%81%8B" class="hash-link" aria-label="高度なクエリ言語を使いたいか？ への直接リンク" title="高度なクエリ言語を使いたいか？ への直接リンク">​</a></h3>
<p>3 つ目の使い分け基準の話は、DB の実装によって違うのでおおまかな話になるが、クエリの複雑さの話だ。</p>
<p>RDB では標準化された極めて高水準で高機能な SQL を使える。集合論に基づいて設計された SQL は DB というデータの集合を操作するために最適化された構造をしている。</p>
<p>一方で、多くのスキーマレス DB には、それ程高水準なクエリ言語は搭載されていない。</p>
<p>ちょっと日付で範囲クエリが使えるだけで優位性があるとみなされるレベルだ。</p>
<p>多くの場合は、KVS 等と言われるように、DB に格納されているモデルの特定のフィールド、つまりキーを基準に 1:1 でデータを取出せるだけだ。集合に対する操作が必要なら、アプリケーションコードの中で、map だの reduce だのと言った関数を駆使することになる。</p>
<p>データの量が十分に少なければ、アプリケーションコードで集合を操作すること自体が問題になることはないだろう。</p>
<p>一方で、データの量が大きい場合、つまりメモリに乗り切らない程度に大きくなる場合、アプリケーションコードとして適正に動作する集合操作のコードを書くのは飛躍的に難しくなる。一度に操作しきれないので、部分的にファイルに書きだしたり、DB からデータを少しずつ取り出しながらソートしたりといったコードを書くのは、恐ろしく難しいので出来れば避けるべきだ。</p>
<p>更にデータ量が大きい場合、つまりデータベースを分散化せざるをえない程度に大きくなる場合には、さらに別な手段を考える必要がある。これは、ビッグデータ界隈の話になるので、そちらについては言及しない。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="まとめ">まとめ<a href="https://blog.satotaichi.info/rdb_or_schemalessdb/#%E3%81%BE%E3%81%A8%E3%82%81" class="hash-link" aria-label="まとめ への直接リンク" title="まとめ への直接リンク">​</a></h2>
<p>以上をまとめると、RDB とスキーマレス DB の使い分けの基準は３つ</p>
<ul>
<li>スキーマを事前定義するか？</li>
<li>トランザクションを使いたいか？使わない場合、それに伴うデータモデルのあり方を許容できるか？</li>
<li>高度なクエリ言語を使いたいか？</li>
</ul>]]></content>
        <author>
            <name>Sato Taichi</name>
            <uri>https://github.com/taichi</uri>
        </author>
        <category label="RDB" term="RDB"/>
        <category label="KVS" term="KVS"/>
    </entry>
</feed>