<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Job on ashitaka blog</title>
    <link>https://8fd9c3c3.blog-1xe.pages.dev/categories/job/</link>
    <description>Recent content in Job on ashitaka blog</description>
    <generator>Hugo</generator>
    <language>ja-jp</language>
    <lastBuildDate>Sun, 31 Jul 2022 07:37:52 +0900</lastBuildDate>
    <atom:link href="https://8fd9c3c3.blog-1xe.pages.dev/categories/job/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>AWSのアカウントは分けると安心</title>
      <link>https://8fd9c3c3.blog-1xe.pages.dev/2022/07/31/aws-organizations/</link>
      <pubDate>Sun, 31 Jul 2022 07:37:52 +0900</pubDate>
      <guid>https://8fd9c3c3.blog-1xe.pages.dev/2022/07/31/aws-organizations/</guid>
      <description>&lt;p&gt;自分がAWSを触ったのは、大学院時代に友達と簡単なWebサービスをデプロイするときに使ったのが初めてでした。1通り基本的なことを学ぶために、udemyの教材を使って基本的なリソースをマネジメントコンソールから作って削除していました。&lt;/p&gt;
&lt;p&gt;そういった個人的な開発をする中ではなかなかAWSアカウントを複数作ることはなく、1つのAWSアカウントの中にサーバーやデータベースを作ることが多いです。&lt;/p&gt;
&lt;p&gt;しかし、現職に入社してIDaaS経由でAWSの権限をもらったときに大量のアカウントが表示されていてびっくりしました。今ではとても理に適った管理方法だなと思うので、その感想をつらつら書きます。&lt;/p&gt;
&lt;h2 id=&#34;参考&#34;&gt;参考&lt;/h2&gt;
&lt;p&gt;AWSのマルチアカウント戦略ってなに？なぜ必要？【社内勉強会スライド】&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://dev.classmethod.jp/articles/why-aws-multi-accounts/&#34;&gt;https://dev.classmethod.jp/articles/why-aws-multi-accounts/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;メリット&#34;&gt;メリット&lt;/h2&gt;
&lt;h3 id=&#34;権限が分離されている安心感がすごい&#34;&gt;権限が分離されている安心感がすごい&lt;/h3&gt;
&lt;p&gt;現職ではサービスの環境をDevelopment、Staging、Productionの3種類にわけていて、アプリケーションをEKSで動かしています。&lt;/p&gt;
&lt;p&gt;1つのAWSアカウント内でこれをやろうとすると、環境ごとのVPC、IAM Role、EKSクラスタを作ったりする必要があり、ちゃんと分離できているのかが不安になります。&lt;/p&gt;
&lt;p&gt;しかし、環境ごとにAWSアカウントを作成するとこんな感じになります。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;../../wp-content/uploads/2022/07/aws-multi-accounts-separeted-by-environment.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;お互いが絶対に干渉しないので、内部の設定ミスによる事故を防いだり、外部からの攻撃の影響範囲を制限することにつながります。&lt;/p&gt;
&lt;h2 id=&#34;工夫が必要な点&#34;&gt;工夫が必要な点&lt;/h2&gt;
&lt;h3 id=&#34;初期に必要なawsリソースをcloudformationで作成&#34;&gt;初期に必要なAWSリソースをCloudFormationで作成&lt;/h3&gt;
&lt;p&gt;Terraformを使って各AWSアカウントのリソースを管理したいところですが、初期の状態ではTerraformを実行するためのIAM Roleもないわけです。それをアカウントごとに作成するのは大変なので、CloudFormationを使って最低限必要なリソースを全てのアカウントに対して作成します。&lt;/p&gt;
&lt;p&gt;AWS Organizationを使ってAWSアカウントをOrganization Unit単位でグルーピングしておけば、より細かいリソース作成が可能になります。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;../../wp-content/uploads/2022/07/aws-multi-accounts-separeted-by-environment-2.jpg&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;transit-gatewayを使ってawsアカウントをまたがった通信を行う&#34;&gt;Transit Gatewayを使ってAWSアカウントをまたがった通信を行う&lt;/h3&gt;
&lt;p&gt;各サービスにおいてEKSクラスタを共有させたいが、DBやStorageは別アカウントで持たせたいということもあると思います。実現する方法の1つとして、Transit Gatewayを用いる方法が挙げられます。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;../../wp-content/uploads/2022/07/aws-multi-accounts-separeted-by-environment-1.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;この記事をとても参考にさせてもらいました🙏&lt;/p&gt;
&lt;p&gt;Transit Gatewayを利用してVPC間で通信してみた&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://dev.classmethod.jp/articles/transit-gateway-vpc/&#34;&gt;https://dev.classmethod.jp/articles/transit-gateway-vpc/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;現職でプロダクトの開発に携わりながら、こういったインフラを扱うSREのタスクもやらせてもらっていて、学んだことを残していこうと思います💪&lt;/p&gt;</description>
    </item>
    <item>
      <title>Goのエラーハンドリングが好き</title>
      <link>https://8fd9c3c3.blog-1xe.pages.dev/2022/07/16/golang-error-handling/</link>
      <pubDate>Sat, 16 Jul 2022 00:40:42 +0900</pubDate>
      <guid>https://8fd9c3c3.blog-1xe.pages.dev/2022/07/16/golang-error-handling/</guid>
      <description>&lt;h2 id=&#34;goとの出会い&#34;&gt;Goとの出会い&lt;/h2&gt;
