<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Nikaeraintokyo.</title>
    <link>https://nikaera.com/</link>
    <description>Recent content on Nikaeraintokyo.</description>
    <image>
      <title>Nikaeraintokyo.</title>
      <url>https://nikaera.com/cover_image.jpg</url>
      <link>https://nikaera.com/cover_image.jpg</link>
    </image>
    <generator>Hugo -- 0.148.0</generator>
    <language>ja</language>
    <lastBuildDate>Mon, 14 Jul 2025 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://nikaera.com/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>🤖 AI時代における個人の幸福 (2025/07/15)</title>
      <link>https://nikaera.com/archives/individual-happiness-in-ai-era-2025/</link>
      <pubDate>Mon, 14 Jul 2025 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/individual-happiness-in-ai-era-2025/</guid>
      <description>&lt;p&gt;最近、AIエージェントの話題が「効率化」というビジネス観点ばかりが取り沙汰されている気がしている。また個人が力を持つみたいな話も多い認識だが、&lt;strong&gt;個人の幸福に繋がる話は余り見かけないことに違和感がある。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;理想の AI時代が到来すれば無条件に全員が幸福になると思われているからか、ただ個人的には余りそう思わないので所感を書き散らしてみる。&lt;/p&gt;
&lt;p&gt;ちなみに AI周りは日進月歩なのでタイトルに日付を付けることにした。後々また考え方が更新されたら新たな記事で綴るようにしたいと思う。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;AIが瞬時に答えを出し、依頼を完遂してくれる世界。それは一見すると理想郷のようにも映る。ただ、&lt;strong&gt;人間が根源的に持つ「意義ある成果を自ら得た」という欲求はそれで果たして満たされるのか。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://suno.com/&#34;&gt;Suno&lt;/a&gt; を触っていても感じるが、クリエイティブにおいても「AIガチャ」のような受動的な体験は、大半の人はおそらくすぐに飽きてしまうのではないかと感じている。ソシャゲの飽きと同じかもしれない。&lt;/p&gt;
&lt;p&gt;そこには、試行錯誤の末に何かを成し遂げた時の満たされた感覚、いわゆる自己効力感がすっぽりと抜け落ちているからだと感じる。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;プロセスを無視して結果だけを享受する状況は、自らの能力に対する信頼や、行動することの意義そのものを見失わせる危険性を孕んでいそうだ。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;では AIとどう向き合えば、より個人の幸福に近づけるのか。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;最近考えているのが、AIを探究するための「パートナー」として捉えるアプローチ。探究対象は自分自身でも既に対象が存在してればそれで良くて、&lt;strong&gt;人生で没頭する時間の総量を増やすのに使うイメージである。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;探究対象が無い人は自分自身への理解が足りてない可能性が高いので、AIで過去から自分の価値観を炙り出すと言ったことをすれば良い。他には AIからコーチングや認知療法など受けてみても良いかもしれない。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;自分自身の価値観は何なのか。何に喜びを感じるのか。&lt;/strong&gt; AIに問いを投げかけ、返ってきた答えを吟味し興味関心を深めていく。引いては行動に繋げるループを回していくことで、思いがけない自分の成長に繋げていく。&lt;/p&gt;
&lt;p&gt;以前好きなアーティストや音楽の時代背景を深掘ることをよくやっていた。そこから新たな気づきを得て感動を得た体験が多々あった。教養が深まることにも繋がったし、そういった&lt;strong&gt;成長の実感は素直に喜びに繋がる。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;成長というと高尚に聞こえるが、フロムゲーを頑張って攻略したみたいなものも含めて言っている。&lt;strong&gt;単に以前より上手くなった実感みたいな。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;また自分自身の探究も深まれば自ずと幸福に繋がる行動や取捨選択も可能になりそうなので、後は惰性で一般的に幸福とされる人生が送れそうな気がする。&lt;strong&gt;自分の創作する物語を 100%味わい尽くして楽しむ感覚である。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;とここまで話してきて物語思考感が出てきたので紹介しておく&amp;hellip;w&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://amzn.to/4mrShZ1&#34;&gt;Amazon.co.jp: 物語思考　「やりたいこと」が見つからなくて悩む人のキャリア設計術 (幻冬舎単行本) eBook : けんすう（古川健介）: 本&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;よく一般的に言われる AIで働かなくて良い時代が来たら義務感から解放され、純粋な「楽しい」という動機で行動できる。という世界が来たとしても、&lt;strong&gt;その「楽しい」が見出せない人には辛い時代が来そうである。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;ただ「楽しい」だけでなく、それらが社会からも一定評価されないと持続可能ではなく「楽しい」を享受し続けられない気もするので、ここまで語ってきて何だが、諸々単純な話ではない気はしている&amp;hellip;w&lt;/p&gt;</description>
    </item>
    <item>
      <title>💪 脱力という最強の構え</title>
      <link>https://nikaera.com/archives/relaxation-strongest-stance/</link>
      <pubDate>Sat, 14 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/relaxation-strongest-stance/</guid>
      <description>&lt;p&gt;前期の評価で、会社の業績が芳しくないにも関わらず自己評価を引き上げる形で最高評価を付けて頂けたのだが、何故そうなったのか考察した。&lt;/p&gt;
&lt;p&gt;結果、以前書いた記事の合わせ技で、説明が付きそうだったのでバーっと書いてみる。結論、&lt;strong&gt;「脱力で始め、着地するまで動く」&lt;/strong&gt; に達した。&lt;/p&gt;
&lt;hr&gt;
&lt;div class=&#34;linkcard-container&#34; style=&#34;margin: var(--content-gap) 0;&#34;&gt;
            &lt;a href=&#34;https://sizu.me/nikaera/posts/evm35vwz0tr9&#34; 
               class=&#34;linkcard&#34; 
               style=&#34;
                   display: flex;
                   text-decoration: none;
                   color: var(--content);
                   background: var(--entry);
                   border: 1px solid var(--border);
                   border-radius: 12px;
                   padding: 0px 0px 0px 20px;
                   transition: background-color 0.3s ease;
                   box-shadow: 0 4px 8px rgba(0,0,0,0.08);
                   min-height: 140px;
                   overflow: hidden;
               &#34; 
               onmouseover=&#34;this.style.backgroundColor=&#39;rgb(56, 56, 61)&#39;;&#34; 
               onmouseout=&#34;this.style.backgroundColor=&#39;var(--entry)&#39;;&#34;
               target=&#34;_blank&#34;
               rel=&#34;noopener noreferrer&#34;&gt;&lt;div class=&#34;linkcard-content&#34; style=&#34;flex: 1; display: flex; flex-direction: column; min-width: 0; margin-top: 20px; margin-right: 20px;&#34;&gt;&lt;div class=&#34;linkcard-title&#34; style=&#34;margin-bottom: 10px;&#34;&gt;
                        &lt;h3 style=&#34;
                            margin: 0;
                            font-size: 18px;
                            font-weight: 600;
                            line-height: 1.3;
                            color: var(--primary);
                            overflow: hidden;
                            display: -webkit-box;
                            -webkit-box-orient: vertical;
                            -webkit-line-clamp: 2;
                            line-clamp: 2;
                        &#34;&gt;
                            育児エンジニアの学び｜nikaera
                        &lt;/h3&gt;
                    &lt;/div&gt;&lt;p class=&#34;linkcard-description&#34; style=&#34;
                        margin: 0;
                        font-size: 14px;
                        line-height: 1.5;
                        color: var(--secondary);
                        overflow: hidden;
                        display: -webkit-box;
                        -webkit-box-orient: vertical;
                        -webkit-line-clamp: 2;
                        line-clamp: 2;
                        flex: 1;
                        margin-bottom: 12px;
                    &#34;&gt;
                        2,104字
                    &lt;/p&gt;</description>
    </item>
    <item>
      <title>🎯 目標管理と運用は二つで一つ</title>
      <link>https://nikaera.com/archives/goal-management-and-operation-unity/</link>
      <pubDate>Tue, 06 May 2025 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/goal-management-and-operation-unity/</guid>
      <description>&lt;p&gt;今期、初めて組織の縦横が揃った形で目標設定ができた。かつプロジェクト単位で全体の動きも自動的に目標達成に向かう状態になっていた。だが&lt;strong&gt;目標達成の進捗・成否については、誰も気にしていないように見えた。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;現在は状況を鑑みて目標を、目的も含め見直す動きが発生している。なぜこのような事態が起きていたのか、考えてみたので雑多に書いてみる。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;明確な目的はチームの指針であり、価値の拠り所になる。でも目的が完璧でも、それだけで機能することはない。目標達成に近づいている実感を得られる &amp;ldquo;運用&amp;rdquo; が無ければ、美術館に飾られている絵と同じである。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;目標は抽象であり、運用こそが具象である。&lt;/strong&gt; 例えメンバーに目標を意識付けても、自己効力感がなければ行動も伴わないだろう。ただの文字列として目的や目標を覚えても、腹落ちしなければ意味はない。&lt;/p&gt;
