<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Seizan Shimazaki</title>
    <description>The latest articles on DEV Community by Seizan Shimazaki (@seizans).</description>
    <link>https://dev.to/seizans</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F45466%2F8406c774-08c2-4205-981c-04235e0c57ee.jpg</url>
      <title>DEV Community: Seizan Shimazaki</title>
      <link>https://dev.to/seizans</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/seizans"/>
    <language>en</language>
    <item>
      <title>Elixirのコードレビューで出るやつ</title>
      <dc:creator>Seizan Shimazaki</dc:creator>
      <pubDate>Fri, 05 Jan 2018 07:38:08 +0000</pubDate>
      <link>https://dev.to/seizans/elixir-4djj</link>
      <guid>https://dev.to/seizans/elixir-4djj</guid>
      <description>&lt;p&gt;&lt;a href="http://qiita.com/advent-calendar/2016/elixir"&gt;Elixir Advent Calendar 2016&lt;/a&gt; の12日目です。&lt;/p&gt;

&lt;p&gt;Elixir で開発していてコードレビューの指摘点で出たものについて、&lt;br&gt;
一般的だと思うものをいくつか列挙しました。&lt;/p&gt;
&lt;h2&gt;
  
  
  返り値を想定している場合は _ でマッチさせず名前付ける
&lt;/h2&gt;

&lt;p&gt;名前付けておいた方が読んだときにわかる。&lt;/p&gt;
&lt;h2&gt;
  
  
  関数定義でマッチできるならそっちで
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def spam(x) do
  case x do
    :aaa -&amp;gt;
      :ok
    :bbb -&amp;gt;
      :error
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;のようにやるなら、次のようにする。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def spam(:aaa) do
  :ok
end
def spam(:bbb) do
  :error
end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  if より case を使う
&lt;/h2&gt;

&lt;p&gt;場合分けで if を使うことは多くない。&lt;br&gt;
case を使う方が良い場合が多い。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;user = Repo.get(query, id)
if user != nil do
  ...
else
  ...
end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;と書くなら次のようにする。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;case Repo.get(query, id) do
  nil -&amp;gt;
    ...
  user -&amp;gt;
    ...
end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  エラー返り値の形式が違うものは with でまとめず case ネストで
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;with {:ok, foo} &amp;lt;- spam(),
     {:ok, bar} &amp;lt;- ham() do
  ...
else
  :error -&amp;gt;
    ...
  {:error, reason} -&amp;gt;
    ...
end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;のように spam() は :error、ham() は {:error, reason} を返すような場合、&lt;br&gt;
with でまとめるとどれがどのエラー形式を返すかわからなくなってつらい。&lt;br&gt;
ので普通に case ネストで書く。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;case spam() do
  {:ok, foo} -&amp;gt;
    case ham() do
      {:ok, bar} -&amp;gt;
        ...
      {:error, reason} -&amp;gt;
        ...
    end
  :error -&amp;gt;
    ...
end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  関数呼び出しはカッコ省略せず必ず () 付ける
&lt;/h2&gt;

&lt;p&gt;統一するメリットがあるので。&lt;/p&gt;

&lt;h2&gt;
  
  
  再代入しない
&lt;/h2&gt;

&lt;p&gt;再代入するなら基本的に別の名前を付ける。&lt;br&gt;
Phoenix の conn のようなごく一部の例外は除く。&lt;br&gt;
再代入の必要性は今のところ特に感じていない。&lt;/p&gt;
&lt;h2&gt;
  
  
  %URI{} 使おう
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;url_base = "https://#{host}"
url = "#{url_base}/user/#{user_id}"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;とかやるなら URI を使う。(HTTPoison など URI 型で渡せる)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;url = %URI{scheme: "https",
           host: host,
           path: Path.join("/user", user_id)}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;String にしたければ URI.to_string() を使えばよい。&lt;/p&gt;

&lt;h2&gt;
  
  
  条件を満たすならリストに追加する
&lt;/h2&gt;