&lt;p&gt;自分がGoを触り始めたきっかけは、大学院1回生の時に研究室の先輩と一緒に出たISUCONでした。パフォーマンスの観点でGoがめっちゃいいらしいからGoで出ようってなって、Go Tourなんかで勉強してました。&lt;/p&gt;
&lt;p&gt;当時なんでもGithubにpushしたい病だったので、よーわからんリポジトリもありました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/adshidtadka/go_tour&#34;&gt;https://github.com/adshidtadka/go_tour&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;エラーハンドリングがめんどくさい&#34;&gt;エラーハンドリングがめんどくさい&lt;/h2&gt;
&lt;p&gt;そもそもプログラミングをちゃんと始めたのが大学4回生のDonutsでのアルバイトで、経験が浅いなんちゃてプログラマーでした。つまり、エラーハンドリングなんてかったるいと思っているわけです。&lt;/p&gt;
&lt;p&gt;そんなマインドでGoのコードを読むと、どんな関数もerrorを返してくることにびっくりします。&lt;/p&gt;
&lt;p&gt;こんな感じで何か関数を呼び出すとすかさずerrorが帰ってくるので、いちいちエラーハンドリングを書くのがめんどくさく握りつぶしたいという思いに駆られることが幾度となくありました。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;type&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Result&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt;{}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;doSomething&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;code&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;) (&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Result&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;error&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;code&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ok&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Result&lt;/span&gt;{}, &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;errors&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;New&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;エラーだよ&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#a6e22e&#34;&gt;_&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;doSomething&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;error&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#75715e&#34;&gt;// エラーハンドリングをいちいち書かされる&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;他の言語の多くにはtry-catchの仕組みがあるので、こっちのが絶対便利とか思っていました。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ts&#34; data-lang=&#34;ts&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;type&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Result&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;doSomething&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;code&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Result&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;code&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ok&amp;#34;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; {};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Error(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;エラーだよ&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; () &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;result&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;doSomething&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  } &lt;span style=&#34;color:#66d9ef&#34;&gt;catch&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;e&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ここ1箇所でまとめてエラーハンドリングできる
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;やっぱりエラーハンドリングしたい&#34;&gt;やっぱりエラーハンドリングしたい&lt;/h2&gt;
&lt;p&gt;大学3年、社会人2年の時を経て考え方が変わりました。関数たちに対して思うことはエラーを勝手にthrowせずにちゃんと返して欲しいと思うようになりました。&lt;/p&gt;
&lt;p&gt;その理由の一例がこちらです。最近プロダクトを開発する中で、不具合調査に時間がかかった例でもあります。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ts&#34; data-lang=&#34;ts&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;type&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Result&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;doSomething&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;code&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Result&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;code&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ok&amp;#34;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; {};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Error(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;エラーだよ&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; () &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;result&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;doSomething&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;result2&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;doSomething&lt;/span&gt;(); &lt;span style=&#34;color:#75715e&#34;&gt;// こいつが呼ばれるかどうかわからない
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;  } &lt;span style=&#34;color:#66d9ef&#34;&gt;catch&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;e&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;try句のコードは全て呼ばれるわけではないのです。勝手にジャンプしてcatch句にいく可能性を考えてコーディングする必要があります。try句には長い処理を書かない方が無難でしょう。&lt;/p&gt;</description>
    </item>
    <item>
      <title>React Hooksに対するテストを書いていきたい</title>
      <link>https://8fd9c3c3.blog-1xe.pages.dev/2022/07/09/react-hooks-test/</link>
      <pubDate>Sat, 09 Jul 2022 02:30:50 +0900</pubDate>
      <guid>https://8fd9c3c3.blog-1xe.pages.dev/2022/07/09/react-hooks-test/</guid>
      <description>&lt;p&gt;ご無沙汰しております。会社のプロダクトチームの新しいメンバーの方がGoのLT会に出ておられて、自分もそういった個人での活動をしたくなった次第です。&lt;/p&gt;
&lt;h2 id=&#34;react-hooksとは&#34;&gt;React Hooksとは&lt;/h2&gt;
&lt;p&gt;以下の公式ドキュメントが詳しいです。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://ja.reactjs.org/docs/hooks-intro.html&#34;&gt;https://ja.reactjs.org/docs/hooks-intro.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;前職ではAngularで開発を行なっていたのですが、コンポーネントを定義するためにクラスを定義していて、意図しないタイミングでインスタンス変数が書き換わっているみたいなことがザラにありました。&lt;/p&gt;
&lt;p&gt;Hookがない時代のReactも触ったことがあったのですが、同じようにクラスを定義してごにょごにょしなければいけないイメージがあって、現職でReactを触り始めるまではAngularもReactもさして変わらんでしょ、と思っていました。&lt;/p&gt;
&lt;p&gt;結論、ReactのHookによりReactがとても気に入りました。関数でコンポーネントを定義できるので理解しやすく挙動も予想しやすいですし、カスタムHookを定義することでコンポーネントのロジックの部分だけを簡単に再利用することができます。&lt;/p&gt;
&lt;h2 id=&#34;なぜhookに対してテストを書くの&#34;&gt;なぜHookに対してテストを書くの?&lt;/h2&gt;
&lt;p&gt;Hookはコンポーネントのロジックを司る部分であるため、テストが書きやすく実行も早いからです。&lt;/p&gt;
&lt;p&gt;Hookだけでなく、コンポーネントに対してももちろんテストを書くことができます。以下のレシピ集においても、DOMどんな要素が描画されているのかをテストする方法が示されています。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://ja.reactjs.org/docs/testing-recipes.html&#34;&gt;https://ja.reactjs.org/docs/testing-recipes.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;しかし、DOMに対するテストは書きにくいです。評価する部分を書く際に&lt;code&gt;container.querySelector(&amp;quot;strong&amp;quot;).textContent&lt;/code&gt; みたいな感じで要素にアクセスする必要があるのですが、DOM構造を知っていないと書けません。要素があるかないかではなくDOM構造をテストしたいのであれば、テストを書くのではなくStorybookなんかを使って見た目を確認する方が本質的です。&lt;/p&gt;
&lt;p&gt;また、DOMに対するテストは実行に時間がかかります。DOMの描画自体に時間がかかるというのもありますし、依存しているコンポーネントもビルドしなければならないという原因もあります。&lt;/p&gt;
&lt;p&gt;前職ではDOMに対するテストがビルド時間短縮のボトルネックになっていて、JasmineからJestに移行することでいくらか速くならないかみたいなことを試行錯誤していました。&lt;/p&gt;
&lt;p&gt;そこで、Hookに対してテストを書くわけです。HookにはDOM構造の概念がなく、stateに対して評価が書けます。DOMを描画する処理もなく、他のHookに依存しているみたいなことも少ないです。&lt;/p&gt;
&lt;h2 id=&#34;どうやって書くの&#34;&gt;どうやって書くの?&lt;/h2&gt;
&lt;p&gt;以下のドキュメントにある書き方を拝借させていただきます。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://react-hooks-testing-library.com/usage/basic-hooks&#34;&gt;https://react-hooks-testing-library.com/usage/basic-hooks&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;こんな感じのカスタムHookがあれば、&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;import { useState, useCallback } from &amp;#39;react&amp;#39;

export default function useCounter(initialValue = 0) {
  const [count, setCount] = useState(initialValue)
  const increment = useCallback(() =&amp;gt; setCount((x) =&amp;gt; x + 1), [])
  return { count, increment }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;こんな感じでテストがかけます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;import { renderHook, act } from &amp;#39;@testing-library/react-hooks&amp;#39;
import useCounter from &amp;#39;./useCounter&amp;#39;

test(&amp;#39;should increment counter from custom initial value&amp;#39;, () =&amp;gt; {
  const { result } = renderHook(() =&amp;gt; useCounter(9000))

  act(() =&amp;gt; {
    result.current.increment()
  })

  expect(result.current.count).toBe(9001)
})
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;よくないですか?? 評価対象がHookの返り値としてreturnされるので、&lt;code&gt;result.current.count&lt;/code&gt; みたいにさくっとアクセスできちゃいます。Hook内で作ったCallbackを呼び出したい時も、結局Hookの返り値としてreturnされるので、&lt;code&gt;result.current.increment()&lt;/code&gt; みたいにさくっと呼び出せちゃいます。&lt;/p&gt;</description>
    </item>
    <item>
      <title>エンジニアの仕事をなるべくわかりやすく書いてみる</title>
      <link>https://8fd9c3c3.blog-1xe.pages.dev/2022/03/22/what-is-engineering/</link>
      <pubDate>Tue, 22 Mar 2022 06:46:02 +0900</pubDate>
      <guid>https://8fd9c3c3.blog-1xe.pages.dev/2022/03/22/what-is-engineering/</guid>
      <description>&lt;p&gt;自分は2018年から2020年3月まで大学院で2年間情報学を勉強・研究してエンジニアリングに触れ、2020年4月からはヤフー株式会社で新卒として企業でのエンジニアリングを学びました。2021年5月から株式会社グラファーに転職して、今現在”スマート申請”という製品のエンジニアとして働いています。&lt;/p&gt;
