<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>yyh-gl's Tech Blog</title><link>https://tech.yyh-gl.dev/</link><description>Recent content on yyh-gl's Tech Blog</description><generator>Hugo -- gohugo.io</generator><language>ja</language><lastBuildDate>Sun, 15 Feb 2026 00:00:00 +0900</lastBuildDate><atom:link href="https://tech.yyh-gl.dev/index.xml" rel="self" type="application/rss+xml"/><item><title>Kotlin言語仕様書への招待 @Kotlin Fest 2025</title><link>https://tech.yyh-gl.dev/blog/kotlin-fest-2025/</link><pubDate>Sat, 01 Nov 2025 13:20:00 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/kotlin-fest-2025/</guid><description>&lt;h1 id="kotlin-fest-2025">Kotlin Fest 2025&lt;/h1>
&lt;p>&lt;a href="https://2025.kotlinfest.dev/" target="_blank" rel="noopener noreferrer">Kotlin Fest 2025&lt;/a>
に参加してきました。&lt;/p>
&lt;p>Kotlin Festには去年初めてプロポーザルを出しました。&lt;br>
結果は落選。&lt;/p>
&lt;p>今年もチャレンジした結果、採用していただきました。&lt;br>
&lt;img src="https://tech.yyh-gl.dev/img/2025/11/kotlin-fest-2025/proposal.webp" width="600">&lt;/p>
&lt;h1 id="発表内容">発表内容&lt;/h1>
&lt;p>『&lt;a href="https://2025.kotlinfest.dev/timetable/1719023400_a/" target="_blank" rel="noopener noreferrer">Kotlin言語仕様書への招待 〜コードの「なぜ」を読み解く〜&lt;/a>
』
というタイトルで話しました。&lt;/p>
&lt;img src="https://tech.yyh-gl.dev/img/2025/11/kotlin-fest-2025/presentation.webp" width="600">
&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/SdpiQTpMv_g?si=cw4LhG_FrX_iMST-" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen>&lt;/iframe>
&lt;iframe src="https://docs.google.com/presentation/d/e/2PACX-1vQdjSxkIxQjQM5shtCWuRlRpHq9lmcMZ653WGOWI2hU0bc6giqD5LsZQfrUsAqNuOgVS8qakePxoCpo/pubembed?start=false&amp;loop=false&amp;delayms=3000" frameborder="0" width="960" height="569" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true">&lt;/iframe>
&lt;p>Xで嬉しいリアクションをたくさんいただきました。&lt;br>
聞きに来てくださったみなさんありがとうございました！&lt;/p></description></item><item><title>JavaのIntegerクラスがキャッシュする範囲</title><link>https://tech.yyh-gl.dev/blog/java-integer-cache/</link><pubDate>Sun, 18 May 2025 22:30:08 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/java-integer-cache/</guid><description>&lt;h1 id="javaのintegerクラスにキャッシュがあることを知る">JavaのIntegerクラスにキャッシュがあることを知る&lt;/h1>
&lt;p>JetBrains公式アカウントで以下のクイズがポストされていた。&lt;br>
解答の中に以下のポストを発見。&lt;/p>
&lt;blockquote class="twitter-tweet">&lt;p lang="en" dir="ltr">Not equal because they are greater than 127. 127 and below would use the integer cache and then they would be equal&lt;/p>&amp;mdash; Simon Martinelli (@simas_ch) &lt;a href="https://twitter.com/simas_ch/status/1923728106193322326?ref_src=twsrc%5Etfw">May 17, 2025&lt;/a>&lt;/blockquote> &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8">&lt;/script>
&lt;p>&amp;ldquo;Integer cache&amp;quot;なるものがあることを知る。&lt;/p>
&lt;h1 id="integerクラスのキャッシュとは">Integerクラスのキャッシュとは&lt;/h1>
&lt;p>&lt;a href="https://docs.oracle.com/en/java/javase/24/docs/api/java.base/java/lang/Integer.html#valueOf%28int%29" target="_blank" rel="noopener noreferrer">ドキュメント&lt;/a>
を見てみる。&lt;br>
（Javaバージョン: 24）&lt;/p>
&lt;img src="https://tech.yyh-gl.dev/img/2025/05/java-integer-cache/docs.webp" width="600">
&lt;blockquote>
&lt;p>This method will always cache values in the range -128 to 127, inclusive&lt;/p>&lt;/blockquote>
&lt;p>-128~127の範囲は常にキャッシュされるとのこと。&lt;/p>
&lt;blockquote>
&lt;p>and may cache other values outside of this range.&lt;/p>&lt;/blockquote>
&lt;p>ただし、範囲は-128~127ではないときもあるらしい。&lt;br>
どういうときに範囲が変わるのか気になったので調べた↓&lt;/p>
&lt;h1 id="キャッシュ範囲を深ぼる">キャッシュ範囲を深ぼる&lt;/h1>
&lt;p>&lt;a href="https://github.com/openjdk/jdk/blob/jdk-24%2B36/src/java.base/share/classes/java/lang/Integer.java#L940-L953" target="_blank" rel="noopener noreferrer">コード&lt;/a>
を見てみると以下のとおりだった。&lt;/p></description></item><item><title>『暗号解読（上）』を読んで</title><link>https://tech.yyh-gl.dev/blog/the-code-book/</link><pubDate>Fri, 24 Jan 2025 00:30:40 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/the-code-book/</guid><description>&lt;h1 id="はじめに">はじめに&lt;/h1>
&lt;p>『暗号解読（上）』を読んだ感想を簡単にメモしておく。&lt;br>
なお、本記事は自分で書いた読書メモをChatGPTに整形してもらったもの。&lt;br>
（文章としておかしい部分だけ自分で修正）&lt;/p>
&lt;h1 id="読書メモ">読書メモ&lt;/h1>
&lt;p>ソフトウェアエンジニアとして情報セキュリティの知識を深める目的で、サイモン・シン氏の著書『暗号解読（上）』を拝読いたしました。&lt;br>
本書は暗号の歴史から具体的な解読手法、さらには現代の暗号理論に至るまで幅広く取り上げており、
暗号に関わる者として学ぶところが多くありました。&lt;br>
以下に、本書を通じて特に印象に残った点を整理します。&lt;/p>
&lt;hr>
&lt;h2 id="1-暗号システムの本質">1. 暗号システムの本質&lt;/h2>
&lt;p>どれほど強固な暗号方式を用いていても、鍵が漏洩すればすべてが水泡に帰すという原則は改めて肝に銘じるべき事項です。&lt;/p>
&lt;h2 id="2-ヌル文字の歴史的背景">2. ヌル文字の歴史的背景&lt;/h2>
&lt;p>「ヌル文字」といえばプログラマにはおなじみですが、実は16世紀にすでに「何の意味も持たないダミー文字」として暗号の世界で使われていたそうです。歴史の長さに驚き。&lt;/p>
&lt;h2 id="3-弱い暗号の危険性">3. 弱い暗号の危険性&lt;/h2>
&lt;p>「弱い暗号を使うぐらいなら、最初から暗号など使わない方がましだ」という指摘は極めて重要です。
暗号への過信は、平文なら絶対書かない内容までつい書いてしまうリスクを孕みます。セキュリティ意識の啓発においては、強固な暗号方式の採用だけでなく、その危うさを十分に理解してもらう必要があります。&lt;/p>
&lt;h2 id="4-古典的な解読テクニック">4. 古典的な解読テクニック&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>頻度分析&lt;/strong>&lt;/li>
&lt;li>&lt;strong>連接特徴&lt;/strong>
&lt;ul>
&lt;li>例として、英語では「q」の後に必ず「u」が続く等、文字の連鎖関係を用いた分析があります。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>こうしたテクニックは一見地道ですが、歴史上多くの暗号がこれらの手法によって解読されてきました。情報理論や機械学習が普及する現代でも、基本となる考え方を学ぶ意義は大きいと感じます。&lt;/p>
&lt;h2 id="5-ワンタイムパッドの特異性">5. ワンタイム・パッドの特異性&lt;/h2>
&lt;p>一度きりの使い捨て鍵を用いるワンタイム・パッドは理論上解読不可能とされています。しかし、膨大な鍵の管理が必要になるため実用的ではなく、あまり使われてこなかった。ただし、ロシア大統領とアメリカ大統領のホットラインのような特殊な用途では今なお採用されている点が非常に興味深いです。&lt;/p>
&lt;h2 id="6-エニグマと鍵交換の重要性">6. エニグマと鍵交換の重要性&lt;/h2>
&lt;p>20世紀に登場したエニグマは極めて複雑な印象を与えますが、実際の仕組みは比較的シンプルであり、物理的にもコンパクト（34×28×15cm・12kg）であったことが紹介されています。
打倒エニグマの歴史から、安全な鍵交換の重要性も学べます。&lt;/p>
&lt;h2 id="7-反復は秘匿の大敵">7. 反復は秘匿の大敵&lt;/h2>
&lt;p>暗号においてパターンや繰り返しは危険を伴います。同一のIV（初期化ベクトル）を使い回すといった行為が脆弱性を生むのは、まさにこの法則に通じるものがあります。暗号の設定や運用の細部にわたるまで注意が必要だと痛感させられます。&lt;/p>
&lt;p>毎日決まった時間に放送される天気予報のような“当たり前”の情報でも、暗号解読のヒント（クリブ）となり得ることが紹介されています。日常に潜む定常的データが、思わぬ形で暗号解読に利用される様は、現代の情報漏洩リスクにも通じる示唆を与えてくれます。&lt;/p>
&lt;h2 id="8-数学には論理と直感の両方が求められる">8. 数学には論理と直感の両方が求められる&lt;/h2>
&lt;p>本書を通じて改めて印象に残ったのは、数学の問題を解くにあたっては「論理的思考」に加えて「直感」も欠かせない、という視点です。暗号の解読過程は、単なる数式の機械的処理だけではなく、数多くの仮説検証や柔軟な発想を必要とすることを本書は示唆しています。&lt;/p>
&lt;h2 id="9-アランチューリングという天才">9. アラン・チューリングという天才&lt;/h2>
&lt;p>エニグマの解読で中心的役割を果たしたアラン・チューリングに関する記述からは、彼の卓越した才能がいかに戦争の行方を左右したかが窺えます。計算機科学の父とも称されるチューリングの偉大さを再認識し、その業績を学ぶことは、現代のソフトウェアエンジニアにとっても大きな意義があると感じます。&lt;/p>
&lt;h2 id="10-解読しても公表しない情報戦">10. 解読しても公表しない情報戦&lt;/h2>
&lt;p>暗号を解読しても、あえて公表せず、相手に使い続けさせるという情報戦略があることも興味深い点です。セキュリティ技術は単なる防御策ではなく、攻撃・解析そして情報操作といった多面的な視点が求められます。&lt;/p>
&lt;hr>
&lt;h2 id="総括">総括&lt;/h2>
&lt;p>『暗号解読（上）』は暗号の歴史的背景、具体的な解読技術、そして現代のセキュリティに通じる核心的な部分まで網羅的に扱っており、暗号に携わるエンジニアにとって大いに参考になる一冊です。数学が中心的な役割を果たす分野であるにもかかわらず、通史としても非常に読み応えがあるため、セキュリティ技術への関心だけでなく、歴史や論理パズルに興味がある方にも大変おすすめできます。&lt;/p>
&lt;p>私自身、改めて鍵管理の重要性や暗号方式の運用上の落とし穴を再認識しました。本書を通じて、暗号技術はあくまで“手段”であり、それをいかに適切に設計・運用するかが要であると痛感します。今後もセキュリティへの関心を高めつつ、情報保護に対する責任と慎重さを持って業務にあたっていきたいと思います。&lt;/p></description></item><item><title>VS Codeのeditor.quickSuggestionsについて調べたメモ</title><link>https://tech.yyh-gl.dev/blog/vs-code-settings-editor-quick-suggestions/</link><pubDate>Fri, 10 Jan 2025 19:34:56 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/vs-code-settings-editor-quick-suggestions/</guid><description>&lt;h1 id="はじめに">はじめに&lt;/h1>
&lt;p>VS Codeの設定に&lt;code>editor.quickSuggestions&lt;/code>というものがある。&lt;br>
サジェストを出すかどうかを設定できる。&lt;/p>
&lt;p>サジェストというのは以下のようなやつ。&lt;/p>
&lt;img src="https://tech.yyh-gl.dev/img/2025/01/vs-code-settings-editor-quick-suggestions/suggest.webp" width="600">
&lt;p>この設定項目について調べたのでメモを残す。&lt;/p>
&lt;h1 id="editorquicksuggestions">editor.quickSuggestions&lt;/h1>
&lt;p>&lt;code>editor.quickSuggestions&lt;/code>は以下のような設定ができる。&lt;/p>
&lt;pre>&lt;code class="language-json">&amp;quot;editor.quickSuggestions&amp;quot;: {
&amp;quot;other&amp;quot;: &amp;quot;on&amp;quot;,
&amp;quot;comments&amp;quot;: &amp;quot;off&amp;quot;,
&amp;quot;strings&amp;quot;: &amp;quot;off&amp;quot;
},
&lt;/code>&lt;/pre>
&lt;p>ref: &lt;a href="https://code.visualstudio.com/docs/getstarted/settings" target="_blank" rel="noopener noreferrer">https://code.visualstudio.com/docs/getstarted/settings&lt;/a>
&lt;/p>
&lt;p>&lt;code>other&lt;/code>, &lt;code>comments&lt;/code>, &lt;code>strings&lt;/code> の意味がわからず、調べた内容をメモする。&lt;/p>
&lt;p>なお、公式Docsから各項目に関する説明を見つけられなかったので、
ChatGPTにざっくりした説明を聞いたうえで、実際に設定をon/offして挙動を確認した。&lt;br>
よって、後述の説明はあくまで自分の解釈であることに注意。&lt;br>
おそらく文字どおりの意味だから説明がない…？&lt;br>
公式Docsの説明を見つけたら更新する。&lt;br>
（ChatGPTからの回答で「VS Codeドキュメントによると」って言われたんだけどね）&lt;/p>
&lt;h2 id="comments">comments&lt;/h2>
&lt;p>コメント内でのサジェスト有効/無効を設定できる。&lt;/p>
&lt;img src="https://tech.yyh-gl.dev/img/2025/01/vs-code-settings-editor-quick-suggestions/suggest_in_comment.webp" width="600">
&lt;h2 id="strings">strings&lt;/h2>
&lt;p>文字列リテラル内でのサジェスト有効/無効を設定できる。&lt;/p>
&lt;img src="https://tech.yyh-gl.dev/img/2025/01/vs-code-settings-editor-quick-suggestions/suggest_in_strings.webp" width="600">
&lt;h2 id="other">other&lt;/h2>
&lt;p>その他の場所におけるサジェスト有効/無効を設定できる。&lt;/p>
&lt;p>コード書いてるときに出てくるサジェストの大半はこれに該当するはず。&lt;/p>
&lt;h1 id="調査背景">調査背景&lt;/h1>
&lt;p>自分はMarkdown編集時に改行や強調などのHTMLタグをよく使う。&lt;br>
HTMLやReact, Vueなどのコードを書いているときのようにHTMLタグをサジェストしてほしい。&lt;br>
（&lt;code>&amp;lt;&lt;/code>や&lt;code>&amp;gt;&lt;/code>、閉じタグを打つのめんどくさいし）&lt;br>
よって、Markdown編集時によく使うHTMLタグは、snippetに登録し、サジェストされるようにしている。&lt;/p>
&lt;p>しかし、VS Codeのデフォルト設定では、Markdownに関するサジェストが出ないようになっている。&lt;br>
Markdownに関するサジェストを有効にできないか調べていると&lt;code>editor.quickSuggestions&lt;/code>にたどり着いた。&lt;/p></description></item><item><title>『データ指向アプリケーションデザイン』を読んで</title><link>https://tech.yyh-gl.dev/blog/designing-data-intensive-applications/</link><pubDate>Thu, 09 Jan 2025 21:40:02 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/designing-data-intensive-applications/</guid><description>&lt;h1 id="はじめに">はじめに&lt;/h1>
&lt;p>『&lt;a href="https://www.oreilly.co.jp/books/9784873118703/" target="_blank" rel="noopener noreferrer">データ指向アプリケーションデザイン ―信頼性、拡張性、保守性の高い分散システム設計の原理&lt;/a>
』を読んだ。&lt;/p>
&lt;p>会社で輪読会をして、全部読みきった。&lt;/p>
&lt;p>期待以上の良書に出会った感動をそのまま殴り書いているだけ。&lt;br>
とりとめもない文章なので、得られる知見はないと思うけど、感動を共有したいので書いた。&lt;/p>
&lt;h1 id="感想">感想&lt;/h1>
&lt;p>心の底から読んでよかったと思える一冊だった。&lt;/p>
&lt;p>シンプルなリレーショナルデータベースの話だけでなく、NoSQLや分散ストレージ、ストリーム処理（Kafkaとか）など、データベースに関する話が幅広く書かれている。&lt;br>
データ構造の話（log-structuredやBツリー）やトランザクションの話もすごいおもしろかった。&lt;/p>
&lt;br>
&lt;p>難しい話も多いけど、ふわっとしていた理解がだいぶ具体化された。&lt;br>
これまで何気なく使っていたデータベース。裏側のロジックを知ることで実際の開発でもいろいろ考慮できるようになった。&lt;/p>
&lt;br>
&lt;p>データベースに関するおすすめの本を聞かれたら、絶対にこの本を薦める。&lt;br>
（初心者におすすめする本ではないと思う）&lt;/p>
&lt;p>具体的にどういったことが書かれているかは、他の人が書いている記事がたくさんあるので、そちらを参照のこと。&lt;br>
というかぜひ本書を手にとっていただきたい。&lt;/p>
&lt;p>評価の高い本だったので、読む前から期待はしていたものの良い意味で裏切られた。&lt;br>
学びが多く、本当に感動したので、この記事をなぐり書きしておく。&lt;/p></description></item><item><title>2024年を振り返る</title><link>https://tech.yyh-gl.dev/blog/looking-back-on-2024/</link><pubDate>Tue, 31 Dec 2024 20:53:11 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/looking-back-on-2024/</guid><description>&lt;h1 id="仕事">仕事&lt;/h1>
&lt;h2 id="本業lineマンガ">本業：LINEマンガ&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://www.oricon.co.jp/news/2333825/full/" target="_blank" rel="noopener noreferrer">弊社の親会社であるWEBTOON EntertainmentがNASDAQに上場&lt;/a>
&lt;/li>
&lt;li>&lt;a href="https://prtimes.jp/main/html/rd/p/000000335.000063705.html" target="_blank" rel="noopener noreferrer">LINEマンガが5000万DLを突破&lt;/a>
&lt;/li>
&lt;/ul>
&lt;p>ユーザーが増え、より大規模なサービスになってきた。&lt;br>
求められる品質がさらに高くなってきており、いちエンジニアとしてとても楽しい。&lt;/p>
&lt;p>k8sを本格的に使用し始めたので、k8s周りの知識を深めている最中。&lt;br>
&lt;a href="https://www.cncf.io/training/certification/ckad/" target="_blank" rel="noopener noreferrer">資格（CKAD）&lt;/a>
の取得を目指しているが、一番の壁は受験料。&lt;/p>
&lt;p>今まで資格というものに興味がなかったけど、少し興味が出てきた今日このごろ。&lt;br>
&lt;a href="https://www.lpi.org/ja/our-certifications/lpic-1-overview/" target="_blank" rel="noopener noreferrer">LPIC&lt;/a>
の取得も頑張ってみようか迷ってる。&lt;/p>
&lt;p>開発以外に採用にも参加し始めた2024年。&lt;br>
来年で3年目に突入するので、開発以外の部分でももっと活躍できるようにしていく。&lt;/p>
&lt;h2 id="副業">副業&lt;/h2>
&lt;p>4年弱携わった案件が一段落した。&lt;br>
本業とは全く異なる特性を持つサービスだったので様々な知見を得ることができた。&lt;br>
引き続き同社の別サービスの開発に従事していくので頑張っていきたい。&lt;/p>
&lt;h1 id="個人的な活動">個人的な活動&lt;/h1>
&lt;h2 id="読書">読書&lt;/h2>
&lt;p>読書をたくさんしている。&lt;br>
AIに聞けば高い精度で答えてくれる時代になったとはいえ、まだ間違った回答もある。&lt;br>
正当性を判断するためにも地力をつけたい（普通に技術力を上げるという点でも頑張りたい）。&lt;br>
だから、信頼できるソースからのインプットを増やそうと考えた結果、読書に力を入れ始めた。&lt;br>
最近は常に読書中の本がある状態を維持している。&lt;br>
来年も続けていく。&lt;/p>
&lt;h3 id="ブログ">ブログ&lt;/h3>
&lt;p>インプット（読書）するだけじゃなくて、ちゃんと知識として定着させたい。&lt;br>
なので、得た知識はブログとしてアウトプットする。&lt;/p>
&lt;h2 id="k8s">k8s&lt;/h2>
&lt;p>もともと個人開発で使っていたk8s。&lt;br>
本業でもk8sを使うようになり、ちょうど良いplaygroundとして稼働してくれている。&lt;br>
とても助かる。k8sクラスターを構築してくれていた過去の自分に感謝。&lt;br>
&lt;a href="https://tech.yyh-gl.dev/blog/k8s-setup/" target="_blank" rel="noopener noreferrer">https://tech.yyh-gl.dev/blog/k8s-setup/&lt;/a>
&lt;/p>
&lt;h2 id="個人開発">個人開発&lt;/h2>
&lt;p>個人でサービスを作りたいと考えて動き出している。&lt;br>
来年リリースを目指して頑張る。&lt;/p>
&lt;h1 id="まとめ">まとめ&lt;/h1>
&lt;p>がんばる↓&lt;/p>
&lt;ul>
&lt;li>なんといっても「仕事」。一番大事
&lt;ul>
&lt;li>開発以外でも活躍する&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>資格取る
&lt;ul>
&lt;li>CKAD&lt;/li>
&lt;li>LPIC&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>always 読書
&lt;ul>
&lt;li>ブログでアウトプット&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul></description></item><item><title>分散システムにおけるID採番の勉強メモ</title><link>https://tech.yyh-gl.dev/blog/unique-ids-in-distributed-systems/</link><pubDate>Sat, 28 Dec 2024 20:08:33 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/unique-ids-in-distributed-systems/</guid><description>&lt;h1 id="はじめに">はじめに&lt;/h1>
&lt;p>分散システムにおけるID採番方法について気になったので調べたときのメモ。&lt;br>
（UUIDおよびULIDはスキップ）&lt;br>
調査の中で興味を持ったのがSnowflakeだったので、ほぼSnowflakeの話。&lt;/p>
&lt;h1 id="snowflake">Snowflake&lt;/h1>
&lt;p>分散システムにおけるID採番方式として有名なもののひとつ。&lt;br>
&lt;a href="https://en.wikipedia.org/wiki/Snowflake_ID" target="_blank" rel="noopener noreferrer">https://en.wikipedia.org/wiki/Snowflake_ID&lt;/a>
&lt;/p>
&lt;p>64bitで構成されている。&lt;br>
&lt;img src="https://tech.yyh-gl.dev/img/2024/12/unique-ids-in-distributed-systems/format.webp" width="600">
&lt;br>
（参照： &lt;a href="https://en.wikipedia.org/wiki/Snowflake_ID" target="_blank" rel="noopener noreferrer">https://en.wikipedia.org/wiki/Snowflake_ID&lt;/a>
）&lt;/p>
&lt;p>基本的に、上記のフォーマットで生成されたバイナリは10進数の数値に変換される。&lt;br>
timestampを含むので、時刻情報に基づいたソートが可能。&lt;br>
高い衝突体制を持つ。&lt;/p>
&lt;!-- textlint-disable ja-technical-writing/no-doubled-joshi -->
&lt;!-- textlint-disable ja-technical-writing/sentence-length -->
&lt;p>timestampを含んでいることからも分かるとおり、SnowflakeはSystem Clockに依存している。&lt;br>
よって、時間が巻き戻ったりするとIDが重複する可能性がある。&lt;br>
ただし、時刻が巻き戻った場合にはID生成をストップする機構が組み込まれている。&lt;br>
（最後に生成したIDが示す時刻を超えるまで生成ストップ）&lt;br>
&lt;a href="https://github.com/twitter-archive/snowflake/tree/snowflake-2010?tab=readme-ov-file#system-clock-dependency" target="_blank" rel="noopener noreferrer">https://github.com/twitter-archive/snowflake/tree/snowflake-2010?tab=readme-ov-file#system-clock-dependency&lt;/a>
&lt;/p>
&lt;!-- textlint-enable ja-technical-writing/no-doubled-joshi -->
&lt;!-- textlint-enable ja-technical-writing/sentence-length -->
&lt;p>Xでも使われている（&lt;a href="https://developer.x.com/ja/docs/basics/twitter-ids" target="_blank" rel="noopener noreferrer">参考&lt;/a>
）。&lt;br>
現行のコードではないもののコードは&lt;a href="https://github.com/twitter-archive/snowflake/tree/snowflake-2010" target="_blank" rel="noopener noreferrer">こちら&lt;/a>
。&lt;br>
今使われているのはSnowflakeの進化系？&lt;br>&lt;/p>
&lt;blockquote>
&lt;p>The Snowflake we&amp;rsquo;re using internally is a full rewrite and heavily relies on existing infrastructure at Twitter to run.&lt;/p>&lt;/blockquote>
&lt;h1 id="snowflakeとよく比較される対象">Snowflakeとよく比較される対象&lt;/h1>
&lt;ul>
&lt;li>UUID&lt;/li>
&lt;li>ULID&lt;/li>
&lt;/ul></description></item><item><title>k8s関連書籍をいろいろ読んだ</title><link>https://tech.yyh-gl.dev/blog/k8s-books/</link><pubDate>Tue, 21 May 2024 09:39:53 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/k8s-books/</guid><description>&lt;h1 id="今回読んだ本">今回読んだ本&lt;/h1>
&lt;p>業務でk8sを触る機会があり、事前に知識をつけるためにいくつかの本を読んだ。&lt;br>
以下が今回読んだ本。&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://www.oreilly.co.jp/books/9784873118406/" target="_blank" rel="noopener noreferrer">入門 Kubernetes&lt;/a>
&lt;/li>
&lt;li>&lt;a href="https://www.oreilly.co.jp/books/9784873119656/" target="_blank" rel="noopener noreferrer">Googleのソフトウェアエンジニアリング ―持続可能なプログラミングを支える技術、文化、プロセス&lt;/a>
&lt;ul>
&lt;li>25章のみ&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://book.impress.co.jp/books/1122101051" target="_blank" rel="noopener noreferrer">コンテナセキュリティ コンテナ化されたアプリケーションを保護する要素技術&lt;/a>
&lt;/li>
&lt;/ul>
&lt;h1 id="入門-kubernetes">&lt;a href="https://www.oreilly.co.jp/books/9784873118406/" target="_blank" rel="noopener noreferrer">入門 Kubernetes&lt;/a>
&lt;/h1>
&lt;p>本書はk8sを触るうえで知っておくべき基本的な内容が書かれている。&lt;br>
コマンド例も書いてあるので、実際に手を動かしながら、k8sの基本について学ぶことができる。&lt;/p>
&lt;p>私は趣味の開発でk8sクラスターを運用しているので、基本的には復習的な意味合いで読んだ。&lt;br>
とはいえ、永続化周りの知識はなんとなくでやっていたので知見が深まった。&lt;/p>
&lt;p>特にk8sを初めて触る人におすすめの一冊だと思った。&lt;/p>
&lt;p>注意点としては、原書は第3版まで出ており、いくつか加筆がある。&lt;br>
日本語版は加筆部分がないので、最新の情報を知りたい場合は原書を読むことをおすすめする。&lt;/p>
&lt;h1 id="googleのソフトウェアエンジニアリング-持続可能なプログラミングを支える技術文化プロセス">&lt;a href="https://www.oreilly.co.jp/books/9784873119656/" target="_blank" rel="noopener noreferrer">Googleのソフトウェアエンジニアリング ―持続可能なプログラミングを支える技術、文化、プロセス&lt;/a>
&lt;/h1>
&lt;p>25章『サービスとしてのコンピュート』を読んだ。&lt;/p>
&lt;p>k8sそのものの話はあまりない。&lt;br>
「コンピュート（プログラムを実際に実行するのに必要な計算能力）」というワードを中心に、
スケールする環境でプログラムを動かすことの大変さと、その大変さを解消するために考えるべきことを深ぼっていく。&lt;/p>
&lt;p>この話の中で、 k8sの前身であるBorgの話が出てくる。&lt;br>
こういった考えのもとBorgが生まれたんだなというのがよくわかった。&lt;/p>
&lt;p>特に以下2点が私にとっては有益な情報だった。&lt;/p>
&lt;ul>
&lt;li>スケールする環境における「コンピュート」関連の課題&lt;/li>
&lt;li>『ペット対家畜』の話&lt;/li>
&lt;/ul>
&lt;h1 id="コンテナセキュリティ-コンテナ化されたアプリケーションを保護する要素技術">&lt;a href="https://book.impress.co.jp/books/1122101051" target="_blank" rel="noopener noreferrer">コンテナセキュリティ コンテナ化されたアプリケーションを保護する要素技術&lt;/a>
&lt;/h1>
&lt;p>k8sのための本というわけではないが、コンテナ技術の上に成り立つk8sを触るうえで知っておくと役に立つ内容が書かれている。&lt;/p>
&lt;p>僕はこれまでコンテナ技術を触ってきたにも関わらず、
「Linuxの機能を使って実現されているんだよなぁ」という抽象的な理解しかしていなかった。&lt;/p>
&lt;p>本書を読むことで、コンテナ技術がLinuxのどういった機能によって実現されているかをきちんと理解できた。&lt;br>
そして、上記の話をベースに、タイトルにもあるセキュリティの話へと繋がっていく。&lt;/p>
&lt;p>僕自身、コンテナセキュリティについては、頑張ってキャッチアップしているつもりだった。&lt;br>
しかし、ベースとなるコンテナ技術について学んだ後だと、また違った角度からセキュリティについて再考できた。&lt;/p>
&lt;p>すでに実務で困らない程度にはコンテナをさわれるという方に、ぜひとも読んでほしい一冊だと思った。&lt;/p></description></item><item><title>2024年もよろしくお願いします！</title><link>https://tech.yyh-gl.dev/blog/new-year-2024/</link><pubDate>Mon, 08 Jan 2024 17:05:16 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/new-year-2024/</guid><description>&lt;br>
&lt;p>転職で始まった2023年も、あっという間に終わりました。&lt;br>
お世話になった方々ありがとうございました！&lt;/p>
&lt;p>今年も精一杯頑張っていくのでよろしくお願いします。&lt;/p></description></item><item><title>Indigo VPS上に個人開発用のk8sクラスターを構築する</title><link>https://tech.yyh-gl.dev/blog/k8s-setup/</link><pubDate>Thu, 04 May 2023 11:20:17 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/k8s-setup/</guid><description>&lt;h1 id="概要">概要&lt;/h1>
&lt;p>&lt;a href="https://web.arena.ne.jp/indigo/" target="_blank" rel="noopener noreferrer">WebARENA Indigo&lt;/a>
でVPSを2台借りて、
個人開発用のk8sクラスターを構築したので、その手順をメモとして残します。&lt;/p>
&lt;p>k8sクラスターの構築は下記2つの公式ドキュメントを参考に進めました。&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://kubernetes.io/ja/docs/setup/production-environment/tools/kubeadm/install-kubeadm/" target="_blank" rel="noopener noreferrer">kubeadmのインストール&lt;/a>
&lt;/li>
&lt;li>&lt;a href="https://kubernetes.io/ja/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/" target="_blank" rel="noopener noreferrer">kubeadmを使用したクラスターの作成&lt;/a>
&lt;/li>
&lt;/ul>
&lt;p>ドキュメントに記載のある手順を最終的にはスクリプトにしています。
&lt;br>
（本ブログ公開時点では自動構築スクリプトとして活用可能ですが、
k8sまわりのアップデートにより動かなくなる可能性が高いと思います）&lt;/p>
&lt;h1 id="k8sクラスターについて">k8sクラスターについて&lt;/h1>
&lt;ul>
&lt;li>Masterノード 1台, Workerノード 1台の計2台構成
&lt;ul>
&lt;li>個人開発なのでお金の節約のために冗長構成は取っていません&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>サーバーOSは Ubuntu 22.04&lt;/li>
&lt;li>k8sのバージョンは v1.27.1&lt;/li>
&lt;li>CNIはFlannelを使用&lt;/li>
&lt;/ul>
&lt;h1 id="indigo-vps固有の内容">Indigo VPS固有の内容&lt;/h1>
&lt;h2 id="swapの無効化は不要">Swapの無効化は不要&lt;/h2>
&lt;p>k8sを構築するサーバーに関して、公式ドキュメントに以下の記載があります。&lt;/p>
&lt;blockquote>
&lt;p>Swapがオフであること。kubeletが正常に動作するためにはswapは必ずオフでなければなりません。&lt;/p>&lt;/blockquote>
&lt;p>&lt;a href="https://kubernetes.io/ja/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#:~:text=Swap%E3%81%8C%E3%82%AA%E3%83%95%E3%81%A7%E3%81%82%E3%82%8B%E3%81%93%E3%81%A8%E3%80%82kubelet%E3%81%8C%E6%AD%A3%E5%B8%B8%E3%81%AB%E5%8B%95%E4%BD%9C%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AB%E3%81%AFswap%E3%81%AF%E5%BF%85%E3%81%9A%E3%82%AA%E3%83%95%E3%81%A7%E3%81%AA%E3%81%91%E3%82%8C%E3%81%B0%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82" target="_blank" rel="noopener noreferrer">参考&lt;/a>
&lt;/p>
&lt;p>Indigo VPSではデフォルトでSwapが無効になっているのでこの手順は不要です。&lt;/p>
&lt;h2 id="ファイアウォール">ファイアウォール&lt;/h2>
&lt;p>インバウンドに対してのみ制限を設けます。
&lt;br>
公式ドキュメントに公開しないといけないポート情報が記載されているので、こちらを参照して必要なポートだけ開けます。
&lt;br>
&lt;a href="https://kubernetes.io/ja/docs/reference/networking/ports-and-protocols/" target="_blank" rel="noopener noreferrer">公開しないといけないポート情報&lt;/a>
&lt;/p>
&lt;p>ufwについては特になにもしていません。&lt;/p>
&lt;p>このままでは手元のPCからSSHができなくなりますが、そこはTailscaleで解決しています。
&lt;br>
Tailscaleのインストールはスクリプト内で行っています。&lt;/p>
&lt;h1 id="スクリプト">スクリプト&lt;/h1>
&lt;p>下記リポジトリに置いています。&lt;/p>
&lt;p>&lt;a href="https://github.com/yyh-gl/k8s-setup" target="_blank" rel="noopener noreferrer">yyh-gl/k8s-setup&lt;/a>
&lt;/p>
&lt;p>以下のとおり実行すれば、k8sクラスターが構築されます。&lt;/p>
&lt;ul>
&lt;li>Masterノード：&lt;code>setup_common.sh&lt;/code>→&lt;code>setup-master.sh&lt;/code>の順で実行
&lt;ul>
&lt;li>注意：&lt;code>setup-master.sh&lt;/code>の&lt;code>&amp;lt;Master node IP&amp;gt;&lt;/code>部分はMasterノードのIPアドレスに置き換える必要あり
&lt;ul>
&lt;li>advertise addressの変更に使用（僕はTailscaleが払い出すIPにしたかったので）&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Workerノード：&lt;code>setup_common.sh&lt;/code>を実行後に&lt;code>kubeadm join&lt;/code>&lt;/li>
&lt;/ul>
&lt;img src="https://tech.yyh-gl.dev/img/2023/05/k8s-setup/nodes.webp" width="600"></description></item><item><title>gomockのgenerics対応状況</title><link>https://tech.yyh-gl.dev/blog/gomock-generics/</link><pubDate>Sun, 09 Apr 2023 00:25:48 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/gomock-generics/</guid><description>&lt;h1 id="gomock">gomock&lt;/h1>
&lt;p>&lt;a href="https://github.com/golang/mock" target="_blank" rel="noopener noreferrer">gomock&lt;/a>
はGo用のモック生成ツールです。&lt;/p>
&lt;p>今回はこのgomockのgenerics対応状況について共有します。&lt;/p>
&lt;h1 id="gomockのgenerics対応状況">gomockのgenerics対応状況&lt;/h1>
&lt;p>残念ながらgomockはまだgenericsに対応していません。&lt;/p>
&lt;p>ただし、generics対応がリリースされていないだけで、
すでに&lt;code>main&lt;/code>ブランチには
&lt;a href="https://github.com/golang/mock/pull/640" target="_blank" rel="noopener noreferrer">generics対応のPR&lt;/a>
がマージされています
（Issueは&lt;a href="https://github.com/golang/mock/issues/621" target="_blank" rel="noopener noreferrer">こちら&lt;/a>
）。
したがって、&lt;code>go install github.com/golang/mock/mockgen@main&lt;/code>とすればgenerics対応したgomockを利用可能です。&lt;/p>
&lt;h1 id="いつリリース">いつリリース？&lt;/h1>
&lt;p>&lt;code>v1.7.0&lt;/code>としてリリース予定らしく、すでにタグは作成されています。
&lt;a href="https://github.com/golang/mock/releases/tag/v1.7.0-rc.1" target="_blank" rel="noopener noreferrer">https://github.com/golang/mock/releases/tag/v1.7.0-rc.1&lt;/a>
&lt;/p>
&lt;p>ただ、タグが作成されてからもうすぐ1年が経とうとしています…&lt;/p>
&lt;p>無事リリースされることを祈りましょう。&lt;/p>
&lt;br>
&lt;p>（タグがあるので&lt;code>go install github.com/golang/mock/mockgen@v1.7.0-rc.1&lt;/code>でもOKですね）&lt;/p>
&lt;h1 id="まとめ">まとめ&lt;/h1>
&lt;!-- textlint-disable ja-technical-writing/sentence-length -->
&lt;p>generics対応したgomockを使いたい場合は、
&lt;code>go install github.com/golang/mock/mockgen@main&lt;/code>か
&lt;code>go install github.com/golang/mock/mockgen@v1.7.0-rc.1&lt;/code>を実行しましょう。&lt;/p>
&lt;!-- textlint-enable ja-technical-writing/sentence-length --></description></item><item><title>DMM.comを退職しました</title><link>https://tech.yyh-gl.dev/blog/dmm-to-line/</link><pubDate>Wed, 11 Jan 2023 00:00:00 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/dmm-to-line/</guid><description>&lt;h1 id="合同会社dmmcomを退職しました">合同会社DMM.comを退職しました&lt;/h1>
&lt;p>2019年4月1日に新卒入社し、2023年1月11日に退職しました。&lt;br>
4年弱お世話になりました。&lt;/p>
&lt;p>節目なのでDMM入社前〜退職までをまとめておきます。&lt;br>
メインは自分の振り返りのためですが、DMMに興味がある方の参考になると幸いです。&lt;/p>
&lt;h1 id="入社まで">入社まで&lt;/h1>
&lt;p>私は将来起業したいと思っており、
そのために事業立ち上げを近くで見てみたいと考えていました。&lt;br>
（実はリッチマンプアウーマンに影響を受けてエンジニアになってたりします）&lt;/p>
&lt;p>起業に興味がありつつも、
エンジニアとして大規模なシステム開発に携わってみたいという相反する気持ちもありました。&lt;/p>
&lt;br>
&lt;p>どうしようかなぁと思っていたときに出会ったのがDMM.comでした。&lt;br>&lt;/p>
&lt;p>20年以上稼働しているシステムがある上に、新規事業が毎月のように生まれてくる会社です。&lt;br>
0→1から1→10, 10→100まで全部やってみたい僕にはうってつけの場所でした。&lt;/p>
&lt;h1 id="入社してから">入社してから&lt;/h1>
&lt;img src="https://tech.yyh-gl.dev/img/2023/01/dmm-to-line/dmm_cake.webp" width="400">
&lt;p>新卒研修が終わり、配属となったチームでは最初はリプレイス案件を担当し、
半年ほどすると新規事業が始まりました。&lt;br>
（詳しくは &lt;a href="https://tech.yyh-gl.dev/about/" target="_blank" rel="noopener noreferrer">About&lt;/a>
にある経歴をご覧いただければと思います）&lt;/p>
&lt;br>
&lt;p>直属の上司である石垣さん（&lt;a href="https://twitter.com/i35_267" target="_blank" rel="noopener noreferrer">@i35_267&lt;/a>
）の元で働いていたわけですが、
開発だけでなく様々な機会をいただきました。&lt;/p>
&lt;p>&lt;a href="https://netflixtechblog.com/full-cycle-developers-at-netflix-a08c31f83249" target="_blank" rel="noopener noreferrer">フルサイクルエンジニアリング&lt;/a>
の考えに則った開発から始まり、損益計算書（P/L）を読んだり、データ分析や施策検討など、
「エンジニア」という枠組みに縛られない様々な経験をしました。&lt;/p>
&lt;p>もちろんやることは増えるので忙しかったですがとても楽しかったです。&lt;br>
良い経験だったと心の底から思います。&lt;/p>
&lt;h2 id="テックリードそしてチームリーダーへ">テックリード、そして、チームリーダーへ&lt;/h2>
&lt;p>リプレイス案件の途中からテックリードを任せてもらうことになります。&lt;br>
大それたことをやっていたわけではないですが、
技術周りをリードできるように勉強してはチームに還元するといったことをしていました。&lt;br>
（技術的関心とビジネス的関心のバランスを考えるのが楽しかった）&lt;/p>
&lt;p>結果として2019年度のゴールデンルーキー賞（新人賞みたいなの）をいただきました。&lt;br>
自分のやってることが正しいのか分からない中で必死に突き進んでいた自分にとっては、
みんなに認めてもらえたと実感できてとても嬉しかったです。&lt;br>
（自慢話に聞こえるかなと思って、今まで社外で話したことなかった）&lt;/p>
&lt;br>
&lt;p>無事にリプレイスが完了し、次に僕がDMMで最も関わっていた『DMMポイントクラブ』プロジェクトが始まります。&lt;br>
（間で他にもプロジェクトをやってましたが話の流れ的に今回は割愛）&lt;/p>
&lt;img src="https://tech.yyh-gl.dev/img/2023/01/dmm-to-line/pointclub.webp" width="600">
&lt;p>本プロジェクトが始まるにあたり僕はチームリーダーになりました。&lt;br>
DMMにはテックリードという役職がないので、ここで初めて役職がつきました。&lt;/p>
&lt;p>肩書きにまったく興味がない僕は今までどおりがむしゃらに頑張りました。&lt;br>
（さすがにもう少しどういう役職があるかは知っといた方がいいと石垣さんに言われたのも懐かしい）&lt;/p>
&lt;p>チームリーダーになると開発業務以外にメンバーのマネジメントやプロジェクト管理なども入ってきます。&lt;br>
手を動かす（開発）時間が減ってしまいストレスを抱える時期もありましたが、ユーザーに価値を届けるという目標は同じであり、
十分にやりがいを持ちながら仕事していました。&lt;/p>
&lt;p>特にピープルマネジメントには正解がなく、あーでもないこーでもないと試行錯誤しながら突き進んでてきた2年でした。&lt;br>
やってきたことが合っていたのかは分かりませんが、
最終出社日にチームメンバーからもらった色紙のメッセージを見て、ある程度はリーダーとしてみんなのためになれていたのかなと思いました。&lt;/p>
&lt;p>フルサイクルエンジニアリングを掲げたチームにおけるリーダー経験はとても良い経験だったと思います。&lt;/p>
&lt;br>
&lt;p>『DMMポイントクラブ』での開発やマネジメントに関して各メンバーが意識していたことなどは
以下の動画にまとまっているので興味があれば御覧ください。&lt;br>
『&lt;a href="https://www.youtube.com/watch?v=Y6Kj33EeJqg" target="_blank" rel="noopener noreferrer">DMM meetup #38〜フルサイクルエンジニアリングの現場【技術書典出版記念】〜&lt;/a>
』&lt;br>
（本も書きました 『&lt;a href="https://techbookfest.org/product/8ckqypHhSCaakQ1nM1E4JS" target="_blank" rel="noopener noreferrer">DMM PointClub Tech Book #1&lt;/a>
』）&lt;/p>
&lt;h2 id="10100の開発">10→100の開発&lt;/h2>
&lt;p>DMMの大黒柱といっても過言ではない動画サービス（10→100）にも少しだけ（本当に少しだけです）参加しました。&lt;br>
20年以上運用されているサービスですので、いわゆる「レガシー」と呼ばれる部分もありますが、&lt;br>
そこにネガティブなイメージはなく、こういう工夫によって支えてきたんだという学びが大きかったです。&lt;br>
（もちろん改善も進んでいます）&lt;/p></description></item><item><title>KtorとStripeでECサイトを作ってみた</title><link>https://tech.yyh-gl.dev/blog/kotlin-ktor-stripe-tutorial/</link><pubDate>Wed, 21 Dec 2022 00:00:00 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/kotlin-ktor-stripe-tutorial/</guid><description>&lt;h1 id="kotlin-advent-calendar-2022">Kotlin Advent Calendar 2022&lt;/h1>
&lt;img src="https://tech.yyh-gl.dev/img/2022/12/kotlin-ktor-stripe-tutorial/qiita_advent_calendar_2022.webp" width="700">
&lt;p>本記事は&lt;a href="https://qiita.com/advent-calendar/2022/kotlin" target="_blank" rel="noopener noreferrer">Kotlin Advent Calendar 2022&lt;/a>
の21日目の記事です。&lt;/p>
&lt;h1 id="概要">概要&lt;/h1>
&lt;p>クリスマスといえばプレゼント。&lt;br>
ということでECサイトを作ってみます。&lt;/p>
&lt;p>ECサイトと言いつつもあまり複雑なことはせずに、Stripeから取得した商品情報を表示する画面を作るところまでやります。&lt;br>
本画面を実装する過程で、APIを経由した情報のやりとり→受け取った情報を画面に表示するところまで触れます。&lt;br>
よって、本記事を読めばKotlinで外部API（主にStripe）を使ったシステムの実装イメージをざっくり掴めると思います。&lt;/p>
&lt;br>
&lt;p>ただただKotlinで作るだけではなくて、個人的にこれまで触ったことないフレームワークやサービスを使ってみたいと思っています。&lt;/p>
&lt;blockquote>
&lt;p>個人的にこれまで触ったことない&lt;/p>&lt;/blockquote>
&lt;p>あたかもKotlinは触ったことあるような言い方ですが、私はこれまでGo中心のエンジニア人生でした。&lt;br>
したがって、そもそもKotlin自体あまり触ったことがないです←&lt;br>
Kotlinのお作法を守れていないところもあると思いますが、こんな感じで作れるのかぁとイメージしてもらえると幸いです。&lt;/p>
&lt;br>
&lt;p>では、採用技術を紹介したら、さっそくECサイトを作っていこうと思います。&lt;br>&lt;/p>
&lt;br>
&lt;p>⚠️ 本記事内に記載するコードは&lt;code>package&lt;/code>や&lt;code>import&lt;/code>周りのコードを省略しています。&lt;br>
コード全体を見たい場合は以下のリポジトリにコードを置いているのでこちらを参照ください。&lt;br>
&lt;a href="https://github.com/yyh-gl/ktor-shop/" target="_blank" rel="noopener noreferrer">https://github.com/yyh-gl/ktor-shop/&lt;/a>
&lt;/p>
&lt;h1 id="採用技術">採用技術&lt;/h1>
&lt;ul>
&lt;li>Webフレームワーク：&lt;a href="https://ktor.io/" target="_blank" rel="noopener noreferrer">Ktor&lt;/a>
&lt;/li>
&lt;li>テンプレートエンジン：&lt;a href="https://freemarker.apache.org/" target="_blank" rel="noopener noreferrer">FreeMarker&lt;/a>
&lt;/li>
&lt;li>決済および商品管理：&lt;a href="https://stripe.com/jp" target="_blank" rel="noopener noreferrer">Stripe&lt;/a>
&lt;/li>
&lt;li>DI：&lt;a href="https://insert-koin.io/" target="_blank" rel="noopener noreferrer">Koin&lt;/a>
&lt;/li>
&lt;/ul>
&lt;h1 id="hello-world">Hello World&lt;/h1>
&lt;p>まずは「Hello World」していきます。&lt;/p>
&lt;p>プロジェクトの作成は下記公式サイトに記載の手順を参考にしてください。&lt;/p>
&lt;p>&lt;a href="https://ktor.io/docs/intellij-idea.html#create_ktor_project" target="_blank" rel="noopener noreferrer">https://ktor.io/docs/intellij-idea.html#create_ktor_project&lt;/a>
&lt;/p>
&lt;br>
&lt;p>インストールしたプラグインは以下のとおりです。&lt;/p>
&lt;img src="https://tech.yyh-gl.dev/img/2022/12/kotlin-ktor-stripe-tutorial/dependency.webp" width="700">
&lt;p>&lt;br>&lt;br>&lt;/p>
&lt;p>コードがひととおりできあがったら下記コマンドを実行しサーバーを起動します。&lt;/p>
&lt;p>&lt;code>$ ./gradlew run&lt;/code>&lt;/p>
&lt;p>サーバーが起動したら &lt;code>http://localhost:8080/&lt;/code> にアクセスします。&lt;br>&lt;/p>
&lt;img src="https://tech.yyh-gl.dev/img/2022/12/kotlin-ktor-stripe-tutorial/hello_world.webp" width="500">
&lt;p>「Hello World!」を表示できました。&lt;/p>
&lt;h2 id="auto-reloadの有効化">Auto-reloadの有効化&lt;/h2>
&lt;!-- textlint-disable ja-technical-writing/no-doubled-joshi -->
&lt;p>開発していく上ではAuto-reloadがあった方が便利なのでAuto-reloadを有効にしていきます。&lt;/p>
&lt;!-- textlint-enable ja-technical-writing/no-doubled-joshi -->
&lt;p>Auto-reloadを有効化する手順は以下のとおりです。&lt;/p>
&lt;ol>
&lt;li>developmentモードを有効化&lt;/li>
&lt;li>継続的なビルドを実行&lt;br>&lt;code>$ ./gradlew -t build&lt;/code>&lt;/li>
&lt;li>サーバーを起動&lt;br>&lt;code>$ ./gradlew run&lt;/code>&lt;/li>
&lt;/ol>
&lt;p>サーバー起動手順がHello Worldのときよりも2つ増えています。&lt;br>
詳しく見てみましょう。&lt;/p></description></item><item><title>複数のdocker-compose.ymlを使って、設定の追加や上書きをやってみる</title><link>https://tech.yyh-gl.dev/blog/docker-compose-override/</link><pubDate>Sat, 19 Mar 2022 00:55:40 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/docker-compose-override/</guid><description>&lt;h1 id="要約">要約&lt;/h1>
&lt;p>Docker Composeの設定ファイルは複数指定できて、設定の追加や上書きができる。&lt;/p>
&lt;br>
&lt;br>
&lt;p>早速詳細に見ていきましょう↓&lt;/p>
&lt;h1 id="docker-composeymlは複数指定可能">&lt;code>docker-compose.yml&lt;/code>は複数指定可能&lt;/h1>
&lt;p>&lt;code>docker compose up&lt;/code>実行時に&lt;code>-f&lt;/code>オプションを使うことで、
参照する&lt;code>docker-compose.yml&lt;/code>ファイル（設定ファイル）を指定できることは、ご存知の方も多いと思います。&lt;br>
しかし、複数の設定ファイルを指定できることはあまり知られていないと思います（勝手な決めつけ）。&lt;/p>
&lt;p>&lt;a href="https://docs.docker.jp/index.html" target="_blank" rel="noopener noreferrer">Docker-docs-ja&lt;/a>
では、以下のページで説明がされています。&lt;/p>
&lt;p>&lt;a href="https://docs.docker.jp/compose/extends.html" target="_blank" rel="noopener noreferrer">『ファイル間、プロジェクト間での Compose 設定の共有 』&lt;/a>
&lt;/p>
&lt;h1 id="実際の動きを見てみる">実際の動きを見てみる&lt;/h1>
&lt;p>以下のような&lt;code>docker-compose.yml&lt;/code>を用意します。&lt;/p>
&lt;p>&lt;code>docker-compose.yml&lt;/code>&lt;/p>
&lt;pre>&lt;code class="language-docker-compose">version: '3'
services:
web:
image: &amp;quot;nginx:latest&amp;quot;
&lt;/code>&lt;/pre>
&lt;p>&lt;code>docker compose -f docker-compose.yml up&lt;/code>でコンテナを起動した後に、
ブラウザを開いて&lt;code>http://localhost/&lt;/code>にアクセスしてみます。&lt;/p>
&lt;img src="https://tech.yyh-gl.dev/img/2022/03/docker-compose-override/result1.webp" width="600">
&lt;p>Webサイトにアクセスできませんでした。&lt;/p>
&lt;p>ポートを公開していないので当然の結果ですね。&lt;/p>
&lt;br>
&lt;p>次に、以下のような&lt;code>docker-compose.override.yml&lt;/code>を用意します。&lt;/p>
&lt;p>&lt;code>docker-compose.override.yml&lt;/code>&lt;/p>
&lt;pre>&lt;code class="language-docker-compose">version: '3'
services:
web:
ports:
- &amp;quot;80:80&amp;quot;
&lt;/code>&lt;/pre>
&lt;p>そして、今度は以下のようにして、複数の設定ファイルを指定します。&lt;/p>
&lt;p>&lt;code>docker compose -f docker-compose.yml -f docker-compose.override.yml up&lt;/code>&lt;/p>
&lt;p>では、&lt;code>http://localhost/&lt;/code>にアクセスしてみます。&lt;/p>
&lt;img src="https://tech.yyh-gl.dev/img/2022/03/docker-compose-override/result2.webp" width="600">
&lt;p>今度は無事にアクセスできました。&lt;/p>
&lt;p>ポート公開がうまくできているようです。&lt;br>&lt;/p>
&lt;!-- textlint-disable ja-technical-writing/sentence-length -->
&lt;p>上記の挙動を見ることで、&lt;code>docker-compose.yml&lt;/code>で使用イメージの指定ができており、なおかつ、
&lt;code>docker-compose.override.yml&lt;/code>でポート公開の設定ができていることが分かります。&lt;/p>
&lt;!-- textlint-enable ja-technical-writing/sentence-length -->
&lt;br>
&lt;p>すなわち、Docker Composeは追加で設定ファイルを指定することで、設定を追加できます。&lt;/p>
&lt;p>なお、今回はサンプルを省きましたが、追加だけではなく、上書きも可能です。&lt;br>
（後ほど出てくるサンプルを見れば、上書きの挙動も分かると思います）&lt;/p></description></item><item><title>【2021年】アクティビティまとめ</title><link>https://tech.yyh-gl.dev/blog/activity-2021/</link><pubDate>Sun, 02 Jan 2022 20:59:04 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/activity-2021/</guid><description>&lt;h1 id="今年も">今年も…&lt;/h1>
&lt;p>&lt;a href="https://tech.yyh-gl.dev/blog/activity-2020/" target="_blank" rel="noopener noreferrer">昨年に引き続き&lt;/a>
、
今年も&lt;a href="https://lapras.com/" target="_blank" rel="noopener noreferrer">LAPRAS&lt;/a>
で1年間のアクティビティを出してみました。&lt;/p>
&lt;p>コロナ禍真っ只中でも、オンラインでたくさんの勉強会に参加できました。&lt;/p>
&lt;p>今年は良い出会いが特に多く、運営側として関わったものも増えました。&lt;/p>
&lt;p>来年もさらに良い年になるように、多方面で頑張っていきます！&lt;/p>
&lt;p>では、本題の2021年のアクティビティです↓&lt;/p>
&lt;h1 id="2021年アクティビティ">2021年アクティビティ&lt;/h1>
&lt;p>2021年のアウトプットと参加イベントを振り返ると&lt;/p>
&lt;p>アウトプットしたものや参加したイベントなどをまとめてみました。&lt;/p>
&lt;h2 id="connpass">connpass&lt;/h2>
&lt;ul>
&lt;li>2021/12/08
&lt;ul>
&lt;li>&lt;a href="https://modeling-how-to-learn.connpass.com/event/229330/" target="_blank" rel="noopener noreferrer">ユースケース駆動開発をやってみた&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/12/01
&lt;ul>
&lt;li>&lt;a href="https://gospecreading.connpass.com/event/231503/" target="_blank" rel="noopener noreferrer">Go Language Specification 輪読会 #32&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/11/25
&lt;ul>
&lt;li>&lt;a href="https://mercari.connpass.com/event/229218/" target="_blank" rel="noopener noreferrer">merpay Tech Talk 〜 決済基盤の未来〜&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/11/17
&lt;ul>
&lt;li>&lt;a href="https://gospecreading.connpass.com/event/228611/" target="_blank" rel="noopener noreferrer">Go Language Specification 輪読会 #31&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/11/03
&lt;ul>
&lt;li>&lt;a href="https://gospecreading.connpass.com/event/226564/" target="_blank" rel="noopener noreferrer">Go 1.18+ 言語仕様勉強会 #3 【Generics】&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/10/30
&lt;ul>
&lt;li>&lt;a href="https://ddd-community-jp.connpass.com/event/226482/" target="_blank" rel="noopener noreferrer">ライブモデリングとコーディングで理解するDDD (DDD勉強会2021#1)&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/10/21
&lt;ul>
&lt;li>&lt;a href="https://mercari.connpass.com/event/227024/" target="_blank" rel="noopener noreferrer">mercari.go #17 オンライン開催&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/10/20
&lt;ul>
&lt;li>&lt;a href="https://gospecreading.connpass.com/event/227239/" target="_blank" rel="noopener noreferrer">Go Language Specification 輪読会 #30&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/10/06
&lt;ul>
&lt;li>&lt;a href="https://gospecreading.connpass.com/event/224600/" target="_blank" rel="noopener noreferrer">Go Language Specification 輪読会 #29&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/09/22
&lt;ul>
&lt;li>&lt;a href="https://gospecreading.connpass.com/event/223987/" target="_blank" rel="noopener noreferrer">Go 1.18+ 言語仕様勉強会 #2 【Generics】&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/09/11
&lt;ul>
&lt;li>&lt;a href="https://ddd-community-jp.connpass.com/event/223444/" target="_blank" rel="noopener noreferrer">DDD質問箱のつまみ喰い - 1軒目&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/09/08
&lt;ul>
&lt;li>&lt;a href="https://gospecreading.connpass.com/event/223152/" target="_blank" rel="noopener noreferrer">Go Language Specification 輪読会 #28&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/09/07
&lt;ul>
&lt;li>&lt;a href="https://modeling-how-to-learn.connpass.com/event/223326/" target="_blank" rel="noopener noreferrer">モデリングの学び方：座談会&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/09/01
&lt;ul>
&lt;li>&lt;a href="https://lapras.connpass.com/event/222901/" target="_blank" rel="noopener noreferrer">LAPRAS公開設計レビュー 「t_wadaさんにこのテストでサバンナを生き抜けるか聞いてみた」&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/08/25
&lt;ul>
&lt;li>&lt;a href="https://gospecreading.connpass.com/event/220272/" target="_blank" rel="noopener noreferrer">Go Language Specification 輪読会 #27&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/08/22
&lt;ul>
&lt;li>&lt;a href="https://kyotogo.connpass.com/event/221655/" target="_blank" rel="noopener noreferrer">Kyoto.go remote #23 golang/go の Issues を読み漁る会&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/08/11
&lt;ul>
&lt;li>&lt;a href="https://showcase-gig.connpass.com/event/217914/" target="_blank" rel="noopener noreferrer">GeekGig #1 〜Goと私の一年〜&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/08/01
&lt;ul>
&lt;li>&lt;a href="https://gospecreading.connpass.com/event/220389/" target="_blank" rel="noopener noreferrer">Type Sets Proposal 勉強会&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/07/31
&lt;ul>
&lt;li>&lt;a href="https://ddd-community-jp.connpass.com/event/219778/" target="_blank" rel="noopener noreferrer">エリック・エヴァンスのドメイン駆動設計 輪読会「第17章 戦略をまとめ上げる&amp;amp;エピローグ」&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/07/26
&lt;ul>
&lt;li>&lt;a href="https://mercari.connpass.com/event/215035/" target="_blank" rel="noopener noreferrer">Merpay Tech Fest 2021&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/07/21
&lt;ul>
&lt;li>&lt;a href="https://gospecreading.connpass.com/event/219466/" target="_blank" rel="noopener noreferrer">Go Language Specification 輪読会 #26&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/07/20
&lt;ul>
&lt;li>&lt;a href="https://dmm.connpass.com/event/218192/" target="_blank" rel="noopener noreferrer">DMM.go #3&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/07/19
&lt;ul>
&lt;li>&lt;a href="https://mercari.connpass.com/event/218434/" target="_blank" rel="noopener noreferrer">mercari.go #16 オンライン開催&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/07/17
&lt;ul>
&lt;li>&lt;a href="https://ddd-community-jp.connpass.com/event/218316/" target="_blank" rel="noopener noreferrer">エリック・エヴァンスのドメイン駆動設計 輪読会「第16章 大規模な構造」後半&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/07/14
&lt;ul>
&lt;li>&lt;a href="https://gospecreading.connpass.com/event/217353/" target="_blank" rel="noopener noreferrer">Go Language Specification 輪読会 #25&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/07/06
&lt;ul>
&lt;li>&lt;a href="https://kichijojipm.connpass.com/event/217224/" target="_blank" rel="noopener noreferrer">吉祥寺.pm27【オンライン】&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/07/03
&lt;ul>
&lt;li>&lt;a href="https://ddd-community-jp.connpass.com/event/216909/" target="_blank" rel="noopener noreferrer">エリック・エヴァンスのドメイン駆動設計 輪読会「第16章 大規模な構造」前編&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/06/25
&lt;ul>
&lt;li>&lt;a href="https://future.connpass.com/event/216081/" target="_blank" rel="noopener noreferrer">Future Tech Night #12～Goで始めるサーバレスファーストという選択肢～&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/06/24
&lt;ul>
&lt;li>&lt;a href="https://k8sjp.connpass.com/event/214286/" target="_blank" rel="noopener noreferrer">Kubernetes Meetup Tokyo #42&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/06/23
&lt;ul>
&lt;li>&lt;a href="https://gospecreading.connpass.com/event/215963/" target="_blank" rel="noopener noreferrer">Go Language Specification 輪読会 #24&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/06/22
&lt;ul>
&lt;li>&lt;a href="https://techbookfest.connpass.com/event/210997/" target="_blank" rel="noopener noreferrer">【出版記念オンラインイベント】生産性を最大化する！『チームで育てるAndroidアプリ設計』&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/06/20
&lt;ul>
&lt;li>&lt;a href="https://kyotogo.connpass.com/event/214891/" target="_blank" rel="noopener noreferrer">Kyoto.go remote #21 Discord もくもく会&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/06/19
&lt;ul>
&lt;li>&lt;a href="https://ddd-community-jp.connpass.com/event/215541/" target="_blank" rel="noopener noreferrer">エリック・エヴァンスのドメイン駆動設計 輪読会「第15章 蒸留」後編&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/06/16
&lt;ul>
&lt;li>&lt;a href="https://mercari.connpass.com/event/213078/" target="_blank" rel="noopener noreferrer">iOS Tech Talk 〜 Multi module 戦略座談会 〜&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/06/11
&lt;ul>
&lt;li>&lt;a href="https://forkwell.connpass.com/event/212647/" target="_blank" rel="noopener noreferrer">Infra Study 2nd #2「クラウドネイティブを支えるインフラ技術」&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/06/10
&lt;ul>
&lt;li>&lt;a href="https://fukuokago.connpass.com/event/202570/" target="_blank" rel="noopener noreferrer">Fukuoka.go#17 (オンライン開催)&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/06/09
&lt;ul>
&lt;li>&lt;a href="https://lapras.connpass.com/event/214564/" target="_blank" rel="noopener noreferrer">公開設計レビュー「LAPRASのDB設計についてそーだいさんに相談してみた」&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/06/09
&lt;ul>
&lt;li>&lt;a href="https://gospecreading.connpass.com/event/214631/" target="_blank" rel="noopener noreferrer">Go Language Specification 輪読会 #23&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/06/08
&lt;ul>
&lt;li>&lt;a href="https://cartaholdings.connpass.com/event/212538/" target="_blank" rel="noopener noreferrer">『ドメイン駆動設計入門』×『事業をエンジニアリングする技術者たち』パネルディスカッション&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/06/05
&lt;ul>
&lt;li>&lt;a href="https://ddd-community-jp.connpass.com/event/214264/" target="_blank" rel="noopener noreferrer">エリック・エヴァンスのドメイン駆動設計 輪読会「第15章 蒸留」前編&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/05/30
&lt;ul>
&lt;li>&lt;a href="https://kyotogo.connpass.com/event/213814/" target="_blank" rel="noopener noreferrer">Kyoto.go remote #20 Discord LT会&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/05/28
&lt;ul>
&lt;li>&lt;a href="https://forkwell.connpass.com/event/214027/" target="_blank" rel="noopener noreferrer">The Global Dev Study #2 - JAMstack&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/05/26
&lt;ul>
&lt;li>&lt;a href="https://chatwork.connpass.com/event/204879/" target="_blank" rel="noopener noreferrer">Chatwork Dev Day 2021&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/05/26
&lt;ul>
&lt;li>&lt;a href="https://gospecreading.connpass.com/event/213272/" target="_blank" rel="noopener noreferrer">Go Language Specification 輪読会 #22&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/05/25
&lt;ul>
&lt;li>&lt;a href="https://chatwork.connpass.com/event/209207/" target="_blank" rel="noopener noreferrer">『レイヤードアーキテクチャと Redux』～ FPUI 研究ラジオ #3&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/05/22
&lt;ul>
&lt;li>&lt;a href="https://ddd-community-jp.connpass.com/event/212841/" target="_blank" rel="noopener noreferrer">エリック・エヴァンスのドメイン駆動設計 輪読会「第14章 モデルの整合性を維持する」後編&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/05/21
&lt;ul>
&lt;li>&lt;a href="https://future.connpass.com/event/211765/" target="_blank" rel="noopener noreferrer">Future Tech Night #10 ～進化するJava。標準API/Tomcat編～&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/05/20
&lt;ul>
&lt;li>&lt;a href="https://kaminashi.connpass.com/event/210006/" target="_blank" rel="noopener noreferrer">製造現場を変えろ。ソフトウェアエンジニアが挑む爆速DX&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/05/17
&lt;ul>
&lt;li>&lt;a href="https://forkwell.connpass.com/event/205147/" target="_blank" rel="noopener noreferrer">GaaS Study #1 ー平井大臣に聞く、デジタル庁が解くべき課題とITエンジニアの役割&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/05/12
&lt;ul>
&lt;li>&lt;a href="https://gospecreading.connpass.com/event/211338/" target="_blank" rel="noopener noreferrer">Go Language Specification 輪読会 #21&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/05/08
&lt;ul>
&lt;li>&lt;a href="https://ddd-community-jp.connpass.com/event/211642/" target="_blank" rel="noopener noreferrer">エリック・エヴァンスのドメイン駆動設計 輪読会「第14章 モデルの整合性を維持する」中編&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/04/25
&lt;ul>
&lt;li>&lt;a href="https://kyotogo.connpass.com/event/210336/" target="_blank" rel="noopener noreferrer">Kyoto.go remote #19 GoCon感想戦&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/04/24
&lt;ul>
&lt;li>&lt;a href="https://gocon.connpass.com/event/208896/" target="_blank" rel="noopener noreferrer">Go Conference 2021 Spring (Online)&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/04/24
&lt;ul>
&lt;li>&lt;a href="https://ddd-community-jp.connpass.com/event/209583/" target="_blank" rel="noopener noreferrer">エリック・エヴァンスのドメイン駆動設計 輪読会「第14章 モデルの整合性を維持する」前編&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/04/22
&lt;ul>
&lt;li>&lt;a href="https://gocon.connpass.com/event/210571/" target="_blank" rel="noopener noreferrer">Go Conference 2021 Spring Online 前夜祭&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/04/21
&lt;ul>
&lt;li>&lt;a href="https://gospecreading.connpass.com/event/209990/" target="_blank" rel="noopener noreferrer">Go Language Specification 輪読会 #20&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/04/20
&lt;ul>
&lt;li>&lt;a href="https://kichijojipm.connpass.com/event/210242/" target="_blank" rel="noopener noreferrer">吉祥寺.pm26【オンライン】&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/04/15
&lt;ul>
&lt;li>&lt;a href="https://gospecreading.connpass.com/event/208080/" target="_blank" rel="noopener noreferrer">入門Go言語仕様輪読会 第3回（初心者でも丁寧にサポート）&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/04/07
&lt;ul>
&lt;li>&lt;a href="https://mercari.connpass.com/event/207062/" target="_blank" rel="noopener noreferrer">Mercari Platform Group Tech Talk #1 (Day2)&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/04/07
&lt;ul>
&lt;li>&lt;a href="https://gospecreading.connpass.com/event/208563/" target="_blank" rel="noopener noreferrer">Go Language Specification 輪読会 #19&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/04/03
&lt;ul>
&lt;li>&lt;a href="https://ddd-community-jp.connpass.com/event/208197/" target="_blank" rel="noopener noreferrer">エリック・エヴァンスのドメイン駆動設計 輪読会「第12、13章」&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/03/31
&lt;ul>
&lt;li>&lt;a href="https://serverless-newworld.connpass.com/event/207516/" target="_blank" rel="noopener noreferrer">サーバーレスアンチパターン今昔物語 最終回&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/03/26
&lt;ul>
&lt;li>&lt;a href="https://chatwork.connpass.com/event/206713/" target="_blank" rel="noopener noreferrer">『クライアントサイド DDD を考える』～ FPUI 研究ラジオ #2&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/03/25
&lt;ul>
&lt;li>&lt;a href="https://k8sjp.connpass.com/event/206303/" target="_blank" rel="noopener noreferrer">Kubernetes Meetup Tokyo #40&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/03/24
&lt;ul>
&lt;li>&lt;a href="https://gospecreading.connpass.com/event/207204/" target="_blank" rel="noopener noreferrer">Go Language Specification 輪読会 #18&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/03/21
&lt;ul>
&lt;li>&lt;a href="https://kyotogo.connpass.com/event/205324/" target="_blank" rel="noopener noreferrer">Kyoto.go remote #18 Discord LT会&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/03/20
&lt;ul>
&lt;li>&lt;a href="https://ddd-community-jp.connpass.com/event/206838/" target="_blank" rel="noopener noreferrer">エリック・エヴァンスのドメイン駆動設計 輪読会「第11章 アナリシスパターンを適用する」&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/03/19
&lt;ul>
&lt;li>&lt;a href="https://future.connpass.com/event/206387/" target="_blank" rel="noopener noreferrer">Future Tech Night #7 〜フューチャーの開発事例と共に学べるGo勉強会〜&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/03/18
&lt;ul>
&lt;li>&lt;a href="https://gospecreading.connpass.com/event/205420/" target="_blank" rel="noopener noreferrer">入門Go言語仕様輪読会 第2回（初心者でも丁寧にサポート）&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/03/15
&lt;ul>
&lt;li>&lt;a href="https://http-tokyo.connpass.com/event/205846/" target="_blank" rel="noopener noreferrer">HTTP/Tokyo #2 (オンライン開催)&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/03/10
&lt;ul>
&lt;li>&lt;a href="https://gospecreading.connpass.com/event/205670/" target="_blank" rel="noopener noreferrer">Go Language Specification 輪読会 #17&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/03/08
&lt;ul>
&lt;li>&lt;a href="https://gcpug-tokyo.connpass.com/event/205839/" target="_blank" rel="noopener noreferrer">GCPUG Tokyo GKE Day March 2021&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/03/06
&lt;ul>
&lt;li>&lt;a href="https://ddd-community-jp.connpass.com/event/205302/" target="_blank" rel="noopener noreferrer">エリック・エヴァンスのドメイン駆動設計 輪読会「第10章 しなやかな設計」後半&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/03/03
&lt;ul>
&lt;li>&lt;a href="https://shuuu-mai.connpass.com/event/205747/" target="_blank" rel="noopener noreferrer">オンライン開催【シューマイ】Tech Lead Engineerから最新技術を学べ！Go編&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/03/02
&lt;ul>
&lt;li>&lt;a href="https://serverless-newworld.connpass.com/event/205373/" target="_blank" rel="noopener noreferrer">Monthly AWS Serverless Update 2021/02&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/02/24
&lt;ul>
&lt;li>&lt;a href="https://gospecreading.connpass.com/event/204419/" target="_blank" rel="noopener noreferrer">Go Language Specification 輪読会 #16&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/02/21
&lt;ul>
&lt;li>&lt;a href="https://kyotogo.connpass.com/event/203515/" target="_blank" rel="noopener noreferrer">Kyoto.go remote #17 Discord LT会&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/02/20
&lt;ul>
&lt;li>&lt;a href="https://ddd-community-jp.connpass.com/event/204026/" target="_blank" rel="noopener noreferrer">エリック・エヴァンスのドメイン駆動設計 輪読会「第10章 しなやかな設計」前半&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/02/19
&lt;ul>
&lt;li>&lt;a href="https://gcpug-tokyo.connpass.com/event/202656/" target="_blank" rel="noopener noreferrer">GAE 1st Gen Migration Plan Discussion Day Part 2&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/02/18
&lt;ul>
&lt;li>&lt;a href="https://gospecreading.connpass.com/event/202388/" target="_blank" rel="noopener noreferrer">入門Go言語仕様輪読会（初心者でも丁寧にサポート）&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/02/13
&lt;ul>
&lt;li>&lt;a href="https://nrs-seminar.connpass.com/event/202597/" target="_blank" rel="noopener noreferrer">『ドメイン駆動設計入門』パネルディスカッション with レビュアーズ&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/02/10
&lt;ul>
&lt;li>&lt;a href="https://gospecreading.connpass.com/event/202782/" target="_blank" rel="noopener noreferrer">Go Language Specification 輪読会 #15&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/02/06
&lt;ul>
&lt;li>&lt;a href="https://ddd-community-jp.connpass.com/event/202456/" target="_blank" rel="noopener noreferrer">エリック・エヴァンスのドメイン駆動設計 輪読会「第9章 暗黙的な概念を明示的にする」後半&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/02/05
&lt;ul>
&lt;li>&lt;a href="https://mercari.connpass.com/event/202053/" target="_blank" rel="noopener noreferrer">mercari.go #15 オンライン開催&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/02/03
&lt;ul>
&lt;li>&lt;a href="https://serverless-newworld.connpass.com/event/202818/" target="_blank" rel="noopener noreferrer">Monthly AWS Serverless Update 202101&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/01/28
&lt;ul>
&lt;li>&lt;a href="https://runtime.connpass.com/event/198071/" target="_blank" rel="noopener noreferrer">Container Runtime Meetup #3&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/01/28
&lt;ul>
&lt;li>&lt;a href="https://m3-engineer.connpass.com/event/200495/" target="_blank" rel="noopener noreferrer">エムスリーアンケートシステムの技術：マイクロサービス/認証&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/01/27
&lt;ul>
&lt;li>&lt;a href="https://mercari.connpass.com/event/196609/" target="_blank" rel="noopener noreferrer">merpay Tech Talk ~ BackendのテストとQAのフレームワークとツールについて&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/01/27
&lt;ul>
&lt;li>&lt;a href="https://gospecreading.connpass.com/event/201445/" target="_blank" rel="noopener noreferrer">Go Language Specification輪読会 #14&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/01/26
&lt;ul>
&lt;li>&lt;a href="https://forkwell.connpass.com/event/197119/" target="_blank" rel="noopener noreferrer">Infra Study Meetup #10 パネルディスカッション - 2021年インフラ始め編&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/01/23
&lt;ul>
&lt;li>&lt;a href="https://ddd-community-jp.connpass.com/event/201113/" target="_blank" rel="noopener noreferrer">エリック・エヴァンスのドメイン駆動設計 輪読会「第9章 暗黙的な概念を明示的にする」前半&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/01/20
&lt;ul>
&lt;li>&lt;a href="https://mercari.connpass.com/event/198772/" target="_blank" rel="noopener noreferrer">メルペイCTO &amp;amp; CBOによる、Fintech業界 現在のトレンドと未来の話 （つづき）&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/01/16
&lt;ul>
&lt;li>&lt;a href="https://kyotogo.connpass.com/event/199400/" target="_blank" rel="noopener noreferrer">Kyoto.go remote #16 あけましてLT会&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/01/15
&lt;ul>
&lt;li>&lt;a href="https://connpass.com/event/197484/" target="_blank" rel="noopener noreferrer">Qiita Advent Calendar Online Meetup&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/01/13
&lt;ul>
&lt;li>&lt;a href="https://gospecreading.connpass.com/event/198877/" target="_blank" rel="noopener noreferrer">Go Language Specification輪読会 #13&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/01/09
&lt;ul>
&lt;li>&lt;a href="https://ddd-community-jp.connpass.com/event/199503/" target="_blank" rel="noopener noreferrer">エリック・エヴァンスのドメイン駆動設計 輪読会「第8章 ブレイクスルー」&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="github">Github&lt;/h2>
&lt;ul>
&lt;li>2021/10/16
&lt;ul>
&lt;li>&lt;a href="https://github.com/yyh-gl/gomish" target="_blank" rel="noopener noreferrer">yyh-gl/gomish&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/03/31
&lt;ul>
&lt;li>&lt;a href="https://github.com/yyh-gl/yyh-gl.deno.dev" target="_blank" rel="noopener noreferrer">yyh-gl/yyh-gl.deno.dev&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/03/07
&lt;ul>
&lt;li>&lt;a href="https://github.com/yyh-gl/JetBrainsIDE-settings" target="_blank" rel="noopener noreferrer">yyh-gl/JetBrainsIDE-settings&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2021/01/04
&lt;ul>
&lt;li>&lt;a href="https://github.com/yyh-gl/cron-jobs" target="_blank" rel="noopener noreferrer">yyh-gl/cron-jobs&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>&lt;a href="https://lapras.com/" title="LAPRASポートフォリオはこちらから" target="_blank" rel="noopener noreferrer">LAPRASポートフォリオはこちらから&lt;/a>
&lt;/p></description></item><item><title>徒然なるままに go build と build tag を見ていく</title><link>https://tech.yyh-gl.dev/blog/go-build/</link><pubDate>Sun, 19 Dec 2021 09:00:00 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/go-build/</guid><description>&lt;br>
&lt;p>本記事は『&lt;a href="https://qiita.com/advent-calendar/2021/go" target="_blank" rel="noopener noreferrer">Go #1 Advent Calendar 2021 19日目&lt;/a>
』の記事です。&lt;/p>
&lt;img src="https://tech.yyh-gl.dev/img/2021/12/go-build/advent_calendar_2021.webp" width="500">
&lt;h1 id="はじめに">はじめに&lt;/h1>
&lt;p>Goには標準で便利なコマンドがたくさんあります。&lt;/p>
&lt;p>有名どころで言えば、&lt;/p>
&lt;ul>
&lt;li>&lt;code>generate&lt;/code>&lt;/li>
&lt;li>&lt;code>fmt&lt;/code>&lt;/li>
&lt;li>&lt;code>vet&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>などがあります。&lt;/p>
&lt;p>中でも、Goのコードをコンパイルするための&lt;code>build&lt;/code>コマンドは、
みなさんも日頃の開発で使用しているのではないでしょうか。&lt;/p>
&lt;p>&lt;code>build&lt;/code>は特に難しいことをしなければ、とてもシンプルに使えるコマンドです。&lt;br>
よって、直感的に「こうすればコンパイルできるんでしょー」くらいの感覚で、
ドキュメントを注視しなくても使い始められるでしょう。&lt;/p>
&lt;p>しかし、&lt;code>build&lt;/code>は深く見ていくと意外と奥が深いコマンドです。&lt;br>
今回はそんな&lt;code>build&lt;/code>について深ぼっていこうと思います。&lt;/p>
&lt;h1 id="buildコマンドとは">&lt;code>build&lt;/code>コマンドとは&lt;/h1>
&lt;p>まずは&lt;code>build&lt;/code>とはどういったコマンドなのか見ていきましょう。&lt;/p>
&lt;p>&lt;code>help&lt;/code>を使って調べてみます。&lt;/p>
&lt;pre>&lt;code class="language-shell">$ go help build
Build compiles the packages named by the import paths,
along with their dependencies, but it does not install the results.
&amp;lt;省略&amp;gt;
When compiling packages, build ignores files that end in '_test.go'.
&amp;lt;省略&amp;gt;
When compiling multiple packages or a single non-main package,
build compiles the packages but discards the resulting object,
serving only as a check that the packages can be built.
&amp;lt;省略&amp;gt;
-tags tag,list
a comma-separated list of build tags to consider satisfied during the
build. For more information about build tags, see the description of
build constraints in the documentation for the go/build package.
(Earlier versions of Go used a space-separated list, and that form
is deprecated but still recognized.)
&amp;lt;省略&amp;gt;
&lt;/code>&lt;/pre>
&lt;p>&lt;code>build&lt;/code>はコンパイルするやつですよという文章から始まり、
いろいろ書かれていますが、今回は以下の4点について見てみます。&lt;/p></description></item><item><title>【2020年】アクティビティまとめ</title><link>https://tech.yyh-gl.dev/blog/activity-2020/</link><pubDate>Tue, 23 Feb 2021 18:41:54 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/activity-2020/</guid><description>&lt;h1 id="laprasでおもしろい機能を見つけた">LAPRASでおもしろい機能を見つけた&lt;/h1>
&lt;p>&lt;a href="https://lapras.com/" target="_blank" rel="noopener noreferrer">LAPRAS&lt;/a>
に2020年のアクティビティをまとめてくれる機能がありました。&lt;br>
今回はその機能を使って（今さらながら）去年のアクティビティをメモしておきたいと思います。&lt;br>&lt;/p>
&lt;p>以下、LAPRASで出力されたアクティビティを転記したものです。&lt;/p>
&lt;p>・&lt;/p>
&lt;p>・&lt;/p>
&lt;p>・&lt;/p>
&lt;h1 id="2020年のアウトプットと参加イベントを振り返ると">2020年のアウトプットと参加イベントを振り返ると&lt;/h1>
&lt;p>今年アウトプットしたものや参加したイベントなどをまとめてみました。&lt;/p>
&lt;h2 id="connpass">connpass&lt;/h2>
&lt;!-- textlint-disable -->
&lt;ul>
&lt;li>2020/12/23
&lt;ul>
&lt;li>&lt;a href="https://serverless-newworld.connpass.com/event/198997/" target="_blank" rel="noopener noreferrer">サーバーレスアンチパターン今昔物語 第八夜 サーバーレスゆく年くる年2020/2021&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/12/22
&lt;ul>
&lt;li>&lt;a href="https://mercari.connpass.com/event/197356/" target="_blank" rel="noopener noreferrer">merpay Tech Talk｜QAx DevOps/マイクロサービス/Backend vol.2&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/12/21
&lt;ul>
&lt;li>&lt;a href="https://mercari.connpass.com/event/198574/" target="_blank" rel="noopener noreferrer">Software Design 1月号［第1特集］Goプログラミングスキルをレベルアップ執筆者座談会&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/12/19
&lt;ul>
&lt;li>&lt;a href="https://ddd-community-jp.connpass.com/event/198329/" target="_blank" rel="noopener noreferrer">エリック・エヴァンスのドメイン駆動設計 輪読会「第7章 言語を使用する：応用例」&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/12/16
&lt;ul>
&lt;li>&lt;a href="https://gospecreading.connpass.com/event/198876/" target="_blank" rel="noopener noreferrer">Go Language Specification輪読会 #12&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/12/15
&lt;ul>
&lt;li>&lt;a href="https://forkwell.connpass.com/event/194828/" target="_blank" rel="noopener noreferrer">Front-End Study #2「Performance Tuning in depth（仮）」&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/12/09
&lt;ul>
&lt;li>&lt;a href="https://gospecreading.connpass.com/event/197221/" target="_blank" rel="noopener noreferrer">Go Language Specification輪読会 #11&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/12/05
&lt;ul>
&lt;li>&lt;a href="https://ddd-community-jp.connpass.com/event/196732/" target="_blank" rel="noopener noreferrer">エリック・エヴァンスのドメイン駆動設計 輪読会「第6章 ドメインオブジェクトのライフサイクル」後編&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/12/03
&lt;ul>
&lt;li>&lt;a href="https://mercari.connpass.com/event/195066/" target="_blank" rel="noopener noreferrer">merpay Tech Talk ~ 決済基盤（Payment Platform）Backend裏話&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/11/30
&lt;ul>
&lt;li>&lt;a href="https://dmm.connpass.com/event/195179/" target="_blank" rel="noopener noreferrer">DMM meetup #22 〜DMMのプラットフォームが目指す経済圏とパーソナライズ戦略〜&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/11/27
&lt;ul>
&lt;li>&lt;a href="https://shomado.connpass.com/event/194529/" target="_blank" rel="noopener noreferrer">Sandbox Live 第2回目 〜ゲスト: ミノ駆動さん と とーますさん〜&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/11/27
&lt;ul>
&lt;li>&lt;a href="https://serverless-newworld.connpass.com/event/194966/" target="_blank" rel="noopener noreferrer">サーバーレスアンチパターン今昔物語 第七夜&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/11/26
&lt;ul>
&lt;li>&lt;a href="https://mercari.connpass.com/event/194635/" target="_blank" rel="noopener noreferrer">merpay Tech Talk〜DevOpsxQA、マイクロサービスxQA、BackendxQA〜&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/11/21
&lt;ul>
&lt;li>&lt;a href="https://ddd-community-jp.connpass.com/event/194892/" target="_blank" rel="noopener noreferrer">エリック・エヴァンスのドメイン駆動設計 輪読会「第6章 ドメインオブジェクトのライフサイクル」前編&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/11/18
&lt;ul>
&lt;li>&lt;a href="https://mercari.connpass.com/event/193703/" target="_blank" rel="noopener noreferrer">開発ライブ実況 #7 高難易度Goクイズ大会&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/11/14
&lt;ul>
&lt;li>&lt;a href="https://umedago.connpass.com/event/193373/" target="_blank" rel="noopener noreferrer">Umeda.go 2020 Autumn Online&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/11/11
&lt;ul>
&lt;li>&lt;a href="https://gospecreading.connpass.com/event/193820/" target="_blank" rel="noopener noreferrer">Go Language Specification輪読会 #10&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/11/11
&lt;ul>
&lt;li>&lt;a href="https://shuuu-mai.connpass.com/event/192971/" target="_blank" rel="noopener noreferrer">オンライン開催【シューマイ】Tech Lead Engineerから最新技術を学べ！マネジメント編&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/11/07
&lt;ul>
&lt;li>&lt;a href="https://ddd-community-jp.connpass.com/event/193423/" target="_blank" rel="noopener noreferrer">エリック・エヴァンスのドメイン駆動設計 輪読会「第5章 ソフトウェアで表現されたモデル」（後編）&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/11/05
&lt;ul>
&lt;li>&lt;a href="https://serverless-newworld.connpass.com/event/191711/" target="_blank" rel="noopener noreferrer">Monthly AWS Serverless Update 202011&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/11/04
&lt;ul>
&lt;li>&lt;a href="https://mercari.connpass.com/event/191846/" target="_blank" rel="noopener noreferrer">開発ライブ実況｜メルカリのUIをJetpack Composeで再現してみよう&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/11/02
&lt;ul>
&lt;li>&lt;a href="https://mercari.connpass.com/event/192864/" target="_blank" rel="noopener noreferrer">Gophers Office Hours #14 Goとセキュリティ vol.2&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/10/28
&lt;ul>
&lt;li>&lt;a href="https://gospecreading.connpass.com/event/192435/" target="_blank" rel="noopener noreferrer">Go Language Specification輪読会 #9&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/10/24
&lt;ul>
&lt;li>&lt;a href="https://ddd-community-jp.connpass.com/event/191946/" target="_blank" rel="noopener noreferrer">エリック・エヴァンスのドメイン駆動設計 輪読会「第5章 ソフトウェアで表現されたモデル」（前編）&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/10/23
&lt;ul>
&lt;li>&lt;a href="https://ginza-rails.connpass.com/event/189892/" target="_blank" rel="noopener noreferrer">【オンライン開催】銀座Rails#26@リンクアンドモチベーション&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/10/22
&lt;ul>
&lt;li>&lt;a href="https://serverless-newworld.connpass.com/event/190648/" target="_blank" rel="noopener noreferrer">サーバーレスアンチパターン今昔物語 第六夜&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/10/19
&lt;ul>
&lt;li>&lt;a href="https://mercari.connpass.com/event/191408/" target="_blank" rel="noopener noreferrer">Gophers Office Hours #13 〜セキュリティ回〜&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/10/14
&lt;ul>
&lt;li>&lt;a href="https://gospecreading.connpass.com/event/190833/" target="_blank" rel="noopener noreferrer">Go Language Specification輪読会 #8&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/10/13
&lt;ul>
&lt;li>&lt;a href="https://mercari.connpass.com/event/189445/" target="_blank" rel="noopener noreferrer">Gophers Office Hours #12 〜IoT, スマートホーム回〜&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/10/10
&lt;ul>
&lt;li>&lt;a href="https://ddd-community-jp.connpass.com/event/190629/" target="_blank" rel="noopener noreferrer">エリック・エヴァンスのドメイン駆動設計 輪読会「第4章 ドメインを隔離する」&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/10/10
&lt;ul>
&lt;li>&lt;a href="https://sendaigo.connpass.com/event/185474/" target="_blank" rel="noopener noreferrer">Go Conference &amp;lsquo;20 in Autumun SENDAI&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/10/09
&lt;ul>
&lt;li>&lt;a href="https://voyagegroup.connpass.com/event/190036/" target="_blank" rel="noopener noreferrer">そーだいなるVOYAGE GROUPの裏側 #Zucks フルサイクル開発者の文化&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/09/30
&lt;ul>
&lt;li>&lt;a href="https://gospecreading.connpass.com/event/189546/" target="_blank" rel="noopener noreferrer">Go Language Specification輪読会 #7&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/09/29
&lt;ul>
&lt;li>&lt;a href="https://serverless-newworld.connpass.com/event/188784/" target="_blank" rel="noopener noreferrer">サーバーレスアンチパターン今昔物語 第五夜 - 解体新書 -&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/09/26
&lt;ul>
&lt;li>&lt;a href="https://ddd-community-jp.connpass.com/event/188787/" target="_blank" rel="noopener noreferrer">エリック・エヴァンスのドメイン駆動設計 輪読会「第3章 モデルと実装を結びつける」&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/09/25
&lt;ul>
&lt;li>&lt;a href="https://mediado-go.connpass.com/event/186625/" target="_blank" rel="noopener noreferrer">MediaDo.go #2&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/09/23
&lt;ul>
&lt;li>&lt;a href="https://shuuu-mai.connpass.com/event/187657/" target="_blank" rel="noopener noreferrer">オンライン開催【シューマイ】Tech Lead Engineerから最新技術を学べ！Go編&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/09/23
&lt;ul>
&lt;li>&lt;a href="https://serverless-newworld.connpass.com/event/189691/" target="_blank" rel="noopener noreferrer">サーバーレスアンチパターン今昔物語 番外編&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/09/16
&lt;ul>
&lt;li>&lt;a href="https://gospecreading.connpass.com/event/188064/" target="_blank" rel="noopener noreferrer">Go Language Specification輪読会 #6&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/09/16
&lt;ul>
&lt;li>&lt;a href="https://mercari.connpass.com/event/188595/" target="_blank" rel="noopener noreferrer">開発ライブ実況 #5 デバッグしているところを見てみよう (メルペイBackendエンジニア)&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/09/09
&lt;ul>
&lt;li>&lt;a href="https://serverless-newworld.connpass.com/event/187317/" target="_blank" rel="noopener noreferrer">サーバーレスアンチパターン今昔物語 第四夜 - 夏の残り香 -&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/09/08
&lt;ul>
&lt;li>&lt;a href="https://mercari.connpass.com/event/186823/" target="_blank" rel="noopener noreferrer">Gophers Office Hours #10 〜コンパイラ、低レイヤ回 vol.2〜&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/09/05
&lt;ul>
&lt;li>&lt;a href="https://ddd-community-jp.connpass.com/event/186935/" target="_blank" rel="noopener noreferrer">エリック・エヴァンスのドメイン駆動設計 輪読会「第2章 コミュニケーションと言語の使い方」&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/09/02
&lt;ul>
&lt;li>&lt;a href="https://gospecreading.connpass.com/event/186586/" target="_blank" rel="noopener noreferrer">Go Language Specification輪読会 #5&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/08/31
&lt;ul>
&lt;li>&lt;a href="https://gocon.connpass.com/event/186317/" target="_blank" rel="noopener noreferrer">(Online only) Go 1.15 Release Party in Japan&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/08/25
&lt;ul>
&lt;li>&lt;a href="https://mercari.connpass.com/event/184393/" target="_blank" rel="noopener noreferrer">Gophers Office Hours #9 〜静的解析回〜&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/08/22
&lt;ul>
&lt;li>&lt;a href="https://ddd-community-jp.connpass.com/event/185933/" target="_blank" rel="noopener noreferrer">エリック・エヴァンスのドメイン駆動設計 輪読会「第1章 知識をかみ砕く」&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/08/19
&lt;ul>
&lt;li>&lt;a href="https://gospecreading.connpass.com/event/185252/" target="_blank" rel="noopener noreferrer">Go Language Specification輪読会 #4&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/08/18
&lt;ul>
&lt;li>&lt;a href="https://mercari.connpass.com/event/184388/" target="_blank" rel="noopener noreferrer">Gophers Office Hours #8 〜自作コンパイラ、低レイヤ回〜&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/08/12
&lt;ul>
&lt;li>&lt;a href="https://mercari.connpass.com/event/184412/" target="_blank" rel="noopener noreferrer">開発ライブ実況#3 エディタの設定しない人編 byメルペイExpertチームBackendエンジニア&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/08/11
&lt;ul>
&lt;li>&lt;a href="https://mercari.connpass.com/event/184391/" target="_blank" rel="noopener noreferrer">Gophers Office Hours #7 〜とにかく溜まった質問に答える回〜&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/08/08
&lt;ul>
&lt;li>&lt;a href="https://ddd-community-jp.connpass.com/event/185352/" target="_blank" rel="noopener noreferrer">エリック・エヴァンスのドメイン駆動設計 輪読会 1回「序文、目次、索引」&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/08/06
&lt;ul>
&lt;li>&lt;a href="https://mercari.connpass.com/event/183796/" target="_blank" rel="noopener noreferrer">mercari.go #14 オンライン開催&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/08/05
&lt;ul>
&lt;li>&lt;a href="https://gospecreading.connpass.com/event/183910/" target="_blank" rel="noopener noreferrer">Go Language Specification輪読会 #3&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/08/01
&lt;ul>
&lt;li>&lt;a href="https://tddbc.connpass.com/event/181973/" target="_blank" rel="noopener noreferrer">TDD Boot Camp 2020 Online #1&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/07/29
&lt;ul>
&lt;li>&lt;a href="https://mercari.connpass.com/event/182476/" target="_blank" rel="noopener noreferrer">開発ライブ実況 #2 〜メルペイ Solutionsチーム デフォルト好きエンジニア〜&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/07/28
&lt;ul>
&lt;li>&lt;a href="https://mercari.connpass.com/event/182256/" target="_blank" rel="noopener noreferrer">Gophers Office Hours #6 〜gRPC回〜&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/07/22
&lt;ul>
&lt;li>&lt;a href="https://gospecreading.connpass.com/event/182427/" target="_blank" rel="noopener noreferrer">Go Language Specification輪読会 #2&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/07/18
&lt;ul>
&lt;li>&lt;a href="https://zli.connpass.com/event/179865/" target="_blank" rel="noopener noreferrer">Zli × DMM 合同LT&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/07/18
&lt;ul>
&lt;li>&lt;a href="https://runtime.connpass.com/event/180172/" target="_blank" rel="noopener noreferrer">Container Runtime Meetup #2&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/07/15
&lt;ul>
&lt;li>&lt;a href="https://mercari.connpass.com/event/181012/" target="_blank" rel="noopener noreferrer">開発ライブ実況 〜メルペイ Architectチーム Backend Engineer〜&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/07/14
&lt;ul>
&lt;li>&lt;a href="https://mercari.connpass.com/event/181738/" target="_blank" rel="noopener noreferrer">Gophers Office Hours #5 〜API、アーキテクチャ回〜&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/07/14
&lt;ul>
&lt;li>&lt;a href="https://fukuokago.connpass.com/event/180414/" target="_blank" rel="noopener noreferrer">Fukuoka.go#16 (オンライン開催)&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/07/09
&lt;ul>
&lt;li>&lt;a href="https://serverless-newworld.connpass.com/event/181539/" target="_blank" rel="noopener noreferrer">サーバーレスアンチパターン今昔物語&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/07/08
&lt;ul>
&lt;li>&lt;a href="https://gostaticanalysis.connpass.com/event/182307/" target="_blank" rel="noopener noreferrer">go/analysisでテストファイルかどうか確かめる方法について説明する会&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/07/08
&lt;ul>
&lt;li>&lt;a href="https://kyotogo.connpass.com/event/180782/" target="_blank" rel="noopener noreferrer">Kyoto.go remote #6&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/07/08
&lt;ul>
&lt;li>&lt;a href="https://gospecreading.connpass.com/event/181316/" target="_blank" rel="noopener noreferrer">Go Language Specification輪読会 #1&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/06/30
&lt;ul>
&lt;li>&lt;a href="https://mercari.connpass.com/event/179196/" target="_blank" rel="noopener noreferrer">【オンライン】Mercari Gophers Office Hours_6/30&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/06/26
&lt;ul>
&lt;li>&lt;a href="https://mercari.connpass.com/event/180488/" target="_blank" rel="noopener noreferrer">#7 Open Go Friday Online&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/06/24
&lt;ul>
&lt;li>&lt;a href="https://kyotogo.connpass.com/event/179917/" target="_blank" rel="noopener noreferrer">Kyoto.go remote #5&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/06/23
&lt;ul>
&lt;li>&lt;a href="https://mercari.connpass.com/event/178725/" target="_blank" rel="noopener noreferrer">【オンライン】Mercari Gophers Office Hours_6/23&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/06/20
&lt;ul>
&lt;li>&lt;a href="https://nrs-seminar.connpass.com/event/179556/" target="_blank" rel="noopener noreferrer">コードを読もうぜ！～Laravel編～&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/06/10
&lt;ul>
&lt;li>&lt;a href="https://kyotogo.connpass.com/event/177094/" target="_blank" rel="noopener noreferrer">Kyoto.go remote #4&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/06/03
&lt;ul>
&lt;li>&lt;a href="https://mercari.connpass.com/event/174255/" target="_blank" rel="noopener noreferrer">【オンライン】プログラミング言語Go完全入門 質問会&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/05/29
&lt;ul>
&lt;li>&lt;a href="https://gcpug-tokyo.connpass.com/event/175174/" target="_blank" rel="noopener noreferrer">【オンライン開催】GCPUG Tokyo Spanner Day May 2020&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/05/15
&lt;ul>
&lt;li>&lt;a href="https://dmm.connpass.com/event/165864/" target="_blank" rel="noopener noreferrer">【オンライン開催】DMM.go #2&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/05/06
&lt;ul>
&lt;li>&lt;a href="https://nrs-seminar.connpass.com/event/175302/" target="_blank" rel="noopener noreferrer">チームリーディング　フロントエンドコンポーネントの指針【オンライン】&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/05/04
&lt;ul>
&lt;li>&lt;a href="https://ddd-community-jp.connpass.com/event/174617/" target="_blank" rel="noopener noreferrer">テスト駆動開発(TDD)オンライン勉強会 #1 「TDD入門」&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/05/02
&lt;ul>
&lt;li>&lt;a href="https://nrs-seminar.connpass.com/event/174000/" target="_blank" rel="noopener noreferrer">【オンライン】実践クリーンアーキテクチャ&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/04/20
&lt;ul>
&lt;li>&lt;a href="https://ddd-community-jp.connpass.com/event/172834/" target="_blank" rel="noopener noreferrer">DDD Talk MeetUp Online #0&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/04/16
&lt;ul>
&lt;li>&lt;a href="https://ddd-community-jp.connpass.com/event/172827/" target="_blank" rel="noopener noreferrer">DDDオンライン勉強会 #4「DDDのアーキテクチャ」&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/03/29
&lt;ul>
&lt;li>&lt;a href="https://ddd-community-jp.connpass.com/event/171151/" target="_blank" rel="noopener noreferrer">DDDオンライン勉強会 「設計の基本原則&amp;quot;高凝集・低結合&amp;quot;とアーキテクチャ」&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/03/15
&lt;ul>
&lt;li>&lt;a href="https://ddd-community-jp.connpass.com/event/170393/" target="_blank" rel="noopener noreferrer">DDDオンライン勉強会 「集約・境界付けられたコンテキスト・設計の基本原則」&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/03/08
&lt;ul>
&lt;li>&lt;a href="https://ddd-community-jp.connpass.com/event/168674/" target="_blank" rel="noopener noreferrer">ドメイン駆動設計 モデリング/実装入門勉強会(オンライン)&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/02/27
&lt;ul>
&lt;li>&lt;a href="https://gorilla-go.connpass.com/event/165986/" target="_blank" rel="noopener noreferrer">ゴリラ.Go #1&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/02/16
&lt;ul>
&lt;li>&lt;a href="https://ooc.connpass.com/event/129167/" target="_blank" rel="noopener noreferrer">Object-Oriented Conference&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/02/16
&lt;ul>
&lt;li>&lt;a href="https://ooc.connpass.com/event/157193/" target="_blank" rel="noopener noreferrer">（本募集）Object-Oriented Conference&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/02/10
&lt;ul>
&lt;li>&lt;a href="https://mercari.connpass.com/event/164374/" target="_blank" rel="noopener noreferrer">mercari.go #13&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/01/28
&lt;ul>
&lt;li>&lt;a href="https://dena.connpass.com/event/160018/" target="_blank" rel="noopener noreferrer">DeNA.go #4&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/01/23
&lt;ul>
&lt;li>&lt;a href="https://dmm.connpass.com/event/157222/" target="_blank" rel="noopener noreferrer">DMM.go #1&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/01/10
&lt;ul>
&lt;li>&lt;a href="https://ddd-community-jp.connpass.com/event/155178/" target="_blank" rel="noopener noreferrer">DDD Talk MeetUp #3&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="github">Github&lt;/h2>
&lt;ul>
&lt;li>2020/09/22
&lt;ul>
&lt;li>&lt;a href="https://github.com/yyh-gl/delsla" target="_blank" rel="noopener noreferrer">yyh-gl/delsla&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/09/07
&lt;ul>
&lt;li>&lt;a href="https://github.com/yyh-gl/go-flat-package" target="_blank" rel="noopener noreferrer">yyh-gl/go-flat-package&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/08/27
&lt;ul>
&lt;li>&lt;a href="https://github.com/yyh-gl/real-env-recorder" target="_blank" rel="noopener noreferrer">yyh-gl/real-env-recorder&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/08/24
&lt;ul>
&lt;li>&lt;a href="https://github.com/yyh-gl/yyh-gl" target="_blank" rel="noopener noreferrer">yyh-gl/yyh-gl&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/08/02
&lt;ul>
&lt;li>&lt;a href="https://github.com/yyh-gl/akindo" target="_blank" rel="noopener noreferrer">yyh-gl/akindo&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/08/01
&lt;ul>
&lt;li>&lt;a href="https://github.com/yyh-gl/tdd_handson" target="_blank" rel="noopener noreferrer">yyh-gl/tdd_handson&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/07/19
&lt;ul>
&lt;li>&lt;a href="https://github.com/yyh-gl/tdd_handson_demo" target="_blank" rel="noopener noreferrer">yyh-gl/tdd_handson_demo&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/06/21
&lt;ul>
&lt;li>&lt;a href="https://github.com/Ladicle/tcardgen" target="_blank" rel="noopener noreferrer">Ladicle/tcardgen&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/06/12
&lt;ul>
&lt;li>&lt;a href="https://github.com/yyh-gl/go-ec2" target="_blank" rel="noopener noreferrer">yyh-gl/go-ec2&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/05/26
&lt;ul>
&lt;li>&lt;a href="https://github.com/yyh-gl/gocr" target="_blank" rel="noopener noreferrer">yyh-gl/gocr&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/05/17
&lt;ul>
&lt;li>&lt;a href="https://github.com/yyh-gl/go-playground" target="_blank" rel="noopener noreferrer">yyh-gl/go-playground&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/05/14
&lt;ul>
&lt;li>&lt;a href="https://github.com/yyh-gl/goa-tutorial" target="_blank" rel="noopener noreferrer">yyh-gl/goa-tutorial&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/04/11
&lt;ul>
&lt;li>&lt;a href="https://github.com/yyh-gl/go-starter-kit" target="_blank" rel="noopener noreferrer">yyh-gl/go-starter-kit&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>2020/01/24
&lt;ul>
&lt;li>&lt;a href="https://github.com/yyh-gl/go-assembler" target="_blank" rel="noopener noreferrer">yyh-gl/go-assembler&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>&lt;a href="https://lapras.com/" title="LAPRASポートフォリオはこちらから" target="_blank" rel="noopener noreferrer">LAPRASポートフォリオはこちらから&lt;/a>
&lt;/p></description></item><item><title>【GitHub Actions】GitHubのプロフィールを自動更新する仕組みを作った</title><link>https://tech.yyh-gl.dev/blog/profile-readme-updater/</link><pubDate>Fri, 19 Feb 2021 18:53:19 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/profile-readme-updater/</guid><description>&lt;h1 id="おもしろいツイートを見つけた">おもしろいツイートを見つけた&lt;/h1>
&lt;blockquote class="twitter-tweet">&lt;p lang="ja" dir="ltr">GitHub ActionsでQiita/Zennの投稿をGitHubプロフィールに自動反映できるようにした &lt;a href="https://t.co/o47E7YHSsx">pic.twitter.com/o47E7YHSsx&lt;/a>&lt;/p>&amp;mdash; mikkame (@mikkameee) &lt;a href="https://twitter.com/mikkameee/status/1360887240587571201?ref_src=twsrc%5Etfw">February 14, 2021&lt;/a>&lt;/blockquote> &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8">&lt;/script>
&lt;p>とても便利そうだったので僕もやってみました。&lt;/p>
&lt;h1 id="作った">作った&lt;/h1>
&lt;img src="https://tech.yyh-gl.dev/img/2021/02/profile-readme-updater/profile.webp" width="600">
&lt;p>↑こんな感じで &lt;code>Recent posts - Blog 📝&lt;/code> に直近5個のブログ記事を表示するようにして、&lt;br>
なおかつ自動で更新されるようにしました。&lt;/p>
&lt;p>コードは&lt;a href="https://github.com/yyh-gl/yyh-gl" target="_blank" rel="noopener noreferrer">こちら&lt;/a>
に置いてあります。&lt;/p>
&lt;p>やっていることはとてもシンプルで、&lt;br>
Goで書いたプロフィール（README）更新スクリプトをGitHub Actionsで実行しているだけです。&lt;/p>
&lt;p>興味あったらコードを覗いてみてください。&lt;/p></description></item><item><title>The Go Programming Language Specificationで知った「こんなことできるだ」を紹介</title><link>https://tech.yyh-gl.dev/blog/uncredible-codes-from-go-spec/</link><pubDate>Tue, 08 Dec 2020 09:00:00 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/uncredible-codes-from-go-spec/</guid><description>&lt;p>本記事は『&lt;a href="https://qiita.com/advent-calendar/2020/go5" target="_blank" rel="noopener noreferrer">Go 5 Advent Calendar 2020 8日目&lt;/a>
』の記事です。&lt;/p>
&lt;h1 id="go-language-specification輪読会">Go Language Specification輪読会&lt;/h1>
&lt;p>現在、&lt;a href="https://gospecreading.connpass.com/" target="_blank" rel="noopener noreferrer">Go Language Specification輪読会&lt;/a>
という、
&lt;a href="https://golang.org/ref/spec" target="_blank" rel="noopener noreferrer">Goの言語仕様&lt;/a>
を読んでいく会に参加しています。&lt;/p>
&lt;p>今回は、そんな輪読会で「こんなことできるんだ」と驚いたコードを紹介します。&lt;br>
（振り返ると結構たくさんあったので、今回はその中から5個選んで紹介します）&lt;/p>
&lt;p>&lt;strong>ちなみに、だいたいのコードは現場で使うと怒られそうです😇&lt;/strong> &lt;br>
（いや、まず間違いなく怒られる）&lt;/p>
&lt;h1 id="1-comments">1. Comments&lt;/h1>
&lt;pre>&lt;code class="language-go">package main
import (
&amp;quot;fmt&amp;quot;
)
func main() {
var/*comment*/a = 1
fmt.Println(a)
}
&lt;/code>&lt;/pre>
&lt;p>&lt;a href="https://play.golang.org/p/9Dun0LiT5N5" target="_blank" rel="noopener noreferrer">https://play.golang.org/p/9Dun0LiT5N5&lt;/a>
&lt;/p>
&lt;p>まずはこちら。&lt;br>
変な位置にコメントが挿入されています。&lt;br>
コメント部分を消すと&lt;code>vara = 1&lt;/code>となるのでエラーになりそうです。&lt;/p>
&lt;p>しかし、実行してみると、すんなりと変数&lt;code>a&lt;/code>を表示してくれます。&lt;/p>
&lt;h2 id="解説">解説&lt;/h2>
&lt;p>&lt;a href="https://golang.org/ref/spec#Comments" target="_blank" rel="noopener noreferrer">Spec&lt;/a>
を参照すると以下の一文があります。&lt;/p>
&lt;blockquote>
&lt;p>A general comment containing no newlines acts like a space.&lt;/p>
&lt;p>改行を含まないgeneral commentはスペースのように作用する。&lt;/p>&lt;/blockquote>
&lt;p>（general commentとは&lt;code>/**/&lt;/code>で囲われたコメントのことを指します）&lt;/p>
&lt;p>よって、先程のコードは以下と同じということです。&lt;/p>
&lt;pre>&lt;code class="language-go">package main
import (
&amp;quot;fmt&amp;quot;
)
func main() {
var a = 1
fmt.Println(a)
}
&lt;/code>&lt;/pre>
&lt;p>こうして変換してみると、エラーでないことは明白ですね。&lt;/p></description></item><item><title>ブログの画像をWebPに変えた話とSafariで表示されない件について</title><link>https://tech.yyh-gl.dev/blog/support-webp/</link><pubDate>Thu, 26 Nov 2020 13:50:31 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/support-webp/</guid><description>&lt;h1 id="画像の形式をwebpに変えた">画像の形式をWebPに変えた&lt;/h1>
&lt;p>本ブログにて、Lighthouse使ってみると、表示速度あたりで怒られていたので、&lt;br>
まずはサムネ画像をWebPに変えてみました。&lt;/p>
&lt;p>WebPとは、Googleが開発しているオープンな静止画像フォーマットで、&lt;br>
トラフィック量軽減と表示速度短縮を目的しています。 （&lt;a href="https://ja.wikipedia.org/wiki/WebP" target="_blank" rel="noopener noreferrer">wikiから拝借&lt;/a>
）&lt;/p>
&lt;h1 id="webpを採用した結果">WebPを採用した結果&lt;/h1>
&lt;p>以下のツイートのとおりです。&lt;/p>
&lt;p>たまたま100が撮れただけで、もう一回テストしみると少し落ちました。&lt;br>
それでも90台はキープできていそうです。&lt;/p>
&lt;blockquote class="twitter-tweet">&lt;p lang="ja" dir="ltr">個人ブログ（Desktop版）のPerformanceが78だったので、画像をwebpに変えたら一気に100になった🎊&lt;br>（モバイルは未だに70切ってる😇） &lt;a href="https://t.co/VNxztIsR28">pic.twitter.com/VNxztIsR28&lt;/a>&lt;/p>&amp;mdash; hon-D (@yyh_gl) &lt;a href="https://twitter.com/yyh_gl/status/1329487413400375296?ref_src=twsrc%5Etfw">November 19, 2020&lt;/a>&lt;/blockquote> &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8">&lt;/script>
&lt;h1 id="safariでは注意が必要">Safariでは注意が必要&lt;/h1>
&lt;p>多くのブラウザでWebPへの対応が既に完了しています。&lt;br>
ただし、Safariに関してはv14でようやく対応しました。&lt;/p>
&lt;p>&lt;a href="https://ja.wikipedia.org/wiki/WebP#%E5%AF%BE%E5%BF%9C%E7%92%B0%E5%A2%83" target="_blank" rel="noopener noreferrer">対応状況&lt;/a>
&lt;/p>
&lt;p>Safari v14は2020年9月17日（日本時間）にリリースされたばかりなので、&lt;br>
まだ画像をちゃんと見れないユーザが多く存在すると思われます。&lt;/p>
&lt;p>&lt;a href="https://developer.apple.com/documentation/safari-release-notes/safari-14-release-notes" target="_blank" rel="noopener noreferrer">リリースノート&lt;/a>
&lt;/p>
&lt;br>
&lt;blockquote class="twitter-tweet">&lt;p lang="ja" dir="ltr">Safariのwebp対応ってバージョン14からだったんだ😇&lt;br>&lt;br>自分のブログに来る人の90%弱がSafariじゃないから、まぁいいか←&lt;/p>&amp;mdash; hon-D (@yyh_gl) &lt;a href="https://twitter.com/yyh_gl/status/1331834104254369794?ref_src=twsrc%5Etfw">November 26, 2020&lt;/a>&lt;/blockquote> &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8">&lt;/script>
&lt;br>
&lt;blockquote>
&lt;p>自分のブログに来る人の90%弱がSafariじゃないから、まぁいいか←&lt;/p>&lt;/blockquote>
&lt;p>嘘です、10%ほどの方々すみません🙇‍♂ &lt;br>
WebPにしたのはサムネ画像だけで、記事本文内の画像はWebPじゃないので許してください。。。&lt;/p></description></item><item><title>【Go】Switch文のfallthroughに関するまとめ</title><link>https://tech.yyh-gl.dev/blog/go-switch-fallthrough/</link><pubDate>Sat, 03 Oct 2020 09:00:00 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/go-switch-fallthrough/</guid><description>&lt;h1 id="fallthrough-とは">fallthrough とは&lt;/h1>
&lt;p>GoではSwitch文でfallthroughという&lt;a href="https://golang.org/ref/spec#Keywords" target="_blank" rel="noopener noreferrer">キーワード&lt;/a>
が使用可能です。&lt;/p>
&lt;p>機能としては、処理を次の節（caseやdefault）に進めます。（&lt;a href="https://github.com/golang/go/wiki/Switch#fall-through" target="_blank" rel="noopener noreferrer">参考&lt;/a>
）&lt;br>
言葉で説明するよりも、サンプルコードを見てもらった方がイメージしやすいと思います。&lt;/p>
&lt;pre>&lt;code class="language-go">package main
import &amp;quot;fmt&amp;quot;
func main() {
num := 1
switch num {
case 1:
fmt.Print(&amp;quot;I &amp;quot;)
fallthrough
case 2:
fmt.Print(&amp;quot;am &amp;quot;)
fallthrough
case 3:
fmt.Println(&amp;quot;yyh-gl.&amp;quot;)
// fallthrough // 次の節がなければコンパイルエラー
}
}
// 実行結果：
// I am yyh-gl.
&lt;/code>&lt;/pre>
&lt;p>&lt;a href="https://play.golang.org/p/FBJKDxbVw5n" target="_blank" rel="noopener noreferrer">Playground&lt;/a>
&lt;/p>
&lt;p>&lt;a href="https://play.golang.org/p/VmfdVwngNGi" target="_blank" rel="noopener noreferrer">defaultにも飛べるという例&lt;/a>
&lt;/p>
&lt;br>
&lt;p>&lt;code>fallthrough&lt;/code>は、Go言語のORMライブラリとして有名な『GORM』でも使用されています。(&lt;a href="https://github.com/go-gorm/gorm/blob/26dd4c980a62d47c990a05da9e5566bff3b2b00c/finisher_api.go#L94" target="_blank" rel="noopener noreferrer">使用箇所&lt;/a>
)&lt;br>&lt;/p></description></item><item><title>texta.fm #1 まとめ</title><link>https://tech.yyh-gl.dev/blog/podcast-matome-texta-200827/</link><pubDate>Thu, 01 Oct 2020 09:00:00 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/podcast-matome-texta-200827/</guid><description>&lt;h1 id="textafm">texta.fm&lt;/h1>
&lt;p>&lt;a href="https://open.spotify.com/episode/1Ka5Fnoe89SyRLPea5twPA" target="_blank" rel="noopener noreferrer">texta.fm #1（2020年8月27日放送分）&lt;/a>
を聞いて、特にDDDについて学びが多かったのでまとめました。&lt;/p>
&lt;p>エヴァンス本を読む前に知っておいた方がいい時代背景、そして、意識すべき点を知ることができるので、&lt;br>
時間があればぜひ実際に聞きに行ってみてください。&lt;/p>
&lt;p>話者：&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://twitter.com/_yasaichi" target="_blank" rel="noopener noreferrer">@_yasaichi&lt;/a>
さん&lt;/li>
&lt;li>&lt;a href="https://twitter.com/t_wada" target="_blank" rel="noopener noreferrer">@t_wada&lt;/a>
さん&lt;/li>
&lt;/ul>
&lt;br>
&lt;p>以降、勉強になった点を抜き出していきます。&lt;br>
なお、&lt;code>&amp;lt;&amp;gt;&lt;/code>内に記載している時間は、記述内容が実際に話されている時間を示しています。&lt;/p>
&lt;h1 id="dddが解決したかった問題">DDDが解決したかった問題&lt;/h1>
&lt;p>&amp;lt;6分30秒ぐらいから&amp;gt;&lt;/p>
&lt;p>エリック・エヴァンスがDDDで解決しようとしていた問題は以下の2点&lt;/p>
&lt;ul>
&lt;li>分析モデルとコード間の乖離：詳細は後述&lt;/li>
&lt;li>ビジネス側と開発側の乖離：ビジネス側の言葉と開発側の言葉が異なることによる開発の複雑化&lt;/li>
&lt;/ul>
&lt;h1 id="分析モデルとコード間の乖離ってなに">分析モデルとコード間の乖離ってなに？&lt;/h1>
&lt;p>&amp;lt;9分45秒ぐらいから&amp;gt;&lt;/p>
&lt;p>2000年代前半はフェーズで区切ったソフトウェア開発が主流だった。&lt;br>
そして、その区切られたフェーズのひとつである「モデリングフェーズ」では、&lt;br>
分析や設計を通してモデルを作り上げていくのであるが、&lt;br>
開発の対象領域をきちんと写し取った抽象的なモデル（分析モデル）を作ることが最大の目的であった。&lt;/p>
&lt;p>しかし、開発フェーズに入った時、分析モデルでは不完全なことが多かった。&lt;br>
よって、開発で使えるように修正が加えられ、最終的には分析モデルとは全く異なるモデルができあがる。&lt;/p>
&lt;p>コードを書かないと分からないこと、実際にシステムが使われ始めないと分からないことがたくさんあるので、当然の結果である。&lt;br>&lt;/p>
&lt;h1 id="解決策改善のループを回そう">解決策：改善のループを回そう&lt;/h1>
&lt;p>&amp;lt;17分20秒ぐらいから&amp;gt;&lt;/p>
&lt;p>分析モデルとコード間の乖離を解決するために、&lt;br>
&lt;b>分析モデル→開発時のモデルの一方通行ではなく、&lt;br>
開発時のモデル↔分析モデルのように両方向にフィードバックする。&lt;/b>&lt;br>
そして、フィードバックをもとに改善のループを回していくことが重要。&lt;br>
（＝アジャイルソフトウェア開発時代の改善ループの回し方）&lt;/p>
&lt;h1 id="今はあまり分析モデルとコード間の乖離が問題にならない">今はあまり分析モデルとコード間の乖離が問題にならない&lt;/h1>
&lt;p>&amp;lt;25分00秒ぐらいから&amp;gt;&lt;/p>
&lt;p>現在ではあまり分析モデルとコード間の乖離が問題にならない。&lt;br>
理由としては、分析モデルの作成フェーズ（モデリングフェーズ）と開発フェーズを担当する人が同じになってきたから。&lt;br>&lt;/p>
&lt;p>昨今の開発ではこうした開発体制が普通になっているので、&lt;br>
そもそも今いる大半のエンジニアにはイメージがつきにくい事象である。&lt;/p>
&lt;p>したがって、現在は、DDDと言われるとビジネス側と開発側の乖離に注目が行きがち。&lt;/p>
&lt;h1 id="エヴァンス本から学ぶべき大事なこと">エヴァンス本から学ぶべき大事なこと&lt;/h1>
&lt;p>&amp;lt;21分40秒ぐらいから&amp;gt;&lt;/p>
&lt;p>コードとドメイン知識間の乖離を無くし、&lt;br>
一致させ続ける反復的作業こそが大事であると訴えたことがとても良かった。&lt;/p>
&lt;p>つまり、先述したとおり、&lt;br>
フィードバックが &lt;b>分析モデル→開発時のモデルの一方通行&lt;/b> だったものを &lt;br>
&lt;b>開発時のモデル↔分析モデルのような両方向&lt;/b> にしようと提唱したことこそが最重要。&lt;/p>
&lt;p>ここを意識して学ぼう！&lt;/p>
&lt;br>
&lt;p>&amp;lt;33分00秒ぐらいから&amp;gt;&lt;/p>
&lt;p>デザインパターンの部分（2部、3部あたり）はもちろん大事であるが、&lt;br>
エヴァンス本の本質的な部分ではない。&lt;/p>
&lt;br></description></item><item><title>【Go+DDD】エンティティと値オブジェクトの実装方法（自己流）</title><link>https://tech.yyh-gl.dev/blog/go-ddd-entity-vo/</link><pubDate>Fri, 08 May 2020 09:00:00 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/go-ddd-entity-vo/</guid><description>&lt;h1 id="goでddd">GoでDDD&lt;/h1>
&lt;p>今担当しているプロジェクトでは、GoでAPIを作っています。&lt;br>
このプロジェクトでは、DDDの考え方や設計パターンも取り入れています。&lt;/p>
&lt;p>今回はDDDの設計パターンの中でもEntityとValue Object（VO）について、&lt;br>
僕がGoでどうやって実装しているのか紹介していきます。&lt;/p>
&lt;h1 id="実装例">実装例&lt;/h1>
&lt;p>兎にも角にも、まずはコードを示します。&lt;/p>
&lt;pre>&lt;code class="language-go">// animal/dog/dog.go
package dog
type Dog struct {
name Name
}
func New(name string) (*Dog, error) {
n, err := newName(name)
if err != nil {
return nil, err
}
return &amp;amp;Dog{
name: *n,
}, nil
}
&lt;/code>&lt;/pre>
&lt;pre>&lt;code class="language-go">// animal/dog/name.go
package dog
import (
&amp;quot;errors&amp;quot;
&amp;quot;unicode/utf8&amp;quot;
)
type Name string
func newName(v string) (*Name, error) {
// 名前は3文字以上というビジネスロジック
if utf8.RuneCountInString(v) &amp;lt; 3 {
return nil, errors.New(&amp;quot;名前は3文字以上！&amp;quot;)
}
n := Name(v)
return &amp;amp;n, nil
}
&lt;/code>&lt;/pre>
&lt;pre>&lt;code class="language-go">// main.go
package main
import (
&amp;quot;fmt&amp;quot;
&amp;quot;playground/animal/dog&amp;quot;
)
func main() {
// d := dog.Dog{name: &amp;quot;犬太郎&amp;quot;} できない
d, _ := dog.New(&amp;quot;犬太郎&amp;quot;) // できる
fmt.Printf(&amp;quot;%+v\n&amp;quot;, d)
d, err := dog.New(&amp;quot;犬&amp;quot;)
if err != nil {
fmt.Println(err) // 犬の名前が「犬」は可愛そうだからできない()
}
}
&lt;/code>&lt;/pre>
&lt;p>&lt;a href="https://play.golang.org/p/cmNp5MlCNuc" target="_blank" rel="noopener noreferrer">playground&lt;/a>
&lt;/p></description></item><item><title>go test におけるキャッシュの消し方</title><link>https://tech.yyh-gl.dev/blog/go-test-cache-clear/</link><pubDate>Thu, 30 Apr 2020 09:00:00 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/go-test-cache-clear/</guid><description>&lt;h1 id="go-test-のキャッシュを消すのは簡単">go test のキャッシュを消すのは簡単&lt;/h1>
&lt;p>&lt;code>$ go clean -testcache&lt;/code>&lt;/p>
&lt;p>以上です！&lt;/p>
&lt;pre>&lt;code class="language-zsh">$ go test ./...
ok github.com/oxequa/realize (cached)
ok github.com/oxequa/realize/realize (cached)
&lt;/code>&lt;/pre>
&lt;p>このように &lt;code>(cached)&lt;/code> となっていたものが、、、&lt;/p>
&lt;pre>&lt;code class="language-zsh">$ go clean -testcache
$ go test ./...
ok github.com/oxequa/realize 0.086s
ok github.com/oxequa/realize/realize 0.389s
&lt;/code>&lt;/pre>
&lt;p>このように、実行時間が表示されており、キャッシュが消えていることが分かりますね。&lt;/p>
&lt;br>
&lt;p>ちなみに、キャッシュを無視する方法はもうひとつあり、&lt;br>
以下のように &lt;code>-count=1&lt;/code> をつけてやればOKです。&lt;/p>
&lt;pre>&lt;code class="language-zsh">$ go test ./... -count=1
ok github.com/oxequa/realize 0.076s
ok github.com/oxequa/realize/realize 0.384s
&lt;/code>&lt;/pre>
&lt;br>
&lt;p>ここからは上記コマンドが一体なにをしてくれたのか、&lt;br>
もう少し詳細に話していきます。&lt;/p>
&lt;h1 id="go-clean-とは">go clean とは&lt;/h1>
&lt;p>&lt;a href="https://golang.org/pkg/cmd/go/internal/clean/" target="_blank" rel="noopener noreferrer">こちら&lt;/a>
にドキュメントがあります。&lt;/p>
&lt;blockquote>
&lt;p>Clean removes object files from package source directories.&lt;/p></description></item><item><title>【Go】jsonパッケージの知っておくと便利な機能</title><link>https://tech.yyh-gl.dev/blog/go-json-tips/</link><pubDate>Sun, 26 Apr 2020 09:00:00 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/go-json-tips/</guid><description>&lt;h1 id="jsonパッケージ">jsonパッケージ&lt;/h1>
&lt;p>Goを触ってる人ならだれもが一度はお世話になるであろう
パッケージ「&lt;a href="https://golang.org/pkg/encoding/json/" target="_blank" rel="noopener noreferrer">json&lt;/a>
」&lt;/p>
&lt;p>今回はそんな json パッケージについて、&lt;br>
知っておくと便利な機能を2つ紹介します。&lt;/p>
&lt;p>（比較的有名なものしかないですが🙏）&lt;/p>
&lt;h1 id="1-独自の変換ロジックを実装できる">1. 独自の変換ロジックを実装できる&lt;/h1>
&lt;p>例えば、下記のコードのように、&lt;br>
ある構造体（&lt;code>Human&lt;/code>）のフィールドを外部公開したくない場合、&lt;br>
jsonパッケージの &lt;code>Unmarshal()&lt;/code>，&lt;code>Marshal()&lt;/code> が使えません。&lt;br>
（上記関数は外部公開されたフィールドのみ変換できる）&lt;/p>
&lt;pre>&lt;code class="language-go">type Human struct {
// フィールドを外部公開したくない
name string
age int
}
func main() {
h := Human{
name: &amp;quot;Taro&amp;quot;,
age: 21,
}
// 構造体 → JSON
j, _ := json.Marshal(h)
fmt.Println(string(j)) // {}
// JSON → 構造体
var uh Human
_ = json.Unmarshal(j, &amp;amp;uh)
fmt.Printf(&amp;quot;%+v\n&amp;quot;, uh) // {name: age:0}
}
&lt;/code>&lt;/pre>
&lt;p>&lt;a href="https://play.golang.org/p/53yg13xW5T7" target="_blank" rel="noopener noreferrer">playgroud&lt;/a>
&lt;/p></description></item><item><title>【Go】errorの同値性と表示について調べた</title><link>https://tech.yyh-gl.dev/blog/error_questions/</link><pubDate>Tue, 10 Mar 2020 09:00:00 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/error_questions/</guid><description>&lt;h1 id="errorについて疑問があった">errorについて疑問があった&lt;/h1>
&lt;p>Goのコードを書いてて、ふと気になったことがあったので調べてみました。&lt;/p>
&lt;h1 id="errorの同値性">errorの同値性&lt;/h1>
&lt;p>1つ目の疑問は、下記コードで e1 と e2 がイコールではないことです。 &lt;br>
（同値性なんて仰々しく言ってすみません。たったこれだけの疑問です😇🙇‍♂️）&lt;/p>
&lt;pre>&lt;code class="language-go">func main() {
e1 := errors.New(&amp;quot;error1&amp;quot;)
e2 := errors.New(&amp;quot;error1&amp;quot;)
e3 := e1
fmt.Println(e1 == e2) // false
fmt.Println(e1 == e3) // true
}
&lt;/code>&lt;/pre>
&lt;p>&lt;a href="https://play.golang.org/p/hwjeo1L6TS1" target="_blank" rel="noopener noreferrer">Playground&lt;/a>
&lt;/p>
&lt;h1 id="結論errorの同値性">結論（errorの同値性）&lt;/h1>
&lt;p>errors.New() が返しているのがポインタでした。&lt;/p>
&lt;p>つまり、さきほどのコードの6行目はポインタの値を比較しているので、そりゃfalseになりますね。&lt;/p>
&lt;h1 id="errorの表示">errorの表示&lt;/h1>
&lt;p>2つ目の疑問は、下記コードで e1 を表示すると、&lt;br>
errors.New()の戻り値である構造体の値ではなく、エラー文言が表示されることです。&lt;/p>
&lt;pre>&lt;code class="language-go">package main
import (
&amp;quot;fmt&amp;quot;
&amp;quot;errors&amp;quot;
)
func main() {
e1 := errors.New(&amp;quot;error1&amp;quot;)
fmt.Println(e1) // error1
}
&lt;/code>&lt;/pre>
&lt;p>&lt;a href="https://play.golang.org/p/z8CQyypo4zX" target="_blank" rel="noopener noreferrer">Playground&lt;/a>
&lt;/p>
&lt;p>errors.New()が返しているのは構造体なので、&lt;br>
下記コードのように構造体の内容が表示されないのはなんでだ？ってなったわけです。&lt;br>&lt;/p>
&lt;pre>&lt;code class="language-go">package main
import &amp;quot;fmt&amp;quot;
func Hoge() interface{} {
type hoge struct {
s string
}
return &amp;amp;hoge{s: &amp;quot;hoge&amp;quot;}
}
func main() {
h := Hoge()
fmt.Println(h) // &amp;amp;{hoge}
}
&lt;/code>&lt;/pre>
&lt;p>&lt;a href="https://play.golang.org/p/_MeqQS420HV" target="_blank" rel="noopener noreferrer">Playground&lt;/a>
&lt;/p></description></item><item><title>【Go】errorsパッケージの中身覗いてみた</title><link>https://tech.yyh-gl.dev/blog/errors_package/</link><pubDate>Mon, 09 Mar 2020 09:00:00 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/errors_package/</guid><description>&lt;h1 id="errorsパッケージに興味持った">errorsパッケージに興味持った&lt;/h1>
&lt;p>v1.13からerrorsパッケージに &lt;code>Unwrap()&lt;/code> &lt;code>Is()&lt;/code> &lt;code>As()&lt;/code> といった関数が追加されました。&lt;br>
（もう1.14もリリースされているのに今さらですね😇）&lt;/p>
&lt;p>今回はこれら3つの関数について、内部実装を追いかけていきます。&lt;/p>
&lt;p>と、その前に、errorsパッケージの概要と関連パッケージについて軽く説明しておきます。&lt;/p>
&lt;h1 id="errorsパッケージと関連パッケージ">errorsパッケージと関連パッケージ&lt;/h1>
&lt;h2 id="errorsパッケージ">errorsパッケージ&lt;/h2>
&lt;p>名前の通り、エラー関連の処理がまとまっているパッケージですね。&lt;br>
Goの標準パッケージです。&lt;br>
→ &lt;a href="https://golang.org/pkg/errors/" target="_blank" rel="noopener noreferrer">GoDoc&lt;/a>
&lt;/p>
&lt;p>v1.13にて、先述の &lt;code>Unwrap()&lt;/code> &lt;code>Is()&lt;/code> &lt;code>As()&lt;/code> という関数たちが追加されました。&lt;br>&lt;/p>
&lt;p>errorを扱うパッケージとして、もうひとつ有名なパッケージがあります。&lt;br>
xerrorsパッケージです。&lt;/p>
&lt;h2 id="xerrorsパッケージ">xerrorsパッケージ&lt;/h2>
&lt;p>&lt;a href="https://godoc.org/golang.org/x/xerrors" target="_blank" rel="noopener noreferrer">xerrors&lt;/a>
とは、
&lt;a href="https://godoc.org/-/subrepo" target="_blank" rel="noopener noreferrer">Goのサブリポジトリ&lt;/a>
で開発が進められているパッケージです。&lt;br>
（準標準パッケージといった感じでしょうか）&lt;/p>
&lt;p>&lt;a href="https://godoc.org/golang.org/x/xerrors" target="_blank" rel="noopener noreferrer">xerrorsのGoDoc&lt;/a>
に下記の記述がある通り、&lt;/p>
&lt;blockquote>
&lt;p>These functions were incorporated into the standard library&amp;rsquo;s errors package in Go 1.13: - Is - As - Unwrap&lt;/p>&lt;/blockquote>
&lt;p>もともとは本パッケージに &lt;code>Unwrap()&lt;/code> &lt;code>Is()&lt;/code> &lt;code>As()&lt;/code> が実装されていましたが、&lt;br>
v1.13にて標準パッケージに取り込まれました。&lt;/p>
&lt;br>
&lt;p>さて、軽くerror関連のパッケージについて触れたところで、&lt;br>
早速、&lt;code>Unwrap()&lt;/code> &lt;code>Is()&lt;/code> &lt;code>As()&lt;/code> の内部実装を見ていきたいと思います。&lt;br>
なお、Goのコードはv1.14.0を参照しています。&lt;/p>
&lt;h1 id="unwrap">&lt;a href="https://golang.org/pkg/errors/#Unwrap" target="_blank" rel="noopener noreferrer">Unwrap()&lt;/a>
&lt;/h1>
&lt;p>ラップされたエラーから中身のエラーを取り出す関数です。&lt;/p>
&lt;p>処理としては下記のようになっています。&lt;/p>
&lt;pre>&lt;code class="language-go">func Unwrap(err error) error {
u, ok := err.(interface {
Unwrap() error
})
if !ok {
return nil
}
return u.Unwrap()
}
&lt;/code>&lt;/pre>
&lt;p>&lt;a href="https://golang.org/src/errors/wrap.go?s=372:400#L14" target="_blank" rel="noopener noreferrer">https://golang.org/src/errors/wrap.go?s=372:400#L14&lt;/a>
&lt;/p></description></item><item><title>Goのバージョン管理について</title><link>https://tech.yyh-gl.dev/blog/go-versions/</link><pubDate>Tue, 03 Mar 2020 09:00:00 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/go-versions/</guid><description>&lt;h1 id="goのバージョン管理">Goのバージョン管理&lt;/h1>
&lt;p>&lt;b>注意1：本記事はGo自体のバージョン管理についてです。Go Modulesなどは対象外です。&lt;/b> &lt;br>
&lt;b>注意2：基本的にMacユーザを対象にしています。（WindowsとLinuxももちろん好きです）&lt;/b>&lt;/p>
&lt;br>
&lt;p>開発において言語のバージョン管理はつきものだと思います。&lt;br>
そのニーズは高く、rbenv や nodenv といったバージョン管理ツールが普及しています。&lt;/p>
&lt;p>ただし、Goの場合は少し話が変わってきます。&lt;br>
もちろんGoでも goenv が用意されていますが、&lt;br>
（今のところ）Goは後方互換性が担保されているので、&lt;b>基本的に最新バージョンに上げ続ければOK&lt;/b>です。&lt;/p>
&lt;br>
&lt;p>…と言いつつも、GAEを使用するといった場合に、どうしてもバージョン管理したくなることがあると思います。&lt;/p>
&lt;p>そこで今回はまずGoのバージョン管理ツールの紹介をした後で、&lt;br>
最新バージョンをインストールする方法を紹介していきたいと思います。&lt;/p>
&lt;h1 id="goのバージョン管理ツール">Goのバージョン管理ツール&lt;/h1>
&lt;h2 id="-goenv">▼ &lt;a href="https://github.com/syndbg/goenv" target="_blank" rel="noopener noreferrer">goenv&lt;/a>
&lt;/h2>
&lt;p>◯◯env系は有名ですよね。&lt;br>
言語のバージョン管理といえばこれです。&lt;/p>
&lt;p>導入手順は&lt;a href="https://github.com/syndbg/goenv/blob/master/INSTALL.md" target="_blank" rel="noopener noreferrer">公式の手順&lt;/a>
通りなので省略します。&lt;/p>
&lt;p>1点はまりどころがあります。&lt;br>
&lt;u>$GOPATHが変わらなくなってしまうという問題&lt;/u>です。&lt;/p>
&lt;p>本件に関しては以前、僕のブログで対処法を書いているので、&lt;br>
&lt;a href="https://tech.yyh-gl.dev/blog/gopath/" target="_blank" rel="noopener noreferrer">こちら&lt;/a>
を参考にしてみてください。&lt;/p>
&lt;h2 id="-go-get公式サイトに記載のある方法">▼ go get（公式サイトに記載のある方法）&lt;/h2>
&lt;p>（バージョン管理&amp;quot;ツール&amp;quot;とは言えませんが…）&lt;/p>
&lt;p>本方法は&lt;a href="https://golang.org/doc/manage-install#installing-multiple" target="_blank" rel="noopener noreferrer">公式サイト&lt;/a>
に
記載されている方法です。&lt;/p>
&lt;pre>&lt;code class="language-zsh">$ go get golang.org/dl/goX.Y.Z
$ goX.Y.Z download
$ goX.Y.Z version
go version goX.Y.Z linux/amd64
&lt;/code>&lt;/pre>
&lt;p>コマンド打つたびに、バージョンまで打つのがめんどくさいという方は、&lt;br>
bash や zsh の設定でエイリアスでも貼ってやればOKですね。&lt;/p>
&lt;h1 id="最新バージョンのインストール方法">最新バージョンのインストール方法&lt;/h1>
&lt;p>冒頭で「基本的に最新バージョンに上げ続ければOK」と述べていたので、&lt;br>
最新バージョンのインストール方法についても言及しておきます。&lt;/p>
&lt;p>特に新しいことはなくいろんなサイトで紹介されているのでさらっと流していきます。&lt;/p>
&lt;h2 id="-homebrew">▼ Homebrew&lt;/h2>
&lt;pre>&lt;code class="language-zsh">$ brew install go
&lt;/code>&lt;/pre>
&lt;p>以上です。&lt;/p></description></item><item><title>【DDD】集約とトランザクション境界について調べたことメモ</title><link>https://tech.yyh-gl.dev/blog/ddd-aggregates-transaction/</link><pubDate>Tue, 18 Feb 2020 09:00:00 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/ddd-aggregates-transaction/</guid><description>&lt;h1 id="簡単まとめシリーズ">簡単まとめシリーズ&lt;/h1>
&lt;p>今回は &lt;b>集約とトランザクション境界&lt;/b> について、&lt;br>
自分のわからないところを調べたので、メモとして残しておきます。&lt;/p>
&lt;h1 id="集約">集約&lt;/h1>
&lt;p>集約の説明を&lt;a href="https://www.amazon.co.jp/gp/product/479815072X" target="_blank" rel="noopener noreferrer">『ドメイン駆動設計入門 ボトムアップでわかる! ドメイン駆動設計の基本』&lt;/a>
から拝借すると、&lt;br>
「データを変更するための単位として扱われるオブジェクトの集まりを集約といいます」とのこと。&lt;/p>
&lt;p>↓ もうすこし具体的に言うと&lt;/p>
&lt;p>DDDではエンティティと値オブジェクトというものがありますが、&lt;br>
値オブジェクトを直接触らず、
エンティティ経由でしか変更しないようにするというものですね。&lt;/p>
&lt;p>このような制限をかけることで、&lt;br>
&lt;b>ひとまとまりにされたオブジェクト間で維持されるべき不変条件を守ることができます。&lt;/b>&lt;/p>
&lt;h1 id="トランザクション境界">トランザクション境界&lt;/h1>
&lt;p>基本的な考えとしては、集約ごとにトランザクションを貼ります。&lt;br>&lt;/p>
&lt;p>↑この基本を守るためにも、理想としては正しいモデリングにより、&lt;br>
正しいトランザクション境界を見つけることが大事です。&lt;/p>
&lt;p>正しいトランザクション境界を見つけることは、不用意に大きなDBロックの発生を防止します。&lt;/p>
&lt;br>
&lt;p>しかしながら、集約をまたいでトランザクション制御したくなるときもあります。&lt;br>
→ &lt;a href="https://kbigwheel.hateblo.jp/entry/2018/12/03/aggregate-and-consistency" target="_blank" rel="noopener noreferrer">参考例&lt;/a>
&lt;/p>
&lt;p>こういうときにどうするか、上記リンクでもいくつかの方法が挙げられています。&lt;br>
他のサイトも調べてみましたが、だいたい同じような方法が出てきました。&lt;/p>
&lt;ol>
&lt;li>結果整合性&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>主流っぽい
&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;ol>
&lt;li>集約をまたいでトランザクションを貼る&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>下記理由のためにあまり推奨されない
&lt;ul>
&lt;li>ロック範囲が大きくなってしまう&lt;/li>
&lt;li>守るべき「データの一貫性の境界」をコード上で表現できなくなる
&lt;ul>
&lt;li>&lt;a href="https://www.pospome.work/entry/20161023/1477206615" target="_blank" rel="noopener noreferrer">参考サイト&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;ol>
&lt;li>複数の集約をさらにまとめた集約をつくる&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>ロック範囲が大きくなってしまうため、あまり推奨されない&lt;/li>
&lt;/ul>
&lt;h1 id="結果整合性">結果整合性&lt;/h1>
&lt;p>結果整合性については、&lt;br>
&lt;a href="https://www.amazon.co.jp/gp/product/479815072X" target="_blank" rel="noopener noreferrer">『ドメイン駆動設計入門 ボトムアップでわかる! ドメイン駆動設計の基本』&lt;/a>
の &lt;br>
12章3説「集約の大きさと操作の単位」で言及されているので、もう少しだけ詳しく調べました。&lt;/p>
&lt;p>結果整合性とは、最終的に整合性の取れていればOKという考え方。&lt;br>
したがって、整合性が取れていない状況が起こり得るが、それは許容する。&lt;/p>
&lt;p>「最終的に整合性を取る」ってどうやるの？&lt;br>
→ &lt;a href="https://qiita.com/j5ik2o/items/ae8a4d3cdaa24afe7599#%E8%A7%A3%E6%B1%BA%E7%AD%962-%E4%B8%80%E6%99%82%E7%9A%84%E3%81%AA%E6%95%B4%E5%90%88%E6%80%A7%E3%81%AE%E7%A0%B4%E7%B6%BB%E3%82%92%E5%8F%97%E3%81%91%E5%85%A5%E3%82%8C%E7%B5%90%E6%9E%9C%E6%95%B4%E5%90%88%E6%80%A7%E3%82%92%E4%BD%BF%E3%81%86%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6" target="_blank" rel="noopener noreferrer">こちら&lt;/a>
が参考になる。&lt;/p>
&lt;h1 id="まとめ">まとめ&lt;/h1>
&lt;p>設計周りの話は、唯一無二の答えがあるわけではありません。&lt;/p>
&lt;p>よって、今回の話においても「データの一貫性の境界」を意識し、&lt;br>
ちゃんとメリットとデメリットを理解した上で最善の解を選択する必要がありますね。&lt;br>&lt;/p>
&lt;h1 id="参考資料">参考資料&lt;/h1>
&lt;ul>
&lt;li>&lt;a href="https://www.amazon.co.jp/gp/product/479815072X" target="_blank" rel="noopener noreferrer">ドメイン駆動設計入門 ボトムアップでわかる! ドメイン駆動設計の基本&lt;/a>
&lt;/li>
&lt;li>&lt;a href="https://www.pospome.work/entry/20161023/1477206615" target="_blank" rel="noopener noreferrer">DDDにおいて、なぜ複数の集約にまたがってトランザクションをかけてはいけないのか（multiple aggregates in one transaction）&lt;/a>
&lt;/li>
&lt;li>&lt;a href="https://dnskimox.hateblo.jp/entry/2018/12/22/154038" target="_blank" rel="noopener noreferrer">集約とトランザクション境界に関するメモ&lt;/a>
&lt;/li>
&lt;li>&lt;a href="https://kbigwheel.hateblo.jp/entry/2018/12/03/aggregate-and-consistency" target="_blank" rel="noopener noreferrer">集約の境界と整合性の維持の仕方に悩んで2ヶ月ぐらい結論を出せていない話&lt;/a>
&lt;/li>
&lt;li>&lt;a href="https://qiita.com/j5ik2o/items/ae8a4d3cdaa24afe7599" target="_blank" rel="noopener noreferrer">集約の境界と整合性問題に関する感想&lt;/a>
&lt;/li>
&lt;/ul></description></item><item><title>【簡単まとめシリーズ】Go1.12からの変更点</title><link>https://tech.yyh-gl.dev/blog/changes-since-go-1-12/</link><pubDate>Mon, 03 Feb 2020 09:00:00 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/changes-since-go-1-12/</guid><description>&lt;h1 id="簡単まとめシリーズ">簡単まとめシリーズ&lt;/h1>
&lt;p>『簡単まとめ』では、僕が記事や書籍で学んだ内容をメモ程度に簡単にまとめていきます📝&lt;/p>
&lt;p>今回は &lt;b>Go1.12からの変更点&lt;/b> についてです。&lt;/p>
&lt;h1 id="the-state-of-go-2020">The State of Go 2020&lt;/h1>
&lt;p>Twitterで『&lt;a href="https://speakerdeck.com/campoy/the-state-of-go-2020" target="_blank" rel="noopener noreferrer">The State of Go 2020&lt;/a>
』というタイトルのスライドを見つけました。&lt;/p>
&lt;p>Go1.12から変わったところに焦点を当て、&lt;br>
Go1.13でどのような機能が追加されているのか、 &lt;br>
Go1.14でどのような機能が追加される予定なのかまとめてあります。&lt;/p>
&lt;p>今回は、完全主観で自分が興味のある内容をハイライトします〜😇&lt;/p>
&lt;h1 id="完全主観ハイライト">完全主観ハイライト&lt;/h1>
&lt;h3 id="-数値まわりの表現方法が増える">▼ 数値まわりの表現方法が増える&lt;/h3>
&lt;p>&lt;a href="https://speakerdeck.com/campoy/the-state-of-go-2020?slide=7" target="_blank" rel="noopener noreferrer">https://speakerdeck.com/campoy/the-state-of-go-2020?slide=7&lt;/a>
&lt;/p>
&lt;h3 id="-interfaceにおける関数の重複が許可される例外あり">▼ interfaceにおける関数の重複が許可される（例外あり）&lt;/h3>
&lt;p>&lt;a href="https://speakerdeck.com/campoy/the-state-of-go-2020?slide=17" target="_blank" rel="noopener noreferrer">https://speakerdeck.com/campoy/the-state-of-go-2020?slide=17&lt;/a>
&lt;/p>
&lt;h3 id="-エラーハンドリングが変わる">▼ エラーハンドリングが変わる&lt;/h3>
&lt;p>&lt;a href="https://speakerdeck.com/campoy/the-state-of-go-2020?slide=26" target="_blank" rel="noopener noreferrer">https://speakerdeck.com/campoy/the-state-of-go-2020?slide=26&lt;/a>
&lt;/p>
&lt;h3 id="-testingパッケージに-cleanup-が追加">▼ testingパッケージに &lt;code>CleanUp()&lt;/code> が追加&lt;/h3>
&lt;p>&lt;a href="https://speakerdeck.com/campoy/the-state-of-go-2020?slide=39" target="_blank" rel="noopener noreferrer">https://speakerdeck.com/campoy/the-state-of-go-2020?slide=39&lt;/a>
&lt;/p>
&lt;h3 id="-go-modules">▼ go modules&lt;/h3>
&lt;p>&lt;a href="https://speakerdeck.com/campoy/the-state-of-go-2020?slide=43" target="_blank" rel="noopener noreferrer">https://speakerdeck.com/campoy/the-state-of-go-2020?slide=43&lt;/a>
&lt;/p>
&lt;h3 id="-配列スライスにおける範囲外指定時のエラーが親切になった">▼ 配列・スライスにおける範囲外指定時のエラーが親切になった&lt;/h3>
&lt;p>&lt;a href="https://speakerdeck.com/campoy/the-state-of-go-2020?slide=50" target="_blank" rel="noopener noreferrer">https://speakerdeck.com/campoy/the-state-of-go-2020?slide=50&lt;/a>
&lt;/p>
&lt;h3 id="-deferが速くなる">▼ deferが速くなる&lt;/h3>
&lt;p>&lt;a href="https://speakerdeck.com/campoy/the-state-of-go-2020?slide=51" target="_blank" rel="noopener noreferrer">https://speakerdeck.com/campoy/the-state-of-go-2020?slide=51&lt;/a>
&lt;/p>
&lt;h3 id="-json関連の処理が速くなる">▼ json関連の処理が速くなる&lt;/h3>
&lt;p>&lt;a href="https://speakerdeck.com/campoy/the-state-of-go-2020?slide=52" target="_blank" rel="noopener noreferrer">https://speakerdeck.com/campoy/the-state-of-go-2020?slide=52&lt;/a>
&lt;/p>
&lt;h3 id="-他にもいろいろ速くなる">▼ 他にもいろいろ速くなる&lt;/h3>
&lt;p>&lt;a href="https://speakerdeck.com/campoy/the-state-of-go-2020?slide=53" target="_blank" rel="noopener noreferrer">https://speakerdeck.com/campoy/the-state-of-go-2020?slide=53&lt;/a>
&lt;/p>
&lt;h3 id="-gopherconの参加者が増えていく様子がえもい">▼ GopherConの参加者が増えていく様子がえもい&lt;/h3>
&lt;p>&lt;a href="https://speakerdeck.com/campoy/the-state-of-go-2020?slide=64" target="_blank" rel="noopener noreferrer">https://speakerdeck.com/campoy/the-state-of-go-2020?slide=64&lt;/a>
&lt;/p></description></item><item><title>【merpay Tech Talk】マイクロサービスの冪等性に関する勉強会</title><link>https://tech.yyh-gl.dev/blog/mercari-tech-talk-idempotency/</link><pubDate>Fri, 20 Dec 2019 09:00:00 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/mercari-tech-talk-idempotency/</guid><description>&lt;h1 id="tech-talk-vol2-backend-engineer-マイクロサービスの冪等性">Tech Talk vol.2 Backend Engineer 〜マイクロサービスの冪等性〜&lt;/h1>
&lt;ul>
&lt;li>&lt;a href="https://mercari.connpass.com/event/157009/" target="_blank" rel="noopener noreferrer">connpass&lt;/a>
&lt;/li>
&lt;li>ハッシュタグ：&lt;a href="https://twitter.com/hashtag/merpay_techtalk" target="_blank" rel="noopener noreferrer">#merpay_techtalk&lt;/a>
&lt;/li>
&lt;li>&lt;a href="https://handsup.cloud/r/VEQvy2o#new-comment" target="_blank" rel="noopener noreferrer">質問板&lt;/a>
&lt;/li>
&lt;/ul>
&lt;p>merpay社で開催された勉強会です。&lt;br>
参加者のツイートも含めてメモを残しておきます。&lt;/p>
&lt;p>かなり雑なのでコンテキストが読み取れないところもあると思いますが、&lt;br>
なにかの参考になれば幸いです。&lt;/p>
&lt;p>（&lt;a href="https://twitter.com/sonatard" target="_blank" rel="noopener noreferrer">@sonatard&lt;/a>
さんの実況にとても助けられました。
ありがとうございました！）&lt;/p>
&lt;h1 id="1-500万ユーザーを支える残高の冪等性">1. 500万ユーザーを支える残高の冪等性&lt;/h1>
&lt;p>登壇者：（@knsh14）&lt;/p>
&lt;p>&lt;s>スライド&lt;/s>&lt;/p>
&lt;p>&lt;a href="https://speakerdeck.com/kazegusuri/builderscon-tokyo-2019-open-skt" target="_blank" rel="noopener noreferrer">参考スライド&lt;/a>
（ベースとなる話は↑これ）&lt;/p>
&lt;h2 id="残高管理サービスbalance-service">残高管理サービス（Balance Service）&lt;/h2>
&lt;p>使ってるDBはCloud Spanner&lt;/p>
&lt;p>外部サービスや他のマイクロサービスには依存してない&lt;/p>
&lt;p>DeleteなしでCRUのみ&lt;/p>
&lt;p>かなりシンプルで冪等性を担保しやすい&lt;/p>
&lt;h2 id="冪等性があるapi">冪等性があるAPI&lt;/h2>
&lt;p>最初に成功した一度だけ処理される&lt;/p>
&lt;p>同じリクエストを何回繰り返しても内部的には処理されない&lt;/p>
&lt;p>何度リクエストしても同じ結果が返ってくる
何度でもリトライできる&lt;/p>
&lt;p>取引IDが保存されていれば既に行われた取引である&lt;/p>
&lt;h2 id="冪等性の担保">冪等性の担保&lt;/h2>
&lt;ul>
&lt;li>冪等性キーが同じ
外部から指定される取引IDのこと&lt;/li>
&lt;li>残高の種類が同じ
ポイント/メイルペイ残高 など&lt;/li>
&lt;li>操作する金額が同じ&lt;/li>
&lt;/ul>
&lt;h2 id="冪等なレスポンス">冪等なレスポンス&lt;/h2>
&lt;ul>
&lt;li>レスポンスはDBから引ける情報で組み立てる&lt;/li>
&lt;li>取引IDから引ける情報
&lt;ul>
&lt;li>取引後残高は返さない&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>&lt;a href="https://twitter.com/matsukaz/status/1207250011391553536" target="_blank" rel="noopener noreferrer">Twitterメモ&lt;/a>
&lt;/p>
&lt;h2 id="冪等なapiでのエラー">冪等なAPIでのエラー&lt;/h2>
&lt;ul>
&lt;li>リトライしても良いエラー：ex. タイムアウト&lt;/li>
&lt;li>リトライだめなエラー：ex. 残高不足&lt;/li>
&lt;/ul>
&lt;h2 id="誰がどう使うのか">誰がどう使うのか？&lt;/h2>
&lt;ul>
&lt;li>リクエストを投げる側の使い方1つで簡単に冪等性が壊れる
→ ex. 取引IDを毎回変えるとか&lt;/li>
&lt;/ul>
&lt;h1 id="2-コード決済における冪等性と整合性">2. コード決済における冪等性と整合性&lt;/h1>
&lt;p>登壇者：（@susho0220）&lt;/p>
&lt;p>&lt;a href="https://speakerdeck.com/susho/number-merpay-techtalk" target="_blank" rel="noopener noreferrer">スライド&lt;/a>
&lt;/p>
&lt;p>モノリスであれば、リクエスト、レスポンス内のトランザクションで整合性を保てる。&lt;/p>
&lt;p>マイクロサービスでは、トランザクションが分かれるため、&lt;br>
決済の進捗状態を保持するDBを用意し、状態を管理 &lt;br>
→ Pending、Authorized、Captured&lt;/p></description></item><item><title>GolangCI-Lintの設定ファイルを理解する</title><link>https://tech.yyh-gl.dev/blog/golangci-lint-custom-settings/</link><pubDate>Mon, 09 Dec 2019 09:00:00 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/golangci-lint-custom-settings/</guid><description>&lt;h1 id="dmm-advent-calendar-2019">DMM Advent Calendar 2019&lt;/h1>
&lt;img src="https://tech.yyh-gl.dev/img/2019/12/react_typescript_sample/qiita_advent_calendar_2019.png" width="700">
&lt;p>本記事は &lt;a href="https://qiita.com/advent-calendar/2019/dmm" target="_blank" rel="noopener noreferrer">DMM Advent Calendar 2019&lt;/a>
の 9日目 の記事です。&lt;/p>
&lt;br>
&lt;p>私は現在、DMM.com の CDS というチームに所属し、&lt;br>
主に&lt;a href="https://inside.dmm.com/archive/category/%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC" target="_blank" rel="noopener noreferrer">ユーザレビュー基盤&lt;/a>
のバックエンドを開発しています。&lt;/p>
&lt;br>
&lt;p>今回は、Go用Linterである GolangCI-Lint を軽く紹介した後に、&lt;br>
GolangCI-Lint のハマリポイントとその解決策である設定周りの話をします。&lt;/p>
&lt;h1 id="linter-導入していますか">Linter 導入していますか？&lt;/h1>
&lt;p>突然ですが、みなさんの開発環境には Linter が導入されているでしょうか？&lt;/p>
&lt;p>私の所属するチームでは、&lt;br>
&lt;u>コーディング規約違反&lt;/u> および &lt;u>コンパイラでは見つけられないエラー&lt;/u> を検知するために、&lt;br>
ローカルと CI において Linter を回すようにしています。&lt;/p>
&lt;h1 id="goにおけるlinter">GoにおけるLinter&lt;/h1>
&lt;p>Goの場合、Linterがデフォルトで用意されているうえに、&lt;br>
ライブラリとして公開されているものも多く存在します。&lt;/p>
&lt;p>なかでも有名なものに以下のようなものがあります。&lt;/p>
&lt;ul>
&lt;li>govet：GoデフォルトのLinter&lt;/li>
&lt;li>errcheck：ちゃんとエラーハンドリングしているかチェックしてくれる&lt;/li>
&lt;li>unused：未使用の定義をチェックしてくれる&lt;/li>
&lt;li>goimports：未使用のimportを消してくれたり、フォーマット修正してくれる&lt;/li>
&lt;li>gosimple：コードをシンプルにしてくれる&lt;/li>
&lt;/ul>
&lt;br>
&lt;p>しかしながら、多すぎるがゆえに &lt;u>どれを選択すればいいのか分からなくなりがちです&lt;/u>。&lt;br>
加えて、導入する Linter が増えれば、その分だけ &lt;u>導入・管理コストが増加&lt;/u> します。&lt;/p>
&lt;p>この問題を解決してくれるツールが &lt;b>GolangCI-Lint&lt;/b> です。&lt;/p>
&lt;h1 id="golangci-lint">GolangCI-Lint&lt;/h1>
&lt;img src="https://tech.yyh-gl.dev/img/2019/12/golangci-lint-custom-settings/golangci-lint-logo.png" width="200">
&lt;p>勉強会でもよく耳にするようになってきている＋多くの紹介記事があるので、&lt;br>
ここで詳しく説明する必要もないかもしれませんが、いちおう少しだけ触れておきます。&lt;/p>
&lt;br>
&lt;p>&lt;a href="https://github.com/golangci/golangci-lint" target="_blank" rel="noopener noreferrer">GolangCI-Lint&lt;/a>
とは、
GoのLinterを一元管理するためのツールです。&lt;br>
開発者は GolangCI-Lint を導入するだけで様々な Linter を実行することができます。&lt;/p></description></item><item><title>【Go+VCR】外部APIとの通信を保存してテストに使用する話</title><link>https://tech.yyh-gl.dev/blog/golang-vcr/</link><pubDate>Sun, 08 Dec 2019 09:00:00 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/golang-vcr/</guid><description>&lt;h1 id="go3-advent-calendar-2019">Go3 Advent Calendar 2019&lt;/h1>
&lt;img src="https://tech.yyh-gl.dev/img/2019/12/react_typescript_sample/qiita_advent_calendar_2019.png" width="700">
&lt;p>本記事は &lt;a href="https://qiita.com/advent-calendar/2019/go3" target="_blank" rel="noopener noreferrer">Go3 Advent Calendar 2019&lt;/a>
の 8日目 の記事です。&lt;/p>
&lt;p>ではでは、早速本題に入っていきます。&lt;/p>
&lt;h1 id="モック使ってますか">モック使ってますか？&lt;/h1>
&lt;p>みなさんモックコードは書いていますか？&lt;/p>
&lt;p>テストコードを書いているなら、ほぼ必ず登場するあのモックです。&lt;br>
DB処理や関数のモックなどいろいろありますよね。&lt;/p>
&lt;p>そんなモックコードですが、作ったり管理するのめんどくさいなぁとか思ってないですか？&lt;br>
モックだからといって雑なコードになっていませんか？&lt;/p>
&lt;br>
&lt;p>今回は、外部API通信のモック化にフォーカスし、&lt;br>
モックコードの作成・管理コストを軽減する &lt;br>
&lt;u>VCR ライブラリ&lt;/u> を紹介します。&lt;/p>
&lt;h1 id="vcr-ライブラリ-とは">VCR ライブラリ とは？&lt;/h1>
&lt;p>VCR（Video Cassette Recorder）とは、&lt;u>通信を保存し、再生するライブラリ&lt;/u>です。&lt;br>&lt;/p>
&lt;p>つまり、APIリクエストの初回通信の内容を保存し、&lt;br>
次回以降その保存内容（レスポンス）を使いまわしてくれるというものです。&lt;/p>
&lt;p>言い換えれば、外部APIのモックを自動生成してくれるということですね！&lt;/p>
&lt;h2 id="vcr-ライブラリ-in-go-world">VCR ライブラリ in Go World&lt;/h2>
&lt;p>Go用のVCRライブラリは&lt;a href="https://github.com/search?l=Go&amp;amp;q=vcr&amp;amp;type=Repositories" target="_blank" rel="noopener noreferrer">いろいろあります&lt;/a>
。&lt;br>
スター数が多いのは以下のものです。&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/dnaeon/go-vcr" target="_blank" rel="noopener noreferrer">go-vcr&lt;/a>
&lt;/li>
&lt;li>&lt;a href="https://github.com/ComboStrikeHQ/vcr-go" target="_blank" rel="noopener noreferrer">vcr-go&lt;/a>
&lt;/li>
&lt;li>&lt;a href="https://github.com/seborama/govcr" target="_blank" rel="noopener noreferrer">govcr&lt;/a>
&lt;/li>
&lt;li>&lt;a href="https://github.com/googleapis/google-cloud-go/tree/master/rpcreplay" target="_blank" rel="noopener noreferrer">rpcreplay&lt;/a>
&lt;/li>
&lt;/ul>
&lt;p>go-vcr および vcr-go，govcr の開発は盛んではないようです。&lt;/p>
&lt;p>rpcreplay は &lt;a href="https://github.com/googleapis/google-cloud-go" target="_blank" rel="noopener noreferrer">google-cloud-go&lt;/a>
に包含されるパッケージであり、安心して使えそうです。&lt;br>
ただし、gRPC 用なので、その点は注意が必要です。&lt;br>
&lt;a href="https://godoc.org/cloud.google.com/go/rpcreplay" target="_blank" rel="noopener noreferrer">GoDocはこちら&lt;/a>
です。&lt;/p>
&lt;br>
&lt;p>今回は REST API を使って説明していくので、go-vcr を使用します。&lt;br>&lt;/p>
&lt;p>go-vcr は、vcr-go と govcr よりスター数が多いです。&lt;br>
Ruby 製の &lt;a href="https://github.com/vcr/vcr" target="_blank" rel="noopener noreferrer">vcr&lt;/a>
というライブラリがもとになっているようです。&lt;/p></description></item><item><title>【React+TypeScript】TypeScript入門</title><link>https://tech.yyh-gl.dev/blog/react_typescript_sample/</link><pubDate>Mon, 02 Dec 2019 09:00:00 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/react_typescript_sample/</guid><description>&lt;h1 id="typescript-advent-calendar-2019">TypeScript Advent Calendar 2019&lt;/h1>
&lt;img src="https://tech.yyh-gl.dev/img/2019/12/react_typescript_sample/qiita_advent_calendar_2019.png" width="700">
&lt;p>本記事は &lt;a href="https://qiita.com/advent-calendar/2019/typescript" target="_blank" rel="noopener noreferrer">TypeScript Advent Calendar 2019&lt;/a>
の 2 日目の記事です。&lt;/p>
&lt;p>内容としては、TypeScript 初級者のための TypeScript 入門です。&lt;/p>
&lt;p>基礎的な内容から入り、&lt;br>
最終的には、企業や個人の技術ブログを参考に、&lt;br>
React の実プロジェクトにおいて、&lt;br>
どのように TypeScript が使われているのか紹介できればと思います。&lt;br>
（APIリクエスト周りのTypeScript活用事例を紹介）&lt;/p>
&lt;p>今日の記事を読んで TypeScript に入門し、&lt;br>
今後の TypeScript Advent Calendar をお楽しみいただけると幸いです！&lt;/p>
&lt;h1 id="基礎編">基礎編&lt;/h1>
&lt;h2 id="typescript-とは">TypeScript とは&lt;/h2>
&lt;img src="https://tech.yyh-gl.dev/img/2019/12/react_typescript_sample/ts.png" width="200">
&lt;p>&lt;a href="https://www.typescriptlang.org/index.html" target="_blank" rel="noopener noreferrer">TypeScript&lt;/a>
は Microsoft 社によって開発され、
現在は &lt;a href="https://github.com/microsoft/TypeScript" target="_blank" rel="noopener noreferrer">OSS&lt;/a>
として開発が進められています。&lt;/p>
&lt;p>「TypeScript とは何か」を簡単に説明すると、&lt;br>
&lt;u>JavaScript に対して、省略も可能な静的型付けとクラスベースオブジェクト指向を加えたスーパーセット&lt;/u> です。&lt;/p>
&lt;p>&lt;a href="https://www.typescriptlang.org/" target="_blank" rel="noopener noreferrer">公式サイト&lt;/a>
はこちらで、&lt;br>
2019年12月2日現在、最新版は 3.7.2 となっています。&lt;/p>
&lt;p>では、実際にコードを交えながら基礎的な部分を説明していきます。&lt;br>
ただし、実践編で使用する内容に絞って説明していきますので、&lt;br>
その点はご了承ください🙇‍&lt;br>
（足りない情報は&lt;a href="https://www.typescriptlang.org/docs/home.html" target="_blank" rel="noopener noreferrer">公式ドキュメント&lt;/a>
を参考にしてください）&lt;/p>
&lt;h2 id="型">型&lt;/h2>
&lt;p>では、早速、TypeScript の型に触れていきましょう。&lt;br>
TypeScript で使用できる基本的な型として以下のものがあります。&lt;/p>
&lt;ul>
&lt;li>Boolean&lt;/li>
&lt;li>Number&lt;/li>
&lt;li>String&lt;/li>
&lt;li>Array&lt;/li>
&lt;li>Tuple&lt;/li>
&lt;li>Enum&lt;/li>
&lt;li>Any&lt;/li>
&lt;li>Void&lt;/li>
&lt;li>Null and Undefined&lt;/li>
&lt;li>Never&lt;/li>
&lt;li>Object&lt;/li>
&lt;/ul>
&lt;p>だいたいの型は他言語でも用意されているので、&lt;br>
説明がなくても理解できると思います。&lt;/p></description></item><item><title>【DeNA.go #3】Go活用事例やパフォーマンスチューニングの話聞いてきた</title><link>https://tech.yyh-gl.dev/blog/denago_3/</link><pubDate>Fri, 01 Nov 2019 09:00:00 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/denago_3/</guid><description>&lt;h1 id="denago-3">DeNA.go #3&lt;/h1>
&lt;ul>
&lt;li>&lt;a href="https://dena.connpass.com/event/150676/" target="_blank" rel="noopener noreferrer">connpass&lt;/a>
&lt;/li>
&lt;li>ハッシュタグ：&lt;a href="https://twitter.com/hashtag/DeNAgo" target="_blank" rel="noopener noreferrer">#DeNAgo&lt;/a>
&lt;/li>
&lt;/ul>
&lt;p>初参加です！&lt;br>
ビールとお弁当もらいました。&lt;/p>
&lt;img src="https://tech.yyh-gl.dev/img/2019/11/denago_3/dinner.JPG" width="450">
&lt;p>そしてなんとなんと &lt;br>
k8sの技術書をいただいちゃいました！！！&lt;br>
もちろんステッカーもありましたよ👍&lt;/p>
&lt;img src="https://tech.yyh-gl.dev/img/2019/11/denago_3/k8s.JPG" width="450">
&lt;h1 id="1-go活用事例安全運転支援サービスを支える運用サイト">1. [Go活用事例]安全運転支援サービスを支える運用サイト&lt;/h1>
&lt;img src="https://tech.yyh-gl.dev/img/2019/11/denago_3/session1.JPG" width="450">
&lt;p>登壇者：@suhirotaka さん &lt;br>
オートモーティブ事業本部スマートドライビング部システム開発グループ&lt;/p>
&lt;p>&lt;a href="https://speakerdeck.com/suhirotaka/gohuo-yong-shi-li-an-quan-yun-zhuan-zhi-yuan-sabisuwozhi-eru-yun-yong-guan-li-sisutemu" target="_blank" rel="noopener noreferrer">スライド&lt;/a>
&lt;/p>
&lt;h2 id="主題">主題&lt;/h2>
&lt;p>管理画面をGoで作成&lt;/p>
&lt;h2 id="railsで作ってるものをgoで作る理由">Railsで作ってるものをGoで作る理由&lt;/h2>
&lt;ul>
&lt;li>実証実験時はスピード重視でRails&lt;/li>
&lt;li>本サービスはパフォーマンス重視でGo&lt;/li>
&lt;/ul>
&lt;p>順次Goに書き換えていく&lt;/p>
&lt;h2 id="goのフレームワーク">Goのフレームワーク&lt;/h2>
&lt;p>GoのWAF（Web Application Framework）には&lt;/p>
&lt;ul>
&lt;li>フルスタック・MVC&lt;/li>
&lt;li>ミニマル・高速&lt;/li>
&lt;/ul>
&lt;p>の2種類がある&lt;/p>
&lt;p>この辺の話は、僕の&lt;a href="https://yyh-gl.hatenablog.com/entry/2019/02/08/195310?_ga=2.260731597.131948474.1572615746-732745836.1548899089" target="_blank" rel="noopener noreferrer">旧ブログ&lt;/a>
にもいろいろ書いているのでどうぞー&lt;/p>
&lt;p>DeNAではフルスタック・MVCを選択&lt;/p>
&lt;h2 id="goにおけるフルスタックなwaf">GoにおけるフルスタックなWAF&lt;/h2>
&lt;ul>
&lt;li>Beego：採用！&lt;/li>
&lt;li>Revel：開発が止まってきている&lt;/li>
&lt;li>Iris：プロジェクトの運用がうまくいっていないようだった&lt;/li>
&lt;/ul>
&lt;h2 id="beego">Beego&lt;/h2>
&lt;ul>
&lt;li>フルスタックのMVCフレームワーク&lt;/li>
&lt;li>ORMまでついてる&lt;/li>
&lt;li>セッション管理、ロガー、キャッシュなどのライブラリがいろいろついてるけど、全てモジュール化されていて、部分的に他のライブラリを使うことができる&lt;/li>
&lt;li>Railsライクなフレームワーク
&lt;ul>
&lt;li>Railsのbefore/after_actionに相当するものもある（Prepare(), Finish()）&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="ライブラリ">ライブラリ&lt;/h2>
&lt;p>使用ライブラリは&lt;a href="https://speakerdeck.com/suhirotaka/gohuo-yong-shi-li-an-quan-yun-zhuan-zhi-yuan-sabisuwozhi-eru-yun-yong-guan-li-sisutemu?slide=32" target="_blank" rel="noopener noreferrer">こちら&lt;/a>
&lt;/p>
&lt;p>こういうの教えてくれるのめっちゃ嬉しい&lt;/p>
&lt;ul>
&lt;li>ORM：GORM&lt;/li>
&lt;li>ロガー：logrus&lt;/li>
&lt;li>PDF生成：gopdf → 日本語もきれいにでるので最高にクール&lt;/li>
&lt;li>画像生成：gg&lt;/li>
&lt;li>バーコード生成：Barcode&lt;/li>
&lt;/ul>
&lt;h1 id="2-webシステムのパフォーマンスとgo">2. WebシステムのパフォーマンスとGo&lt;/h1>
&lt;p>（写真撮り忘れた…）&lt;/p>
&lt;p>登壇者：（@karupanerura）
ゲーム・エンターテインメント事業本部ゲーム事業部Publish統括部共通基盤部アライアンスシステムグループ&lt;/p>
&lt;p>&lt;a href="https://speakerdeck.com/karupanerura/websisutemufalsehahuomansutogo" target="_blank" rel="noopener noreferrer">スライド&lt;/a>
&lt;/p>
&lt;h2 id="webシステムにおけるパフォーマンスとは">Webシステムにおけるパフォーマンスとは&lt;/h2>
&lt;p>たくさんリクエスト処理できる かつ リソース消費が少ないのが &lt;br>
システム全体で見たときの理想的なパフォーマンス&lt;/p>
&lt;h2 id="パフォーマンスチューニングのいろいろ">パフォーマンスチューニングのいろいろ&lt;/h2>
&lt;p>詳しいチューニング方法は&lt;a href="https://speakerdeck.com/karupanerura/websisutemufalsehahuomansutogo?slide=24" target="_blank" rel="noopener noreferrer">こちら&lt;/a>
&lt;/p></description></item><item><title>【GitHub Actions】プライベートアクションを使ってみた</title><link>https://tech.yyh-gl.dev/blog/github-actions-private-action/</link><pubDate>Tue, 22 Oct 2019 09:00:00 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/github-actions-private-action/</guid><description>&lt;h1 id="プライベートアクションとは">プライベートアクションとは&lt;/h1>
&lt;p>GitHub Actions では、開発者がアクション（Lint やテストといったジョブなど）を作って、公開することができます。
&lt;br>
この公開されたアクションは、世界中の人が使えるため、もちろん自分のプロジェクトに持ってきて使用できます。
&lt;br>
この公開されたアクションのことを &lt;u>パブリックアクション&lt;/u> といいます。&lt;/p>
&lt;p>パブリックアクションが溢れた世界を想像するだけでワクワクしますね👍
&lt;br>
（野良 Docker イメージと同様に、ほいそれとは使えないでしょうが…）&lt;/p>
&lt;br>
今回、とりあげるのはパブリックアクションの正反対にあるものです。
&lt;br>
つまり、公開しない（できない）アクション ＝ &lt;u>プライベートアクション&lt;/u> です。
&lt;h1 id="プライベートアクションを使うための準備">プライベートアクションを使うための準備&lt;/h1>
&lt;p>ディレクトリ構成は以下のとおりです。&lt;/p>
&lt;pre>&lt;code>.github
├── actions
│   └── golang-test
│   ├── Dockerfile
│   ├── action.yml
│   └── entrypoint.sh
└── workflows
└── golang.yml
&lt;/code>&lt;/pre>
&lt;p>&lt;code>/actions&lt;/code> ディレクトリ配下に golang-test という、Lint とテストを実行するアクションを作ってみます。&lt;/p>
&lt;p>&lt;code>/workflow&lt;/code> ディレクトリ配下には、golang 用のワークフロー定義ファイルを置いています。&lt;/p>
&lt;p>では、次から各ファイルの定義を見ていきます。&lt;/p>
&lt;h1 id="プライベートアクションの定義">プライベートアクションの定義&lt;/h1>
&lt;pre>&lt;code class="language-yml"># /actions/golang-test/action.yml
name: 'Golang Lint and Test Action'
description: 'Lint and Test for Golang'
author: 'yyh-gl'
runs:
# Docker を使って実行することを宣言
using: 'docker'
# 使用する Docker イメージを指定
image: 'Dockerfile'
&lt;/code>&lt;/pre>
&lt;p>アクションの定義は上記のとおりです。
&lt;br>
&lt;a href="https://help.github.com/ja/github/automating-your-workflow-with-github-actions/creating-a-docker-container-action#create-an-action-metadata-file" target="_blank" rel="noopener noreferrer">公式ドキュメント&lt;/a>
を参考にしました。&lt;/p></description></item><item><title>【mercari.go #11】エラーハンドリング ＋ singleflight ＋ ISUCON ベンチマーカー</title><link>https://tech.yyh-gl.dev/blog/mercarigo_11/</link><pubDate>Mon, 07 Oct 2019 09:00:00 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/mercarigo_11/</guid><description>&lt;h1 id="mercarigo-11">mercari.go #11&lt;/h1>
&lt;ul>
&lt;li>connpass： &lt;a href="https://mercari.connpass.com/event/148913/" target="_blank" rel="noopener noreferrer">リンク&lt;/a>
&lt;/li>
&lt;li>ハッシュタグ： &lt;a href="https://twitter.com/search?q=%23mercarigo&amp;amp;src=typd&amp;amp;lang=ja" target="_blank" rel="noopener noreferrer">&lt;code>#mercarigo&lt;/code>&lt;/a>
&lt;/li>
&lt;/ul>
&lt;p>今回もお弁当とドリンクがありました！ありがたや&lt;/p>
&lt;br>
[追記：2019年10月12日]&lt;br>
[Mercari Engineering Blog](https://tech.mercari.com/entry/2019/10/11/160000) にて、本イベントの記事が公開されました。&lt;br>
発表資料が載せてあります。ありがたや🙏
&lt;h1 id="1-about-error-handling-in-go">1. About error handling in Go&lt;/h1>
&lt;p>登壇者：jd さん（@JehandadKamal）&lt;/p>
&lt;p>&lt;a href="https://about.sourcegraph.com/go/gophercon-2019-handling-go-errors" target="_blank" rel="noopener noreferrer">資料&lt;/a>
（正式に共有されたものでないので、発表の内容が少し異なります）&lt;/p>
&lt;h2 id="errors-are-values">Errors are values&lt;/h2>
&lt;p>”&lt;a href="https://blog.golang.org/errors-are-values" target="_blank" rel="noopener noreferrer">Errors are values&lt;/a>
” という考え方。&lt;/p>
&lt;h2 id="goでよくあるエラー処理パターン">Goでよくあるエラー処理パターン&lt;/h2>
&lt;ul>
&lt;li>エラーをラップしてより詳細な情報を付与する&lt;/li>
&lt;li>専用構造体を作る&lt;/li>
&lt;li>スタックトレースを構成する&lt;/li>
&lt;/ul>
&lt;h2 id="error-is-your-domain">”Error is your domain”&lt;/h2>
&lt;p>Domain Error Struct を作成する。&lt;/p>
&lt;pre>&lt;code class="language-go">type Error struct {
Op Op
Kind Kind
Serverity zapcore.ErrorLevel
Err error
}
&lt;/code>&lt;/pre>
&lt;ul>
&lt;li>Op：Operation → 関数名とか&lt;/li>
&lt;li>Kind：エラー種別 → NotAvailable, NotFound といったもの&lt;/li>
&lt;li>Serverity：エラーレベル&lt;/li>
&lt;li>Err：エラー内容&lt;/li>
&lt;/ul>
&lt;h2 id="上記のような構造体を作る理由">上記のような構造体を作る理由&lt;/h2>
&lt;p>error を比較するときは、基本的に文字列の比較になるため取り回しが悪い
&lt;br>
→ ”NotFound” という文字列を比較するとかとか&lt;/p></description></item><item><title>React.memo について調べたのでメモを残しておく</title><link>https://tech.yyh-gl.dev/blog/react_memo/</link><pubDate>Wed, 18 Sep 2019 09:00:00 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/react_memo/</guid><description>&lt;h1 id="reactmemo-とは">React.memo とは&lt;/h1>
&lt;p>&lt;a href="https://ja.reactjs.org/docs/react-api.html#reactmemo" target="_blank" rel="noopener noreferrer">公式ドキュメント&lt;/a>
を見ると、&lt;/p>
&lt;blockquote>
&lt;p>これは React.PureComponent に似ていますが、クラスではなく関数コンポーネント用です。&lt;/p>&lt;/blockquote>
&lt;p>とあります。&lt;/p>
&lt;p>つまり、 React.PureComponent を関数コンポーネントで実現するための手段らしいです。&lt;/p>
&lt;h1 id="reactpurecomponent-とは">React.PureComponent とは&lt;/h1>
&lt;p>&lt;a href="https://ja.reactjs.org/docs/react-api.html#reactpurecomponent" target="_blank" rel="noopener noreferrer">公式ドキュメント&lt;/a>
を見ると、&lt;/p>
&lt;blockquote>
&lt;p>React.PureComponent は React.Component と似ています。
両者の違いは React.Component が shouldComponentUpdate() を実装していないことに対し、
React.PureComponent は props と state を浅く (shallow) 比較することでそれを実装していることです。&lt;/p>&lt;/blockquote>
&lt;p>とあります。&lt;/p>
&lt;p>&lt;u>shouldComponentUpdate() によって、どういった変更があれば再描画するかを定義する&lt;/u>ようです。&lt;/p>
&lt;br>
&lt;p>追加でこの&lt;a href="https://the2g.com/2814" target="_blank" rel="noopener noreferrer">参考記事&lt;/a>
を読んでみると、&lt;/p>
&lt;blockquote>
&lt;p>PureComonentはprops及びstateの変更を検出した場合のみレンダリングを行います。
Messageコンポーネントではmessage propsの変更を察知し、必要分の更新を行うようになります。&lt;/p>&lt;/blockquote>
&lt;p>とあります。&lt;/p>
&lt;p>自分で再描画条件を定義できるので、無駄な再描画を省くことができ、パフォーマンス向上を期待できるんですね。&lt;/p>
&lt;p>→ React.PureComponent を用いることでパフォーマンスを向上させることができるようです。&lt;br>
（参考記事内にもあるとおり銀の弾丸ではないようですが…）&lt;/p>
&lt;h1 id="浅い比較-とは">浅い比較 とは&lt;/h1>
&lt;blockquote>
&lt;p>shouldComponentUpdate() は浅い比較によって変更検知を行う。&lt;/p>&lt;/blockquote>
&lt;p>とありましたが、浅い比較とはなんでしょうか。&lt;br>
（shouldComponentUpdate() のデフォルトが浅い比較というだけで、オリジナルの比較方法を実装可能なようです）&lt;/p>
&lt;p>さきほどの&lt;a href="https://the2g.com/2814" target="_blank" rel="noopener noreferrer">参考記事&lt;/a>
にて説明されていました。&lt;/p>
&lt;blockquote>
&lt;p>浅い比較というのは、簡潔に述べるとオブジェクトの参照先が同じであれば等しいと見なすことです。&lt;/p>&lt;/blockquote>
&lt;p>参照先しか見ていないので、中身は見ていないということですね。&lt;br>
（このような実装なのは、React の思想として、props や state といったデータは immutable であるべきだとしているからだと思います）&lt;/p></description></item><item><title>【Backend Engineer’s meetup】メルカリ社主催 バックエンダーのための Meetup イベント行ってきた</title><link>https://tech.yyh-gl.dev/blog/mercari_meetup_for_backend_engineers_1/</link><pubDate>Wed, 21 Aug 2019 09:00:00 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/mercari_meetup_for_backend_engineers_1/</guid><description>&lt;h1 id="backend-engineers-meetup-マイクロサービスにおける認証認可基盤">Backend Engineer’s meetup &lt;del>マイクロサービスにおける認証認可基盤&lt;/del>&lt;/h1>
&lt;ul>
&lt;li>&lt;a href="https://mercari.connpass.com/event/142624/" target="_blank" rel="noopener noreferrer">connpass&lt;/a>
&lt;/li>
&lt;li>ハッシュタグ：&lt;a href="https://twitter.com/hashtag/merpay_meetup" target="_blank" rel="noopener noreferrer">#merpay_meetup&lt;/a>
&lt;/li>
&lt;/ul>
&lt;p>メルカリさん恒例のオリジナルドリンクもらいました&lt;/p>
&lt;img src="https://tech.yyh-gl.dev/img/2019/08/mercari_meetup_for_backend_engineers_1/original_drink.jpeg" height="400">
&lt;h1 id="1-マイクロサービスの内部通信における認証について">1. マイクロサービスの内部通信における認証について&lt;/h1>
&lt;p>登壇者：@pospome さん&lt;/p>
&lt;p>&lt;a href="https://www.slideshare.net/pospome/ss-165369557/pospome/ss-165369557" target="_blank" rel="noopener noreferrer">スライド&lt;/a>
（日本語が消えてしまっていますが、ダウンロードしたら見れました）&lt;/p>
&lt;h2 id="上記スライドの簡易メモ">上記スライドの簡易メモ&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>アカウント管理とログイン処理はそれぞれのチームに任せている&lt;/p>
&lt;ul>
&lt;li>SubjectID という 全サービス共通のID に変換して扱う&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>メルカリでは、OIDCベースの認可の仕組みを採用&lt;/p>
&lt;ul>
&lt;li>RFCに書いてあるものと大差ないので、今回は &lt;code>マイクロサービスの内部通信における認証&lt;/code> について話す&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>全サービスは Gatwway を経由&lt;/p>
&lt;ul>
&lt;li>Gateway から Authority Service にくる&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>Authority Service を認証基盤チームが管理&lt;/p>
&lt;ul>
&lt;li>外部からのリクエスト検証と内部通信用のトークンを生成している&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>内部トークンは毎リクエストごとに生成&lt;/p>
&lt;ul>
&lt;li>マイクロサービス間で使用されるトークンはリクエスト単位で同一&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>内部トークン用のSDKを提供&lt;/p>
&lt;ul>
&lt;li>Goのみ対応&lt;/li>
&lt;li>SDKを使うといろいろとよしなにしてくれる
&lt;ul>
&lt;li>クレームをいい感じに取得&lt;/li>
&lt;li>SubjectID のパースとかをいい感じにしてくれる&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>マイクロサービスはバッチのためのエンドポイントをもつことがあるので、Gatewayによってユーザが直接叩くことがきない環境を作れるのはメリットとなる&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h1 id="2-パネルディスカッション">2. パネルディスカッション&lt;/h1>
&lt;p>登壇者：&lt;/p>
&lt;ul>
&lt;li>Keigo Watanabe さん&lt;/li>
&lt;li>@kazegusuri&lt;/li>
&lt;li>@nerocrux&lt;/li>
&lt;li>@pospome&lt;/li>
&lt;/ul>
&lt;br>
&lt;p>パネルディスカッションのはずがほとんど質疑で終わりましたｗ&lt;/p>
&lt;p>質疑は さきほどの &lt;a href="https://www.slideshare.net/pospome/ss-165369557/pospome/ss-165369557" target="_blank" rel="noopener noreferrer">発表&lt;/a>
に対するものが主でした。&lt;/p>
&lt;p>したがって、以下、上記発表に関する質問と回答になります。&lt;/p>
&lt;h3 id="q-第三パーティーにスコープを指定させるのではなく外部スコープと内部スコープのマッピングを行ったのはなぜか">Q. 第三パーティーにスコープを指定させるのではなく、外部スコープと内部スコープのマッピングを行ったのはなぜか&lt;/h3>
&lt;p>A.&lt;/p>
&lt;p>ユースケースベースでスコープを提供した方が第三パーティーの開発者がわかりやすい。&lt;/p>
&lt;p>リソースベースだとどれが必要なスコープなのかが分かりづらい。&lt;/p>
&lt;br>
（yyh-gl 感想）
&lt;p>AWSのポリシーがリソースベースだと思うんだけど、どのポリシーが必要か分かりづらいもんねー&lt;/p></description></item><item><title>【Go同miniConf】Goの勉強会に参加してきた話</title><link>https://tech.yyh-gl.dev/blog/godo_miniconf/</link><pubDate>Tue, 06 Aug 2019 09:00:00 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/godo_miniconf/</guid><description>&lt;h1 id="概要">概要&lt;/h1>
&lt;p>CyberAgent ＆ merpay が共催したGoのイベント&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://mercari.connpass.com/event/141047/" target="_blank" rel="noopener noreferrer">Connpass情報&lt;/a>
&lt;/li>
&lt;li>ハッシュタグ：#godo_miniconf&lt;/li>
&lt;/ul>
&lt;p>（写真撮るの忘れた…）&lt;/p>
&lt;p>以下、発表まとめ&lt;/p>
&lt;h1 id="1-マイクロサービスとmonorepo">1. マイクロサービスとMonoRepo&lt;/h1>
&lt;ul>
&lt;li>登壇者：江頭 宏亮さん（@_hiro511）&lt;/li>
&lt;li>&lt;a href="https://speakerdeck.com/_hiro511/microservices-and-monorepo" target="_blank" rel="noopener noreferrer">発表スライド&lt;/a>
&lt;/li>
&lt;/ul>
&lt;h2 id="リポジトリ管理について">リポジトリ管理について&lt;/h2>
&lt;p>WinTicket というサービス開発・運用中&lt;/p>
&lt;p>&lt;u>36個のマイクロサービスで動いている&lt;/u>&lt;/p>
&lt;ul>
&lt;li>マルチリポジトリ：マイクロサービスごとにリポジトリが別れている&lt;/li>
&lt;li>モノリポジトリ：ひとつのリポジトリ。WinTicket ではこっち&lt;/li>
&lt;/ul>
&lt;h2 id="モノリポジトリ">モノリポジトリ&lt;/h2>
&lt;ul>
&lt;li>Google, FB, Tiwtter, Uberが採用&lt;/li>
&lt;li>メリット
&lt;ul>
&lt;li>依存管理をシンプルにできる
&lt;ul>
&lt;li>マルチリポジトリの場合、複数のリポジトリに変更を加える必要があるし、変更を取り込むのが面倒&lt;/li>
&lt;li>モノレポだとすべてのコードが一箇所にあるので変更が楽&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>一貫性のある変更
&lt;ul>
&lt;li>複数のサービスにまたがる変更においても、アトミックなコミットが可能&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>コードの共有と再利用が用意
&lt;ul>
&lt;li>common ディレクトリがあればできる&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>大きなリファクタリングが容易&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="ビルドとテストを効率良くしたいという">ビルドとテストを効率良くしたいという&lt;/h2>
&lt;p>&lt;u>モノリポジトリだと、ビルドとテストに時間がかかる&lt;/u> ので、効率よくビルドとテストしたい&lt;/p>
&lt;ul>
&lt;li>Bazel（ベイゼル）：ビルド・テストツール
&lt;ul>
&lt;li>Go, Andoroid, iOSなど様々な言語に対応&lt;/li>
&lt;li>Googleが使っている（Googleの自社ツールがOSS化）&lt;/li>
&lt;li>必要箇所だけビルド・テストする
&lt;ul>
&lt;li>速い&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>スケーラブル&lt;/li>
&lt;li>拡張可能
&lt;ul>
&lt;li>StarDarkという独自言語で設定定義&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>WinTicketではDockerビルドもこれ&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="go-with-bazel">Go with Bazel&lt;/h2>
&lt;ol>
&lt;li>Bazel のインストール by brew&lt;/li>
&lt;li>WORKSPACEファイルの作成
&lt;ul>
&lt;li>外部の依存関係を記述&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>BUILDファイルを作成
&lt;ul>
&lt;li>ビルド方法を示したもの&lt;/li>
&lt;li>Gazzelを利用して自動生成可能&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;p>ディレクトリ構成例&lt;/p>
&lt;pre>&lt;code>.
├BUILD.bazel
├WORKSPACE
└cmd
└main.go
&lt;/code>&lt;/pre>
&lt;h2 id="gazzelは-go-modules-と-dep-に対応">Gazzelは Go Modules と dep に対応&lt;/h2>
&lt;p>go.mod, Gopkg.lockファイルから依存パッケージを取りこみWORKSPACEファイルに書き込んでくれる&lt;/p></description></item><item><title>【徒然なるままに】サービス発案における主観と客観のバランスについて</title><link>https://tech.yyh-gl.dev/blog/my_thinking_about_planning/</link><pubDate>Tue, 18 Jun 2019 09:00:00 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/my_thinking_about_planning/</guid><description>&lt;h1 id="研修での-サービス発案-をやった">研修での サービス発案 をやった&lt;/h1>
&lt;p>新卒研修で サービス発案 について学び、実際に&lt;/p>
&lt;ul>
&lt;li>問題提議&lt;/li>
&lt;li>ソリューション検討&lt;/li>
&lt;li>サービスに落とし込む&lt;/li>
&lt;/ul>
&lt;p>など、チームで作業しました。&lt;br>
（今回考えたサービスを、今後チームで開発していきます）&lt;/p>
&lt;br>
そして、一日考えたサービスをターゲット層となる人たちに &lt;br>
「こんなサービスどうですか？あったら欲しいですか？」といったアンケートを行いました。
&lt;br>
&lt;p>&lt;u>返ってきた答えは「欲しくない」 が過半数でした&lt;/u>。&lt;/p>
&lt;h1 id="そのとき僕たちは">そのとき僕たちは&lt;/h1>
&lt;img src="https://tech.yyh-gl.dev/img/2019/06/my_thinking_about_planning/sad.png" width="400">
&lt;p>正直、意気消沈しました。&lt;/p>
&lt;br>
&lt;p>ただ、こういう結果になった原因は明白でした。&lt;/p>
&lt;p>なぜかというと、この時、チーム内から多く出た声が&lt;/p>
&lt;p>「必死に考えたサービスだったのに」&lt;br>
「絶対欲しいでしょこれ」&lt;br>
「俺は欲しい」&lt;/p>
&lt;p>といった内容だったからです。&lt;/p>
&lt;br>
&lt;p>ハッカソンでもあるあるですよね。&lt;br>
自分たちが考えたサービスに愛着が出てきて、&lt;u>客観性がなくなっている状態&lt;/u>。&lt;/p>
&lt;p>そうです。僕たちは客観的になれていなかったんです。&lt;br>&lt;/p>
&lt;h1 id="それでもめげずに僕たちは動いた">それでもめげずに僕たちは動いた&lt;/h1>
&lt;p>めそめそしていても仕方ないので、僕たちはアンケートを答えてくれた人に &lt;br>
話を聞きに行ってみることにしました。&lt;/p>
&lt;p>この行動が大正解でした。&lt;/p>
&lt;br>
&lt;p>チーム外の人の話を聞くと、どういったところがだめだったのかが見えてきました。&lt;br>
加えて、 &lt;u>自分たちもサービスを客観視することができるようになり、&lt;br>他にもだめなところが見えてきました。&lt;br>&lt;/u>&lt;/p>
&lt;br>
&lt;p>後、意外だったのですが、自分たちが特にどこに力を入れていて、&lt;br>
どういった解決方法を取ろうとしているのか、熱量を持って伝えると、&lt;br>
相手方が理解して、共感・納得してくれることがありました。&lt;/p>
&lt;img src="https://tech.yyh-gl.dev/img/2019/06/my_thinking_about_planning/talking.png" width="400">
&lt;h1 id="つまり">つまり…&lt;/h1>
&lt;p>サービスを提案する上で、第一に大事なのは &lt;u>客観性&lt;/u> だと感じました。&lt;/p>
&lt;p>自分たちがどれだけいいものだと思っても、&lt;br>
他の人々がいらないと言ったら、そのサービスは世の中には受け入れられません。&lt;/p>
&lt;p>つまり、客観的に見る ＝ 世の人々がなにに課題を感じているのか調査し、&lt;br>
ソリューションを提供していくことが大事です。&lt;/p>
&lt;br>
&lt;p>しかしながら、さきほど言ったとおり、&lt;/p>
&lt;blockquote>
&lt;p>熱量を持って伝えると、相手方が理解して、共感・納得してくれることもありました。&lt;/p>&lt;/blockquote>
&lt;p>こういうケースもあります。&lt;/p>
&lt;p>これは、多少主観的でも論理的に正しいことを熱量持って伝えることで、&lt;br>
世の人々がまだ気づいていない課題に気づき、提案サービスの必要性を感じてもらえた瞬間だと思います。&lt;/p>
&lt;p>ただ、相手にサービスの良さを気づいてもらうには、&lt;br>
サービスに対する絶対的自信（主観）がないと難しいですよね。&lt;br>&lt;/p>
&lt;p>すなわち、主観 も大事ってことですね。&lt;/p>
&lt;h1 id="主観と客観のバランスが難しい">主観と客観のバランスが難しい&lt;/h1>
&lt;p>ここまでの内容をまとめると &lt;br>
僕は「サービス発案において、主観 と 客観 どちらも大事」という結論に落ちつきました。&lt;/p>
&lt;p>でも、主観と客観のバランスってめちゃくちゃ難しくないですか？&lt;/p>
&lt;p>主観的意見もある程度は受け入れてもらえるんです。&lt;br>
そして、そこがそのサービスのユニークな機能になると思います。&lt;/p>
&lt;p>しかし、主観的意見が多くなりすぎると、誰にも求められないサービスができあがってしまう。&lt;/p>
&lt;br>
&lt;p>いかに、この 主観 と 客観 を両立するのか。&lt;br>
まだまだ サービス発案 について学ぶことは多いと感じました。&lt;/p></description></item><item><title>【OGP】リンク先のサムネイル画像を表示できるようにした話</title><link>https://tech.yyh-gl.dev/blog/ogp/</link><pubDate>Mon, 17 Jun 2019 09:00:00 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/ogp/</guid><description>&lt;h1 id="twitter-のリンクにサムネイル画像が表示されない">Twitter のリンクにサムネイル画像が表示されない&lt;/h1>
&lt;img src="https://tech.yyh-gl.dev/img/2019/06/ogp/before.png" width="600">
&lt;p>このように Twitter でブログのリンクを載せても、サムネイルが表示されない。&lt;/p>
&lt;p>はてなブログをやっていたときは、何もしなくてもサムネイルが表示されていました。&lt;/p>
&lt;p>トップ画像をよしなにサムネイルにしてくれるのかなぁっと思っていましたが違ったんですね…。&lt;/p>
&lt;h1 id="どうやったらサムネイル画像が表示されるか">どうやったらサムネイル画像が表示されるか&lt;/h1>
&lt;!-- textlint-disable ja-technical-writing/sentence-length -->
&lt;p>Twitter や Facebook などの SNS でタイトルやサムネイルといったWebページの情報を表示するには、
&lt;u>Open Graph Protocol（OGP）&lt;/u> というものを設定する必要があります。&lt;/p>
&lt;!-- textlint-enable ja-technical-writing/sentence-length -->
&lt;p>OGP を設定することで Twitter や Facebook でサムネイル付きのリンクを表示できます。&lt;/p>
&lt;p>&lt;a href="https://digitalidentity.co.jp/blog/seo/ogp-share-setting.html" target="_blank" rel="noopener noreferrer">こちらのサイト&lt;/a>
で詳細が説明されています。&lt;/p>
&lt;h1 id="ogp-の設定">OGP の設定&lt;/h1>
&lt;p>今回設定する OGP 情報は以下のとおりです。&lt;/p>
&lt;ul>
&lt;li>og:title&lt;/li>
&lt;li>og:type&lt;/li>
&lt;li>og:url&lt;/li>
&lt;li>og:description&lt;/li>
&lt;li>og:image&lt;/li>
&lt;/ul>
&lt;p>これらの情報を head タグ内に埋め込みます。&lt;/p>
&lt;pre>&lt;code class="language-html">&amp;lt;meta property=&amp;quot;og:title&amp;quot; content=&amp;quot;【Go + レイヤードアーキテクチャ】DDDを意識してWeb APIを実装してみる&amp;quot;&amp;gt;
&amp;lt;meta property=&amp;quot;og:type&amp;quot; content=&amp;quot;article&amp;quot;&amp;gt;
&amp;lt;meta property=&amp;quot;og:url&amp;quot; content=&amp;quot;https://tech.yyh-gl.dev/blog/go_web_api/&amp;quot;&amp;gt;
&amp;lt;meta property=&amp;quot;og:description&amp;quot; content=&amp;quot;hoge&amp;quot;&amp;gt;
&amp;lt;meta property=&amp;quot;og:image&amp;quot; content=&amp;quot;https://tech.yyh-gl.dev/img/2019/06/go_web_api/featured.png&amp;quot;&amp;gt;
&lt;/code>&lt;/pre>
&lt;p>ただし、僕の場合、Hugo のテーマの方で og:image 以外は設定してくれていました。&lt;br>
したがって、今回は og:image だけを追加で設定します。&lt;/p></description></item><item><title>【HTML + CSS + Prism.js】ブログの見た目を整えた話</title><link>https://tech.yyh-gl.dev/blog/blog_style_fix/</link><pubDate>Sun, 16 Jun 2019 09:00:00 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/blog_style_fix/</guid><description>&lt;h1 id="シンタックスハイライト導入">シンタックスハイライト導入&lt;/h1>
&lt;p>このブログ、ちょっと前までコードのシンタックスハイライトが効いていませんでした。&lt;/p>
&lt;p>正確には対応していない言語が（めちゃくちゃ）ありました。&lt;/p>
&lt;img src="https://tech.yyh-gl.dev/img/2019/06/blog_style_fix/syntax_highlight_before.png" width="600">
&lt;p>このとおり、 Goにも対応していませんでした…。&lt;/p>
&lt;br>
&lt;p>もともと、このブログのテーマは &lt;a href="https://themes.gohugo.io/" target="_blank" rel="noopener noreferrer">Hugo Themes&lt;/a>
（Hugo 公式 テーマショップ的なの）に &lt;br>
あったものを使わせてもらっているのですが、さすがに対応していない言語が多すぎたので、&lt;br>
シンタックスハイライト部分だけ個別に導入することにしました。&lt;/p>
&lt;h1 id="prismjs">Prism.js&lt;/h1>
&lt;p>さっそく、「HTML シンタックスハイライト」で調べてみました。&lt;/p>
&lt;p>そしたら、だいたい以下の3つが出てきました。&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://prismjs.com/" target="_blank" rel="noopener noreferrer">Prism.js&lt;/a>
&lt;/li>
&lt;li>&lt;a href="https://highlightjs.org/" target="_blank" rel="noopener noreferrer">highlight.js&lt;/a>
&lt;/li>
&lt;li>&lt;a href="https://github.com/google/code-prettify" target="_blank" rel="noopener noreferrer">Google code-prettify&lt;/a>
&lt;/li>
&lt;/ul>
&lt;p>どれにしようか迷ったのですが、見た目が一番好みだった Prism.js を使うことにしました。&lt;/p>
&lt;h2 id="導入">導入&lt;/h2>
&lt;p>導入方法については記事がたくさんあるので、そちらをご覧ください。&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://prismjs.com/download.html#themes=prism&amp;amp;languages=markup&amp;#43;css&amp;#43;clike&amp;#43;javascript" target="_blank" rel="noopener noreferrer">公式ダウンロードページ&lt;/a>
&lt;/li>
&lt;li>&lt;a href="https://mndangler.net/2017/04/syntaxhighlighter_prism-js/" target="_blank" rel="noopener noreferrer">導入 参考記事&lt;/a>
&lt;/li>
&lt;li>&lt;a href="https://thk.kanzae.net/net/wordpress/t1171/" target="_blank" rel="noopener noreferrer">導入 参考記事&lt;/a>
&lt;/li>
&lt;li>&lt;a href="https://niwaka-web.com/prism_js/" target="_blank" rel="noopener noreferrer">導入 参考記事&lt;/a>
&lt;/li>
&lt;/ul>
&lt;h2 id="導入後">導入後&lt;/h2>
&lt;img src="https://tech.yyh-gl.dev/img/2019/06/blog_style_fix/syntax_highlight_after.png" width="600">
&lt;p>きれいですねー&lt;/p>
&lt;p>今回導入した Prism.js のプラグインは、&lt;/p>
&lt;ul>
&lt;li>Line Highlight：行指定した箇所をハイライトする機能（上記画像内では使用していません）&lt;/li>
&lt;li>Line Numbers：行番号を表示する機能&lt;/li>
&lt;li>Show Language：右上に 言語名 を表示している機能&lt;/li>
&lt;/ul>
&lt;p>の3つです。&lt;/p>
&lt;h1 id="困ったこと">困ったこと&lt;/h1>
&lt;h2 id="行番号が表示されない">行番号が表示されない&lt;/h2>
&lt;p>行番号を表示するには、&lt;/p>
&lt;pre>&lt;code class="language-html">&amp;lt;pre class=&amp;quot;line-numbers&amp;quot;&amp;gt;&amp;lt;code class=&amp;quot;language-c&amp;quot;&amp;gt;
コード
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;
&lt;/code>&lt;/pre>
&lt;p>上記コードのように、表示するコードスニペットに対して、&lt;br>
line-numbers というクラスを付与してあげるだけでOKです。&lt;/p>
&lt;p>…が、なぜか行番号が他の要素の下にいってしまい、見えなくなっていました。&lt;br>
したがって、prism.css を修正して行番号が他の要素の上に来るようにしました。&lt;/p>
&lt;h2 id="リスト表示の行間が異様に広い">リスト表示の行間が異様に広い&lt;/h2>
&lt;p>Prism.js 導入後…&lt;/p></description></item><item><title>【mercari.go #8】メルカリのGoに関する勉強会メモ</title><link>https://tech.yyh-gl.dev/blog/mercari_go/</link><pubDate>Sat, 15 Jun 2019 09:00:00 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/mercari_go/</guid><description>&lt;h1 id="mercarigo-8">mercari.go #8&lt;/h1>
&lt;ul>
&lt;li>connpass： &lt;a href="https://mercari.connpass.com/event/132114/?utm_campaign=event_message_to_selected_participant&amp;amp;utm_source=notifications&amp;amp;utm_medium=email&amp;amp;utm_content=title_link" target="_blank" rel="noopener noreferrer">リンク&lt;/a>
&lt;/li>
&lt;li>ハッシュタグ： &lt;a href="https://twitter.com/search?q=%23mercarigo&amp;amp;src=typd&amp;amp;lang=ja" target="_blank" rel="noopener noreferrer">&lt;code>#mercarigo&lt;/code>&lt;/a>
&lt;/li>
&lt;li>独自ルール： &lt;a href="https://twitter.com/zaki_hmkc/status/1139481689300713472" target="_blank" rel="noopener noreferrer">懇親会のGルール&lt;/a>
&lt;br>
懇親会のときに登壇者を囲んでもいいけど、自分たち以外にもう一人入ってこれるスペースを常に開けておこうねっていうルール。とてもよい！&lt;/li>
&lt;li>雰囲気&lt;/li>
&lt;/ul>
&lt;img src="https://tech.yyh-gl.dev/img/2019/06/mercari_go/goods.JPG" height="300">
&lt;p>ビール以外にもおいしそうなご飯もありましたが、写真を撮るの忘れ…&lt;/p>
&lt;br>
&lt;p>以降、自分用のメモを書き連ねます。&lt;br>
詳細はスライドの方をご覧ください。&lt;/p>
&lt;h1 id="1-goで学ぶknative">1. Goで学ぶKnative&lt;/h1>
&lt;p>登壇者： @toshi0607 さん&lt;/p>
&lt;p>&lt;a href="https://speakerdeck.com/toshi0607/learning-knative-with-go" target="_blank" rel="noopener noreferrer">スライドリンク&lt;/a>
&lt;/p>
&lt;h2 id="knative">&lt;a href="https://cloud.google.com/knative/?hl=ja" target="_blank" rel="noopener noreferrer">Knative&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>Knative ＝ 最新のサーバーレス ワークロードをビルド、デプロイ、管理できる Kubernetes ベースのプラットフォーム
&lt;ul>
&lt;li>AWS の Lmabda に近いことを k8s 上でできると解釈&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>登壇者含め、会場内で Knative を本番に導入している人はなし。&lt;br>まだ時期尚早っぽい&lt;/li>
&lt;li>k8s のリソースを抽象化し、独自のPaaS/FaaSを構築するためのパーツを提供&lt;/li>
&lt;li>k8s 上にのっかる。&lt;/li>
&lt;li>Knative の構成
&lt;ul>
&lt;li>&lt;a href="https://speakerdeck.com/toshi0607/learning-knative-with-go?slide=8" target="_blank" rel="noopener noreferrer">Serving&lt;/a>
&lt;/li>
&lt;li>&lt;a href="https://speakerdeck.com/toshi0607/learning-knative-with-go?slide=13" target="_blank" rel="noopener noreferrer">Build&lt;/a>
&lt;/li>
&lt;li>&lt;a href="https://speakerdeck.com/toshi0607/learning-knative-with-go?slide=15" target="_blank" rel="noopener noreferrer">Eventing&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>現状、一部、Istio に依存してしまっているので、Istioの導入が必要不可欠&lt;/li>
&lt;li>登壇者は 機能実装に一層集中するための基盤 として注目している&lt;/li>
&lt;li>yml ファイルで定義した内容に基づいて コード生成&lt;/li>
&lt;/ul>
&lt;h2 id="感想">感想&lt;/h2>
&lt;p>終盤、 Knative の内部処理を コードリーディング していたのですが、&lt;br>
見入ってしまいメモを忘れていました。。。&lt;/p>
&lt;p>Knative 初めて聞いたのですが、おもしろそうだなという感想。&lt;/p>
&lt;p>k8s の勉強しないとな。&lt;/p>
&lt;h1 id="2-gotham-goとgophercon-euに参加してきました">2. Gotham GoとGopherCon EUに参加してきました&lt;/h1>
&lt;p>登壇者： @tenntenn&lt;/p></description></item><item><title>【Go + レイヤードアーキテクチャ】DDDを意識してWeb APIを実装してみる</title><link>https://tech.yyh-gl.dev/blog/go_web_api/</link><pubDate>Fri, 14 Jun 2019 09:00:00 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/go_web_api/</guid><description>&lt;h1 id="更新2019年10月30日">更新（2019年10月30日）&lt;/h1>
&lt;p>初回投稿から3ヶ月経ちました。&lt;br>
この3ヶ月で新しく得た知見を基に、内容を一部アップデートしました。&lt;/p>
&lt;h1 id="今回やること">今回やること&lt;/h1>
&lt;p>Goのディレクトリ構成についていろいろと調べる中で、&lt;br>
&lt;a href="https://www.slideshare.net/pospome/go-80591000" target="_blank" rel="noopener noreferrer">こちらの資料&lt;/a>
がとても分かりやすかったので、&lt;br>
今回はこちらを参考にGoでWeb APIを作っていきたいと思います。&lt;/p>
&lt;br>
&lt;p>加えて、本プロジェクトでは、DDD と レイヤードアーキテクチャ を取り入れます。&lt;br>
（内容はほぼレイヤードアーキテクチャになってしまいましたが…）&lt;/p>
&lt;p>DDD については、「DDD を Go とレイヤードアーキテクチャでやるなら、こんな感じかな？」という個人の見解レベルです。&lt;br>
パッケージ構成の参考になれば幸いです。&lt;br>
（なので、ドメインモデルは重度の貧血症）&lt;/p>
&lt;h2 id="環境">環境&lt;/h2>
&lt;ul>
&lt;li>MacOS Mojave 10.14.6&lt;/li>
&lt;li>Go 1.12.5&lt;/li>
&lt;/ul>
&lt;p>なお、今回は、Gin や Mux などといったフレームワークは使わず、&lt;br>
httprouter のみで薄く作っていこうと思います。&lt;/p>
&lt;p>Mux を使った実装は &lt;a href="https://yyh-gl.hatenablog.com/entry/2019/02/08/195310" target="_blank" rel="noopener noreferrer">僕の前のブログで紹介している&lt;/a>
のでよければどうぞ。&lt;/p>
&lt;br>
・
&lt;p>・&lt;/p>
&lt;p>・&lt;/p>
&lt;p>では、早速本題に入っていきましょう。&lt;/p>
&lt;h1 id="採用アーキテクチャレイヤードアーキテクチャ">採用アーキテクチャ：レイヤードアーキテクチャ&lt;/h1>
&lt;p>&lt;a href="https://www.slideshare.net/pospome/go-80591000" target="_blank" rel="noopener noreferrer">参考記事内&lt;/a>
で紹介されているのは &lt;u>レイヤードアーキテクチャ&lt;/u> をベースに &lt;br>
いろいろカスタマイズされたものらしいです。&lt;/p>
&lt;p>クリーンアーキテクチャに似たアーキテクチャだとか。&lt;/p>
&lt;hr>
&lt;p>ユースケース層という呼び方はクリーンアーキテクチャ由来ですね。&lt;/p>
&lt;p>DDD の文脈では アプリケーション層 と呼ばれますが、&lt;br>
アプリケーションって意味が広くて分かりづらいので、&lt;br>
本プロジェクトでは ユースケース という単語を使用します。&lt;/p>
&lt;hr>
&lt;p>とりあえず、今回はスライドページ19で紹介されているディレクトリ構成に従って、 &lt;br>
&lt;u>DDD を意識して&lt;/u> Web API を実装していこうと思います。&lt;/p>
&lt;p>（意識だけして、実践できずに終わりましたが😇）&lt;/p>
&lt;br>
&lt;p>レイヤードアーキテクチャ における各層の依存関係 について説明します。&lt;/p>
&lt;p>依存関係の図は下記のとおりです。&lt;/p>
&lt;img src="https://tech.yyh-gl.dev/img/2019/06/go_web_api/architecture.png" width="600">
&lt;p>矢印は依存の方向を示しています。&lt;br>
例えば、上図だと Handler層 は UseCase層 の処理を利用することを意味します。&lt;/p></description></item><item><title>【goenv】GOPATH が変わらないときの対処法</title><link>https://tech.yyh-gl.dev/blog/gopath/</link><pubDate>Thu, 13 Jun 2019 09:00:00 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/gopath/</guid><description>&lt;h1 id="gopath-が変わらない">GOPATH が変わらない…&lt;/h1>
&lt;p>今日こんな現象に遭遇した。&lt;/p>
&lt;pre>&lt;code>$ export GOPATH=/Users/yyh-gl/workspaces/Go
$ echo $GOPATH
/Users/yyh-gl/workspaces/Go
$ go env GOPATH
/Users/yyh-gl/go/1.12.5
&lt;/code>&lt;/pre>
&lt;p>GOPATH が書き換わらない。&lt;/p>
&lt;h1 id="解決方法">解決方法&lt;/h1>
&lt;img src="https://tech.yyh-gl.dev/img/2019/06/gopath/help.png" width="600">
&lt;p>社内Slack で適当につぶやいたら、同期が助けてくれた（神）&lt;/p>
&lt;p>画像にある Qiita のリンクが &lt;a href="https://qiita.com/gimKondo/items/add08298e24ae400505e" target="_blank" rel="noopener noreferrer">こちら&lt;/a>
&lt;/p>
&lt;p>ちなみに僕の環境の goenv は バージョン 1.12.5 だったので、2系に上げなくても発生する模様。&lt;/p>
&lt;blockquote>
&lt;p>（追記：19/06/14）またまた同期が教えてくれました。&lt;br>
&lt;a href="https://blog.ast.moe/blog/2019-03-26/" target="_blank" rel="noopener noreferrer">こちらの記事&lt;/a>
によると、
goenv による管理は バージョン 1.12 からとのこと。&lt;/p>&lt;/blockquote>
&lt;br>
&lt;p>結論：&lt;u>goenv が GOPATH を管理しようとしてた&lt;/u>&lt;/p>
&lt;br>
&lt;p>goenv の管理から外してやるには &lt;code>GOENV_DISABLE_GOPATH=1&lt;/code> にしてやればOK。&lt;/p>
&lt;p>僕は &lt;code>zshrc&lt;/code> に以下のとおり追記しました。&lt;/p>
&lt;p>&lt;code>export GOENV_DISABLE_GOPATH=1&lt;/code>&lt;/p>
&lt;p>（zshrc の読み込み直しを忘れずに）&lt;/p>
&lt;h1 id="結果">結果&lt;/h1>
&lt;pre>&lt;code>$ go env GOPATH
/Users/yyh-gl/workspaces/Go
&lt;/code>&lt;/pre>
&lt;p>変わった。よかった&lt;/p></description></item><item><title>【エリック・エヴァンスのドメイン駆動設計】DDD入門 Part 1</title><link>https://tech.yyh-gl.dev/blog/evans_ddd_1/</link><pubDate>Tue, 11 Jun 2019 09:00:00 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/evans_ddd_1/</guid><description>&lt;h1 id="ddd-の勉強始めます">DDD の勉強始めます&lt;/h1>
&lt;p>新卒研修を受ける中で DDD が出てきて、勉強したくなったので、&lt;br>
&lt;a href="https://www.amazon.co.jp/dp/B00GRKD6XU/ref=dp-kindle-redirect?_encoding=UTF8&amp;amp;btkr=1" target="_blank" rel="noopener noreferrer">『エリック・エヴァンスのドメイン駆動設計』（エリック・エヴァンス著，今関 剛 監訳，和智 右桂、牧野 祐子 訳）&lt;/a>
を読んでいこうと思います。&lt;/p>
&lt;p>今回は第1部「ドメインモデルを機能させる」の 1章 と 2章 をまとめます。&lt;/p>
&lt;p>注意： 僕の理解をそのままメモとして書き連ねていきます。&lt;br>
したがって、誤った理解もあると思うので、そのときはDMとかでご指摘お願いします！&lt;/p>
&lt;h1 id="1章-知識をかみ砕く">1章 知識をかみ砕く&lt;/h1>
&lt;p>&lt;u>ソフトウェアを作るときに、はじめから対象を十分に理解している開発者などいない。&lt;/u>&lt;/p>
&lt;blockquote>
&lt;p>対象 ＝ これから作るソフトウェアで実現する作業 ＝ ドメイン&lt;/p>&lt;/blockquote>
&lt;p>したがって、対象について詳しい人（ドメインエキスパート）と開発者で &lt;br>
十分に話し合って理解を深めることが重要である。&lt;/p>
&lt;br>
&lt;p>理解したことはモデルとして書き出す。 &lt;br>
そして、ドメインエキスパートは足りないところがあれば追加で説明する。&lt;br>
開発者は分からないところがあれば質問する。&lt;/p>
&lt;p>上記工程を何度も繰り返し、その都度得た知識をモデルに落とし込んでいく。&lt;br>
→ &lt;u>継続的学習&lt;/u>（継続的学習は開発が始まった後でも行う）&lt;/p>
&lt;br>
&lt;p>はじめから対象を如実に表したモデルを作れることは滅多にない。&lt;/p>
&lt;p>ドメインエキスパート と 開発者 では見ている視点が違うので少し話を聞いたぐらいで &lt;br>
完璧なモデルを作ることができないのは当たり前である。&lt;/p>
&lt;p>だからこそ、対話を通して、互いに疑問点や不要な点を洗い出し、洗練する必要がある。&lt;br>
これが &lt;u>知識のかみ砕き&lt;/u> である。&lt;/p>
&lt;h1 id="1章-まとめ">1章 まとめ&lt;/h1>
&lt;ul>
&lt;li>ドメインエキスパートと開発者が話し合ってドメインをモデルに落とし込んでいく
&lt;ul>
&lt;li>用語の説明や不足点の追加など とにかく話す&lt;/li>
&lt;li>ドメイン：ソフトウェア化する対象（業務やサービスなど、ソフトウェア化の対象となりうる万物）&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>一発で完璧なモデリングはできないから、継続的に改善していく&lt;/li>
&lt;/ul>
&lt;h1 id="2章-コミュニケーションと言語の使い方">2章 コミュニケーションと言語の使い方&lt;/h1>
&lt;p>ドメインエキスパートが使う専門用語を開発者は理解できないし、&lt;br>
開発者が使う専門用語をドメインエキスパートは理解できない。&lt;/p>
&lt;p>ドメインエキスパートと開発者の両者が同じ意味だと思って使っていたとしても &lt;br>
たいていの場合、差異がある。&lt;/p>
&lt;p>このような差異があると &lt;u>通訳&lt;/u> が必要となる。&lt;br>
通訳はコミュニケーションを鈍らせ、知識のかみ砕きを沈滞させる。&lt;/p>
&lt;h2 id="共通言語としてのモデル">共通言語としてのモデル&lt;/h2>
&lt;p>通訳をなくすために、 &lt;u>モデルを言語の骨格として使用&lt;/u> する。&lt;/p>
&lt;p>ドメインエキスパートと開発者のコミュニケーションやコード、ドキュメント、図など &lt;br>
全てにおいて、その言語を使用する。&lt;/p></description></item><item><title>【大規模サービス技術入門 5章】大規模データの処理方法についてまとめた</title><link>https://tech.yyh-gl.dev/blog/bigdata_processing/</link><pubDate>Mon, 10 Jun 2019 09:00:00 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/bigdata_processing/</guid><description>&lt;h1 id="はじめに">はじめに&lt;/h1>
&lt;p>社内で伊藤 直也さんと田中 慎司さんが書かれた&lt;/p>
&lt;p>&lt;a href="https://amzn.to/2wR3QlL" target="_blank" rel="noopener noreferrer">『Web開発者のための大規模サービス技術入門』&lt;/a>
を輪読しました。&lt;/p>
&lt;p>今回は、僕が担当した 第5回の「大規模データ処理[実践]入門」についてまとめます。&lt;/p>
&lt;p>なお、本書は2010年に出版された本であるため、&lt;/p>
&lt;p>少なくとも第5回の内容は今では当たり前のことという印象を受けました。&lt;/p>
&lt;p>それでも、しっかりと文章で学んでおくことは大事だと思うのでまとめます。&lt;/p>
&lt;br>
&lt;p>★印は個人メモです。&lt;/p>
&lt;p>以下まとめ&lt;/p>
&lt;h1 id="大量なデータを扱う場面">大量なデータを扱う場面&lt;/h1>
&lt;p>全文検索やデータマイニングなど RDBMSで処理できない規模のデータを&lt;/p>
&lt;p>処理したい場面は多く存在します。&lt;/p>
&lt;p>では、RDBMSが使えない規模のデータをどう処理すればいいでしょうか。&lt;/p>
&lt;h1 id="データを抽出">データを抽出&lt;/h1>
&lt;p>結論から言うと、RDBMSで扱うことができないデータは、適宜RDBMSから &lt;u>抽出&lt;/u> して利用します。&lt;/p>
&lt;h2 id="具体的には">具体的には&lt;/h2>
&lt;p>バッチ処理でRDBMSからデータを抽出し、&lt;/p>
&lt;p>別途インデックスサーバのようなものを作って、そこに入れていきます。&lt;/p>
&lt;blockquote>
&lt;p>★ ここで言っているインデックスサーバというのは、例えば全文検索用であれば&lt;/p>&lt;/blockquote>
&lt;blockquote>
&lt;p>「検索用にチューニングした（検索しやすくした）データ構造」と考えるべきでしょう。&lt;/p>&lt;/blockquote>
&lt;blockquote>
&lt;p>★ 最近は、&lt;a href="https://www.fluentd.org/" target="_blank" rel="noopener noreferrer">Fluentd&lt;/a>
を使用してログを外部に吐き出してから解析したりしますよね。&lt;/p>&lt;/blockquote>
&lt;blockquote>
&lt;p>それと考え方は一緒だと思います。&lt;/p>&lt;/blockquote>
&lt;br>
&lt;p>インデックスサーバにはRPC（Remote Procedure Call）を使ってアクセスします。&lt;/p>
&lt;p>（なお、RPCと言いましたが、現在では Web API でのアクセスが一般的なので、以降、 Web API を例に使用します）&lt;/p>
&lt;p>イメージとしては下図のようになります。&lt;/p>
&lt;img src="https://tech.yyh-gl.dev/img/2019/06/bigdata_processing/web_api_version.png" width="600">
&lt;h1 id="用途特化型のインデクシング">用途特化型のインデクシング&lt;/h1>
&lt;p>上述した方法を、はてな社（著者がはてな社出身の方なのでよく出てきます）では、&lt;/p>
&lt;p>&lt;u>用途特化型インデクシング&lt;/u> と呼ぶそうです。&lt;/p>
&lt;h2 id="用途特化型インデクシングとrdbms">用途特化型インデクシングとRDBMS&lt;/h2>
&lt;p>RDBMS はデータソートや統計処理、JOIN など、データに対して様々な処理を行うことができます。&lt;/p>
&lt;p>しかし、汎用的故に、特定の目的だけに使うときには、それ用にチューニングしたデータ構造、&lt;/p>
&lt;p>すなわち 用途特化型インデクシング を使う方が圧倒的に速くなります。&lt;/p>
&lt;blockquote>
&lt;p>★ 先ほど言っていた Fluentd を用いたログ解析システム は ログ解析用にチューニングしたものと言えるでしょうか。&lt;/p>&lt;/blockquote>
&lt;h1 id="用途特化型インデクシングの使用例-全文検索エンジン">用途特化型インデクシングの使用例： 全文検索エンジン&lt;/h1>
&lt;p>全文検索エンジンでは、以下3点の要求をどう満たすか 考える必要があります。&lt;/p></description></item><item><title>【Web API（Rails） + Vue.js】ブログのいいねボタン自作してみた</title><link>https://tech.yyh-gl.dev/blog/good_api/</link><pubDate>Sat, 08 Jun 2019 09:00:00 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/good_api/</guid><description>&lt;h1 id="いいねボタンがないブログ">いいねボタンがないブログ&lt;/h1>
&lt;p>本ブログ、いいねボタンが &lt;u>ありませんでした&lt;/u>。&lt;/p>
&lt;p>だから、作っちゃいました。っていう記事です。&lt;/p>
&lt;h1 id="構成">構成&lt;/h1>
&lt;img src="https://tech.yyh-gl.dev/img/2019/06/good_api/architecture.png" width="600">
&lt;br>
&lt;p>上図のように&lt;/p>
&lt;p>記事ページからAPIサーバにリクエストを送り、 いいねの数を取得・加算します。&lt;/p>
&lt;p>記事ページからAPIサーバへのリクエスト部分（クライアント）には Vue + axios を使用。&lt;/p>
&lt;p>APIサーバは Rails で実装しました。&lt;/p>
&lt;p>（以前から Slackのスラッシュコマンド用に使用していたAPIサーバを流用しました）&lt;/p>
&lt;h1 id="apiサーバ">APIサーバ&lt;/h1>
&lt;p>Rails で APIサーバを建てる方法に関しては、&lt;/p>
&lt;p>以前に Qiita で &lt;a href="https://qiita.com/yyh-gl/items/30bd91c2b33fdfbe49b5" target="_blank" rel="noopener noreferrer">入門記事&lt;/a>
書いたのでそちらをご覧ください。&lt;/p>
&lt;p>（少し古い記事ですが、そんなに問題はないはずです）&lt;/p>
&lt;h2 id="db-にテーブル作成">DB にテーブル作成&lt;/h2>
&lt;p>今回、ブログ記事を管理するために、下記のテーブルを作成しました。&lt;/p>
&lt;pre>&lt;code>mysql&amp;gt; describe blog_posts;
+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| title | varchar(255) | NO | | NULL | |
| count | varchar(255) | NO | | 0 | |
| created_at | datetime | NO | | NULL | |
| updated_at | datetime | NO | | NULL | |
+------------+--------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
&lt;/code>&lt;/pre>
&lt;p>&lt;code>title&lt;/code>には、日本語のタイトル（本記事だと『【WEB API（RAILS） + VUE.JS】ブログのいいねボタン自作してみた』）ではなく、
記事ファイル（マークダウン）の名前（本記事だと『good_api』, 拡張子抜き）が入ります。&lt;/p></description></item><item><title>スクラムについて学んだ話</title><link>https://tech.yyh-gl.dev/blog/scrum_entry/</link><pubDate>Wed, 05 Jun 2019 09:00:00 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/scrum_entry/</guid><description>&lt;h1 id="スクラムとは">スクラムとは&lt;/h1>
&lt;h2 id="概要">概要&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>&lt;u>変化に対し柔軟に開発を運用するためのアジャイルフレームワーク&lt;/u>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>開発に常に優先度をつける&lt;/p>
&lt;/li>
&lt;li>
&lt;p>仕事を進めることを主眼に考え、そのために改善を常に行う&lt;/p>
&lt;/li>
&lt;li>
&lt;p>ロールが3つあり、協調しあい開発する&lt;/p>
&lt;ul>
&lt;li>プロダクトオーナー&lt;/li>
&lt;li>スクラムチーム&lt;/li>
&lt;li>開発チーム&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>POが満足するアウトプットがあったかのみを検証&lt;/p>
&lt;/li>
&lt;li>
&lt;p>5つのイベントがある（後述）&lt;/p>
&lt;/li>
&lt;li>
&lt;p>2つのアウトプット（成果物）がある（後述）&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h2 id="特徴">特徴&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>非常にシンプルなフレームワーク&lt;/p>
&lt;ul>
&lt;li>定められたルールが他の手法より少なくアレンジが容易&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>実践的で経験主義&lt;/p>
&lt;/li>
&lt;li>
&lt;p>世界的に普及している&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h1 id="アジャイル開発とは">アジャイル開発とは&lt;/h1>
&lt;h2 id="アジャイルとスクラムの違い">アジャイルとスクラムの違い&lt;/h2>
&lt;p>スクラムとはアジャイル開発手法のひとつ&lt;/p>
&lt;p>他にもXPとかがある&lt;/p>
&lt;h1 id="アジャイルソフトウェア開発宣言">アジャイルソフトウェア開発宣言&lt;/h1>
&lt;p>&lt;a href="https://agilemanifesto.org/iso/ja/manifesto.html" target="_blank" rel="noopener noreferrer">ここ&lt;/a>
にいろいろな言語で宣言されています&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;h1 id="スクラムとウォータフォールの違い">スクラムとウォータフォールの違い&lt;/h1>
&lt;ul>
&lt;li>
&lt;p>ウォータフォール&lt;/p>
&lt;ul>
&lt;li>計画、設計、実装、テストが一方向に進む&lt;/li>
&lt;li>リリース直前の実装や仕様に漏れがあると最悪の場合プロジェクトがぽしゃる&lt;/li>
&lt;li>運用・保守には強い。新規案件向けではない&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>スクラム&lt;/p>
&lt;ul>
&lt;li>開発期間中に計画、設計、実装、テストのリサイクルを何度も回す&lt;/li>
&lt;li>細かいスパンでリリースするので、大きな手戻りが少ない&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h1 id="スクラムで登場するロール役割">スクラムで登場するロール（役割）&lt;/h1>
&lt;p>あくまでテンプレの内容を紹介&lt;/p>
&lt;p>自分のチームに合わせて変えてOK（むしろカスタマイズすることが重要）&lt;/p>
&lt;h2 id="プロダクトオーナーpo">プロダクトオーナー（PO）&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>役割&lt;/p>
&lt;ul>
&lt;li>プロダクトのビジネス価値に責任を持つ&lt;/li>
&lt;li>リリース判断をすることができる&lt;/li>
&lt;li>優先度の判断役&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>求められる力&lt;/p>
&lt;ul>
&lt;li>情報アウトプット（見える化、透明性） → 実現したいことをちゃんと伝える力&lt;/li>
&lt;li>クライアントとチームを繋ぐハブ役&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="スクラムマスターsm">スクラムマスター（SM）&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>役割&lt;/p>
&lt;ul>
&lt;li>スクラム開発に関わる全ての人を支援し、成功に導く
&lt;ul>
&lt;li>POのビジネス的な相談を受けたり、開発チームの技術的な相談を受けたり などなど&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>スクラムの理論や価値を関係者全員に教え、理解してもらう&lt;/li>
&lt;li>開発チームへの障害や外部干渉を取り除き、防ぐ&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>求められる力&lt;/p>
&lt;ul>
&lt;li>サーヴァントリーダシップ（奉仕型リーダー）
&lt;ul>
&lt;li>下からみんなを持ち上げるようなリーダー&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>理解と実行の話づくりと良きファシリテーター&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;br>
&lt;blockquote>
&lt;p>&lt;u>SMが開発に加わるのはOK？&lt;/u>&lt;/p>&lt;/blockquote>
&lt;blockquote>
&lt;p>チームが良しとするならばOK。&lt;/p>&lt;/blockquote>
&lt;blockquote>
&lt;p>はじめから参加することは基本的にない。&lt;/p>&lt;/blockquote>
&lt;h2 id="開発チーム">開発チーム&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>役割&lt;/p></description></item><item><title>【Terraform + ECS + RDS】Terraform で ECS環境構築してみた</title><link>https://tech.yyh-gl.dev/blog/terraform_ecs/</link><pubDate>Tue, 04 Jun 2019 09:00:00 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/terraform_ecs/</guid><description>&lt;h1 id="terraform-とは">Terraform とは&lt;/h1>
&lt;p>最近流行りの IaC です。&lt;/p>
&lt;p>つまり、コードベースでインフラリソースを管理するためのツールです。&lt;/p>
&lt;p>中でもTerraform はクラウドに特化した IaC ツールという立ち位置です。&lt;/p>
&lt;p>AWSやGCP, Azure などの他に&lt;a href="https://www.terraform.io/docs/providers/index.html" target="_blank" rel="noopener noreferrer">様々なクラウドプラットフォーム&lt;/a>
に対応しています。&lt;/p>
&lt;p>（ちなみに、Vagrant 開発元の &lt;a href="https://www.hashicorp.com/" target="_blank" rel="noopener noreferrer">HashiCorp&lt;/a>
社が開発しています）&lt;/p>
&lt;h1 id="今回やること">今回やること&lt;/h1>
&lt;p>Terraform で AWS 上に下記のような環境を自動構築します。&lt;/p>
&lt;img src="https://tech.yyh-gl.dev/img/2019/06/terraform_ecs/architecture.png" width="600">
&lt;br>
&lt;p>ECS でデプロイされるサービスは ECR から引っ張ってくるようにします。&lt;/p>
&lt;p>そして、そのサービスは Aurora を使うシステムを想定しています。&lt;/p>
&lt;p>&lt;u>【⚠注意⚠】上記構成はお金が発生します！ まったくもって無料枠ではありません！&lt;/u>&lt;/p>
&lt;p>【⚠注意⚠】今回独自ドメインを使用していますが、ドメイン取得に関しては省略しています。&lt;/p>
&lt;h2 id="今回やる内容は">今回やる内容は…&lt;/h2>
&lt;p>僕が所属する会社の研修資料を参考に進めています。&lt;/p>
&lt;p>資料を作成してくださった&lt;a href="https://twitter.com/_y_ohgi" target="_blank" rel="noopener noreferrer">@_y_ohgi&lt;/a>
さんに感謝。&lt;/p>
&lt;h1 id="自動構築プロセス全体で使用する共通設定を定義">自動構築プロセス全体で使用する共通設定を定義&lt;/h1>
&lt;p>まず、 &lt;code>main.tf&lt;/code> を作成し、以下のとおり共通設定を定義していきます。&lt;/p>
&lt;pre>&lt;code># AWS を利用することを明示
provider &amp;quot;aws&amp;quot; {
# リージョンを設定
region = &amp;quot;ap-northeast-1&amp;quot;
}
# これから作成するリソースに付与する名前のプリフィックスを設定
# グローバル変数的な立ち位置で定義
variable &amp;quot;prefix&amp;quot; {
default = &amp;quot;sample-project&amp;quot;
}
&lt;/code>&lt;/pre>
&lt;p>&lt;code>provider&lt;/code> で使用するクラウドを指定することができます。&lt;/p>
&lt;p>&lt;code>variable&lt;/code> は変数定義です。&lt;/p></description></item><item><title>【Android + Kotlin + Firebase】Androidアプリにプッシュ通知を実装してみた</title><link>https://tech.yyh-gl.dev/blog/android_push/</link><pubDate>Thu, 30 May 2019 09:00:00 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/android_push/</guid><description>&lt;p>僕がひっかかった場所は 「つまづきポイント」 という章にまとめているので&lt;/p>
&lt;p>なにか困ったときはそこを一度見てみてください。&lt;/p>
&lt;h1 id="tldr">tl;dr&lt;/h1>
&lt;ul>
&lt;li>Firebase使ってAndroidアプリにプッシュ通知を実装した&lt;/li>
&lt;li>フォアグラウンドとバックグラウンドで表示方法が異なる&lt;/li>
&lt;li>めちゃくちゃ簡単&lt;/li>
&lt;/ul>
&lt;h1 id="開発環境">開発環境&lt;/h1>
&lt;ul>
&lt;li>macOS Mojave 10.14.4&lt;/li>
&lt;li>Android Studio 3.4.1&lt;/li>
&lt;li>Gradle 3.4.1&lt;/li>
&lt;li>Java 1.8.0_202&lt;/li>
&lt;li>Kotlin 1.3.21&lt;/li>
&lt;/ul>
&lt;h1 id="firebaseに登録">Firebaseに登録&lt;/h1>
&lt;p>Firebaseを使用するためには登録が必要です。&lt;/p>
&lt;p>Googleアカウントを持っている方なら&lt;a href="https://firebase.google.com/?hl=ja" target="_blank" rel="noopener noreferrer">公式サイト&lt;/a>
から簡単に登録できます&lt;/p>
&lt;h1 id="firebaseにプロジェクト作成">Firebaseにプロジェクト作成&lt;/h1>
&lt;p>&lt;a href="https://console.firebase.google.com/" target="_blank" rel="noopener noreferrer">プロジェクト登録ページ&lt;/a>
でプロジェクトを登録します。&lt;/p>
&lt;p>プロジェクト名は特に指定はありません。ご自由にどうぞ。&lt;/p>
&lt;h1 id="アプリ情報を登録する">アプリ情報を登録する&lt;/h1>
&lt;p>プロジェクト選択後のホーム画面より 「Project Overview」 をクリック。&lt;/p>
&lt;p>画面の指示に従って進めていてください。&lt;/p>
&lt;h2 id="デバッグ用の署名証明書-sha-1-の取得方法">デバッグ用の署名証明書 SHA-1 の取得方法&lt;/h2>
&lt;ol>
&lt;li>
&lt;p>以下コマンドを実行&lt;/p>
&lt;p>Mac/Linux&lt;/p>
&lt;pre>&lt;code>keytool -list -v \
-alias androiddebugkey -keystore ~/.android/debug.keystore
&lt;/code>&lt;/pre>
&lt;p>Windows&lt;/p>
&lt;pre>&lt;code>keytool -list -v \
-alias androiddebugkey -keystore %USERPROFILE%\.android\debug.keystore
&lt;/code>&lt;/pre>
&lt;/li>
&lt;li>
&lt;p>パスワード入力&lt;/p>
&lt;p>パスワードは &lt;code>android&lt;/code> です。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>表示される SHA-1 をメモ&lt;/p>
&lt;/li>
&lt;/ol>
&lt;br>
&lt;hr>
&lt;p>ひととおり作業が進むと、↓このような画面が表示されます。&lt;/p>
&lt;img src="https://tech.yyh-gl.dev/img/2019/05/android_push/app-registering-complete.png" width="750">
&lt;p>自分の環境では、登録したアプリがFirebaseと通信できているかのチェックに少し時間がかかりました。&lt;/p></description></item><item><title>【エンジニアリング組織論への招待】メンタリングの技術</title><link>https://tech.yyh-gl.dev/blog/engineering_organization_theory_mentoring/</link><pubDate>Sat, 25 May 2019 09:00:00 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/engineering_organization_theory_mentoring/</guid><description>&lt;h1 id="概要">概要&lt;/h1>
&lt;p>今回は、広木 大地さんが書かれた
『&lt;a href="https://www.amazon.co.jp/%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0%E7%B5%84%E7%B9%94%E8%AB%96%E3%81%B8%E3%81%AE%E6%8B%9B%E5%BE%85-%E4%B8%8D%E7%A2%BA%E5%AE%9F%E6%80%A7%E3%81%AB%E5%90%91%E3%81%8D%E5%90%88%E3%81%86%E6%80%9D%E8%80%83%E3%81%A8%E7%B5%84%E7%B9%94%E3%81%AE%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0-%E5%BA%83%E6%9C%A8-%E5%A4%A7%E5%9C%B0/dp/4774196053/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&amp;crid=1RMF6RYJ2VXGL&amp;keywords=%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0%E7%B5%84%E7%B9%94%E8%AB%96%E3%81%B8%E3%81%AE%E6%8B%9B%E5%BE%85&amp;qid=1558967032&amp;s=gateway&amp;sprefix=%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0%2Caps%2C244&amp;sr=8-1">エンジニアリング組織論への招待 不確実性に向き合う思考と組織のリファクタリング&lt;/a>』
という本から、&lt;/p>
&lt;p>2章「メンタリングの技術」についてまとめます。&lt;/p>
&lt;p>（初投稿の内容が技術系じゃなくてチームマネジメント系かよとか言わないでくださいね）&lt;/p>
&lt;h2 id="最初に覚えておいてほしいこと">最初に覚えておいてほしいこと&lt;/h2>
&lt;p>メンタリングは、自律的な人材を育むために行う。&lt;/p>
&lt;p>そのために、下記3点の状態にメンティ自身からなれるように導く。&lt;/p>
&lt;ul>
&lt;li>自分の気がつかなかった問題に気がつくようになる&lt;/li>
&lt;li>認知の歪みによる感情と問題の癒着を切り離せる&lt;/li>
&lt;li>答えではなく、次の一手を生み出す行動が取れるようになる&lt;/li>
&lt;/ul>
&lt;p>これらがとても重要です。&lt;/p>
&lt;p>以下いろいろな話が出てきますが、結局は上記3点の状態を実現するための方法です。&lt;/p>
&lt;p>ここをしっかりと意識して読んでいただければ、&lt;/p>
&lt;p>より一層理解が深まると思います。&lt;/p>
&lt;br>
&lt;p>以下まとめ
（★マークは個人的解釈・感想です）&lt;/p>
&lt;h1 id="そもそもメンタリングとは">そもそもメンタリングとは&lt;/h1>
&lt;ul>
&lt;li>相手を上から押し付けるような教育方法ではない&lt;/li>
&lt;li>相手の考え方を少しずつ変えることで、問題解決の力を育む手法&lt;/li>
&lt;/ul>
&lt;p>対話を通じて、以下の2点を行い、相手を成長させる。&lt;/p>
&lt;ul>
&lt;li>歪んだ認知を補正&lt;/li>
&lt;li>次の行動を促進&lt;/li>
&lt;/ul>
&lt;p>メンタリングと聞くと、&lt;/p>
&lt;p>大学で何年も学ばないと身に着けられないような技術であると思いがちだが、&lt;/p>
&lt;p>&lt;u>体得すればだれでもできるようになる。&lt;/u>&lt;/p>
&lt;h1 id="エンジニアリングにおけるメンタリングの重要性">エンジニアリングにおけるメンタリングの重要性&lt;/h1>
&lt;h2 id="エンジニアリングは知識が全てではない">エンジニアリングは知識が全てではない&lt;/h2>
&lt;p>エンジニアリングでは技術的な課題がよく取り上げられるが、&lt;/p>
&lt;p>&lt;u>技術的な課題というのは心理的な課題と密接に関係&lt;/u>している。&lt;/p>
&lt;p>例えば、&lt;/p>
&lt;ul>
&lt;li>ソフトウェア開発はチームプレイ&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>★ 技術的な課題解決だけでなく、人間関係とかもあるってことかな&lt;/p>&lt;/blockquote>
&lt;ul>
&lt;li>各個人の開発における問題解決は、自分自身との対話によって制御するもの&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>★ 自身を制すものがエラーを制す&lt;/p>&lt;/blockquote>
&lt;p>上記のようにエンジニアリングには心理的な課題も存在する。&lt;/p>
&lt;p>プロダクト開発では &lt;u>不確実性を排除する&lt;/u> ことがとても重要である。&lt;/p>
&lt;p>したがって、不確実性のひとつである心理的な課題は排除すべき対象である。&lt;/p>
&lt;blockquote>
&lt;p>★ だから、メンタリングが重要なんですね。&lt;/p>&lt;/blockquote>
&lt;br>
&lt;h1 id="メンタリングは-自ら考える人材を作る-ためのテクニック">メンタリングは &lt;u>自ら考える人材を作る&lt;/u> ためのテクニック&lt;/h1>
&lt;h2 id="自立型人材と依存型人材">自立型人材と依存型人材&lt;/h2>
&lt;p>自ら考える人材を自立型人材、そうでない人材を依存型人材とすると、&lt;/p>
&lt;p>それぞれ下記のような特徴がある。&lt;/p>
&lt;ul>
&lt;li>自立型人材
&lt;ul>
&lt;li>自ら問題を発見し、解決することができる&lt;/li>
&lt;li>問題について、自分ごととして捉えている&lt;/li>
&lt;li>問題の根本的原因は自分にあると考える
&lt;ul>
&lt;li>改善のために行動できる&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>依存型人材
&lt;ul>
&lt;li>問題を与えられてから考える&lt;/li>
&lt;li>問題と解決策を渡されてから動ける&lt;/li>
&lt;li>問題の根本的原因は他人にあると考える
&lt;ul>
&lt;li>改善のために行動できず、他人のせいにしてしまう&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="両人材の境界線">両人材の境界線&lt;/h2>
&lt;p>多くの人は時には自立型人材、しかし、ある場面では依存型人材になってしまう。&lt;/p>
&lt;p>それが普通である。&lt;/p>
&lt;p>大事なのは、 &lt;u>上司と部下という関係における期待値を合わせておくこと&lt;/u>。&lt;/p></description></item><item><title>Hello Wolrd</title><link>https://tech.yyh-gl.dev/blog/hello_world/</link><pubDate>Wed, 22 May 2019 09:00:00 +0900</pubDate><guid>https://tech.yyh-gl.dev/blog/hello_world/</guid><description>&lt;h1 id="技術ブログはじめます">技術ブログはじめます&lt;/h1>
&lt;p>不定期で学んだことをアウトプットしていきます。&lt;/p>
&lt;p>サーバサイドのネタを中心に、フロントやインフラ（クラウド）の話も書いていく予定です。&lt;/p>
&lt;p>まさかり大歓迎です。&lt;/p>
&lt;h1 id="自己紹介">自己紹介&lt;/h1>
&lt;p>19新卒として社会人1年目を始めたエンジニアです。&lt;/p>
&lt;p>学生時代はインターンやアルバイトで&lt;/p>
&lt;p>ECサービスやスマホゲームのバックエンドなどを開発していました。&lt;/p>
&lt;p>現在は、フルスタックエンジニア目指して、日々修行中。&lt;/p>
&lt;p>（メインはサーバサイド）&lt;/p>
&lt;p>学んだことをアウトプットする場として&lt;/p>
&lt;p>本ブログを始めました。&lt;/p>
&lt;p>頑張ります&lt;/p></description></item></channel></rss>