<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Home on Yossy's Notes</title><link>https://yoshihiroshu.com/</link><description>Recent content in Home on Yossy's Notes</description><generator>Hugo</generator><language>ja</language><lastBuildDate>Sun, 08 Dec 2024 12:00:00 +0900</lastBuildDate><atom:link href="https://yoshihiroshu.com/index.xml" rel="self" type="application/rss+xml"/><item><title>株式会社GMOペパボの経験(2024年05月~)</title><link>https://yoshihiroshu.com/profile/gmo-pepabo-career/</link><pubDate>Sun, 08 Dec 2024 12:00:00 +0900</pubDate><guid>https://yoshihiroshu.com/profile/gmo-pepabo-career/</guid><description>&lt;div>&lt;a id="td-block-0" class="td-offset-anchor">&lt;/a>&lt;/div>
&lt;section class="row td-box td-box--white td-box--height-auto">
&lt;div class="col">
&lt;div class="container">
&lt;h2 id="経験したこと">経験したこと&lt;a class="td-heading-self-link" href="#%e7%b5%8c%e9%a8%93%e3%81%97%e3%81%9f%e3%81%93%e3%81%a8" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;h3 id="ゲーム追加のプロジェクトリード">ゲーム追加のプロジェクトリード&lt;a class="td-heading-self-link" href="#%e3%82%b2%e3%83%bc%e3%83%a0%e8%bf%bd%e5%8a%a0%e3%81%ae%e3%83%97%e3%83%ad%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e3%83%aa%e3%83%bc%e3%83%89" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>ゲーム10タイトルの機能追加の開発およびプロジェクトのリードエンジニアを担当し、デザイナーやインフラエンジニアなど様々な人を巻き込み、プロジェクトマネジメントを行いました。&lt;/p>
&lt;p>プロジェクトマネジメントする上で、課題は以下です。&lt;/p>
&lt;ul>
&lt;li>ドメイン知識が必要な領域のため、ゲーム追加に関するアーキテクチャのオンボーディングが必要がある&lt;/li>
&lt;li>ユーザーの満足度と最速でリリースできる最低限のゲームマネージャー機能の要件定義をする必要がある&lt;/li>
&lt;li>プレスリリースを伴うため、精度の高いスケジューリングを行う必要がある&lt;/li>
&lt;/ul>
&lt;p>そのため以下のアクションを行いました。&lt;/p>
&lt;ul>
&lt;li>システムアーキテクチャやゲームイメージなどのドメイン知識に関するオンボーディング&lt;/li>
&lt;li>必要最低限のリリースできるゲームマネージャー要件をチーム全体で認識を合わせ、意思決定のスピードを短縮する&lt;/li>
&lt;li>タスクを最大1日以下まで細分化し見積もりを行い、デイリーで進捗確認を行い必要があればサポートをする&lt;/li>
&lt;/ul>
&lt;p>成果として、以下が挙げられます。&lt;/p>
&lt;ul>
&lt;li>&lt;code>初期リリースにおけるゲームマネージャーの要件定義の提供項目の認識の共通化&lt;/code>&lt;/li>
&lt;li>&lt;code>デプロイができないトラブルなどが起きたにも関わらず、当初のスケジュール通りリリースできたこと&lt;/code>&lt;/li>
&lt;li>&lt;code>プロジェクト完了後も担当エンジニアがゲーム追加のみならず、他領域のタスクに着手可能になったこと&lt;/code>&lt;/li>
&lt;/ul>
&lt;h3 id="ゲームマネージャーのリアーキテクチャ">ゲームマネージャーのリアーキテクチャ&lt;a class="td-heading-self-link" href="#%e3%82%b2%e3%83%bc%e3%83%a0%e3%83%9e%e3%83%8d%e3%83%bc%e3%82%b8%e3%83%a3%e3%83%bc%e3%81%ae%e3%83%aa%e3%82%a2%e3%83%bc%e3%82%ad%e3%83%86%e3%82%af%e3%83%81%e3%83%a3" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>ゲームマネージャーのバックエンドの実装が複雑化していることで以下の課題があり、リアーキテクチャに取り組みました。&lt;/p>
&lt;ul>
&lt;li>開発者によって実装方針が異なり、メンテナンス性が低く、レビューのコストが高い&lt;/li>
&lt;li>同時並行で開発するために最適化されていない（コンフリクトが大量に発生してしまう）&lt;/li>
&lt;/ul>
&lt;p>根本的な課題として、以下が挙げられます。&lt;/p>
&lt;ul>
&lt;li>ゲームによって異なる仕様の複雑性&lt;/li>
&lt;li>同じファイルに対して実装することにより、コンフリクトが避けられない&lt;/li>
&lt;/ul>
&lt;p>そのため以下のアクションを行いました。&lt;/p>
&lt;ul>
&lt;li>ゲーム設定の取得・更新RPCを共通化すること&lt;/li>
&lt;li>新たなパッケージを作成し、複雑な仕様を抽象化すること&lt;/li>
&lt;li>実装をゲームごとにファイルを分離すること&lt;/li>
&lt;/ul>
&lt;p>成果として、以下が挙げられます。&lt;/p>
&lt;ul>
&lt;li>アプリケーションの実装工数を2週間から1週間に短縮&lt;/li>
&lt;li>バックエンドとフロントエンドの開発分業が可能になり、業務委託を効率よく行えたこと&lt;/li>
&lt;li>システムマイグレーション時に、バックエンドとフロントエンドの開発コストを大幅削減&lt;/li>
&lt;/ul>
&lt;/div>
&lt;/div>
&lt;/section></description></item><item><title>WIP制限とリードタイムの計測から始める今後の展望</title><link>https://yoshihiroshu.com/blog/future-prospects-wip-limit-lead-time/</link><pubDate>Fri, 15 Nov 2024 12:00:00 +0900</pubDate><guid>https://yoshihiroshu.com/blog/future-prospects-wip-limit-lead-time/</guid><description>&lt;div>&lt;a id="td-block-0" class="td-offset-anchor">&lt;/a>&lt;/div>
&lt;section class="row td-box td-box--white td-box--height-auto">
&lt;div class="col">
&lt;div class="container">
&lt;h2 id="はじめに">はじめに&lt;a class="td-heading-self-link" href="#%e3%81%af%e3%81%98%e3%82%81%e3%81%ab" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>自分が目指したい世界&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">短い期間でPDCAを回し続けて、ゴリゴリデプロイする世界
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="wip制限">WIP制限&lt;a class="td-heading-self-link" href="#wip%e5%88%b6%e9%99%90" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>WIP制限をすることで開発エンジニアが一つのタスクに集中して、生産性を爆上げしたい&lt;/p>
&lt;pre class="mermaid">graph TD;
 A[開発エンジニアA]--&amp;gt;B[WIP制限];
 B--&amp;gt;C[一つのタスクに集中];
 C--&amp;gt;D[効率向上];
 C--&amp;gt;E[品質向上];
 D--&amp;gt;F[バグ減少];
 E--&amp;gt;F;
 F--&amp;gt;G[リードタイムの短縮];
 B--&amp;gt;H[レビュー待ち中に他のPRをレビュー];
 H--&amp;gt;I[全体の進捗向上];
 I--&amp;gt;G;&lt;/pre>
&lt;h3 id="最初の一歩として行うことで見通す今後の展望wip制限">最初の一歩として行うことで、見通す今後の展望(WIP制限)&lt;a class="td-heading-self-link" href="#%e6%9c%80%e5%88%9d%e3%81%ae%e4%b8%80%e6%ad%a9%e3%81%a8%e3%81%97%e3%81%a6%e8%a1%8c%e3%81%86%e3%81%93%e3%81%a8%e3%81%a7%e8%a6%8b%e9%80%9a%e3%81%99%e4%bb%8a%e5%be%8c%e3%81%ae%e5%b1%95%e6%9c%9bwip%e5%88%b6%e9%99%90" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>タスクアサインに関するフローが整理されると考えています。&lt;/p>
&lt;ol>
&lt;li>タスクを完了した時に、次のタスクを取りやすい仕組みが欲しくなる
&lt;ul>
&lt;li>タスクの優先度管理の整備をする必要になる&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>1タスクあたりの見積もりと実際の工数の計算が可能になり、一定期間においてのパフォーマンスを把握することができる
&lt;ul>
&lt;li>チームとしてのベロシティ（パフォーマンス）の計測ができる&lt;/li>
&lt;li>プロジェクトの完了時期を予想しやすくなる&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>レビュー待ちなどの時間に、PRレビューやチームメンバーのサポートに時間を割ける
&lt;ul>
&lt;li>貯まっているPRやDiscussionを消費して、他のメンバーの待ち時間を少なくする&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;h2 id="リードタイムの計測">リードタイムの計測&lt;a class="td-heading-self-link" href="#%e3%83%aa%e3%83%bc%e3%83%89%e3%82%bf%e3%82%a4%e3%83%a0%e3%81%ae%e8%a8%88%e6%b8%ac" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>チームのパフォーマンスを定量化して、数値をもとに改善し続けるチームにしたい&lt;/p>
&lt;pre class="mermaid">graph TD;
 A[リードタイムの計測開始]--&amp;gt;B[各タスクのリードタイムを記録];
 B--&amp;gt;C[プロセスの分析];
 C--&amp;gt;D[ボトルネックの特定];
 D--&amp;gt;E[プロセス改善提案];
 E--&amp;gt;F[改善の実施];
 F--&amp;gt;G[効率向上];
 G--&amp;gt;J[リードタイムの短縮];
 A--&amp;gt;K[進捗の可視化];
 K--&amp;gt;L[チームの一体感向上];
 L--&amp;gt;G;&lt;/pre>
