自作ライブラリの紹介

最近(といっても半年スパンぐらいですが)私が実装したライブラリをまとめつつ簡単に紹介しておきます。

shinnya/binpack

バイナリと Scala の型を相互変換するためのライブラリで、ほぼ Haskell の Data.Binary の Scala への port です。

モチベーションとして、ByteBuffer が慣れないと使いづらすぎるので、ByteBuffer を使わなくて済むようにしようというのがあります。

shinnya/cxx-skiplist

C++ での skip list の実装です。Skip lists: a probabilistic alternative to balanced trees を実直に実装してあります。

実装してベンチマークを取って分かりましたけども、ナイーブに skip list を実装すると std::unordered_map つまり平衡木にまったく性能で勝てませんでした。 c++ - Skip lists, are they really performing as good as Pugh paper claim? - Stack Overflow で同じ話がされてまして、頑張れば平衡木を使うのと同じぐらいの性能は出せるようです。 しかし、もともと skip list は平衡木と比較してバランス処理が不要で実装が容易というのがメリットの1つであるのに、相当最適化しないといけないとなると素直に平衡木を使っておけばいいんじゃないかという結論に至りました。

shinnya/mpsc-scala

Multi Producer Single Consumer Queue の Scala 実装です。Non-intrusive MPSC node-based queue - 1024cores をベースに、Scala で動くようにしてあります。 API は Rust のそれに合わせました。

メッセージパッシングベースな DB 実装や後ほど紹介する Actor を実装するのに使っています。

shinnya/libutf8

C で書いた UTF8 な文字列を扱うためのライブラリで、そういえば UTF8 を実装したことないなと思って実装してみたものです。 メモリアロケーションをせずに使えるため他のコードと組み合わせやすいと思います。 基本的な API は網羅していると思いますが、まだ足りていないので気が向いたら足していきたいです。

shinnya/libnetstring

DJB 先生の提唱している Netstrings という仕様を実装したライブラリです。存在を知った時に簡単に実装できそうに感じたのでやってみたというところです。

このライブラリは問題があって、文字列のネストが1段階しかできません。内部データ構造にリストを使ってしまっているためそうなっているわけですが、なぜ木構造にしなかったのか今から思うとよく分かりません。

shinnya/molder

JDBC のラッパーで、Scala にあまり良い DB ライブラリがないのと就職活動のために作ったライブラリになります。 全体的には Spring JDBC っぽい感じになってます。あとは DBIO というモナドを提供していて、monadic にコードが書けるのも特徴ではあります。

shinnya/scala-aries

DB 界隈ではメジャーな ARIES というアルゴリズムをフレームワークとして提供するライブラリです。 いくつかの API を利用者側で実装すれば ARIES のコアアルゴリズムはフレームワーク側で勝手に実装してくれます。 一応 ARIES のアルゴリズムは完全に実装していますが production ready なクオリティに達していないので、RDB を実装しつつ品質を上げていきたいと思ったままそのままになっています。

shinnya/scala-async

FutureEither を持たせつつ Right Biased な挙動をしてくれると嬉しいので、それを実装したライブラリです。 標準の Future の代わりとして使えて、エラー型が明示的に持てるのが嬉しい点です。 scalaz の EitherT を使えば同じことができますが、

など scalaz に様々な問題を感じるところもあるため独自のモナドとして提供しているという感じですね。

shinnya/scala-actor

Actor Model の実装で、akka には遠く及ばない機能しかありません。 akka はメッセージパッシングで型が失われますが、このライブラリは型付きなメッセージ送信ができるので限定的な用途では便利です。 上述したように MPSC Queue の応用の1つになります。

shinnya/scala-genserver

scala-actor を内部的に使いつつ、Erlang の gen_server を Scala 風のテイストとして提供するライブラリです。 Erlang とは違って、静的に型付けができます。

shinnya/scala-tracer

Scala で例外を使わずにエラー型を持ち回るようなコードを書こうとすると、スタックトレースが保持できなくてデバッグが難しくなるという問題があります。 それを解決するのがこのライブラリです。 ソースコード内の位置情報を取得するマクロ、Trace 型クラス(を任意の型に実装すること)で、スタックトレースを自前で管理できるようにします。

同じアプローチを元同僚が sile/trackable: Rust library provides a way to track objects manually as an alternative to mechanisms like backtracing として実装しています。 scala-tracertrackable のクローンではなく、もう一人別の人が作っていたライブラリに inspired されています。

shinnya/sio

Scala で Rust 風の IO を使えるようにするライブラリです。 バイナリフォーマットのファイル読み書きを何度も実装した結果、Rust の API がまぁ使いやすいなと思ったので Scala で使えるようにしたという経緯もあります。

shinnya/jrdb

RDB を実装するためのユーティリティ集。PostgreSQL スタイルの追記オンリーな Page を提供してます。

ということで他にもありますが以上です。

Comments

comments powered by Disqus