LoginSignup
11
0

More than 1 year has passed since last update.

完走賞はどのカレンダーに何人いるのかな?

Last updated at Posted at 2022-12-25

$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$

はじめに

闘魂とElixirが出会いました。
闘魂 meets Elixir.です。
Elixir meets 闘魂.でもよいです。

私は @kaizen_nagoya さんに感化されて1月1日から、AdventCalendar2022を書いてきました。

私のアドベントカレンダー一覧は、コチラです。

autoracex、闘魂ex Advent Calendar 2022 25日のまとめ記事です。

だれよりも本日の2022/12/25を楽しみにしていると自負しております。

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

完走賞

今年はQiitaさんが完走賞を創設されました。

スクリーンショット 2022-12-25 20.04.29.png

私向きの賞レースです。

私はおもいます。
人類はアップデートしたのです。
12月に1人1記事なんとか投稿するペース感から、12月には1人25記事以上投稿することが当たり前の世界へ。

Qiitaさんの「完走賞」創設には、そういうメッセージが込められていることを私は感じました。
アウトプットは善いとおっしゃられる方がいます。わたしもそうだとおもいます。すぐには効果はでませんが、続けていくことでスキルアップを実感する瞬間がきます。エンジニアと呼ばれる方々がみな全員で一ヶ月間毎日、記事を書き連ねることは、世界文化の進展を加速させることになります。
私は賞なんてなくても2020年、2021年と12月には25記事以上投稿してきました。
私のように何もなくても自分でモチベーションを保てる人がいる一方で、そうではない大半の方へ向けたQiitaさんからの応援、叱咤激励なのだと私は捉えています。

気になったこと

2022年12月19日(月) 19:56 に、Qiitaさんからメールが届きました。
【残り1週間】Qiita Advent Calendar 2022のラストを駆け抜けましょう!

このメールの中で、130名の方が挑戦をしていると書いてありました。
私が主に購読、投稿(闘魂)しているElixir Advent Calendar 2022では、2022-12-25 20:10時点で7名が候補です。

いったいどのカレンダーで何人くらいの人がノミネートしているのかということが気になりました。
気になったら調べればいいのです。

カウントはざっくりとした方法です。
以下の通りです。

  • カレンダーに参加登録がされていれば1カウント
  • 本当に投稿したのかどうかまではチェックしていません

論よりRun

四の五の言わずにプログラムを作ります。
Livebook or IExで動かすことを想定しています。

Mix.install([:req, :floki])

HTTPクライアントとHTMLを解析するライブラリをインストールします。

categories = ~w(
  https://qiita.com/advent-calendar/2022/categories/sponsor
  https://qiita.com/advent-calendar/2022/categories/qiita_official
  https://qiita.com/advent-calendar/2022/categories/programming_languages
  https://qiita.com/advent-calendar/2022/categories/libraries
  https://qiita.com/advent-calendar/2022/categories/databases
  https://qiita.com/advent-calendar/2022/categories/web_technologies
  https://qiita.com/advent-calendar/2022/categories/mobile
  https://qiita.com/advent-calendar/2022/categories/devops
  https://qiita.com/advent-calendar/2022/categories/iot
  https://qiita.com/advent-calendar/2022/categories/os
  https://qiita.com/advent-calendar/2022/categories/editors
  https://qiita.com/advent-calendar/2022/categories/academic
  https://qiita.com/advent-calendar/2022/categories/services
  https://qiita.com/advent-calendar/2022/categories/company
  https://qiita.com/advent-calendar/2022/categories/miscellaneous
  https://qiita.com/advent-calendar/2022/ranking/feedbacks/categories/to_be_decided
)

全部のアドベントカレンダーが必要ですので、とりあえずQiitaさんが区分けされているカテゴリーのURLを並べます。

