<?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: Kyoko KADOWAKI</title>
    <description>The latest articles on DEV Community by Kyoko KADOWAKI (@kdxu).</description>
    <link>https://dev.to/kdxu</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%2F43219%2F6dcff65b-6bef-4b2b-a3e0-f956f3a38006.png</url>
      <title>DEV Community: Kyoko KADOWAKI</title>
      <link>https://dev.to/kdxu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kdxu"/>
    <language>en</language>
    <item>
      <title>React Native v0.63.0 がリリースされたので変更点をチェックする</title>
      <dc:creator>Kyoko KADOWAKI</dc:creator>
      <pubDate>Tue, 14 Jul 2020 08:09:22 +0000</pubDate>
      <link>https://dev.to/kdxu/react-native-v0-62-0-45mi</link>
      <guid>https://dev.to/kdxu/react-native-v0-62-0-45mi</guid>
      <description>&lt;p&gt;React Native の v0.63.0 が 7/6 にリリースされました。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://reactnative.dev/blog/2020/07/06/version-0.63"&gt;公式ブログによるアナウンス&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;大きな変更点は以下となります。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;LogBox の導入&lt;/li&gt;
&lt;li&gt;Pressable Component の追加&lt;/li&gt;
&lt;li&gt;Native Colors の導入&lt;/li&gt;
&lt;li&gt;Node 8 系、iOS 9 のサポートを廃止&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;以下、それぞれの変更点を具体的に見ていきます。&lt;/p&gt;

&lt;h2&gt;
  
  
  LogBox の導入
&lt;/h2&gt;

&lt;p&gt;これまでの React Native 開発では、エラーや警告メッセージの出力がわかりづらく、そこが開発しづらさにつながっていました。&lt;/p&gt;

&lt;p&gt;例えば console.log, console.warn などで出力したメッセージを React Native の devtool 経由でしか確認できないなどの問題がありました。&lt;/p&gt;

&lt;p&gt;LogBox はそのような開発者の声を受けて、開発しやすいログメッセージの出力 UI を提供するインタフェースとして新たに開発されたもののようです。&lt;/p&gt;

&lt;p&gt;LogBox によって、以下のような変更がもたらされます:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;console.xxx&lt;/code&gt; で出力されるメッセージの出力

&lt;ul&gt;
&lt;li&gt;これまでブラウザの devtool や logcat (Android) などで確認しなければならなかった &lt;code&gt;console.log, console.warn, console.error&lt;/code&gt; などの出力を直接アプリケーションから確認できるようになりました。&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;コードフレームの出力

&lt;ul&gt;
&lt;li&gt;エラーや警告にアプリケーション内のログのソースコードを表示するコードフレームが含まれるようになりました。&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;コンポーネントスタック

&lt;ul&gt;
&lt;li&gt;これまで出力されていたコンポーネントスタックがエラーメッセージからは削除され、独自のセクションに配置されるようになりました。 これにより、ログメッセージをコンポーネントスタックフレームとそうでないもので切り分けて見ることができるようになります。&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;スタックフレームの省略

&lt;ul&gt;
&lt;li&gt;アプリケーションのコードに関連しない (= React Native のコア部分の) コールスタックのフレームが省略されるようになりました。これにより、React Native 内部のエラー出力を覗くことがなくなり、開発しているアプリケーションのエラー箇所を解りやすく追うことができるようになりました。&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pressable Component の追加
&lt;/h2&gt;

&lt;p&gt;React Native では、押下が可能な UI パーツとして、 &lt;code&gt;Button&lt;/code&gt; や &lt;code&gt;TouchableOpacity&lt;/code&gt; などのコンポーネントを利用することがデフォルトで推奨されています。&lt;/p&gt;

&lt;p&gt;ただ、これらのコンポーネントはデフォルトの UX (ホバー、ブラー、フォーカス)などが既定されており、カスタマイズが難しいという問題がありました。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Pressable&lt;/code&gt; は、これらの問題を解決するために新たに提供されるコンポーネントです。&lt;/p&gt;

&lt;p&gt;このコンポーネントは、&lt;code&gt;Button&lt;/code&gt; や &lt;code&gt;TouchableOpacity&lt;/code&gt; よりも抽象的なコンポーネントで、さまざまなインタラクションを検知し、またその状態を保持・取得できるものです。&lt;/p&gt;

&lt;p&gt;これによって、&lt;code&gt;押下されているときのスタイル&lt;/code&gt; などを独自に定義しやすくなりました。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Pressable&lt;/span&gt;
        &lt;span class="nx"&gt;onPress&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="c1"&gt;// 押された回数を更新する&lt;/span&gt;
          &lt;span class="nx"&gt;setTimesPressed&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;current&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}}&lt;/span&gt;
        &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{({&lt;/span&gt; &lt;span class="nx"&gt;pressed&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/* 押されたときとそうでないときで色を変更する */&lt;/span&gt;
            &lt;span class="na"&gt;backgroundColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;pressed&lt;/span&gt;
              &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;rgb(210, 230, 255)&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
              &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;white&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;]}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="err"&gt;　　　　　&lt;/span&gt;&lt;span class="cm"&gt;/* 押されたときとそうでないときで内部テキストを変更する */&lt;/span&gt;
        &lt;span class="p"&gt;{({&lt;/span&gt; &lt;span class="nx"&gt;pressed&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Text&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;pressed&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="s2"&gt;`Pressed (&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; times)`&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Press Me&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Text&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="p"&gt;)}&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Pressable&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://reactnative.dev/docs/pressable"&gt;公式ドキュメント&lt;/a&gt; も用意されています。&lt;/p&gt;

&lt;h2&gt;
  
  
  Native Colors (PlatformColor, DynamicColorIOS) の導入
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;PlatformColor&lt;/code&gt; はネイティブレベルで定義している色定義を呼び出して利用できる機能となります。&lt;/p&gt;

&lt;p&gt;例えば iOS だと &lt;code&gt;labelColor&lt;/code&gt; など　&lt;a href="https://developer.apple.com/documentation/uikit/uicolor/ui_element_colors?language=objc"&gt;UIKit の UIColor でビルトインで定義されている色&lt;/a&gt; を呼び出すことができます。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;PlatformColor&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// ビルトイン定義の labelColor 色のテキストをレンダリングする &lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Text&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PlatformColor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;labelColor&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nx"&gt;This&lt;/span&gt; &lt;span class="nx"&gt;is&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="nx"&gt;label&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Text&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;code&gt;DynamicColorIOS&lt;/code&gt; は、iOS のビルトインで定義している色の動的な変更 (ダークモードとライトモードの切り替え)に対応しています。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;customDynamicTextColor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;DynamicColorIOS&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;dark&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;lightskyblue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;light&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;midnightblue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Node 8 系、iOS 9 のサポートを廃止
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/nodejs/Release#release-schedule"&gt;昨年秋、Node 8 系は LTS バージョンから落とされました&lt;/a&gt; (現在 Node 10系 が LTS となっています)&lt;br&gt;
その関係で、React Native でも Node 8 系はのサポート外となりました。&lt;/p&gt;

&lt;p&gt;iOS 9 に関しては、シェア率が 1% 以下となったこともあり、サポートにかかるコストを考慮して、今後サポートしないことになったようです。&lt;/p&gt;

&lt;p&gt;これによって、 React Native 内部の iOS の互換性を担保するコードのメンテナンスコストが減り、見通しがよくなったようです。&lt;/p&gt;

</description>
      <category>reactnative</category>
    </item>
    <item>
      <title>Elixir 1.6.0 の新機能の紹介</title>
      <dc:creator>Kyoko KADOWAKI</dc:creator>
      <pubDate>Tue, 09 Jan 2018 02:10:54 +0000</pubDate>
      <link>https://dev.to/kdxu/elixir-160--3b0l</link>
      <guid>https://dev.to/kdxu/elixir-160--3b0l</guid>
      <description>&lt;h1&gt;
  
  
  Elixir v1.6.0 について
&lt;/h1&gt;

&lt;p&gt;まだ正式なリリースはされていませんが &lt;a href="https://github.com/elixir-lang/elixir"&gt;https://github.com/elixir-lang/elixir&lt;/a&gt; で v1.6.0 に向けた機能が現在進行形で開発されています。現行の最新版は v1.5.2 です。&lt;/p&gt;

&lt;p&gt;master ブランチのドキュメントは&lt;a href="https://hexdocs.pm/elixir/master/"&gt;ここ&lt;/a&gt;で更新され続けています。&lt;br&gt;
今回はこのうち v1.6.0 に入るであろう新機能のうち二つ&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mix Format&lt;/li&gt;
&lt;li&gt;Dynamic Supervisor&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;について紹介します。&lt;/p&gt;
&lt;h2&gt;
  
  
  Mix Format(Code Formatter)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://hexdocs.pm/mix/master/Mix.Tasks.Format.html"&gt;ドキュメント&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/elixir-lang/elixir/blob/master/lib/mix/lib/mix/tasks/format.ex"&gt;該当ソースコード&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Elixir を書いていて一番困ることの一つは公式の code formatter がないことです。&lt;/p&gt;

&lt;p&gt;インデントずれや引数なし関数の&lt;code&gt;()&lt;/code&gt;忘れを指摘するのは本来はヒトのやることではないです。機械にできることは機械がやってもらうのがベストです。&lt;/p&gt;

&lt;p&gt;サードパーティのcode formatter としては &lt;a href="https://github.com/uohzxela/ex_format"&gt;ex_format&lt;/a&gt; や &lt;a href="https://hex.pm/packages/exfmt"&gt;exfmt&lt;/a&gt; などがありましたが、スタイルガイドに厳密でなかったりコメントアウトが消えてしまうなどの不具合があり、実戦投入をするにはまだ早いかな、という感触のあるものでした。&lt;/p&gt;

&lt;p&gt;Elixir-1.6.0 dev では &lt;a href="https://hexdocs.pm/elixir/master/Code.html#format_string!/2"&gt;Code.format_string!/2&lt;/a&gt; という関数を通してプロジェクト全体のフォーマットが行えるようになります。&lt;br&gt;
処理としてはstringをinputとして&lt;code&gt;Code.Formatter.algebra!&lt;/code&gt;によって AST に分解し、持っているフォーマット情報に基づいて&lt;code&gt;Inspect.Algebra.format/2&lt;/code&gt;によってstringに組み立て直す、ということをしています &lt;a href="https://github.com/elixir-lang/elixir/blob/master/lib/elixir/lib/code/formatter.ex#L196"&gt;(ソースコード参照)&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  使い方
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;mix format /path/to/file.ex
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;で指定のファイルのフォーマットを行えます。&lt;/p&gt;

&lt;p&gt;また &lt;code&gt;.formatter.exs&lt;/code&gt; に設定ファイルを記述して、プロジェクト全体のフォーマット規約をカスタマイズすることができます。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="ss"&gt;inputs:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s2"&gt;"lib/*/{lib,unicode,test}/**/*.{ex,exs}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"lib/*/mix.exs"&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;

  &lt;span class="ss"&gt;locals_without_parens:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="c1"&gt;# Formatter tests&lt;/span&gt;
    &lt;span class="ss"&gt;assert_format:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="ss"&gt;assert_format:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="ss"&gt;assert_same:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="ss"&gt;assert_same:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="c1"&gt;# Errors tests&lt;/span&gt;
    &lt;span class="ss"&gt;assert_eval_raise:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="c1"&gt;# Mix tests&lt;/span&gt;
    &lt;span class="ss"&gt;in_fixture:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="ss"&gt;in_tmp:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&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 shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;mix format
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;br&gt;
を行うと &lt;code&gt;inputs:&lt;/code&gt; で指定されたコードがフォーマットされます。&lt;/p&gt;

&lt;p&gt;既存の aliases 機能を用いて&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;defp aliases() do
    {xxxx: ["format", "release"]}
end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;などとしてビルド時など任意のタスクと一緒に format を噛ませるのもいいでしょう。&lt;/p&gt;

&lt;p&gt;また&lt;code&gt;--check-formatted&lt;/code&gt; オプションを付けると不正なフォーマットのファイルの存在をチェックすることができます。 (不正なファイルがあると exit 0 を吐きます) これはCIでの運用が有用だと思われます。&lt;/p&gt;

&lt;h2&gt;
  
  
  Dynamic Supervisor
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://hexdocs.pm/elixir/master/DynamicSupervisor.html"&gt;ドキュメント&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/elixirlang/elixir/blob/master/lib/elixir/lib/dynamic_supervisor.ex"&gt;ソースコード&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/elixir-lang/elixir/pull/7006"&gt;該当プルリクエスト&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dynamic Supervisor は子プロセスを動的に追加することができる supervisor の新しいビヘイビアです。&lt;br&gt;
&lt;code&gt;:simple_one_for_one&lt;/code&gt; の代替となるものです。既存の &lt;code&gt;:simple_one_for_one&lt;/code&gt; 再起動戦略を持ったプロジェクトを Elixir 1.6.0 に上げる場合は Dynamic Supervisor に入れ替える必要があります。&lt;br&gt;
children の指定なしで起動してあとで任意のタイミングで &lt;code&gt;start_child/2&lt;/code&gt; させることができます。&lt;/p&gt;

&lt;p&gt;Dynamic Supervisor は children の link なしで start_link します。現在サポートしている戦略は &lt;code&gt;:one_for_one&lt;/code&gt; のみのようです。&lt;/p&gt;

&lt;p&gt;使ってみます。 Dynamic Supervisor を起動します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sup&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;DynamicSupervisor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start_link&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;strategy:&lt;/span&gt; &lt;span class="ss"&gt;:one_for_one&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;#PID&amp;lt;0.85.0&amp;gt;}&lt;/span&gt;
&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 elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;agent1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;DynamicSupervisor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start_child&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sup&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="no"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;%{}&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;#PID&amp;lt;0.87.0&amp;gt;}&lt;/span&gt;
&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 elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;agent2&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;DynamicSupervisor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start_child&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sup&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="no"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;%{}&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;#PID&amp;lt;0.89.0&amp;gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;DynamicSupervisor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;count_children&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sup&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;%{&lt;/span&gt;&lt;span class="ss"&gt;active:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;specs:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;supervisors:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;workers:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;:simple_one_for_one&lt;/code&gt; を使うときと感触は変わりません。が、　&lt;code&gt;:one_for_one&lt;/code&gt; 以外の strategy が追加された場合どのような挙動になるのかも気になるところです。&lt;br&gt;
ただモジュールベースで&lt;code&gt;Dynamic&lt;/code&gt;なことが明示されているので、それぞれの supervisor の strategy を把握しやすくなり、扱いやすくなったように感じます。&lt;/p&gt;

&lt;h2&gt;
  
  
  まとめ
&lt;/h2&gt;

&lt;p&gt;Elixir は現在非常に活発に開発が進んでいる言語です。（そのベースとなっている Erlang/OTP もです）&lt;/p&gt;

&lt;p&gt;ぜひ GitHub を追ったり Elixir Conf の資料を見て最新の動向を追い、その素晴らしい機能をフルに活用しましょう。&lt;/p&gt;

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