競技プログラミングとElixirと私 (2021/12/04)

https://qiita.com/advent-calendar/2021/pre-competitive

2021/12/04の回です。

前日は、@rute_not_routeさんによる「[【初心者向け】AtCoder Beginner Contest の 取り組み方](https://qiita.com/rute_not_route/items/d1ae32a80d1c3a50d017)」でした。
[AtCoder](https://atcoder.jp/?lang=ja)のアカウント作成から、『ABCの参加方法』や『ABCの対策方法』を丁寧に解説されています。
@rute_not_routeさんは、現在大学3年生なのだそうです。
「**競プロ人口を増やしたい**」という思いを語ってくださいました。
未来は明るいと私は感じました。
本日は齢４０を過ぎた私が、「**競技プログラミングとElixirと私**」を話します。


# はじめに
**競技プログラミング**を楽しんでいますか:bangbang::bangbang::bangbang:
**[Elixir](https://elixir-lang.org/)**を楽しんでいますか:bangbang::bangbang::bangbang:

**競技プログラミング**と一口に申しましてもいろいろと種類があるとおもいます。
この記事では私自身が参加したことがある[AtCoder](https://atcoder.jp/?lang=ja)のことを指しています。

> AtCoderは、世界最高峰の競技プログラミングサイトです。

(https://atcoder.jp/?lang=ja)

この記事では2つのことを書きます。

- [Elixir](https://elixir-lang.org/)で競技プログラミングを始める人に伝えたいこと
    - [AtCoder](https://atcoder.jp/?lang=ja)に参加するために知っておくとよいことをご説明します
- 競技プログラミングと[Elixir](https://elixir-lang.org/)と私
    - オリジナルの視点から説明をいたします
    - まずはなんでもやってみることで、**serendipity**的なことが巻き起こるかもしれません

> the fact of something interesting or pleasant happening by chance

https://www.oxfordlearnersdictionaries.com/definition/english/serendipity?q=serendipity




# [Elixir](https://elixir-lang.org/)で競技プログラミングを始める人に伝えたいこと

[AtCoder](https://atcoder.jp/?lang=ja)に参加するために知っておくとよいことをご説明します。
[Elixir](https://elixir-lang.org/)を始めたばかりの人を対象に書きます。
2021/11/13現在、[AtCoder](https://atcoder.jp/?lang=ja)で使用できる[Elixir](https://elixir-lang.org/)のバージョンは[1.10.2](https://hexdocs.pm/elixir/1.10.2/Kernel.html)です。

## [AtCoderをElixirでやってみる](https://zenn.dev/torifukukaiou/articles/ac84c87736ceebf4da01)

[Zenn](https://zenn.dev/)に書いた記事をご紹介します。
詳しくは[リンク先](https://zenn.dev/torifukukaiou/articles/ac84c87736ceebf4da01)をご参照ください。

## デモ(論よりRun)

[AtCoder](https://atcoder.jp/?lang=ja)にまだ参加をしたことがない方は、以下の動画(48秒):video_camera:をみて雰囲気を掴んでください。
これから説明していくことを動画にしております。

<iframe width="778" height="438" src="https://www.youtube.com/embed/9TQXQtY1oQY" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

## 基礎知識

[リンク先](https://zenn.dev/torifukukaiou/articles/ac84c87736ceebf4da01)は、ある程度の[Elixir](https://elixir-lang.org/)の心得がある人を対象に書いています。
まずは、かいつまんで、[AtCoder](https://atcoder.jp/?lang=ja)での解答までの流れを説明いたします。
まだあまり[Elixir](https://elixir-lang.org/)に自信がない人は、まずは本記事を読んでいただいてから「[AtCoderをElixirでやってみる](https://zenn.dev/torifukukaiou/articles/ac84c87736ceebf4da01)」に進んでいただけるとよいとおもいます。[^1]

[^1]: 余計な老婆心、お節介です。


おおまかには以下の流れで問題に答えていきます。

1. 問題文を理解する
1. 「入力 [|>](https://hexdocs.pm/elixir/Kernel.html#%7C%3E/2) 入力値を問題文の仕様に合うように変換 [|>](https://hexdocs.pm/elixir/Kernel.html#%7C%3E/2) 出力」というプログラムを書く
1. 提出する

提出の際には、モジュール名は`Main`、エントリーポイントとでも申しましょうか採点時に最初に呼び出される関数名は`main/0`にしておく必要があります。
[AtCoder](https://atcoder.jp/?lang=ja)は過去問を解けますので練習ができるのがよいです :tada: 

それではさっそく一題解いてみましょう。

## 例
[ABC086A - Product](https://atcoder.jp/contests/abs/tasks/abc086_a)に対する[Elixir](https://elixir-lang.org/)での解答例を示します。

問題は

> シカのAtCoDeerくんは二つの正整数 a,b を見つけました。 a と b の積が偶数か奇数か判定してください。

です。
いきなりですが、[Elixir](https://elixir-lang.org/)での解答例です。
どの問題でもおおよそこういった流れのプログラムを作っていくことになります。

```elixir:lib/main.ex
defmodule Main do
  def main do
    IO.read(:line)
    |> String.trim()
    |> String.split(" ")
    |> Enum.map(&String.to_integer/1) # ここまでが入力(入力値を扱いやすくするための前処理を含む)
    |> do_solve() # 問題文の仕様に合うように変換
    |> IO.puts() # 出力
  end
  
  defp do_solve([a, _b]) when rem(a, 2) == 0, do: "Even"
  
  defp do_solve([_a, b]) when rem(b, 2) == 0, do: "Even"
  
  defp do_solve([_a, _b]), do: "Odd"
end
```

この問題は、偶数か奇数かを判定する単純なものです。
問題の難易度に応じて、`do_solve`が複雑なものとなります。
問題の難易度があがると`do_solve`が長くなる傾向にありますが、上に示した大枠はそれほど変わりません。
こうして眺めてみると、簡単そうにみえてきませんか。

_簡単そうにみえるのは、それはそのはず。私が説明できる簡単な問題を選んで説明に使っています。_
_[Elixir](https://elixir-lang.org/)で標準入力ってどうやるんだっけ？　とか[String.trim/1](https://hexdocs.pm/elixir/1.12/String.html#trim/1)をしておかないと改行がくっついてくるとかそのへんは知っておかないと無駄にハマるかもしれません。私はハマりました... 私の経験を共有することは誰かの役に立つ**かもしれない**とおもって書いています。_

ちなみに、「[|>](https://hexdocs.pm/elixir/Kernel.html#%7C%3E/2): パイプ演算子」を使わない場合はこうなります。


```elixir:lib/main.ex
defmodule Main do
  def main do
    IO.puts(do_solve(
      Enum.map(String.split(String.trim(IO.read(:line)), " "), 
               &String.to_integer/1)))
  end
  
  defp do_solve([a, _b]) when rem(a, 2) == 0, do: "Even"
  
  defp do_solve([_a, b]) when rem(b, 2) == 0, do: "Even"
  
  defp do_solve([_a, _b]), do: "Odd"
end
```



## [AtCoder Beginners Selection](https://atcoder.jp/contests/abs)

もう少し準備体操をしたい方にオススメです。

> このコンテストは、「AtCoderに登録したけど何をしていいか分からない・・・！」という人に向けて作られた、初心者向け問題集です。
問題は、dr.kenさんの、「[AtCoder に登録したら次にやること ～ これだけ解けば十分闘える！過去問精選 10 問 ～](https://qiita.com/drken/items/fd4e5e3630d0f5859067)」から選出しています。
まずはこの問題を順番に解いていきましょう！

まずはここの問題から腕試ししてみましょう。
[Elixir](https://elixir-lang.org/)での解答例は以下に書いています。

### 解答例

[AtCoder に登録したら解くべき精選過去問 10 問を私も"Elixir"で解いてみた](https://qiita.com/torifukukaiou/items/2a17b1cb850cde75f664)


## Where to go Next

さらにステップアップしたいあなたに贈ります。:gift::gift::gift:

### [問題解決力を鍛える！アルゴリズムとデータ構造](https://bookclub.kodansha.co.jp/product?item=0000275430) :book: 

@drken さんの:book:で、**アルゴリズムとデータ構造**を学びましょう。

### ライブラリ

[AtCoder](https://atcoder.jp/?lang=ja)に対して[Elixir](https://elixir-lang.org/)を使って挑むあなたの強力な味方となってくれるツールをご紹介します。

#### [ex_at_coder](https://github.com/tamanugi/ex_at_coder)

@tamanugi さん作 :tada:
mix taskにて、問題文からテストの自動生成、解答用の雛形ファイルを作ってくれます :rocket: 
参考: [@tamanugiさんのex_at_coderを使ってみる (Elixir)](https://qiita.com/torifukukaiou/items/3cb86dede8aefa2cd7c0)

#### [g-kenkun/kyopuro](https://github.com/g-kenkun/kyopuro)

@g_kenkun さん作 :tada:
mix taskにて、問題文からテストの自動生成、解答用の雛形ファイルを作ってくれます :rocket: 
さらに提出機能をサポートしています。
参考: [@g_kenkunさんのg-kenkun/kyopuroを使ってみる (Elixir)](https://qiita.com/torifukukaiou/items/0d9af23244d599cb60d0)

## まとめ

[Elixir](https://elixir-lang.org/)を使って、[AtCoder](https://atcoder.jp/?lang=ja)に挑むとはどういうことなのかを簡単に説明しました。
雰囲気を感じていただけたら幸いです。
準備はできました :tada: 

**Leap before you look :rocket::rocket::rocket:**


---

# 競技プログラミングと[Elixir](https://elixir-lang.org/)と私

競技プログラミングとの出会いは2020年10月です。
社内で毎月月末に行われている社内ハッカソンでその存在を知りました。
20年近くソフトウェア開発という世界に身を置きながら、おおよそ1年前にはじめて知りました。
お恥ずかしい限りです。

一時期熱心に取り組んでいた時期はありますが、灰色ランクのままです。
何の自慢にもなりませんし、そもそもこのカレンダーに投稿参加する資格があるのかどうかはなはだ怪しいです。
それでも自分が感じたことは書けるので参加しました。

のちほどまた後述しますが、[AtCoder](https://atcoder.jp/?lang=ja)に取り組むことで[Elixir](https://elixir-lang.org/)の[Enum](https://hexdocs.pm/elixir/Enum.html#content)モジュールへの理解が深まりました。
このことは、これまでの20年間では経験することのなかった、その後に起きるさまざまな出来事と無関係であるとはおもえません。
ものすごく強く結びついているとおもいます。

私は2019年に[Elixir](https://elixir-lang.org/)に出会いました。
2019/01/25に行われた「[kokura.ex#1：小倉Elixirコミュニティ発足【セッション／LTと懇親会】（19:30～）](https://fukuokaex.connpass.com/event/116855/)」に参加したことがはじまりです。
@zacky1972 先生、@piacerex さんはじめ、参加者のみなさんが[Elixir](https://elixir-lang.org/)を楽しそうに語っていたことが印象に残っています。
当時のことを正直に書きますと、**関数型言語[Elixir](https://elixir-lang.org/)**と聞いて、「**関数型言語**」のところに変な先入観をもっていました。

- 難しそう
- 恐れ
- (もっと言うと)実用とは関係なくて研究用なんでしょ

最初が肝心と申します通り、「[kokura.ex#1：小倉Elixirコミュニティ発足【セッション／LTと懇親会】（19:30～）](https://fukuokaex.connpass.com/event/116855/)」に参加したことがよかったです。
さきほども申しました通り、参加者が[Elixir](https://elixir-lang.org/)を楽しそうに語っていたことから私にもできるんじゃないかと**勘違い**をしたのです。
私の第一印象は、Rubyに似ているとおもったことです。
それと当時はコードの断片をチラ見しただけでしたが、**美しい**と感じました。

その後で、知ったのですが[Elixir](https://elixir-lang.org/)の作者[José Valim](https://twitter.com/josevalim)さんはRailsのご経験がある方ならご存知のあの[devise](https://github.com/heartcombo/devise)の[最初のコミッター](https://github.com/heartcombo/devise/commit/673fda9725b3a0b5522afdbe4fc9c0608243723c)ですし、[Elixir](https://elixir-lang.org/)のバージョンがまだ0.9.0だった2013年には、東京で行われたRubyKaigiにて基調講演をされています。
このことは[プログラミングElixir 第2版(オーム社)](https://www.ohmsha.co.jp/book/9784274226373/):book:の「Appendix E 日本語版に寄せて」にて[José Valim](https://twitter.com/josevalim)さんの言葉が載っています。

> デモを開始したとき、ElixirのインタラクティブコンソールであるIExを起動しました(この名前はRubyのirbに強くインスパイアされています)。そのIExのセッションで、Elixirがサポートするドキュメンテーションやパターンマッチといった機能について見せました。それから、もう一つIExセッションを開始し、どれくらい簡単に分散ノード上でコードを移送できるかというデモンストレーションを行いました。最初の分散呼び出しを実行すると、部屋全体で「オオオー」という声が広がりました。マジシャンが帽子から兎を取り出したような気分でした。この経験は、何度もElixirのプレゼンテーションをしてきたなかでも、いまだに特に好きな瞬間の一つです。しかし、それは魔法ではありません。 (略) 言語ランタイムの裏にある美しさは、私たちが並行性のために理由する抽象化と同じものであり、それは堅固で分散したシステムを作り上げるために利用できるものです。それはすべてを変えるのです。Elixirをマスターする途上で、開発者は、ソフトウェアの実装と設計のための、多くの可能性があることを学ぶでしょう。

([プログラミングElixir 第2版(オーム社)](https://www.ohmsha.co.jp/book/9784274226373/))

このときのRubyKaigiの様子は「[Jose Valim，Rubyにおける並行プログラミングのためのいくつかのアイデアを提案。～ RubyKaigi 2013 基調講演 2日目](https://gihyo.jp/news/report/01/rubykaigi2013/0002?page=1)」にて知ることができます。
**基調**講演のレポートだけにとても**貴重**な記事です。



このようにRubyのプログラムと似ているなあとおもった私の直感は間違ってはいなかったようです。

[Elixir](https://elixir-lang.org/)が、Rubyの影響をもしかするともっとも色濃く受け継いでいるのは「**A PROGRAMMER'S BEST FRIEND**」[^2]の部分ではないかとおもいます。
とにかく、[Elixir](https://elixir-lang.org/)でプログラミングすることは楽しいです。
それほど多くの海外の方と交流したわけではありませんが、これまでやりとりがあった彼らはナイスガイでした。
こういった経験は私にとっては、[Elixir](https://elixir-lang.org/)と出会ってからのことです。
[Elixir](https://elixir-lang.org/)は海外との距離が近いです。
というか、少なくとも英語を読むことをしないと最新の情報にはついていけないです。
英語に接する機会が圧倒的に増えます。

話を**BEST FRIEND**に戻します。
私はいつも**We Are The Alchemists, my friends!**とLT(Lightning Talks)などで歌っています :microphone: 
Queenの[We Are The Champions](https://www.youtube.com/watch?v=KXw8CRapg7k)をもじっています。
[Elixir](https://elixir-lang.org/)は日本語に訳すと「不老不死の霊薬」です。
[Elixir](https://elixir-lang.org/)言語の使い手のことは、Alchemist(錬金術師)と尊称されます。
いまの私にとって、[Elixir](https://elixir-lang.org/)は、プログラミングすることは楽しいんだよということを思い出させてくれた**優しい友人**です。
いまのレベルでも以前の私と比べるとできることは格段には増えましたが、世の中にはもっともっともっともっともっと上がいます。
こんなところで満足しているわけにはいきません。
さきほど引用した「[プログラミングElixir 第2版(オーム社)](https://www.ohmsha.co.jp/book/9784274226373/):book:」の[José Valim](https://twitter.com/josevalim)さんの言葉の中で、[Elixir](https://elixir-lang.org/)の言語を象徴するキーワードである「**並行性**」「**分散**」を私は雰囲気でしか理解できていません。
さらに高みを目指すにはこれからの私にとっての[Elixir](https://elixir-lang.org/)くんは、**厳しいことも言ってくれる友人**に変わっていくのだとおもいます。
そうして突き詰めていくと、チラチラと背中が見えはじめた[Erlang](https://www.erlang.org/)( -- 私にはプログラムが**漢**にみえました[^3])と仲良くなっていきたいとおもっています。

[^2]: https://www.ruby-lang.org/ja/ の一番上に、「**A PROGRAMMER'S BEST FRIEND**」と書いてあります。

[^3]: @takasehideki 先生が「父がErlang、母がRuby」と[Elixir](https://elixir-lang.org/)のことをおっしゃっていたことは言い得て妙だとおもいました。

話を「[kokura.ex#1：小倉Elixirコミュニティ発足【セッション／LTと懇親会】（19:30～）](https://fukuokaex.connpass.com/event/116855/)」にまた戻します。
私は厚かましいところがあって、[Elixir](https://elixir-lang.org/)で`Hello, World`しかできていない状態でいきなりLT(Lightning Talks)をしました。
当時の資料を振り返ってみると、時間が余ってしまうことを懸念したのだとおもいます -- 最後に「私は将棋が趣味です。さあ、みんなで詰将棋を解いてみましょう!:rocket:」というノリのページがありました。
こんなLTでもあたたかく迎え入れてくれたみなさまに感謝します。

だいぶ長くなってしまいましたが、[Elixir](https://elixir-lang.org/)と以上のような出会いをしました。

## 実績

その後いろいろあったことは端折りますが、さきほども申した通り、[AtCoder](https://atcoder.jp/?lang=ja)に取り組むことで[Elixir](https://elixir-lang.org/)の[Enum](https://hexdocs.pm/elixir/Enum.html#content)モジュールへの理解が深まったことはその後の実績と強く関係しているとおもいます。
[Elixir](https://elixir-lang.org/)界での私の足跡です。

- [ElixirConf JP 2019 Kokurajo](https://fukuokaex.fun/) LT (2019/09/07)
- [ElixirConf EU Virtual](https://www.elixirconf.eu/archives/virtual_2020/index.html) LT (2020/06/19)
- [Interface 2021年1月号](https://interface.cqpub.co.jp/wp-content/uploads/if2101_152.pdf)に、@takasehideki 先生との共著で記事が載る
- [日本マイクロソフト賞④](https://qiita.com/chomado/items/7d1f757f18c5b442fadd#%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%BD%E3%83%95%E3%83%88%E8%B3%9E-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%8D%E3%82%A4%E3%83%86%E3%82%A3%E3%83%96%E3%81%AE-aspnet-core-%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%81%A6%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%99%E3%82%8B-%E3%82%92%E3%82%84%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B-torifukukaiou-%E3%81%95%E3%82%93)を受賞 (2021/01/15)
    - 日本マイクロソフトさんのクラウドデベロッパーちゃんねるに[出演](https://www.youtube.com/watch?v=R3o8vR1A9ao) (2021/07/19)
- [Elixir](https://github.com/elixir-lang/elixir)本体のコミットに名乗るほどのものでもない名前を刻む 2021/07/06
    - https://github.com/elixir-lang/elixir/commit/1da7e38c48753932cffaf673c1b62627ee428d83
    - https://github.com/elixir-lang/elixir/commit/877ebd2e129fe2a469a363a8575edbb7400f3dda

すべて[Elixir](https://elixir-lang.org/)をはじめてから体験したことです。
齢40を過ぎてからのことです。
**遅咲きの狂い咲き**です。
ただ、こんなところで満足しているわけにはいきません :rocket::rocket::rocket:

どうして、私が[Elixir](https://elixir-lang.org/)を覚えたいとおもったかというそもそものところに話を戻すと、**憧れ**と**美しさ**に惹かれたからです。
本当に好きなものに理由は必要でしょうか。
耐障害性、並行、関数型？ -- [Erlang](https://www.erlang.org/)から受け継いださまざまな利点はそれはそれでどれも魅力ですが、私は**Fun**の部分を強く感じました。
私はプログラミング言語[Elixir](https://elixir-lang.org/)そのものに魅力を感じたから、[AtCoder](https://atcoder.jp/?lang=ja)の活用は最良の教材でした。
これは私の場合です。
あなたがもしなにか作りたいものがあるのなら、寄り道はせずに一直線に作りたいものを作っていけばよいとおもいます。
目的意識が強固であれば、必要な知識はあとから付いてくるものです。
私の場合は特に作りたいものがあるわけでもなく、ただただ[Elixir](https://elixir-lang.org/)を書けるようになりたいという憧れだけではじめました。


## 競技プログラミング

ここからは再び**競技プログラミング**の話をしてみます。
自分が競技プログラミングを語れる域には決して達していないのにおこがましくも語ってみます。

:::note info
新しいプログラミング言語を覚えるツールとして、競技プログラミングAtCoderを活用することはアリだとおもいます
:::

[Elixir](https://elixir-lang.org/)においては、[Enum](https://hexdocs.pm/elixir/Enum.html#content)モジュールから親しくなるとよいです。
@cooldaemon さんの「[私が愛する Elixir/Erlang の楽しさと辛さ](https://speakerdeck.com/cooldaemon/erlang-falsele-sisatoxin-sa)」スライドにその理由が詳しく書いてあります。
この目的にだけ絞れば、[AtCoder](https://atcoder.jp/?lang=ja)のABC(AtCoder Beginner Contest)のA問題〜C問題が解ければ十分です。
[Elixir](https://elixir-lang.org/)を楽しんでいけます。
[Elixir](https://elixir-lang.org/)を使って何かsomethingを作ることができます。

_もちろん、問題は全部解けたほうがよいです。_

競技プログラミングは若い時分からコツコツ取り組んでいたほうがいいとおもいます。
若いフレッシュなうちからはじめるのと40歳を過ぎてから始めるのでは、一般的には伸びのカーブに大きな違いがでるとおもいます。
それはちょうどプロの将棋の世界で、若い世代が台頭していくさまと同じだとおもいます。
いま圧倒的な強さを誇る若い世代でも次の次くらいの世代に駆逐されてしまうのでしょう。
それが自然の摂理であり、発展ということなのでしょう。

一方でこんな言葉があります。

**It’s never too late – never too late to start over, never too late to be happy. (Jane Fonda)**

これからのソフトウェアエンジニアには次の2点が求められていくのだとおもいます。
- ハードウェア
- 数学的素養

ハードウェアについてはこれまで一言も話していませんし、これまた語るほどなにかを知っているわけではありませんが、IoTというキーワードに代表されるように、必須の技能になると予感しています。

数学的素養を鍛える手段として、競技プログラミングへの参加／練習などの取り組みはその一つになり得るとおもいます。
道場だとおもいます。

@drken さんの「[問題解決力を鍛える！アルゴリズムとデータ構造](https://bookclub.kodansha.co.jp/product?item=0000275430)」 :book: の最初のほう(「もくじ」の前)を味読してみてください。
「一生モノ」の下地を築きあげましょう。


## まとめ
- 新しいプログラミング言語を覚えるツールとして、競技プログラミング[AtCoder](https://atcoder.jp/?lang=ja)を活用することはアリだとおもいます
- [Elixir](https://elixir-lang.org/)においては、[Enum](https://hexdocs.pm/elixir/Enum.html#content)モジュールから親しくなるとよいです
- [Elixir](https://elixir-lang.org/) コワくないよ
- [Elixir](https://elixir-lang.org/)を始めると自然と英語に接する機会が増えますよ

**It’s never too late – never too late to start over, never too late to be happy. (Jane Fonda)**

---

# Wrapping up :lgtm::lgtm::lgtm::lgtm::lgtm:

全体のまとめです。

- [AtCoder](https://atcoder.jp/?lang=ja)を[Elixir](https://elixir-lang.org/)で楽しみ方を紹介しました
- 「競技プログラミングと[Elixir](https://elixir-lang.org/)と私」と題して、私のおもいと私に起こったserendipity的なことを述べました
    - 「[部屋とYシャツと私](https://www.youtube.com/watch?v=re3PzspwEWo)」という歌がありまして、その題名から強くインスパイアされています
- Enjoy 競技プログラミング :bangbang::bangbang::bangbang: 
- Enjoy 競技プログラミング with [Elixir](https://elixir-lang.org/) :bangbang::bangbang::bangbang:
- Enjoy [Elixir](https://elixir-lang.org/) :rocket::rocket::rocket:

## おまけ -- [Elixir](https://elixir-lang.org/)

[Elixir](https://elixir-lang.org/)を始めてみよう！　とおもった、あなたに参考情報(クリスマス🎄プレゼント)を贈ります。:gift::gift::gift:
**思い立ったが吉日です!!!**

### オススメの書籍 :books: 
- [プログラミングElixir（第2版）](https://www.ohmsha.co.jp/book/9784274226373/) -- オーム社
- [Elixir実践ガイド](https://book.impress.co.jp/books/1120101021) -- インプレス
- [アルケミスト 夢を旅した少年](https://www.kadokawa.co.jp/product/199999275001/) -- 角川文庫

### Webアプリケーションを楽しむなら
- [Phoenix](https://www.phoenixframework.org/)

### IoTを楽しむなら
- [Nerves](https://www.nerves-project.org/)

### AIを楽しむなら
- [Nx](https://github.com/elixir-nx/nx) + [Livebook](https://github.com/livebook-dev/livebook)

### コミュニティ
-  [elixir.jp](https://join.slack.com/t/elixirjp/shared_invite/zt-ae8m5bad-WW69GH1w4iuafm1tKNgd~w) Slack workspaceに参加してみてください
    - マヂ、やさしい人ばっかりのコミュニティ
    - あなたの**困った**をきっと解決してくれるでしょう
- [NervesJP](https://join.slack.com/t/nerves-jp/shared_invite/zt-9vteokip-iVAqi8TkT0ID_uK9dSqVHA) Slack workspaceでは、[Nerves](https://www.nerves-project.org/)やIoTが好きな愉快なfolksたちがあなたの訪れを歓迎します :tada:
- たくさんのコミュニティがあります
    - @kn339264 さん作の素敵な資料をご紹介します
    - [Elixirコミュニティ の歩き方〜国内オンライン編〜](https://speakerdeck.com/elijo/elixirkomiyunitei-falsebu-kifang-guo-nei-onrainbian) :clap::clap_tone1::clap_tone2::clap_tone3::clap_tone4::clap_tone5:

![FCOvBkAUYAE6mL8.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/a277d0ea-2780-d9a3-4062-66d38b175125.jpeg)
@piacerex さん作 :pray::pray_tone1::pray_tone2::pray_tone3::pray_tone4::pray_tone5:

---

明日は、@malleroidさんによる「[VSCodeでAtCoder用の開発環境を簡単に作る(Python編)](
https://qiita.com/malleroid/items/ab83b5ffb8ddfd58a4d3)」です。
楽しみにしています〜〜〜:tada::tada::tada: