完走賞を目指してみましょう！2024 on Livebook

## はじめに

今年も Advent Calender の季節がやってきました

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

というわけで 2024 年も「誰が何記事投稿しているか」を Livebook で視覚化しています

https://qiita.com/RyoWakabayashi/items/7729f0e35bfec62e53b0

https://qiita.com/RyoWakabayashi/items/e65e42cfd1c9ef3c5852

2023 年の最終的な結果はこちら

![visualization.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/c3527b85-8987-f0eb-5b1a-1f9060752386.png)

最大が @piacerex さんの 62 投稿で、 7 名もの完走者がいます

14 シリーズ * 25 記事 = 350 記事という怒涛の勢いです

![スクリーンショット 2024-11-27 0.11.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/b2bce661-5b6a-aaf6-fac7-cbc6154c105e.png)

というわけで、 $\huge{2024 年も Livebook でカレンダーの状況を見ていきましょう！}$

実装したノートブックはこちら

https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/qiita/calender_2024.livemd

## 実装

昨年のノートブックを少し更新し、 2024 年の現時点のカレンダーを確認します

セットアップ
```elixir
Mix.install([
  {:req, "~> 0.5"},
  {:req_easyhtml, "~> 0.1"},
  {:explorer, "~> 0.9"},
  {:kino, "~> 0.14"},
  {:kino_vega_lite, "~> 0.1"}
])
```

エイリアス、マクロの設定
```elixir
alias Explorer.DataFrame
alias Explorer.Series
require Explorer.DataFrame
```

リクエストの準備
```elixir
req =
  Req.new(http_errors: :raise)
  |> ReqEasyHTML.attach()
```

Elixir Advent Calendar 2024 のデータフレームへの読込
```elixir
calendar_df =
  req
  |> Req.get!(url: "https://qiita.com/advent-calendar/2024/elixir")
  |> then(& &1.body["[data-js-react-on-rails-store=AppStoreWithReactOnRails]"].nodes)
  |> Floki.text(js: true)
  |> Jason.decode!()
  |> get_in(["adventCalendars", "tableAdventCalendars"])
  |> hd()
  |> Map.fetch!("items")
  |> Enum.frequencies_by(&get_in(&1, ["user", "urlName"]))
  |> then(fn map ->
    %{
      name: Enum.map(map, fn {name, _} -> name end),
      count: Enum.map(map, fn {_, count} -> count end)
    }
  end)
  |> DataFrame.new()
```

データテーブルの表示
```elixir
calendar_df
|> DataFrame.arrange(desc: count)
|> Kino.DataTable.new()
```

![スクリーンショット 2024-11-27 0.14.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/87526f7a-d378-5630-17e7-dfb1d7a8cfd6.png)

グラフ表示
```elixir
x = Series.to_list(calendar_df["name"])
y = Series.to_list(calendar_df["count"])

VegaLite.new(width: 800, height: 400)
|> VegaLite.data_from_values(x: x, y: y)
|> VegaLite.mark(:bar)
|> VegaLite.encode_field(:x, "x", type: :nominal, sort: "-y", title: "アカウント名")
|> VegaLite.encode_field(:y, "y", type: :quantitative, title: "記事数")
```

![visualization (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/a437ea91-b873-ae29-5822-3f74ffe2c5a0.png)

---

2024 年 12 月 1 日時点の更新です

私がまだ 41 記事で独走しています

きっと、誰かが追い抜いてくれるはず

![ac2024_table.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/a6be29ac-a11e-ef2a-2ca0-a71966743918.png)

![ac2024_graph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/a761bcd2-3b84-a031-a26b-2f4278ecc00b.png)

---

2024 年 12 月 6 日時点の更新です

完走予定者が 4 名に増えました!

私は 65 記事まで来ました

100 まで行けるか!?

![qiita_ac_1206.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/eb0d221a-227f-064d-7602-897bd3088059.png)

![qiita_ac_1206.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/126b1c35-acf2-3fe5-2fe0-bf0d527d4d95.png)

---

2024 年 12 月 11 日時点の更新です

完走予定者 5 名！

私はついに 3 周完走しました

![スクリーンショット 2024-12-11 22.03.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/a7a6e02b-d009-b93f-4b6f-4dc937f059cd.png)

![ac2024.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/d1e1afe5-42e4-021e-0d18-1b0dbebf01c8.png)

---

2024 年 12 月 25 日時点の更新です

完走者 7 名

私はもう少しで 100 だけど、、、（途中で燃え尽きていた期間があるので厳しいかも）

![スクリーンショット 2024-12-25 17.59.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/441260be-2d25-862e-b4ae-211775ed864f.png)

![ac2024.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/5255ce3b-07ab-1ec3-00ff-d90c2a56eb06.png)

## まとめ

開始前から 3 名の完走予定者がいる状況

さすが Elixir ですね

この記事は今後も定期的に更新していきます