闘魂Elixir ── 05. パイプ演算子

<b><font color="red">$\huge{元氣ですかーーーーッ！！！}$</font></b>

https://qiita.com/advent-calendar/2022

https://qiita.com/advent-calendar/2022/elixir

# はじめに

闘魂と[Elixir](https://elixir-lang.org/)が出会いました。
闘魂 meets [Elixir](https://elixir-lang.org/).です。
[Elixir](https://elixir-lang.org/) meets 闘魂.でもよいです。

本日は、パイプ演算子（[|>](https://hexdocs.pm/elixir/Kernel.html#%7C%3E/2)）を説明します。

```elixir
iex> "Elixir" |> String.graphemes() |> Enum.frequencies()
%{"E" => 1, "i" => 2, "l" => 1, "r" => 1, "x" => 1}
```

# パイプ演算子（[|>](https://hexdocs.pm/elixir/Kernel.html#%7C%3E/2)）

早速、例を示します。
[Qiita API v2](https://qiita.com/api/v2/docs)で、[Elixirタグ](https://qiita.com/tags/elixir)がついた最新記事100件を取得します。
カンのいい方、熱心な読者であるそこのあなたはおわかりのように、「[闘魂Elixir ── 02. インストール](https://qiita.com/torifukukaiou/items/42bc08509fa97fa970ae)」で示したプログラム例です。

パイプ演算子（[|>](https://hexdocs.pm/elixir/Kernel.html#%7C%3E/2)）無しで書いてみます。

```elixir
Mix.install([{:req, "~> 0.3.2"}])

Enum.map(Map.get(Req.get!("https://qiita.com/api/v2/items?query=tag:Elixir&per_page=100", pool_timeout: 50000, receive_timeout: 50000), :body), & Map.take(&1, ["title", "url"]))
```

なんだかわかりにくいですね。
どこから読めばいいのかわかりません。

パイプ演算子（[|>](https://hexdocs.pm/elixir/Kernel.html#%7C%3E/2)）を使って書き直してみます。

```elixir
"https://qiita.com/api/v2/items?query=tag:Elixir&per_page=100"
|> Req.get!(pool_timeout: 50000, receive_timeout: 50000)
|> Map.get(:body)
|> Enum.map(& Map.take(&1, ["title", "url"]))
```

ね！　わかりやすくなりましたね。

URLがありましてですねー
[|>](https://hexdocs.pm/elixir/Kernel.html#%7C%3E/2) Getします
[|>](https://hexdocs.pm/elixir/Kernel.html#%7C%3E/2) responseからbodyを取り出します
[|>](https://hexdocs.pm/elixir/Kernel.html#%7C%3E/2) 記事のリストが取り出せるので、各記事から`title`と`url`を取り出します

と、こんなふうに読めばいいわけです。書けばいいわけです。
[|>](https://hexdocs.pm/elixir/Kernel.html#%7C%3E/2)の直前の計算結果が、続く関数呼び出しの第一引数に入って実行されます。



## 実行結果例

実行結果の例を示しておきます。

```elixir
[
  %{
    "title" => "Elixirコンパイラのwarnings_as_errorsオプションを使って確実にコンパイルする",
    "url" => "https://qiita.com/mnishiguchi/items/f758c8324306fc41bed1"
  },
  %{
    "title" => "paiza.ioでelixir その104",
    "url" => "https://qiita.com/ohisama@github/items/82c9ade7ef5455e9cfc3"
  },
  %{
    "title" => "Dockerを使ってElixir 1.12で増えた関数を調べたい",
    "url" => "https://qiita.com/mnishiguchi/items/d90c2de70774014b165b"
  },
  %{
    "title" => "paiza.ioでelixir その103",
    "url" => "https://qiita.com/ohisama@github/items/9b681286a6e36012ec4c"
  },
  %{
    "title" => "Elixir Livebook で分散画像処理",
    "url" => "https://qiita.com/RyoWakabayashi/items/ef858baebecf84028a14"
  },
  %{
    "title" => "paiza.ioでelixir その102",
    "url" => "https://qiita.com/ohisama@github/items/a3b5713088a7739b8926"
  },
  %{
    "title" => "paiza.ioでelixir その101",
    "url" => "https://qiita.com/ohisama@github/items/5dafad2e50e65b305a43"
  },
  %{
    "title" => "Dockerを使ってElixirの分散システムを気軽に楽しむ",
    "url" => "https://qiita.com/mnishiguchi/items/d75668aa5c458644d759"
  },
  %{
    "title" => "Elixirを使ってNeosVRで花火を打ち上げる　〜ブラウザーからVRのオブジェクトをいじる〜",
    "url" => "https://qiita.com/t-yamanashi/items/0577cf36dca0e33f463c"
  },
  %{
    "title" => "闘魂Elixir ── 03. 完走賞を目指してみましょう！【自動更新記事】",
    "url" => "https://qiita.com/torifukukaiou/items/17d55cf896c24b13350e"
  },
  %{
    "title" => "Elixir Node.ping/1で気軽に分散システムを楽しむ",
    "url" => "https://qiita.com/mnishiguchi/items/4d92c839d1ec52a8fd2a"
  },
  %{
    "title" => "PostgresとElixirによる多言語の名前",
    "url" => "https://qiita.com/westbaystars/items/13d0ae9079c903ba604f"
  },
  %{
    "title" => "paiza.ioでelixir その100",
    "url" => "https://qiita.com/ohisama@github/items/75b4c4d89bf4ee4a0373"
  },
  %{
    "title" => "paiza.ioでelixir その99",
    "url" => "https://qiita.com/ohisama@github/items/c454112e8ff570b41959"
  },
  %{
    "title" => "Elixir Livebook で並列画像処理",
    "url" => "https://qiita.com/RyoWakabayashi/items/1a83c962ae03791a988c"
  },
  %{
    "title" => "paiza.ioでelixir その98",
    "url" => "https://qiita.com/ohisama@github/items/2e137a293b9f750c804d"
  },
  %{
    "title" => "paiza.ioでelixir その97",
    "url" => "https://qiita.com/ohisama@github/items/869dd246b2577dc9a65d"
  },
  %{
    "title" => "paiza.ioでelixir その96",
    "url" => "https://qiita.com/ohisama@github/items/eaa30e898a268e109a74"
  },
  %{
    "title" => "paiza.ioでelixir その95",
    "url" => "https://qiita.com/ohisama@github/items/51ae360161589830a98c"
  },
  %{
    "title" => "Qiitaアドベントカレンダー2023 完走賞 獲ります ーー 闘魂こめて",
    "url" => "https://qiita.com/torifukukaiou/items/5e96f4e9f12ec3c4b3f4"
  },
  %{
    "title" => "paiza.ioでelixir その94",
    "url" => "https://qiita.com/ohisama@github/items/df5accdd087b3fc1c99e"
  },
  %{
    "title" => "paiza.ioでelixir その93",
    "url" => "https://qiita.com/ohisama@github/items/627ded21efba9f29fcef"
  },
  %{
    "title" => "paiza.ioでelixir その92",
    "url" => "https://qiita.com/ohisama@github/items/e85c99e807ce53ec3a56"
  },
  %{
    "title" => "paiza.ioでelixir その91",
    "url" => "https://qiita.com/ohisama@github/items/31cdef526e94d8f03aef"
  },
  %{
    "title" => "Elixir defdelegateで委譲",
    "url" => "https://qiita.com/mnishiguchi/items/8366b2e8cfeaa774e9f3"
  },
  %{
    "title" => "ねえパパ、numpyのnp.max(a, axis=1)、Nxに無いの？",
    "url" => "https://qiita.com/GeekMasahiro/items/f135b841de08921ab342"
  },
  %{
    "title" => "Livebook と Exploler で Qiita の記事データを解析する",
    "url" => "https://qiita.com/RyoWakabayashi/items/167d6b8c9215ade42346"
  },
  %{
    "title" => "「【増枠】LiveView JP#12：はじめてのElixir AI・ML…Livebook＋Nxで」レポート（2022-11-22）",
    "url" => "https://qiita.com/torifukukaiou/items/5212b1aa1bab752a2229"
  },
  %{
    "title" => "Livebookで試しなが作る、はじめてのAxonプログラム",
    "url" => "https://qiita.com/GeekMasahiro/items/d956a7a880a937370a56"
  },
  %{
    "title" => "Elixirでディープラーニング①：手書き文字識別（MNIST）をLivebook＋Axonで",
    "url" => "https://qiita.com/piacerex/items/6a9a5cc5d0e9dd9398ff"
  },
  %{
    "title" => "Elixir Explorer で欠損値を補完する",
    "url" => "https://qiita.com/RyoWakabayashi/items/94d8f6af5fd4cfc9c7ef"
  },
  %{
    "title" => "Livebook に散布図と回帰直線を表示する",
    "url" => "https://qiita.com/RyoWakabayashi/items/f3636171dee22c8305fa"
  },
  %{
    "title" => "paiza.ioでelixir その90",
    "url" => "https://qiita.com/ohisama@github/items/cef82a9a957bfc03573a"
  },
  %{
    "title" => "Elixir Livebook で地域経済分析システム RESAS から産業構造を取得して分析する",
    "url" => "https://qiita.com/RyoWakabayashi/items/fdc0efa99f35ffb0829f"
  },
  %{
    "title" => "paiza.ioでelixir その89",
    "url" => "https://qiita.com/ohisama@github/items/66294396056d18634fe6"
  },
  %{
    "title" => "paiza.ioでelixir その88",
    "url" => "https://qiita.com/ohisama@github/items/7820cb0a3f2f122e7339"
  },
  %{
    "title" => "paiza.ioでelixir その87",
    "url" => "https://qiita.com/ohisama@github/items/2c7ccf452808cbd26486"
  },
  %{
    "title" => "paiza.ioでelixir その86",
    "url" => "https://qiita.com/ohisama@github/items/23773868f99f5d46f399"
  },
  %{
    "title" => "paiza.ioでelixir その85",
    "url" => "https://qiita.com/ohisama@github/items/60082180a532fc11629b"
  },
  %{
    "title" => "paiza.ioでelixir その84",
    "url" => "https://qiita.com/ohisama@github/items/59b8eda16846b6cae8cc"
  },
  %{
    "title" => "paiza.ioでelixir その83",
    "url" => "https://qiita.com/ohisama@github/items/4554d79c9c33deec97ee"
  },
  %{
    "title" => "Elixir 全プロセスIDのリストを取得",
    "url" => "https://qiita.com/mnishiguchi/items/990be2c72cb526681d0b"
  },
  %{
    "title" => "Elixirをデコンパイル（逆コンパイル）",
    "url" => "https://qiita.com/mnishiguchi/items/fce1ef56e64a568accff"
  },
  %{
    "title" => "paiza.ioでelixir その82",
    "url" => "https://qiita.com/ohisama@github/items/0389389a1fef9d2db2e9"
  },
  %{
    "title" => "paiza.ioでelixir その81",
    "url" => "https://qiita.com/ohisama@github/items/c7910ba0a0325559902a"
  },
  %{
    "title" => "Livebook で九九の表を作る（Enum版、Nx版）",
    "url" => "https://qiita.com/RyoWakabayashi/items/76cf8cae6bd53cb78f95"
  },
  %{
    "title" => "Elixirコードからmix.exsの中身を取得する方法",
    "url" => "https://qiita.com/mnishiguchi/items/186f8c6aa280f0b085a3"
  },
  %{
    "title" => "Livebook で秘密情報を入力する",
    "url" => "https://qiita.com/RyoWakabayashi/items/debb1d048613ce505988"
  },
  %{"title" => "WSL2でDB付きElixir／Phoenix／Nxを使う最短手順", ...},
  %{...},
  ...
]
```



# ワンポイントレッスン

[Elixir](https://elixir-lang.org/)が好きだ！　と言っている人は、たいてい「[|>](https://hexdocs.pm/elixir/Kernel.html#%7C%3E/2)（パイプ演算子）」が好きです。

書いたことが無い方には文章だけではなかなか良さは伝わらないとおもいます。
また、手打ちをされてみても、なお心地よいとはおもえない方もいらっしゃるとはおもいます。
いろんな考え、感じ方があるから世界はうまく回っているのだとおもいます。

ひとつ言えることは、[Elixir](https://elixir-lang.org/)にのめり込める体質かどうかは、「[|>](https://hexdocs.pm/elixir/Kernel.html#%7C%3E/2)（パイプ演算子）」で測れます。

別の視点からは、「**データ変換パラダイム**」として@zacky1972 先生が解説されている記事がありますのでご紹介しておきます。

https://qiita.com/zacky1972/items/0c2869f9f39f7bb917a5

https://qiita.com/zacky1972/items/2dc7c4930f6ab8a4688a

「私のことは嫌いでも、[|>](https://hexdocs.pm/elixir/Kernel.html#%7C%3E/2)（パイプ演算子）と[Elixir](https://elixir-lang.org/)のことは嫌いにならないでください」

https://bunshun.jp/articles/-/11819


# 今日の<font color="#d00080">闘魂</font>

今日は、吉田松陰先生から言葉を引きます。

---
<ruby>君子<rt>くんし</rt></ruby>は<ruby>渇<rt>かっ</rt></ruby>すとも<ruby>盗泉<rt>とうせん</rt></ruby>を飲まず、志士は<ruby>窮<rt>きゅう</rt></ruby>すとも<ruby>溝壑<rt>こうがく</rt></ruby>を忘れず
---

解説は、[こちら](http://mn1552.blog15.fc2.com/blog-entry-772.html?sp)をご参照ください。

猪木さん流に言うと、「心の貧乏人にだけはなるな」「乞食になっても世界一の乞食になれ」（猪木さんの祖父）ということです。


> 世界一の乞食と言われても、どんな乞食なのかよくわからなかったが、言わんとすることは何となく伝わった。男なら何でも一番を目指せ。どの道でも世界に通用する人物になってみろ。そう言いたかったのだろう。

:book:『[アントニオ猪木自伝](https://www.shinchosha.co.jp/book/129721/)』:book:から引きました。
みなさまもぜひこの本をお手にとられて、猪木さんが残されたメッセージを通じて、直接猪木さんから「元氣」をもらってください。

https://www.shinchosha.co.jp/book/129721/

https://presidentstore.jp/item/008105.html


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/be8933f5-e3e2-d5f4-1561-f65f75abdf38.png)




# さいごに

パイプ演算子（[|>](https://hexdocs.pm/elixir/Kernel.html#%7C%3E/2)）を説明しました。
「**私のことは嫌いでも、[|>](https://hexdocs.pm/elixir/Kernel.html#%7C%3E/2)（パイプ演算子）と[Elixir](https://elixir-lang.org/)のことは嫌いにならないでください**」

闘魂の意味は、 **「己に打ち克ち、闘いを通じて己の魂を磨いていくことである」** との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。

<font color="red">$\huge{１、２、３ ぁっダー！}$</font>


<iframe width="910" height="512" src="https://www.youtube.com/embed/AWxwmqzbOaw" title="燃える闘魂 アントニオ猪木  追悼VTR" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

https://www.youtube.com/watch?v=FSz7N5hCltw

---

https://qiita.com/torifukukaiou/items/5e96f4e9f12ec3c4b3f4

---

# Twitter

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Elixir Advent Calendar 3の5日目は、 <a href="https://twitter.com/torifukukaiou?ref_src=twsrc%5Etfw">@torifukukaiou</a> さんで、Elixirらしさの筆頭、「パイプ演算子」について😌<a href="https://t.co/R8uhawokGt">https://t.co/R8uhawokGt</a><br><br>前回コードをパイプで書き直すと、分かりやすくなる例付き💁‍♂️<br><br>「私のことは嫌いでも、|&gt;（パイプ演算子）とElixirのことは嫌いにならないでください」！？😅</p>&mdash; piacere (love Elixir, Gravity and VR/AR/Metaverse) (@piacere_ex) <a href="https://twitter.com/piacere_ex/status/1599604467514888193?ref_src=twsrc%5Etfw">December 5, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

---

<b><font color="red">$\huge{元氣があればなんでもできる！}$</font></b>