defmodule ScrapingCategory do
  def run(base_url) do
    IO.puts base_url
    Stream.iterate(1, &(&1 + 1))
    |> Enum.reduce_while([], fn page, acc ->
      url = "#{base_url}?page=#{page}"
      {:ok, %{body: html}} = Req.get(url)
      {:ok, document} = Floki.parse_document(html)
      max_page = Floki.find(document, "div.style-xkoxod span") |> max_page()

      cont_or_halt = if page < max_page, do: :cont, else: :halt
      {cont_or_halt, acc ++ do_run(document)}
    end)
  end

  defp max_page([]), do: 0

  defp max_page([{"span", [], [_current, {:comment, " "}, " / ", {:comment, " "}, max_page]}]), do: String.to_integer(max_page)

  defp do_run(document) do
    texts = Floki.find(document, "p.style-1d6vmtz") |> Enum.map(&Floki.text/1)
    hrefs = Floki.find(document, "div.style-1tovpxo a") |> Enum.map(fn a -> Floki.attribute(a, "href") |> Enum.at(0) end)
    Enum.zip(texts, hrefs)
  end
end

各カテゴリは、いくつかのページに分かれていることがありますので、そのへんを考慮してカテゴリー内に属するすべてのカレンダーを取得します。
Flokiは適当に使っています。あんまり意味をわかっていません。もっとエレガントで効率のよい書き方があるかもしれません。おわかりの方はぜひ編集リクエストをください :pray::pray_tone1::pray_tone2::pray_tone3::pray_tone4::pray_tone5:

適当に書いていると言っているのは、「CSS selectors」の話です。適当に書いています。CSSと言われると途端に力が抜けます。ファイトが湧いてきません。私の弱点です。

f = fn url ->
  IO.puts url
  with %{status: 200, body: html} <- Req.get!(url),
    {:ok, parsed_doc} <- Floki.parse_document(html),
    [{_tag, _attrs, json} | _] <- Floki.find(parsed_doc, "[data-js-react-on-rails-store=AppStoreWithReactOnRails]"),
    {:ok, decoded} <- Jason.decode(json),
    [table_advent_calendars | _] <- get_in(decoded, ["adventCalendars", "tableAdventCalendars"]) do
    table_advent_calendars
    |> Map.fetch!("items")
    |> Enum.frequencies_by(&get_in(&1, ["user", "urlName"]))
    |> Enum.sort_by(fn {_user, cnt} -> cnt end, :desc)
  else 
    _ -> :error
  end
end

この関数は、各アドベントカレンダーを解析して各人の投稿(闘魂)予約数を数えています。
ちなみに無名関数にしていますが、なにかモジュールを作ってその中の関数としてもよいです。寧ろそうすべきかとおもいます。あんまり時間もないので突貫小僧星野勘太郎です。

の記事でやっていることと同じです。
@mnishiguchi さんのおかげです。ありがとうございます。

部品は揃いました。
あとは大きなループで全体をまわしてやれば完成です。

{result_list, result_total} =(
categories
|> Enum.flat_map(&ScrapingCategory.run/1)
|> Enum.map(fn {name, path} ->
  {name, path, f.("https://qiita.com#{path}")}
end)
|> Enum.reduce({[], 0}, fn {name, path, list_of_users}, {acc_list, acc_total} ->
  finish_count = list_of_users |> Enum.count(fn {_user, cnt} -> cnt >= 25 end)
  if finish_count > 0 do
    {acc_list ++ [{name, path, list_of_users, finish_count}], acc_total + finish_count}
  else
    {acc_list, acc_total}
  end
end)
)

# 以下マークダウンの表形式で出力
result_list
|> Enum.sort_by(fn {_name, _path, _list_of_users, finish_count} -> finish_count end, :desc)
|> Enum.reduce("| カレンダー | 完走賞ノミネート者数 |\n|:-|-:|\n", fn {name, path, _list_of_users, finish_count}, acc ->
  acc <> "| [#{name}](https://qiita.com#{path}) | #{finish_count} |\n"
end)
|> Kernel.<>("||#{result_total}|")
|> IO.puts

