Rustでチケット料金モデリングしてみる
Rustの勉強がてら以前話題になったチケット料金モデリングを実装してみました。
このチケット料金表を実装したのですが、すでにScalaで作られているこちらを参考にScalaからRustで作り変えていき、実装の違いのポイントを確認しながら進めてみました。
Rustで実装したものはこちらになります。
- Specificationトレイト
- Specificationトレイトの実装対象について
- 映画の日の判断
- 平日、土日 + レイトショーかどうかの判断
- 顧客を判断できるようにする
- 映画の判断条件を表現できるようにする
- 映画の判断条件とプラン名、料金を構造体で持てるようにする
- プラン一覧情報の表現
- 顧客、開始時刻からプランを判断できるようにする
Rustでの関数型プログラミング
Rustでの関数型プログラミングについて調べていたのですが、以下のスライドでは高カインド型がないのが問題とされているようなので実装して確認してみました。
https://speakerdeck.com/helloyuk13/rust-demomonadohashi-zhuang-dekirufalseka
Scalaでの高カインド型
高カインド型とは型コンストラクタを型パラメータに取る型らしいのですが、具体例がないとよくわからないと思います。Scalaで以下のサンプルの実装を準備したのですが、Monoid[A]
を型パラメータとして受け取る Foldable[F[_]]
が高カインド型らしいです。
QuickFIX/Jソースコードリーディング
QuickFIX/Jソースコードリーディング
QuickFIX/Jとは
QuickFIX/JはFIXエンジンの実装になります。FIXエンジン自体が聞きなれないと思いますが、FIXエンジンは電子取引で使われるプロトコルであるFIXプロトコルの実装になります。FIXエンジンについては以下のリンクが参考になります。
https://javarevisited.blogspot.com/2012/01/what-is-fix-engine-in-fix-protocol.html
QuickFIX/Jの公式ページによると、もともとC++で実装されたQuickFIXをJavaで実装しなおしたもののようです。
続きを読む2019年の振り返りと2020年の目標
やってきたことを忘れないためにも2019年を振り返ってみて、2020年の目標を立てたいと思います。
やってきたことですが、個人的な取り組みとしていろいろな言語でパーサーの実装をしてきました。最初に実装をしたJavaでの方針をもとにほかの言語でも作ってみたのですが、特にジェネリクスが使えないgoではJavaの実装をそのまま持っていくことが出来なかったので苦労した覚えがあります。
それから、ScalaについてはJsonをパースした後に任意の型に変換する部分がまだ作っている最中なので、こちらも時間があるときに進めていきたいです。
GitHub - teruuuuuu/parsers
scalaでjsonをパース後のASTを扱いやすいように型変換する方法について調べてみた - teruuuのブログ
あと勉強を続けていたドメイン駆動設計と関数型言語で用いられるモナドについても抵抗が前よりもない気がしています。
ecサイトをモデリングしてscalaで実装してみる - teruuuのブログ
Scalaで作って理解するモナド - teruuuのブログ
関数型言語による簡潔な表現はドメイン駆動設計と相性がよさそうだと思いますし、"Functional and Reactive Domain Modeling "という本も出ているようなので2020年はドメイン駆動設計の中で関数型言語をうまく使う方法についても勉強していきたいところであります。
Manning | Functional and Reactive Domain Modeling
また、知識の幅を広げるためにPythonでの株取引シミュレーションやISUCOnの過去問を解いたり、verilogでCPUのシミュレーションをしたりと興味があったものは学ぶようにしていました。
株とPythonの本を読んで株取引のシミュレーションを実装してみた - teruuuのブログ
ISUCON9 Finalのベンチマークを動かして遊んでみた - teruuuのブログ
CPUの創り方をもとにverilog-hdlでシミュレーションをしてみた - teruuuのブログ
RSA暗号の仕組みを追ってみた - teruuuのブログ
2020年の目標について、自分自身の得意分野というものが特になく一つのことを集中して続けるということがあまりなかったので、自分の得意分野を持てるようになりたいと思います。 具体的には、パーサーの実装にも慣れてきた気がするのでそろそろ自作言語についても学んでいきたいです。それから去年は転職をした年でもあるので、業務にいかせる何かについても取り組んでいく予定です。
JNIを使ってJavaからCとRustを呼び出してみた
JNIとは
JNIとはJavaからネイティブコードを呼び出すための機能です。例えばC言語であればgccでコンパイルするときにsharedのオプションを有効にすることで共有ライブラリが作れるので、Java側ではSystem.loadLibraryやSystem.loadで共有ライブラリを読み込むと呼び出せるようになれます。
計算量の多い部分をネイティブコードに置き換えることで高速化を狙えるらしいのですが、メモリ管理や排他制御などに気を付けないと不具合や低速化を招くので使うポイントはちゃんと考える必要があるようです。
今回はC言語とRustをコンパイルして共有ライブラリを出力してJavaから呼び出して、実行時間の比較を行いたいと思います。
続きを読むISUCON9 Finalのベンチマークを動かして遊んでみた
ISUCONとは
ISUCONとはWebアプリケーションの高速化を競うコンテストです。2011年から毎回開催されていまして、現在(2019年時点)で9回コンテストが開催されています。詳しい説明は公式ページがあるので、そちらを見ればよいかと思います。コンテストで動かすソースはgithubで公開されています。 https://github.com/isucon コンテストで扱う言語はgo, ruby, python, php, perlと良くWeb系で扱われる言語は含まれているようです。
ISUCON9 Finalの環境構築
ISUCON9の本選で扱われたソースは以下になります。 https://github.com/isucon/isucon9-final
環境はdockerで構築するようですが、ビルドにMakefileを使っており、また以下のベンチマークビルド用のMakefileを見るとMac, Linux向けでビルドを実行しているのが確認できます。 https://github.com/isucon/isucon9-final/blob/master/bench/Makefile
自分はWindowsの環境で確認しようと思ったのですが、そのままではうまく動かなそうだったのでHyper-v上のubuntuで環境を構築することにしました。
続きを読む