&lt;p&gt;しかし、一口にエンジニアといってもやってていることはバラバラで、エンジニア同士であっても何してるかは見えてこないのに、ましてやエンジニアでない人は本当に何してるか想像もつかないと思います。&lt;/p&gt;
&lt;p&gt;そこで、なるべくエンジニアでない人でもわかるように自分が毎日どんな仕事をしているか説明してみようと思います。&lt;/p&gt;
&lt;h3 id=&#34;ちなみにスマート申請って何&#34;&gt;ちなみにスマート申請って何&lt;/h3&gt;
&lt;p&gt;オンラインで行政手続きが完結できるようにする製品です。一般的なwebフォームに必要な情報を入力して送信するだけで申請が完結します。&lt;/p&gt;
&lt;h3 id=&#34;ざっくり何してるの&#34;&gt;ざっくり何してるの&lt;/h3&gt;
&lt;p&gt;基本的にはユーザーがかかえている課題に対して、課題を解決する方法を提供することが自分の仕事です。こんなもの作って欲しいみたいな設計書が上司から渡されて、スケジュールに間に合うようにそれ通りになんか作っているわけではないです。&lt;/p&gt;
&lt;h3 id=&#34;最初にすること&#34;&gt;最初にすること&lt;/h3&gt;
&lt;p&gt;まず、ユーザーがどんな課題を持っているのかを特定します。&lt;/p&gt;
&lt;p&gt;過去に自分が取り組んだ内容を噛み砕いたものが、”申請者に必要な入力項目だけ表示してほしい”というものでした。&lt;/p&gt;
&lt;p&gt;しかし、”必要な入力項目だけ表示してほしい”というのは機能要望であって、課題ではありません。&lt;/p&gt;
&lt;p&gt;“なぜ必要な入力項目だけ表示したいのか?”という問いから、”項目いっぱいあったら読むのに負担がかかるから”のように課題の形に変換し、”なぜいっぱいあったら負担がかかるのか?”のように課題をどんどん深掘っていきます。&lt;/p&gt;
&lt;p&gt;その過程で、エンジニアの自分がユーザーにインタビューすることもありますし、ユーザーに近いビジネスのメンバーとディスカッションすることもあります。&lt;/p&gt;
&lt;p&gt;結論、”必要かどうか判断する認知コストがかかる”というのが課題と判断しました。&lt;/p&gt;
&lt;h3 id=&#34;課題の深掘り&#34;&gt;課題の深掘り&lt;/h3&gt;
&lt;p&gt;課題を深堀りして特定できれば、それが解決できる方法を考えて、その課題を解決できるような機能要求に落とし込んでいきます。&lt;/p&gt;
&lt;p&gt;先程の”必要かどうか判断する認知コストがかかる”の課題に対する要求としては、”不必要な入力項目は隠せるようにすること”のような形になります。&lt;/p&gt;
&lt;p&gt;この機能要求で課題が解決されるかを確認します。&lt;/p&gt;
&lt;p&gt;必要かどうかの判断を申請フォームが行って不必要なものを隠してくれたら、認知コストの課題は解決されそうですね。&lt;/p&gt;
&lt;h3 id=&#34;いざ開発&#34;&gt;いざ開発&lt;/h3&gt;
&lt;p&gt;要求を洗い出して要求を満たすことで課題が解決できると確認できたら、実際に開発を行って行きます。ここからがエンジニア以外の方に説明するのが難しいのですが。。。&lt;/p&gt;
&lt;p&gt;エクセルで関数を使ったことがある方ならば、”SUMというエクセルの関数を使って、複数のセルの合計する”という要求を満たすことができると思います。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;../../wp-content/uploads/2022/04/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2022-04-16-11.24.23.png&#34;&gt;
SUMの使用例&lt;/p&gt;
&lt;p&gt;そんな感じで、”JavaScriptというプログラミング言語を使って、その項目が不必要であれば隠す”という要求を満たします。&lt;/p&gt;
&lt;p&gt;エクセルだと最終的に式が出来上がりますが、プログラミングだと最終的にソースコードが出来上がります。&lt;/p&gt;
&lt;h3 id=&#34;開発できたことをテストで証明&#34;&gt;開発できたことをテストで証明&lt;/h3&gt;
&lt;p&gt;まだまだやることはたくさんあります。次にテストを書きます。&lt;/p&gt;
&lt;p&gt;エクセルでsumを使って合計を計算するときも、ちゃんと合計が計算されるようになっているか確かめるために、セルにいろんな数字を入力すると思います。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;../../wp-content/uploads/2022/04/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2022-04-16-11.25.15.png&#34;&gt;
300から100に変更&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;../../wp-content/uploads/2022/04/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2022-04-16-11.25.27-2.png&#34;&gt;
合計が800から600に変わる&lt;/p&gt;
&lt;p&gt;同じことをエンジニアも行います。フォームにいろんな入力をしてみて、不必要と判断される場合にちゃんと隠れるのを確認します。&lt;/p&gt;
&lt;p&gt;しかし、エンジニアはここで飽き足らずこれが自動的に確かめられるようにします。それがテストコードと呼ばれるものです。&lt;/p&gt;
&lt;p&gt;テストコードを作ってそのコードを実行すると、必要な項目は表示されるし不必要な項目は表示されないことが自動的に確かめられます。ソースコードがちゃんと動く証明書がテストコードです。&lt;/p&gt;
&lt;h3 id=&#34;ソースコードを組み合わせる&#34;&gt;ソースコードを組み合わせる&lt;/h3&gt;
&lt;p&gt;手元のPCで作って正しく動くことが確かめられても、ユーザーの課題は解決されません。ユーザーの方が触る申請フォームにこの機能を取り入れねばなりません。&lt;/p&gt;
&lt;p&gt;パワポを複数人で編集したことがある人はわかると思うのですが、最新版だと思って自分の編集を取り入れてみたら、実は古いバージョンで、他の人の変更が反映されてなかった！みたいなことがあると思います。&lt;/p&gt;
&lt;p&gt;エンジニアも複数人でソースコードを編集するのでこれが起こることは必死です。&lt;/p&gt;
&lt;p&gt;そこでエンジニアはgitというバージョン管理ツールを使って、間違って古いバージョンが入らないようにします。&lt;/p&gt;
&lt;h3 id=&#34;いざユーザーの手に&#34;&gt;いざユーザーの手に&lt;/h3&gt;
&lt;p&gt;最後にユーザーに手が届くところにソースコードを持っていきます。&lt;/p&gt;
&lt;p&gt;サーバーと言ってどんなふうに解釈されるか想像もつかないのですが、みなさんがスマートフォンでアクセスする先には必ずサーバーがあります。ここにアクセスしてもらってユーザーは申請フォームを見ることができます。&lt;/p&gt;
&lt;p&gt;ですので、そのサーバーにあったソースコードを最新版のソースコードに入れ替えてあげることでやっとユーザーに機能が届きました🎉&lt;/p&gt;
&lt;p&gt;ユーザーに機能を届けることを私たちはリリースと呼びます。&lt;/p&gt;
&lt;h3 id=&#34;機能のリリース課題の解決&#34;&gt;機能のリリース≠課題の解決&lt;/h3&gt;
&lt;p&gt;課題が解決されるように機能要求を考えて開発はしたのですが、実際に機能をリリースすることで課題が必ず解決されるとは限りません。実際にリリースした機能を使ってもらったユーザーの課題が解決されることを確認するまでがエンジニアの仕事です。課題が解決されていなければ、なぜ解決されていないかさらなる深掘りを行って、製品で解決できるものでれば改善を行いつづけます。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;自分も大学院に入るまではエンジニアリングの仕事が実際何をするのか全く分かっていなかったのですが、4年たってやっと1人前のエンジニアとして働けるようになってきたと感じています。&lt;/p&gt;
&lt;p&gt;製品を作るエンジニアリングはこのような仕事かなと思うのですが、それ以外にもやらなければいけないことはたくさんあって、詳しくなった時に紹介できるような記事を書こうと思います!&lt;/p&gt;</description>
    </item>
    <item>
      <title>2021年4月をもって転職する話</title>
      <link>https://8fd9c3c3.blog-1xe.pages.dev/2021/04/01/job-change/</link>
      <pubDate>Thu, 01 Apr 2021 17:22:23 +0900</pubDate>
      <guid>https://8fd9c3c3.blog-1xe.pages.dev/2021/04/01/job-change/</guid>
      <description>&lt;p&gt;会社を評価するものではなく, 自分がどういう状況なのかを説明するためのものです。&lt;/p&gt;