結果のテーブルには、勇者たちのメンションを付けようかともおもいましたが、Elixir Advent Calendar 2022とは違って知らない方が多いし、アドハラになるといけませんのでやめておきました。

アドハラ

アドハラとは私が作った言葉です。

アドベントカレンダーを25記事以上書くことを強要する行為(厚意?)です。
受け取り手が嫌だとおもったらハラスメントになりますので気をつけないといけません。

実行結果

2022-12-25 20:51時点です。
23:59までが期限ですのでまだ増えるとおもいます。
私調べではトータル154名です。私のように一人で複数のカレンダーに完走賞ノミネートという人もいるとおもいますが、その重複排除はしていません。レアケースだとおもいますので。
ちなみに私は、「Elixir 」と「autoracex、闘魂ex Advent Calendar 2022」の2つにノミネートしています。

みなさまの完走を応援しています!

カレンダー 完走賞ノミネート者数
Elixir 7
Qiita全国学生対抗戦 2
ひとりJavaScript 1
1人フロントエンド 1
GMC-4 / ORANGE-4 1
こぼのフロントエンドレビュー帳 1
miriwoお一人様 1
MetaTrader 1
TypeScript 一人 1
Ruby 3.2 1
タカシ 1
アウトプットカレンダー 1
新時代はAlpine.jsだ~世界中全部(Alpine.jsに)変えてしまえば~↑↑ 1
Hotwire ハンドブック 日本語訳 1
instantNeRFで遊ぶ 1
ひとりJUnit 1
ひとりマーメイド 1
MFCからSVG変換 1
Next.jsで0からブログ作成 1
PHPのORM: DoctrineORMとEloquentの比較大全をひとりでやる 1
pythonでweb開発ガチ勉アウトプット 1
Laravel,livewire2.0 Tips 1
Symfony Component 1
WinUI3 1
MySQL闇歴史 1
衛星データ解析 1
PostgreSQL 16 全部ぬこ 1
Webの基礎をおさらいカレンダー 1
【完走賞ゲットだぜ!】CSSでポケモンマスターになってやる 1
Google UX Design Certificate 1
いちばんいやらしいWebマーケティングの教科書 1
Next.js + サーバーサイドTypeScript + 関数フレーバーでクリーンなアプリを作ったので実装意図とか書く 1
Ansible lint 1
2022年自分的まとめ 1
モブプロ開発を行っているチームでやっている取り組み 1
AWS関連の自分のブログ振り返り 1
自作CPU 1
Magic Leap 2 1
Playdate 1
AUTOSAR 1
消費者理解のためのアナリティクス入門 1
Automotive Handbook 1
1人でブロックチェーン 1
離散数学の初歩 1
【ひとりカレンダー】自作ライブラリFortLearnerについて 1
論文読みます 1
AdCale(O.K.) 1
Alteryx Server 1
魅力的なツールたち 1
Databricks 1
【ひとりカレンダー】フロントエンド開発成長日記 1
クリスマスまでにPythonを使ってDiscordのBOTを作る 1
Pythonista3 1
Stripe Apps を25日間紹介し続ける 1
Tabular Editor 2 Docs 1
Watson Assistant を no code low code で遊んでみる 1
横国ゲーム制作部 1
雑・Excel入門試論 - 脱VLOOKUPの思考 1
ディップ with 全部俺 1
2022 いいねをいただいた記事ランキング(O.K.版) 1
株式会社日立製作所 クラウドエンジニアリングチーム 1
電通国際情報サービス 1
KINTOテクノロジーズ 1
KINTOテクノロジーズ グループ紹介 1
NTTドコモ R&D 1
Rakuten Rakuma 1
2022年~は誰でも(は言い過ぎかも)電子レシートが発行できりようになる 1
30代未経験エンジニアが25日後にJavaScriptをマスターするカレンダー 1
【完走賞にチャレンジ】愛知県民のよもやまアドベントカレンダ 1
Alphabet 1
あまね 1
arasan01 1
新卒エンジニアによる全部俺カレンダー 1
【完走目指す】初心者が25日で強くなる 1
【1人で完走】来年新卒エンジニアのJDによる 1
【全部俺】 Webフロントエンドエンジニアのメモ 1
IKEAのサメアイコンが一人で完走を目指す 1
ぼっち・ざ・あどかれ! 1
choco_py3(ちょこぱい) 1
ちょまど独り 1
ひとりCSS 1
DDDがわからない 1
1人で25日書く技術広報 1
エンジニアと法律 1
Diary 1
【完走チャレンジ】AtCoder Beginners Selection https://atcoder.jp/contests/abs を色々なプログラミング言語で解いてみます 1
FRICK 1
このままやったらフロントエンドエンジニアになれへんで! 1
がちもとさん 1
完走賞をとって Qiitan を自分にクリスマスプレゼントする 1
ハッカソン 1
職業訓練校でプログラミングを学ぶ 1
元情シスが懐かしのトラブルやマイナーな問題を振り返る 1
。・::・゚★ クリスマスに向けて『 IT × 美 』を考える ・::・゚★ 1
AWS AppSyncでAPIを作ってみた 1
Itaya 1
itohal 1
受託アジャイル 1
kaino25 1
24日後に立派なSalesforceエンジニアになるWEBエンジニア 1
Kenmaro 1
ことみん 1
kuvo 1
分析屋が異世界転生してエンジニアになった 1
マネジメントについて一人で考える 1
満足袋の1人アドベントカレンダー 1
【完走チャレンジ】2022年お勉強ノート 1
matsurih 1
ちょうぜつ 1
Metabase Tips 1
多言語FizzBuzz 1
【完走賞】MxShun ひとりマラソン 🏃 1
【目指せ完走賞】なりかくんのDiscord 1
nikkieのPyCon積み動画解消 1
Oho 1
1人コンプ 1
俺のカレンダー2022 1
1
paiza.ioでelixir 1
panda(Kotlin, Test, BlockChain) 1
今年私が知らなかったこと 1
pitaoのフリージャンル学習 1
完走賞用 1
りいた 1
ロビンthon・Numpy・画像処理・クルーソー 1
[ひとりカレンダー] りーほーのメモ帳 1
salt 1
開発 1
Shohei 1
ta1m1kamが一人で書く 1
ほぼSalesforce !! Qiitan と カレンダーと 3年目のWebエンジニア 1
takumma のやれるところまでやってみる1人 1
たったひとりの個人開発 1
ten986 1
tenntenn 1
インターンを通して僕が得たものを書いてQiitanのぬいぐるみをもらおう!! 1
ukwhatn 1
Vimmerを増やしたい 1
🦀ひとりWASM-4とRustでゲームをつくる⚙ 1
WordPress Output 1
完走賞を目指す @xrxoxcxox 1
horikawa hitori 1
完走賞ゲットのため小ネタを毎日投稿しようとチャレンジする 1
yuriacats 1
データアナリストと育児【完走賞ほしい!】 1
zumi0が頑張る 1
autoracex、闘魂ex Advent Calendar 2022 1
154

おわりに

Elixir Advent Calendar 2022はシリーズ数も多かったですが、完走賞のノミネート者数も多いことがわかりました。

アドハラしているのかも? と内心ビクビクしていましたが、Elixir Advent Calendar 2022カレンダーが他のカレンダーよりも多くの完走賞達成者を輩出しそうでうれしくもあります。

@RyoWakabayashi さんがLivebookでいい感じ(寛至)の記事にしてくれるとおもいます!

また明日からはアドベントカレンダー2023がはじまります!
がんばっていきましょう!
元氣があればなんでもできる!!!

$\huge{元氣があればなんでもできる!}$



$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$
$\huge{1、2、3 ぁっダー!}$

11
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
0