2024年度前期の振り返り


2024年度前期 (4月~9月) の振り返りです。

去年の前期の振り返りは → こちら
去年の後期の振り返りは → こちら

作ったもの


このサイト



このサイト abap34.com がリニューアルされました。
個人的には記事検索画面 https://www.abap34.com/search は結構気に入ってます。
検索画面

almo



ついにリリースが v0.9.5-alpha まできてしまいました。

すいません、いつ v1 になるんでしょうか。

それはともかくいくつか重要な進展があり、

などが行われました。 (44個の PR が mainにマージされました。)

とくにパーサの書き直しは noya2 が、 脚注の追加は potato167 さんが Contribution してくれました。大感謝。

Python 向けバインディングは自分が作業していて、 Python側から AST を操作したり、 Jupyter Notebook から変換したり、 jinja2 を使った拡張性の高いテンプレートの作成などができるようになりました。
(今はその過程で見つかったパフォーマンス上の問題に対応するために、そもそものベンチマークの仕組みの整備などをしています。)
こういう感じのコードが動きます。 (中身は全部 C++ です!)
import almo

divblock = almo.DivBlock("code")

rawtext = almo.RawText("import matplotlib.pyplot as plt")

divblock.add_child(rawtext)

print(divblock.to_html())
# => <div class="code">import matplotlib.pyplot as plt</div>

md = """
# Head1

**~~Strong, But Strikethrough~~**, $x^2$
"""

ast = almo.parse(md)

def pretty_print(ast, indent=0, last=False):
    print("  " * indent + f"{'└──' if last else '├──'} {ast}")
    for i, child in enumerate(ast.childs):
        pretty_print(child, indent + 1, i == len(ast.childs) - 1)

def count_node(ast):
    count = 1
    for child in ast.childs:
        count += count_node(child)
    return count

print(ast)
# => <almo.Markdown (uuid: 2)>

print(count_node(ast))
# => 12

pretty_print(ast)
# ├── <almo.Markdown (uuid: 2)>
# │   ├── <almo.NewLine (uuid: 3)>
# │   ├── <almo.Header (uuid: 4)>
# │   │   └── <almo.RawText (uuid: 5)>
# │   ├── <almo.NewLine (uuid: 6)>
# │   ├── <almo.InlineStrong (uuid: 7)>
# │   │   ├── <almo.InlineOverline (uuid: 8)>
# │   │   │   └── <almo.RawText (uuid: 9)>
# │   ├── <alm.oRawText (uuid: 10)>
# │   ├── <almo.RawText (uuid: 11)>
# │   └── <almo.NewLine (uuid: 12)>


almo に関連する記事もいくつか書きました:


これ書いてて思ったんですが、やっぱり早急にリンクカード欲しいですね。

DacQ (-v2)


データ分析コンペのプラットフォームです。




軽率にやりたい放題コンペをやるために作りました。
記事: mini Kaggle を streamlit で作った
チーム戦を含めたコンペの機能、 Discussion 機能などがあります。


実際にこれを使ってコンペをしましたが、なんとか致命的な不具合なく終わってくれてよかったです。

順位表


ml-lecture-judge



オンラインジャッジです。




  最初、既存の適当な OSS を動かそうと思っていたのですが、 PyTorch などを導入してのデプロイの手順が一生分からず、しょうがないので自分で作りました。


問題は自分でも作成しつつ、後輩・同級生にも手伝ってもらえて楽ができました。大感謝。

他にも、複数出力時のジャッジを konkoma が実装してくれるなどしました。大感謝。

ml-lecture


以前から学部一年生向けに機械学習の入門資料を公開したいと思っていたのですが、ちゃんと書いて公開しました。



なるべく誤魔化したくない + なるべく完全に理解してほしい の落とし所としてワントピックを掘り下げる感じで頑張って書きました。

力作です。 あまり類似した資料はないと思います。 個人的にはこれにはとても満足しています。  

コンペ開催


上に付随して講習会とコンペを一つやりました: https://trap.jp/post/2289/
大抵のことはこの記事に書いてありますが、

と、今までやったコンペの中では一番大規模でした。



盛り上がってよかった。



書いたもの


ブログなどを全て入れると多すぎてブロガーの振り返り記事になってしまうので、特に時間をかけたものだけ載せます。

並列化時代の乱数生成


擬似乱数生成は、数値計算・機械学習において欠かせない存在です。 また、現代においてはこれらの計算を並列化によって高速化することもまた重要です。

一方で、単純な並列化は擬似乱数生成の再現性を損なうことがあります。

この資料は、まず擬似乱数・並列処理の基礎からはじめ、最終的には並列実行時に再現性を保つための手法について解説しています。

具体例として、 Julia のマルチプロセス・マルチスレッドにおける擬似乱数生成器の状態管理の手法と実装を紹介しています。
(コピペ)



Julia Compiler Internals


mrkn さんと antimon2 さんと一緒に毎週木曜日の夜に Juliaの処理系の実装を読む会をしていて、そこで知った内容をまとめるシリーズを始めました。 大体週に 1, 2本のペースで書いていて、今後も続けていくつもりです。
JuliaLangJa の Discord で毎週開催しているので、興味がある方はぜひ 🤗
https://www.abap34.com/search?tag=JuliaCompilerInternals

その他・大学など



ふりかえりと抱負


なんとなく記事を見てみると Web っぽいものが多いです。 Web 系の知識は何も知らずに今までやってきましたが、 それこそ ChatGPT などのおかげでかなり学びやすくなって、低いクオリティのものならサッと作れるようになっていい話です。 (streamlit にもありがとう)

とはいえ、自分にとって人と差別化できる要素だとは思っていないので、 後期はもっと機械学習・低レイヤ、、、 「発展させるために自分の人生を使っても良さそう」 と思っていることの勉強に時間を使っていきたいです。

また、それなりに (とくに、大学の) コミュニティに色々と返せたような気もするので、なるべく自分のために頑張りたいです。


なんとなく以前より 「これ (計算機) で食べていくぞ」 という実感 (自覚?) が強くなってきました。
正直に言うと、半年あったらもうちょっとできただろという気持ちがあり、自分の目指しているエンジニア像になれるか不安しかない ので、後期は一層頑張ります。

今日の一曲