&lt;h3 id=&#34;マネジメントコンソールの開発&#34;&gt;マネジメントコンソールの開発&lt;/h3&gt;
&lt;p&gt;2020年4月から入社して研修が終わった後, 6月中旬から社内ツール開発のチームに配属されました。&lt;/p&gt;
&lt;p&gt;社内ツールと言っても100以上のツールがあります。しかし, 各ツールのチームがそれぞれにUIを開発するため, サービスを開発するエンジニアは使いたいツールに辿り着くことが難しく, また横断的に使えないことが問題でした。&lt;/p&gt;
&lt;p&gt;そこで, 社内のあらゆるツールを簡単に横断的に使えるUIを提供するのが我々のチームのミッションです。大袈裟に言ってみればAWSマネジメントコンソールの社内版を作るようなもので, 非常にやりがいのあるプロジェクトです。&lt;/p&gt;
&lt;h3 id=&#34;幅広いスキルの獲得&#34;&gt;幅広いスキルの獲得&lt;/h3&gt;
&lt;p&gt;このチームでの開発を通して非常に多くのスキルを身につけることができました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Angular + TypescriptでのUI開発&lt;/li&gt;
&lt;li&gt;Node + Express + TypescriptでのAPI開発&lt;/li&gt;
&lt;li&gt;Nginxを使ったProxyの設定&lt;/li&gt;
&lt;li&gt;ChefやKubernetesを使った構成管理&lt;/li&gt;
&lt;li&gt;Open IDを使った認証周りの設計&lt;/li&gt;
&lt;li&gt;スクラムやLeanでの開発&lt;/li&gt;
&lt;li&gt;Unit, Integration, E2Eテストの作成&lt;/li&gt;
&lt;li&gt;システム監視の設定&lt;/li&gt;
&lt;li&gt;デザインシステムを使ったWD&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;こんなにも多くの技術スタックに触れるのは本当に幸運だと思います。&lt;/p&gt;
&lt;h3 id=&#34;gov-techへの興味&#34;&gt;Gov-techへの興味&lt;/h3&gt;
&lt;p&gt;いま思い返せば, 自分はWebサービスによって便利になることに目がありませんでした。高校のころは, リリース当初のLINEを使って夏休みの課題を共有したり, iPod touchを使って漫画を読むのにDropboxを活用していました。他にも, 自分たちの代の文化祭のソーラン動画をYoutubeにアップロードしたりもしていて, 毎年再生回数を稼がせていただいております。&lt;/p&gt;
&lt;p&gt;そんな性だからこそ, 行政サービスが不便なことに対して不満を抱いてしまいます&amp;hellip;マイナンバーカードが発行された当時, このカードでいろんな手続きが簡単にできるようになる未来にわくわくしていたのですが, 生憎コロナ禍での給付金の手続きすら電子署名の失効によりできませんでした。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;../../2021/03/23/book/&#34;&gt;前回のブログ&lt;/a&gt;でエストニアに関する本をいくつか挙げました。日本がエストニアのように個人情報を安全にかつ使いやすい形で管理して, 民間企業がそれを活かせる様になって欲しいと思っています。&lt;/p&gt;
&lt;h3 id=&#34;偶然の出逢い&#34;&gt;偶然の出逢い&lt;/h3&gt;
&lt;p&gt;ここから&lt;a href=&#34;../../2021/02/28/address/&#34;&gt;前々回のブログ&lt;/a&gt;の続きになります。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://3people.biz/&#34;&gt;three&lt;/a&gt;で出会った方がVCで働いておられたのでGov-tech領域の会社がないか聞いたところ, あるスタートアップ企業を紹介していただきました。&lt;/p&gt;
&lt;p&gt;総務省で働いている先輩がいたので, 先輩にその会社のことを聞いてみたところ, タイミングよくその会社の方とお会いする機会に同席させていただきました。&lt;/p&gt;
&lt;p&gt;その方にいろんなお話を伺っていくうちに仕事に魅力を感じて, 副業として働かせてもらえないかとお願いしたところ, 面接を経てインターンという形でお仕事をさせていただくことになりました。&lt;/p&gt;
&lt;h3 id=&#34;転職を決心&#34;&gt;転職を決心&lt;/h3&gt;
&lt;p&gt;インターンを終えてオファーをいただきたくさんの方と相談させていただいた結果, 4月末をもって今の会社を退職し, 5月から新しい会社で働くことに決めました。&lt;/p&gt;
&lt;p&gt;今の会社はエンジニアを大事にする会社ですし, 最近盛り上がっていますし, 働き方も柔軟で, プロダクトも好きで, 楽しいチームだったので正直かなり迷いました。新卒1年目でまだまだ修行するつもりだったという思いもありました。&lt;/p&gt;
&lt;p&gt;いろんな要素を比較検討しましたが, 最終的に自分がやりたいことかつ自分がやったほうがいいことという基準で判断しました。&lt;/p&gt;
&lt;h3 id=&#34;関わってくださった方へ&#34;&gt;関わってくださった方へ&lt;/h3&gt;
&lt;p&gt;今回の転職するにあたってたくさんの人にお世話になりました。&lt;/p&gt;</description>
    </item>
    <item>
      <title>swiftの画像キャッシュライブラリ</title>
      <link>https://8fd9c3c3.blog-1xe.pages.dev/2019/05/11/swift-cache/</link>
      <pubDate>Sat, 11 May 2019 06:13:48 +0900</pubDate>
      <guid>https://8fd9c3c3.blog-1xe.pages.dev/2019/05/11/swift-cache/</guid>
      <description>&lt;p&gt;iOSアプリケーションにて画像を表示する際, URLから非同期でデータを取得してUIImage化するという処理がなされていて, それを簡単に書けるライブラリを紹介する. ここでは,  以下の2つのサイトを参考にした.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://medium.com/swift-column/ios-2017-4f04d00a5804&#34;&gt;iOSアプリを作るときのおすすめ構成&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://qiita.com/H_Crane/items/422811dfc18ae919f8a4&#34;&gt;Swiftの有名画像キャッシュライブラリを比較してみた&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;3種類のライブラリ&#34;&gt;3種類のライブラリ&lt;/h3&gt;