&lt;h3 id="最初の一歩として行うことで見通す今後の展望リードタイムの計測">最初の一歩として行うことで、見通す今後の展望（リードタイムの計測）&lt;a class="td-heading-self-link" href="#%e6%9c%80%e5%88%9d%e3%81%ae%e4%b8%80%e6%ad%a9%e3%81%a8%e3%81%97%e3%81%a6%e8%a1%8c%e3%81%86%e3%81%93%e3%81%a8%e3%81%a7%e8%a6%8b%e9%80%9a%e3%81%99%e4%bb%8a%e5%be%8c%e3%81%ae%e5%b1%95%e6%9c%9b%e3%83%aa%e3%83%bc%e3%83%89%e3%82%bf%e3%82%a4%e3%83%a0%e3%81%ae%e8%a8%88%e6%b8%ac" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>パフォーマンスを可視化することで、より良くしようという意識づけできると考えています。&lt;/p>
&lt;ol>
&lt;li>多角的な視点から生産性改善のアプローチが行われる
&lt;ul>
&lt;li>個人の生産性やチームmtgの見直しなど、幅広いアクションが行われる&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>プロセスの分析とボトルネックの改善を繰り返すことでPDCAが習慣化される
&lt;ul>
&lt;li>改善を続けて、より良くする習慣が着く&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>一つの目標が共有されることでチームの一体感が生まれる
&lt;ul>
&lt;li>様々なプロジェクトが走っているが、同じ目標に対して取り組むことでチームワークが促進される&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;/div>
&lt;/div>
&lt;/section></description></item><item><title>Four Keys 他社事例 01</title><link>https://yoshihiroshu.com/blog/four-keys-case-study-01/</link><pubDate>Fri, 08 Nov 2024 12:00:00 +0900</pubDate><guid>https://yoshihiroshu.com/blog/four-keys-case-study-01/</guid><description>&lt;div>&lt;a id="td-block-0" class="td-offset-anchor">&lt;/a>&lt;/div>
&lt;section class="row td-box td-box--white td-box--height-auto">
&lt;div class="col">
&lt;div class="container">
&lt;p>&lt;a href="https://amzn.to/4fFOPaa">エンジニア組織を強くする 開発生産性の教科書 ～事例から学ぶ、生産性向上への取り組み方～&lt;/a>を読んで、自分の言葉に直しました。&lt;/p>
&lt;h2 id="背景">背景&lt;a class="td-heading-self-link" href="#%e8%83%8c%e6%99%af" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>開発生産性導入の経緯として、経営層の目線として、組織の急成長に伴い組織の生産性を可視化する必要があった。&lt;/p>
&lt;p>Four Keysを導入に伴い、それぞれのチームにおいて、以下の二つのアクションを実施した。&lt;/p>
&lt;ul>
&lt;li>Pull Request作成数を「リードタイム改善」の指標として設定(ジュニアエンジニアが多いチーム)&lt;/li>
&lt;li>リファインメントとレトロスペクティブの再設計(スクラムを導入しているチーム)&lt;/li>
&lt;/ul>
&lt;h2 id="pull-request作成数をリードタイム改善の指標として設定">Pull Request作成数を「リードタイム改善」の指標として設定&lt;a class="td-heading-self-link" href="#pull-request%e4%bd%9c%e6%88%90%e6%95%b0%e3%82%92%e3%83%aa%e3%83%bc%e3%83%89%e3%82%bf%e3%82%a4%e3%83%a0%e6%94%b9%e5%96%84%e3%81%ae%e6%8c%87%e6%a8%99%e3%81%a8%e3%81%97%e3%81%a6%e8%a8%ad%e5%ae%9a" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>チームメンバーとテックリードの間でPull Request作成数に差があったことがあり、目標として設定した。&lt;/p>
&lt;h3 id="課題">課題&lt;a class="td-heading-self-link" href="#%e8%aa%b2%e9%a1%8c" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>Pull Requestの作成を増やすためには、単位を小さくする必要がある&lt;/li>
&lt;li>そのためには、タスクの粒度を小さくする必要があり、仕様の深い理解が必要&lt;/li>
&lt;/ul>
&lt;h3 id="取り組み">取り組み&lt;a class="td-heading-self-link" href="#%e5%8f%96%e3%82%8a%e7%b5%84%e3%81%bf" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>1on1において、個人における生産性のふりかえりを行う&lt;/li>
&lt;li>レトロスペクティブにおいて、チームの開発生産性の確認をする&lt;/li>
&lt;/ul>
&lt;h3 id="成果">成果&lt;a class="td-heading-self-link" href="#%e6%88%90%e6%9e%9c" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>Pull Requestが三ヶ月で二倍に増加し、一つ一つのPull Requestの負荷が下がりデプロイ頻度が上がった。&lt;/li>
&lt;li>見積りの精度が上がったことでスケジュールの後ろ倒しが少なくなり、心理的安全性の改善にもつながった。&lt;/li>
&lt;/ul>
&lt;h2 id="リファインメントとレトロスペクティブの再設計">リファインメントとレトロスペクティブの再設計&lt;a class="td-heading-self-link" href="#%e3%83%aa%e3%83%95%e3%82%a1%e3%82%a4%e3%83%b3%e3%83%a1%e3%83%b3%e3%83%88%e3%81%a8%e3%83%ac%e3%83%88%e3%83%ad%e3%82%b9%e3%83%9a%e3%82%af%e3%83%86%e3%82%a3%e3%83%96%e3%81%ae%e5%86%8d%e8%a8%ad%e8%a8%88" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>「フロントエンド」や「ドメイン知識」の知識が属人化しており、稼働できないメンバーがいる時に開発が完全に止まってしまう課題があった。&lt;/p>
&lt;h3 id="リファインメントの見直し">リファインメントの見直し&lt;a class="td-heading-self-link" href="#%e3%83%aa%e3%83%95%e3%82%a1%e3%82%a4%e3%83%b3%e3%83%a1%e3%83%b3%e3%83%88%e3%81%ae%e8%a6%8b%e7%9b%b4%e3%81%97" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>全員が実装イメージをはっきり持てるようにするために、全てのチケットが無くなるまで、1h/一回のmtgを行った。&lt;/p>
&lt;ul>
&lt;li>社員、業務内容を問わず、参加できるメンバーは全員が参加&lt;/li>
&lt;li>全員がストーリーポイントの実装イメージをはっきり盛れるまで議論し、詳細化する&lt;/li>
&lt;li>ストーリーポイント付けの根拠をエンジニア全員が発表し、認識のずれを矯正&lt;/li>
&lt;/ul>
&lt;h3 id="プランニングの見直し">プランニングの見直し&lt;a class="td-heading-self-link" href="#%e3%83%97%e3%83%a9%e3%83%b3%e3%83%8b%e3%83%b3%e3%82%b0%e3%81%ae%e8%a6%8b%e7%9b%b4%e3%81%97" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>二つの方針に従って、プランニングの進め方を整備した。&lt;/p>
&lt;ul>
&lt;li>チケットを見るだけでメンバー誰もが、「作業内容の共通イメージ」を持てるようにする&lt;/li>
&lt;li>チケットを見るだけでメンバー誰もが、「なぜその作業を行うかの共通認識」を持てるようにする&lt;/li>
&lt;/ul>
&lt;p>具体的には、&lt;/p>
&lt;ul>
&lt;li>ストーリーチケットの作業内容を深掘りし(プランニングに参加していないメンバーでも同等の認識を得られる程度)、具体的な作業内容を細かく書く&lt;/li>
&lt;li>記載した具体的な作業内容を元に、全員の合意をもとサブチケットをきる&lt;/li>
&lt;/ul>
&lt;!-- 深掘りする粒度は、プランニングに参加していないメンバーでも同等の認識を得られる程度 -->
&lt;p>成果として、&lt;/p>
&lt;ul>
&lt;li>手が空いているメンバーはどのサブチケットも引き受けられるようになった。&lt;/li>
&lt;li>メンバーの負荷軽減につながり、知識量や技術力不足により進められなかったメンバーの開発生産性向上に繋がった。&lt;/li>
&lt;/ul>
&lt;h3 id="レトロスペクティブの見直し">レトロスペクティブの見直し&lt;a class="td-heading-self-link" href="#%e3%83%ac%e3%83%88%e3%83%ad%e3%82%b9%e3%83%9a%e3%82%af%e3%83%86%e3%82%a3%e3%83%96%e3%81%ae%e8%a6%8b%e7%9b%b4%e3%81%97" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>KPTやフリーテーマを行っていたが、開発生産性の指標に焦点を当てたふりかえりへと設計し直した。&lt;/p>
&lt;p>話し合うことは、&lt;/p>
&lt;ul>
&lt;li>1日あたりのPull Request作成数の変化をスプリント間で比較すること&lt;/li>
&lt;li>スプリント内でマージまでに時間のかかったPull Requestの理由を深掘りすること&lt;/li>
&lt;/ul>
&lt;h2 id="pull-requestの目標やルール設計">Pull Requestの目標やルール設計&lt;a class="td-heading-self-link" href="#pull-request%e3%81%ae%e7%9b%ae%e6%a8%99%e3%82%84%e3%83%ab%e3%83%bc%e3%83%ab%e8%a8%ad%e8%a8%88" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>一日当たりのPull Request作成数と、Pull Requestの変更行数などを具体的なルールとして設定した&lt;/p></description></item><item><title>DBインスタンスを最大6台から2台に削減した話</title><link>https://yoshihiroshu.com/blog/db-instance-reduction/</link><pubDate>Sun, 12 May 2024 12:00:00 +0900</pubDate><guid>https://yoshihiroshu.com/blog/db-instance-reduction/</guid><description>&lt;div>&lt;a id="td-block-0" class="td-offset-anchor">&lt;/a>&lt;/div>
&lt;section class="row td-box td-box--white td-box--height-auto">
&lt;div class="col">
&lt;div class="container">
&lt;h2 id="自己紹介">自己紹介&lt;a class="td-heading-self-link" href="#%e8%87%aa%e5%b7%b1%e7%b4%b9%e4%bb%8b" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>私は、現在とあるWeb系のベンチャーでWebアプリケーションエンジニアとして開発業務に従事しています。&lt;/p>
&lt;p>今回の記事では以前勤務していた株式会社ZUUでの開発に関して投稿したいと思います。&lt;/p>
&lt;p>今回は肥大化したDBにインデックスを付与することで、DBインスタンス数を最大6台から2台までに改善することができたので説明していきたいと思います。&lt;/p>
&lt;p>&lt;strong>本記事は個人の見解です。&lt;/strong>&lt;/p>
&lt;h2 id="サービスについて">サービスについて&lt;a class="td-heading-self-link" href="#%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>株式会社ZUUでは金融に関する記事を掲載する様々なメディアを運営しています。&lt;/p>
&lt;p>ZUU Onlineやfuelle、MoneyTimes、dメニューマネー、その他にも多数メディアを運営しております。&lt;/p>
&lt;p>一部メディアでは、ユーザー機能を提供しており、その中にお気に入りの記事をクリップする機能などがあります。&lt;/p>
&lt;h2 id="概要">概要&lt;a class="td-heading-self-link" href="#%e6%a6%82%e8%a6%81" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>弊社の顔でもZUU onlineは、ローンチして約○年経ち、記事数やユーザー数ともに大きく成長しました。ただその一方でパフォーマンスの劣化などが問題となりユーザビリティを下げてしまうことに課題がありました。&lt;/p>
&lt;h2 id="前提">前提&lt;a class="td-heading-self-link" href="#%e5%89%8d%e6%8f%90" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>使用しているDBMSはPostgreSQL12です。&lt;/p>
&lt;p>今回改善したクエリを簡単な図で説明します。&lt;/p>
&lt;p>運用しているメディアでは、ユーザーが記事をクリップする機能が提供されています。&lt;/p>
&lt;p>その一部であるユーザーごとにクリップを取得する機能がボトルネックとなっていました。&lt;/p>
&lt;p>（以下のテーブルは例です。実際のテーブルとは異なります。）&lt;/p>
&lt;pre class="mermaid">erDiagram
 articles {
 id integer pk
 title text
 content text
 }
 article_clips{
 article_id integer fk
 user_id integer fk
 }
 users{
 id integer pk
 name text
 }
 articles ||--o{ article_clips : article_id
 users ||--o{ article_clips : user_id&lt;/pre>
&lt;p>それぞれおおよそ以下のレコード数を持っています。&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>テーブル名&lt;/th>
 &lt;th>レコード数&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>articles&lt;/td>
 &lt;td>120,000&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>article_clips&lt;/td>
 &lt;td>2,800,000&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>users&lt;/td>
 &lt;td>200,000&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="スロークエリの分析">スロークエリの分析&lt;a class="td-heading-self-link" href="#%e3%82%b9%e3%83%ad%e3%83%bc%e3%82%af%e3%82%a8%e3%83%aa%e3%81%ae%e5%88%86%e6%9e%90" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>スロークエリが判明したので、実行計画をもとに分析していきます。&lt;/p></description></item><item><title>データ基盤の構築・運用(2022/10-2023/10)</title><link>https://yoshihiroshu.com/profile/zuu/develop-data-platform/</link><pubDate>Wed, 01 May 2024 12:00:00 +0900</pubDate><guid>https://yoshihiroshu.com/profile/zuu/develop-data-platform/</guid><description>&lt;div>&lt;a id="td-block-0" class="td-offset-anchor">&lt;/a>&lt;/div>
&lt;section class="row td-box td-box--white td-box--height-auto">
&lt;div class="col">
&lt;div class="container">
&lt;h2 id="データ基盤の構築運用202210-202310">データ基盤の構築・運用(2022/10-2023/10)&lt;a class="td-heading-self-link" href="#%e3%83%87%e3%83%bc%e3%82%bf%e5%9f%ba%e7%9b%a4%e3%81%ae%e6%a7%8b%e7%af%89%e9%81%8b%e7%94%a8202210-202310" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;h3 id="プロジェクト概要">プロジェクト概要&lt;a class="td-heading-self-link" href="#%e3%83%97%e3%83%ad%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e6%a6%82%e8%a6%81" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>運用サイドが意思決定に活用するためのデータレイクの構築と業務改善をデータエンジニアとして従事&lt;/p>
&lt;h3 id="担当フェーズ">担当フェーズ&lt;a class="td-heading-self-link" href="#%e6%8b%85%e5%bd%93%e3%83%95%e3%82%a7%e3%83%bc%e3%82%ba" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>開発&lt;/li>
&lt;li>テスト&lt;/li>
&lt;li>保守&lt;/li>
&lt;/ul>
&lt;h3 id="チーム人数">チーム人数&lt;a class="td-heading-self-link" href="#%e3%83%81%e3%83%bc%e3%83%a0%e4%ba%ba%e6%95%b0" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>チームリーダ：1名&lt;/p>
&lt;p>インフラエンジニア：1名&lt;/p>
&lt;p>インフラ兼データエンジニア：2名&lt;/p>
&lt;h3 id="チームでの自分の役割">チームでの自分の役割&lt;a class="td-heading-self-link" href="#%e3%83%81%e3%83%bc%e3%83%a0%e3%81%a7%e3%81%ae%e8%87%aa%e5%88%86%e3%81%ae%e5%bd%b9%e5%89%b2" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>インフラ兼データエンジニア&lt;/p>
&lt;h3 id="業務内容">業務内容&lt;a class="td-heading-self-link" href="#%e6%a5%ad%e5%8b%99%e5%86%85%e5%ae%b9" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>ユーザーインタビュー、要求定義、要件定義、技術選定、実装、リリースまでを担当&lt;/p>
&lt;h3 id="実績取り組み">実績・取り組み&lt;a class="td-heading-self-link" href="#%e5%ae%9f%e7%b8%be%e5%8f%96%e3%82%8a%e7%b5%84%e3%81%bf" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>データの自動収集バッチの自動化&lt;/li>
&lt;li>運用サイドへユーザーインタビューを行い、データ活用促進を行なった。&lt;/li>
&lt;li>dbt基盤の構築
&lt;ul>
&lt;li>既存のバッチ処理のフローをdbtに以降&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>データカタログの開発
&lt;ul>
&lt;li>社内のデータ活用促進のため、データカタログの要件定義・技術選定・開発&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="課題">課題&lt;a class="td-heading-self-link" href="#%e8%aa%b2%e9%a1%8c" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>メディアを約20メディアほど運用しており、月次でデータの集計を手動で行なっており、工数と正確性に課題があった。&lt;/p>
&lt;h3 id="課題の経緯">課題の経緯&lt;a class="td-heading-self-link" href="#%e8%aa%b2%e9%a1%8c%e3%81%ae%e7%b5%8c%e7%b7%af" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>組織としてまだまだ歴史的に浅く、業務改善を行う基盤が整っていなかった。&lt;/p>
&lt;h3 id="課題の原因">課題の原因&lt;a class="td-heading-self-link" href="#%e8%aa%b2%e9%a1%8c%e3%81%ae%e5%8e%9f%e5%9b%a0" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>メディア数が多いことや、広告のプラットフォームが多数あり共通化して自動するのにエンジニアと運用サイドが深く連携を取る必要があった。&lt;/p>
&lt;h3 id="対処">対処&lt;a class="td-heading-self-link" href="#%e5%af%be%e5%87%a6" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>広告のプラットフォームごとのデータ収集バッチの実装&lt;/li>
&lt;li>それぞれの運用サイドのチームにインタビューを行い、データ活用のインタフェースを共通化&lt;/li>
&lt;/ul>
&lt;h3 id="成果">成果&lt;a class="td-heading-self-link" href="#%e6%88%90%e6%9e%9c" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>データ活用の推進&lt;/li>
&lt;li>月次のデータ収集自動化により、月30hの工数削減&lt;/li>
&lt;/ul>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>使用技術&lt;/th>
 &lt;th>使用サービス or フレームワーク&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>OS&lt;/td>
 &lt;td>Linux&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Python3&lt;/td>
 &lt;td>Pandas, dbt&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Google Cloud Platform&lt;/td>
 &lt;td>Big Query, Cloud Function, GCS, Alert Policy, Workflows, Cloud Run Jobs, Artifact Registry&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>terraform&lt;/td>
 &lt;td>上記のGCPサービスの実装&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>CI tool&lt;/td>
 &lt;td>GitHub Actionsによるterrformの自動化テスト&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/div>
&lt;/section></description></item><item><title>コントリビューターとしての経験</title><link>https://yoshihiroshu.com/profile/contributor/</link><pubDate>Wed, 01 May 2024 12:00:00 +0900</pubDate><guid>https://yoshihiroshu.com/profile/contributor/</guid><description>&lt;div>&lt;a id="td-block-0" class="td-offset-anchor">&lt;/a>&lt;/div>
&lt;section class="row td-box td-box--white td-box--height-auto">
&lt;div class="col">
&lt;div class="container">
&lt;h3 id="ossの貢献">OSSの貢献&lt;a class="td-heading-self-link" href="#oss%e3%81%ae%e8%b2%a2%e7%8c%ae" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>Redisのインターフェースを提供しているkey-value式のStorage DBのOSSに参画 &lt;a href="https://github.com/Kirov7/CouloyDB/pull/31">PR&lt;/a>&lt;/li>
&lt;li>connect-go &lt;a href="https://github.com/connectrpc/connect-go/pull/786">PR&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="cloudnative-days委員会に参加">CloudNative Days委員会に参加&lt;a class="td-heading-self-link" href="#cloudnative-days%e5%a7%94%e5%93%a1%e4%bc%9a%e3%81%ab%e5%8f%82%e5%8a%a0" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>クラウドインフラに関するカンファレンスの&lt;a href="https://event.cloudnativedays.jp/cndt2023">CloudNative Days Tokyo&lt;/a>の運営として参画しました。&lt;/p>
&lt;p>&lt;a href="https://cloudnativedays.jp/posts/cndt2023-co-handson-call">ハンズオン&lt;/a>の監視ツールの章のコンテンツ作成を担当しました。&lt;/p>
&lt;/div>
&lt;/div>
&lt;/section></description></item><item><title>マネジメント経験</title><link>https://yoshihiroshu.com/profile/zuu/management/</link><pubDate>Wed, 01 May 2024 12:00:00 +0900</pubDate><guid>https://yoshihiroshu.com/profile/zuu/management/</guid><description>&lt;div>&lt;a id="td-block-0" class="td-offset-anchor">&lt;/a>&lt;/div>
&lt;section class="row td-box td-box--white td-box--height-auto">
&lt;div class="col">
&lt;div class="container">
&lt;h2 id="マネジメントしたこと">マネジメントしたこと&lt;a class="td-heading-self-link" href="#%e3%83%9e%e3%83%8d%e3%82%b8%e3%83%a1%e3%83%b3%e3%83%88%e3%81%97%e3%81%9f%e3%81%93%e3%81%a8" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>スクラムを導入し、チームワークの促進と工数やプロジェクトを円滑に進めるためのタスク管理の改善を行いました。&lt;/p>
&lt;h3 id="背景">背景&lt;a class="td-heading-self-link" href="#%e8%83%8c%e6%99%af" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>今年の4月から異動になった新チームでは、退職率が高くメンバーの平均在籍年数が一年と満たないことに課題感を強く感じていました。&lt;/p>
&lt;p>原因として、新チームでは過度な残業時間が日常化していることで心理的安全性の低さにありました。&lt;/p>
&lt;p>以下の要因から精度の高い工数の見積もりやプロジェクトのプロセスを進められないことにありました。&lt;/p>
&lt;ul>
&lt;li>工数見積もりの精度の低さ&lt;/li>
&lt;li>実績工数の管理の甘さ&lt;/li>
&lt;li>タスク漏れ&lt;/li>
&lt;/ul>
&lt;p>特に解決したい課題として、チームワークの促進、心理的安全性の改善、工数やタスクの見える化と捉えていました。&lt;/p>
&lt;h3 id="具体的に行ったこと">具体的に行ったこと&lt;a class="td-heading-self-link" href="#%e5%85%b7%e4%bd%93%e7%9a%84%e3%81%ab%e8%a1%8c%e3%81%a3%e3%81%9f%e3%81%93%e3%81%a8" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>チームメンバーのアジャイルの理解の促進、チームワークの促進と心理的安全性の向上を行いました。&lt;/p>
&lt;ul>
&lt;li>チーム内でアジャイル勉強会を開催することでアジャイル開発の理解の促進&lt;/li>
&lt;li>チームビルディングを行うことで、チームワークの促進
&lt;ul>
&lt;li>インセプションデッキ、スキルマップ、ドラッガー風エクササイズなどの実施&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>週に一度のふりかえりを行うことで心理的安全性の向上&lt;/li>
&lt;/ul>
&lt;p>最後に工数やタスクの管理を徹底するためにルール化を行ました。&lt;/p>
&lt;ul>
&lt;li>タスクや工数管理をバックログでの管理の徹底&lt;/li>
&lt;/ul>
&lt;/div>
&lt;/div>
&lt;/section></description></item><item><title>株式会社ZUUの経験(2022年02月~2024年05月)</title><link>https://yoshihiroshu.com/profile/zuu-career/</link><pubDate>Wed, 01 May 2024 12:00:00 +0900</pubDate><guid>https://yoshihiroshu.com/profile/zuu-career/</guid><description>&lt;div>&lt;a id="td-block-0" class="td-offset-anchor">&lt;/a>&lt;/div>
&lt;section class="row td-box td-box--white td-box--height-auto">
&lt;div class="col">
&lt;div class="container">
&lt;h2 id="株式会社zuuインターン202202-202204-正社員202204-フルスタックエンジニア">株式会社ZUU(インターン:2022/02-2022/04, 正社員:2022/04-)フルスタックエンジニア&lt;a class="td-heading-self-link" href="#%e6%a0%aa%e5%bc%8f%e4%bc%9a%e7%a4%bezuu%e3%82%a4%e3%83%b3%e3%82%bf%e3%83%bc%e3%83%b3202202-202204-%e6%ad%a3%e7%a4%be%e5%93%a1202204-%e3%83%95%e3%83%ab%e3%82%b9%e3%82%bf%e3%83%83%e3%82%af%e3%82%a8%e3%83%b3%e3%82%b8%e3%83%8b%e3%82%a2" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>資本金：8 億 7 千 9 百円 従業員数：140 名 設立：2013 年 4 月&lt;/p>
&lt;p>事業内容：フィンテック・プラットフォーム事業など&lt;/p>
&lt;p>自社メディアとその技術基盤を他社にワンストップで提供する事業の保守運用開発を行なっています。&lt;/p>
&lt;h2 id="経験したこと">経験したこと&lt;a class="td-heading-self-link" href="#%e7%b5%8c%e9%a8%93%e3%81%97%e3%81%9f%e3%81%93%e3%81%a8" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;ul>
&lt;li>&lt;a href="https://yoshihiroshu.com/profile/zuu/management/">マネジメント経験&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://yoshihiroshu.com/profile/zuu/step-develop-financel-media/">金融メディアのSTEP開発&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://yoshihiroshu.com/profile/zuu/devops-financal-media/">金融メディアの運用保守開発&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://yoshihiroshu.com/profile/zuu/replace-product-mpcloud/">自社製品のリプレイス開発&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://yoshihiroshu.com/profile/zuu/develop-data-platform/">データ基盤の構築・運用&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://yoshihiroshu.com/profile/zuu/develop-manual-site/">自社サービスのマニュアルサイトの開発&lt;/a>&lt;/li>
&lt;/ul>
&lt;/div>
&lt;/div>
&lt;/section></description></item><item><title>金融メディアのSTEP開発</title><link>https://yoshihiroshu.com/profile/zuu/devops-financal-media/</link><pubDate>Wed, 01 May 2024 12:00:00 +0900</pubDate><guid>https://yoshihiroshu.com/profile/zuu/devops-financal-media/</guid><description>&lt;div>&lt;a id="td-block-0" class="td-offset-anchor">&lt;/a>&lt;/div>
&lt;section class="row td-box td-box--white td-box--height-auto">
&lt;div class="col">
&lt;div class="container">
&lt;h2 id="金融メディアの運用保守開発202304-202312">金融メディアの運用保守開発(2023/04-2023/12)&lt;a class="td-heading-self-link" href="#%e9%87%91%e8%9e%8d%e3%83%a1%e3%83%87%e3%82%a3%e3%82%a2%e3%81%ae%e9%81%8b%e7%94%a8%e4%bf%9d%e5%ae%88%e9%96%8b%e7%99%ba202304-202312" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;h3 id="プロジェクト概要">プロジェクト概要&lt;a class="td-heading-self-link" href="#%e3%83%97%e3%83%ad%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e6%a6%82%e8%a6%81" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>国内最大級の金融メディアの保守・運用・開発を担当&lt;/p>
&lt;h3 id="チーム構成">チーム構成&lt;a class="td-heading-self-link" href="#%e3%83%81%e3%83%bc%e3%83%a0%e6%a7%8b%e6%88%90" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>チームリーダー：1名&lt;/p>
&lt;p>フルスタックエンジニア：3名&lt;/p>
&lt;p>フロントエンジニア：1名&lt;/p>
&lt;p>テスター：1名&lt;/p>
&lt;h3 id="チームでの自分の役割">チームでの自分の役割&lt;a class="td-heading-self-link" href="#%e3%83%81%e3%83%bc%e3%83%a0%e3%81%a7%e3%81%ae%e8%87%aa%e5%88%86%e3%81%ae%e5%bd%b9%e5%89%b2" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>フルスタックエンジニア、スクラムマスター&lt;/p>
&lt;h3 id="担当フェーズ">担当フェーズ&lt;a class="td-heading-self-link" href="#%e6%8b%85%e5%bd%93%e3%83%95%e3%82%a7%e3%83%bc%e3%82%ba" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>要求定義&lt;/li>
&lt;li>要件定義&lt;/li>
&lt;li>基本設計&lt;/li>
&lt;li>詳細設計&lt;/li>
&lt;li>開発&lt;/li>
&lt;li>テスト&lt;/li>
&lt;li>保守&lt;/li>
&lt;/ul>
&lt;h3 id="業務内容">業務内容&lt;a class="td-heading-self-link" href="#%e6%a5%ad%e5%8b%99%e5%86%85%e5%ae%b9" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>フルスタックエンジニアとして、プロダクトの保守・開発を担当。&lt;/p>
&lt;h3 id="実績取り組み">実績・取り組み&lt;a class="td-heading-self-link" href="#%e5%ae%9f%e7%b8%be%e5%8f%96%e3%82%8a%e7%b5%84%e3%81%bf" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>スクラム開発の導入と推進&lt;/li>
&lt;li>新人エンジニアの育成&lt;/li>
&lt;li>広告表示ロジックの強化&lt;/li>
&lt;li>DB, Backendのパフォーマンスチューニング&lt;/li>
&lt;li>Embedded SRE EngineerとしてSLI・SLOの設計・開発・運用&lt;/li>
&lt;li>Four Keys導入によるDevOpsの推進&lt;/li>
&lt;li>勉強会・ワークショップの定期開催により、モダンインフラ・自動テスト・アジャイルなどチーム内のナレッジの強化&lt;/li>
&lt;/ul>
&lt;h3 id="課題">課題&lt;a class="td-heading-self-link" href="#%e8%aa%b2%e9%a1%8c" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>大規模開発によるプロダクト品質の低下&lt;/p>
&lt;h3 id="課題の経緯">課題の経緯&lt;a class="td-heading-self-link" href="#%e8%aa%b2%e9%a1%8c%e3%81%ae%e7%b5%8c%e7%b7%af" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>毎年の下期に大型開発を行っており、技術的負債が起因となり障害が多数発生した。&lt;/p>
&lt;h3 id="課題の原因">課題の原因&lt;a class="td-heading-self-link" href="#%e8%aa%b2%e9%a1%8c%e3%81%ae%e5%8e%9f%e5%9b%a0" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>度重なる新規開発によりコードレベルでのプロダクトの品質の低下や、ユーザーが増加したことにより既存アーキテクチャと相性が悪いこと&lt;/p>
&lt;h3 id="対処">対処&lt;a class="td-heading-self-link" href="#%e5%af%be%e5%87%a6" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>要件定義の強化&lt;/li>
&lt;li>自動テスト・テスト設計の強化&lt;/li>
&lt;li>既存機能のロジックの見直し&lt;/li>
&lt;li>DB・バックエンドのパフォーマンスチューニング&lt;/li>
&lt;/ul>
&lt;h3 id="成果">成果&lt;a class="td-heading-self-link" href="#%e6%88%90%e6%9e%9c" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>自動テスト文化の浸透&lt;/li>
&lt;li>ユーザーストーリーに基づく監視体制の強化&lt;/li>
&lt;li>APIパフォーマンスを最大約4.75倍の改善&lt;/li>
&lt;/ul>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>使用技術&lt;/th>
 &lt;th>使用サービス or フレームワーク&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>OS&lt;/td>
 &lt;td>Linux&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Golang&lt;/td>
 &lt;td>echo&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>JavaScript&lt;/td>
 &lt;td>React&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>DB&lt;/td>
 &lt;td>PostgreSQL, Elasticsearch&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Cache&lt;/td>
 &lt;td>Redis&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Infrastructure&lt;/td>
 &lt;td>Docker, Kubernates, AWS&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>CI tool&lt;/td>
 &lt;td>Code Build&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>CD tool&lt;/td>
 &lt;td>Code Pipline&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/div>
&lt;/section></description></item><item><title>金融メディアのSTEP開発</title><link>https://yoshihiroshu.com/profile/zuu/step-develop-financel-media/</link><pubDate>Wed, 01 May 2024 12:00:00 +0900</pubDate><guid>https://yoshihiroshu.com/profile/zuu/step-develop-financel-media/</guid><description>&lt;div>&lt;a id="td-block-0" class="td-offset-anchor">&lt;/a>&lt;/div>
&lt;section class="row td-box td-box--white td-box--height-auto">
&lt;div class="col">
&lt;div class="container">
&lt;h2 id="金融メディアのstep開発202312-202405">金融メディアのSTEP開発(2023/12-2024/05)&lt;a class="td-heading-self-link" href="#%e9%87%91%e8%9e%8d%e3%83%a1%e3%83%87%e3%82%a3%e3%82%a2%e3%81%aestep%e9%96%8b%e7%99%ba202312-202405" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>3000万円規模の投資開発において、主にバックエンドの開発を担当&lt;/p>
&lt;h3 id="チーム構成">チーム構成&lt;a class="td-heading-self-link" href="#%e3%83%81%e3%83%bc%e3%83%a0%e6%a7%8b%e6%88%90" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>チームリーダー：1名&lt;/p>
&lt;p>バックエンドエンジニア：1名&lt;/p>
&lt;p>フロントエンジニア：2名&lt;/p>
&lt;p>テスター：1名&lt;/p>
&lt;h4 id="チームでの自分の役割">チームでの自分の役割&lt;a class="td-heading-self-link" href="#%e3%83%81%e3%83%bc%e3%83%a0%e3%81%a7%e3%81%ae%e8%87%aa%e5%88%86%e3%81%ae%e5%bd%b9%e5%89%b2" aria-label="Heading self-link">&lt;/a>&lt;/h4>&lt;p>バックエンドエンジニア・テスター&lt;/p>
&lt;h4 id="担当フェーズ">担当フェーズ&lt;a class="td-heading-self-link" href="#%e6%8b%85%e5%bd%93%e3%83%95%e3%82%a7%e3%83%bc%e3%82%ba" aria-label="Heading self-link">&lt;/a>&lt;/h4>&lt;ul>
&lt;li>基本設計&lt;/li>
&lt;li>詳細設計&lt;/li>
&lt;li>開発&lt;/li>
&lt;li>テスト設計&lt;/li>
&lt;li>負荷テスト&lt;/li>
&lt;li>保守&lt;/li>
&lt;/ul>
&lt;h3 id="業務内容">業務内容&lt;a class="td-heading-self-link" href="#%e6%a5%ad%e5%8b%99%e5%86%85%e5%ae%b9" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>主に、既存の機能の大規模改修を行なった。&lt;/p>
&lt;p>既存の機能として、株価を予想し当たるとDocomo経済圏で使えるDポイントが付与される機能（通称&lt;a href="https://money.smt.docomo.ne.jp/quiz/stock-quiz.html">株価クイズ&lt;/a>）がある。&lt;/p>
&lt;p>その機能を一定の参加回数を超えるとリアルタイムでポイントが付与される抽選機能を開発に従事した。&lt;/p>
&lt;p>詳しくは&lt;a href="https://money.smt.docomo.ne.jp/contents/kabukaquiz_12.html?ref=top_information">こちら&lt;/a>&lt;/p>
&lt;h3 id="実績取り組み">実績・取り組み&lt;a class="td-heading-self-link" href="#%e5%ae%9f%e7%b8%be%e5%8f%96%e3%82%8a%e7%b5%84%e3%81%bf" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>株の銘柄コードの英文字対応をする改修&lt;/li>
&lt;li>既存のクイズ機能のキャンペーンを行う機能の開発&lt;/li>
&lt;li>SEO対策として、URL構造の変更&lt;/li>
&lt;li>結合テストの設計&lt;/li>
&lt;li>JMeterによる負荷テスト&lt;/li>
&lt;/ul>
&lt;h3 id="ビジネス課題">ビジネス課題&lt;a class="td-heading-self-link" href="#%e3%83%93%e3%82%b8%e3%83%8d%e3%82%b9%e8%aa%b2%e9%a1%8c" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>今回担当した&lt;a href="https://money.smt.docomo.ne.jp/quiz/stock-quiz.html">株価クイズ&lt;/a>は、流入数の1/3を占めているコンテンツとなっている。&lt;/p>
&lt;p>しかし、ユーザーごとの平均月次参加数が2,3回と低くく、更なる定着を目的として考案された機能となる。&lt;/p>
&lt;h3 id="技術課題">技術課題&lt;a class="td-heading-self-link" href="#%e6%8a%80%e8%a1%93%e8%aa%b2%e9%a1%8c" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>ユーザー体験向上のため、条件を満たしてから5秒以内にポイントが付与されるようなリアルタイム性を前提とした開発を行う必要があった。&lt;/p>
&lt;p>ポイント付与基盤の外部APIは何らかの要因でポイント付与が失敗するケースが存在していた。&lt;/p>
&lt;p>課題として、アタリ判定にも関わらずポイント付与が行われない事象が発生しまうことがあった。&lt;/p>
&lt;h3 id="対処">対処&lt;a class="td-heading-self-link" href="#%e5%af%be%e5%87%a6" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>リアルタイム抽選処理を行うAPIを3つ分けることで、責任境界を設けた。&lt;/p>
&lt;ul>
&lt;li>抽選判定API&lt;/li>
&lt;li>ポイント付与API&lt;/li>
&lt;li>ポイント付与結果取得API&lt;/li>
&lt;/ul>
&lt;p>&lt;code>抽選判定API&lt;/code>によりアタリを取得した場合、&lt;code>ポイント付与API&lt;/code>が実行される。&lt;/p>
&lt;p>そして&lt;code>ポイント付与結果取得API&lt;/code>が実行され、成功可否がレスポンスとして取得されアタリ・ハズレを判定するロジックとして設計を行なった。&lt;/p>
&lt;h3 id="成果">成果&lt;a class="td-heading-self-link" href="#%e6%88%90%e6%9e%9c" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>ピーク時である300request/secにも耐えることができ、ユーザー体験を向上させることに成功した。&lt;/p>
&lt;p>また、参加者数も通常の10倍に増えたことでPV数向上に大きく貢献することができた。&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>使用技術&lt;/th>
 &lt;th>使用サービス or フレームワーク&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>OS&lt;/td>
 &lt;td>Linux&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Golang&lt;/td>
 &lt;td>echo&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>JavaScript&lt;/td>
 &lt;td>React&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>DB&lt;/td>
 &lt;td>PostgreSQL, Elasticsearch&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Cache&lt;/td>
 &lt;td>Redis&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Infrastructure&lt;/td>
 &lt;td>Docker, Kubernates, AWS&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>CI tool&lt;/td>
 &lt;td>Code Build&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>CD tool&lt;/td>
 &lt;td>Code Pipline&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>tool&lt;/td>
 &lt;td>JMeter&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/div>
&lt;/section></description></item><item><title>自己紹介</title><link>https://yoshihiroshu.com/profile/introduction/</link><pubDate>Wed, 01 May 2024 12:00:00 +0900</pubDate><guid>https://yoshihiroshu.com/profile/introduction/</guid><description>&lt;div>&lt;a id="td-block-0" class="td-offset-anchor">&lt;/a>&lt;/div>
&lt;section class="row td-box td-box--white td-box--height-auto">
&lt;div class="col">
&lt;div class="container">
&lt;h3 id="基本情報">基本情報&lt;a class="td-heading-self-link" href="#%e5%9f%ba%e6%9c%ac%e6%83%85%e5%a0%b1" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>key&lt;/th>
 &lt;th>value&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Name&lt;/td>
 &lt;td>朱　義宏 (Yoshihiro Shu)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Github&lt;/td>
 &lt;td>&lt;a href="https://github.com/yoshihiro-shu">yoshihiro-shu&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Qiita&lt;/td>
 &lt;td>&lt;a href="https://qiita.com/yoshihiro-shu">yoshihiro-shu&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>note&lt;/td>
 &lt;td>&lt;a href="https://note.com/yoshihiro_shu">yoshihiro_shu&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h3 id="職務経歴要約">職務経歴要約&lt;a class="td-heading-self-link" href="#%e8%81%b7%e5%8b%99%e7%b5%8c%e6%ad%b4%e8%a6%81%e7%b4%84" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>大学卒業後、株式会社ZUUにて金融メディアの開発・運用・保守に従事した後、現在はGMOペパボ株式会社にてソフトウェアエンジニアとして勤務しております。Go言語を中心としたバックエンド開発を軸に、要件定義から設計・実装・リリースまでを一貫して経験しております。
また、チームビルディングやプロジェクトマネジメントの経験もあります。&lt;/p>
&lt;p>詳しくは&lt;a href="https://yoshihiroshu.com/resume/">職務経歴書&lt;/a>をご覧ください。&lt;/p>
&lt;h3 id="執筆歴">執筆歴&lt;a class="td-heading-self-link" href="#%e5%9f%b7%e7%ad%86%e6%ad%b4" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>&lt;a href="https://qiita.com/yoshihiro-shu">Qiita&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://yoshihiroshu.com">テックブログ&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://note.com/yoshihiro_shu">note&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://speakerdeck.com/yoshihiro_shu">speakerdeck&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://zenn.dev/pepabo/articles/0993da576b5336">Zenn / Pepabo Tech Blog&lt;/a> — 管理画面いらずの運用を実現するため、Protocol Buffers から MCPサーバーを生成するツールを作った（2025年12月）&lt;/li>
&lt;/ul>
&lt;/div>
&lt;/div>
&lt;/section></description></item><item><title>自社サービスのマニュアルサイトの開発(2023/02-2023/04)</title><link>https://yoshihiroshu.com/profile/zuu/develop-manual-site/</link><pubDate>Wed, 01 May 2024 12:00:00 +0900</pubDate><guid>https://yoshihiroshu.com/profile/zuu/develop-manual-site/</guid><description>&lt;div>&lt;a id="td-block-0" class="td-offset-anchor">&lt;/a>&lt;/div>
&lt;section class="row td-box td-box--white td-box--height-auto">
&lt;div class="col">
&lt;div class="container">
&lt;h2 id="自社サービスのマニュアルサイトの開発202302-202304">自社サービスのマニュアルサイトの開発(2023/02-2023/04)&lt;a class="td-heading-self-link" href="#%e8%87%aa%e7%a4%be%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e3%81%ae%e3%83%9e%e3%83%8b%e3%83%a5%e3%82%a2%e3%83%ab%e3%82%b5%e3%82%a4%e3%83%88%e3%81%ae%e9%96%8b%e7%99%ba202302-202304" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;h3 id="プロジェクト概要">プロジェクト概要&lt;a class="td-heading-self-link" href="#%e3%83%97%e3%83%ad%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e6%a6%82%e8%a6%81" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>自社プロダクトのマニュアルサイトの構築をメインで担当。&lt;/p>
&lt;h3 id="担当フェーズ">担当フェーズ&lt;a class="td-heading-self-link" href="#%e6%8b%85%e5%bd%93%e3%83%95%e3%82%a7%e3%83%bc%e3%82%ba" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>ユーザーインタビュー&lt;/li>
&lt;li>要求定義&lt;/li>
&lt;li>要件定義&lt;/li>
&lt;li>設計&lt;/li>
&lt;li>開発&lt;/li>
&lt;li>テスト&lt;/li>
&lt;li>保守&lt;/li>
&lt;/ul>
&lt;h3 id="業務内容">業務内容&lt;a class="td-heading-self-link" href="#%e6%a5%ad%e5%8b%99%e5%86%85%e5%ae%b9" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>機能利用方法に関するお問い合わせの工数削減のため、自社プロダクトの公式のマニュアルを構築&lt;/p>
&lt;h3 id="実績取り組み">実績・取り組み&lt;a class="td-heading-self-link" href="#%e5%ae%9f%e7%b8%be%e5%8f%96%e3%82%8a%e7%b5%84%e3%81%bf" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>運用サイド30名ほどユーザーインタビューを行い、要求・要件定義&lt;/li>
&lt;li>技術選定・実装&lt;/li>
&lt;li>コンテンツの作成&lt;/li>
&lt;/ul>
&lt;h3 id="課題">課題&lt;a class="td-heading-self-link" href="#%e8%aa%b2%e9%a1%8c" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>自社プロダクトにはユーザー向けのマニュアルが用意あれていないため、利用方法のお問い合わせの工数が削減し、生産性を向上したい課題があった。&lt;/p>
&lt;h3 id="課題の経緯">課題の経緯&lt;a class="td-heading-self-link" href="#%e8%aa%b2%e9%a1%8c%e3%81%ae%e7%b5%8c%e7%b7%af" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>運用者が自社プロダクト利用方法を知るためには、エンジニアとディレクターにお問い合わせを行う必要があり、完結するまでのリードタイムや課題があった。&lt;/p>
&lt;h3 id="課題の原因">課題の原因&lt;a class="td-heading-self-link" href="#%e8%aa%b2%e9%a1%8c%e3%81%ae%e5%8e%9f%e5%9b%a0" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>自社プロダクト利用方法のナレッジがエンジニア・ディレクターに属人化しており、運用者・エンジニア・ディレクターそれぞれに発生するコミュニケーションボリュームが課題となっていた。&lt;/p>
&lt;h3 id="対処">対処&lt;a class="td-heading-self-link" href="#%e5%af%be%e5%87%a6" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>運用者に運用上での困っていることやどのような機能が欲しいかユーザーインタビューを実施。&lt;/li>
&lt;li>マニュアルサイトを0から開発
&lt;ul>
&lt;li>要件定義、実装、リリースまでを担当&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>コンテンツの作成
&lt;ul>
&lt;li>ユーザーインタビューにより発覚したニーズが高いコンテンツから作成&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="成果">成果&lt;a class="td-heading-self-link" href="#%e6%88%90%e6%9e%9c" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>エンジニアによるドキュメント整備の促進&lt;/li>
&lt;li>一月あたり15時間のコミュニケーションコストの削減&lt;/li>
&lt;/ul>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>使用技術&lt;/th>
 &lt;th>使用サービス or フレームワーク&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>OS&lt;/td>
 &lt;td>Linux&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>CMS&lt;/td>
 &lt;td>&lt;a href="https://gohugo.io/hosting-and-deployment/hosting-on-github/">hugo&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Amazon Web Service&lt;/td>
 &lt;td>Route53&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Google Cloud Platform&lt;/td>
 &lt;td>GKE, Load Balancer, Cloud Armor, Cloud Build&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>terraform&lt;/td>
 &lt;td>上記のGCPサービスの実装&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>CI tool&lt;/td>
 &lt;td>GCP Cloud Buildによる、Docker Imageの自動ビルド&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>CD tool&lt;/td>
 &lt;td>Argo CD&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/div>
&lt;/section></description></item><item><title>自社製品のリプレイス開発(2022/02-2023/04)</title><link>https://yoshihiroshu.com/profile/zuu/replace-product-mpcloud/</link><pubDate>Wed, 01 May 2024 12:00:00 +0900</pubDate><guid>https://yoshihiroshu.com/profile/zuu/replace-product-mpcloud/</guid><description>&lt;div>&lt;a id="td-block-0" class="td-offset-anchor">&lt;/a>&lt;/div>
&lt;section class="row td-box td-box--white td-box--height-auto">
&lt;div class="col">
&lt;div class="container">
&lt;h2 id="自社製品のリプレイス開発202202-202304">自社製品のリプレイス開発(2022/02-2023/04)&lt;a class="td-heading-self-link" href="#%e8%87%aa%e7%a4%be%e8%a3%bd%e5%93%81%e3%81%ae%e3%83%aa%e3%83%97%e3%83%ac%e3%82%a4%e3%82%b9%e9%96%8b%e7%99%ba202202-202304" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;h3 id="プロジェクト概要">プロジェクト概要&lt;a class="td-heading-self-link" href="#%e3%83%97%e3%83%ad%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e6%a6%82%e8%a6%81" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>自社製品の&lt;a href="https://zuu.co.jp/service/mp-cloud/">MPcloud&lt;/a>のバックエンドとフロントエンドを分離するリプレイス開発にフルスタックエンジニアとして従事&lt;/p>
&lt;h3 id="チーム構成">チーム構成&lt;a class="td-heading-self-link" href="#%e3%83%81%e3%83%bc%e3%83%a0%e6%a7%8b%e6%88%90" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>チームリーダー：1名&lt;/p>
&lt;p>フルスタックエンジニア：3名&lt;/p>
&lt;h3 id="チームでの自分の役割">チームでの自分の役割&lt;a class="td-heading-self-link" href="#%e3%83%81%e3%83%bc%e3%83%a0%e3%81%a7%e3%81%ae%e8%87%aa%e5%88%86%e3%81%ae%e5%bd%b9%e5%89%b2" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>フルスタックエンジニア&lt;/p>
&lt;h3 id="担当フェーズ">担当フェーズ&lt;a class="td-heading-self-link" href="#%e6%8b%85%e5%bd%93%e3%83%95%e3%82%a7%e3%83%bc%e3%82%ba" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>設計&lt;/li>
&lt;li>開発&lt;/li>
&lt;li>テスト&lt;/li>
&lt;li>保守&lt;/li>
&lt;/ul>
&lt;h3 id="業務内容">業務内容&lt;a class="td-heading-self-link" href="#%e6%a5%ad%e5%8b%99%e5%86%85%e5%ae%b9" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>自社プロダクトのバックエンドとフロントエンドの分離により、ログイン機能やセキュリティなどのリプレイス開発を担当。&lt;/p>
&lt;h3 id="実績取り組み">実績・取り組み&lt;a class="td-heading-self-link" href="#%e5%ae%9f%e7%b8%be%e5%8f%96%e3%82%8a%e7%b5%84%e3%81%bf" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>Csrf Token Securityの新規開発
&lt;ul>
&lt;li>技術選定、設計、実装、テストコードによる自動テストを担当&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>ログイン機能のリプレイス
&lt;ul>
&lt;li>Twitter, Facebook認証によるログイン機能のリプレイス&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>脆弱性診断と対策
&lt;ul>
&lt;li>OWASP ZAPによる脆弱性診断&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>リリース作業とドキュメント化
&lt;ul>
&lt;li>Google CloudやKubernetesの知見がないエンジニアがリリースを行うため、ドキュメント化をした&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>マネージド証明書の実装
&lt;ul>
&lt;li>KubernetesのManegedCertificateの適用&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="課題">課題&lt;a class="td-heading-self-link" href="#%e8%aa%b2%e9%a1%8c" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>自分を含めチームの半分が新卒一年目のエンジニアで構成されており、チーム全体としての技術力に課題があった。&lt;/p>
&lt;h3 id="課題の経緯">課題の経緯&lt;a class="td-heading-self-link" href="#%e8%aa%b2%e9%a1%8c%e3%81%ae%e7%b5%8c%e7%b7%af" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>チーム全体として見た時に、Google CloudやKubernetesなどのインフラの知見が少なく、チームリーダ不在時の障害発生時に円滑に対応できないなどの課題があった。&lt;/p>
&lt;h3 id="課題の原因">課題の原因&lt;a class="td-heading-self-link" href="#%e8%aa%b2%e9%a1%8c%e3%81%ae%e5%8e%9f%e5%9b%a0" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>チームメンバーの担当タスクによる技術のキャッチアップが依存していた。&lt;/p>
&lt;h3 id="対処">対処&lt;a class="td-heading-self-link" href="#%e5%af%be%e5%87%a6" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>タスクから学んだことを共有するmtgを設ける&lt;/li>
&lt;li>ペアプロをしやすい環境の整備&lt;/li>
&lt;li>障害訓練など定期的にGoogle Cloudを触る機会を設ける&lt;/li>
&lt;/ul>
&lt;h3 id="成果">成果&lt;a class="td-heading-self-link" href="#%e6%88%90%e6%9e%9c" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>社内外を含め学んだことを積極的に共有する文化の確立&lt;/li>
&lt;li>ペアプロを通して、知識の拡充やレビューなどのリードタイムの削減&lt;/li>
&lt;li>突如発生する障害に対して、適切に対処するチームワークの向上&lt;/li>
&lt;/ul>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>使用技術&lt;/th>
 &lt;th>使用サービス or フレームワーク&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>OS&lt;/td>
 &lt;td>Linux&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Golang&lt;/td>
 &lt;td>echo&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>JavaScript&lt;/td>
 &lt;td>NuxtJs&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>DB&lt;/td>
 &lt;td>PostgreSQL, Elasticsearch&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Cache&lt;/td>
 &lt;td>Redis&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Infrastructure&lt;/td>
 &lt;td>Docker, Kubernates, GCP&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>CI tool&lt;/td>
 &lt;td>GitHub Actionによるビルドテスト&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>CD tool&lt;/td>
 &lt;td>Argo CD&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/div>
&lt;/section></description></item><item><title>副業における経験</title><link>https://yoshihiroshu.com/profile/side-job/</link><pubDate>Wed, 01 May 2024 12:00:00 +0900</pubDate><guid>https://yoshihiroshu.com/profile/side-job/</guid><description>&lt;div>&lt;a id="td-block-0" class="td-offset-anchor">&lt;/a>&lt;/div>
&lt;section class="row td-box td-box--white td-box--height-auto">
&lt;div class="col">
&lt;div class="container">
&lt;h2 id="アイタックソリューションズ株式会社バイト202109-202201">アイタックソリューションズ株式会社（バイト:2021/09-2022/01）&lt;a class="td-heading-self-link" href="#%e3%82%a2%e3%82%a4%e3%82%bf%e3%83%83%e3%82%af%e3%82%bd%e3%83%aa%e3%83%a5%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%82%ba%e6%a0%aa%e5%bc%8f%e4%bc%9a%e7%a4%be%e3%83%90%e3%82%a4%e3%83%88202109-202201" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>職務: サーバーサイドエンジニア&lt;/p>
&lt;h3 id="混雑状況判定システムの管理画面の実装">混雑状況判定システムの管理画面の実装&lt;a class="td-heading-self-link" href="#%e6%b7%b7%e9%9b%91%e7%8a%b6%e6%b3%81%e5%88%a4%e5%ae%9a%e3%82%b7%e3%82%b9%e3%83%86%e3%83%a0%e3%81%ae%e7%ae%a1%e7%90%86%e7%94%bb%e9%9d%a2%e3%81%ae%e5%ae%9f%e8%a3%85" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>使用技術&lt;/th>
 &lt;th>使用サービス or フレームワーク&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Python3&lt;/td>
 &lt;td>Django RestFrameWork&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>JavaScript&lt;/td>
 &lt;td>Vue.js&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="芸能人向けライブ配信サイトのプラットフォームの新規開発202211-202302">芸能人向けライブ配信サイトのプラットフォームの新規開発(2022/11-2023/02)&lt;a class="td-heading-self-link" href="#%e8%8a%b8%e8%83%bd%e4%ba%ba%e5%90%91%e3%81%91%e3%83%a9%e3%82%a4%e3%83%96%e9%85%8d%e4%bf%a1%e3%82%b5%e3%82%a4%e3%83%88%e3%81%ae%e3%83%97%e3%83%a9%e3%83%83%e3%83%88%e3%83%95%e3%82%a9%e3%83%bc%e3%83%a0%e3%81%ae%e6%96%b0%e8%a6%8f%e9%96%8b%e7%99%ba202211-202302" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>ライブ配信サイトのプラットフォームの新規開発をバックエンドエンジニアとして参画しました。&lt;/p>
&lt;h3 id="実装した機能">実装した機能&lt;a class="td-heading-self-link" href="#%e5%ae%9f%e8%a3%85%e3%81%97%e3%81%9f%e6%a9%9f%e8%83%bd" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>主に会員機能を担当しました。&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://jwt.io/introduction">JWTトークン&lt;/a>によるログイン、ログアウト機能&lt;/li>
&lt;li>プロフィール登録、編集機能&lt;/li>
&lt;li>フォロー機能&lt;/li>
&lt;/ul>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>使用技術&lt;/th>
 &lt;th>使用サービス or フレームワーク&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Golang&lt;/td>
 &lt;td>gin&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>TypeScript&lt;/td>
 &lt;td>Nextjs&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>DB&lt;/td>
 &lt;td>My SQL&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Amazon Web Service&lt;/td>
 &lt;td>Route53, Amazon ECS&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="古本向けフリマサイトのプラットフォームの新規開発202311-">古本向けフリマサイトのプラットフォームの新規開発(2023/11-)&lt;a class="td-heading-self-link" href="#%e5%8f%a4%e6%9c%ac%e5%90%91%e3%81%91%e3%83%95%e3%83%aa%e3%83%9e%e3%82%b5%e3%82%a4%e3%83%88%e3%81%ae%e3%83%97%e3%83%a9%e3%83%83%e3%83%88%e3%83%95%e3%82%a9%e3%83%bc%e3%83%a0%e3%81%ae%e6%96%b0%e8%a6%8f%e9%96%8b%e7%99%ba202311-" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>古本向けフリマサイトの新規開発をフロントエンジニアとして参画しております。&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>使用技術&lt;/th>
 &lt;th>使用サービス or フレームワーク&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>TypeScript&lt;/td>
 &lt;td>Nextjs&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>DB&lt;/td>
 &lt;td>MongoDB&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/div>
&lt;/section></description></item><item><title>なんちゃってスクラムを運用してみて</title><link>https://yoshihiroshu.com/blog/wannabe-scrum/</link><pubDate>Mon, 08 Jan 2024 12:00:00 +0900</pubDate><guid>https://yoshihiroshu.com/blog/wannabe-scrum/</guid><description>&lt;div>&lt;a id="td-block-0" class="td-offset-anchor">&lt;/a>&lt;/div>
&lt;section class="row td-box td-box--white td-box--height-auto">
&lt;div class="col">
&lt;div class="container">
&lt;h2 id="はじめに">はじめに&lt;a class="td-heading-self-link" href="#%e3%81%af%e3%81%98%e3%82%81%e3%81%ab" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>&lt;strong>前職の株式会社Zuuでの話です。また個人の見解です。&lt;/strong>&lt;/p>
&lt;p>現在とある金融系Webメディアを運営する会社で、新卒二年目のフルスタックエンジニアとして保守運用をしています。&lt;/p>
&lt;p>今回は未熟なエンジニアが自チームにスクラムを導入して半年程経ち、なんちゃってスクラムながらかなり恩恵を受けることができたので、ふりかえりの意味を込めてまとめました。&lt;/p>
&lt;h2 id="スクラム導入の背景">スクラム導入の背景&lt;a class="td-heading-self-link" href="#%e3%82%b9%e3%82%af%e3%83%a9%e3%83%a0%e5%b0%8e%e5%85%a5%e3%81%ae%e8%83%8c%e6%99%af" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>今年の4月から異動になった新チームでは、過度な残業時間が日常化しており、常に炎上していることが課題となっていました。&lt;/p>
&lt;p>ボトルネックとして、工数見積もりの精度の低さ、実績工数の管理の甘さ、タスク漏れから精度の高い工数の見積もりやプロジェクトのプロセスを進められないことにありました。&lt;/p>
&lt;p>そのためチームワークの促進、心理的安全性の改善、工数やタスクの見える化の改善を行う必要がありました。&lt;/p>
&lt;p>そこでアジャイルで有名なフレームワークであるスクラム開発を採用することで、正常な開発プロセスを踏めるのでないかと思い導入を決めました。&lt;/p>
&lt;h2 id="導入プロセス">導入プロセス&lt;a class="td-heading-self-link" href="#%e5%b0%8e%e5%85%a5%e3%83%97%e3%83%ad%e3%82%bb%e3%82%b9" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;h3 id="キャッチアップ">キャッチアップ&lt;a class="td-heading-self-link" href="#%e3%82%ad%e3%83%a3%e3%83%83%e3%83%81%e3%82%a2%e3%83%83%e3%83%97" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>以下の本やUdemyでインプットを行い、また勉強会に参加し現役のスクラムマスターからアドバイスをもらうなどをしてキャッチアップを進めました。&lt;/p>
&lt;p>本&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://amzn.to/4aob5Dh">いちばんやさしいアジャイル開発の教本&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://amzn.to/3Tr6ZnU">アジャイルサムライ――達人開発者への道&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://amzn.to/41pgbv2">SCRUM BOOT CAMP THE BOOK&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Udemy&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://www.udemy.com/course/scrum-course-japanese/">【アジャイル開発】スクラム基礎講座&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.udemy.com/course/daipresents-advanced-agile/">現役アジャイルコーチが教える！たった1日で理解できるアジャイル開発とスクラム 導入と実践、組織変革編&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>勉強会&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://scrum-jikken.connpass.com/">スクラム実験室&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://smn.connpass.com/">Scrum Masters Night!&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="チームメンバーの同意を得る">チームメンバーの同意を得る&lt;a class="td-heading-self-link" href="#%e3%83%81%e3%83%bc%e3%83%a0%e3%83%a1%e3%83%b3%e3%83%90%e3%83%bc%e3%81%ae%e5%90%8c%e6%84%8f%e3%82%92%e5%be%97%e3%82%8b" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>定期的にアジャイルやスクラムについての勉強会を開催することで、メリットとデメリットなどを共有することやどれだけ本気でやっているか熱意を伝えることで同意を得ることができました。&lt;/p>
&lt;p>また、ドラッガー風エクササイズやインセプションデッキなどチームビルディングを行うことで、徐々に取り入れて行きました。&lt;/p>
&lt;h3 id="ロールの準備">ロールの準備&lt;a class="td-heading-self-link" href="#%e3%83%ad%e3%83%bc%e3%83%ab%e3%81%ae%e6%ba%96%e5%82%99" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>スクラム開発では、プロダクトオーナー、開発チーム、スクラムマスターの3つの役割があるため、他のメンバーに協力してもらう必要がありました。&lt;/p>
&lt;p>プロダクトオーナーには、ディレクターとして兼任しているチームリーダーに担当してもらいました。&lt;/p>
&lt;p>スクラムマスターには、前チームのリーダーに担当してもらいました。（工数などの兼ね合いから最初の二ヶ月のみ参加してもらいました。）&lt;/p>
&lt;h3 id="スクラム導入">スクラム導入！！！&lt;a class="td-heading-self-link" href="#%e3%82%b9%e3%82%af%e3%83%a9%e3%83%a0%e5%b0%8e%e5%85%a5" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>スクラム導入の準備が完了したので、いよいよスクラムの開始です！&lt;/p>
&lt;p>以下のイベントを一週間のスプリントで行いました。
ビジネスサイドを巻き込むことができなかったため、スプリントレビューは行っていません。&lt;/p>
&lt;ul>
&lt;li>スプリントプランニング&lt;/li>
&lt;li>デイリースクラム&lt;/li>
&lt;li>見積もり&lt;/li>
&lt;li>スプリントレトロスペクティブ&lt;/li>
&lt;/ul>
&lt;p>また、タスク管理の不透明性が課題だったため、このタイミングでNukabのバックログタスク管理ツールの統一を行いました。&lt;/p>
&lt;h2 id="成果">成果&lt;a class="td-heading-self-link" href="#%e6%88%90%e6%9e%9c" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;h3 id="リリーススケジュールの安定">リリーススケジュールの安定&lt;a class="td-heading-self-link" href="#%e3%83%aa%e3%83%aa%e3%83%bc%e3%82%b9%e3%82%b9%e3%82%b1%e3%82%b8%e3%83%a5%e3%83%bc%e3%83%ab%e3%81%ae%e5%ae%89%e5%ae%9a" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>計画作りを徹底して行うことで差し込み案件や障害などの突然発生するタスクが発生しても、リリースの見通し立てることができるなど、安定したリリーススケジュールを運用することができました。&lt;/p>
&lt;h3 id="メンバーのタスクの進捗の可視化">メンバーのタスクの進捗の可視化&lt;a class="td-heading-self-link" href="#%e3%83%a1%e3%83%b3%e3%83%90%e3%83%bc%e3%81%ae%e3%82%bf%e3%82%b9%e3%82%af%e3%81%ae%e9%80%b2%e6%8d%97%e3%81%ae%e5%8f%af%e8%a6%96%e5%8c%96" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>タスク管理ツールのバックログに統一したことやスプリントプランニングでタスクの分割を徹底して行うことで、進捗の把握やタスク漏れなど改善することができました。&lt;/p>
&lt;h3 id="タスクの見積もりの精度の向上">タスクの見積もりの精度の向上&lt;a class="td-heading-self-link" href="#%e3%82%bf%e3%82%b9%e3%82%af%e3%81%ae%e8%a6%8b%e7%a9%8d%e3%82%82%e3%82%8a%e3%81%ae%e7%b2%be%e5%ba%a6%e3%81%ae%e5%90%91%e4%b8%8a" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>チームメンバー全員で見積もりを行うことで、別メンバーが担当するタスクの要件理解の推進やタスク背景の共有を行うことで精度の高い見積もりを行うことができました。&lt;/p>
&lt;h2 id="できたこととできなかったこと">できたこととできなかったこと&lt;a class="td-heading-self-link" href="#%e3%81%a7%e3%81%8d%e3%81%9f%e3%81%93%e3%81%a8%e3%81%a8%e3%81%a7%e3%81%8d%e3%81%aa%e3%81%8b%e3%81%a3%e3%81%9f%e3%81%93%e3%81%a8" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;h3 id="できたこと">できたこと&lt;a class="td-heading-self-link" href="#%e3%81%a7%e3%81%8d%e3%81%9f%e3%81%93%e3%81%a8" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>ペアプロ文化の促進&lt;/li>
&lt;li>テスト駆動開発など新しい挑戦&lt;/li>
&lt;li>チームメンバー全員で行う精度の高い見積もり&lt;/li>
&lt;li>スプリントプランニングによるリリーススケジュールの計画&lt;/li>
&lt;li>スプリントレトロスペクティブから週次のふりかえり文化の定着&lt;/li>
&lt;/ul>
&lt;h4 id="なぜできたのか">なぜできたのか？&lt;a class="td-heading-self-link" href="#%e3%81%aa%e3%81%9c%e3%81%a7%e3%81%8d%e3%81%9f%e3%81%ae%e3%81%8b" aria-label="Heading self-link">&lt;/a>&lt;/h4>&lt;p>スクラムの定義しているイベントを運用することで、アジャイルで重要とされているイベントを暗黙的に運用することができた!&lt;/p></description></item><item><title>Redisの負荷を1/3改善した話</title><link>https://yoshihiroshu.com/blog/redis-load-reduction/</link><pubDate>Sat, 16 Dec 2023 12:00:00 +0900</pubDate><guid>https://yoshihiroshu.com/blog/redis-load-reduction/</guid><description>&lt;div>&lt;a id="td-block-0" class="td-offset-anchor">&lt;/a>&lt;/div>
&lt;section class="row td-box td-box--white td-box--height-auto">
&lt;div class="col">
&lt;div class="container">
&lt;h2 id="はじめに">はじめに&lt;a class="td-heading-self-link" href="#%e3%81%af%e3%81%98%e3%82%81%e3%81%ab" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>現在とある金融系Webメディアを運営する会社で、主にバックエンドの開発を担当しており、フロントエンド、インフラに関する業務も担当しています。&lt;/p>
&lt;p>今回は、先輩エンジニアがデータ圧縮アルゴリズムを変更することでRedisの負荷を1/3に削減することに成功した実例をもとに記述して行きます。&lt;/p>
&lt;ul>
&lt;li>先輩エンジニア(通称 &lt;a href="https://github.com/ichigozero">ichigozero&lt;/a>)は、vimmer, hacker, rustが得意なエンジニアです。（共通の趣味（おうちKubernetes）について語り合うのが日課です。笑）&lt;/li>
&lt;/ul>
&lt;h2 id="サービスの概要">サービスの概要&lt;a class="td-heading-self-link" href="#%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e3%81%ae%e6%a6%82%e8%a6%81" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>金融に関する記事を掲載するWebメディアを運用しています。&lt;/p>
&lt;h2 id="背景">背景&lt;a class="td-heading-self-link" href="#%e8%83%8c%e6%99%af" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>現在運用しているメディアでは約100万記事掲載しており、直近一年で約50万記事と急激に増加し、Redisのパフォーマンスが劣化する課題がありました。&lt;/p>
&lt;p>RedisのCPU使用率が高負荷状態になると、インスタンスを増やすことで一時的な対応を行っていました。&lt;/p>
&lt;p>そこで根本的なアプローチをし、改善を行うとなったのが背景です。&lt;/p>
&lt;p>*別アプローチも行っており、大幅な改善が見られました。別記事にて紹介する予定です。&lt;/p>
&lt;h2 id="前提">前提&lt;a class="td-heading-self-link" href="#%e5%89%8d%e6%8f%90" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;h3 id="データ取得のフロー">データ取得のフロー&lt;a class="td-heading-self-link" href="#%e3%83%87%e3%83%bc%e3%82%bf%e5%8f%96%e5%be%97%e3%81%ae%e3%83%95%e3%83%ad%e3%83%bc" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>サーバーでは、Redis-&amp;gt;PostgreSQLという順番で問い合わせを行っています。&lt;/p>
&lt;pre class="mermaid">sequenceDiagram
 participant Client
 participant Server
 participant Redis
 participant PostgreSQL

 Client-&amp;gt;Server: リクエスト

 Server-&amp;gt;Redis: Redisからデータを取得
 Redis-&amp;gt;Server: データが存在する場合、データを返す

 alt Redisからデータが存在しない場合
 Server-&amp;gt;PostgreSQL: PostgreSQLからデータを取得
 Server-&amp;gt;Redis: データを保存
 end

 Server-&amp;gt;Client: レスポンス&lt;/pre>
&lt;h2 id="解決策">解決策&lt;a class="td-heading-self-link" href="#%e8%a7%a3%e6%b1%ba%e7%ad%96" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>データ圧縮アルゴリズムのGob形式から、パフォーマンスの高いアルゴリズムであるMgspack形式とSnappy形式を採用することで、大幅な改善に成功しました。&lt;/p>
&lt;h3 id="採用理由">採用理由&lt;a class="td-heading-self-link" href="#%e6%8e%a1%e7%94%a8%e7%90%86%e7%94%b1" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>データ圧縮のベンチマークについては、&lt;code>Gob&lt;/code>と&lt;code>Mgspack + Snappy&lt;/code>は同等のパフォーマンスです。&lt;/p>
&lt;p>しかしバイトサイズを比較すると&lt;code>Mgspack + Snappy&lt;/code>が&lt;code>Gob&lt;/code>と比べ、半分のサイズに圧縮することができています。&lt;/p>
&lt;p>結果、Redisのベンチマークを比べるとns/op(1回の操作にかかる平均時間)が約11%、B/op(1回の操作で消費する平均メモリ量)が約3%、allocs/op(1回の操作で生成される平均割り当て数)が約80%と大幅に改善したので採用しました。&lt;/p>
&lt;h3 id="ベンチマーク">ベンチマーク&lt;a class="td-heading-self-link" href="#%e3%83%99%e3%83%b3%e3%83%81%e3%83%9e%e3%83%bc%e3%82%af" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>データ圧縮のベンチマーク&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-zsh" data-lang="zsh">&lt;span class="line">&lt;span class="cl">BenchmarkJSONMarshal-12 	 45304	 &lt;span class="m">25614&lt;/span> ns/op	 &lt;span class="m">17984&lt;/span> B/op	 &lt;span class="m">35&lt;/span> allocs/op
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">BenchmarkJSONUnmarshal-12 	 14763	 &lt;span class="m">81072&lt;/span> ns/op	 &lt;span class="m">31334&lt;/span> B/op	 &lt;span class="m">74&lt;/span> allocs/op
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">BenchmarkGobMarshal-12 	 120536	 &lt;span class="m">10011&lt;/span> ns/op	 &lt;span class="m">29876&lt;/span> B/op	 &lt;span class="m">51&lt;/span> allocs/op
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">BenchmarkGobUnmarshal-12 	 56109	 &lt;span class="m">21446&lt;/span> ns/op	 &lt;span class="m">36464&lt;/span> B/op	 &lt;span class="m">243&lt;/span> allocs/op
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">BenchmarkMsgpackMarshal-12 	 373802	 &lt;span class="m">2888&lt;/span> ns/op	 &lt;span class="m">28005&lt;/span> B/op	 &lt;span class="m">5&lt;/span> allocs/op
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">BenchmarkMsgpackUnmarshal-12 	 369746	 &lt;span class="m">3261&lt;/span> ns/op	 &lt;span class="m">15286&lt;/span> B/op	 &lt;span class="m">34&lt;/span> allocs/op
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">BenchmarkMsgpackSnappyMarshal-12 	 55236	 &lt;span class="m">21330&lt;/span> ns/op	 &lt;span class="m">44386&lt;/span> B/op	 &lt;span class="m">5&lt;/span> allocs/op
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">BenchmarkMsgpackSnappyUnmarshal-12 	 140824	 &lt;span class="m">8507&lt;/span> ns/op	 &lt;span class="m">28951&lt;/span> B/op	 &lt;span class="m">35&lt;/span> allocs/op
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Redisベンチマーク&lt;/p></description></item><item><title>これだけは知っておきたいDNS</title><link>https://yoshihiroshu.com/blog/dns-basic-knowledge/</link><pubDate>Sun, 30 Jul 2023 12:00:00 +0900</pubDate><guid>https://yoshihiroshu.com/blog/dns-basic-knowledge/</guid><description>&lt;div>&lt;a id="td-block-0" class="td-offset-anchor">&lt;/a>&lt;/div>
&lt;section class="row td-box td-box--white td-box--height-auto">
&lt;div class="col">
&lt;div class="container">
&lt;h2 id="はじめに">はじめに&lt;a class="td-heading-self-link" href="#%e3%81%af%e3%81%98%e3%82%81%e3%81%ab" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>DNSについて、最低限知っておきたいポイントを整理しました。誰かのお役に立てれば幸いです。&lt;/p>
&lt;h2 id="登場人物">登場人物&lt;a class="td-heading-self-link" href="#%e7%99%bb%e5%a0%b4%e4%ba%ba%e7%89%a9" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;h2 id="dnsを動かすために必要なこと">DNSを動かすために必要なこと&lt;a class="td-heading-self-link" href="#dns%e3%82%92%e5%8b%95%e3%81%8b%e3%81%99%e3%81%9f%e3%82%81%e3%81%ab%e5%bf%85%e8%a6%81%e3%81%aa%e3%81%93%e3%81%a8" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;ul>
&lt;li>自分のドメイン名をインターネットでつけるようにする
　- 権威サーバーを動かすことで自分のドメイン名をインターネットで使えるようにする&lt;/li>
&lt;li>インターネットで使われているドメイン名を自分が使えるようにする
&lt;ul>
&lt;li>フルリゾルバー、スタブリゾルバー、特にフルリゾルバーを動かすことでインターネットで使われているドメインを自分で使えるようにする&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>DNSを動かし続け、可用性を高める
&lt;ul>
&lt;li>問題なく動作していることを確認すること、外部攻撃に備え動かし続ける必要がある&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="dns設計">DNS設計&lt;a class="td-heading-self-link" href="#dns%e8%a8%ad%e8%a8%88" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;h3 id="ユースケース">ユースケース&lt;a class="td-heading-self-link" href="#%e3%83%a6%e3%83%bc%e3%82%b9%e3%82%b1%e3%83%bc%e3%82%b9" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>
&lt;p>運用しているサービスやサーバーが少ない場合
サブドメインを作成せず、階層構造を持たないフラットな管理をする。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>部門別のシステムをサブドメインを作成し、システム部門が全体の管理する場合
1つのゾーンで運用する&lt;/p>
&lt;/li>
&lt;li>
&lt;p>他部門が独自サブドメインを使ってサービスサイトを運用し、そのサブドメインもその部門が管理する場合
サブドメインを作成し、ゾーンの管理をその部門委任する&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h2 id="権威サーバーの可用性">権威サーバーの可用性&lt;a class="td-heading-self-link" href="#%e6%a8%a9%e5%a8%81%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc%e3%81%ae%e5%8f%af%e7%94%a8%e6%80%a7" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;h3 id="プライマリサーバーとセカンダリサーバーの設置">プライマリサーバーとセカンダリサーバーの設置&lt;a class="td-heading-self-link" href="#%e3%83%97%e3%83%a9%e3%82%a4%e3%83%9e%e3%83%aa%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc%e3%81%a8%e3%82%bb%e3%82%ab%e3%83%b3%e3%83%80%e3%83%aa%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc%e3%81%ae%e8%a8%ad%e7%bd%ae" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>&lt;strong>役割&lt;/strong>
プライマリサーバーがセカンダリサーバーからのゾーン転送の要求を受け、要求されたゾーンデータを送る&lt;/p>
&lt;p>&lt;strong>考慮すること&lt;/strong>&lt;/p>
&lt;p>プライマリサーバーをセカンダリサーバーへのゾーン転送のコピー元としてだけ使う。&lt;/p>
&lt;ul>
&lt;li>利用者からの問い合わせは受け付けないように構成する
プライマリサーバーのIPアドレスをプライベートにすることで、サイバー攻撃のリスクを減らすことができる&lt;/li>
&lt;/ul>
&lt;h3 id="ゾーン転送の仕組み">ゾーン転送の仕組み&lt;a class="td-heading-self-link" href="#%e3%82%be%e3%83%bc%e3%83%b3%e8%bb%a2%e9%80%81%e3%81%ae%e4%bb%95%e7%b5%84%e3%81%bf" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>AXFR
全てのゾーン情報を転送する&lt;/li>
&lt;li>IXFR
前回のゾーン転送情報をジャーナルファイルに記録しておき、ゾーン転送時にはジャーナルファイルを参照して差分情報のみを転送する&lt;/li>
&lt;/ul>
&lt;h2 id="権威サーバーが応答する情報">権威サーバーが応答する情報&lt;a class="td-heading-self-link" href="#%e6%a8%a9%e5%a8%81%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc%e3%81%8c%e5%bf%9c%e7%ad%94%e3%81%99%e3%82%8b%e6%83%85%e5%a0%b1" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;ul>
&lt;li>リソースレコードの表記フォーマット
&lt;ul>
&lt;li>TTLとクラスは省略できる&lt;/li>
&lt;li>同じドメイン名に複数のリソースレコードを設定する場合、二行目以降はドメイン名を省略できる&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-jsx" data-lang="jsx">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">TTL&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">class&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">type&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">data&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="フルリゾルバー">フルリゾルバー&lt;a class="td-heading-self-link" href="#%e3%83%95%e3%83%ab%e3%83%aa%e3%82%be%e3%83%ab%e3%83%90%e3%83%bc" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>&lt;strong>役割&lt;/strong>&lt;/p>
&lt;p>利用者の機器で動作するスタブリゾルバーから名前解決要求を受け付け、名前解決を行い結果を返す&lt;/p>
&lt;p>&lt;strong>考慮すること&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>ネット上に設置された権威サーバー群に問い合わせを送るため、一般的にグローバルIPを割り当てる&lt;/li>
&lt;li>利用者のネットワークからアクセスしやすい場所に設置することが望ましい&lt;/li>
&lt;/ul>
&lt;h2 id="代表的に攻撃手法">代表的に攻撃手法&lt;a class="td-heading-self-link" href="#%e4%bb%a3%e8%a1%a8%e7%9a%84%e3%81%ab%e6%94%bb%e6%92%83%e6%89%8b%e6%b3%95" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;h3 id="dnsリフレクター攻撃">DNSリフレクター攻撃&lt;a class="td-heading-self-link" href="#dns%e3%83%aa%e3%83%95%e3%83%ac%e3%82%af%e3%82%bf%e3%83%bc%e6%94%bb%e6%92%83" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>DNSを利用したDoS攻撃の一つ&lt;/p>
&lt;p>送信元IPアドレスを偽った問い合わせをフルリゾルバーや権威サーバーに送ることでそれらのサーバーが応答を攻撃対象に送りサービス不能の状態に陥らせる&lt;/p>
&lt;p>&lt;strong>対策&lt;/strong>&lt;/p>
&lt;p>RRL(Response Rate Limiting)の導入&lt;/p></description></item><item><title>[検証]DockerのMulti-stage builds</title><link>https://yoshihiroshu.com/blog/docker-multi-stage-builds/</link><pubDate>Sat, 18 Mar 2023 12:00:00 +0900</pubDate><guid>https://yoshihiroshu.com/blog/docker-multi-stage-builds/</guid><description>&lt;div>&lt;a id="td-block-0" class="td-offset-anchor">&lt;/a>&lt;/div>
&lt;section class="row td-box td-box--white td-box--height-auto">
&lt;div class="col">
&lt;div class="container">
&lt;h2 id="背景">背景&lt;a class="td-heading-self-link" href="#%e8%83%8c%e6%99%af" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>DockerImageのMulti-stage buildsをするとサイズがどのくらい落ちるか気になったので、検証しました。&lt;/p>
&lt;h2 id="対象としている人">対象としている人&lt;a class="td-heading-self-link" href="#%e5%af%be%e8%b1%a1%e3%81%a8%e3%81%97%e3%81%a6%e3%81%84%e3%82%8b%e4%ba%ba" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;ul>
&lt;li>Docker学習中の人&lt;/li>
&lt;li>Docker Imageを実装している人&lt;/li>
&lt;/ul>
&lt;h2 id="実験結果">実験結果&lt;a class="td-heading-self-link" href="#%e5%ae%9f%e9%a8%93%e7%b5%90%e6%9e%9c" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>一目瞭然ですね。
まさかの約370MBの違いもありました。&lt;/p>
&lt;p>Goのベースイメージを採用したDockerImage
&lt;a href="https://yoshihiroshu.com/">golang:1.19&lt;/a>をベースイメージとして使っています。
&lt;img alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2083780/1d9bebbb-bb78-5145-1a7b-150fa1899955.png">&lt;/p>
&lt;p>Multi-stage buildsを採用したDockerImage
&lt;a href="https://hub.docker.com/_/scratch">scratch&lt;/a>をベースイメージとして使っています。
&lt;img alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2083780/c0f9912f-5208-06f9-b60b-5ccae2d97e99.png">&lt;/p>
&lt;h2 id="それぞれのdockerimage">それぞれのDockerImage&lt;a class="td-heading-self-link" href="#%e3%81%9d%e3%82%8c%e3%81%9e%e3%82%8c%e3%81%aedockerimage" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>Goのベースイメージを採用したDockerImage&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Dockerfile" data-lang="Dockerfile">&lt;span class="line">&lt;span class="cl">&lt;span class="k">FROM&lt;/span>&lt;span class="s"> golang:1.19&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">WORKDIR&lt;/span>&lt;span class="s"> /usr/src/app&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">COPY&lt;/span> . ./&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">RUN&lt;/span> go mod download &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> go mod verify&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">EXPOSE&lt;/span>&lt;span class="s"> 8000&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">CMD&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;go&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;run&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;./cmd/main.go&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Multi-stage buildsを採用したDockerImage&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Dockerfile" data-lang="Dockerfile">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># syntax=docker/dockerfile:1&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="s"> golang:1.19 as builder&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">WORKDIR&lt;/span>&lt;span class="s"> /usr/src/app&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">COPY&lt;/span> ./backend/go.mod ./backend/go.sum ./&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">RUN&lt;/span> go mod download &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> go mod verify&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">COPY&lt;/span> ./backend .&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">RUN&lt;/span> &lt;span class="nv">CGO_ENABLED&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">0&lt;/span> go build -o binary ./cmd/main.go&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="s"> scratch&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">WORKDIR&lt;/span>&lt;span class="s"> /usr/src/app&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="c"># scratch doesn&amp;#39;t have timezone.&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">COPY&lt;/span> --from&lt;span class="o">=&lt;/span>builder /usr/share/zoneinfo/Asia/Tokyo /usr/share/zoneinfo/Asia/Tokyo&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">COPY&lt;/span> --from&lt;span class="o">=&lt;/span>builder /usr/src/app/binary /usr/src/app/binary&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">COPY&lt;/span> ./backend/configs.yaml .&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">EXPOSE&lt;/span>&lt;span class="s"> 8080&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">CMD&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;./binary&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>
&lt;/div>
&lt;/section></description></item><item><title>Kubernetesリソースメモ</title><link>https://yoshihiroshu.com/blog/kubenertes-resource/</link><pubDate>Wed, 18 Jan 2023 12:00:00 +0900</pubDate><guid>https://yoshihiroshu.com/blog/kubenertes-resource/</guid><description>&lt;div>&lt;a id="td-block-0" class="td-offset-anchor">&lt;/a>&lt;/div>
&lt;section class="row td-box td-box--white td-box--height-auto">
&lt;div class="col">
&lt;div class="container">
&lt;h2 id="背景">背景&lt;a class="td-heading-self-link" href="#%e8%83%8c%e6%99%af" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>以外と忘れがちなリソースについて、まとめました。&lt;/p>
&lt;h2 id="対象としている人">対象としている人&lt;a class="td-heading-self-link" href="#%e5%af%be%e8%b1%a1%e3%81%a8%e3%81%97%e3%81%a6%e3%81%84%e3%82%8b%e4%ba%ba" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>Kubernetesを学習途中の人、またこれからKubernetesを学習しようとしている人&lt;/p>
&lt;h1 id="リソース">リソース&lt;a class="td-heading-self-link" href="#%e3%83%aa%e3%82%bd%e3%83%bc%e3%82%b9" aria-label="Heading self-link">&lt;/a>&lt;/h1>&lt;h2 id="pod">Pod&lt;a class="td-heading-self-link" href="#pod" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>PodはKubernetesにデプロイ出来る最小単位&lt;/p>
&lt;ul>
&lt;li>コンテナやボリュームの集まり&lt;/li>
&lt;/ul>
&lt;h2 id="deployment">Deployment&lt;a class="td-heading-self-link" href="#deployment" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;ul>
&lt;li>新しいReplicaSetを作成したり、既存のDeploymentを削除して新しいDeploymentで全てのリソースを適用することができる&lt;/li>
&lt;/ul>
&lt;h2 id="replicaset">ReplicaSet&lt;a class="td-heading-self-link" href="#replicaset" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;ul>
&lt;li>どんな時でも指定された数のPodのレプリカが稼働することを保証する&lt;/li>
&lt;li>&lt;code>spec.template&lt;/code>をハッシュ値で管理しているため、ロールアップ・ダウンによる変更に即座に対応できる。&lt;/li>
&lt;/ul>
&lt;h2 id="ingress">Ingress&lt;a class="td-heading-self-link" href="#ingress" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;ul>
&lt;li>IngressはHTTPやHTTPSの外部アクセスを制御するオブジェクト&lt;/li>
&lt;li>Load Balancerの役割をしている。&lt;/li>
&lt;/ul>
&lt;h2 id="service">Service&lt;a class="td-heading-self-link" href="#service" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;ul>
&lt;li>動的にIPAddressが変更されるPodへの接続を解決してくれる抽象的なオブジェクト&lt;/li>
&lt;li>Podの集合で実行されているアプリケーションをネットワークサービスとして公開する抽象的な方法&lt;/li>
&lt;/ul>
&lt;p>役割&lt;/p>
&lt;ul>
&lt;li>Pod,Nodeの存在を抽象化し、Podとの通信に単一のエンドポイントを提供する&lt;/li>
&lt;/ul>
&lt;h2 id="volumeについて">Volumeについて&lt;a class="td-heading-self-link" href="#volume%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>コンテナのデータは一時的なもので、Pod/コンテナが削除されるか、コンテナがクラッシュした場合コンテナのデータは消えてしまう。
そこでVolumeを使う&lt;/p>
&lt;ul>
&lt;li>メリット
&lt;ul>
&lt;li>Volumeはデータの永続化をしてくれる。 永続化したいデータは指定したVolumeに保存することで削除やクラッシュした際でもデータが残る。&lt;/li>
&lt;li>また、Volumeは別の目的でも使用される。それはPod内でのコンテナ間のデータ共有だ。&lt;/li>
&lt;li>Pod内のコンテナはVolumeを通してデータを共有することが出来る。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="種類">種類&lt;a class="td-heading-self-link" href="#%e7%a8%ae%e9%a1%9e" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>emptyDir
&lt;ul>
&lt;li>Podがノードに割り当てられたときに最初に作成され、そのPodがそのノードで実行されている限り存在する&lt;/li>
&lt;li>名前が示すようにemptyDirボリュームは最初は空&lt;/li>
&lt;li>Podが削除された際に対象のVolumeのデータも削除される。 よってPod内のコンテナ間のデータ共有のみで使用&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>hostPath
&lt;ul>
&lt;li>データが永続化されている(Podが削除されてもデータは消されない)&lt;/li>
&lt;li>Kubernetesが実行されているサーバーにデータが置いてある&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="configmap">ConfigMap&lt;a class="td-heading-self-link" href="#configmap" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;ul>
&lt;li>機密性のないデータをキーと値のペアで保存するために使用されるAPIオブジェクト&lt;/li>
&lt;/ul>
&lt;h2 id="secret">Secret&lt;a class="td-heading-self-link" href="#secret" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;ul>
&lt;li>Secretとは、パスワードやトークン、キーなどの少量の機密データを含むオブジェクト&lt;/li>
&lt;li>PodがSecretを使う方法は3種類がある。
&lt;ul>
&lt;li>ボリューム内のファイルとして、Podの単一または複数のコンテナにマウントする&lt;/li>
&lt;li>コンテナの環境変数として利用する&lt;/li>
&lt;li>Podを生成するためにkubeletがイメージをpullするときに使用する&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="horizontalpodautoscaler">HorizontalPodAutoscaler&lt;a class="td-heading-self-link" href="#horizontalpodautoscaler" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;ul>
&lt;li>Deployment、ReplicaSetまたはStatefulSetといったレプリケーションコントローラ内のPodの数を、観測されたCPU使用率（もしくはベータサポートの、アプリケーションによって提供されるその他のメトリクス）に基づいて自動的にスケールさせる&lt;/li>
&lt;li>podの負荷に応じて自動的にpodの数を増減させる&lt;/li>
&lt;/ul>
&lt;h2 id="poddisruptionbudget">PodDisruptionBudget&lt;a class="td-heading-self-link" href="#poddisruptionbudget" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;ul>
&lt;li>Podの最小の有効状態や最大の無効状態の数を指定する&lt;/li>
&lt;li>Podの管理対象はLabelSelectorで指定する&lt;/li>
&lt;li>フィールドのメモ
&lt;ul>
&lt;li>spec.maxUnavailable : Eviction実行時にPodを無効状態にしていい最大数を指定する。絶対値か百分率で指定する。&lt;/li>
&lt;li>spec.minAvailable : Eviction実行時にPodを有効状態にしておく最小数を指定す る。絶対値か百分率で指定する。&lt;/li>
&lt;li>spec.selector : このBudgetを適用する対象のPodを選択するLabelSelectorを指定&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="cronjob">CronJob&lt;a class="td-heading-self-link" href="#cronjob" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;ul>
&lt;li>CronJobはJobをcronのように定期実行するためのKubernetesのWorkloadリソース
&lt;ul>
&lt;li>時間ベースのスケジュールでJobを作成するKubernetesオブジェクト&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>concurrencyPolicy Jobの並行実行についてのポリシーを指定できる
&lt;ul>
&lt;li>Allow
&lt;ul>
&lt;li>並行なJobの実行を許可するポリシー&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Forbid
&lt;ul>
&lt;li>前回のJobがまだ実行中で完了してない場合、スケジュールされたJobはスキップされる&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Replace
&lt;ul>
&lt;li>前回のJobがまだ実行中で完了してない場合、前回のJobをキャンセルし新しくスケジュールされるJobに置き換える&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="job">Job&lt;a class="td-heading-self-link" href="#job" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;ul>
&lt;li>一つ以上のPodを作成することである特定数のPodが正常終了するまでリトライしながら処理を実行するKubernetesのWorkloadリソース
&lt;ul>
&lt;li>Podの実行が失敗したり削除された場合はJobは新たにPodを起動する&lt;/li>
&lt;li>平行に複数のPodを起動することも可能&lt;/li>
&lt;li>指定された数が正常に終了した際にJobが完了&lt;/li>
&lt;li>Jobを削除するとそのJobによって作成されたPodも削除される&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="namespace">Namespace&lt;a class="td-heading-self-link" href="#namespace" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;ul>
&lt;li>同一の物理クラスター上で複数の仮想クラスターの動作をサポートする
&lt;ul>
&lt;li>&lt;code>kubectl api-resources --namespaced=true&lt;/code>でどのリソースが適応なのか確認できる&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h1 id="おまけ">おまけ&lt;a class="td-heading-self-link" href="#%e3%81%8a%e3%81%be%e3%81%91" aria-label="Heading self-link">&lt;/a>&lt;/h1>&lt;p>Manifestについて簡単なメモです。&lt;/p></description></item><item><title>Dockerのdepends onについて</title><link>https://yoshihiroshu.com/blog/docker-depends-on/</link><pubDate>Tue, 17 Jan 2023 12:00:00 +0900</pubDate><guid>https://yoshihiroshu.com/blog/docker-depends-on/</guid><description>&lt;div>&lt;a id="td-block-0" class="td-offset-anchor">&lt;/a>&lt;/div>
&lt;section class="row td-box td-box--white td-box--height-auto">
&lt;div class="col">
&lt;div class="container">
&lt;h2 id="背景">背景&lt;a class="td-heading-self-link" href="#%e8%83%8c%e6%99%af" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>Dockerの&lt;code>depends_on&lt;/code>について、簡単に学んだことをまとめました。&lt;/p>
&lt;h2 id="対象としている人">対象としている人&lt;a class="td-heading-self-link" href="#%e5%af%be%e8%b1%a1%e3%81%a8%e3%81%97%e3%81%a6%e3%81%84%e3%82%8b%e4%ba%ba" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>Dockerについて、一通り学習したことがある人&lt;/p>
&lt;h2 id="depends_on">depends_on&lt;a class="td-heading-self-link" href="#depends_on" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>サービス間の依存関係を指定できる&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-docker-compose.yaml" data-lang="docker-compose.yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">services&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">service_a&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">image&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">busybox&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">service_b&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">image&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">busybox&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># `service_b` を `service_a` に依存させる&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">depends_on&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">service_a&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>service_b を service_a に依存させることができます&lt;/p>
&lt;ul>
&lt;li>docker-compose up: service_a → service_b の順に起動する&lt;/li>
&lt;li>docker-compose run: （ docker-compose up と同じ）&lt;/li>
&lt;li>docker-compose stop: service_b → service_a の順に停止する&lt;/li>
&lt;/ul>
&lt;h2 id="指定パターン">指定パターン&lt;a class="td-heading-self-link" href="#%e6%8c%87%e5%ae%9a%e3%83%91%e3%82%bf%e3%83%bc%e3%83%b3" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;ul>
&lt;li>Short syntax （リスト）
&lt;ul>
&lt;li>依存先のサービス名を単純に記述するだけ&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-docker-compose.yaml" data-lang="docker-compose.yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">depends_on&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">service_a&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>Long syntax （オブジェクト）
&lt;ul>
&lt;li>依存関係にあるサービスをオブジェクト形式で記述するもの&lt;/li>
&lt;li>この方法では依存先に加えて「条件」を指定することができます&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-docker-compose.yaml" data-lang="docker-compose.yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">depends_on&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">service_a&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">condition&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">service_started&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>条件の指定には condition を使用
condition にデフォルト値は無いため、 long syntax を選ぶ場合は必ず指定する必要があり&lt;/p></description></item><item><title>Nuxtのvuex-persistedstateをSSRで使ってみる</title><link>https://yoshihiroshu.com/blog/try-nuxt-vuex-persistedstate-in-ssr/</link><pubDate>Sun, 04 Dec 2022 12:00:00 +0900</pubDate><guid>https://yoshihiroshu.com/blog/try-nuxt-vuex-persistedstate-in-ssr/</guid><description>&lt;div>&lt;a id="td-block-0" class="td-offset-anchor">&lt;/a>&lt;/div>
&lt;section class="row td-box td-box--white td-box--height-auto">
&lt;div class="col">
&lt;div class="container">
&lt;h2 id="背景">背景&lt;a class="td-heading-self-link" href="#%e8%83%8c%e6%99%af" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>NuxtのSSRを行うライフサイクルにて&lt;code>vuex-persistedstate&lt;/code>によるvuexのデータの更新が行えなかったことが今回のつまずき、解決するのにかなり時間を要したので記事にしました。&lt;/p>
&lt;h2 id="前提">前提&lt;a class="td-heading-self-link" href="#%e5%89%8d%e6%8f%90" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>vuexの短所としてリロードをするとstoreのデータが消えてしまうため、&lt;code>vuex-persistedstate&lt;/code>を用いてcookieに保存していました。
しかし、asyncDataなどのSSRのライフサイクルにおいて、vuexの更新はSPA(CSR)側のcookieに反映されず、
結果としてvuexの更新がなされない問題が生じておりました。
vue-persistedstateに関しては、&lt;a href="https://github.com/robinvdvleuten/vuex-persistedstate#api">こちら&lt;/a>を参考にしてください&lt;/p>
&lt;h2 id="実装方法サンプルコード">実装方法（サンプルコード）&lt;a class="td-heading-self-link" href="#%e5%ae%9f%e8%a3%85%e6%96%b9%e6%b3%95%e3%82%b5%e3%83%b3%e3%83%97%e3%83%ab%e3%82%b3%e3%83%bc%e3%83%89" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>色々探してみたところ、こちらの&lt;a href="https://github.com/robinvdvleuten/vuex-persistedstate/issues/130#issuecomment-653723343">issue&lt;/a>で解決されており、&lt;a href="https://github.com/microcipcip/cookie-universal/tree/master/packages/cookie-universal-nuxt#readme">cookie-universal-nuxt&lt;/a>を使うとSSRでもvuexの更新が行えるとのことでした。&lt;/p>
&lt;h3 id="cookie-universal-nuxtをインストールする">cookie-universal-nuxtをインストールする&lt;a class="td-heading-self-link" href="#cookie-universal-nuxt%e3%82%92%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%81%99%e3%82%8b" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>以下のコマンドでcookie-universal-nuxtをインストールしてください&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-zsh" data-lang="zsh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># npmの場合こちら&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm i --save cookie-universal-nuxt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># yarnの場合こちら&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">yarn add cookie-universal
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="設定を追加する">設定を追加する&lt;a class="td-heading-self-link" href="#%e8%a8%ad%e5%ae%9a%e3%82%92%e8%bf%bd%e5%8a%a0%e3%81%99%e3%82%8b" aria-label="Heading self-link">&lt;/a>&lt;/h4>&lt;p>moduleを扱うためにnuxt.config.jsに追加する&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-nuxt.config.js" data-lang="nuxt.config.js">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">modules&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 追加
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="s1">&amp;#39;cookie-universal-nuxt&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="pluginを実装する">pluginを実装する&lt;a class="td-heading-self-link" href="#plugin%e3%82%92%e5%ae%9f%e8%a3%85%e3%81%99%e3%82%8b" aria-label="Heading self-link">&lt;/a>&lt;/h4>&lt;p>moduleに追加すると、勝手に&lt;code>$cookies&lt;/code>として&lt;a href="https://nuxtjs.org/docs/directory-structure/plugins/#inject-in-root--context">inject&lt;/a>されます。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-nuxt.config.js" data-lang="nuxt.config.js">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">plugins&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 追加
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="s1">&amp;#39;~/plugins/persistedstate.js&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-plugins/persistedstate.js" data-lang="plugins/persistedstate.js">&lt;span class="line">&lt;span class="cl">&lt;span class="kr">import&lt;/span> &lt;span class="nx">createPersistedState&lt;/span> &lt;span class="nx">from&lt;/span> &lt;span class="s1">&amp;#39;vuex-persistedstate&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">export&lt;/span> &lt;span class="k">default&lt;/span> &lt;span class="p">({&lt;/span>&lt;span class="nx">store&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">app&lt;/span>&lt;span class="p">})&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// ...
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="nx">createPersistedState&lt;/span>&lt;span class="p">({&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">storage&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">getItem&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">key&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="nx">app&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">$cookies&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">getAll&lt;/span>&lt;span class="p">()[&lt;/span>&lt;span class="nx">key&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">setItem&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">key&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">value&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="nx">app&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">$cookies&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">set&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">key&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">value&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">path&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;/&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">maxAge&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="mi">60&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mi">60&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mi">24&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mi">7&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">secure&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="kc">true&lt;/span> &lt;span class="p">}),&lt;/span>&lt;span class="c1">//　7日間保持
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="nx">removeItem&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">key&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="nx">app&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">$cookies&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">remove&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">key&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">})(&lt;/span>&lt;span class="nx">store&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="動作の例">動作の例&lt;a class="td-heading-self-link" href="#%e5%8b%95%e4%bd%9c%e3%81%ae%e4%be%8b" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>以下のようにするとSSR時にもstoreが更新されます。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-pages/mypage.vue" data-lang="pages/mypage.vue">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ログイン必須のページ
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">export&lt;/span> &lt;span class="k">default&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">async&lt;/span> &lt;span class="nx">asyncData&lt;/span>&lt;span class="p">({&lt;/span> &lt;span class="nx">store&lt;/span> &lt;span class="p">})&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.....&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="nx">store&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">token&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">data&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">await&lt;/span> &lt;span class="nx">login&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">this&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">input&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">this&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">$store&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">commit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;setToken&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">data&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">token&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.....&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>こちらの情報が誰かに役立てれば幸いです！&lt;/p></description></item></channel></rss>