&lt;p&gt;List や Map を作るときに条件を満たす場合は追加することがある。&lt;br&gt;
例えばこんな感じ。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@spec build_spams() :: list()
def build_spams() do
  spams = base_spams()
  spams = if condition1() do
    [additional1() | spams]
  else
    spams
  end
  spams = if condition2() do
    [additional2() | spams]
  else
    spams
  end
  spams
end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;要素追加する部分を関数に切り出すと見通しがよくなる場合がある。&lt;br&gt;
以下のような感じ。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@spec build_spams() :: list()
def build_spams() do
  base_spams()
  |&amp;gt; maybe_add_spams1()
  |&amp;gt; maybe_add_spams2()
end

defp maybe_add_spams1() do
  if condition1() do
    [additional1() | spams]
  else
    spams
  end
end

defp maybe_add_spams2() do
  if condition2() do
    [additional2() | spams]
  else
    spams
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  おまけ: credo
&lt;/h2&gt;

&lt;p&gt;CI で mix credo は必ず回すようにしている。&lt;br&gt;
.credo.exs は次の感じでやってる。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;%{
  configs: [
    %{
      name: "default",
      files: %{
        included: ["lib/"],
        excluded: []
      },
      checks: [
        {Credo.Check.Readability.MaxLineLength, max_length: 120},
        {Credo.Check.Readability.ModuleDoc, false},
        {Credo.Check.Refactor.Nesting, false},
        {Credo.Check.Refactor.PipeChainStart, false},
      ]
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>elixir</category>
    </item>
    <item>
      <title>読んで良かった基礎知識の入門書</title>
      <dc:creator>Seizan Shimazaki</dc:creator>
      <pubDate>Fri, 05 Jan 2018 07:35:15 +0000</pubDate>
      <link>https://dev.to/seizans/-d0j</link>
      <guid>https://dev.to/seizans/-d0j</guid>
      <description>&lt;p&gt;&lt;a href="http://www.slideshare.net/iwashi86/ss-58640407"&gt;とあるエンジニアの技術勉強法 (インターン学生向け)&lt;/a&gt; というスライドを先日 &lt;a href="https://twitter.com/iwashi86"&gt;@iwashi86&lt;/a&gt; が書かれていました。&lt;br&gt;
インターン学生向けとありますが、新人プログラマ向けとしても素晴らしい資料だと思います。&lt;/p&gt;

&lt;p&gt;ここでは「即、役立つわけではないが後から効いてくる」という「基礎知識」に絞って教材を紹介します。&lt;br&gt;
目の前の仕事のために必要なことと並行して基礎知識を学ぶのは、長期的には良いと思います。&lt;br&gt;
なお「基礎」==「簡単」というわけではなく、無理せず自分のペースで付き合うのがおすすめです。&lt;/p&gt;

&lt;p&gt;自分で読んで、かつ、とても良いと思ったもののみを紹介するので、全分野をカバーしてはいません。&lt;br&gt;
基礎にどのような分野があるかは&lt;a href="http://kuenishi.hatenadiary.jp/entry/20110321/1300642829"&gt;新卒準備カレンダー2011&lt;/a&gt;や&lt;a href="http://www.is.s.u-tokyo.ac.jp/student/lecture.html"&gt;情報科学科カリキュラム&lt;/a&gt;が参考になります。&lt;/p&gt;

&lt;p&gt;以下はどれも有名な本なので、ググれば感想なども見つかるでしょう。&lt;br&gt;
気になった本、読もうと思う本については、ググるのも良いかもしれません。&lt;/p&gt;

&lt;h2&gt;
  
  
  アルゴリズムとデータ構造
&lt;/h2&gt;

&lt;h4&gt;
  
  
  &lt;a href="http://www.amazon.co.jp/dp/4764904063/"&gt;アルゴリズムイントロダクション&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;これを一通り読めば基本的なことがわからないということは無くなるだろう世界標準の教科書。&lt;br&gt;
どんな問題をどんな方法で解決できるのか、またどの解法が優れた方法なのか。(優れたとはどういうことか)&lt;br&gt;
パターンを勉強することで、今後出会う問題が「未知の問題」ではなく「既知の問題」になるかもしれません。&lt;br&gt;
その問題が解けるのか解決不能なのか、どう解けるのかを知っていると、そうでないのとは大違いです。&lt;br&gt;
またコーディングの「腕立て伏せ」としても良い題材になります。&lt;br&gt;
ただし分量が多いため、最初の一冊として読むと読み切るのがやや難しいかもしれません。&lt;br&gt;
そこで最初の一冊の定番となるべくして書かれたのが次の...&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="http://www.amazon.co.jp/dp/482228543X"&gt;アルゴリズムの基本&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;これです。&lt;br&gt;
300ページ弱の本で、前半160ページで定番のソート、グラフをコンパクトに丁寧に取り上げています。&lt;br&gt;
前半を終えればアルゴリズムへの親しみは十分で、入門したと言えると思います。&lt;br&gt;
そのまま最後まで読むもよし、アルゴリズムイントロダクションに進むもよしです。&lt;br&gt;
この本の弱点は、データ構造にはほとんど触れていないことです。&lt;br&gt;
アルゴリズムを勉強して良かった、という感想があるなら、データ構造も勉強すると良いでしょう。&lt;br&gt;
アルゴリズムイントロダクションではデータ構造も十分に紹介されています。&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="http://www.amazon.co.jp/dp/4320122070"&gt;計算理論の基礎&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;3巻に分かれていて、まずは第1巻(オートマトンと言語) だけ読むことを目標にすると楽です。&lt;br&gt;
文字列の操作という一般的な処理が、オートマトンというモデルを用いて実装できると実感できます。&lt;br&gt;
特に正規表現を実装できると知るのは興味深いと思います。&lt;br&gt;
コンパイラの前提知識にもなっています。&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="http://www.amazon.co.jp/dp/4797382228"&gt;暗号技術入門 第3版 秘密の国のアリス&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;定番。&lt;br&gt;
暗号は実務のあらゆるところに登場するので、プログラマの必修科目だと思います。&lt;br&gt;
一例としては、webサイトを https でアクセスするときの動作を理解するためにも必要です。&lt;br&gt;
どのような攻撃を想定し、どうすれば防げるかを考え学ぶことは、慎重に検討する姿勢を身につけるためにも有用かもしれません。&lt;/p&gt;

&lt;h2&gt;
  
  
  計算機システム
&lt;/h2&gt;

&lt;h4&gt;
  
  
  &lt;a href="http://www.amazon.co.jp/dp/4822298426/"&gt;コンピュータの構成と設計&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;各ハードウェアがどのように協調動作してプログラムを実行するのかを理解できる世界標準の教科書。&lt;br&gt;
性能とは何か、どう計算できるのか、改善するためにどのような工夫がなされているのか。&lt;br&gt;
OS、コンパイラ、VM、並列プログラミング、など多くのテーマの下地になります。&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="http://www.amazon.co.jp/dp/4756102131"&gt;はじめて読む486&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;CPU の仕組みが具体的に書かれています。&lt;br&gt;
このへんはオペレーティングシステムと密な関係があります。&lt;br&gt;
OS の概要を先に勉強すると、その処理の実装という観点を持って読みやすいかもしれません。&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="http://www.amazon.co.jp/dp/4839909865/"&gt;CPUの創りかた&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;(物理的に)なぜ計算機が動作するのか。&lt;br&gt;
シンプルな計算機を自作することでこれを理解するための本。&lt;br&gt;
その方面の仕事でなければ業務に役立つ可能性は低いと思いますが、「やっぱりそこから理解したいよね」と思う人は多いのでは。&lt;/p&gt;

&lt;h2&gt;
  
  
  オペレーティングシステム
&lt;/h2&gt;

&lt;h4&gt;
  
  
  &lt;a href="http://www.amazon.co.jp/dp/4254127057"&gt;オペレーティングシステムの仕組み&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;各論は細部まで深追いせず、分量が多くならないようにされています。&lt;br&gt;
また逆に、浅すぎて事実の羅列になったりせず、仕組みを理解できるくらいには具体的に書かれています。&lt;br&gt;
そのバランスによって、全体の仕組みをコンパクトに学べるのが良いところだと思います。&lt;/p&gt;

&lt;h2&gt;
  
  
  システムプログラミング
&lt;/h2&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://www.amazon.co.jp/dp/4797386479"&gt;ふつうのLinuxプログラミング 第2版&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;こうすれば Linuxコマンドは作れるとわかる本。&lt;br&gt;
過程で Linux に慣れていくこともあり、初心者にとっての実用性も高いです。&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="http://www.oversea-pub.com/store/gnu_development_tools"&gt;GNU開発ツール&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;hello world を実装して実行する間に何が行われているかを1冊かけて理解する本。&lt;br&gt;
1つのコマンドの裏で動いているコマンドや、使われるファイルの実態がどこにあるかなども解説されます。&lt;br&gt;
使われるLinuxコマンドもすべて解説されるので、初心者にも優しいです。&lt;br&gt;
なお現在は入手方法は公式サイトからPDF版を購入するのみなのでそちらからどうぞ。&lt;/p&gt;

&lt;h2&gt;
  
  
  その他プログラミング
&lt;/h2&gt;

&lt;h4&gt;
  
  
  &lt;a href="http://www.amazon.co.jp/dp/4781911609"&gt;プログラミングの基礎&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;これのみ「読んで良かった」ではなく「読ませて良かった」本です。&lt;br&gt;
新人プログラマへの一冊という観点では最有力候補なので、含めることにしました。&lt;br&gt;
プログラミングの入門書として素晴らしいと聞き、また自分も目を通して良さを感じました。&lt;br&gt;
実際に新人プログラマに取り組んでもらったところ「良かった」と言っていました。&lt;br&gt;
&lt;a href="http://d.hatena.ne.jp/kazu-yamamoto/20130318/1363581164"&gt;[OCaml]書評「プログラミングの基礎」&lt;/a&gt;もご参考に。&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="http://www.amazon.co.jp/dp/4274067815"&gt;プログラミングHaskell&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;関数プログラミング言語 Haskell のベスト入門書です。&lt;br&gt;
当時、自分の師匠に「プログラミングをよくできるようになるために何をすればいいか？」と聞いたら「関数プログラミングを勉強すること。Haskellでいい」と言われて読みました。&lt;br&gt;
この本は洗練されていて、ポイントを本当にコンパクトに読めます。&lt;br&gt;
第7章までの 70ページで関数プログラミングのエッセンスが学べるので、そこまで読むのがおすすめです。&lt;br&gt;
なお Haskell を実戦で使いたい人は別途&lt;a href="http://www.amazon.co.jp/dp/4274068854"&gt;すごいHaskellたのしく学ぼう!&lt;/a&gt;も読むべきでしょう。&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="http://www.amazon.co.jp/dp/4274067149"&gt;プログラミングErlang&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;「並行プログラミング」と言うとハイレベルに聞こえるかもしれません。&lt;br&gt;
ですがこれを読むと、並行プログラミングを親しみやすいと感じるのではないかと思います。&lt;br&gt;
Erlang の並行プログラミングのための強い機能群が、理解を助けてくれるでしょう。&lt;br&gt;
その機能群は他の言語に輸入されてもいるため、その意味でも有意義だと思います。&lt;br&gt;
関数プログラミングをあらかじめ理解しているとスムーズなので、先に上記「プログラミングHaskell」を読むと効率的かもしれません。&lt;br&gt;
なお Erlang を実戦で使いたい人は別途 &lt;a href="http://www.amazon.co.jp/dp/4274069125/"&gt;すごいErlangゆかいに学ぼう!&lt;/a&gt; も読むべきでしょう。&lt;/p&gt;

</description>
    </item>
    <item>
      <title>GCP API の認証設定</title>
      <dc:creator>Seizan Shimazaki</dc:creator>
      <pubDate>Fri, 05 Jan 2018 07:30:47 +0000</pubDate>
      <link>https://dev.to/seizans/gcp-api--429k</link>
      <guid>https://dev.to/seizans/gcp-api--429k</guid>
      <description>&lt;p&gt;GCP (Google Cloud Platform) の API を使うための認証・認可は OAuth 2.0 で、&lt;br&gt;
サーバーでの使い方は &lt;a href="https://developers.google.com/identity/protocols/OAuth2ServiceAccount" rel="noopener noreferrer"&gt;Using OAuth 2.0 for Server to Server Applications&lt;/a&gt; に書かれている。&lt;br&gt;
結論としては &lt;a href="https://developers.google.com/identity/protocols/application-default-credentials" rel="noopener noreferrer"&gt;Google Application Default Credentials (ADC)&lt;/a&gt; を使い、OAuth 2.0 Access Token を取得して使う。&lt;/p&gt;

&lt;p&gt;ADC は AWS での Default Credential Provider Chain にあたる。&lt;/p&gt;

&lt;h2&gt;
  
  
  ADC とは
&lt;/h2&gt;

&lt;p&gt;次のロジックで得られる credentials が ADC と呼ばれる。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;環境変数 &lt;code&gt;GOOGLE_APPLICATION_CREDENTIALS&lt;/code&gt; が指定されていたら、そのファイルを service account の credentials として読んで使う&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gcloud auth application-default login&lt;/code&gt; を実行して well_known_file が作成済みであれば、それを authorized user の credentials として読んで使う&lt;/li&gt;
&lt;li&gt;GAE (Google App Engine) 上で実行されていれば、その built-in service account を使う&lt;/li&gt;
&lt;li&gt;GCE (Google Compute Engine) 上で実行されていれば、その build-in service account を使う&lt;/li&gt;
&lt;li&gt;ここまで該当がなければエラーとする&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  well_known_file について
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ gcloud auth application-default login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;を実行すると作成される。&lt;br&gt;
デフォルトだと &lt;code&gt;~/.config/gcloud/application_default_credentials.json&lt;/code&gt;&lt;br&gt;
環境変数 &lt;code&gt;CLOUDSDK_CONFIG&lt;/code&gt; が指定されていれば &lt;code&gt;$CLOUDSDK_CONFIG/application_default_credentials.json&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Access Token を取得する
&lt;/h2&gt;

&lt;p&gt;service account か authorized user の credentials を使う場合は、&lt;br&gt;
然るべきリクエストを作ってトークンエンドポイントに POST する。&lt;br&gt;
GCE の場合はメタデータサーバーに GET する。&lt;/p&gt;

&lt;h2&gt;
  
  
  Access Token を使って API を叩く
&lt;/h2&gt;

&lt;p&gt;取得した access token を Authorization ヘッダに Bearer 形式で入れる。&lt;br&gt;
&lt;code&gt;Authorization: Bearer xxxx.yyyyyyyyyyyyy&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  使うとき
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://developers.google.com/identity/protocols/OAuth2WebServer#libraries" rel="noopener noreferrer"&gt;Google 的に優先度高い言語&lt;/a&gt; は公式ライブラリが用意されていて、マニュアル見て使えばよい。&lt;br&gt;
Elixir はライブラリが無かったので作った。&lt;br&gt;
&lt;a href="https://github.com/aktsk/gcp_auth" rel="noopener noreferrer"&gt;https://github.com/aktsk/gcp_auth&lt;/a&gt;&lt;/p&gt;

</description>
      <category>gcp</category>
    </item>
    <item>
      <title>MySQL(InnoDB) で charset を utf8mb4 にする注意点の現在</title>
      <dc:creator>Seizan Shimazaki</dc:creator>
      <pubDate>Fri, 05 Jan 2018 07:23:18 +0000</pubDate>
      <link>https://dev.to/seizans/mysqlinnodb--charset--utf8mb4--1451</link>
      <guid>https://dev.to/seizans/mysqlinnodb--charset--utf8mb4--1451</guid>
      <description>&lt;p&gt;絵文字に対応したいなどの理由で utf8mb4 を使う。&lt;br&gt;
ただ、utf8mb4 に設定するだけだと以前は問題があった。&lt;br&gt;
MySQL 5.7.9 以降では解決されたので、その話をまとめる。&lt;/p&gt;
&lt;h2&gt;
  
  
  charset を utf8mb4 にする
&lt;/h2&gt;

&lt;p&gt;server 全体に設定するでよければ my.cnf に次を設定すればよい。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[mysqld]
character_set_server=utf8mb4
collation_server=utf8mb4_unicode_ci
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;database 単位で設定したければ、次を発行すればいい。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ALTER DATABASE spam CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  対応すべき問題
&lt;/h2&gt;

&lt;p&gt;utf8mb4 に変えると、VARCHAR 等のカラムで、同じ文字数でも size が大きくなる。&lt;br&gt;
デフォルトではこの size の上限は 767byte で、index を張ろうとして落ちるなどする。&lt;br&gt;
ということが、&lt;a href="http://blog.kamipo.net/entry/2012/11/13/102024" rel="noopener noreferrer"&gt;MySQL(InnoDB) で "Index column size too large. The maximum column size is 767 bytes." いわれるときの対策&lt;/a&gt;、で詳しく説明されている。&lt;/p&gt;
&lt;h2&gt;
  
  
  以前の解決方法
&lt;/h2&gt;

&lt;p&gt;innodb_large_prefix パラメータを ON にすることで、size 上限が 3072byte になり、問題なくなる。&lt;br&gt;
ただしそのためには、テーブルの ROW_FORMAT を DYNAMIC (か COMPRESSED) にする必要がある。&lt;br&gt;
さらにそのためには、innodb_file_format が Barracuda であることが必要。&lt;/p&gt;

&lt;p&gt;なので実際には&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;innodb_large_prefix=ON
innodb_file_format=Barracuda
innodb_file_format_max=Barracuda
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;として、また CREATE TABLE するときに &lt;code&gt;ROW_FORMAT=DYNAMIC&lt;/code&gt; を付けることで解決できた。&lt;/p&gt;

&lt;h2&gt;
  
  
  現在
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;innodb_file_format&lt;/code&gt; はデフォルトで &lt;code&gt;Barracuda&lt;/code&gt; (5.7.7 以降)、&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;innodb_default_row_format&lt;/code&gt; はデフォルトで &lt;code&gt;DYNAMIC&lt;/code&gt; (5.7.9 以降)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;innodb_large_prefix&lt;/code&gt; はデフォルトで ON (5.7.7 以降)で、deprecated で、じき項目が消える予定&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ということで、上記の問題を解決するために設定すべき項目は 5.7.9 以降では無くなり、解決していた。&lt;/p&gt;

&lt;h2&gt;
  
  
  参照
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_file_format" rel="noopener noreferrer"&gt;https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_file_format&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_default_row_format" rel="noopener noreferrer"&gt;https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_default_row_format&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_large_prefix" rel="noopener noreferrer"&gt;https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_large_prefix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.mysql.com/doc/refman/5.7/en/innodb-restrictions.html" rel="noopener noreferrer"&gt;https://dev.mysql.com/doc/refman/5.7/en/innodb-restrictions.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.mysql.com/doc/refman/5.7/en/innodb-row-format-specification.html" rel="noopener noreferrer"&gt;https://dev.mysql.com/doc/refman/5.7/en/innodb-row-format-specification.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.mysql.com/doc/refman/5.7/en/innodb-row-format-dynamic.html" rel="noopener noreferrer"&gt;https://dev.mysql.com/doc/refman/5.7/en/innodb-row-format-dynamic.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>mysql</category>
    </item>
  </channel>
</rss>