&lt;p&gt;今回3つのライブラリに着目した.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nuke&lt;/li&gt;
&lt;li&gt;Kingfisher&lt;/li&gt;
&lt;li&gt;AlamofireImage&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;結論として, Nukeが一番流行ってて処理速度も早かった. 処理速度に関しては以下のチュートリアルを使って, 3つのライブラリ全て使ってみた.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.raywenderlich.com/9229-nuke-tutorial-for-ios-getting-started&#34;&gt;Nuke Tutorial for iOS: Getting Started&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;他のライブラリに関しては, KingfisherがObject-Cの時代のSDWebImageの流れを組んでいてドキュメントが多いのと, AlamofireImageは画像描画のアニメーションが豊富な点がいいのかなと思いました。&lt;/p&gt;
&lt;h2 id=&#34;感想&#34;&gt;感想&lt;/h2&gt;
&lt;p&gt;普段ライブラリなんかはググって適当に使ってしまうが, こうして比較検討することはあとの変更コストをなくすために大事な作業だと思った.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Ruby on Railsでの多対多の関連付け</title>
      <link>https://8fd9c3c3.blog-1xe.pages.dev/2019/04/12/many-to-many/</link>
      <pubDate>Fri, 12 Apr 2019 17:31:43 +0900</pubDate>
      <guid>https://8fd9c3c3.blog-1xe.pages.dev/2019/04/12/many-to-many/</guid>
      <description>&lt;h2 id=&#34;背景&#34;&gt;背景&lt;/h2&gt;