&lt;p&gt;それらの問題は、&lt;strong&gt;主体的な目標達成に向けた行動が賞賛される文化づくりや、自己組織化を促す権限設計など行わない限り解決が難しいだろう。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;目的や目標の決めは、ただのスタートラインにすぎず、フィードバックループや振り返り等もなければ、&lt;strong&gt;組織の健康状態が誰も把握できず、知らずのうちに自分たちの置かれている状況も把握出来なくなってしまう。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;運用が目的に接続していない状態で、目標管理を構成する重要な要素として、運用が認識できる仕組みを組織に組み込むにはどうすれば良いか。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;目的や目標を決める際に、達成に向けた運用も併せて設計することが肝なのかもしれない。&lt;/strong&gt; 例えば、大局的なロードマップがある場合、紐づくプロジェクトはボトムアップで議論を重ねて検討を推進するなどである。&lt;/p&gt;
&lt;p&gt;目的や目標の決めから、チーム全体を巻き込みつつワークショップのような形で議論を行う。ハレの機会として非日常を演出して、日常では築けないレベルの相互理解を醸成する話題 (理想とか) を語り合う。&lt;/p&gt;
&lt;p&gt;組織効力感がぶち上がる中で、目的や目標に関する議論がされると、自然創発的に目標達成に向けた議論や運用も各所で行われる事もあるかも。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;目的を語るとは、運用を語ることであり、理想と現実をつなぐ視点が必要なのだろう。&lt;/strong&gt; そして目標管理は最早アートと呼べそうなほど高度な気がしてきたので、その観点で運用に取り組めるとテンション上がりそう (小並&lt;/p&gt;
&lt;p&gt;蛇足: 次こそは良い感じに最強の目標を、と意気込んで↓を読んで取り組んでたはずなのに、やはり実践の中で研鑽と学びを積んでいくしかない&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://amzn.to/4lfTx0u&#34;&gt;Amazon.co.jp: アジャイルチームによる目標づくりガイドブック OKRを機能させ成果に繋げるためのアプローチ eBook : 小田中 育生: Kindleストア&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>🎯 いかなる時も、行動の起点は自分から</title>
      <link>https://nikaera.com/archives/action-always-starts-from-yourself/</link>
      <pubDate>Sat, 29 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/action-always-starts-from-yourself/</guid>
      <description>&lt;p&gt;仕事において、規定の役割や方針に従って期待通りの成果を出そうとする人がいる。外部からの評価を伺いながら、行動を実行するタイプである。&lt;/p&gt;
&lt;p&gt;上記は一見すると、ドライでプロフェッショナルな仕事人に見える。&lt;/p&gt;
&lt;p&gt;しかし、&lt;strong&gt;評価軸の起点を外部に委ねると、評価されない場合、他責に陥り周囲に不満を抱えがちである。外部からの評価に対する認識ずれは、自己効力感や組織効力感の低下に直結しやすい。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;また、お膳立てされた規定の範囲内でしか行動していない場合、当人は多大な成果が出てる認識でも、外部からはそう見えない状況が発生する。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;この状況を打破するには、&lt;strong&gt;評価軸は自ら定めることが重要である。自分の価値観を大切にし探求的アプローチが取れる状況を作ることで、個性が発揮される形で成果が出しやすくなり、評価に繋がりやすい。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;何かチームに不満があるときは、自分軸で積極的に解決に動き出す。他者理解は周囲を適切に巻き込みながら獲得していくアプローチで進める。&lt;/p&gt;
&lt;p&gt;主体となり仮説を立て行動すると、意義ある学び・成長が得られる。&lt;strong&gt;そうして得られる経歴・経験はキャリアにも多大に寄与し、自己効力感は高まり、成長と評価に好循環が生まれていく。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;何れにせよ上位職やリーダーを担うようになると、不確実な状況下で意思決定や行動することが求められるため、&lt;strong&gt;主体的に解くべき意義ある問いを発見するスキルはキャリアアップにも極めて重要になってくる。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;そもそも、不確実性が高い状況下で仮説を立て、行動に繋げられるスキルが無いと見做されれば重要な仕事は巡ってこない。&lt;strong&gt;会社の評価に縛られ、自ら行動が起こせない状況は不健全であり、キャリアの停滞を招く。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;自分の道は自分で作る。&lt;strong&gt;もっと自由に個性を活かして組織やチームのために行動してみることは、自己実現と評価の両立の実現に結びつくと思う。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;何より、楽しく充実した仕事が行えて幸福な日々が過ごせそうである。&lt;/p&gt;</description>
    </item>
    <item>
      <title>🥋 守破離という最強の型</title>
      <link>https://nikaera.com/archives/shu-ha-ri-ultimate-pattern/</link>
      <pubDate>Sun, 23 Feb 2025 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/shu-ha-ri-ultimate-pattern/</guid>
      <description>&lt;p&gt;チームメンバーとの 1on1 を通じて最近感じたことがある。それは&lt;strong&gt;守破離という日本古来の考え方こそ全てに通ずる最強の型なのでは無いか&lt;/strong&gt; ということである。具体的には、下記の構造が全てにハマるなと感じている。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;型を守る（守）：期待通りの活躍ができる
&lt;ul&gt;
&lt;li&gt;外部からの信頼が得られ、安定した評価が得られる状態&lt;/li&gt;
&lt;li&gt;基盤が構築されることで、後の建設的な挑戦への準備に繋がる&lt;/li&gt;
&lt;li&gt;守に留まりすぎると諦観や不満が生まれてくる&lt;br&gt;
- ココで逃避的な行動を取ると次のステップ（破）には進めない&lt;br&gt;
- 守を突き詰めていっても、期待を超える活躍は基本無い&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;型を破る（破）：現状に疑問を持ち、挑戦する
&lt;ul&gt;
&lt;li&gt;型に疑問を持ち、現状の慣習やルールに挑戦している状態&lt;/li&gt;
&lt;li&gt;型の深い理解があって初めて、意味のある挑戦が可能になる&lt;/li&gt;
&lt;li&gt;挑戦を積み重ねた上で蓄積された知見が革新に繋がる&lt;br&gt;
- 知見を重ねていかないと次のステップ（離）には進めない&lt;br&gt;
- 破を闇雲に行なっても、注意散漫で革新は生み出せない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;型を作る（離）：独自の型を創造する
&lt;ul&gt;
&lt;li&gt;積み重ねた知見から、最初の型から完全に離れた姿になる&lt;/li&gt;
&lt;li&gt;強みや個性を最大限に活かした創造的な状態になる&lt;/li&gt;
&lt;li&gt;今まで見られなかった成果が創出できるようになる&lt;br&gt;
- その後は再び守の状態に戻り、安定を目指すことになる&lt;br&gt;
- 離には留まれないため、守に素早く移行することが鍵となる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最初は忠実に型を守り、期待に応えることで安定した基盤を築き、その上で敢えて既存の型を破る挑戦を行い、最終的に独自の型を創造する。上手くいけば、著しい達成感が得られ、幸福の最大化に繋がるだろう。&lt;/p&gt;
&lt;p&gt;上手くいかなくても、自分は挑戦したという誇りを胸に充実した人生が送れるようになる。といったことを考えると、自身の幸福度を最大化する心得として守破離はとても大切なのでは無いかという気になってくる。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;必要だと思うから行動するという行為は一見理にかなっているように見える。しかし、自分がやりたいからやり、意味は後から考える方が内発的動機に裏打ちされた挑戦が持続できて幸福度も高そうに感じる。&lt;/p&gt;
&lt;p&gt;つまりは、&lt;strong&gt;諦観や不満が生まれてきたら意識的に本能に従った行動をとり、積み重なった知見から何か新たな発見をしていくだけで自然と充実した人生が送れるようになっていくのでは？&lt;/strong&gt; という仮説が出たという話。&lt;/p&gt;
&lt;p&gt;注意として、&lt;strong&gt;偉大な先人達が積み上げて体系化したナレッジを見も学びもせず、型無しの状態で守破離は実行できない。何でも良いので、お手本や理想系から逆算した、自分にハマる型を発見することが肝要になる。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;蛇足&#34;&gt;蛇足&lt;/h3&gt;
&lt;p&gt;自分は音楽制作に憧れがあったのだが、ずっと思う通りに作曲出来ず満足できなかった。しかし AI を用いた作曲で自分が好きになれる高品質な音楽がバコバコ生成可能になり、多大な幸福を獲得している実感がある。&lt;/p&gt;
&lt;p&gt;作曲に必要な型が、プロンプトというテキストになったことで自分の表現力が如何なく発揮できている感覚があり、捉われから自由になった。&lt;/p&gt;
&lt;p&gt;これは&lt;strong&gt;自身の欲求が失われていなかったから実現できたことであり、日々の欲求を大切にして生きていきたいなと感じた&lt;/strong&gt; 出来事であった。&lt;/p&gt;
&lt;p&gt;AI を活用して生成した楽曲は下記にあるので、音楽制作にずっと興味のあった人は今からでも是非試してみて欲しい。世界がひらけると思う。&lt;/p&gt;
&lt;div class=&#34;linkcard-container&#34; style=&#34;margin: var(--content-gap) 0;&#34;&gt;
            &lt;a href=&#34;https://suno.com/@nikaera&#34; 
               class=&#34;linkcard&#34; 
               style=&#34;
                   display: flex;
                   text-decoration: none;
                   color: var(--content);
                   background: var(--entry);
                   border: 1px solid var(--border);
                   border-radius: 12px;
                   padding: 0px 0px 0px 20px;
                   transition: background-color 0.3s ease;
                   box-shadow: 0 4px 8px rgba(0,0,0,0.08);
                   min-height: 140px;
                   overflow: hidden;
               &#34; 
               onmouseover=&#34;this.style.backgroundColor=&#39;rgb(56, 56, 61)&#39;;&#34; 
               onmouseout=&#34;this.style.backgroundColor=&#39;var(--entry)&#39;;&#34;
               target=&#34;_blank&#34;
               rel=&#34;noopener noreferrer&#34;&gt;&lt;div class=&#34;linkcard-content&#34; style=&#34;flex: 1; display: flex; flex-direction: column; min-width: 0; margin-top: 20px; margin-right: 20px;&#34;&gt;&lt;div class=&#34;linkcard-title&#34; style=&#34;margin-bottom: 10px;&#34;&gt;
                        &lt;h3 style=&#34;
                            margin: 0;
                            font-size: 18px;
                            font-weight: 600;
                            line-height: 1.3;
                            color: var(--primary);
                            overflow: hidden;
                            display: -webkit-box;
                            -webkit-box-orient: vertical;
                            -webkit-line-clamp: 2;
                            line-clamp: 2;
                        &#34;&gt;
                            nikaera | Join me on Suno
                        &lt;/h3&gt;
                    &lt;/div&gt;&lt;p class=&#34;linkcard-description&#34; style=&#34;
                        margin: 0;
                        font-size: 14px;
                        line-height: 1.5;
                        color: var(--secondary);
                        overflow: hidden;
                        display: -webkit-box;
                        -webkit-box-orient: vertical;
                        -webkit-line-clamp: 2;
                        line-clamp: 2;
                        flex: 1;
                        margin-bottom: 12px;
                    &#34;&gt;
                        Suno is building a future where anyone can make great music.
                    &lt;/p&gt;</description>
    </item>
    <item>
      <title>🌱 スタッフプロジェクトの種を蒔く</title>
      <link>https://nikaera.com/archives/sowing-staff-project-seeds/</link>
      <pubDate>Wed, 05 Feb 2025 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/sowing-staff-project-seeds/</guid>
      <description>&lt;p&gt;今期開発チームは OKR に戦略ベースで貢献していくことにした。エンジニアリングを用いて効果的に貢献が可能な戦略をチームで描きつつ、そこに向けて各メンバーが Will 駆動で戦術展開していく流れである。&lt;/p&gt;
&lt;p&gt;結果、チーム全員が同じ方針に向き、多様な観点から積極的に貢献に動く様子が見られる。まだ 1ヶ月しか経ってないが下記の動きが見て取れる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;あるメンバーはチーム全体にアジャイル文化を浸透させるべく、プロダクト開発のフロー効率最大化を PdM チームと協力しながら推進し、AI 活用を広めるオンボーディング活動なども積極的に行っている。
&lt;ul&gt;
&lt;li&gt;今まではリソース効率に振っていた進行のせいで、注意散漫かつ不確実性の高い進行が続いていた。まずはフロー効率に最適化するべく、マインドセットのアップデートから丁寧に行っている。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;あるメンバーはコミュニティの健全性が測れる仕組みを用意するために、大前提となる世界観の言語化から、仮説検証項目の洗い出し、AI による分析のための戦術検討を推進している。
&lt;ul&gt;
&lt;li&gt;普段表に出ない開発メンバーだが、若干あったという心理障壁を乗り越え、アジェンダのレビュー依頼が来たり、自主的にセクションを跨いだステークホルダーを集めてキックオフしていた。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;アウトプットベースのプロジェクトという形で降ろしてしまえば、工夫の余地は余り無くなるため、良く言えば正解が見える状態で進行も楽だったと思う。不確実性が少ないため、マネージャーも管理はしやすい。&lt;/p&gt;
&lt;p&gt;しかし、それでは個々のケイパビリティが発揮されたモチベーション高い状態での進行・委譲は難しかっただろうなと感じる。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;上述からの学びとして、&lt;strong&gt;OKR 貢献のための戦略はその性質上、全体を巻き込まなければ推進が難しい状態に必然的になるため、&lt;/strong&gt; &lt;a href=&#34;https://recruit.shiftinc.jp/career/library/id1343/&#34;&gt;&lt;strong&gt;スタッフプロジェクト&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;のようなものが生み出しやすいなと感じた。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;これは必然的に各チームメンバーの成長に繋がるだろうし、転職する際にもアピールポイントとして使える経験となるだろうし、EM としてもチームのアピールやチームメンバーの評価向上に使えるため、とても嬉しい。&lt;/p&gt;
&lt;p&gt;ただミスった時のダメージも、例えば今後チームを超えた協力を取り付けることが難しくなる、等々それなりに出る可能性が考えられる。そこは過去記事の下記一節の通り、EM として全力でサポートしていきたい。&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;メンバーがチームを越境してリーダーシップを発揮する&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;可能な限り成功確率を上げるため、サポートは惜しまずに行う&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;
&lt;div class=&#34;linkcard-container&#34; style=&#34;margin: var(--content-gap) 0;&#34;&gt;
            &lt;a href=&#34;https://sizu.me/nikaera/posts/euf8frkk7rix&#34; 
               class=&#34;linkcard&#34; 
               style=&#34;
                   display: flex;
                   text-decoration: none;
                   color: var(--content);
                   background: var(--entry);
                   border: 1px solid var(--border);
                   border-radius: 12px;
                   padding: 0px 0px 0px 20px;
                   transition: background-color 0.3s ease;
                   box-shadow: 0 4px 8px rgba(0,0,0,0.08);
                   min-height: 140px;
                   overflow: hidden;
               &#34; 
               onmouseover=&#34;this.style.backgroundColor=&#39;rgb(56, 56, 61)&#39;;&#34; 
               onmouseout=&#34;this.style.backgroundColor=&#39;var(--entry)&#39;;&#34;
               target=&#34;_blank&#34;
               rel=&#34;noopener noreferrer&#34;&gt;&lt;div class=&#34;linkcard-content&#34; style=&#34;flex: 1; display: flex; flex-direction: column; min-width: 0; margin-top: 20px; margin-right: 20px;&#34;&gt;&lt;div class=&#34;linkcard-title&#34; style=&#34;margin-bottom: 10px;&#34;&gt;
                        &lt;h3 style=&#34;
                            margin: 0;
                            font-size: 18px;
                            font-weight: 600;
                            line-height: 1.3;
                            color: var(--primary);
                            overflow: hidden;
                            display: -webkit-box;
                            -webkit-box-orient: vertical;
                            -webkit-line-clamp: 2;
                            line-clamp: 2;
                        &#34;&gt;
                            リーダーシップシフト雑感｜nikaera
                        &lt;/h3&gt;
                    &lt;/div&gt;&lt;p class=&#34;linkcard-description&#34; style=&#34;
                        margin: 0;
                        font-size: 14px;
                        line-height: 1.5;
                        color: var(--secondary);
                        overflow: hidden;
                        display: -webkit-box;
                        -webkit-box-orient: vertical;
                        -webkit-line-clamp: 2;
                        line-clamp: 2;
                        flex: 1;
                        margin-bottom: 12px;
                    &#34;&gt;
                        1,584字
                    &lt;/p&gt;</description>
    </item>
    <item>
      <title>📅 2024年の雑な振り返り 〜人に恵まれた〜</title>
      <link>https://nikaera.com/archives/2024-retrospective-blessed-with-people/</link>
      <pubDate>Tue, 31 Dec 2024 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/2024-retrospective-blessed-with-people/</guid>
      <description>&lt;p&gt;最初に結論を書くと &lt;strong&gt;人に希望が持てた一年だった。&lt;/strong&gt; 自分は正直言うと、人の選り好みが激しいタイプだった。自分から一方的に相性が悪そうとか、諸々の意味でプレゼンスある人に話しかけたら迷惑かもしれない、とかで自分から話す人を制限したりしていた節がある。&lt;/p&gt;
&lt;p&gt;ただそれは杞憂というか思い上がりすぎた。業務で関わりの無かった人達やカンファレンスの人達に素直に興味があったので、素直に話しかけたら会話が途切れるとかも無く、普通にめちゃくちゃ楽しく話せる経験がたくさん積めた。&lt;strong&gt;これは自分が本当の意味でどう見られてるかを気にしなくなったことが大きいのかもしれない。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;保育園での送り迎えでの父母同士のやり取り、子供達からも認知されて話しかけられることが増えた。多分 5年前の自分に伝えたら想像できないと言われるだろう、っていうほど話すことに抵抗が無くなった感じがある。&lt;/p&gt;
&lt;p&gt;人が怖いと感じていた自分が、人に救われている感覚がある。今後も一期一会を大切にして、積極的に人と良い関係性を築いていきたい。そういう意味で言うと来年の抱負は関係性を深めたいになるかもしれない💭&lt;/p&gt;</description>
    </item>
    <item>
      <title>⚠️ マネージャーが信頼を失墜させる時</title>
      <link>https://nikaera.com/archives/when-managers-lose-trust/</link>
      <pubDate>Sat, 28 Dec 2024 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/when-managers-lose-trust/</guid>
      <description>&lt;p&gt;最近マネージャーがタスクの背景を伝えず緊急度高めでメンバーに振り、意図したアウトプットが一撃で出ず烈火の如くブチギレる事案を見た。&lt;/p&gt;
&lt;p&gt;更に悪いことに、マネージャー自身もタスクの発端となった背景を把握しておらず、ほぼやり直しのような形でタスクが振り直されていた。&lt;/p&gt;
&lt;p&gt;上記は典型的な、秘伝のタレでマネージャーを続けた人物に多い傾向の認識がある。ソルジャータイプのプレイヤーが成り上がり、能力が足りない状態で&lt;a href=&#34;https://www.hrbrain.jp/media/human-resources-management/teal#heading-1&#34;&gt;ティール組織でいう、レッドやアンバーに近いスタイルである。&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;最早古典と言って差し支えない&lt;a href=&#34;https://www.miito-osteopathy.com/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2/%E3%83%87%E3%83%83%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3/&#34;&gt;デッドライン&lt;/a&gt;にも掲載されている、所謂下記以外の &amp;ldquo;管理ごっこ&amp;rdquo; で仕事した気になっている管理職のことである。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;正しい管理の4つの本質&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;適切な人材を雇用する&lt;/li&gt;
&lt;li&gt;その人材を適切にあてはめる&lt;/li&gt;
&lt;li&gt;人々の士気を保つ&lt;/li&gt;
&lt;li&gt;チームの結束を固め、維持する&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;前述の行為でメンバーを体調不良に陥らせたり、精神的に病ませることで、チームは瓦解しながらも闇雲に頑張るようになっていく。チームの組織効力感は地に落ち、マネージャーのご機嫌や正解を伺うようになる。&lt;/p&gt;
&lt;p&gt;マネージャーは「やっぱ俺が率いないとダメだな、このチームは」みたいな現場との認識の乖離で世界が断絶されていく。こういったマネージャーはプレイング能力は高いので現場の作業を自身で行い巻き取ろうとする。&lt;/p&gt;
&lt;p&gt;チームメンバーを子供として扱い、チームがマネージャーのサポーターとして振る舞うようになった結果、マネージャーがボトルネックとなり、いつまで経ってもチームのケイパビリティは向上しなくなる。&lt;/p&gt;
&lt;p&gt;更に悪いことに、マネージャーは自分のペースに合わせることをチームに求めるため、大体ハードワークするメンバーを評価対象とする。そして同質性を持ったメンバーが昇格する事で同じ悲劇が連鎖する。&lt;/p&gt;
&lt;p&gt;マネージャーの口癖は「もう一人の自分が欲しい」「自分の分身が欲しい」といった具合であり、個性も多様性も失われたチームは単なる作業者として扱われる。それ故作業量をこなすためのハードワークが評価される悪循環といった形である。メンバーの才能は 5%も発揮されないのでは？&lt;/p&gt;
&lt;p&gt;またマネジメントへの理解が「結局はヒトモノカネの話」で括る人もいるが、その程度の解像度の方が体系的にマネジメントを学んでいるとは到底思えない。大局的に言えば正しいそうだが、甘く見ているなーと感じる。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;ちょっと気が滅入ってきたのでココまでにするが、本来マネージャーは事業や組織に良い影響を与えるためにチームのケイパビリティを最大化するのが本来の役割であるはずだ。&lt;/p&gt;
&lt;p&gt;構成するメンバーの才能などを見極めていち早くチームとして成果を上げてもらうための、仕組みを作ったり学習機会を与えたり仕事の振り方を工夫したりする必要があるのはマネージャーの役割である。&lt;/p&gt;
&lt;p&gt;マネージャーはチームを機能させることが主題のはずなので、自身こそ代替可能な存在にしていかなければならない。各チームメンバーの個性を遺憾無く発揮し表舞台で活躍できるようにすることが重要である。&lt;/p&gt;
&lt;p&gt;チームは画一的に扱えないため、今までの経験をそのまま適用することは無理で、常に観察や興味を持ってチームメンバーと関わり、対話しながら相互理解を深めたり、才能を解放することは不可欠である。&lt;/p&gt;
&lt;p&gt;そのために必要となる能力は学習可能なものであり、マネージャーは常に業務に関するドメインのみならず、広範に及ぶマネジメントに関わる知識もキャッチアップしていかなければならない。&lt;/p&gt;
&lt;p&gt;自分は下記でいうミッションチームの EM を担っており、PdM チームは別途存在するため、PdM 領域は浅く他の領域を強化している。&lt;/p&gt;
&lt;div class=&#34;linkcard-container&#34; style=&#34;margin: var(--content-gap) 0;&#34;&gt;
            &lt;a href=&#34;https://qiita.com/hirokidaichi/items/95678bb1cef32629c317&#34; 
               class=&#34;linkcard&#34; 
               style=&#34;
                   display: flex;
                   text-decoration: none;
                   color: var(--content);
                   background: var(--entry);
                   border: 1px solid var(--border);
                   border-radius: 12px;
                   padding: 0px 0px 0px 20px;
                   transition: background-color 0.3s ease;
                   box-shadow: 0 4px 8px rgba(0,0,0,0.08);
                   min-height: 140px;
                   overflow: hidden;
               &#34; 
               onmouseover=&#34;this.style.backgroundColor=&#39;rgb(56, 56, 61)&#39;;&#34; 
               onmouseout=&#34;this.style.backgroundColor=&#39;var(--entry)&#39;;&#34;
               target=&#34;_blank&#34;
               rel=&#34;noopener noreferrer&#34;&gt;&lt;div class=&#34;linkcard-content&#34; style=&#34;flex: 1; display: flex; flex-direction: column; min-width: 0; margin-top: 20px; margin-right: 20px;&#34;&gt;&lt;div class=&#34;linkcard-title&#34; style=&#34;margin-bottom: 10px;&#34;&gt;
                        &lt;h3 style=&#34;
                            margin: 0;
                            font-size: 18px;
                            font-weight: 600;
                            line-height: 1.3;
                            color: var(--primary);
                            overflow: hidden;
                            display: -webkit-box;
                            -webkit-box-orient: vertical;
                            -webkit-line-clamp: 2;
                            line-clamp: 2;
                        &#34;&gt;
                            エンジニアリングマネージャ/プロダクトマネージャのための知識体系と読書ガイド - Qiita
                        &lt;/h3&gt;
                    &lt;/div&gt;&lt;p class=&#34;linkcard-description&#34; style=&#34;
                        margin: 0;
                        font-size: 14px;
                        line-height: 1.5;
                        color: var(--secondary);
                        overflow: hidden;
                        display: -webkit-box;
                        -webkit-box-orient: vertical;
                        -webkit-line-clamp: 2;
                        line-clamp: 2;
                        flex: 1;
                        margin-bottom: 12px;
                    &#34;&gt;
                        本記事は、Engineering Manager Advent Calenderの１日目です。 はじめに エンジニアリングマネージャ(EM)と呼ばれる職務を設置する企業が増えてきました。 私たちの主催したイベントEOF2019でも700名近い方に参加していだき、また多くの...
                    &lt;/p&gt;</description>
    </item>
    <item>
      <title>🏛️ 灯台としてのプロダクトビジョン</title>
      <link>https://nikaera.com/archives/product-vision-as-lighthouse/</link>
      <pubDate>Sat, 28 Dec 2024 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/product-vision-as-lighthouse/</guid>
      <description>&lt;p&gt;現在所属しているチームでは、トップダウンのミッションをベースとして駆動してきた側面がある。プロダクトビジョンはローコンテキストに揃っておらず、拡大する中で各セクションでサイロ化が進行している。&lt;/p&gt;
&lt;p&gt;現状を放置していると、日々アウトプットに勤しむだけのビルドトラップにハマった集団になるという危機感から、自律的にプロダクト価値を共創可能にするためのビジョンをローコンテキストに整備することとなった。&lt;/p&gt;
&lt;p&gt;現在は前述の資料を作成するためのキックオフが開催されたというフェーズなのだが、自身もコアを形作るメンバーとして携わることになった。&lt;/p&gt;
&lt;p&gt;そこで、後からプロダクトビジョンを定義するにはどうすれば良いか、またカルチャーデックや OKR のように、綺麗に作ることに満足して実運用がおざなりになりがちな問題にどう立ち向かうと良さそうか考えてみた。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;現状のプロダクト開発の状況を一旦整理してみた。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;すでにリリースされて数年以上経過している&lt;/li&gt;
&lt;li&gt;チャーンレートは低く抑えられており、一定価値は届けられている&lt;/li&gt;
&lt;li&gt;各セクションは各々の実業務に最適化されたプロセスを構築済み
&lt;ul&gt;
&lt;li&gt;プロダクトビジョンにフォーカスできているかは不明確&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;上記を鑑みると、アウトカムは一定生み出せていそうなので、プロダクトビジョンについては PO/PdM から語られる内容を、ローコンテキストに整備するだけで叩きとしては十分そうに見受けられる。&lt;/p&gt;
&lt;p&gt;サイロ化した各セクションの戦略が課題かもしれない。全体として目線が揃っていないことで、創発的な取り組みがセクションを超えて検討できず、インパクトのある打ち手が全体として出しづらい状況になっている。&lt;/p&gt;
&lt;p&gt;現状各セクションを超えて何かを依頼する時に遠慮があるのは前述課題があるからではないか。プロダクトビジョンに沿った提案ができているか不明瞭なまま他セクションに相談を持ちかけるのはハードルが高いだろう。&lt;/p&gt;
&lt;p&gt;またプロダクトビジョンが定義できたとして、内発的動機付けとなる各セクションの意思も大切にしたい。各セクションの意思とプロダクトビジョンが良い相互作用を起こし進化を遂げつつ浸透することで、プロダクトの理想にチーム全体が一丸となって向かいながら成長できると理想である。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;そこで検討した結果、まずは各チームの現状の強みやありたい姿をメンバー同士で語ってもらい言語化することが大切なのではないかと感じた。&lt;/p&gt;
&lt;p&gt;トップダウンで降りてきた内容ではなく、敢えてメンバーのプライベートやキャリア展望、自己効力感が得られる取り組みを曝け出してもらうことからチームの輪郭を象っていくイメージである。&lt;/p&gt;
&lt;p&gt;その後、メンバー全員が組織効力感を感じる戦略を描きつつ言語化し、&lt;a href=&#34;https://note.com/thorry/n/nf45ab9b7e360&#34;&gt;Will&lt;/a&gt; をコンフォートゾーンを突き抜けるほど先鋭化させたものを目的として扱う。出発点がチームとなるため自らの意思でコミットメントしやすく、目標も Will から練っていけば良いため想像が付きやすそう。&lt;/p&gt;
&lt;p&gt;チームの戦略とプロダクトビジョンを整合させる部分は、マネージャー陣が期待値調整や言葉の橋渡しをすることでカバーする。また積極的にコラボレーションのサポートを行い、セクション間での対話のハードルを下げることで、自然創発的な取り組みが生まれる空気を醸成していく。&lt;/p&gt;
&lt;p&gt;つまり、プロダクトビジョンは灯台として、チーム戦略を正す必要があるか、向かう方向の妥当性など検査する際に利用する。&lt;/p&gt;
&lt;p&gt;結果として、チームのアクションアイテムが自然とプロダクトビジョンの実現に向かう行動と紐付き、各メンバーの才能が開放された状態で日々の業務に取り組める状態になるとベストなイメージがある。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;ここまで語ってきた内容がすんなり上手くいくわけがないとは思いつつ、現状のチーム状況を見てみると実現不可能とも思わないので、一旦挑戦して知見が得られたら、また言語化して記事に残したいと思う。&lt;/p&gt;
&lt;p&gt;P.S. 書くときのムードが、朝は森、夕方は川、夜は夏の夜にすると、自分は筆が乗りやすくなることが分かってきた ✍️💨&lt;/p&gt;</description>
    </item>
    <item>
      <title>🗣️ 言い切りや断定の言葉が苦手</title>
      <link>https://nikaera.com/archives/uncomfortable-with-definitive-statements/</link>
      <pubDate>Wed, 11 Dec 2024 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/uncomfortable-with-definitive-statements/</guid>
      <description>&lt;p&gt;何かの話題を話しているときに「〜絶対になります」「〜が正攻法です」のような言い切りや断定の言葉が出てくると脳内アラートが作動してしまう。&lt;/p&gt;
&lt;p&gt;システムと向き合う際、論理主義的な姿勢を取るのは当たり前だとは感じる。ただ、対人やチームの内発的動機付けされた創発的な試みや発言に対して、ハナから経験もしていないのに詳細に外から持ってきた論理を元に事の顛末を説明されても、単に押し付けがましい態度だなと自分は感じてしまう。&lt;/p&gt;
&lt;p&gt;ネガティブケイパビリティが低くスグに解を見出そうとしてしまう態度と言っても良いのかもしれない。コミュニケーションやコラボレーションを通じて探求する態度を取らない限り、意見を受け入れてもらうことは、その解がどれだけ正しかろうとチームに乗り気な態度を取ってもらうことは難しいだろう。&lt;/p&gt;
&lt;p&gt;ソフト面を軽視してハード面で解決を試みる態度は、トップダウンで正解を降ろしてくるメンバーを頼るチーム体制になりがちで、それはケイパビリティの限界を個人に委ねている状況である。それは EM としては嫌だなーと。&lt;/p&gt;
&lt;p&gt;しかし、言い切りや断定の言葉も接頭辞に「現状のまま行くと〜」「特定のケースでは〜」「現状のチーム規模だと〜」が付いたり、「〜絶対になると思います」「〜が正攻法の 1つです」と言ってもらうだけで自分の中では一気に建設的な対話や議論ができるワードだなとなるので、脳内で変更して受け取るよう訓練していきたいなと思う。（自分が変わっていくスタイル）&lt;/p&gt;
&lt;p&gt;チームに主眼を向けた形で、メンバーの自発的なチャレンジには積極的にナッジングし学びに昇華することでチームのケイパビリティ向上に繋げ、生じた結果の責任は EM が負う感じで学びをチーム組織に蓄積貢献していきたい所存。&lt;/p&gt;</description>
    </item>
    <item>
      <title>👥 リーダーシップシフト雑感</title>
      <link>https://nikaera.com/archives/leadership-shift-thoughts/</link>
      <pubDate>Sun, 27 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/leadership-shift-thoughts/</guid>
      <description>&lt;p&gt;先ほど下記の本を読み終わって、色々と気づきがあったので書き留めておくことを目的に記事を書き始めたのだが、調査の過程で更に思考が深まったのでそれを一旦雑に書き散らしてみる。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://amzn.to/45fFORm&#34;&gt;リーダーシップ・シフト　全員活躍チームをつくるシェアド・リーダーシップ | 堀尾 志保, 中原 淳 |本 | 通販 | Amazon&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;まず記事を書くに当たり色々調査したところ、実はマネージャーのスタイルには種類が複数あり、適切に発揮することが大切であることを知った。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://jp.indeed.com/career-advice/career-development/management-styles&#34;&gt;管理職として知っておきたい7つのマネジメントスタイル | Indeed (インディード)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;またリーダーシップにも多種多様なタイプが存在しており、個人の特性によって使い分けを意識することが大事であることについても言及があった。&lt;/p&gt;
&lt;div class=&#34;linkcard-container&#34; style=&#34;margin: var(--content-gap) 0;&#34;&gt;
            &lt;a href=&#34;https://asana.com/ja/resources/leadership-styles&#34; 
               class=&#34;linkcard&#34; 
               style=&#34;
                   display: flex;
                   text-decoration: none;
                   color: var(--content);
                   background: var(--entry);
                   border: 1px solid var(--border);
                   border-radius: 12px;
                   padding: 0px 0px 0px 20px;
                   transition: background-color 0.3s ease;
                   box-shadow: 0 4px 8px rgba(0,0,0,0.08);
                   min-height: 140px;
                   overflow: hidden;
               &#34; 
               onmouseover=&#34;this.style.backgroundColor=&#39;rgb(56, 56, 61)&#39;;&#34; 
               onmouseout=&#34;this.style.backgroundColor=&#39;var(--entry)&#39;;&#34;
               target=&#34;_blank&#34;
               rel=&#34;noopener noreferrer&#34;&gt;&lt;div class=&#34;linkcard-content&#34; style=&#34;flex: 1; display: flex; flex-direction: column; min-width: 0; margin-top: 20px; margin-right: 20px;&#34;&gt;&lt;div class=&#34;linkcard-title&#34; style=&#34;margin-bottom: 10px;&#34;&gt;
                        &lt;h3 style=&#34;
                            margin: 0;
                            font-size: 18px;
                            font-weight: 600;
                            line-height: 1.3;
                            color: var(--primary);
                            overflow: hidden;
                            display: -webkit-box;
                            -webkit-box-orient: vertical;
                            -webkit-line-clamp: 2;
                            line-clamp: 2;
                        &#34;&gt;
                            11 種類のリーダーシップ徹底解説: 自分に合ったスタイルの見つけ方 [2025] • Asana
                        &lt;/h3&gt;
                    &lt;/div&gt;&lt;p class=&#34;linkcard-description&#34; style=&#34;
                        margin: 0;
                        font-size: 14px;
                        line-height: 1.5;
                        color: var(--secondary);
                        overflow: hidden;
                        display: -webkit-box;
                        -webkit-box-orient: vertical;
                        -webkit-line-clamp: 2;
                        line-clamp: 2;
                        flex: 1;
                        margin-bottom: 12px;
                    &#34;&gt;
                        令和時代の理想のリーダー像と 11 種類のリーダーシップを解説。自分に合うスタイルを理解し、チームを導く力を高めるヒントがわかります。
                    &lt;/p&gt;</description>
    </item>
    <item>
      <title>🔄 交流を図るためのふりかえり</title>
      <link>https://nikaera.com/archives/retrospective-for-interaction/</link>
      <pubDate>Sun, 27 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/retrospective-for-interaction/</guid>
      <description>&lt;p&gt;最近チーム定例のアジェンダの先頭に &amp;ldquo;ふりかえり&amp;rdquo; という項目を用意して、雑多に箇条書きで書いた内容をシェアするだけの取り組みを行なっている。それがめちゃ上手くワークしてる気がするので言語化しておく。&lt;/p&gt;
&lt;p&gt;端的に言うと下記がチーム内部で発生しているように見受けられる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;カジュアルなタスク等のシェア内容から生まれる雑談が楽しい
&lt;ul&gt;
&lt;li&gt;ウィンセッションのようなやり取りで自己効力感も増している&lt;/li&gt;
&lt;li&gt;各メンバーがお互いに興味関心を持つようになったと感じる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;雑談から相談に繋がることも多く、&lt;a href=&#34;https://kuranuki.sonicgarden.jp/archives/25159&#34;&gt;雑相&lt;/a&gt; が自然発生している&lt;/li&gt;
&lt;li&gt;リモート MTG にも関わらず、自然と全員ミュートオフで参加している
&lt;ul&gt;
&lt;li&gt;ミュートオフやリアクション推奨などのルールは一切設けていない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;カジュアルに &amp;ldquo;ふりかえり&amp;rdquo; というアジェンダを入れたのは、EM として各メンバーを定性的に評価可能なログとして残したい意図があったのだが、チームビルディングに繋がる効果があったのは意外だった。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://dhbr.diamond.jp/articles/-/11214&#34;&gt;チームメンバーの大半がリモート勤務していることも関係しているのかもしれない。&lt;/a&gt;対面でなくバーチャル上で心から対話を楽しめるようになることは自然な自己開示にも繋がり、仲間意識が強まる効果はありそう。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;このようなバーチャルな交流は、同僚のことを、より偽りがなく、人間的で、信頼できる人間だと認識させる作用があることがわかった。個人的な絆を育む上でも、仕事で協力関係を築くうえでもプラスになる資質だ。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;他のアジェンダには、&amp;ldquo;課題共有&amp;rdquo; や &amp;ldquo;雑談コーナー&amp;rdquo; など用意していたのだが、カジュアルな &amp;ldquo;ふりかえり&amp;rdquo; を用意するだけで不要になった。&lt;/p&gt;
&lt;p&gt;形式的な定例 MTG は大体システマチックになりがちで、主体的な参加を求めるのが難しいイメージがあるが、メンバー間の対話をコーディネートするイメージで開催するとマンネリ化が防げるようになるのやも。&lt;/p&gt;</description>
    </item>
    <item>
      <title>🤝 連携のための礎を築く</title>
      <link>https://nikaera.com/archives/building-collaboration-foundation/</link>
      <pubDate>Sun, 27 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/building-collaboration-foundation/</guid>
      <description>&lt;p&gt;最近働いていて、チームで動けてないという話をよく聞く。チームで動けていないということを深掘りしていくと、連携がうまく取れない旨の課題を伝えられることが多い。連携がうまく取れるとはどういうことなのか。&lt;/p&gt;
&lt;p&gt;連携自体は各職能ごとでは日常やっていることのように思う。適宜状況をシェアして協力することは、どこでもやっているだろう。ただ、&lt;strong&gt;連携のレベルを職能間で上げることは、同職種内でレベルを上げるより難しい。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;職種間でセクショナリズムが問題になることはよく聞く話である。が、最近コレが本質的な原因なのでは？と思うことが 1つある。それは、&lt;strong&gt;他の職能について興味を持てていないのでは？&lt;/strong&gt; 、と言うことである。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;例えば、業務をスムーズにするために連携したいというコンテキストが存在する中で、他チームの状況を具体的に知りたい欲求があるとする。&lt;/p&gt;
&lt;p&gt;自分たちの業務の状況は明確に把握しているため、他チームから状況を引き出したい。ただ、&lt;strong&gt;他チームとしては対話を通じて丁寧にコンテキストを共有してくれないと、一方的に頼まれていると感じるだろう&lt;/strong&gt; と思う。&lt;/p&gt;
&lt;p&gt;コンテキストは、その発端となった事柄や検討の経緯など他者が腹落ちした意思決定を行うのに必要な情報を指す。つまり、&lt;strong&gt;頼まれた側にも連携したいと感じてくれるためには、納得してもらうフェーズが必要だと思う。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;ココで他の職能に対しての興味を持っているかどうかが響いてくると感じている。&lt;/strong&gt; 一方的な視点から連携を求めたところで相手の理解は得られず、精々得られたとして、形式的な進捗連絡が行われるのが関の山だろう。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;対話を通じて興味があると相手に感じてもらい、双方が歩み寄るスタンスになって、初めて連携というワードを出すのがタイミングとしてちょうど良い気がしている。まず下地として相互理解を深めるイメージ。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;表面上の連携を行うことは無駄なプロセスを作ったり、本質的でない刹那の解決策を取ることにも繋がり、特にリーダーほど「早く問題を解決しなきゃ」と善かれと思ってやってしまいがちなことかもと感じる。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;相互理解が十分深まった上で、気を遣わずに色々と率直に話せるようになり、初めて本質的な対話が可能になるイメージがある。&lt;/strong&gt; そこからは、相互に連携を図るための議論が建設的にできるイメージがある。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;そう考えると&lt;strong&gt;チームで仕事をするレベルを上げていく最も初期段階に必要なのは、気を遣わずに話すための土台を構築することなのかもしれない。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ワイワイ話せるだけではなく、気を遣わずに相互に率直に感情や意見が吐き出せる状態を、連携可能な状態だと認識しておきたい。&lt;/strong&gt; 結局、相互理解のための努力を怠らない事が大事ということなのかも。&lt;/p&gt;
&lt;p&gt;P.S. 所謂、心理的安全性で言われることだなーと見返して思ったけども、連携を図る上で最初期に行うべきフェーズとして見落としがちやも。&lt;/p&gt;</description>
    </item>
    <item>
      <title>👴 おじいちゃん子</title>
      <link>https://nikaera.com/archives/grandfather-memories/</link>
      <pubDate>Sun, 20 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/grandfather-memories/</guid>
      <description>&lt;p&gt;&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/iZB%5FCKLvN6c?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

&lt;br/&gt;
ふと ↑ を久しぶりに聞いて、亡くなったおじいちゃんのことを思い出している。&lt;a href=&#34;https://ja.wikipedia.org/wiki/Fantome&#34;&gt;Fantom&lt;/a&gt; が出てから 1年後におじいちゃんは亡くなった。&amp;ldquo;道&amp;rdquo; は亡くなる直前のお見舞いを毎日していた頃から何度も聞いていた思い出深い曲である。&lt;/p&gt;
&lt;p&gt;おじいちゃんが亡くなる直前は何も考えたくなくて、夜に音楽を聴きながら無限に散歩していたことを思い出す。歩きながら思い出を振り返り、散歩しながらずっと泣いていた。(すれ違った人からすれば恐怖だったかもしれない&amp;hellip;w)&lt;/p&gt;
&lt;p&gt;社会人になって、おじいちゃんからは定期的に電話を貰っていた。直接会って話す機会は、社会人になってからは稀な状況だった。&lt;/p&gt;
&lt;p&gt;月並みだが、今思うと直接会う機会を設けたり、一緒に温泉旅行とか行って色々恩返ししたかったな。&lt;/p&gt;
&lt;p&gt;大切な思い出や当時の思いを書き残しておくことで、おじいちゃんに対する想いの供養に繋がりそうだなと思ったので、つらつらと雑に文章で残してみる。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;自分は幼い頃から兄弟の中でも特に祖父に可愛がられていた。幼い頃はよく仕事のトラックに乗せてもらって、道中のコンビニで必ず欲しいものを買ってもらっていた。今でも毎度コーヒー牛乳を買ってもらってたことを思い出す。&lt;/p&gt;
&lt;p&gt;おじいちゃんの家に行くと毎回必ずジャガイモのお味噌汁を作ってくれた。しょっぱい味付けが凄く好きだった。そのことをおじいちゃんに伝えたら、家に行くたびに作ってくれるようになったのだ。&lt;/p&gt;
&lt;p&gt;小学生の頃はゲームやおもちゃはなんでも買ってくれた。手を繋ぎながら地元のシータというゲームショップに通った思い出や、当時の店内の詳細な様子など今でも思い出せる。おじいちゃんに何かを頼んで断られた記憶は一切ない。&lt;/p&gt;
&lt;p&gt;ゲームを買ってもらった後はおじいちゃんの家で夢中になって遊んでいた記憶がある。五時を超えても遊んでいると親からおじいちゃんに電話があった。まだ遊び足りない時は親に泊まって行くとよく伝えて、実際に泊まっていた。&lt;/p&gt;
&lt;p&gt;親は何故かおじいちゃんのことが気に入らない様子だった。悪態を吐いたり、キツく当たることも多かった。親とおじいちゃんが一緒の場にいる時は物凄く辛かった記憶がある。いたたまれない気持ちが抑えられず心を無にしていた。&lt;/p&gt;
&lt;p&gt;こんな優しいおじいちゃんに対して、強く攻撃する言動が親から出るのを見るのは耐え難く、よく自分の部屋に避難したことを覚えている。その後知ったのだが、実はおじいちゃんは僕以外には厳しく当たるエピソードが多々あった。&lt;/p&gt;
&lt;p&gt;しかし、僕にとっては優しいおじいちゃんだったので、よく親に不快だから攻撃的な言動は止めてくれと言った覚えがある。その時は「あなたは特別おじいちゃんから大切にされてるもんね、ごめんね」と言われたことも覚えている。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;高校生で引きこもり気味になった時は、よく「コンビニに行くけど何か買ってくるものはあるか？」と聞いてくれた。「何もないよ、大丈夫」と言っても、おにぎりやサンドイッチを必ず買ってきてくれていたことを思い出す。&lt;/p&gt;
&lt;p&gt;今思うと色々気にかけてくれていたんだろうなと思う。学校に行く時は家を出る前に「お金はあるか？」とよく聞かれた。あるよと言っても何かあった時のためにと、五千円もくれていた。お金は使わずにずっと貯めていた。&lt;/p&gt;
&lt;p&gt;大学生になってアルバイトを始めてからも上記は変わらなかった。その後地元が大嫌いだった僕は社会人になった直後に引越し先を決め、一人暮らしを始める。当時そのことを切り出した時は親が家を出るのを止める中、おじいちゃんは何も言わず普段通り接してくれていた。&lt;/p&gt;
&lt;p&gt;今は子供が二人いる身だから分かるが、気にかけている子供が一人暮らしを始めると言い出したら、止めるまでは行かなくても何か言っておきたい事の一つや二つくらいありそうだ。しかし、おじいちゃんからは何も聞かなかった。&lt;/p&gt;
&lt;p&gt;おじいちゃんは定常的に具合が悪くなっても、稀に実家に帰ることがあると、必ず自分の部屋から出てきて僕と会話をしてくれた。その度に親はおじいちゃんに対して「大丈夫か？」と聞いていた。&lt;/p&gt;
&lt;p&gt;親に聞いたところ、関節が痛く歩くのも相当辛い状況なのに愚痴一つ吐かず部屋から出てくるのは、僕が実家に戻ってきた時だけとのことだった。嬉しかったが、同時におじいちゃんに辛い思いをさせている罪悪感があった。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;時間も経ち、そんな事が何度かある中、おじいちゃんが仕事中に倒れたという連絡が来た。脳出血とのことで、命に危険があるのですぐに来て欲しいと言われ、仕事を抜けて病院にタクシーで向かったことを覚えている。&lt;/p&gt;
&lt;p&gt;到着してから病室で対面した時の衝撃は今でも覚えている。いつも優しく接してくれていて普段と変わらなかったおじいちゃんが、良くテレビで見る危篤な状態の様子になっているのを見て、悲しみよりも虚無が襲ってきた。&lt;/p&gt;
&lt;p&gt;病室に到着してからは家族が、一番関係の深い僕が一対一でおじいちゃんと同じ空間に居られるようにと、病室から出てくれた。&lt;/p&gt;
&lt;p&gt;しばらくおじいちゃんはずっと目を閉じていたのだが、一瞬だけ目を開けてくれた。その時に目があったのだが、自分と目が合うと目を見開いて手をこちらに差し伸ばしてくれた。&lt;/p&gt;
&lt;p&gt;本当はその時にこちらからも手を伸ばすべきだったのだが、自分は情けないことに目を逸らして目を瞑ってしまった。今思うとおじいちゃんの死を認めたくなかったのと、涙を見せたくないという思いでそうしてしまったのだと思う。&lt;/p&gt;
&lt;p&gt;その後泣くのが落ち着きおじいちゃんを見ると、辛そうな顔で寝ていた。どう言った感情だったのかは分からないが、自分の取った行動に絶望してしまったのだとしたら本当に申し訳ないことをしてしまったなと思った。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;そこからはとても早かった。毎日面会時間目一杯通っていたが、五日後には病院の先生から緊急で呼び出されて、最後の時間と宣告された。親は仕方が無いねと、穏やかにその様子を見守っていた。&lt;/p&gt;
&lt;p&gt;その瞬間が来たときはもちろん泣いた、が、病室で最初に対面した時よりは泣かなかった。恐らく毎日面会して帰宅後泣いてたことに加えて、ある程度準備が出来てたからだろう。物心ついてから初めて身近に死を感じた瞬間だった。&lt;/p&gt;
&lt;p&gt;その後、法要を済ませた後は、すぐに仕事に復帰した。何故ならおじいちゃんだったら、ずっと自分のことで悲しまずに自分の人生を生きて欲しいと言うだろうなと思ったからだ。今までの接し方から、なんとなくそう感じた。&lt;/p&gt;
&lt;p&gt;できればおじいちゃんには結婚したり、子供が出来るまで生きてて欲しかったな。今まであまり良い姿が見せられなかったので、重要なライフイベントを親よりも見てて欲しかった。ただそれは自分の祈りに近いエゴであると感じる。&lt;/p&gt;
&lt;p&gt;自分はおじいちゃんから多大な影響を受けている。人に優しくあろうとしたり、自分がされて嫌なことは絶対にしないとかは、その典型である。&lt;/p&gt;
&lt;p&gt;そう言った特性は子供達にも受け継いでいきたいなと思うが、おじいちゃんは「そんなことしなくて良いよ」とか言いそうだな。&lt;/p&gt;</description>
    </item>
    <item>
      <title>👶 育児エンジニアの学び</title>
      <link>https://nikaera.com/archives/parenting-engineer-learnings/</link>
      <pubDate>Sun, 13 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/parenting-engineer-learnings/</guid>
      <description>&lt;p&gt;突然だが刃牙という漫画に郭海皇という人物がいる。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;真なる強さを求めて独自に『理合』の鍛錬を重ね、気の遠くなるような月日の中、&lt;strong&gt;これまでの自身の強さの象徴にして結晶であった自慢の鋼の肉体が衰えていく絶望に耐えながら、ひたすら研鑽を積み重ねるという人生を歩み、現在に至る。&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;上記は仕事に言い換えると、&lt;strong&gt;仕事にアイデンティティや楽しさを感じるほど積極的に取り組んでいた人が、強い制約の中持続可能な仕事への取り組み方にシフトするようなものだと感じている。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;自分はまさに上記の状況に当てはまるエンジニアなのだが、どのように足掻きながらシフトしていったのかを、自らの記憶ために書き記していく。&lt;/p&gt;
&lt;h2 id=&#34;前提&#34;&gt;前提&lt;/h2&gt;
&lt;p&gt;家庭環境はご家庭によって千差万別なため僕の環境を前提として記してみる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;共働きでお互いフルリモートの環境で働いている&lt;/li&gt;
&lt;li&gt;育児家事の分担は、大体育児を僕がやって家事は奥さんがやっている
&lt;ul&gt;
&lt;li&gt;平日は朝と夕方までの家事を行なっている&lt;/li&gt;
&lt;li&gt;↑ は仕事の状況によってはできないこともある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;休日は家族で過ごしている
&lt;ul&gt;
&lt;li&gt;基本的には子供が楽しいと思える時間が過ごせるように頑張ってる&lt;/li&gt;
&lt;li&gt;故に休日・祝日・連休の方が体力を消耗しがちで疲れる…w&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;平日は基本 10:00-16:30 の間だけが全力で働ける時間（コアタイム）
&lt;ul&gt;
&lt;li&gt;夫婦間の合意事項として、子供達が寝るまでは個人行動は無し&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;子供は 3歳と 2歳と 0歳がいる
&lt;ul&gt;
&lt;li&gt;第三子は言わずもがな睡眠は安定せず、第二子は暴れ盛りで、第一子は生活リズムが安定してきている感じ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;夫婦共々両親はお互いに未だ現役で働いている
&lt;ul&gt;
&lt;li&gt;そのため、親を頼るだとか預けるだとかのムーブは不可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;学び&#34;&gt;学び&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;基本姿勢として、一旦全てを捨てさることが超重要だった&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;最初の 1年くらいはもがいていたが、途中から全てを投げ捨てた&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;何かにチャレンジするとか、余暇で遊ぶとか勉強とか不可能だった&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;独身時代の習慣を持ち込もうとすると、全て家庭トラブルに繋がった&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;習慣を捨てるのはメチャ難かったが、意識的に捨てた&lt;/li&gt;
&lt;li&gt;育児が始まったら、熱中できる趣味も捨てざるを得なくなった&lt;br&gt;
- 一人で没頭してやる趣味とかは育児始まったら不可能だった&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;新たな日常に体を慣らすことに全力で意識を傾けた&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;体と心が新たな生活に馴染んでくるまでは何も考えなくて良かった&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;育児やってると勝手に筋肉とか体力とかも時間経過で付いてきた&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;仕事はほどほどで、家庭に全振りでバランス的にはちょうど良い&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;育児が始まると家庭が戦争になるので、仕事に全力になるのは無理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;仕事を頑張りたいっていう人ほど辛いのは分かるが、耐えた方が良い&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;仕事で自分が居なくても問題無い状態を、本気で自分事で捉えられる&lt;/strong&gt;&lt;br&gt;
- 結果メチャ自分のレベルが上がった実感が得られた（仕組み化）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自分が頑張らなきゃ、で踏ん張ると色々積む（夫婦の時間も取れない）&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;夜に頑張れば良いやとか、夜に遅れを取り返せば良いやの考え方は終わる&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;仕事が溜まってようが、眠くなったら絶対に寝るのを優先した方が良い&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;仕事の評価とかどうでも良い、夜眠い場合は仕事を捨てて寝る&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;低年齢の子ほど寝かしつけに成功したら、一緒にそのまま寝る&lt;/strong&gt;&lt;br&gt;
- 深夜に起きまくるので、寝れる時に回復するために寝る心算で&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;朝眠い状態を迎えてしまうと、その日一日をドブに捨てることになる&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;独身なら色々融通効かせられるが、育児中は融通が効かせられない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;一日のうちに何かしら自分の時間が取れて、趣味・勉強とかできたら偉業
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;早朝 ~ 始業時間にかけてやりたいことやる習慣をつける&lt;/strong&gt;&lt;br&gt;
- &lt;strong&gt;育児中は早朝 ~ 始業時間以外の時間帯は不確定要素が多すぎて、やりたいことはほとんど出来ないと言っても過言ではない&lt;/strong&gt;&lt;br&gt;
- 夜型の人も、半強制的に朝型になるので朝に活動の比重を傾ける&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;色々な事柄で楽することに全力を傾ける&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;育児家事仕事全般で楽することに全力を傾けることが結果良い&lt;/li&gt;
&lt;li&gt;色々楽に対応可能になってくると、今現在に意識も傾けやすくなる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;結論&#34;&gt;結論&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;良い意味で脱力して手が抜ける状況を色々地道に作り続けていく&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;育児は長期に渡って行うため、持続可能な思考や仕組みを作る&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;本当の自分とか意識しない、持続可能じゃない要素は全て捨て去る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;家庭環境はそれぞれで全く異なるので他の家庭ではとか考えない&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;あの人は育児中なのに色々出来ててすごいとか考えなくて良い&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自然体で生活が出来、気力が湧いて、初めて自分のための行動で全然良い&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;仕事よりも家庭の方が大切&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;家庭は一度崩れたら立て直すのが大変すぎる&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;取り返しが付かなくなるリスクもある（特に育児関連は揉めやすい）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;仕事はどうとでもなると思うが、家庭は無理なため全力でコミットする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;やりたい事も何もかも捨ててくと、セルフコントールできるようになる&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;そうなると何が起きようが、対して精神力を削られずに済むようになる&lt;/li&gt;
&lt;li&gt;自分がやろうとしていたことが中断されようが何も感じなくなってくる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;育児奮闘中から日常になるまでの学びを書いてみたが、改めて思い返すと総じて無理をするなっていう感じだな。あの人はできているのに、あの人は凄い仕事ができるしコミットできてるのに、とかも当初はめっちゃ思ってたなー。&lt;/p&gt;</description>
    </item>
    <item>
      <title>💬 即時性の無いコミュニケーションも大切にしたい</title>
      <link>https://nikaera.com/archives/asynchronous-communication-value/</link>
      <pubDate>Sat, 12 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/asynchronous-communication-value/</guid>
      <description>&lt;p&gt;自分は同期的コミュニケーションが苦手だ。対話を行う際のリズムが他者と比較して遅いので、その場で満足の行くコミュニケーションが取れたことは今までのことを思い返してみても無い。&lt;/p&gt;
&lt;p&gt;同期コミュニケーションは基本的に始めた側のリズムに合わせることが多く、それに合わせる形で相互に気持ちを通わせることが目的であると感じる。&lt;/p&gt;
&lt;p&gt;そこにはバンドセッションのような、空気に合わせてみんなで作品を作り上げる感覚がある。その場で満足できる時間を作ることが主目的だと感じる。（もちろん、それはそれでかけがえの無い時間であると感じる）&lt;/p&gt;
&lt;p&gt;ただ&lt;strong&gt;深く相互理解を行いたいと考えたときに、全体のリズムを重視したバンドセッションのようなコミュニケーションは辛いと感じてしまう。相手のことを深く考えて洞察するための時間が無いから。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;その点、心境やプロセスを綴りながら書く文章でのやり取りはすごく好きだ。ただそれは軽量なチャットのようではなく、重厚な手紙のような文章である。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;言語化し推敲や内省のプロセスを経た内容を見返してみると、相互理解以前に自身への深い理解に繋がることが多々ある。それを元にしたコミュニケーションができると、相互に意識的に心の対話ができる感覚がある。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;自身の理解を経たコミュニケーションができた時の満足度は非常に高く、言いたいことが本当に言えた感覚が得られる。それは、&lt;strong&gt;自分の発言でさえ、本来深く洞察しなければ理解ができないものなのであろうと感じる。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;そうなると他者への理解が容易で無いことも想像が付きやすくなり、他者とのコミュニケーションの際にレッテルを貼らなくて良くなるなと感じる。&lt;/p&gt;
&lt;p&gt;つまり、&lt;strong&gt;自分が苦手であると感じる人物に対して不快感の前に、理解が足りないなという自覚に至りやすく、自分のような内向的な人間にコミュニケーションの戦闘力を授けてくれるような感覚がある。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;そう考えると、&lt;strong&gt;自分のような即時性のあるコミュニケーションが苦手と感じる人たちには是非文章を、クオリティなど度外視で書いてみて欲しいと感じる。&lt;/strong&gt; （僕がそういった人たちの思考や文章をとても読みたいのもあるが&amp;hellip;w）&lt;/p&gt;
&lt;p&gt;そもそも&lt;strong&gt;散文的に文章を書くことは、とても創造的な作業で楽しいと、今この文章を書いていても心から感じる&lt;/strong&gt;。 最近は全く文章が書けてなかったけども、これからはボチボチ再開していこうかな。&lt;/p&gt;
&lt;p&gt;P.S. &lt;a href=&#34;https://note.com/akatuki%5Fnome/n/n81e70c94d519&#34;&gt;しずかなインターネット&lt;/a&gt;のように散文的に文章が書けて、似たような人たち同士で偶発的に閉じた交流ができるようなアプリとかって無いのかな&amp;hellip;w&lt;/p&gt;</description>
    </item>
    <item>
      <title>📝 リスペクトの欠如が及ぼす自己効力感の喪失</title>
      <link>https://nikaera.com/archives/respect-and-self-efficacy/</link>
      <pubDate>Sat, 12 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/respect-and-self-efficacy/</guid>
      <description>&lt;p&gt;他者の行動や判断、決断に不満を持つことは誰しもがあると思う。僕がそう感じた時に大切にしているのが、結論までのプロセスを聞くということだ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;プロセスを可視化し理解することで相手の思考軸を具体的に捉えることができ、受け入れることが出来ずとも、納得できるようになるからだ。納得ができればモヤモヤが晴れた状態で建設的な議論が行えるようになる。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;ただ&lt;strong&gt;個人的には納得できるだけではダメで、相手と中長期的に関係性を気づいていく上では、リスペクトに至るまでが非常に大切だと感じる。&lt;/strong&gt; リスペクトまで至れない場合は、自らリスペクトできる点を積極的に探すべきだと思う。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;対話を積極的に行いコンテキストを深掘りし、自らに無い視点や知り得なかった制約に気づくことで、リスペクトが抱けるようになることは案外結構ある。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;何故理解だけでなくリスペクトまでが大事だと考えているかというと、&lt;strong&gt;人は感情を無視して論理だけでは持続的な行動ができないと考えているからだ。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;例えば、上長の決断で進める施作に反対の立場だが、仕事上強くコミットせざるを得ないとする。その場合&lt;strong&gt;リスペクトがあれば、自分の取れうる手段でこの人に貢献せねばという理解からの行動に繋げられると思う。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;自分の知らない分野での専門性に対してもリスペクトが持てれば、相互に力が発揮できる形での協力体制について想いを巡らせることもできるだろう。&lt;/p&gt;
&lt;p&gt;もし&lt;strong&gt;リスペクトが無ければ、自分の方が上手くやれる自信があるのにと、感情が思考を阻み行動が思うように実行できないだろうなと感じる。結果として、本人の能力を最大限に発揮することは難しくなるだろうなと。&lt;/strong&gt; 少なくとも持続的な行動や協力するための行動は難しくなりそう。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;頭ではリスペクトが必要だと理解しているのに感情が伴わない場合や、自身の能力に自信がある人ほど、特にこの状況に陥りやすいと感じる。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;リスペクトが無いコミュニケーションというのは、案外色んな部分で本人の意図しない形で表出していて、それは結構外から見られていることがある。&lt;/p&gt;
&lt;p&gt;そうなると、&lt;a href=&#34;https://dev.classmethod.jp/articles/disagree-and-commit/&#34;&gt;&lt;strong&gt;Disagree and commit&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;の姿勢で物事に取り組んでいても、時間と共に相互の信頼関係にズレが生じてきてしまい、どちらかが無理をするか回避行動を取ってしまうだろうなという感覚がある。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;それらを補うほどのインセンティブがあれば別だが、相当なプレゼンスがある人で無い限り、そういった機会が与えられることは一般的には無いと思う。&lt;/p&gt;
&lt;p&gt;ここで&lt;strong&gt;一番厄介になるのが、自己効力感の喪失である。自己効力感は幸せに直結する要素の 1つであると考えているので、ここの主導権は失いたくない。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;リスペクトの欠如がなぜ自己効力感の喪失に繋がると感じるかというと、周囲から理解の姿勢を得ることが難しくなり、孤立に繋がる点が挙げられる。&lt;/strong&gt; 対話の気力すら失ってしまうことに繋がり、悪循環が生まれるイメージ。&lt;/p&gt;
&lt;p&gt;一度孤立してしまうと、周囲と繋がるためのコストが不必要に増大してしまい、信頼関係回復のために疲弊してしまいそうだなと感じる。もしくは時期尚早な回避行動を取ってしまいチャンスを逸してしまう懸念もありそうだなと。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;ただし、&lt;strong&gt;自分の軸と照らし合わせた時に、どう頑張ってもリスペクトが全く持てない場合もあると思う。その場合は潔くその場を離れる判断をした方が良いと感じる。それは自分のためであると同時に相手のためにもなるだろう。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;しかしそれは最終手段である。&lt;strong&gt;自身の今後を思えばこそ、異質な人とも支え合えられるような関係性が築けるようなスキルを身につけることは重要である。&lt;/strong&gt; それを具体に言語化すると、リスペクトなのであろうと帰結する自分がいる。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;リスペクトが意識的に持てるスキルを身につけることは、多様性を認めた上で、自身の欠点を客観的に見られるスキルの言い換えなのかもしれない。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;ちなみに僕は音楽が大好きなのだが、たまに全く普段聞かないようなジャンルを意識的に聴き始めることがある。最初は嫌いだと感じていたものも挑戦したりする。すると不思議なことに「あ、今だと聴けるな」となることがある。&lt;/p&gt;
&lt;p&gt;そこからジャンルを深掘りすることで、確立された背景なども知ることができ、普通に音楽を聴く以上に感慨深い体験を得ることができたりする。&lt;strong&gt;リスペクトとは興味の幅を押し広げるスキルとも言えるのかもしれない。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;論理的な思考が先行している人でも、リスペクトがスキルだと言われれば、案外容易に様々な人たちに対してリスペクトが抱けるようになりそうだなと感じる。&lt;/strong&gt; いわゆる &lt;a href=&#34;https://en-ambi.com/itcontents/entry/2017/12/20/110000/#HRT%E3%81%A3%E3%81%A6%E5%85%A8%E5%93%A1%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%82%E3%81%AE&#34;&gt;HRT&lt;/a&gt; と呼ばれるスキルセットとも呼べるのかもしれない。&lt;/p&gt;
&lt;p&gt;そう考えると、&lt;strong&gt;リスペクトはシンプルに自身の可能性や自己効力感を高めるために身につけた方が幸せになりそうだなと感じるし、引いては周囲に対して幸福を与える人になれる可能性を秘めた素敵なものだな&lt;/strong&gt; と感じてきた&amp;hellip;w&lt;/p&gt;</description>
    </item>
    <item>
      <title>📔 2021年の振り返り</title>
      <link>https://nikaera.com/archives/summarize-2021/</link>
      <pubDate>Fri, 31 Dec 2021 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/summarize-2021/</guid>
      <description>&lt;h1 id=&#34;はじめに&#34;&gt;はじめに&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;本記事のカバー画像は &lt;a href=&#34;https://pixabay.com/users/sasint-3639875/&#34;&gt;sasint&lt;/a&gt; による &lt;a href=&#34;https://pixabay.com/photos/achieve-woman-girl-jumping-running-1822503/#content&#34;&gt;Pixabay&lt;/a&gt; からの画像です。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;今年は良くも悪くも変化のあった年でした。&lt;strong&gt;特に 1 月から暗雲立ち込めすぎて終わった&amp;hellip;と思ってたことを思い出しました。。ｗ&lt;/strong&gt; 来年の自分が今を振り返れるように、今年始めからの記憶を引っ張り出しながら総括しました。ただ今年の初めの方の記憶については大分薄れていて覚えてる限り記す感じで。。&lt;/p&gt;
&lt;p&gt;今年問わず作ったものは &lt;a href=&#34;https://nikaera.com/tech/&#34;&gt;Tech&lt;/a&gt; ページに、技術記事については &lt;a href=&#34;https://nikaera.com/rss_feeds/&#34;&gt;RSS Feeds&lt;/a&gt; にまとめてあります。&lt;/p&gt;
&lt;h1 id=&#34;出来事&#34;&gt;出来事&lt;/h1&gt;
&lt;h2 id=&#34;1-月&#34;&gt;1 月&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;400 万をドブに捨てることとなる (詳細についてはいつかアウトプットしたい)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;諸々人生を真剣に考え始めるキッカケとなる&lt;/li&gt;
&lt;li&gt;ただそんな中でも自費で M1 Mac mini を購入していた&amp;hellip;w&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Rust 入門のため &lt;a href=&#34;https://actix.rs/&#34;&gt;Actix Web&lt;/a&gt; で &lt;a href=&#34;https://gyazo.com/&#34;&gt;Gyazo&lt;/a&gt; の利用者向けウェブアプリ作ってた
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/nikaera/bloggimg&#34;&gt;Bloggimg&lt;/a&gt; ってやつで知見を &lt;a href=&#34;https://zenn.dev/nikaera/articles/cookie-rust-actix-web&#34;&gt;記事&lt;/a&gt; として残してた&lt;/li&gt;
&lt;li&gt;Bloggimg をデプロイした際に得た知見は &lt;a href=&#34;https://zenn.dev/nikaera/articles/aws-lightsail-containers-rust-actix-web&#34;&gt;この記事&lt;/a&gt; で残してた&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;得た知見は記事として残す行動が習慣化してきた&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;2-月&#34;&gt;2 月&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;テックブログを &lt;a href=&#34;https://vercel.com/&#34;&gt;Vercel&lt;/a&gt; 上に &lt;a href=&#34;https://github.com/catnose99/team-blog-hub&#34;&gt;Team Blog Hub&lt;/a&gt; 使って開設した
&lt;ul&gt;
&lt;li&gt;その際の知見を &lt;a href=&#34;https://zenn.dev/nikaera/articles/vercel-github-actions&#34;&gt;この記事&lt;/a&gt; でまとめてた&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;3-月&#34;&gt;3 月&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;仕事で初めて &lt;a href=&#34;https://gatling.io/&#34;&gt;Gatling&lt;/a&gt; を使った
&lt;ul&gt;
&lt;li&gt;その際の知見を &lt;a href=&#34;https://zenn.dev/nikaera/articles/gatling-multiuser&#34;&gt;まとめた記事&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;当時を思い出すと手触りは悪くなかったし、出力されるレポートも見やすかったけど &lt;a href=&#34;https://k6.io/&#34;&gt;k6&lt;/a&gt; + &lt;a href=&#34;https://grafana.com/&#34;&gt;Grafana&lt;/a&gt; のほうが慣れればカスタマイズ性も含めて良い印象&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Zenn の記事を DEV に共有するための GitHub Actions を開発してた -&amp;gt; &lt;a href=&#34;https://zenn.dev/nikaera/articles/sync-zenn-with-dev-action&#34;&gt;sync-zenn-with-dev-action&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;DEV のアカウント作ってたけど全く使っていなかったので有効活用のためクロスポストできるようにしたいがモチベだった気がする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;負荷テスト対策のためのアレコレを記事にまとめていた
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://qiita.com/nikaera/items/ad65a05e8f7c4950f30e&#34;&gt;[Tips] Jest で private readonly な値をモックする方法 - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://qiita.com/nikaera/items/a7d65e9fcae20a42123a&#34;&gt;📔 PlayFab の API 制限に引っかかった - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://azure.microsoft.com/ja-jp/&#34;&gt;Azure&lt;/a&gt; + &lt;a href=&#34;https://azure.microsoft.com/ja-jp/services/playfab/&#34;&gt;PlayFab&lt;/a&gt; で初めて開発したけど、それなりに落とし穴にハマったりコンソールが個人的に見辛かったりしてマイクロソフトェ&amp;hellip; になってた記憶&amp;hellip;w&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;4-月&#34;&gt;4 月&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Twitter DM や Lapras でちゃんとしたメッセージをいただけるようになり転職を意識し始める
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;自分の技術者としての能力が外の世界で本当に通用するのか、試したくなってきた時期だった気がする&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;個人的にも気になっていた企業様からメッセージいただけたりした感じで嬉しかった&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;技術教材を作ってみないかのお誘いが Twitter DM で来てた&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;めちゃくちゃしっかりと記事を見てくださって感想をいただけたのと、ドキュメント作成能力は今後絶対に向上させたいスキルの 1 つだったので、受けさせていただくことに決めた&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://skream.jp/news/2021/04/porter_robinson_secret_sky_festival.php&#34;&gt;SecretSky&lt;/a&gt; を VR で見てめっちゃ盛り上がってた&lt;/li&gt;
&lt;li&gt;人生初の履歴書作成が数年分の経歴が溜まっていたので、めちゃくちゃ大変すぎて疲れ果てていた
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;転職の意思がなかったとしても定期的に経歴の欄を更新していくことを決意&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;5-月&#34;&gt;5 月&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://game.ci/&#34;&gt;GameCI&lt;/a&gt; で Unity の CI 環境構築してみてた
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://zenn.dev/nikaera/articles/unity-gameci-github-actions&#34;&gt;この記事&lt;/a&gt; に知見まとめてた&lt;/li&gt;
&lt;li&gt;大規模プロジェクトでは GitHub Actions で GameCI 使うときは、&lt;a href=&#34;https://docs.github.com/ja/actions/hosting-your-own-runners/about-self-hosted-runners&#34;&gt;セルフホストランナー&lt;/a&gt; 必須だなと感じた&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;転職することを決意し、転職先が決まり 8 月から働けることになる&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;転職のための作業に時間を割きたくなかったことと、最初から興味がそそられるオファーを色々いただけたのでスグに決められた&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;6-月&#34;&gt;6 月&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;転職することを会社にご報告した
&lt;ul&gt;
&lt;li&gt;大学生の頃からの関わりも含めると 10 年近く期間があるのでめちゃくちゃエモくなった&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;自分の技術研鑽のサイクルが確立してきたので、&lt;a href=&#34;https://nikaera.com/archives/improve-skills-without-stress/&#34;&gt;記事&lt;/a&gt;として残しておいた
&lt;ul&gt;
&lt;li&gt;会社の同僚に感銘を受けて真似すると言われてめっちゃ嬉しかった&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;諸々仕事も落ち着いた段階だったけど、引き継ぎ項目が多かったので 2 ヶ月後の 8 月から転職先で働かせていただくことになる&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;7-月&#34;&gt;7 月&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://ja.enderlilies.com/&#34;&gt;エンダーリリーズ&lt;/a&gt; にハマり倒してプラチナをゲットする&lt;/li&gt;
&lt;li&gt;有給休暇で 1 ヶ月休んでたけど、パートナーに開発の勉強を教えててほぼ自分の時間はなかった&amp;hellip;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;あと長期休暇を取ってみて、今度もしまたそういった機会があったら半年くらい休みたいなと思った&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;8-月&#34;&gt;8 月&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;転職先で仕事が始まる&lt;/li&gt;
&lt;li&gt;Unity + OAuth2.0 関連をやり始める&lt;/li&gt;
&lt;li&gt;モバイルアプリでセキュアに情報を保存するための知見を &lt;a href=&#34;https://zenn.dev/nikaera/articles/unity-ios-android-secret-manager&#34;&gt;記事&lt;/a&gt; で残してた&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;9-月&#34;&gt;9 月&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;API インフラバックエンド関連をやり始める&lt;/li&gt;
&lt;li&gt;ステートフルなインフラバックエンドをやり始める
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;大規模なステートフルなインフラバックエンド関連の経験が皆無だったので新鮮で楽しいになる&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ロストジャッジメントにハマり倒す。ストーリーもめっちゃ好きでプラチナを取る&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://www.educative.io/&#34;&gt;educative&lt;/a&gt; で教材を書かないかお誘いが来てめちゃくちゃビビる&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;現在進行形で教材書いてることもあり、今回は受けないことに決めた&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;10-月&#34;&gt;10 月&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Unity + OAuth2.0 関連が一旦落ち着く&lt;/li&gt;
&lt;li&gt;とにかくステートフルなインフラバックエンド関連やってた
&lt;ul&gt;
&lt;li&gt;想定利用者数が想像より桁違いに多かったので色々焦りながら勉強しまくりの日々を過ごす&lt;/li&gt;
&lt;li&gt;早々に負荷テストのクラウド環境を整備して開発の度に回してパフォーマンス計測したりしてた&lt;/li&gt;
&lt;li&gt;インフラのみならずアプリケーション開発も並行して担当していたため、シームレスに開発が進められたのは良かったが、やること多すぎワロタ状態に突入&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;11-月&#34;&gt;11 月&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;我武者羅にステートフルなインフラバックエンド関連やってた
&lt;ul&gt;
&lt;li&gt;おかげでスケールイン・アウトから監視、諸々含むシステムの安定性向上がようやく安心できるレベルまで持っていけた&lt;/li&gt;
&lt;li&gt;知見をメモる時間ももったいないになってしまったので、とりあえず諸々 &lt;a href=&#34;https://www.notion.so&#34;&gt;Notion&lt;/a&gt; に書きなぐってた&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;12-月&#34;&gt;12 月&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;今まで培った知見を何もアウトプットしていないことに気づき焦る
&lt;ul&gt;
&lt;li&gt;来年から頑張ろうになる (えっ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;とりあえずアドベントカレンダーには参戦した
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://zenn.dev/nikaera/articles/aws-ecs-fargate-amp-grafana&#34;&gt;ECS Fargate のメトリクスを Prometheus Agent 使って AMP に送って Grafana で監視する&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;4 月から進めていた技術教材の初稿ができて推敲しまくりステータスに入る&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;おわりに&#34;&gt;おわりに&lt;/h1&gt;
&lt;p&gt;今年は割と波 &amp;amp; 緩急のあった 1 年でした。来年は今年の変化を形にしつつものにしていく感じで行きたいです。記事にできそうな技術ネタもめっさ溜まってるので放出しまくりたいです。強めのエモネタもいくつかあるので、良さげなタイミングで放出したいです。&lt;/p&gt;</description>
    </item>
    <item>
      <title>📔 ECS Fargate のメトリクスを Prometheus Agent 使って AMP に送って Grafana で監視する</title>
      <link>https://nikaera.com/archives/aws-ecs-fargate-amp-grafana/</link>
      <pubDate>Sun, 05 Dec 2021 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/aws-ecs-fargate-amp-grafana/</guid>
      <description>&lt;h1 id=&#34;はじめに&#34;&gt;はじめに&lt;/h1&gt;
&lt;p&gt;この記事は &lt;a href=&#34;https://qiita.com/advent-calendar/2021/aws&#34;&gt;AWS Advent Calendar 2021&lt;/a&gt; の 5 日目の記事です。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://aws.amazon.com/jp/fargate/&#34;&gt;Fargate&lt;/a&gt; で Node.js アプリのメトリクスを &lt;a href=&#34;https://prometheus.io/blog/2021/11/16/agent/&#34;&gt;Prometheus Agent&lt;/a&gt; をサイドカーコンテナとして動かして、&lt;a href=&#34;https://aws.amazon.com/jp/prometheus/&#34;&gt;Amazon Managed Service for Prometheus (AMP)&lt;/a&gt; に送信して &lt;a href=&#34;https://grafana.com/&#34;&gt;Grafana&lt;/a&gt; で見られるようにしてみました。&lt;/p&gt;
&lt;p&gt;ちなみに Promethus Agent はまだ &lt;a href=&#34;https://prometheus.io/blog/2021/11/16/agent/#prometheus-agent-mode&#34;&gt;実験的な機能&lt;/a&gt; なため、&lt;strong&gt;実務での利用は推奨しません。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;本記事の環境構築には &lt;a href=&#34;https://aws.amazon.com/jp/cdk/&#34;&gt;AWS CDK&lt;/a&gt; を利用しています。&lt;/p&gt;
&lt;h1 id=&#34;動作環境&#34;&gt;動作環境&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Node.js v16.13.0&lt;/li&gt;
&lt;li&gt;AWS CDK 2.0.0 (build 4b6ce31)&lt;/li&gt;
&lt;li&gt;Prometheus 2.32.1&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;環境構築&#34;&gt;環境構築&lt;/h1&gt;
&lt;p&gt;&lt;del&gt;早速環境構築を進めていきます。まだ AMP については CDK から操作できないようでしたので、ワークスペースの作成については AWS コンソールから手動で行います。(2021/12/06)&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://docs.aws.amazon.com/cdk/api/latest/docs/aws-aps-readme.html&#34;&gt;&lt;code&gt;aws-aps&lt;/code&gt;&lt;/a&gt; を利用することで AWS CDK からでも Amazon Managed Service for Prometheus のワークスペースを作成すること確認できましたので、そちらの利用を推奨いたします&amp;hellip; 🙇🙇&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://nikaera.com/archives/aws-ecs-fargate-amp-grafana/#ecs-fargate-%e4%b8%8a%e3%81%a7-node.js-%e3%82%a2%e3%83%97%e3%83%aa%e3%81%8a%e3%82%88%e3%81%b3-prometheus-agent-%e3%82%92%e5%8b%95%e4%bd%9c%e3%81%95%e3%81%9b%e3%82%8b&#34;&gt;lib/prometheus-agent-test-stack.ts&lt;/a&gt; のコードも修正済みで AWS CDK で Amazon Managed Service for Prometheus のワークスペースを作成するように編集しました。(2021/12/18 追記)&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>📔 Unity で iOS/Android アプリの設定値をセキュアに扱う方法</title>
      <link>https://nikaera.com/archives/unity-ios-android-secret-manager/</link>
      <pubDate>Sun, 15 Aug 2021 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/unity-ios-android-secret-manager/</guid>
      <description>&lt;h1 id=&#34;はじめに&#34;&gt;はじめに&lt;/h1&gt;
&lt;p&gt;iOS/Android でユーザーの情報をセキュアに扱う必要があったので、調査したところ Android には &lt;a href=&#34;https://developer.android.com/reference/androidx/security/crypto/EncryptedSharedPreferences&#34;&gt;EncryptedSharedPreferences&lt;/a&gt; が存在することを知りました。iOS には &lt;a href=&#34;https://developer.apple.com/documentation/security/keychain_services&#34;&gt;Keychain Services&lt;/a&gt; が存在します。&lt;/p&gt;
&lt;p&gt;今回は Unity の iOS/Android プラットフォーム上で設定値を保存するための実装を行う必要があったので、Unity から扱えるようネイティブプラグインを作成しました。今後もこういった要望はありそうでしたので、記事として手順や内容を書き記しておくことにしました。&lt;/p&gt;
&lt;p&gt;本記事内で紹介しているコードは下記にアップ済みです。&lt;/p&gt;
&lt;div class=&#34;linkcard-container&#34; style=&#34;margin: var(--content-gap) 0;&#34;&gt;
            &lt;a href=&#34;https://github.com/nikaera/Unity-iOS-Android-SecretManager-Sample&#34; 
               class=&#34;linkcard&#34; 
               style=&#34;
                   display: flex;
                   text-decoration: none;
                   color: var(--content);
                   background: var(--entry);
                   border: 1px solid var(--border);
                   border-radius: 12px;
                   padding: 0px 0px 0px 20px;
                   transition: background-color 0.3s ease;
                   box-shadow: 0 4px 8px rgba(0,0,0,0.08);
                   min-height: 140px;
                   overflow: hidden;
               &#34; 
               onmouseover=&#34;this.style.backgroundColor=&#39;rgb(56, 56, 61)&#39;;&#34; 
               onmouseout=&#34;this.style.backgroundColor=&#39;var(--entry)&#39;;&#34;
               target=&#34;_blank&#34;
               rel=&#34;noopener noreferrer&#34;&gt;&lt;div class=&#34;linkcard-content&#34; style=&#34;flex: 1; display: flex; flex-direction: column; min-width: 0; margin-top: 20px; margin-right: 20px;&#34;&gt;&lt;div class=&#34;linkcard-title&#34; style=&#34;margin-bottom: 10px;&#34;&gt;
                        &lt;h3 style=&#34;
                            margin: 0;
                            font-size: 18px;
                            font-weight: 600;
                            line-height: 1.3;
                            color: var(--primary);
                            overflow: hidden;
                            display: -webkit-box;
                            -webkit-box-orient: vertical;
                            -webkit-line-clamp: 2;
                            line-clamp: 2;
                        &#34;&gt;
                            GitHub - nikaera/Unity-iOS-Android-SecretManager-Sample: EncryptedSharedPreferences および Keychain Services を Unity から利用する Unity サンプルプロジェクト
                        &lt;/h3&gt;
                    &lt;/div&gt;&lt;p class=&#34;linkcard-description&#34; style=&#34;
                        margin: 0;
                        font-size: 14px;
                        line-height: 1.5;
                        color: var(--secondary);
                        overflow: hidden;
                        display: -webkit-box;
                        -webkit-box-orient: vertical;
                        -webkit-line-clamp: 2;
                        line-clamp: 2;
                        flex: 1;
                        margin-bottom: 12px;
                    &#34;&gt;
                        EncryptedSharedPreferences および Keychain Services を Unity から利用する Unity サンプルプロジェクト - nikaera/Unity-iOS-Android-SecretManager-Sample
                    &lt;/p&gt;</description>
    </item>
    <item>
      <title>📝 Azure Cosmos DB でソートしようとするとフリーズする</title>
      <link>https://nikaera.com/archives/azure-cosmos-db-sort/</link>
      <pubDate>Mon, 05 Jul 2021 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/azure-cosmos-db-sort/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/cosmos-db/mongodb-introduction&#34;&gt;MongoDB 用 API&lt;/a&gt; で Azure CosmosDB 向けの開発を行っていたのですが、&lt;code&gt;sort&lt;/code&gt; 実行時にエラーが発生してしまいリソースが取得できなくなる問題が発生してしまいました。&lt;/p&gt;
&lt;p&gt;結論から言ってしまうと、&lt;strong&gt;この &lt;a href=&#34;https://stackoverflow.com/a/60809868&#34;&gt;Stack Overflow の回答&lt;/a&gt; 通り対処すれば解決可能なのですが、簡易的に日本語でも解決策を記しておきます。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;また、本記事内容の問題に遭遇したときに見つけたのですが、事前に &lt;a href=&#34;https://hub.docker.com/r/microsoft/azure-cosmosdb-emulator/&#34;&gt;Azure CosmosDB の Docker イメージ&lt;/a&gt; を利用しておけば、CosmosDB 特有の挙動に気づけるようになるかもしれません。私は &lt;a href=&#34;https://hub.docker.com/_/mongo&#34;&gt;MongoDB の Docker イメージ&lt;/a&gt; を利用して開発や動作検証を行っておりました。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;公式サイトでの &lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/cosmos-db/mongodb-indexing&#34;&gt;MongoDB 用 API でのインデックス管理&lt;/a&gt; についての記事を見ていくと下記の文言が出てきます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;クエリに並べ替えを適用するには、並べ替え操作で使用されるフィールドに対してインデックスを作成する必要があります。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;そのため、例えば MongoDB の ORM である &lt;a href=&#34;https://mongoosejs.com/&#34;&gt;Mongoose&lt;/a&gt; の利用例でいうと、スキーマを定義する際に下記のようにソートに利用したいキーに対してインデックスを指定する必要があります。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;@Schema&lt;/span&gt;({ &lt;span style=&#34;color:#a6e22e&#34;&gt;timestamps&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;createdAt&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;created_at&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;updatedAt&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;updated_at&amp;#34;&lt;/span&gt; } })
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;TestSchema1&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Document&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;_id&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;// ソートしたいキーには index を付ける
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;@Prop&lt;/span&gt;({ &lt;span style=&#34;color:#a6e22e&#34;&gt;index&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;sort&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;!:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;number&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;schema&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;SchemaFactory&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;createForClass&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;TestSchema1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;TestSchema1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;schema&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;また、範囲検索を行いたい場合は各キーにインデックスを作成することで可能になります。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;@Schema&lt;/span&gt;({ &lt;span style=&#34;color:#a6e22e&#34;&gt;timestamps&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;createdAt&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;created_at&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;updatedAt&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;updated_at&amp;#34;&lt;/span&gt; } })
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;TestSchema2&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Document&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;_id&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;@Prop&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;start_at&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;Date&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;@Prop&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;end_at&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;Date&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// start_at と end_at で範囲検索を行いたいため、
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// それぞれに unique インデックスを作成している
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;schema&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;SchemaFactory&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;createForClass&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;TestSchema2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  .&lt;span style=&#34;color:#a6e22e&#34;&gt;index&lt;/span&gt;({ &lt;span style=&#34;color:#a6e22e&#34;&gt;start_at&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;1&lt;/span&gt; }, { &lt;span style=&#34;color:#66d9ef&#34;&gt;unique&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  .&lt;span style=&#34;color:#a6e22e&#34;&gt;index&lt;/span&gt;({ &lt;span style=&#34;color:#a6e22e&#34;&gt;end_at&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;1&lt;/span&gt; }, { &lt;span style=&#34;color:#66d9ef&#34;&gt;unique&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;TestSchema2&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;schema&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;地味な Tips のような記事ですが、割とハマりました。。この記事が同じ轍を踏んでしまっている方の参考になれれば幸いです 😇&lt;/p&gt;</description>
    </item>
    <item>
      <title>📔 マイペースに技術研鑽を継続する方法</title>
      <link>https://nikaera.com/archives/improve-skills-without-stress/</link>
      <pubDate>Fri, 25 Jun 2021 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/improve-skills-without-stress/</guid>
      <description>&lt;h1 id=&#34;はじめに&#34;&gt;はじめに&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;本記事のカバー画像は &lt;a href=&#34;https://pixabay.com/users/tookapic-1386459/?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=932926&#34;&gt;tookapic&lt;/a&gt; from &lt;a href=&#34;https://pixabay.com/?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=932926&#34;&gt;Pixabay&lt;/a&gt; の画像です。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;技術研鑽のための行動が習慣化して確立してきたので、また困り始めた時に参照するための備忘録的な感じで、習慣化に至るまでの流れを記事化しておくことにしました。自分の中では努力していると一切感じず自然に技術研鑽及び技術者としてのプレゼンス向上のために行動できるサイクルができた印象です。&lt;/p&gt;
&lt;p&gt;昔から色々なやり方で上記の習慣化にはトライしていたものの、全てが長続きしなかった自分でも継続できるやり方なので、ある程度の再現性はあるかもしれません。(が、あくまでも自分のやり方にはなります。。🙃&lt;/p&gt;
&lt;p&gt;ちなみに本記事の内容を推敲していたところ、最近読んだ&lt;a href=&#34;https://amzn.to/41lRQrc&#34;&gt;心理的安全性のつくりかた&lt;/a&gt;に出てきた &lt;strong&gt;「きっかけ・行動・みかえり」&lt;/strong&gt; のパターンになっていることに気づきました。&lt;/p&gt;
&lt;h1 id=&#34;技術研鑽のサイクル&#34;&gt;技術研鑽のサイクル&lt;/h1&gt;
&lt;p&gt;自分で自分のモチベを保ちつつ、自然な技術研鑽サイクルとして定着したフローを説明していきます。&lt;/p&gt;
&lt;h2 id=&#34;きっかけ実現したい開発アイデアが浮かぶ&#34;&gt;「きっかけ」：実現したい開発アイデアが浮かぶ&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&#34;きっかけを見つけた感じのイメージ&#34; loading=&#34;lazy&#34; src=&#34;https://nikaera.com/archives/improve-skills-without-stress/1.jpg&#34;&gt;
&lt;strong&gt;Image by &lt;a href=&#34;https://pixabay.com/users/hans-2/?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=8810&#34;&gt;Hans Braxmeier&lt;/a&gt; from &lt;a href=&#34;https://pixabay.com/?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=8810&#34;&gt;Pixabay&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;個人的に突発的にコレ作れたら面白そうとか、自分はコレがあったら便利だなっていうアイデアが浮かぶことがあるのですが、&lt;strong&gt;大体そのアイデアを本気で実現したいと本当に思えるピークは体感最長でも 3-4 日くらいです。&lt;/strong&gt; そのため、アイデアを具体化して開発に着手するまでの期間としては 3-4 日以内を目安に考えています。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;アイデアが思い浮かんでから長く期間が空いてしまい、具体化する気が無くなってしまった場合はメモアプリにアイデアをストックしておきます。&lt;/strong&gt; それらを見返すとより有益なアイデアが浮かんだりするので今後のきっかけ作りに有効活用できます。&lt;/p&gt;
&lt;p&gt;また、 &lt;strong&gt;開発のアイデアについてですが、プライベートだけでなく仕事で開発しているシステムの新機能/改善案等もアイデアとして扱うことが可能です。&lt;/strong&gt; 自身の仕事の質向上にもつながりますし、行動を起こすためのきっかけ作りとしても利用できて、技術検証や実装等は業務時間で行えるため割とオススメの方法です。&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;h2 id=&#34;行動開発アイデアを検証可能な形で実装する&#34;&gt;「行動」：開発アイデアを検証可能な形で実装する&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&#34;行動してる感のあるイメージ&#34; loading=&#34;lazy&#34; src=&#34;https://nikaera.com/archives/improve-skills-without-stress/2.jpg&#34;&gt;
&lt;strong&gt;Image by &lt;a href=&#34;https://pixabay.com/users/sasint-3639875/?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=1822566&#34;&gt;Sasin Tipchai&lt;/a&gt; from &lt;a href=&#34;https://pixabay.com/?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=1822566&#34;&gt;Pixabay&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;開発では、とにかく動作確認が可能な形で実装を行うことに注力します。細かい設計などは置いておいて仮説検証を優先していくイメージです。&lt;/strong&gt; そのため、技術選定は何基準でも問題ありませんが、アイデアの内容によってそこら辺の技術基準は変えていくのが良いと考えています。&lt;/p&gt;
&lt;p&gt;例えば、&lt;strong&gt;プラグインやライブラリの開発については使い慣れた言語や業務で利用している技術を選定すると、知識や知見を深めることに繋がりやすかったです。サービス開発については初期は触れる技術領域が広く浅くになりがちなので、新しい技術など使い慣れていない言語などを採用して知識や知見を広げることを意識すると最後まで楽しく開発できました。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;技術研鑽という名目で取り組む開発なので、完成を目指す必要はありません。しかし、成果物として完成させることを目指したいという場合は、&lt;strong&gt;モチベーションを絶やさないようベースとなる機能の実装を短期間で行うことを意識します。ベースとなる機能の実装というのは、一通りそのシステムの動作検証を他者が行える状態を示します。&lt;/strong&gt; システムの動作検証を他者が行える状態まで持っていければ、正しく成果物が評価できる状態になっているはずだからです。&lt;/p&gt;
&lt;p&gt;まとめると、&lt;strong&gt;モチベを保てるやり方を意識して技術選定を行い、具体的な成果物を意識してベースとなる機能の実装を短期間の細かいサイクルで進められると、満足感のある形で開発を進めることができました。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;みかえり過程で得たもの全てをアウトプットする&#34;&gt;「みかえり」：過程で得たもの全てをアウトプットする&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&#34;みかえりしてる感のあるイメージ&#34; loading=&#34;lazy&#34; src=&#34;https://nikaera.com/archives/improve-skills-without-stress/3.jpg&#34;&gt;
&lt;strong&gt;Photo by &lt;a href=&#34;https://unsplash.com/@grakozy?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText&#34;&gt;Greg Rakozy&lt;/a&gt; on &lt;a href=&#34;https://unsplash.com/?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText&#34;&gt;Unsplash&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;成果物の公開だけでなく、その開発を通して得た知見や知識及びソースコードなど全てアウトプットします。行動の途中だとしてもモチベが下がってきたら、みかえりのフェーズに移行します。&lt;/strong&gt; 例えば、成果物で言うと、ストア公開するだけでなくソースコードも GitHub の公開リポジトリにアップします。知識や知見などは技術ブログで記事化してまとめて公開します。 &lt;strong&gt;他者の目に触れる場所へ公開することを意識すると、アウトプットの質を高めるモチベに繋がります。&lt;/strong&gt; 承認欲求を満たすためではなく、あくまで自分のアウトプットの質を高める施策の一貫として考えます。&lt;/p&gt;
&lt;p&gt;上記を意識するとリファクタリングやベスプラに沿った開発ができているか等のチェックに繋がり、知識や知見をより深めることに繋がります。記事化も同様で、文章として知見や知識を残す過程で正しい内容なのか、本当に正しく動作するソースコードが書けているかに意識が向くため、誤った知識の修正や復習に繋がります。&lt;/p&gt;
&lt;p&gt;成果物だけでなく身につけた技術も含めて全てをアウトプットすることで、余すこと無く行動した結果を有効活用できます。&lt;strong&gt;このサイクルを何回か行い習慣化してくると、インプットした内容を全てアウトプットしきるための行動が自然と起こせるようになっていきました。&lt;/strong&gt; アウトプットする過程できっかけが生まれて更に行動することにつながっていくという流れも生まれました。&lt;/p&gt;
&lt;p&gt;具体例としては、&lt;a href=&#34;https://github.com/nikaera/Teemo&#34;&gt;シンプルなプラグイン&lt;/a&gt;を作っていく過程で、ライブラリ化やモジュール化した方が良い機能がでてきたので、別リポジトリに切り出して&lt;a href=&#34;https://www.npmjs.com/package/@nikaera/react-emoji-textarea&#34;&gt;パッケージマネージャーからインストール可能にしました&lt;/a&gt;。また、業務で特殊な事情で取り組んだ開発内容を新たな知見として&lt;a href=&#34;https://zenn.dev/nikaera/articles/cloudfront-for-mediapackage&#34;&gt;記事化&lt;/a&gt;してアウトプットを増やすことができるようになりました。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;ちなみに私はアウトプットする手段としての記事化には重い腰が中々上がらない人間だったのですが、&lt;a href=&#34;https://www.youtube.com/watch?v=j7ifT8S5pN0&#34;&gt;堤 修一さんの Youtube 動画&lt;/a&gt; と同様の考え方に自然に至りました。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;全てが自分のやった成果として目に見える形で残っていくので、後から見返したときに自分の実績として実感が湧きやすく、作りっぱなしで終わっていた頃と比べると相当な達成感を味わうこともできます。&lt;/strong&gt; ゲームでいう様々な実績を解除してくような感覚に近いかもしれません。🎮&lt;/p&gt;
&lt;h1 id=&#34;おわりに&#34;&gt;おわりに&lt;/h1&gt;
&lt;p&gt;現状個人的には上記のサイクルが上手く機能していて、最近習慣化の軌道に乗った感じが自分の中にあったので知見として記事化しておくことにしました。今後、上記サイクルについては改善を繰り返しながらアップデートしていきますが、一旦現状の内容を後から見返せるようにしました。&lt;/p&gt;
&lt;p&gt;また今回始めて記事内でイメージ画像をふんだんに使ってみましたが、画像探すの楽しいし記事のクオリティが上がったと錯覚できるので、今後もポエム記事については積極的に画像を利用していこうと思いました (違&lt;/p&gt;
&lt;p&gt;この記事内容がどなたかの行動を起こすきっかけとなれれば幸いです！🙏&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;当たり前ですが NDA に触れるような内容を自身の成果として公開してしまうのは絶対にダメです。あくまでも一般的な技術知識のみを自身の得た知見として公開するというスタンスです。&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>📝 pytest で alembic のマイグレーションを行う方法</title>
      <link>https://nikaera.com/archives/pytest-sqlalchemy-alembic/</link>
      <pubDate>Thu, 24 Jun 2021 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/pytest-sqlalchemy-alembic/</guid>
      <description>&lt;h2 id=&#34;はじめに&#34;&gt;はじめに&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://fastapi.tiangolo.com/ja/&#34;&gt;FastAPI&lt;/a&gt; と &lt;a href=&#34;https://github.com/sqlalchemy/sqlalchemy&#34;&gt;SQLAlchemy&lt;/a&gt; を利用して Web API 開発を行っていた際、SQLAlchemy のマイグレーションツールである &lt;a href=&#34;https://github.com/sqlalchemy/alembic&#34;&gt;alembic&lt;/a&gt; を利用していました。&lt;/p&gt;
&lt;p&gt;ただ E2E テストを書こうとした際に、pytest 実行中に alembic でデータベースマイグレーションを行う方法が分からず模索していました。結果的にマイグレーションのやり方は分かったものの一応今後も利用するかもしれないため、その内容を記事として残しておくことにしました。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;本記事内で利用しているソースコードを含む FastAPI プロジェクトを &lt;a href=&#34;https://github.com/nikaera/fastapi-sqlalchemy-alembic-pytest-sample&#34;&gt;GitHub リポジトリ&lt;/a&gt;上にアップしておいたので、詳細を確認されたい方がいればご参照くださいませ。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;alembic-でマイグレーションを行う&#34;&gt;alembic でマイグレーションを行う&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;conftest.py&lt;/code&gt; にグローバルで利用するマイグレーション用の &lt;code&gt;fixture&lt;/code&gt; を定義すれば OK です。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# conftest.py&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; os
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; alembic.config
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; pytest
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; sqlalchemy &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; create_engine
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; sqlalchemy.ext.declarative &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; declarative_base
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; sqlalchemy.orm &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; sessionmaker
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; sqlalchemy_utils &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; database_exists, create_database, drop_database
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# テスト用の初期データを定義した module を import する (必要があれば)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# from .seed import users, contents&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 指定したパラメータを用いて alembic によるデータベースマイグレーションを行う&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 引数のデフォルト設定では全てのマイグレーションを実行するようになっている&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;migrate&lt;/span&gt;(migrations_path, alembic_ini_path&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;alembic.ini&amp;#39;&lt;/span&gt;, connection&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;, revision&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;head&amp;#34;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    config &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; alembic&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;config&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;Config(alembic_ini_path)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    config&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;set_main_option(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;script_location&amp;#39;&lt;/span&gt;, migrations_path)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; connection &lt;span style=&#34;color:#f92672&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;not&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        config&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;attributes[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;connection&amp;#39;&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; connection
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    alembic&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;command&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;upgrade(config, revision)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# テスト実行用にセットアップされたデータベースのセッション情報を扱う関数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# scope に session を指定することでテスト全体で一回だけ実行されるようにする&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;@pytest.fixture&lt;/span&gt;(scope&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;session&amp;#34;&lt;/span&gt;, autouse&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;SessionLocal&lt;/span&gt;():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    test_sqlalchemy_database_url &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; os&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;environ[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;DATABASE_URL&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    engine &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; create_engine(test_sqlalchemy_database_url)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# 既にテスト用データベースが存在していたら破棄する&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; database_exists(test_sqlalchemy_database_url):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        drop_database(test_sqlalchemy_database_url)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# テスト用データベースを作成する&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    create_database(test_sqlalchemy_database_url)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# 環境変数 DATABASE_URL で指定したデータベースに対して、&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# マイグレーションを行いテスト実行に必要なテーブルを一括作成する&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# 第一引数に指定している alembic は `alembic init &amp;lt;環境名&amp;gt;` 実行時に指定した環境名を入力&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;with&lt;/span&gt; engine&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;begin() &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; connection:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        migrate(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;alembic&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;alembic.ini&amp;#39;&lt;/span&gt;, connection)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Base &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; declarative_base()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Base&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;metadata&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;create_all(engine)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    SessionLocal &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sessionmaker(autocommit&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;False&lt;/span&gt;, autoflush&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;False&lt;/span&gt;, bind&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;engine)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# テスト用の各種データを追加する (必要があれば)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# db_session = SessionLocal()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# for user in users:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;#     db_session.add(user)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# db_session.commit()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# for content in contents:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;#     db_session.add(content)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# db_session.commit()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# db_session.close()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# テスト用データ追加後のセットアップ済みの状態で&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# テスト用に利用する SessionLocal を返却する&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;yield&lt;/span&gt; SessionLocal
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# テストが全て終わったら、テスト用データベースを破棄して、&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# SQLAlchemy のセッションも切断する&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    drop_database(test_sqlalchemy_database_url)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    engine&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;dispose()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;fastapi-の-pytest-への適用例&#34;&gt;FastAPI の pytest への適用例&lt;/h2&gt;
&lt;p&gt;上記を関数を利用する方法は各自のテスト環境によって異なると思いますが、一応私が FastAPI のテストコードを書く際に利用したソースコードを元に参考例を載せておきます。&lt;/p&gt;</description>
    </item>
    <item>
      <title>📝 Chrome 拡張で 1つのウインドウを使い回す方法</title>
      <link>https://nikaera.com/archives/chrome-extension-only-one-window/</link>
      <pubDate>Sun, 20 Jun 2021 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/chrome-extension-only-one-window/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://chrome.google.com/webstore/detail/teemo-%F0%9F%92%95/alhdkgcgpmdfbidaapdlnmbhoanoijka&#34;&gt;Teemo&lt;/a&gt; という Chrome 拡張を開発したのですが、その際 1 つのウインドウを使い回す構成にしたいなと考えていました。&lt;/p&gt;
&lt;p&gt;例えば何も考えずに &lt;code&gt;chrome.windows.create&lt;/code&gt; を Chrome 拡張を開くたびに呼び出すと、呼び出すたびにウインドウが新規作成されてしまいます。そうすると、都度画面に不要なウインドウが出てきて邪魔になるだけでなく、手動で不要なウインドウを消す作業をユーザーに強いることとなってしまいます。。🙃&lt;/p&gt;
&lt;p&gt;上記のような挙動が望まれるケースもあると思いますが、Teemo ではウインドウ間を頻繁に行き来するため、ショートカットを利用して拡張機能を呼び出すことを見込んでいました。そのため、ショートカットを利用して拡張機能を呼び出すたびにウインドウが新規作成され続ける挙動は望んでいませんでした。&lt;/p&gt;
&lt;p&gt;1 つのウインドウを使い回すためには、&lt;code&gt;chrome.windows.create&lt;/code&gt; 時に作成される &lt;code&gt;window&lt;/code&gt; の &lt;code&gt;id&lt;/code&gt; を保持しておきます。その後、Chrome 拡張が呼び出されるたびに &lt;code&gt;window&lt;/code&gt; が既に存在するかどうかを保持していた &lt;code&gt;id&lt;/code&gt; を元にチェックします。既に &lt;code&gt;window&lt;/code&gt; が存在していた場合はそれを使いまわします。存在していなかった場合は、&lt;code&gt;chrome.windows.create&lt;/code&gt; で &lt;code&gt;window&lt;/code&gt; を新規作成します。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript:background.js&#34; data-lang=&#34;javascript:background.js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// window の id を保持しておくための変数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;vid&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;chrome&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;browserAction&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;onClicked&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;addListener&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; () {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;// vid の値を元に Chrome 拡張で開いた window の取得を試みる
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;chrome&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;windows&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;vid&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;chromeWindow&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// エラーが無く、既に window が存在している場合は、
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// そのステータスを { focused: true } にすることで最前面に呼び出す
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;chrome&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;runtime&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;lastError&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;chromeWindow&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;chrome&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;windows&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;update&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;vid&lt;/span&gt;, { &lt;span style=&#34;color:#a6e22e&#34;&gt;focused&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 上記以外のパターンでは window を新規作成する
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;chrome&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;windows&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;create&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;index.html&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;popup&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; (window) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// 新規作成した window を使い回せるようにするため、
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// vid 変数に window の id を保持しておく
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;vid&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; window.&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    );
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上記コードで 1 つのウインドウを使い回すことが出来るようになるはずです。✅&lt;/p&gt;</description>
    </item>
    <item>
      <title>📝 Node.js パッケージを公開するための GitHub Actions を構築する</title>
      <link>https://nikaera.com/archives/yarn-publish-github-actions/</link>
      <pubDate>Sun, 20 Jun 2021 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/yarn-publish-github-actions/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/nikaera/react-emoji-textarea&#34;&gt;react-emoji-textarea&lt;/a&gt; の開発を行った際、&lt;a href=&#34;https://docs.github.com/ja/github/administering-a-repository/releasing-projects-on-github/managing-releases-in-a-repository&#34;&gt;リリース&lt;/a&gt;を作成したら自動的に Node.js パッケージにライブラリが公開される仕組みがほしいと考え、GitHub Actions でそれを実現することにしました。&lt;/p&gt;
&lt;p&gt;その際、公式サイトに &lt;a href=&#34;https://docs.github.com/en/actions/guides/publishing-nodejs-packages#publishing-packages-using-yarn&#34;&gt;公開されている内容&lt;/a&gt; を参考に GitHub Actions を作成したのですが、そのまま利用すると私の環境では下記のエラーが発生してしまいました。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;error Couldn&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&amp;#39;&lt;/span&gt;t publish package: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://registry.yarnpkg.com/@nikaera/react-emoji-textarea: You do not have permission to publish \&amp;#34;react-emoji-textarea\&amp;#34;. Are you logged in as the correct user?&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上記のエラーについて調査しながら改修したところ、最終的に下記の GitHub Actions で Node.js パッケージを公開できるようになりました。&lt;code&gt;secrets.NPM_TOKEN&lt;/code&gt; には &lt;a href=&#34;https://docs.npmjs.com/creating-and-viewing-access-tokens&#34;&gt;NPM Token&lt;/a&gt; を登録します。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yml:package.yml&#34; data-lang=&#34;yml:package.yml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;Node.js Package&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;on&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# workflow_dispatch を追加して手動でも実行できるよう改修&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;workflow_dispatch&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;release&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;types&lt;/span&gt;: [&lt;span style=&#34;color:#ae81ff&#34;&gt;created]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;jobs&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;build&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;runs-on&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;ubuntu-latest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;steps&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#f92672&#34;&gt;uses&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;actions/checkout@v2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#f92672&#34;&gt;uses&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;actions/setup-node@v2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;with&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;node-version&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;14.x&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;registry-url&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://registry.npmjs.org&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#75715e&#34;&gt;# registry.npmjs.org へアクセスする際は必ず認証を試みるオプションを追加&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;always-auth&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#75715e&#34;&gt;# scope には自分のユーザ名を指定&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;scope&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;@nikaera&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# .npmrc に https://registry.npmjs.org アクセス時に利用する認証情報を記載する&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#f92672&#34;&gt;run&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;echo &amp;#34;//registry.npmjs.org/:_authToken=${{ secrets.NPM_TOKEN }}&amp;#34; &amp;gt; ~/.npmrc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;Build react-emoji-textarea 😆💖&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;run&lt;/span&gt;: |&lt;span style=&#34;color:#e6db74&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          yarn install --frozen-lockfile
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          yarn format
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          yarn build&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#f92672&#34;&gt;run&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;yarn publish --access public&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;env&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;NODE_AUTH_TOKEN&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;${{ secrets.NPM_TOKEN }}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>📔 チャットの短文作成に便利な Chrome 拡張機能を開発してみた</title>
      <link>https://nikaera.com/archives/teemo-first-release/</link>
      <pubDate>Sat, 12 Jun 2021 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/teemo-first-release/</guid>
      <description>&lt;h1 id=&#34;はじめに-&#34;&gt;はじめに 📝&lt;/h1&gt;
&lt;p&gt;最近とある事情により Twitter の DM を利用しているのですが、Slack などのように絵文字をショートカット入力できないことにフラストレーションが溜まってきていました。そのため、絵文字をショトカで入力可能にしてくれる Chrome 拡張機能を探したのですが見つけられませんでした。&lt;/p&gt;
&lt;p&gt;そこで、無いなら作ろうということで &lt;a href=&#34;https://chrome.google.com/webstore/detail/teemo-%F0%9F%92%95/alhdkgcgpmdfbidaapdlnmbhoanoijka?hl=ja&amp;amp;&#34;&gt;Teemo&lt;/a&gt; を開発しました。&lt;/p&gt;
&lt;p&gt;ソースコードは &lt;a href=&#34;https://github.com/nikaera/Teemo&#34;&gt;GitHub 上で公開しています。&lt;/a&gt; 何かご要望等ございましたら PR や Issue 作成頂けますと喜びます。Teemo の実際の挙動については下記の動画で確認できます 🎥
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/bJTHbzw1Ee4?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;
&lt;/p&gt;
&lt;h1 id=&#34;考えていたこと-&#34;&gt;考えていたこと 💭&lt;/h1&gt;
&lt;p&gt;今回 Teemo の開発を行うに当たり、考えていた点は下記になります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;よくある &lt;code&gt;:&lt;/code&gt; 入力からの絵文字ショートカットを導入する
&lt;ul&gt;
&lt;li&gt;Slack や GitHub、JIRA などではおなじみの入力方法 ⌨️&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;パレットから選択する際は半角英数字で検索できるようにしたい
&lt;ul&gt;
&lt;li&gt;Twitter では日本語で検索しないと絵文字が探せない 🔍&lt;/li&gt;
&lt;li&gt;普段英数字で絵文字検索をするので目的の絵文字が見つけづらい 🕵️&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;拡張機能を利用することで文章入力の煩わしさが増加することは避けたい
&lt;ul&gt;
&lt;li&gt;コピペや文章クリアの機能等にもショトカ利用できるようにしたい 💨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;プロトタイピングしながら友人に進捗をシェアしながら開発は進めていきました。本当は個人で利用する想定で進めていたのですが、割と評判が良かったため Chrome ウェブストアに公開するのを目標に動いていました。そして、Chrome ウェブストアで公開できるクオリティを目指して動いたことで満足のいく拡張機能が作れました。&lt;/p&gt;</description>
    </item>
    <item>
      <title>📔 GameCI で Unity の CI 環境を GitHub Actions で構築する</title>
      <link>https://nikaera.com/archives/unity-gameci-github-actions/</link>
      <pubDate>Sat, 29 May 2021 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/unity-gameci-github-actions/</guid>
      <description>&lt;h1 id=&#34;はじめに&#34;&gt;はじめに&lt;/h1&gt;
&lt;p&gt;先日同僚が Unity の CI 環境を構築するためのライブラリである &lt;a href=&#34;https://game.ci/&#34;&gt;GameCI&lt;/a&gt; について教えてくれました。早速 GameCI の GitHub Actions を利用して、サンプルプロジェクトで色々動作検証してみたところ、Unity の CI 環境を楽に構築できることが分かりました。&lt;/p&gt;
&lt;p&gt;もちろん、&lt;a href=&#34;https://unity3d.com/jp/unity/features/cloud-build&#34;&gt;Unity Cloud Build&lt;/a&gt; を利用すれば CI 環境の構築は以前から楽にできました。しかし、選択肢の 1 つとして GameCI を持っておくことで、&lt;strong&gt;サクッと GitHub Actions に統合する形で Unity の CI 環境を導入できるのは他には無いメリットを感じました。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;本記事で紹介しているソースコード、及び検証時に利用したプロジェクトは GitHub にアップ済みですので、手っ取り早く内容を把握されたい方は下記をご参照くださいませ。&lt;/p&gt;
&lt;div class=&#34;linkcard-container&#34; style=&#34;margin: var(--content-gap) 0;&#34;&gt;
            &lt;a href=&#34;https://github.com/nikaera/Unity-GameCI-Sample&#34; 
               class=&#34;linkcard&#34; 
               style=&#34;
                   display: flex;
                   text-decoration: none;
                   color: var(--content);
                   background: var(--entry);
                   border: 1px solid var(--border);
                   border-radius: 12px;
                   padding: 0px 0px 0px 20px;
                   transition: background-color 0.3s ease;
                   box-shadow: 0 4px 8px rgba(0,0,0,0.08);
                   min-height: 140px;
                   overflow: hidden;
               &#34; 
               onmouseover=&#34;this.style.backgroundColor=&#39;rgb(56, 56, 61)&#39;;&#34; 
               onmouseout=&#34;this.style.backgroundColor=&#39;var(--entry)&#39;;&#34;
               target=&#34;_blank&#34;
               rel=&#34;noopener noreferrer&#34;&gt;&lt;div class=&#34;linkcard-content&#34; style=&#34;flex: 1; display: flex; flex-direction: column; min-width: 0; margin-top: 20px; margin-right: 20px;&#34;&gt;&lt;div class=&#34;linkcard-title&#34; style=&#34;margin-bottom: 10px;&#34;&gt;
                        &lt;h3 style=&#34;
                            margin: 0;
                            font-size: 18px;
                            font-weight: 600;
                            line-height: 1.3;
                            color: var(--primary);
                            overflow: hidden;
                            display: -webkit-box;
                            -webkit-box-orient: vertical;
                            -webkit-line-clamp: 2;
                            line-clamp: 2;
                        &#34;&gt;
                            GitHub - nikaera/Unity-GameCI-Sample: Sample project for building a CI environment for Unity using GameCI with GitHub Actions.
                        &lt;/h3&gt;
                    &lt;/div&gt;&lt;p class=&#34;linkcard-description&#34; style=&#34;
                        margin: 0;
                        font-size: 14px;
                        line-height: 1.5;
                        color: var(--secondary);
                        overflow: hidden;
                        display: -webkit-box;
                        -webkit-box-orient: vertical;
                        -webkit-line-clamp: 2;
                        line-clamp: 2;
                        flex: 1;
                        margin-bottom: 12px;
                    &#34;&gt;
                        Sample project for building a CI environment for Unity using GameCI with GitHub Actions. - nikaera/Unity-GameCI-Sample
                    &lt;/p&gt;</description>
    </item>
    <item>
      <title>📝 Rails で config/database.yml よりも ENV[&#39;DATABASE_URL&#39;] の設定が優先される話</title>
      <link>https://nikaera.com/archives/rails-database-url/</link>
      <pubDate>Sat, 29 May 2021 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/rails-database-url/</guid>
      <description>&lt;p&gt;MySQL を利用する Rails プロジェクトを起動しようとしたところ、下記のエラーが発生しました。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bin/rails s
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# データベースアダプターには mysql2 を選択している状態なのに postgresql で接続しようとしている&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Error loading the &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;postgresql&amp;#39;&lt;/span&gt; Active Record adapter. Missing a gem it depends on? pg is not part of the bundle. Add it to your Gemfile. &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;LoadError&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yml:config/database.yml&#34; data-lang=&#34;yml:config/database.yml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# config/database.yml ファイルの中身一部抜粋&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# mysql2 をデータベースアダプターとして利用しているため、&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# PostgreSQL 接続のための pg ライブラリの追加を求めるエラーが発生しているのは何かおかしい。。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;default&lt;/span&gt;: &lt;span style=&#34;color:#75715e&#34;&gt;&amp;amp;default&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;adapter&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;mysql2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;何でや、、と思い Rails のドキュメントを読んでいた所、公式サイトに &lt;a href=&#34;https://edgeguides.rubyonrails.org/configuring.html#connection-preference&#34;&gt;&lt;code&gt;Connection Preference&lt;/code&gt; に関する記述&lt;/a&gt;を見つけました。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Since pool is not in the ENV[&amp;lsquo;DATABASE_URL&amp;rsquo;] provided connection information its information is merged in. Since adapter is duplicate, the ENV[&amp;lsquo;DATABASE_URL&amp;rsquo;] connection information wins.&lt;/p&gt;</description>
    </item>
    <item>
      <title>📝 Pillow を使って画像に縦書きテキストを埋め込む</title>
      <link>https://nikaera.com/archives/pillow-vertical-writing/</link>
      <pubDate>Sat, 22 May 2021 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/pillow-vertical-writing/</guid>
      <description>&lt;h2 id=&#34;はじめに&#34;&gt;はじめに&lt;/h2&gt;
&lt;p&gt;縦書きテキストを画像に埋め込みたいと頼まれたので、&lt;br&gt;
Python 製の画像処理ライブラリ &lt;a href=&#34;https://pillow.readthedocs.io/en/stable/&#34;&gt;Pillow&lt;/a&gt; を使ってサクッと実装してみました。&lt;/p&gt;
&lt;p&gt;一応ソースコードは Gist にもアップ済みです ✍️&lt;/p&gt;
&lt;div class=&#34;linkcard-container&#34; style=&#34;margin: var(--content-gap) 0;&#34;&gt;
            &lt;a href=&#34;https://gist.github.com/nikaera/c1049708ff548b06cab0ae377adc4ac7&#34; 
               class=&#34;linkcard&#34; 
               style=&#34;
                   display: flex;
                   text-decoration: none;
                   color: var(--content);
                   background: var(--entry);
                   border: 1px solid var(--border);
                   border-radius: 12px;
                   padding: 0px 0px 0px 20px;
                   transition: background-color 0.3s ease;
                   box-shadow: 0 4px 8px rgba(0,0,0,0.08);
                   min-height: 140px;
                   overflow: hidden;
               &#34; 
               onmouseover=&#34;this.style.backgroundColor=&#39;rgb(56, 56, 61)&#39;;&#34; 
               onmouseout=&#34;this.style.backgroundColor=&#39;var(--entry)&#39;;&#34;
               target=&#34;_blank&#34;
               rel=&#34;noopener noreferrer&#34;&gt;&lt;div class=&#34;linkcard-content&#34; style=&#34;flex: 1; display: flex; flex-direction: column; min-width: 0; margin-top: 20px; margin-right: 20px;&#34;&gt;&lt;div class=&#34;linkcard-title&#34; style=&#34;margin-bottom: 10px;&#34;&gt;
                        &lt;h3 style=&#34;
                            margin: 0;
                            font-size: 18px;
                            font-weight: 600;
                            line-height: 1.3;
                            color: var(--primary);
                            overflow: hidden;
                            display: -webkit-box;
                            -webkit-box-orient: vertical;
                            -webkit-line-clamp: 2;
                            line-clamp: 2;
                        &#34;&gt;
                            Embedding Japanese vertical writing characters into an image using Pillow.
                        &lt;/h3&gt;
                    &lt;/div&gt;&lt;p class=&#34;linkcard-description&#34; style=&#34;
                        margin: 0;
                        font-size: 14px;
                        line-height: 1.5;
                        color: var(--secondary);
                        overflow: hidden;
                        display: -webkit-box;
                        -webkit-box-orient: vertical;
                        -webkit-line-clamp: 2;
                        line-clamp: 2;
                        flex: 1;
                        margin-bottom: 12px;
                    &#34;&gt;
                        Embedding Japanese vertical writing characters into an image using Pillow. - main.py
                    &lt;/p&gt;</description>
    </item>
    <item>
      <title>📔 Zenn の記事を DEV に自動的に同期させる GitHub Actions 作ってみた</title>
      <link>https://nikaera.com/archives/sync-zenn-with-dev-action/</link>
      <pubDate>Sun, 21 Mar 2021 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/sync-zenn-with-dev-action/</guid>
      <description>&lt;h1 id=&#34;はじめに&#34;&gt;はじめに&lt;/h1&gt;
&lt;p&gt;去年 &lt;a href=&#34;https://dev.to/&#34;&gt;DEV&lt;/a&gt; のアカウントを作成したものの、今まで全く有効活用出来ていませんでした。&lt;/p&gt;
&lt;p&gt;DEV には &lt;a href=&#34;https://dev.to/michaelburrows/comment/125j0&#34;&gt;カノニカル URL&lt;/a&gt; を設定出来るので、常々 Zenn の記事を投稿する際にクロスポストしたいなと考えておりました。そこで、&lt;strong&gt;Zenn に記事を投稿したら、自動的に DEV にも記事を投稿 &amp;amp; 同期する GitHub Actions を作ってみました。&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;linkcard-container&#34; style=&#34;margin: var(--content-gap) 0;&#34;&gt;
            &lt;a href=&#34;https://github.com/nikaera/sync-zenn-with-dev-action&#34; 
               class=&#34;linkcard&#34; 
               style=&#34;
                   display: flex;
                   text-decoration: none;
                   color: var(--content);
                   background: var(--entry);
                   border: 1px solid var(--border);
                   border-radius: 12px;
                   padding: 0px 0px 0px 20px;
                   transition: background-color 0.3s ease;
                   box-shadow: 0 4px 8px rgba(0,0,0,0.08);
                   min-height: 140px;
                   overflow: hidden;
               &#34; 
               onmouseover=&#34;this.style.backgroundColor=&#39;rgb(56, 56, 61)&#39;;&#34; 
               onmouseout=&#34;this.style.backgroundColor=&#39;var(--entry)&#39;;&#34;
               target=&#34;_blank&#34;
               rel=&#34;noopener noreferrer&#34;&gt;&lt;div class=&#34;linkcard-content&#34; style=&#34;flex: 1; display: flex; flex-direction: column; min-width: 0; margin-top: 20px; margin-right: 20px;&#34;&gt;&lt;div class=&#34;linkcard-title&#34; style=&#34;margin-bottom: 10px;&#34;&gt;
                        &lt;h3 style=&#34;
                            margin: 0;
                            font-size: 18px;
                            font-weight: 600;
                            line-height: 1.3;
                            color: var(--primary);
                            overflow: hidden;
                            display: -webkit-box;
                            -webkit-box-orient: vertical;
                            -webkit-line-clamp: 2;
                            line-clamp: 2;
                        &#34;&gt;
                            GitHub - nikaera/sync-zenn-with-dev-action: Just sync Zenn articles to DEV.
                        &lt;/h3&gt;
                    &lt;/div&gt;&lt;p class=&#34;linkcard-description&#34; style=&#34;
                        margin: 0;
                        font-size: 14px;
                        line-height: 1.5;
                        color: var(--secondary);
                        overflow: hidden;
                        display: -webkit-box;
                        -webkit-box-orient: vertical;
                        -webkit-line-clamp: 2;
                        line-clamp: 2;
                        flex: 1;
                        margin-bottom: 12px;
                    &#34;&gt;
                        Just sync Zenn articles to DEV. Contribute to nikaera/sync-zenn-with-dev-action development by creating an account on GitHub.
                    &lt;/p&gt;</description>
    </item>
    <item>
      <title>📔 Gatling で複数ユーザ認証した情報を元に負荷テストする</title>
      <link>https://nikaera.com/archives/gatling-multiuser/</link>
      <pubDate>Mon, 15 Mar 2021 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/gatling-multiuser/</guid>
      <description>&lt;h1 id=&#34;はじめに&#34;&gt;はじめに&lt;/h1&gt;
&lt;p&gt;今までは &lt;a href=&#34;https://jmeter.apache.org/&#34;&gt;JMeter&lt;/a&gt; でしか負荷テストを行ったことなかったのですが、最近 PlayFab で CloudFunction の負荷テストを行う際に &lt;a href=&#34;https://gatling.io/&#34;&gt;Gatling&lt;/a&gt; を初めて利用しました。&lt;/p&gt;
&lt;p&gt;今回の負荷テストでは、各ユーザ毎のレートリミットの制限等も考慮した実利用時を想定した形で行うことが要求されたため、単一ユーザの認証情報を使い回すことは望ましくないと考えました。そこで、複数の認証済みユーザの情報を元に &lt;a href=&#34;https://docs.microsoft.com/ja-jp/gaming/playfab/features/automation/cloudscript-af/&#34;&gt;PlayFab の CloudFunction&lt;/a&gt; の負荷テストを実施したのですが、若干実装に苦戦したため手順について記事として残しておくことにしました。&lt;/p&gt;
&lt;p&gt;また、本記事では Gatling のセットアップから記載していますが、該当コードやその説明を早く見たいという方は &lt;a href=&#34;https://nikaera.com/archives/gatling-multiuser/#%e8%a4%87%e6%95%b0%e3%83%a6%e3%83%bc%e3%82%b6%e8%aa%8d%e8%a8%bc%e3%82%92%e8%a1%8c%e3%81%86%e3%83%86%e3%82%b9%e3%83%88%e3%82%b7%e3%83%8a%e3%83%aa%e3%82%aa%e3%82%92%e5%ae%9f%e8%a3%85%e3%81%99%e3%82%8b&#34;&gt;&lt;code&gt;複数ユーザ認証を行うテストシナリオを実装する&lt;/code&gt;&lt;/a&gt; 項目をご参照ください。&lt;/p&gt;
&lt;h1 id=&#34;動作環境&#34;&gt;動作環境&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;macOS Big Sur&lt;/li&gt;
&lt;li&gt;Java OpenJDK 12.0.1
&lt;ul&gt;
&lt;li&gt;未インストールの方は事前に &lt;a href=&#34;https://jdk.java.net/&#34;&gt;公式サイトから&lt;/a&gt; OpenJDK をインストールしてください&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;gatling-の環境を整える&#34;&gt;Gatling の環境を整える&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Gatling には 2 種類のセットアップ方法が用意されています。&lt;/strong&gt; スタンドアローンなツールを直接公式サイトからダウンロードするか、&lt;a href=&#34;https://maven.apache.org/&#34;&gt;Maven&lt;/a&gt; や &lt;a href=&#34;https://www.scala-sbt.org/&#34;&gt;sbt&lt;/a&gt; といったツール経由でダウンロードするか選択できます。&lt;/p&gt;
&lt;p&gt;どちらの方法でセットアップするかについてですが、&lt;strong&gt;新規でテストケースを Gatling で書いていく用途だと前者になり、既存のプロジェクトに Gatling を取り込む用途だと後者になるかと存じます。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;本記事では、前者のスタンドアローンなツールを直接公式サイトからダウンロードする方法で Gatling の環境をセットアップします。&lt;/p&gt;
&lt;h2 id=&#34;公式サイトから-gatling-をダウンロードする&#34;&gt;公式サイトから Gatling をダウンロードする&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://gatling.io/open-source/&#34;&gt;Gatling のトップページ&lt;/a&gt; に遷移して、ページを &lt;code&gt;2 Ways to use Gatling&lt;/code&gt; の項目までスクロールした後、ダウンロードボタンをクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;スクリーンショット 2021-03-14 21.57.35.png&#34; loading=&#34;lazy&#34; src=&#34;https://i.gyazo.com/0bbfb36fa7ea0704d4ebc50682f836ef.png&#34;&gt;
&lt;strong&gt;&lt;code&gt;DOWNLOAD GATLING&#39;S BUNDLE&lt;/code&gt; にある &lt;code&gt;DOWNLOAD NOW&lt;/code&gt; ボタンをクリックする&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;ファイルダウンロード後はダウンロードした zip ファイルを適当なフォルダに展開して配置します。
早速ターミナルで展開したフォルダ内にある &lt;code&gt;./bin/gatling.sh&lt;/code&gt; を実行して、正常にコマンドが実行できるか確認してみます。&lt;/p&gt;</description>
    </item>
    <item>
      <title>📔 PlayFab の API 制限に引っかかった</title>
      <link>https://nikaera.com/archives/playfab-api-call-limitation/</link>
      <pubDate>Sun, 14 Mar 2021 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/playfab-api-call-limitation/</guid>
      <description>&lt;h1 id=&#34;はじめに&#34;&gt;はじめに&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.microsoft.com/ja-jp/gaming/playfab/features/automation/cloudscript-af/&#34;&gt;PlayFab で CloudFunction&lt;/a&gt; を利用しているときに API 制限に引っかかってしまいました。負荷テストをした際に初めて気づいたのですが、公式ページにも言及が無かったため発覚が遅れてしまいました。そのため、PlayFab に依存していた機能を部分的に外す必要が出てきてしまい苦労しました。&lt;/p&gt;
&lt;p&gt;本記事では、上記のような事態に陥る方を減らすため、API 制限に気づくまでの軌跡を辿りながら、PlayFab の CloudFunction を利用する際の注意点について、記事として残しておきたいと思います。&lt;/p&gt;
&lt;h1 id=&#34;playfab-の-api-制限に引っかかった要因&#34;&gt;PlayFab の API 制限に引っかかった要因&lt;/h1&gt;
&lt;p&gt;PlayFab の CloudFunction を利用すると、&lt;strong&gt;PlayFab 経由で独自 Web API を実行することが可能になります。また、CloudFunction 経由で独自 Web API を実行すると、PlayFab ユーザ情報が含まれたパラメタが含まれた状態でリクエストが飛んでくるため、その情報を利用することでサーバーサイドで PlayFab の操作を行うことが出来るようになり大変便利です。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;そのため、あるプロジェクトでは PlayFab CloudFunction を Azure Function や AWS Lambda のような FaaS を使っている感じで利用しておりました。&lt;em&gt;そして、その利用の仕方は誤りであったことに後々気づきます&amp;hellip;&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&#34;負荷テストを実装するフェーズで-cloudfunction-を大量に叩いてみる&#34;&gt;負荷テストを実装するフェーズで CloudFunction を大量に叩いてみる&lt;/h2&gt;
&lt;p&gt;PlayFab の CloudFunction を実行するにあたり利用した PlayFab の API は &lt;a href=&#34;https://docs.microsoft.com/en-us/rest/api/playfab/cloudscript/server-side-cloud-script/executefunction?view=playfab-rest&#34;&gt;&lt;code&gt;Server-Side Cloud Script - Execute Function&lt;/code&gt;&lt;/a&gt; というものになります。&lt;/p&gt;
&lt;p&gt;同接 2000 人想定で負荷テストのシナリオを実装することが求められていたため、その通りシンプルに 2000 件同時に &lt;code&gt;Server-Side Cloud Script - Execute Function&lt;/code&gt; を実行するシナリオを Gatling で組んでみました。すると、&lt;strong&gt;何回やっても数十件以上は必ずエラーが発生していることが分かりました。&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>📝 Jest で private readonly な値をモックする方法</title>
      <link>https://nikaera.com/archives/jest-private-readonly-mock/</link>
      <pubDate>Sun, 07 Mar 2021 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/jest-private-readonly-mock/</guid>
      <description>&lt;p&gt;Jest でクラスの &lt;code&gt;private readonly&lt;/code&gt; な変数を差し替えたい時に若干引っかかったのでメモっておきます。タイトルでは Jest とありますが、本記事の内容は JavaScript でモックする際の有効な手法の 1 つとして利用することが可能です。&lt;/p&gt;
&lt;p&gt;結論から言うと変数を差し替えたい場合は下記のような記述になります。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;mockValue&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Object.&lt;span style=&#34;color:#a6e22e&#34;&gt;defineProperty&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;service&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;privateReadOnlyValue&amp;#34;&lt;/span&gt;, {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;mockValue&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ちなみに関数を差し替えたい場合は下記のような記述になります。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Object.&lt;span style=&#34;color:#a6e22e&#34;&gt;defineProperty&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;service&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;privateSumFunction&amp;#34;&lt;/span&gt;, {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;jest&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;fn&lt;/span&gt;((&lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;b&lt;/span&gt;) =&amp;gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;b&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;各種テストケースで使いまわしているインスタンスの &lt;code&gt;private readonly&lt;/code&gt; な変数をモックした場合、値をリストアしたいケースも出てきました。その場合の記述としては、下記が有効でした。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// tmpService 変数に service インスタンスを clone して利用する
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;tmpService&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Object.&lt;span style=&#34;color:#a6e22e&#34;&gt;create&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;service&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Object.&lt;span style=&#34;color:#a6e22e&#34;&gt;defineProperty&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;tmpService&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;privateReadOnlyValue&amp;#34;&lt;/span&gt;, {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;参考リンク&#34;&gt;参考リンク&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/create&#34;&gt;Object.create() - JavaScript | MDN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/facebook/jest/issues/2227#issuecomment-265005782&#34;&gt;Mocking read-only properties for a class · Issue #2227 · facebook/jest&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    <item>
      <title>📔 Vercel の定期デプロイを GitHub Actions で実現する</title>
      <link>https://nikaera.com/archives/vercel-github-actions/</link>
      <pubDate>Thu, 04 Feb 2021 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/vercel-github-actions/</guid>
      <description>&lt;h1 id=&#34;はじめに&#34;&gt;はじめに&lt;/h1&gt;
&lt;p&gt;最近 &lt;a href=&#34;https://zenn.dev/catnose99&#34;&gt;catnose99&lt;/a&gt; さんの &lt;a href=&#34;https://zenn.dev/catnose99/articles/cb72a73368a547756862&#34;&gt;チーム個々人のテックブログを RSS で集約するサイトを作った（Next.js）&lt;/a&gt; を利用させていただく形で &lt;a href=&#34;https://tech.kadinche.com/&#34;&gt;会社のテックブログ&lt;/a&gt; を構築しました。&lt;/p&gt;
&lt;div class=&#34;linkcard-container&#34; style=&#34;margin: var(--content-gap) 0;&#34;&gt;
            &lt;a href=&#34;https://tech.kadinche.com/&#34; 
               class=&#34;linkcard&#34; 
               style=&#34;
                   display: flex;
                   text-decoration: none;
                   color: var(--content);
                   background: var(--entry);
                   border: 1px solid var(--border);
                   border-radius: 12px;
                   padding: 0px 0px 0px 20px;
                   transition: background-color 0.3s ease;
                   box-shadow: 0 4px 8px rgba(0,0,0,0.08);
                   min-height: 140px;
                   overflow: hidden;
               &#34; 
               onmouseover=&#34;this.style.backgroundColor=&#39;rgb(56, 56, 61)&#39;;&#34; 
               onmouseout=&#34;this.style.backgroundColor=&#39;var(--entry)&#39;;&#34;
               target=&#34;_blank&#34;
               rel=&#34;noopener noreferrer&#34;&gt;&lt;div class=&#34;linkcard-content&#34; style=&#34;flex: 1; display: flex; flex-direction: column; min-width: 0; margin-top: 20px; margin-right: 20px;&#34;&gt;&lt;div class=&#34;linkcard-title&#34; style=&#34;margin-bottom: 10px;&#34;&gt;
                        &lt;h3 style=&#34;
                            margin: 0;
                            font-size: 18px;
                            font-weight: 600;
                            line-height: 1.3;
                            color: var(--primary);
                            overflow: hidden;
                            display: -webkit-box;
                            -webkit-box-orient: vertical;
                            -webkit-line-clamp: 2;
                            line-clamp: 2;
                        &#34;&gt;
                            Kadinche Tech Blog
                        &lt;/h3&gt;
                    &lt;/div&gt;&lt;p class=&#34;linkcard-description&#34; style=&#34;
                        margin: 0;
                        font-size: 14px;
                        line-height: 1.5;
                        color: var(--secondary);
                        overflow: hidden;
                        display: -webkit-box;
                        -webkit-box-orient: vertical;
                        -webkit-line-clamp: 2;
                        line-clamp: 2;
                        flex: 1;
                        margin-bottom: 12px;
                    &#34;&gt;
                        カディンチェ株式会社は、エンジニアリングで社会的価値を生むことに特化した会社です。社会に向けた研究開発や実験を行いながら、物質的な豊かさではなく、知恵/経験的な豊かさを創出することに取り組みます。技術の発展こそ、人類の発展であるという信念を持ち、先端技術を用いた問題解決への意識を持って行動します。その一環として 2008 年の会社設立当初から、xR の受託開発に日々取り組んでいます。
                    &lt;/p&gt;</description>
    </item>
    <item>
      <title>📔 Actix web で HttpOnly な Cookie を設定する</title>
      <link>https://nikaera.com/archives/cookie-rust-actix-web/</link>
      <pubDate>Sat, 23 Jan 2021 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/cookie-rust-actix-web/</guid>
      <description>&lt;h1 id=&#34;はじめに&#34;&gt;はじめに&lt;/h1&gt;
&lt;p&gt;最近 Rust を勉強するため、&lt;a href=&#34;https://github.com/actix/actix-web&#34;&gt;Actix web&lt;/a&gt; で &lt;a href=&#34;https://github.com/nikaera/bloggimg&#34;&gt;Bloggimg&lt;/a&gt; という Web アプリケーションを作りました。その際、セッション管理のために Cookie を利用したのですが、その際の手順及び設定方法についてまとめておきます。&lt;/p&gt;
&lt;p&gt;本記事では Rust や Actix web のインストール方法については説明しません。Mac であれば &lt;code&gt;brew install rustup&lt;/code&gt; して &lt;code&gt;rustup-init&lt;/code&gt; した後、&lt;code&gt;PATH&lt;/code&gt; に &lt;code&gt;$HOME/.cargo/bin&lt;/code&gt; を追加するだけで大丈夫なはずです。詳細なインストール手順については &lt;a href=&#34;https://www.rust-lang.org/tools/install&#34;&gt;公式サイト&lt;/a&gt; をご参照ください。&lt;/p&gt;
&lt;p&gt;開発環境については &lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=rust-lang.rust&#34;&gt;VSCode の Rust Plugin&lt;/a&gt; がオススメです。Rustup で Rust をインストールしている場合、設定から Rustup の PATH を &lt;code&gt;$HOME/.cargo/bin/rustup&lt;/code&gt; にするだけで利用可能です。設定手順の詳細は&lt;a href=&#34;https://takoyaking.hatenablog.com/entry/2020/01/05/180000&#34;&gt;こちら&lt;/a&gt;をご参照ください。&lt;/p&gt;
&lt;h1 id=&#34;動作環境&#34;&gt;動作環境&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Mac mini (M1, 2020)
&lt;ul&gt;
&lt;li&gt;Rust 1.49&lt;/li&gt;
&lt;li&gt;Actix web 3&lt;/li&gt;
&lt;li&gt;Serde 1.0&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Cargo.toml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;package&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;cookie_test&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;version&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;0.1.0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;authors&lt;/span&gt; = [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;nikaera&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;edition&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2018&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;dependencies&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;actix-web&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;3&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;serde&lt;/span&gt; = { &lt;span style=&#34;color:#a6e22e&#34;&gt;version&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;1.0&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;features&lt;/span&gt; = [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;derive&amp;#34;&lt;/span&gt;] }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;actix-web-で-cookie-をセットする&#34;&gt;Actix web で Cookie をセットする&lt;/h1&gt;
&lt;p&gt;サーバー側で Cookie を設定するため、HTTP レスポンスヘッダーに &lt;a href=&#34;https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Set-Cookie&#34;&gt;Set-Cookie&lt;/a&gt; を含める形でセッション情報をクライアントへ渡します。その際、最低でも Cookie の属性に &lt;code&gt;HttpOnly&lt;/code&gt; と &lt;code&gt;Secure&lt;/code&gt;、&lt;code&gt;SameSite=Strict&lt;/code&gt; は設定します。実際の Cookie を設定するための Actix web でのサンプルコードは下記になります。&lt;/p&gt;</description>
    </item>
    <item>
      <title>📔 AWS Lightsail Containers に Actix web をデプロイする</title>
      <link>https://nikaera.com/archives/aws-lightsail-containers-rust-actix-web/</link>
      <pubDate>Sat, 23 Jan 2021 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/aws-lightsail-containers-rust-actix-web/</guid>
      <description>&lt;h1 id=&#34;はじめに&#34;&gt;はじめに&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/actix/actix-web&#34;&gt;Actix web&lt;/a&gt; で Web アプリケーションを作ったのですが、技術勉強も兼ねていたので、デプロイ先も今まで試したことがないものを試そうとしていました。そこで、日頃業務でも AWS を利用しているということもあり、去年末に発表された &lt;a href=&#34;https://aws.amazon.com/jp/about-aws/whats-new/2020/11/announcing-amazon-lightsail-containers/&#34;&gt;AWS Lightsail Containers&lt;/a&gt; をデプロイ先に採用しました。&lt;/p&gt;
&lt;p&gt;AWS Lightsail Containers へのデプロイ自体は非常に簡単でした。また、デプロイにあたり Rust の Docker イメージ作成のやり方も学べました。今回はそのあたりの手順をまとめる形で記事として書き残しておくことにしました。&lt;/p&gt;
&lt;h1 id=&#34;actix-web-の-docker-イメージを作成する&#34;&gt;Actix web の Docker イメージを作成する&lt;/h1&gt;
&lt;p&gt;開発したアプリケーションでは React でフロントエンド開発をしていて、ビルドしたものを Actix web の public フォルダに配置する形で公開しています。そのため、下記の Dockerfile ではマルチステージビルドを利用しておりますが、本質的には &lt;code&gt;FROM rust:1.49&lt;/code&gt; 以降の記述が Actix web に関するものとなります。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-Dockerfile&#34; data-lang=&#34;Dockerfile&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# React ビルド用のイメージ&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; node:14.15.4-alpine3.10 as client_builder&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;ARG&lt;/span&gt; REACT_APP_API_URL&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;ARG&lt;/span&gt; REACT_APP_GYAZO_AUTH_URL&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;ARG&lt;/span&gt; REACT_APP_GA_UNIVERSAL_ID&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;WORKDIR&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; /client&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;COPY&lt;/span&gt; ./client/package*.json .&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;RUN&lt;/span&gt; yarn install&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;ADD&lt;/span&gt; ./client .&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;RUN&lt;/span&gt; yarn build&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Actix web ビルド用のイメージ&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; rust:1.49&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Actix web にアクセスするためのポートを公開する&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;EXPOSE&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; 8080&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Actix web プロジェクトのフォルダをイメージに追加する&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;WORKDIR&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; /server&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;ADD&lt;/span&gt; ./server .&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# プロジェクトフォルダ内で `cargo install` してビルドを生成する&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;RUN&lt;/span&gt; cargo install --path .&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 不要になったファイル群を削除する&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;RUN&lt;/span&gt; ls | grep -v -E &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;templates&amp;#39;&lt;/span&gt; | xargs rm -r&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# React ビルド用のイメージでビルドした内容を Actix web ビルド用イメージに追加する&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;COPY&lt;/span&gt; --from&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;client_builder /client/build ./build&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;RUN&lt;/span&gt; mkdir tmp&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# `cargo install` コマンドで生成したビルドを実行して Actix web を起動する&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 下記のコマンド名称は Cargo.toml 内の [package.name] に準ずる&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;CMD&lt;/span&gt; [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;bloggimg-server&amp;#34;&lt;/span&gt;]&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;また、&lt;strong&gt;Docker ビルド時のオプション管理を楽にするため、Docker Compose を利用しました。単一の Docker イメージをビルドする際にも利用しておくことで、後々コンテナを追加して連携させたいときにも即座に対応できたりでオススメです。&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>📔 ブログを書く用途に特化した Gyazo のツールを開発してみた</title>
      <link>https://nikaera.com/archives/bloggimg-first-release/</link>
      <pubDate>Sun, 10 Jan 2021 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/bloggimg-first-release/</guid>
      <description>&lt;h1 id=&#34;はじめに&#34;&gt;はじめに&lt;/h1&gt;
&lt;p&gt;いつもブログ記事に載せるキャプチャ画像の編集 &amp;amp; アップロード先として &lt;a href=&#34;https://gyazo.com/&#34;&gt;Gyazo&lt;/a&gt; を利用させていただいているのですが、日々使っている中で不満に感じる点もちょくちょく出てくるようになってきました。&lt;/p&gt;
&lt;p&gt;そのため、3 連休を用いて &lt;a href=&#34;https://www.rust-lang.org/ja&#34;&gt;Rust&lt;/a&gt; の勉強がてら &lt;a href=&#34;https://www.bloggimg.net/&#34;&gt;Bloggimg&lt;/a&gt; というウェブアプリケーションを作ってみました。ソースコードは MIT ライセンスで &lt;a href=&#34;https://github.com/nikaera/bloggimg&#34;&gt;GitHub のリポジトリ&lt;/a&gt;にアップしております。&lt;em&gt;ちなみに最初は &lt;code&gt;Gyazo for Blog&lt;/code&gt; という名称で開発をしていたため、本記事内のスクショには &lt;code&gt;Gyazo for Blog&lt;/code&gt; という文字列が出てきますが、現在は &lt;code&gt;Bloggimg&lt;/code&gt; という名称になっております。。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;Bloggimg&lt;/code&gt; を開発したのは、ブログ記事を書く際に利用する画像のアップロードから加工、マークダウンとして利用するまでのフローを最適化したかったからです。&lt;/strong&gt; ブログ記事を書く際に、記事内で用いるスクショ画像の加工や、そのアップロードにすごく時間を取られてしまうなーと日頃から感じていたのでそれを解決したかったのです。✅&lt;/p&gt;
&lt;p&gt;開発中に得た知見等については別途技術記事として書いて残す予定です。&lt;/p&gt;
&lt;h1 id=&#34;考えていたこと&#34;&gt;考えていたこと&lt;/h1&gt;
&lt;p&gt;今回 Bloggimg の開発を行うに当たり、考えていた点は下記になります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;画像の編集ツールは引き続き Gyazo に用意されているものを使う
&lt;ul&gt;
&lt;li&gt;既に最高に使いやすい 👑&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;キャプチャ画像をアップロードする際に、&lt;strong&gt;自動的に特定のコレクションに紐付けるようにする&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;技術記事毎にコレクションを分けて管理しているため、技術記事を書いている最中にアップするキャプチャ画像は全て特定のコレクションにまとまっていて欲しい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ワークスペースのようなツールを目指し、ブログを書く時だけに使える機能を開発する
&lt;ul&gt;
&lt;li&gt;例えば、ワンクリックで画像マークダウンの記述がコピーできたり、画像のアップロードをし直しやすくするため画像削除がお手軽に出来るよう削除ボタンに即アクセス出来るようにしたり&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;特にアップした画像を &lt;strong&gt;自動的に特定のコレクションに紐付けるようにする&lt;/strong&gt; については本記事で紹介しているウェブアプリケーションを作成するキッカケとなった点なので外せない点でした。&lt;/p&gt;
&lt;h1 id=&#34;使い方&#34;&gt;使い方&lt;/h1&gt;
&lt;p&gt;Bloggimg の使い方についてご紹介いたします。&lt;/p&gt;
&lt;h2 id=&#34;ログインする&#34;&gt;ログインする&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://www.bloggimg.net/&#34;&gt;Bloggimg&lt;/a&gt; を利用するためには、まず Gyazo アカウントでログインして頂く必要がございます。トップページの右上にあるログインボタンから Gyazo アカウントでログインします。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;スクリーンショット 2021-01-11 15.31.27.png&#34; loading=&#34;lazy&#34; src=&#34;https://i.gyazo.com/b0e863464696ce778ca853d7fac56ab9.png&#34;&gt;
&lt;strong&gt;1. トップページ右上に配置されたログインボタンから Gyazo アカウント認証を行う&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;スクリーンショット 2021-01-11 15.35.59.png&#34; loading=&#34;lazy&#34; src=&#34;https://i.gyazo.com/1bd6c3212c8fa95196ec0eaaef94d4d7.png&#34;&gt;
&lt;strong&gt;2. Gyazo アカウント認証が正常に完了したら、再度トップページを開く&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;スクリーンショット 2021-01-11 15.42.21.png&#34; loading=&#34;lazy&#34; src=&#34;https://i.gyazo.com/110fe178f5f158153640ab25271d90a2.png&#34;&gt;
&lt;strong&gt;3. トップページを開いた時に Gyazo にアップした直近の画像が確認できるはずです&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>📝 AWS Lambda で cron みたいに定期実行する</title>
      <link>https://nikaera.com/archives/aws-lambda-cron/</link>
      <pubDate>Mon, 04 Jan 2021 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/aws-lambda-cron/</guid>
      <description>&lt;p&gt;コンテナをホットスタンバイさせるために EC2 でインスタンス起動して cron で ping 飛ばしていたのですが、コスト的に勿体ないなーと思っていました。しかし、「AWS Lambda 使えばいいじゃん」という指摘を受け、確かにってなったので cron で定期実行していた ping 処理を AWS Lambda + EventBridge で置き換えました。&lt;/p&gt;
&lt;p&gt;実は &lt;a href=&#34;https://devcenter.heroku.com/articles/scheduler&#34;&gt;Heroku Scheduler&lt;/a&gt; とか使って同様のことをしていた時期もあったのですが、10 分毎しか実行できない制約があったりして使い勝手が悪かったので、後々も使っていけそうな知見な気がしたのでメモがてら記事で残しておくことにしました。&lt;/p&gt;
&lt;p&gt;まず、AWS Console から Lambda サービスを選択して関数を新たに作成します。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;AWS Lambda のトップ画面から関数を新たに作成する&#34; loading=&#34;lazy&#34; src=&#34;https://i.gyazo.com/b4b591876af8519f9b22cfa35131327c.png&#34;&gt;
&lt;strong&gt;1. AWS Lambda のトップ画面から関数作成のための画面に遷移する&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;必要な情報を入力して AWS Lambda の関数を作成する&#34; loading=&#34;lazy&#34; src=&#34;https://i.gyazo.com/00a4e4415827a6e745f47e2ca5d39e1d.png&#34;&gt;
&lt;strong&gt;2. 必要な情報を入力して Lambda の関数を作成する&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;関数が作成でき次第、ping 処理を書いていきます。http リクエストを行うためのライブラリとして Node.js の標準モジュール(https) を利用します。&lt;/p&gt;
&lt;p&gt;Lambda 関数作成直後の &lt;code&gt;index.js&lt;/code&gt; は下記のような記述になっていると思います。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// index.js
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;exports&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;handler&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;async&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;event&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;// TODO implement
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;response&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;statusCode&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;200&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;body&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;JSON&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;stringify&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Hello from Lambda!&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;response&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;こちらを Node.js の標準モジュール(https) を利用する形で下記のように書き換えます。&lt;/p&gt;</description>
    </item>
    <item>
      <title>📔 理解したを受け入れたと捉える人たちに辟易する</title>
      <link>https://nikaera.com/archives/understanding-an-opinion-is-not-the-same-as-accepting-it/</link>
      <pubDate>Sat, 02 Jan 2021 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/understanding-an-opinion-is-not-the-same-as-accepting-it/</guid>
      <description>&lt;h1 id=&#34;はじめに&#34;&gt;はじめに&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;本記事のカバー画像は &lt;a href=&#34;https://unsplash.com/@fedotov_vs?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&#34;&gt;Vladimir Fedotov&lt;/a&gt; による &lt;a href=&#34;https://unsplash.com/?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&#34;&gt;Unsplash&lt;/a&gt; の画像です。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;最近「ちゃんと理解してくれた？」ということを聞かれた時に「理解したけど、そういう行動を取るつもりはない」というと、「理解してないじゃん」と言われることが何回かあったので、その時の対処法及び感じた心情などをこの記事で吐露したいと思います。&lt;/p&gt;
&lt;p&gt;年始からこういう記事を書くのは気が引けたのですが、あまりにも本記事タイトルのような方と多く遭遇したため&amp;hellip;&lt;/p&gt;
&lt;h1 id=&#34;理解するということ&#34;&gt;理解するということ&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;「理解する」というのは、相手の言動の意味が正しく分かったということを意味します。&lt;/strong&gt; その言動をそのまま自身に取り入れることは意味しません。例えば、犯罪者の行動理由が正しく分かったところで、それを自分の行動規範に取り入れることはしないはずです。&lt;/p&gt;
&lt;p&gt;双方がコミュニケーションを取り正しく分かったという状態になっている前提ですが、「理解したけど、そういう行動を取るつもりはない」という発言を受けてから「理解してないじゃん」という言動を発してしまうのは勘違いも甚だしいです。&lt;/p&gt;
&lt;p&gt;上記はもはや理解した・してないとかの次元ではなく、&lt;strong&gt;相手を自分の言動でコントロールしたいがために会話している状態と捉えられても文句は言えません。&lt;/strong&gt; 一種のマインドコントロールに近いかもしれません。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ちなみにこの傾向は、直接話したいと言ってくる人に多いです。しかも、そういった人に限り相手の都合を考慮せずに何回も同期的なコミュニケーションを取ろうとしてきたり、スグに語気を強めて自分が不満であることを感情でアピールしようとしてきます。また、「絶対」 とか 「必ず」 とか 「必要」 という言葉を不適切に多用する傾向が多いです。&lt;/strong&gt;&lt;br&gt;
例えば、突然語気が強くなったり、攻撃的なメッセージの後に「電話して」等送ってくる人らが該当します。更に特筆すべき事項としては &lt;strong&gt;怒ったと思ったらいきなり優しくなる DV の典型的なパターンであることが多いです。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;筆者はコミュニケーションは双方の歩み寄りが前提で成り立つものと考えている&lt;/strong&gt; ので、そういったやり取りになってしまった場合は残念ですが、親戚だろうが親族だろうが関係なく断絶か、それが出来ない場合は自分から可能な限り距離を置くようにしています。&lt;/p&gt;
&lt;h1 id=&#34;受け入れるということ&#34;&gt;受け入れるということ&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;「受け入れる」というのは、相手の何らかの言動をそのまま自分に取り入れることを意味します。&lt;/strong&gt; 相手の言動を理解した上で、自分が間違っていたり知識不足であった場合に、それを認めて言動を正しく自身に取り入れるということは視野を広げる上で重要です。&lt;/p&gt;
&lt;p&gt;しかし、注意点として「理解してないけど受け入れる」場合は、自分で何も考えないで言動を取り入れることを意味するため危険です。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;世の中には根気よく話せば伝え方を変える等の工夫をせずとも無条件にこちらを説き伏せることが出来ると思ってたり、一回考えを相手に話しきったらその思いが全て伝わり、勝手にこちらがその思い通りに行動すると思っている人が意外と多いです。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;上記のような人物への対策としては、&lt;strong&gt;自分の言動の主導権を他人に握らせないが基本戦略となります。&lt;/strong&gt; そういった人物は会話のペースや話の進め方が自分勝手なことが多いので、そこで折れずに反応もせずに自分の意思は持ちつつ、適当にいなすような感じで話を流すと無駄に疲れずに済みます。&lt;/p&gt;
&lt;p&gt;例外として、&lt;strong&gt;自分が相手の言動に勝手にレッテルを貼り一方的に理解したつもりで、「受け入れない」という選択肢を取ることはオススメしません。自分の視野を狭める行為だからです。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;つまり、理解するという行為はどんな状況であれ双方が取り組むべきであるが、受け入れる行為はお互いに選択の自由があるという前提を忘れずにいるべきと考えます。特に、&lt;strong&gt;こちらが決める権利があるはずの選択肢を、逆も然りですが、どんな人物が相手だろうがコントロールする権利は一切無いのでそのような話が出たときは注意する必要があります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;いずれにせよ、&lt;strong&gt;受け入れるというのは行為は、理解という前提があった上での、主体的な行動の結果であるべきと考えています。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;自分を押し殺して受け入れるということ&#34;&gt;自分を押し殺して受け入れるということ&lt;/h2&gt;
&lt;p&gt;前項でも簡単に説明した、「理解してないけど受け入れた」状態のことを指しますが、その場合のメリット・デメリットは下記になると考えています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;メリット
&lt;ul&gt;
&lt;li&gt;相手の言動が &lt;strong&gt;自分にとって 100% 正しかった場合&lt;/strong&gt; 、自分だけでは対処できなかった問題を解決できる可能性がある&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自分が納得することはないかもしれないが、&lt;/strong&gt; 少なくとも相手を納得させることは出来る
&lt;ul&gt;
&lt;li&gt;あくまでも、少しの間は相手を静かにさせることが出来るかもしれない程度&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;自分で考える労力を割くことが出来る。物事を真剣に検討するのにはそれなりの労力がかかる
&lt;ul&gt;
&lt;li&gt;ただし、&lt;strong&gt;自分で物事を検討して行動するための方法が身につかない。他者に依存する&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;デメリット
&lt;ul&gt;
&lt;li&gt;無意識下に相手の意のままに行動させられる可能性がある
&lt;ul&gt;
&lt;li&gt;経緯はどうであれ、自身の言動の責任は自身に帰属するため、責任を取る必要がある&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自分の言う通りに相手が動いてくれることが嬉しいと感じる人種は存在していて、その人達に面倒を見るといったような名目で監視されるようになる&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;自分が検討して取り入れたわけではないため、その結果の是非に関わらず学びが薄い
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;結果を反省して、自分の知見として次に繋げることがしづらい&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;他人の意見に忖度して物事の決断を行うようになると、主体的に行動を起こすエネルギーが無くなっていく&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;与えられた選択肢の中から最後に後悔しない決断が出来るのは自分しかいません&lt;/li&gt;
&lt;li&gt;選択肢の意味を正しく理解しないまま行動すると、失敗したときのダメージが大きくなります&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;上記を見ていただければ分かる通り、&lt;strong&gt;メリットは非常に薄い上に基本的にデメリットに直結するような内容が多いです。&lt;/strong&gt; つまり、メリットに感じる点は刹那的な効用であって、本質的には問題の要因でもあるということです。&lt;/p&gt;
&lt;p&gt;また、上記の中で最も重要な観点は &lt;strong&gt;他人の意見に忖度して物事の決断を行うようになると、主体的に行動を起こすエネルギーが無くなっていく&lt;/strong&gt; という点です。筆者はこの点を生きていく上で非常に重要な点の 1 つと考えています。&lt;/p&gt;
&lt;p&gt;その理由として、&lt;strong&gt;主体的に行動を起こすエネルギーが無くなると、1 日過ごす際の時間を有効活用できなくなったり、重要な決断をいつまでも先延ばしにしてしまうようになり、人生を楽しむ時間が削られていくと考えているからです。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;要は、&lt;strong&gt;面倒だからと言って理解せずに受け入れたり、他人の意見に忖度して決断を行うという行為を繰り返してしまうと、時間を浪費したり、1 日に楽しい時間を過ごせる割合が減っていき幸せの総量が減る&lt;/strong&gt; ということです。&lt;/p&gt;
&lt;h1 id=&#34;理解したを受け入れたと捉える人たちへの対策&#34;&gt;理解したを受け入れたと捉える人たちへの対策&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;まず距離を置くという対策をオススメします。反論や反発はオススメしません。時間を浪費するだけでなく、無駄にダメージを負わされる可能性が高いです。&lt;/strong&gt; また、強い言葉で一方的にコミュニケーションを取られた後「反省している」「言い過ぎた」等の言葉で優しくされたとしても決して距離は近づけないでください。&lt;strong&gt;もしそれで距離を近づけてしまうと相互依存のような形になっていき粘着されやすくなります。&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>📔 2020年の振り返り</title>
      <link>https://nikaera.com/archives/summarize-2020/</link>
      <pubDate>Thu, 31 Dec 2020 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/summarize-2020/</guid>
      <description>&lt;h1 id=&#34;はじめに&#34;&gt;はじめに&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;本記事のカバー画像は &lt;a href=&#34;https://pixabay.com/ja/users/jarmoluk-143740/?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=1080543&#34;&gt;Michal Jarmoluk&lt;/a&gt; による &lt;a href=&#34;https://pixabay.com/ja/?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=1080543&#34;&gt;Pixabay&lt;/a&gt; からの画像です。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;今年は結果的にプライベートと仕事の両面で充実した年にできました。来年の自分が今を振り返れるように、今年始めからの記憶を引っ張り出しながら総括しました。&lt;/p&gt;
&lt;p&gt;今年問わず作ったものは &lt;a href=&#34;https://nikaera.com/tech/&#34;&gt;Tech&lt;/a&gt; ページに、技術記事については &lt;a href=&#34;https://nikaera.com/rss_feeds/&#34;&gt;RSS Feeds&lt;/a&gt; にまとめてあります。&lt;/p&gt;
&lt;h1 id=&#34;出来事&#34;&gt;出来事&lt;/h1&gt;
&lt;h2 id=&#34;1月&#34;&gt;1月&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://note.com/nikaera/n/n859dac693e73&#34;&gt;Death Stranding のプラチナ獲得&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;弊社に面接にいらっしゃったベテラン開発者の方に何でうちに応募してくださったのか聞いたら、僕の Twitter や Qiita アカウントを見てくださり技術力がありそうと判断してくれたからと聞いて爆嬉しかった&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://twitter.com/nikaera/status/1227047114166820870?s=20&#34;&gt;ambr オフ会参加 (オフィシャルなオフ会に初参加)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Quest 用アプリケーションの初リリース体験実績解除
&lt;ul&gt;
&lt;li&gt;申請時の知見の一部については &lt;a href=&#34;https://qiita.com/nikaera/items/4adaa276e6115c7aa95b&#34;&gt;Qiita 記事&lt;/a&gt; として投下&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Android で AR アプリケーションの開発及び、マルチプレイを可能にするバックエンド開発を担当した&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;2月&#34;&gt;2月&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://qiita.com/nikaera/items/30e1c7981aecbdc07e9e&#34;&gt;Docker で各種モバイル VR 向けの Unity ビルドが出来るようにした&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;フルリモートでアジャイルな開発チームにジョインする (WebView/ReactNative/iOS/Android)
&lt;ul&gt;
&lt;li&gt;主は ReactNative の iOS/Android のネイティブプラグイン開発&lt;/li&gt;
&lt;li&gt;コア機能の実装にのみ注力しパフォーマンスチューニング等々を行っていたためポジション的にはひたすら地味だった&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;3月&#34;&gt;3月&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://note.com/nikaera&#34;&gt;note&lt;/a&gt; デビューした
&lt;ul&gt;
&lt;li&gt;初投稿は &lt;a href=&#34;https://note.com/nikaera/n/na290d203aa5a&#34;&gt;精神衛生を保つため Chrome で Twitter を閲覧している時にフォロワー数を非表示にする&lt;/a&gt; っていうやつ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;お題が「Home」の &lt;a href=&#34;https://crieit.net/boards/web1week-202003&#34;&gt;web1week&lt;/a&gt; に参加した
&lt;ul&gt;
&lt;li&gt;参加した時に投稿した記事は&lt;a href=&#34;https://crieit.net/boards/web1week-202003/661fc53a1809d108713c0ebcb2e0ab17&#34;&gt;こちら&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;4月&#34;&gt;4月&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://medium.com/kadinche-engineering&#34;&gt;会社の Medium ブログ開設&lt;/a&gt; したのと、いくつか記事を寄稿した
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://medium.com/kadinche-engineering/azure-kinect-dk-%E3%81%AE%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%81%8B%E3%82%89-kinectfusion-%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%82%92%E5%8B%95%E3%81%8B%E3%81%99%E3%81%BE%E3%81%A7-cd7d550994fe&#34;&gt;Azure Kinect DK の開発環境構築から KinectFusion のサンプルを動かすまで&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://medium.com/kadinche-engineering/%E6%9C%80%E7%9F%AD%E3%81%A7-magic-leap-1-%E3%81%AE%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B-f1cf41864dde?source=collection_home---6------6-----------------------&#34;&gt;最短で Magic Leap 1 の開発環境を構築する&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;色々工夫して iPhone TrueDepth を WebRTC でブラウザに転送して、Three.js で表示する仕組みを実現した
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://twitter.com/nikaera/status/1248933812530118656?s=20&#34;&gt;Twitter でシェア&lt;/a&gt; してみたら、予想だにしないことに一方的に尊敬していたエンジニアの方々からいいねを貰えてモチベが爆上がりした&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CloudFormation と和解。IaC の利便性を完全に理解し始める&lt;/li&gt;
&lt;li&gt;今更 SEKIRO にハマりまくる &amp;amp; &lt;a href=&#34;https://twitter.com/nikaera/status/1255211139371134976?s=20&#34;&gt;プラチナトロフィー獲得&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://note.com/nikaera/n/n859dac693e73&#34;&gt;デス・ストランディングから学んだこと&lt;/a&gt; が現在の自分の考え方の基礎として根付き始める
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;全ての考え方を 0 or 1 ではなく、グラデーションにハメ込むことが出来るようになった&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;5月&#34;&gt;5月&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;再びお題が「Like」の &lt;a href=&#34;https://crieit.net/boards/web1week-202005&#34;&gt;web1week&lt;/a&gt; に参加した
&lt;ul&gt;
&lt;li&gt;参加した時に投稿した記事は&lt;a href=&#34;https://crieit.net/boards/web1week-202003/30DaysSongChallenge-30&#34;&gt;こちら&lt;/a&gt; (あとから確認したら投稿先を間違えていた&amp;hellip;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Medium に目次が無いことに不満をいただき &lt;a href=&#34;https://chrome.google.com/webstore/detail/toc-of-medium/jcpcpidaogolhkcapgdiblaeglijmhaa?hl=ja&#34;&gt;Chrome プラグイン&lt;/a&gt;を作成する
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://medium.com/@nikaera/chrome-extension-for-creating-a-toc-for-medium-8c8d344313fe&#34;&gt;プラグインの紹介記事&lt;/a&gt; まで書いてたけど全くインストール数伸びなかった、、けど今みたら 12人ほど使ってくれている人いるぽくて嬉しい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;お題が「密」の unity1week に &lt;a href=&#34;https://unityroom.com/games/seimitsu&#34;&gt;参戦した&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;6月&#34;&gt;6月&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;S3 + EventBridge + CloudWatch + CloudFront + MediaLive + MediaPackage + AppSync + Amplify + DynamoDB + Cognito + Lambda + API Gateway + SSM という AWS ガッツリなインフラ構築から、バックエンド開発及び iOS アプリ開発までをおもむろに始めた
&lt;ul&gt;
&lt;li&gt;まず &lt;a href=&#34;https://qiita.com/nikaera/items/c4a4c2f5eb74b5732294&#34;&gt;DynamoDB の仕様にハマる&lt;/a&gt; (自分のリサーチ &amp;amp; 勉強不足によるせい&amp;hellip;)&lt;/li&gt;
&lt;li&gt;つぎに &lt;a href=&#34;https://zenn.dev/nikaera/articles/cloudfront-for-mediapackage&#34;&gt;MediaPackage + CloudFront の構築&lt;/a&gt; に苦戦する&lt;/li&gt;
&lt;li&gt;そしてデバッグが辛くなり &lt;a href=&#34;https://qiita.com/nikaera/items/27c1ba5f8fd2e61425c4&#34;&gt;Serverless Framework でエラーを検知して Webhook で Slack に通知を飛ばす方法&lt;/a&gt; を実践し始めたりしていた&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://third.shenmue.com/&#34;&gt;シェンムー3&lt;/a&gt; のプレイを開始。&lt;a href=&#34;https://twitter.com/nikaera/status/1298642734912163842?s=20&#34;&gt;ワクワクするし美しすぎる町並み&lt;/a&gt;に興奮し、しばらくの間深夜までプレイする日々が続く&lt;/li&gt;
&lt;li&gt;映画の &lt;a href=&#34;https://hello-world-movie.com/&#34;&gt;HELLO WORLD&lt;/a&gt; を見て、劇中 3回号泣する
&lt;ul&gt;
&lt;li&gt;元々は &lt;a href=&#34;https://jp.gamesindustry.biz/article/1909/19093002/&#34;&gt;Unity で作られたシーンがあるという記事&lt;/a&gt; を見て興味を持ち見ようと思い立った感じだった&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;7月&#34;&gt;7月&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ひたすらトラブルバスターしてた (一番忙しかった気がする)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;8月&#34;&gt;8月&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.playstation.com/ja-jp/games/ghost-of-tsushima/&#34;&gt;Ghost of Tsushima&lt;/a&gt; にハマりまくる &amp;amp; &lt;a href=&#34;https://twitter.com/nikaera/status/1290268995912794117?s=20&#34;&gt;プラチナトロフィー獲得&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;DDD 開発の際、DI コンテナ入れたいよねっていう話から TypeScript 環境で利用可能なライブラリを調査して &lt;a href=&#34;https://github.com/inversify/InversifyJS&#34;&gt;InversifyJS&lt;/a&gt; と &lt;a href=&#34;https://github.com/microsoft/tsyringe&#34;&gt;tsyringe&lt;/a&gt; を見つける
&lt;ul&gt;
&lt;li&gt;最初 InversifyJS を発見してそれで開発をしていたものの、microsoft 製の tsyringe を発見し、「メンテナが大手だしコンストラクタインジェクションだけしか使わないし、こっちのが良くね？」という話になり InversifyJS から tsyringe へのリライト作業を行う&amp;hellip;w&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.aws.amazon.com/sdk-for-go/api/service/s3/#example_S3_CopyObject_shared00&#34;&gt;AWS SDK for Go&lt;/a&gt; で関数の引数と返り値を Type で定義するっていう考え方は非常に参考になった
&lt;ul&gt;
&lt;li&gt;引数が &lt;code&gt;*Input&lt;/code&gt; という定義で、返り値が &lt;code&gt;*Output&lt;/code&gt; という定義で分かりやすく読みやすい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;自作 iOS ライブラリの CocoaPods 対応について C++ 周りの linker error に対する解決のためのアドバイスを急ぎ求められたので、&lt;strong&gt;共有された情報から自分がハマった経験に照らし合わせてソレっぽい対策案を共有したらガチッとハマって解決でき、経験が生きた感がめっちゃあって、めちゃくちゃ嬉しかった&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;9月&#34;&gt;9月&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;フライパンでコーヒーの焙煎を始める
&lt;ul&gt;
&lt;li&gt;チャフの飛散に苦しめられるが、風呂場で作業することで諸々ストレスフリーになる&lt;/li&gt;
&lt;li&gt;このときはまだ、後ほど焙煎機を購入することになるとは夢にも思わなかったのである&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Azure を用いた開発に本格的に携わり始める
&lt;ul&gt;
&lt;li&gt;その際得た知見は Zenn で &lt;a href=&#34;https://zenn.dev/nikaera/books/nestjs-azure-dev&#34;&gt;本としてまとめた&lt;/a&gt;。本来は記事として書くつもりだったが、分量が増えすぎたため記事内容を分割して、本としてまとめた&lt;/li&gt;
&lt;li&gt;PlayFab CloudFunctions のための関数実装のために Azure でシステム構築していたため、PlayFab にもそれなりに詳しくなる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;とある案件から別案件に移る際に、 &lt;strong&gt;「えー、〇〇 に行っちゃうんですか。nikaera さんは今後も 〇〇 を一緒にやっていって欲しいのに」&lt;/strong&gt; って結構強めに言われたことが未だにめちゃくちゃ嬉しい&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;シンガポール現地のフリーランスの方と仕事を共同で進めることになる。技術に関する事柄やプライベートに関する事柄のやり取り等々、全て英語でコミュニケーションを行わざるを得なくなり、そのおかげで英語でコミュニケーションを取ることに一切抵抗が無くなる&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;10月&#34;&gt;10月&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;約 10 年ぶりに私用携帯を HTC EVO から iPhone 12 mini に機種変する&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;開発用途でなく普段生活で使うことのみを考慮するということであれば iPhone 12 mini は最強にオススメできるスマホです&lt;/li&gt;
&lt;li&gt;会社支給のスマホで 7年近くを賄っていたため、特に不便がなかったため&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AWS Amplify への &lt;a href=&#34;https://github.com/aws-amplify/amplify-cli/pull/5608&#34;&gt;PR&lt;/a&gt; がマージされる
&lt;ul&gt;
&lt;li&gt;もとは &lt;a href=&#34;https://github.com/bboure/serverless-appsync-simulator/issues/51#issuecomment-709808350&#34;&gt;serverless-amplify-simulator の Issue&lt;/a&gt; で議論していたのだが、改修すべき内容は &lt;code&gt;amplify-cli&lt;/code&gt; にあったのでそちらで PR を提出した&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;細かくづまづいた点を進捗共有兼ねて Issue で一人投稿しまくっておくと、他の開発者の役にも立てるし自然とその問題に詳しくなっていくし、OSS 活動への取っ掛かりとしては最高なんじゃないかと勝手に思い始める&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;NPM に初自作ライブラリを公開する
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/serverless-amplify-auth&#34;&gt;serverless-amplify-auth&lt;/a&gt; という Amplify 開発を行う際は必ず行うであろう IAM Policy の制限を Serverless で行うことが出来るようにするやつ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;11月&#34;&gt;11月&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://gohugo.io/&#34;&gt;Hugo&lt;/a&gt; で自分のブログ(&lt;a href=&#34;https://nikaera.com/&#34;&gt;nikaera.com&lt;/a&gt;)を &lt;a href=&#34;https://docs.github.com/ja/free-pro-team@latest/github/working-with-github-pages/about-github-pages&#34;&gt;GitHub Pages&lt;/a&gt; 上に構築する&lt;/li&gt;
&lt;li&gt;カジュアル面談した人に &lt;a href=&#34;https://qiita.com/nikaera/items/508b88a060c8a7b68ec2&#34;&gt;Qiita のネタ記事&lt;/a&gt; 見ましたって言われて嬉しいよりも恥ずかしいが上回った&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.etsy.com/&#34;&gt;Etsy&lt;/a&gt; でアクセサリ販売している方に日本のフリマ事情を詳細にお伝えしたらおまけのプレゼントを送付してくださった
&lt;ul&gt;
&lt;li&gt;ちなみに購入物は Death Stranding の &lt;a href=&#34;https://www.etsy.com/listing/834901460/inspired-by-death-stranding-sam-bridges?ref=yr_purchases&#34;&gt;ドリームキャッチャー&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Moonlander が自宅に届きテンション上がって&lt;a href=&#34;https://nikaera.com/archives/introduction-to-moonlander/&#34;&gt;紹介記事を書く&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;12月&#34;&gt;12月&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;今年学んだ重要なことを &lt;a href=&#34;https://nikaera.com/archives/birthday-2020/&#34;&gt;記事&lt;/a&gt; として残しといた (これもある意味総括な気がする)&lt;/li&gt;
&lt;li&gt;GitHub Profile を充実させる
&lt;ul&gt;
&lt;li&gt;こんな感じ -&amp;gt; &lt;a href=&#34;https://github.com/nikaera&#34;&gt;https://github.com/nikaera&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;更に GitHub Profile を充実させるために &lt;a href=&#34;https://zenn-badge.vercel.app/&#34;&gt;Zenn のバッジを作成するサービス&lt;/a&gt; を作った&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://lapras.com/public/JPCBXDB&#34;&gt;Lapras&lt;/a&gt; の技術力スコアが &lt;strong&gt;3.36&lt;/strong&gt; になってた
&lt;ul&gt;
&lt;li&gt;基準とか良く分からないけど純粋に上位 13% に入ったと言われてるのは嬉しかった&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;いくつか空いてたアドベントカレンダーに参戦した
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://qiita.com/nikaera/items/b866fd6adca12a88f0ed&#34;&gt;MediaPackage 用の CloudFront ディストリビューションを AWS SDK で作成する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://qiita.com/nikaera/items/825165be91ad5cdb6b56&#34;&gt;Serverless のプラグインを TypeScript で作成する方法&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS Lambda を用いた他社製品との連携システムが好評で、去年から今年末まで特に目立った不具合等も起きずに運用できたため、次期開発に繋がりそうとの連絡があり開発者として爆喜ぶ&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;おわりに&#34;&gt;おわりに&lt;/h1&gt;
&lt;p&gt;今年は後半からすごい勢いでギアが入ってきた感があり、諸々活動するための足がかりを作れた気がします。身も心も進化したなと思えて成長できたなという充足感は割と高めな 1年だったので、この勢いのまま 2021 年もマイペースに色んなことにチャレンジしていければなーと思っております。&lt;/p&gt;</description>
    </item>
    <item>
      <title>📝 React で highlight.js を適用する方法</title>
      <link>https://nikaera.com/archives/react-highlightjs/</link>
      <pubDate>Wed, 23 Dec 2020 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/react-highlightjs/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://zenn-badge.nikaera.vercel.app/&#34;&gt;Zenn.badge&lt;/a&gt; を作成する時に React に &lt;code&gt;highlight.js&lt;/code&gt; を組み込もうとしたのですが、若干躓いてしまったので対処法についてメモっておきます。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.npmjs.com/package/react&#34;&gt;React&lt;/a&gt; は既にプロジェクトにインストール済みと仮定します。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 一応 React をインストールするためのコマンドは ↓&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm i --save react react-dom
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;まずは &lt;a href=&#34;https://www.npmjs.com/package/highlight.js?activeTab=readme&#34;&gt;highlight.js&lt;/a&gt; を NPM or Yarn でインストールします。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# NPM で highlight.js をインストールする&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm i --save highlight.js
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yarn add highlight.js
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;その後、React ソースコードに &lt;code&gt;highlight.js&lt;/code&gt; を組み込みます。
ソースコードの全体像は下記のとおりです。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Head&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;next/head&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;styles&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;../styles/Home.module.css&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;React&lt;/span&gt;, { &lt;span style=&#34;color:#a6e22e&#34;&gt;useState&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;useEffect&lt;/span&gt; } &lt;span style=&#34;color:#a6e22e&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;react&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;highlight.js を import する
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;hljs&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;highlight.js/lib/core&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;シンタックスハイライトしたい言語のみ import として登録する
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;今回は html をハイライトしたかったので xml を import した
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;デザインは highlight.js/styles/~ を変更することで調整可能
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;https://highlightjs.org/ のトップページから各種デザインについては確認可能
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;(コード右下にある style の右側リンククリックで各種デザインのプレビューが可能)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;xml&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;highlight.js/lib/languages/xml&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;highlight.js/styles/github.css&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;hljs&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;registerLanguage&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;xml&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;xml&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;inputChecker&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;default&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Home&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; [&lt;span style=&#34;color:#a6e22e&#34;&gt;user&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;setUser&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;useState&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;nikaera&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; [&lt;span style=&#34;color:#a6e22e&#34;&gt;previewUser&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;setPreviewUser&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;useState&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;nikaera&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; [&lt;span style=&#34;color:#a6e22e&#34;&gt;badgeCode&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;setBadgeCode&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;useState&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;nikaera&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; [&lt;span style=&#34;color:#a6e22e&#34;&gt;style&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;setStyle&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;useState&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;plastic&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;useEffect のタイミングで hightlight.js の初期化を行う。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;called プロパティを false にすることで highlight.js で、
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;コードが変更された場合でも常にシンタックスハイライトすることが可能
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;useEffect&lt;/span&gt;(() =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;hljs&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;initHighlighting&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;hljs&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;initHighlighting&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;called&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;useEffect&lt;/span&gt;(() =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;    シンタックスハイライトしたいコード input フォームへの入力内容に応じて動的に変わる
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;    */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;setBadgeCode&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;`  &amp;lt;!-- Like のバッジ --&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  &amp;lt;a href=&amp;#34;https://zenn.dev/&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;user&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    &amp;lt;img src=&amp;#34;https://zenn-badge.herokuapp.com/s/&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;user&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/likes?style=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;style&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; alt=&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;user&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; likes&amp;#34; /&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  &amp;lt;/a&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  &amp;lt;!-- Articles のバッジ --&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  &amp;lt;a href=&amp;#34;https://zenn.dev/&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;user&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/articles&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    &amp;lt;img src=&amp;#34;https://zenn-badge.herokuapp.com/s/&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;user&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/articles?style=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;style&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; alt=&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;user&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; articles&amp;#34; /&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  &amp;lt;/a&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  &amp;lt;!-- Followers のバッジ --&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  &amp;lt;a href=&amp;#34;https://zenn.dev/&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;user&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/followers&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    &amp;lt;img src=&amp;#34;https://zenn-badge.herokuapp.com/s/&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;user&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/followers?style=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;style&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; alt=&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;user&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; followers&amp;#34; /&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  &amp;lt;/a&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  &amp;lt;!-- Books のバッジ --&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  &amp;lt;a href=&amp;#34;https://zenn.dev/&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;user&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/books&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    &amp;lt;img src=&amp;#34;https://zenn-badge.herokuapp.com/s/&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;user&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/books?style=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;style&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; alt=&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;user&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; books&amp;#34; /&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  &amp;lt;/a&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  &amp;lt;!-- Scraps のバッジ --&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  &amp;lt;a href=&amp;#34;https://zenn.dev/&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;user&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/scraps&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    &amp;lt;img src=&amp;#34;https://zenn-badge.herokuapp.com/s/&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;user&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/scraps?style=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;style&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; alt=&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;user&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; scraps&amp;#34; /&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  &amp;lt;/a&amp;gt;`&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }, [&lt;span style=&#34;color:#a6e22e&#34;&gt;user&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;style&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;handleChange&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;event&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;inputChecker&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;clearTimeout&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;inputChecker&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;inputChecker&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;setTimeout&lt;/span&gt;(() =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;clearTimeout&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;inputChecker&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;inputChecker&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;setPreviewUser&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;event&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;target&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1000&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;// 1 seconds
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;setUser&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;event&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;target&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;handleSelect&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;event&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;setStyle&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;event&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;target&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;className&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#a6e22e&#34;&gt;styles&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;container&lt;/span&gt;}&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Head&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;title&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Zenn&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;badge&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/title&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;link&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;rel&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;icon&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;zenn.svg&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;image/svg+xml&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;meta&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;content&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;GitHub Profile に載せるための Zenn の各種スコアバッジを作成するためのウェブサービス&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;meta&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;keywords&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;content&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Zenn, GitHub, GitHub Profile, Shields.io&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;meta&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;author&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;content&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;nikaera&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;meta&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;viewport&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;content&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;width=device-width, initial-scale=1.0&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;meta&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;property&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;og:url&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;content&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://zenn-badge.vercel.app/&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;meta&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;property&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;og:type&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;content&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;website&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;meta&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;property&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;og:title&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;content&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Zenn.badge&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;meta&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;property&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;og:description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;content&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;GitHub Profile に載せるための Zenn の各種スコアバッジを作成するためのウェブサービス&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;meta&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;property&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;og:site_name&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;content&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Zenn.badge&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;meta&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;property&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;og:image&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;content&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://zenn-badge.vercel.app/ogp_image.png&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/Head&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;className&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#a6e22e&#34;&gt;styles&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;}&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;h1&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;className&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#a6e22e&#34;&gt;styles&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;title&lt;/span&gt;}&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#a6e22e&#34;&gt;Welcome&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;to&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://zenn-badge.nikaera.vercel.app/&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Zenn&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;badge&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;!&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/a&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/h1&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;p&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;className&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#a6e22e&#34;&gt;styles&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;description&lt;/span&gt;}&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://zenn.dev/&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;target&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;_blank&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;rel&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;noopener noreferrer&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Zenn&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/a&amp;gt; のスコアを GitHub 風のバッジに変換するサービスです。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/p&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;div&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;h3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;注意事項&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;rarr&lt;/span&gt;;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/h3&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;p&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;下記の事項にご留意ください&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;。&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/p&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;ul&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;li&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;12&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;時間ほどデータがキャッシュされます&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/li&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;li&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;の動作を保証するものではありません&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/li&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;li&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;APIの利用数制限などにより&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;、&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;表示されない事があります&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/li&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;li&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;GitHub&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Profile&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;にご利用ください&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/li&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/ul&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;h3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;アカウント名を入力してください&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;rarr&lt;/span&gt;;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/h3&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;input&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#a6e22e&#34;&gt;user&lt;/span&gt;} &lt;span style=&#34;color:#a6e22e&#34;&gt;onChange&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#a6e22e&#34;&gt;handleChange&lt;/span&gt;} &lt;span style=&#34;color:#f92672&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;select&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;style&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#a6e22e&#34;&gt;style&lt;/span&gt;} &lt;span style=&#34;color:#a6e22e&#34;&gt;onChange&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#a6e22e&#34;&gt;handleSelect&lt;/span&gt;}&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;option&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;plastic&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;plastic&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/option&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;option&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;flat&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;flat&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/option&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;option&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;flat-square&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;flat&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;square&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/option&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;option&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;for-the-badge&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;the&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;badge&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/option&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;option&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;social&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;social&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/option&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/select&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            { &lt;span style=&#34;color:#75715e&#34;&gt;/* pre -&amp;gt; code タグ内に highlight.js で
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;            シンタックスハイライトしたい内容を出力する */&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;pre&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;style&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{{ &lt;span style=&#34;color:#a6e22e&#34;&gt;width&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;80vw&amp;#39;&lt;/span&gt; }}&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;code&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;className&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;xml&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              {&lt;span style=&#34;color:#a6e22e&#34;&gt;badgeCode&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/code&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/pre&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;h3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;プレビュー&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;rarr&lt;/span&gt;;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/h3&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;h4&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Likes&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;👍&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/h4&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;`https://zenn.dev/&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;previewUser&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;}&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;img&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;src&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;`https://zenn-badge.herokuapp.com/s/&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;previewUser&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/likes?style=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;style&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;} &lt;span style=&#34;color:#a6e22e&#34;&gt;alt&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;previewUser&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; likes`&lt;/span&gt;} &lt;span style=&#34;color:#f92672&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/a&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;h4&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Articles&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;📝&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/h4&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;`https://zenn.dev/&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;previewUser&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/articles`&lt;/span&gt;}&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;img&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;src&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;`https://zenn-badge.herokuapp.com/s/&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;previewUser&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/articles?style=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;style&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;} &lt;span style=&#34;color:#a6e22e&#34;&gt;alt&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;previewUser&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; articles`&lt;/span&gt;} &lt;span style=&#34;color:#f92672&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/a&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;h4&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Followers&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;👱&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/h4&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;`https://zenn.dev/&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;previewUser&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/followers`&lt;/span&gt;}&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;img&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;src&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;`https://zenn-badge.herokuapp.com/s/&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;previewUser&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/followers?style=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;style&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;} &lt;span style=&#34;color:#a6e22e&#34;&gt;alt&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;previewUser&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; followers`&lt;/span&gt;} &lt;span style=&#34;color:#f92672&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/a&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;h4&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Books&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;📚&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/h4&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;`https://zenn.dev/&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;previewUser&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/books`&lt;/span&gt;}&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;img&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;src&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;`https://zenn-badge.herokuapp.com/s/&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;previewUser&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/books?style=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;style&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;} &lt;span style=&#34;color:#a6e22e&#34;&gt;alt&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;previewUser&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; books`&lt;/span&gt;} &lt;span style=&#34;color:#f92672&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/a&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;h4&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Scraps&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;🗑️&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/h4&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;`https://zenn.dev/&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;previewUser&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/scraps`&lt;/span&gt;}&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;img&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;src&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;`https://zenn-badge.herokuapp.com/s/&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;previewUser&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/scraps?style=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;style&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;} &lt;span style=&#34;color:#a6e22e&#34;&gt;alt&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;previewUser&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; scraps`&lt;/span&gt;} &lt;span style=&#34;color:#f92672&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/a&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;h3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;問い合わせ&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;rarr&lt;/span&gt;;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/h3&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;div&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;下記&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;GitHub&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;の&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Issue&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;で&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;className&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#a6e22e&#34;&gt;styles&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;link&lt;/span&gt;} &lt;span style=&#34;color:#a6e22e&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://github.com/nikaera&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;nikaera&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/a&amp;gt; にメンションを付けてご連絡ください。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;ul&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;li&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;className&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#a6e22e&#34;&gt;styles&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;link&lt;/span&gt;} &lt;span style=&#34;color:#a6e22e&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://github.com/nikaera/zenn-badge&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Zenn&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;badge&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/ul&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/main&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;footer&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;className&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#a6e22e&#34;&gt;styles&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;footer&lt;/span&gt;}&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;制作者&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;nbsp&lt;/span&gt;;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;className&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#a6e22e&#34;&gt;styles&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;link&lt;/span&gt;} &lt;span style=&#34;color:#a6e22e&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://zenn.dev/nikaera&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;target&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;_blank&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;rel&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;noopener noreferrer&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;nikaera&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/a&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/footer&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>📔 Hugo で React &#43; TypeScript を利用してサクッとウェブサイトに RSS リーダーを追加する</title>
      <link>https://nikaera.com/archives/hugo-react-dev/</link>
      <pubDate>Tue, 22 Dec 2020 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/hugo-react-dev/</guid>
      <description>&lt;p&gt;&lt;em&gt;この記事は &lt;a href=&#34;https://qiita.com/advent-calendar/2020/static-site-generator&#34;&gt;Static Site Generator Advent Calendar 2020&lt;/a&gt; 22 日目の記事です。&lt;/em&gt;&lt;/p&gt;
&lt;h1 id=&#34;はじめに&#34;&gt;はじめに&lt;/h1&gt;
&lt;p&gt;Hugo のウェブサイトに組み込む RSS リーダーを TypeScript で開発してみたいと思い調査したところ、Hugo の最新版には &lt;a href=&#34;https://github.com/evanw/esbuild&#34;&gt;ESBuild&lt;/a&gt; が組み込まれていて、&lt;strong&gt;非常に手厚く JavaScript の開発環境がサポートされていることが分かりました。&lt;/strong&gt; 本記事では紹介していませんが &lt;a href=&#34;https://gohugo.io/hugo-pipes/babel/&#34;&gt;Babel&lt;/a&gt; も利用できるようです。&lt;/p&gt;
&lt;p&gt;また、NPM パッケージも利用できるため、普段のウェブ開発と同様の流れで開発ができ、各種ライブラリを用いた開発も非常に楽でした。
今回は Hugo で JavaScript 開発する方法を RSS リーダーの開発を例に上げ、そこで得た知見についても交える形で記事として残しておくことにしました。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ちなみに本記事内容は Hugo で JavaScript 開発する方法に焦点を絞ったものなのですが、ウェブサイトに RSS リーダーを組み込むことに焦点を絞って見たい方は &lt;a href=&#34;https://nikaera.com/archives/hugo-react-dev/#%28%e4%bd%99%e8%ab%87%29-rss-%e3%83%aa%e3%83%bc%e3%83%80%e3%83%bc%e3%82%92-hugo-%e3%81%ae-data-templates-%e3%81%a7%e5%ae%9f%e8%a3%85%e3%81%99%e3%82%8b&#34;&gt;&lt;code&gt;RSS リーダーを Hugo の Data Templates で実装する&lt;/code&gt;&lt;/a&gt; から見ていただくことをオススメします。&lt;/strong&gt;&lt;/p&gt;
&lt;h1 id=&#34;hugo-で-javascript-react--typescript-の開発環境を整える&#34;&gt;Hugo で JavaScript (React + TypeScript) の開発環境を整える&lt;/h1&gt;
&lt;p&gt;まず、&lt;strong&gt;TypeScript のビルドは ESBuild に任せることができるため何も行う必要はありません。&lt;/strong&gt; そのため React 開発用パッケージのインストールのみ行えば大丈夫です。&lt;/p&gt;
&lt;p&gt;Hugo プロジェクトのルートディレクトリで下記コマンドを実行し、&lt;code&gt;package.json&lt;/code&gt; を作成してから、React の開発に必要なパッケージをインストールします。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm init -y
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm install --save react react-dom
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;無事パッケージのインストールが完了したら、早速 TSX ファイルを &lt;code&gt;assets/js/App.tsx&lt;/code&gt; に作成してしまいます。&lt;/p&gt;</description>
    </item>
    <item>
      <title>📝 Hugo で外部リンクを target=&#34;_blank&#34; で開く方法</title>
      <link>https://nikaera.com/archives/hugo-open-external-link-in-a-new-window/</link>
      <pubDate>Thu, 17 Dec 2020 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/hugo-open-external-link-in-a-new-window/</guid>
      <description>&lt;p&gt;Hugo で設定した外部リンクを開くときは別ウィンドウで開けるようにしたかったので、Hugo のテーマファイルをオーバーライドして対応しました。外部リンクが設定されているときのみ &lt;code&gt;a&lt;/code&gt; タグに &lt;code&gt;target=&amp;quot;_blank&amp;quot; rel=&amp;quot;noopener noreferrer&amp;quot;&lt;/code&gt; が追加されるようにしました。&lt;/p&gt;
&lt;p&gt;テンプレートファイルは GO の HTML テンプレートで書かれているので、その書式にしたがって &lt;code&gt;a&lt;/code&gt; タグの属性を書き換えることで、外部リンクの場合は &lt;code&gt;target=&amp;quot;_blank&amp;quot; rel=&amp;quot;noopener noreferrer&amp;quot;&lt;/code&gt; を追加します。&lt;/p&gt;
&lt;p&gt;下記は &lt;a href=&#34;https://github.com/adityatelange/hugo-PaperMod&#34;&gt;hugo-PaperMod&lt;/a&gt; で、メインメニューの &lt;code&gt;a&lt;/code&gt; タグに &lt;code&gt;target=&amp;quot;_blank&amp;quot; rel=&amp;quot;noopener noreferrer&amp;quot;&lt;/code&gt; を追加するときのサンプルになります。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html:layouts/partials/header.html&#34; data-lang=&#34;html:layouts/partials/header.html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;ul&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;menu&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;menu&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;onscroll&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;menu_on_scroll()&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- `.Site.Menues.main` の要素数 (メニュー数) ループします --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {{- range .Site.Menus.main }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!--
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;        要素内の .URL にアクセスすることで設定されているリンクにアクセスする。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;        設定されている URL のプレフィクスが https:// or http:// であれば、
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;        絶対リンクが設定されているはずなため、外部リンクが設定されているとみなす。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;    --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {{- $is_abs_url := or (strings.HasPrefix .URL &amp;#34;https://&amp;#34;) (strings.HasPrefix .URL &amp;#34;http://&amp;#34;) }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!--
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;        もし外部リンクが設定されていれば、そのまま .URL の内容を出力する。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;        そうでなければ、内部リンクを language プレフィクスを付与した形で出力する。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;    --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {{- $menu_item_url := (cond $is_abs_url .URL (printf &amp;#34;%s/&amp;#34; .URL) ) | absLangURL }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;li&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!--
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;            外部リンクが設定されていたら ($is_abs_url が true なら)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;            a タグに target=&amp;#34;_blank&amp;#34; rel=&amp;#34;noopener noreferrer&amp;#34; を設定する
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;        --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{{ $menu_item_url }}&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;is_abs_url&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;}}&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;target&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;_blank&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;rel&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;noopener noreferrer&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;end&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;}}&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;span&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;eq&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;menu_item_url&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;page_url&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;}}&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;active&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;end&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;}}&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                {{ .Name }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;span&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;a&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;li&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {{- end -}}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;ul&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>📔 MediaPackage 用の CloudFront ディストリビューションを AWS SDK で作成する</title>
      <link>https://nikaera.com/archives/cloudfront-for-mediapackage/</link>
      <pubDate>Tue, 15 Dec 2020 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/cloudfront-for-mediapackage/</guid>
      <description>&lt;h1 id=&#34;はじめに&#34;&gt;はじめに&lt;/h1&gt;
&lt;p&gt;とある事情で MediaPackage のエンドポイント用の CloudFront ディストリビューションを AWS SDK で作成する機会がありました。その際得た知見をソースコードを交えながら備忘録として記事に残しておきます。&lt;/p&gt;
&lt;p&gt;本記事内容で紹介しているソースコードは &lt;a href=&#34;https://gist.github.com/nikaera/d9d616a089998ff2d23b210faf3a85c3&#34;&gt;Gist&lt;/a&gt; にも同じ内容でアップしてあります。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ちなみに MediaLive + MediaPackage + CloudFront の構成でインフラ構築したい場合は、&lt;a href=&#34;https://dev.classmethod.jp/articles/update-aws-elemental-mediapackage-cloudformation/&#34;&gt;CloudFormation が MediaPackage にも対応した&lt;/a&gt;ので CloudFormation の利用を推奨します。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;本記事内容はあくまでも何らかの事情で、&lt;strong&gt;後から CloudFront ディストリビューションを MediaPackage エンドポイントに紐づけたいケース等で参考になると思われます。&lt;/strong&gt;&lt;/p&gt;
&lt;h1 id=&#34;実装内容&#34;&gt;実装内容&lt;/h1&gt;
&lt;p&gt;作成したソースコードの内容は下記になります。
最下部の &lt;code&gt;createDistributionForMediaPackage&lt;/code&gt; が本記事タイトルに該当する関数です。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-typescript:CloudFrontClientForMediaPackage.ts&#34; data-lang=&#34;typescript:CloudFrontClientForMediaPackage.ts&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;CloudFront&lt;/span&gt; } &lt;span style=&#34;color:#66d9ef&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;aws-sdk&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;url&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;CreateDistributionWithTagsResult&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;GetDistributionResult&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;UpdateDistributionResult&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;} &lt;span style=&#34;color:#66d9ef&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;aws-sdk/clients/cloudfront&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;CloudFrontClientForMediaPackage&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;cloudFront&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;CloudFront&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;constructor&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;cloudFront&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;CloudFront&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;region&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ap-northeast-1&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;apiVersion&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;2020-05-31&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt; * CloudFront ディストリビューションの情報を取得するために利用する
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt; * @param id CloudFront ディストリビューションの ID
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt; * @return ディストリビューションの情報を取得する
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;async&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;getDistribution&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Promise&lt;/span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;GetDistributionResult&lt;/span&gt;&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;distribution&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;cloudFront&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;getDistribution&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#a6e22e&#34;&gt;Id&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }).&lt;span style=&#34;color:#a6e22e&#34;&gt;promise&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;distribution&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;   * CloudFront ディストリビューションの設定内容を取得するために利用する
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;   * @param id CloudFront ディストリビューションの ID
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;   * @return ディストリビューションの設定内容を取得する
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;   */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;async&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;getDistributionConfig&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Promise&lt;/span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;CloudFront.DistributionConfig&lt;/span&gt;&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;config&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;cloudFront&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;getDistributionConfig&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#a6e22e&#34;&gt;Id&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }).&lt;span style=&#34;color:#a6e22e&#34;&gt;promise&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;config&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;DistributionConfig&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;   * CloudFront ディストリビューションを削除する
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;   * @param id 削除したい CloudFront ディストリビューションの ID
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;   */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;async&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;deleteDistribution&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;distribution&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;getDistribution&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;cloudFront&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;deleteDistribution&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;Id&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;id&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;IfMatch&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;distribution.ETag&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }).&lt;span style=&#34;color:#a6e22e&#34;&gt;promise&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;   * CloudFront ディストリビューションを無効化する
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;   * @param id 無効化したい CloudFront ディストリビューションの ID
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;   * @return 無効化した CloudFront ディストリビューションの情報
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;   */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;async&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;disableDistribution&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Promise&lt;/span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;UpdateDistributionResult&lt;/span&gt;&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;distribution&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;getDistribution&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;config&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;distribution&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Distribution&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;DistributionConfig&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;config&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Enabled&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;cloudFront&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;updateDistribution&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;Id&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;id&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;IfMatch&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;distribution.ETag&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;DistributionConfig&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }).&lt;span style=&#34;color:#a6e22e&#34;&gt;promise&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;   * MediaPackage のエンドポイント用の CloudFront ディストリビューションを作成する
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;   * @param id CloudFront ディストリビューションを判別するための ID
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;   * @param mediaPackageArn MediaPackage チャンネルの ARN
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;   * @param mediaPackageUrl MediaPackage エンドポイントの URL
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;   */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;async&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;createDistributionForMediaPackage&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;mediaPackageArn&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;mediaPackageUrl&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Promise&lt;/span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;CreateDistributionWithTagsResult&lt;/span&gt;&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 1. url モジュールを用いて URL 文字列をパースする
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;mediaPackageEndpoint&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;parse&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;mediaPackageUrl&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;    2. MediaPackage のエンドポイント URL から FQDN を取得する。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;    後述する CloudFront ディストリビューションのオリジンのドメイン名としても利用する
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;    */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;mediaPackageHostname&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;mediaPackageEndpoint&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;hostname&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;    3. MediaPackage のエンドポイント URL のフォーマットは
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;    https://&amp;lt;AccountID&amp;gt;.mediapackage.&amp;lt;Region&amp;gt;.amazonaws.com/**** となっているので、
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;    FQDN の先頭部分を文字列分割で取り出すとアカウント ID が取得できる
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;    */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;accountId&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;mediaPackageHostname&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;split&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;.&amp;#39;&lt;/span&gt;)[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 4. 後述する CloudFront ディストリビューションのオリジン ID として、アカウント ID を利用する
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;targetOriginId&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;`MP-&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;accountId&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;    5. createDistribution ではなく、createDistributionWithTags 関数で、
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;    CloudFront ディストリビューションを作成する。MediaPackage との紐付けにタグを利用するため。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;    */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;cloudFront&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;createDistributionWithTags&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;DistributionConfigWithTags&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;Tags&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6e22e&#34;&gt;Items&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#75715e&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;                    !!!!!重要!!!!!
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;                    6. CloudFront ディストリビューションに紐付けたい
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;                    MediaPackage エンドポイントのチャンネル ARN を
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;                    mediapackage:cloudfront_assoc で定義する。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;                    mediapackage:cloudfront_assoc を定義することで、
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;                    CloudFront ディストリビューションと
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;                    MediaPackage チャンネルを紐付けることが可能となる。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;                    */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;Key&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;mediapackage:cloudfront_assoc&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;Value&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;mediaPackageArn&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;Key&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Id&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;Value&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;Key&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Product&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;Value&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;product&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;Key&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Stage&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;Value&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;dev&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;DistributionConfig&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6e22e&#34;&gt;CallerReference&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Date().&lt;span style=&#34;color:#a6e22e&#34;&gt;toISOString&lt;/span&gt;(),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6e22e&#34;&gt;Comment&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;`Managed by MediaPackage - &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6e22e&#34;&gt;Enabled&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#75715e&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;                7. CloudFront ディストリビューションのオリジンには 2つ設定します。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;                1つが MediaPackage のエンドポイントに対するものと、
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;                もう 1つが MediaPacakge サービスに対するものです。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;                基本的には MediaPackage のエンドポイントに対するオリジンを利用します。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;                例外時に向けるオリジンが MediaPacakge サービスに対するものになります。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;                */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6e22e&#34;&gt;Origins&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#a6e22e&#34;&gt;Quantity&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;2&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#a6e22e&#34;&gt;Items&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            &lt;span style=&#34;color:#a6e22e&#34;&gt;DomainName&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;mediaPackageHostname&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            &lt;span style=&#34;color:#a6e22e&#34;&gt;Id&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;targetOriginId&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            &lt;span style=&#34;color:#a6e22e&#34;&gt;CustomOriginConfig&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                &lt;span style=&#34;color:#a6e22e&#34;&gt;HTTPPort&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;80&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                &lt;span style=&#34;color:#a6e22e&#34;&gt;HTTPSPort&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;443&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                &lt;span style=&#34;color:#a6e22e&#34;&gt;OriginProtocolPolicy&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;match-viewer&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            &lt;span style=&#34;color:#a6e22e&#34;&gt;DomainName&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;mediapackage.amazonaws.com&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            &lt;span style=&#34;color:#a6e22e&#34;&gt;Id&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;TEMP_ORIGIN_ID/channel&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            &lt;span style=&#34;color:#a6e22e&#34;&gt;CustomOriginConfig&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                &lt;span style=&#34;color:#a6e22e&#34;&gt;HTTPPort&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;80&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                &lt;span style=&#34;color:#a6e22e&#34;&gt;HTTPSPort&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;443&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                &lt;span style=&#34;color:#a6e22e&#34;&gt;OriginProtocolPolicy&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;match-viewer&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#75715e&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;                8. CacheBehaviors のいずれにも当てはまらなかった場合の
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;                キャッシュの振る舞いを定義します。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;                MediaPackage は タイムシフト表示機能を使用する際等で、クエリ文字列に start, m, end を利用しています。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;                そのため、それらの文字列は WhitelistedNames に含め QueryString には true を指定しておきます。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;                DefaultCacheBehavior に引っかかる挙動は例外的扱いなので、
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;                使用するオリジンは MediaPackage サービスのものを設定します。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;                */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6e22e&#34;&gt;DefaultCacheBehavior&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#a6e22e&#34;&gt;ForwardedValues&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;Cookies&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            &lt;span style=&#34;color:#a6e22e&#34;&gt;Forward&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;whitelist&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            &lt;span style=&#34;color:#a6e22e&#34;&gt;WhitelistedNames&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                &lt;span style=&#34;color:#a6e22e&#34;&gt;Quantity&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;3&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                &lt;span style=&#34;color:#a6e22e&#34;&gt;Items&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;end&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;m&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;start&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;QueryString&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;Headers&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            &lt;span style=&#34;color:#a6e22e&#34;&gt;Quantity&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;QueryStringCacheKeys&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            &lt;span style=&#34;color:#a6e22e&#34;&gt;Quantity&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#a6e22e&#34;&gt;MinTTL&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;6&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#a6e22e&#34;&gt;TargetOriginId&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;TEMP_ORIGIN_ID/channel&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#a6e22e&#34;&gt;TrustedSigners&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;Enabled&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;Quantity&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#a6e22e&#34;&gt;ViewerProtocolPolicy&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;redirect-to-https&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#a6e22e&#34;&gt;AllowedMethods&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;Items&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;GET&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;HEAD&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        ],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;Quantity&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;2&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#a6e22e&#34;&gt;MaxTTL&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;60&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#75715e&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;                9. CloudFront のエラーコード全ての TTL に 1sec を設定します。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;                MediaPackage のエラーのキャッシュが長時間持続してしまうと、
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;                その間は MediaPackage で正常に配信できているとしても、
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;                復旧できない状態となるからです。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;                */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6e22e&#34;&gt;CustomErrorResponses&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#a6e22e&#34;&gt;Quantity&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;10&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#a6e22e&#34;&gt;Items&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;ErrorCode&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;400&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;ErrorCachingMinTTL&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    }, {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;ErrorCode&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;403&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;ErrorCachingMinTTL&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    }, {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;ErrorCode&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;404&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;ErrorCachingMinTTL&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    }, {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;ErrorCode&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;405&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;ErrorCachingMinTTL&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    }, {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;ErrorCode&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;414&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;ErrorCachingMinTTL&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    }, {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;ErrorCode&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;416&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;ErrorCachingMinTTL&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    }, {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;ErrorCode&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;500&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;ErrorCachingMinTTL&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    }, {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;ErrorCode&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;501&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;ErrorCachingMinTTL&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    }, {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;ErrorCode&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;502&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;ErrorCachingMinTTL&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    }, {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;ErrorCode&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;503&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;ErrorCachingMinTTL&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#75715e&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;                10. CloudFront ディストリビューションのキャッシュの振る舞いを 2つ定義します。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;                それぞれの設定内容は基本的に DefaultCacheBehavior で定義したものと同様です。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;                しかし、利用するオリジンは MediaPackage エンドポイントに向けたものを利用します。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;                1つは Microsoft Smooth Streaming での配信時に利用する
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;                index.ism に対するもので Smooth Streaming を true に設定しています。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;                もう 1つは上記 Microsoft Smooth Streaming 以外の
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;                全てに当てはまるストリーミングに適用されるものになります。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;                */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6e22e&#34;&gt;CacheBehaviors&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#a6e22e&#34;&gt;Quantity&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;2&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#a6e22e&#34;&gt;Items&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; [{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;MinTTL&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;6&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;PathPattern&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;index.ism/*&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;TargetOriginId&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;targetOriginId&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;ViewerProtocolPolicy&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;redirect-to-https&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;AllowedMethods&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            &lt;span style=&#34;color:#a6e22e&#34;&gt;Items&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;GET&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;HEAD&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            ],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            &lt;span style=&#34;color:#a6e22e&#34;&gt;Quantity&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;2&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;ForwardedValues&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            &lt;span style=&#34;color:#a6e22e&#34;&gt;Cookies&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                &lt;span style=&#34;color:#a6e22e&#34;&gt;Forward&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;whitelist&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                &lt;span style=&#34;color:#a6e22e&#34;&gt;WhitelistedNames&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                    &lt;span style=&#34;color:#a6e22e&#34;&gt;Quantity&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;3&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                    &lt;span style=&#34;color:#a6e22e&#34;&gt;Items&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;end&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;m&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;start&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                    ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            &lt;span style=&#34;color:#a6e22e&#34;&gt;QueryString&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            &lt;span style=&#34;color:#a6e22e&#34;&gt;Headers&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                &lt;span style=&#34;color:#a6e22e&#34;&gt;Quantity&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            &lt;span style=&#34;color:#a6e22e&#34;&gt;QueryStringCacheKeys&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                &lt;span style=&#34;color:#a6e22e&#34;&gt;Quantity&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;SmoothStreaming&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    }, {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;MinTTL&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;6&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;PathPattern&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;*&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;TargetOriginId&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;targetOriginId&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;ViewerProtocolPolicy&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;redirect-to-https&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;AllowedMethods&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            &lt;span style=&#34;color:#a6e22e&#34;&gt;Items&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;GET&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;HEAD&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            ],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            &lt;span style=&#34;color:#a6e22e&#34;&gt;Quantity&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;2&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;ForwardedValues&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            &lt;span style=&#34;color:#a6e22e&#34;&gt;Cookies&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                &lt;span style=&#34;color:#a6e22e&#34;&gt;Forward&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;whitelist&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                &lt;span style=&#34;color:#a6e22e&#34;&gt;WhitelistedNames&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                &lt;span style=&#34;color:#a6e22e&#34;&gt;Quantity&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;3&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                &lt;span style=&#34;color:#a6e22e&#34;&gt;Items&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;end&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;m&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;start&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            &lt;span style=&#34;color:#a6e22e&#34;&gt;QueryString&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            &lt;span style=&#34;color:#a6e22e&#34;&gt;Headers&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                &lt;span style=&#34;color:#a6e22e&#34;&gt;Quantity&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            &lt;span style=&#34;color:#a6e22e&#34;&gt;QueryStringCacheKeys&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                &lt;span style=&#34;color:#a6e22e&#34;&gt;Quantity&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    }]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6e22e&#34;&gt;PriceClass&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;PriceClass_All&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }).&lt;span style=&#34;color:#a6e22e&#34;&gt;promise&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;createDistributionForMediaPackage&lt;/code&gt; で作成したディストリビューションは、&lt;a href=&#34;https://docs.aws.amazon.com/ja_jp/mediapackage/latest/ug/cdns-cf.html&#34;&gt;公式ページに記載された手順&lt;/a&gt; で作成した CloudFront ディストリビューションと同等のものになります。&lt;/p&gt;</description>
    </item>
    <item>
      <title>📔 Moonlander というエルゴノミクスキーボードのススメ</title>
      <link>https://nikaera.com/archives/introduction-to-moonlander/</link>
      <pubDate>Sun, 13 Dec 2020 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/introduction-to-moonlander/</guid>
      <description>&lt;h1 id=&#34;はじめに&#34;&gt;はじめに&lt;/h1&gt;
&lt;p&gt;最近 &lt;a href=&#34;https://ergodox-ez.com/&#34;&gt;ErgoDox EZ&lt;/a&gt; からの乗り換えで &lt;a href=&#34;https://www.zsa.io/moonlander/&#34;&gt;Moonlander&lt;/a&gt; というエルゴノミクスキーボードを使っているのですが、諸々非常に満足しています。コンパクトながら安定感のある打ち心地でカスタマイズ性も高く、試行錯誤しながら自分好みにセットアップして使い勝手を最適化することができます。&lt;/p&gt;
&lt;p&gt;バックライトがあり、デフォで &lt;a href=&#34;https://www.youtube.com/watch?v=-4fcilN7B9s&#34;&gt;様々な光り方&lt;/a&gt; が用意されているのも非常にカッコよいです。あまりキーボードのバックライトを気にしたことは今まで無かったのですが、何となく 1日毎にエフェクトを切り替えると良い気分転換になります。なんとなくだけど。。ｗ&lt;/p&gt;
&lt;p&gt;また、これについてはエルゴノミクスキーボード全般に言える話で Moonlander に限った話では無い気がしますが、体がこわばった姿勢にならなくなり、肩が開いてリラックスした姿勢でタイピングできます。&lt;/p&gt;
&lt;p&gt;そのため、長時間 PC で作業していても、呼吸が浅くなりづらく、肩への負担も少なく感じます。&lt;strong&gt;現に筆者はキーボードを変えただけで生活習慣変えた覚えがないにも関わらず、長時間作業しても疲れにくくなりましたし、肩こりになりにくくなりました。&lt;/strong&gt;&lt;br&gt;
毎年冬になると肩こりになる体質だったのですが、ErgoDox EZ を採用し始めてから肩こりに悩まされることは無くなりました。&lt;/p&gt;
&lt;p&gt;今回はそんな気に入って仕事プライベート問わず酷使している Moonlander についての紹介記事を書いていこうと思います。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ちなみに筆者はキーコンフィグを軽くカスタマイズしている程度のライトユーザーです。&lt;/strong&gt;&lt;/p&gt;
&lt;h1 id=&#34;セットアップが簡単&#34;&gt;セットアップが簡単&lt;/h1&gt;
&lt;p&gt;Web から簡単にキーコンフィグを設定することが可能です。キーコンフィグ設定のためのサービスは &lt;a href=&#34;https://configure.ergodox-ez.com/&#34;&gt;Ergodox EZ Configurator&lt;/a&gt; というやつです。名前に Ergodox がついていますが ZSA Technology Labs から購入可能なキーボード全てに対応しています。(Moonlander にも Planck にも対応)&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Ergodox EZ Configurator の画像&#34; loading=&#34;lazy&#34; src=&#34;https://i.gyazo.com/2bcf9aceada83e1c94ca83237fa3782e.png&#34;&gt;
&lt;strong&gt;今回は Moonlander Mark I を利用する&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;Search layouts&lt;/code&gt; ボタンをクリックすることで、他の人が既にカスタマイズしたキーコンフィグをダウンロードしたり、そのキーコンフィグを元に自分用のキーコンフィグをカスタマイズすることも可能です。&lt;/strong&gt;&lt;br&gt;
ちなみにデフォルトのキーコンフィグは &lt;code&gt;Configure&lt;/code&gt; ボタンをクリックすると確認することができます。もちろん、そこからキーコンフィグをカスタマイズしていくことも可能です。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;また、カスタマイズした設定内容は常に Ergodoz EZ Configurator に保存されるので、後から細かくキーコンフィグを修正していくといったことも可能です。&lt;/strong&gt; 最初のうちは頻繁にキーコンフィグに微修正入れると思うので、めっちゃ便利でした。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Ergodoz EZ Configurator の Search layouts で &amp;ldquo;coding&amp;rdquo; で検索した結果&#34; loading=&#34;lazy&#34; src=&#34;https://i.gyazo.com/3492ba03e6e205a0ed63bfb9e4fd1744.png&#34;&gt;
&lt;strong&gt;Ergodoz EZ Configurator の Search layouts で &amp;ldquo;coding&amp;rdquo; で検索した結果&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>📔 Hugo &#43; GitHub Pages &#43; GitHub Actions で独自ドメインのウェブサイトを構築する</title>
      <link>https://nikaera.com/archives/hugo-github-actions-for-github-pages/</link>
      <pubDate>Thu, 10 Dec 2020 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/hugo-github-actions-for-github-pages/</guid>
      <description>&lt;p&gt;&lt;em&gt;この記事は &lt;a href=&#34;https://qiita.com/advent-calendar/2020/static-site-generator&#34;&gt;Static Site Generator Advent Calendar 2020&lt;/a&gt; 10 日目の記事です。&lt;/em&gt;&lt;/p&gt;
&lt;h1 id=&#34;はじめに&#34;&gt;はじめに&lt;/h1&gt;
&lt;p&gt;&lt;img alt=&#34;Hugo のトップページ&#34; loading=&#34;lazy&#34; src=&#34;https://i.gyazo.com/ffe8fe276b9d008461880581002430ec.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;Zenn や Qiita, note など様々なウェブサービスで記事を書くにつれて、ふと雑多な内容で自分の好き勝手に記事を書いて公開できる自分のブログが欲しくなりました。そこで、自分のブログを作ろうと思い調査したところ、SSG で作るのが手っ取り早そうだったのと、その中でも一番ラクにウェブサイトが構築できそうな &lt;a href=&#34;https://gohugo.io/&#34;&gt;Hugo&lt;/a&gt; を採用しました。&lt;/p&gt;
&lt;p&gt;また、デプロイは簡単に行いたかったので、デプロイ先として &lt;a href=&#34;https://docs.github.com/ja/free-pro-team@latest/github/working-with-github-pages/about-github-pages&#34;&gt;GitHub Pages&lt;/a&gt; を採用しました。
独自ドメインの割り当てから HTTPS 対応まで無料でできるかつ、使い慣れている GitHub をデプロイ先に使えることが決め手でした。&lt;/p&gt;
&lt;p&gt;Hugo で自分のブログを構築して GitHub Pages で公開できるようになったのですが、ブログ内容を更新したり記事を書くたびにビルドしてデプロイをするのが、意外と面倒なことに気づきました。そこで、&lt;a href=&#34;https://github.com/marketplace/actions/github-pages-action&#34;&gt;GitHub Pages action&lt;/a&gt; を用いて、ビルドしてデプロイするという作業は自動化しました。&lt;/p&gt;
&lt;p&gt;上記までの作業をすることで、自分のブログを書いたり更新することだけに集中できる環境を整えることができました。ウェブサイトを作りこむ以外は、簡単ないくつかの作業をするだけで Hugo で満足のいく自分のブログを書く環境が整えられたので、その手順についてまとめてみました。&lt;/p&gt;
&lt;p&gt;ちなみに本記事の手順で実際に作成した私のブログは下記です。&lt;/p&gt;
&lt;div class=&#34;linkcard-container&#34; style=&#34;margin: var(--content-gap) 0;&#34;&gt;
            &lt;a href=&#34;https://nikaera.com/&#34; 
               class=&#34;linkcard&#34; 
               style=&#34;
                   display: flex;
                   text-decoration: none;
                   color: var(--content);
                   background: var(--entry);
                   border: 1px solid var(--border);
                   border-radius: 12px;
                   padding: 0px 0px 0px 20px;
                   transition: background-color 0.3s ease;
                   box-shadow: 0 4px 8px rgba(0,0,0,0.08);
                   min-height: 140px;
                   overflow: hidden;
               &#34; 
               onmouseover=&#34;this.style.backgroundColor=&#39;rgb(56, 56, 61)&#39;;&#34; 
               onmouseout=&#34;this.style.backgroundColor=&#39;var(--entry)&#39;;&#34;
               target=&#34;_blank&#34;
               rel=&#34;noopener noreferrer&#34;&gt;&lt;div class=&#34;linkcard-content&#34; style=&#34;flex: 1; display: flex; flex-direction: column; min-width: 0; margin-top: 20px; margin-right: 20px;&#34;&gt;&lt;div class=&#34;linkcard-title&#34; style=&#34;margin-bottom: 10px;&#34;&gt;
                        &lt;h3 style=&#34;
                            margin: 0;
                            font-size: 18px;
                            font-weight: 600;
                            line-height: 1.3;
                            color: var(--primary);
                            overflow: hidden;
                            display: -webkit-box;
                            -webkit-box-orient: vertical;
                            -webkit-line-clamp: 2;
                            line-clamp: 2;
                        &#34;&gt;
                            Nikaeraintokyo.
                        &lt;/h3&gt;
                    &lt;/div&gt;&lt;p class=&#34;linkcard-description&#34; style=&#34;
                        margin: 0;
                        font-size: 14px;
                        line-height: 1.5;
                        color: var(--secondary);
                        overflow: hidden;
                        display: -webkit-box;
                        -webkit-box-orient: vertical;
                        -webkit-line-clamp: 2;
                        line-clamp: 2;
                        flex: 1;
                        margin-bottom: 12px;
                    &#34;&gt;
                        More information about nikaera.
                    &lt;/p&gt;</description>
    </item>
    <item>
      <title>📔 誕生日のノリでアドベントカレンダーに投稿予約して感じた変化</title>
      <link>https://nikaera.com/archives/birthday-2020/</link>
      <pubDate>Sun, 06 Dec 2020 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/birthday-2020/</guid>
      <description>&lt;h1 id=&#34;はじめに&#34;&gt;はじめに&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;まず、私の誕生日は 11/6 なので本日 12/6 は誕生日からちょうど 1ヶ月後になります。&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;誕生日なので何か書くことにした✍️ | なんでもに参加しました！ &lt;a href=&#34;https://t.co/1NXySfMlak&#34;&gt;https://t.co/1NXySfMlak&lt;/a&gt; &lt;a href=&#34;https://twitter.com/hashtag/Crieit?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#Crieit&lt;/a&gt; &lt;a href=&#34;https://twitter.com/hashtag/crieit_advent_calendar?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#crieit_advent_calendar&lt;/a&gt; &lt;a href=&#34;https://twitter.com/crieitcommunity?ref_src=twsrc%5Etfw&#34;&gt;@crieitcommunity&lt;/a&gt;より&lt;/p&gt;&amp;mdash; 𝚗𝚒𝚔𝚊𝚎𝚛𝚊 (@nikaera) &lt;a href=&#34;https://twitter.com/nikaera/status/1323103912971235328?ref_src=twsrc%5Etfw&#34;&gt;November 2, 2020&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;p&gt;はい。完全にノリで参加しようと投稿予約してから、後日確認して気づきました。。ｗ しかし、その間違えに気づいてから、何を投稿しようかなあと考え始めた時に、&lt;strong&gt;ふと「以前の自分だったら絶対ノリでアドベントカレンダーに登録するっていう行動しないよなあ」ということに気づきました。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;そこで、今回は以前の自分と比較して、今の自分がどう変わったのか考察してみることにしました。この記事書いてるときは誕生日からまだ 1週間経ってないし、ちょうど考察するには良い機会かなと思って。&lt;/p&gt;
&lt;h1 id=&#34;以前の自分&#34;&gt;以前の自分&lt;/h1&gt;
&lt;p&gt;&lt;img alt=&#34;飽きた&#34; loading=&#34;lazy&#34; src=&#34;https://crieit.now.sh/upload_images/0090d256788cf167b3376a1d31e85a2d5fabedb1e7f44.jpg&#34;&gt;
&lt;em&gt;Photo by &lt;a href=&#34;https://unsplash.com/@villxsmil?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&#34;&gt;Luis Villasmil&lt;/a&gt; on &lt;a href=&#34;https://unsplash.com/?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&#34;&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;以前はやりたいことがあっても全部後回しにしてしまっていました。何故かと言うと仕事やプライベートも含めて、他に直近でやらなければならない、もしくはそう思いこんでいる TODO があったときに、それらが残っていると次々に心配事や考え事が増えていってしまい、やりたいことに集中出来なくなるからです。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;つまり、やりたいことは本気で集中できるタイミングが来たらやろうと考えていました。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;そのため、読もうと思って買った本を読みたい、買って届いた新作ゲームをやりたい、OSS 活動をしてみたい、ライブラリを自分で作成してみたい等々のやりたいことは全て後回しになっていました。&lt;/p&gt;
&lt;p&gt;何も考えないでサクッと取り組めるプレイ済みのゲームを遊んだり、気に入っている Youtube の動画を何度も繰り返し見たりして時間を浪費していました。&lt;/p&gt;
&lt;p&gt;ボーッとしながら何も考えないで過ごす時間や遊ぶ時間は気力を養う上で重要で必要だと認識しているのですが、それだけを余暇に費やすのは少し勿体ないなと感じていました。&lt;/p&gt;
&lt;p&gt;そして、ある時ふと気づきました。&lt;strong&gt;多分このままの生活してると連休とか仕事の区切りのタイミングとかでしか、自分がやりたいことに取り組むことはできないな&lt;/strong&gt; と。。ちなみに、私はいわゆる ON/OFF みたいな切り替えが出来ないタイプなので、「仕事が終わったらスイッチを OFF にしてプライベートを全力で楽しむようにする」とかは無理なタイプです。&lt;/p&gt;
&lt;p&gt;そこで、過去自分が気分がノリ続けて作業できたり、新しいことに挑戦し始めたときのことを思い返しながら、現状改善のために簡単に出来ることからやってみようと 1年前くらい前から行動を起こし始めました。&lt;/p&gt;
&lt;h1 id=&#34;試したこと&#34;&gt;試したこと&lt;/h1&gt;
&lt;p&gt;&lt;img alt=&#34;挑戦&#34; loading=&#34;lazy&#34; src=&#34;https://crieit.now.sh/upload_images/c65291a34fe9f7b60f5de42f135015605fabeed0e3f9d.jpg&#34;&gt;
&lt;em&gt;&lt;a href=&#34;https://pixabay.com/photos/?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=983960&#34;&gt;Free-Photos&lt;/a&gt;による&lt;a href=&#34;https://pixabay.com/ja/?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=983960&#34;&gt;Pixabay&lt;/a&gt;からの画像&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;まず、前提として下記項目はあえて頑張って解決するとかは諦めました。理由は中学生くらいの時から「そうだったなあ」って感じていることだったので潔く諦めた感じです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;仕事プライベート関係なく、やりたくない面倒な TODO を意識してしまい無駄に疲れる
&lt;ul&gt;
&lt;li&gt;ふとした瞬間に思い出して不快になるかつ、それらの TODO は後回しにしてしまいがちなので、更に不快になる機会が増えてきて、結果疲れ続ける&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;やるべき必要がある TODO が増えてくると最優先で迅速に全部片付けたくなる
&lt;ul&gt;
&lt;li&gt;それらが意識の端にあると心を休めた状態で日々を過ごすことが難しくなってきて、結果疲れ続ける&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;上記の解決を諦めても、やりたいことが自然と出来る環境が作れるようにしようとしました。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;仕事プライベート問わず-todo-の総量を減らしていく&#34;&gt;仕事プライベート問わず TODO の総量を減らしていく&lt;/h2&gt;
&lt;p&gt;TODO が増えてくることによって、やるべき TODO も必然的に増えてきます。最初は優先度の低い TODO だったのに、作業していくうちにそこから更にやるべき他の TODO が生まれてくることもあります。&lt;/p&gt;
&lt;p&gt;そのため、&lt;strong&gt;そもそも仕事でもプライベートでも優先度とか関係なく TODO を日常的に増やさない努力を行いました。&lt;/strong&gt; 割とお願いされたら何でも引き受けてしまいがちだったので、そこは常に意識するようにしました。&lt;/p&gt;</description>
    </item>
    <item>
      <title>📔 GitHub 接続時の ~/.ssh/config の書き方</title>
      <link>https://nikaera.com/archives/ssh-config-github/</link>
      <pubDate>Thu, 19 Nov 2020 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/ssh-config-github/</guid>
      <description>&lt;h1 id=&#34;はじめに&#34;&gt;はじめに&lt;/h1&gt;
&lt;p&gt;本記事ではタイトルの内容に加えて &lt;code&gt;~/.ssh/config&lt;/code&gt; に対する基本的な理解を深めるため、各種設定項目に関する説明も付随して行います。GitHub を例に挙げてはいるものの、Bitbucket や GitLab、Git サーバへ接続する際にも利用可能な &lt;code&gt;~/.ssh/config&lt;/code&gt; の設定について記載しております。&lt;/p&gt;
&lt;h1 id=&#34;sshconfig-の書き方&#34;&gt;&lt;code&gt;~/.ssh/config&lt;/code&gt; の書き方&lt;/h1&gt;
&lt;p&gt;まず GitHub へ接続する &lt;code&gt;~/.ssh/config&lt;/code&gt; の設定を見ていきます。GitHub で認証に使用する SSH キーは登録済みで秘密鍵は &lt;code&gt;~/.ssh/github&lt;/code&gt; へ配置している想定です。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;SSH キーが未登録の場合は &lt;a href=&#34;https://docs.github.com/ja/free-pro-team@latest/github/authenticating-to-github/connecting-to-github-with-ssh&#34;&gt;公式サイトの手順&lt;/a&gt; に従って鍵の生成・登録までを行っておきます。&lt;/em&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# ~/.ssh/config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Host&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;github&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;IdentityFile&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;~/&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;ssh&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;github&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;User&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;git&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;~/.ssh/config&lt;/code&gt; の各種設定項目は下記になります。&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;項目&lt;/th&gt;
          &lt;th&gt;説明&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Host&lt;/td&gt;
          &lt;td&gt;ホスト名を指定する&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;IdentityFile&lt;/td&gt;
          &lt;td&gt;接続時に使用する秘密鍵を指定する&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;User&lt;/td&gt;
          &lt;td&gt;接続時のユーザ名を指定する&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;設定を行うことで &lt;code&gt;github.com&lt;/code&gt; に SSH 接続する際、ユーザ名に &lt;code&gt;git&lt;/code&gt; が指定され、&lt;code&gt;~/.ssh/github&lt;/code&gt; に存在する秘密鍵を用いて SSH 接続を試みるようになります。&lt;/p&gt;
&lt;p&gt;早速 &lt;code&gt;github.com&lt;/code&gt; 接続時に正しく認証が通っているか確認するため、適当なプライベートリポジトリを &lt;code&gt;git clone&lt;/code&gt; してみます。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;git clone の実行結果 (成功)&#34; loading=&#34;lazy&#34; src=&#34;https://i.gyazo.com/98db386f77ab94590c162279e9e039e9.png&#34;&gt;
&lt;em&gt;プライベートリポジトリを &lt;code&gt;git clone&lt;/code&gt; した実行結果 (成功)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;無事に &lt;code&gt;git clone&lt;/code&gt; できることが確認できたら成功です。&lt;/p&gt;</description>
    </item>
    <item>
      <title>📔 Serverless のプラグインを TypeScript で作成する方法</title>
      <link>https://nikaera.com/archives/serverless-typescript-plugin/</link>
      <pubDate>Sun, 08 Nov 2020 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/archives/serverless-typescript-plugin/</guid>
      <description>&lt;h1 id=&#34;はじめに&#34;&gt;はじめに&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://www.serverless.com/&#34;&gt;Serverless Framework&lt;/a&gt; を使っていて、度々デプロイ時に手動で設定していた作業内容を自動化したいなと思い、プラグイン作成の知識習得も兼ねてライブラリを作成し &lt;a href=&#34;https://www.npmjs.com/&#34;&gt;NPM&lt;/a&gt; で公開してみました。&lt;/p&gt;

        &lt;a target=&#34;_blank&#34; rel=&#34;noopener&#34; href=&#34;https://www.npmjs.com/package/serverless-amplify-auth&#34;&gt;https://www.npmjs.com/package/serverless-amplify-auth&lt;/a&gt;
&lt;p&gt;今後も開発する可能性はありそうなので Serverless のプラグインを TypeScript で作成する際の手順をまとめておきました。各手順はザックリと紹介しつつ、&lt;strong&gt;主にその過程でハマった点や工夫した点に重きをおいて記事を書いていきます。&lt;/strong&gt;&lt;/p&gt;
&lt;h1 id=&#34;動作環境&#34;&gt;動作環境&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Node.js 12.19.0&lt;/li&gt;
&lt;li&gt;Serverless Framework
&lt;ul&gt;
&lt;li&gt;Framework Core: 2.10.0&lt;/li&gt;
&lt;li&gt;Plugin: 4.1.1&lt;/li&gt;
&lt;li&gt;SDK: 2.3.2&lt;/li&gt;
&lt;li&gt;Components: 3.3.0&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;開発環境を整える&#34;&gt;開発環境を整える&lt;/h1&gt;
&lt;p&gt;本記事の内容を最後まで実践した際の最終的なプロジェクトのディレクトリ構造は下記になります。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tree -I node_modules -L &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; ./
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├── example &lt;span style=&#34;color:#75715e&#34;&gt;# ライブラリの動作検証用のサンプルコードを配置するフォルダ&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   ├── handler.js
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   ├── package.json
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   └── serverless.yml
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├── lib     &lt;span style=&#34;color:#75715e&#34;&gt;# src フォルダ内のファイルをコンパイルした結果を配置するフォルダ (ライブラリとして利用する際に含まれるソースコード群)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   ├── index.js
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   └── index.js.map
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├── package-lock.json
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├── package.json
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├── src     &lt;span style=&#34;color:#75715e&#34;&gt;# Serverless プラグインのソースコードを配置するフォルダ&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   └── index.ts
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;└── tsconfig.json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;基本的には &lt;a href=&#34;https://dev.classmethod.jp/articles/create-serverless-framework-plugin-by-typescript/&#34;&gt;TypeScript で Serverless Framework の Plugin を書いてみる | Developers.IO&lt;/a&gt; の手順をなぞっていくだけで環境構築自体は可能です。そこで、ここでは自分なりに工夫した箇所について記載していきます。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Portfolio 💼</title>
      <link>https://nikaera.com/portfolio/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/portfolio/</guid>
      <description>&lt;h2 id=&#34;interview-&#34;&gt;Interview 🎤&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://note.lapras.com/interview/nikaera/&#34;&gt;10年勤めた会社を転職。その経緯と想いとは？ - LAPRAS NOTE&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;2022 年時点での nikaera の思考がまとまっています&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;blog-&#34;&gt;Blog 📝&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://qiita.com/nikaera&#34;&gt;Qiita&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;軽めの内容の記事を書くのに Qiita を利用しています&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://zenn.dev/nikaera&#34;&gt;Zenn&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;整理整頓した記事を書くのに Zenn を利用しています&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;what-i-made-&#34;&gt;What I made 🔨&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://chrome.google.com/webstore/detail/teemo-%F0%9F%92%95/alhdkgcgpmdfbidaapdlnmbhoanoijka&#34;&gt;Teemo 💕&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://nikaera.com/archives/teemo-first-release/&#34;&gt;📔 チャットの短文作成に便利な Chrome 拡張機能を開発してみた&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.bloggimg.net/&#34;&gt;Bloggimg&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://nikaera.com/archives/bloggimg-first-release/&#34;&gt;📔 ブログを書く用途に特化した Gyazo のツールを開発してみた&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://zenn-badge.vercel.app/&#34;&gt;Zenn.badge&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Zenn のスコアを GitHub 風のバッジに変換するサービス&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://selekted.club&#34;&gt;selekted.club&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;tumblr の音と映像のフィードを連続再生できる Web サービス&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://rittai-homerun.netlify.app/&#34;&gt;立体ホームラン競争&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://crieit.net/boards/web1week-202003/661fc53a1809d108713c0ebcb2e0ab17&#34;&gt;web1week&lt;/a&gt; の時に作成した Web で出来る 3D ゲーム&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://challenge-calender.netlify.app/&#34;&gt;チャレンジカレンダー&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://crieit.net/boards/web1week-202003/30DaysSongChallenge-30&#34;&gt;web1week&lt;/a&gt; の時に作成した &lt;a href=&#34;https://www.ted.com/talks/matt_cutts_try_something_new_for_30_days/transcript?language=ja&#34;&gt;30Days Challenge&lt;/a&gt; が作成できる Web サービス&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://unityroom.com/games/seimitsu&#34;&gt;精密適正テスト&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://unityroom.com/unity1weeks/16&#34;&gt;unity1week&lt;/a&gt; の時に作成したゲーム&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://unityroom.com/games/all-you-can-eat-vr&#34;&gt;バーチャル食べ放題&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://unityroom.com/unity1weeks/13&#34;&gt;unity1week&lt;/a&gt; の時に作成したゲーム&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Profile 👦</title>
      <link>https://nikaera.com/profile/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/profile/</guid>
      <description>&lt;h2 id=&#34;開発者として-&#34;&gt;開発者として 🔨&lt;/h2&gt;
&lt;p&gt;大学院時代は友人 2 人と一緒にチームを組んで Android/iPhone アプリ開発や Web サービス開発をしていました。また、受託として Android/iPhone アプリ開発を請け負っていました。そのおかげで今でも Objective-C はある程度は空で書けます。&lt;/p&gt;
&lt;p&gt;現在は AWS を用いたバックエンドの開発を主に行っています。&lt;strong&gt;様々な技術領域に興味がありゼネラリストの指向性が強いです。実際に人に使ってもらえるプロダクトを作ることや社会貢献可能なプロジェクトに参加することに興味があります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;開発それ自体を楽しめる気質はあるものの、基本的には開発を課題解決のための手段として捉えています。0 からプロジェクトに関わる様々なことに携わりたいタイプの気質が強いエンジニアです。また、&lt;strong&gt;個々が苦手な部分を補いあいながら、遠慮なく改善点を指摘しあえて、楽しく心理的に安全に開発できるチームが好きです。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;個人開発はプロトレベルで自分が作ってみたいものを思いついたら作るみたいな感じでやってます。あとは &lt;a href=&#34;https://twitter.com/nikaera/status/1264576638341144577&#34;&gt;web1week&lt;/a&gt; や &lt;a href=&#34;https://unityroom.com/users/8j1zmg2vp907h6cbnfwk&#34;&gt;unity1week&lt;/a&gt; に時間があれば参加しています。作ったものは基本全部 &lt;a href=&#34;https://github.com/nikaera&#34;&gt;GitHub&lt;/a&gt; にアップしています。そこで得た知見は他の人のためにもなれれば嬉しいなということで、&lt;a href=&#34;https://qiita.com/nikaera&#34;&gt;Qiita&lt;/a&gt; や &lt;a href=&#34;https://zenn.dev/&#34;&gt;Zenn&lt;/a&gt; にまとめています。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1 つの会社に所属して個人で技術力を高めていくことに限界を感じているので、開発チームへのお誘い等あれば、是非 &lt;a href=&#34;https://nikaera.com/contact/&#34;&gt;Contact&lt;/a&gt; からお誘い頂けると嬉しいです。&lt;/strong&gt; ひととなりは &lt;a href=&#34;https://nikaera.com/profile/#%e5%80%8b%e4%ba%ba%e3%81%a8%e3%81%97%e3%81%a6&#34;&gt;個人として&lt;/a&gt; からご確認いただけます。&lt;/p&gt;
&lt;p&gt;また、あまり有効活用できておりませんが &lt;a href=&#34;https://lapras.com/public/JPCBXDB&#34;&gt;Lapras&lt;/a&gt; を利用しています。自分の能力値が可視化される感じがゲームやってるみたいで楽しいです。&lt;/p&gt;
&lt;h2 id=&#34;個人として-&#34;&gt;個人として 🚶‍♂️&lt;/h2&gt;
&lt;p&gt;長男です。人生で大切なことは大体ゲームから学びました。小学生の時から引きこもって仕事できる環境に憧れていました。現在は無事それが叶う環境で働けていて満足しています。ガラスのハートの持ち主で &lt;a href=&#34;http://www.madreclinic.jp/pm-top/pm-symptom/pm-symptom-22/&#34;&gt;HSP&lt;/a&gt; の気質があるかもしれません。&lt;/p&gt;
&lt;p&gt;特に下記の傾向が顕著にあります。&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol start=&#34;21&#34;&gt;
&lt;li&gt;動揺するような状況を避けることを、普段の生活で最優先している&lt;/li&gt;
&lt;li&gt;仕事をする時、競争させられたり、観察されていると、緊張し、いつもの実力を発揮できなくなる&lt;/li&gt;
&lt;/ol&gt;&lt;/blockquote&gt;
&lt;p&gt;社会人になってからは、&lt;a href=&#34;https://fuanclinic.com/warakukai_blog/2164/&#34;&gt;会食恐怖症&lt;/a&gt; の気も出てきましたが、なんとか元気にやってます。このような人間なので、仕事もプライベートもできるだけストレスが無い状態を保つよう心がけています。生きるの大変。&lt;/p&gt;
&lt;p&gt;最近は自己開示して積極的に弱みをさらけ出し、周囲の理解得ることでだいぶ生きやすくはなってきました。更に自己開示の副次的効果として、あまり動揺するようなことも無くなってきました。&lt;/p&gt;
&lt;p&gt;基本的に孤独を愛する傾向にありますが、&lt;a href=&#34;http://www.kojimaproductions.jp/death_stranding.html&#34;&gt;Death Stranding&lt;/a&gt; をプレイしてからは &lt;a href=&#34;https://note.com/nikaera/n/n859dac693e73&#34;&gt;考え方は若干変わりました&lt;/a&gt; 。気の合う大切な仲間との関係性にフォーカスして仲を深くすることを大切にするタイプです。&lt;/p&gt;
&lt;h2 id=&#34;好きなこと-&#34;&gt;好きなこと 🌟&lt;/h2&gt;
&lt;p&gt;趣味はコンシューマーゲームと音楽とコーヒーで、ベースギターと読書と個人開発も好きです。&lt;/p&gt;
&lt;p&gt;ゲームのジャンルは雑多に好きで &lt;a href=&#34;https://www.playstation.com/ja-jp/network/store/&#34;&gt;PlayStation Store&lt;/a&gt; とか &lt;a href=&#34;https://store-jp.nintendo.com/&#34;&gt;My Nintendo Store&lt;/a&gt; とか酒飲んで流し見しながら、インディーゲーとか含めて頻繁にジャケ買いしたりしています。最近はそのせいで積みゲーが増えているのが悩みです。&lt;/p&gt;
&lt;p&gt;音楽もジャンルは雑多に好きですが、ずっと昔から好きなアーティストに &lt;a href=&#34;https://ja.wikipedia.org/wiki/%E3%83%8B%E3%82%AB%E3%83%BB%E3%83%9E%E3%82%AB%E3%82%A4%E3%82%BC&#34;&gt;Nikakoi と erast&lt;/a&gt; がいます。そう考えると &lt;a href=&#34;https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%B3%E3%83%86%E3%83%AA%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%83%BB%E3%83%80%E3%83%B3%E3%82%B9%E3%83%BB%E3%83%9F%E3%83%A5%E3%83%BC%E3%82%B8%E3%83%83%E3%82%AF&#34;&gt;IDM&lt;/a&gt; のジャンルが特に好きかもしれないです。気になる音楽のインプット/アウトプットは &lt;a href=&#34;https://nikaera.tumblr.com/&#34;&gt;tumblr&lt;/a&gt; で行っています。&lt;/p&gt;
&lt;p&gt;コーヒーは大好きで 1 日に 5 杯とか飲みます。生豆を買って自家焙煎も行っていますが、迂闊にもストックしていた生豆が切れてしまったときは届くまでの繋ぎとして &lt;a href=&#34;https://www.yanaka-coffeeten.com/&#34;&gt;やなか珈琲&lt;/a&gt; とかに豆を買いに行ったりします。つまり、やなか珈琲の豆が好みです。&lt;/p&gt;
&lt;p&gt;ベースギターは社会人になってから始めました。ベースギターを始めた動機は近所迷惑にならなそうだったからです。あと裏方が好きなのも関係しているかもしれません。プレイヤーとしては &lt;a href=&#34;https://note.com/drfunk/n/n99c7f56e2ae8&#34;&gt;Joe Dart&lt;/a&gt; に憧れてます。
エレキギターは高校の時から社会人になるまではやっていました。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Contact 📥</title>
      <link>https://nikaera.com/contact/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/contact/</guid>
      <description>nikaera への問い合わせページ</description>
    </item>
    <item>
      <title>RSS Feeds 🔖</title>
      <link>https://nikaera.com/rss_feeds/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://nikaera.com/rss_feeds/</guid>
      <description>自分の技術記事の RSS Feed</description>
    </item>
  </channel>
</rss>