&lt;p&gt;自分は現在院生2回生で, 4回生のころから京都のゲーム・Web会社で働いている. 今も細々と続けている中で, Ruby on Railsに触れる機会があったのでその知見を貯めておく.&lt;/p&gt;
&lt;p&gt;今回は多対多の関連付けと, その使い方を紹介する.&lt;/p&gt;
&lt;h2 id=&#34;データ構造&#34;&gt;データ構造&lt;/h2&gt;
&lt;p&gt;このアプリケーションには, &lt;code&gt;user&lt;/code&gt;と&lt;code&gt;group&lt;/code&gt;の定義があって, &lt;code&gt;user&lt;/code&gt;は複数の&lt;code&gt;group&lt;/code&gt;に所属することができて, &lt;code&gt;group&lt;/code&gt;は複数の&lt;code&gt;user&lt;/code&gt;を持つ. よって中間テーブルを用いて多対多の関連付けを定義する.&lt;/p&gt;
&lt;p&gt;schema.rb&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;ActiveRecord&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;Schema&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;define(&lt;span style=&#34;color:#e6db74&#34;&gt;version&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;20_190_219_052_352&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  create_table &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;group_users&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;options&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ENGINE=InnoDB DEFAULT CHARSET=utf8&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;force&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;:cascade&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;t&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    t&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;bigint &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;user_id&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;null&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    t&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;bigint &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;group_id&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;null&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    t&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;index &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;group_id&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;, name: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;index_group_users_on_group_id&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    t&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;index &lt;span style=&#34;color:#e6db74&#34;&gt;%w[user_id group_id]&lt;/span&gt;, name: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;index_group_users_on_user_id_and_group_id&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    t&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;index &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;user_id&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;, name: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;index_group_users_on_user_id&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  create_table &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;groups&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;options&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ENGINE=InnoDB DEFAULT CHARSET=utf8&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;force&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;:cascade&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;t&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    t&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;string &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;null&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    t&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;integer &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;status&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;default&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;null&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  create_table &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;users&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;options&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ENGINE=InnoDB DEFAULT CHARSET=utf8&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;force&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;:cascade&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;t&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    t&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;string &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;null&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;テーブル名を&lt;code&gt;group_users&lt;/code&gt;にして中間テーブルを作る. このテーブルをもとに&lt;code&gt;group&lt;/code&gt;から&lt;code&gt;user&lt;/code&gt;, &lt;code&gt;user&lt;/code&gt;から&lt;code&gt;group&lt;/code&gt;を参照する. ここでindexが3つ貼られているが, 以下のようにして簡単に貼ることができる.&lt;/p&gt;
&lt;p&gt;create_group_users.rb&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;CreateGroupUsers&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;ActiveRecord&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;Migration&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;change&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    create_table &lt;span style=&#34;color:#e6db74&#34;&gt;:group_users&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;t&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      t&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;references &lt;span style=&#34;color:#e6db74&#34;&gt;:user&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;null&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;foreign_key&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      t&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;references &lt;span style=&#34;color:#e6db74&#34;&gt;:group&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;null&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;foreign_key&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      t&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;timestamps
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    add_index &lt;span style=&#34;color:#e6db74&#34;&gt;:group_users&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt;i&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;user_id group_id&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;関連付け&#34;&gt;関連付け&lt;/h2&gt;
&lt;p&gt;以下がそれぞれのモデルである.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Ruby on Railsでオシャレな処理を書く</title>
      <link>https://8fd9c3c3.blog-1xe.pages.dev/2019/04/12/ruby-on-rails/</link>
      <pubDate>Fri, 12 Apr 2019 10:00:45 +0900</pubDate>
      <guid>https://8fd9c3c3.blog-1xe.pages.dev/2019/04/12/ruby-on-rails/</guid>
      <description>&lt;h2 id=&#34;背景&#34;&gt;背景&lt;/h2&gt;
&lt;p&gt;自分は現在院生2回生で, 4回生のころから京都のゲーム・Web会社で働いている. 今も細々と続けている中で, Ruby on Railsに触れる機会があったのでその知見を貯めておく.&lt;/p&gt;
&lt;p&gt;また, Ruby on Railsは型が決まった書き方があるので, 少ない行数に多くの情報を詰め込むことができて, 書き終わった後の見通しがとてもいいと思う. そんなオシャレな書き方を少し紹介したい.&lt;/p&gt;
&lt;h2 id=&#34;使用するデータのスキーマとモデル&#34;&gt;使用するデータのスキーマとモデル&lt;/h2&gt;
&lt;p&gt;今回紹介するのは, SNSアプリのAPIの中身の一部である.&lt;/p&gt;
&lt;p&gt;以下に, 端末の情報を持つ&lt;code&gt;device&lt;/code&gt;テーブルと, ユーザーの情報をもつ&lt;code&gt;user&lt;/code&gt;テーブルを定義する.&lt;/p&gt;
&lt;p&gt;schema.rb&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;ActiveRecord&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;Schema&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;define(&lt;span style=&#34;color:#e6db74&#34;&gt;version&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;20_190_219_052_352&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  create_table &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;devices&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;options&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ENGINE=InnoDB DEFAULT CHARSET=utf8&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;force&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;:cascade&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;t&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    t&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;bigint &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;user_id&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    t&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;string &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;uuid&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    t&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;integer &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;user_agent&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  create_table &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;users&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;options&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ENGINE=InnoDB DEFAULT CHARSET=utf8&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;force&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;:cascade&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;t&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    t&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;string &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;email&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;null&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    t&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;string &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;password_digest&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;null&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;```ruby
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;user&lt;span style=&#34;color:#e6db74&#34;&gt;`と`&lt;/span&gt;device&lt;span style=&#34;color:#e6db74&#34;&gt;`の関係は1対多であり, `&lt;/span&gt;belongs_to&lt;span style=&#34;color:#e6db74&#34;&gt;`と`&lt;/span&gt;has_many&lt;span style=&#34;color:#e6db74&#34;&gt;`で関連付けされている. 以下にそれぞれもモデルを示す.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;user.rb
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;```&lt;/span&gt;ruby
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;User&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;ApplicationRecord&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  has_many &lt;span style=&#34;color:#e6db74&#34;&gt;:devices&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;dependent&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;:nullify&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Device.rb&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Device&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;ApplicationRecord&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  belongs_to &lt;span style=&#34;color:#e6db74&#34;&gt;:user&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;optional&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# deviceとuser_idを紐づける&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;update_user_id&lt;/span&gt;(user)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    user&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;devices &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; self
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;shape_response&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    { &lt;span style=&#34;color:#e6db74&#34;&gt;uuid&lt;/span&gt;: uuid }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;オシャレな文法たち&#34;&gt;オシャレな文法たち&lt;/h2&gt;
&lt;p&gt;上記データ構造をもとにおしゃれな文法たちを紹介する.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
