RustでCrossbeamのグリーンスレッドを試してみる

Rustでは所有権やライフタイムがあるおかげで安全な実装をすることが出来ますが、Rustを始めたばかりの人は同じインスタンスに対し複数スレッドで一つのスレッドで監視をして、もう一つのスレッドで操作するといったことを行いたくなった場合大分てこずると思います。自分も色々調べて大分てこずっているので、分かったことをまとめてみたいと思います。

Rustで扱えるスレッドについてはOSスレッドとグリーンスレッドがあり、RustBookの以下のドキュメントに説明があります。
https://doc.rust-jp.rs/book/second-edition/ch16-01-threads.html

OSスレッドはOSのAPI呼び出しによって得られるスレッドになっていまして、グリーンスレッドは仮想マシン上で管理されているスレッドになります。OSスレッドの方が性能が良いのですがRustの所有権のライフタイムによりてこずっていました。

続きを読む

QuickFIX/Jのサンプルに対してRustでリクエストを投げてみる

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で実装しなおしたもののようです。

QuickFIX/Jの実装は以下で確認できます。
github.com

続きを読む

BNFパーサが生成したパーサでパースした後に整形表示してみた

前回BNFパーサーが生成したパーサーでログをパースできるようになりましたので steavevaivai.hatenablog.com

今回はパースした後に整形表示できるようにしてみます。 修正のコミットはこちらになります。
bnfパーサー 整形表示実装 · teruuuuuu/logging_converter@ab5b156 · GitHub

続きを読む

柔軟にログをパースできるようBNFパーサーを実装してみる

前回ログファイルをjsonに変換した後Embulk経由でElasticsearchに取り込むのを試したのですが、ログの出力内容毎に対してパーサーを定義していなかったので、不要なものまで取り込まれていました。 steavevaivai.hatenablog.com

今回は必要なものだけを取り込めるように、またScalaを知らなくてもパーサーを定義できるように外部で宣言できるようにしたいと思います。

調べてみたところパーサジェネレータを使えば受け取った構文規則をもとにパーサーを出力するということでYaccが有名なようで、パーサジェネレータを使えばちょうどやりたいことが出来そうです。

続きを読む

自作のパーサーでログファイルをパースしてEmbulk経由でElasticsearchに取り込んでみる

例えば以下のようなAAA ~ CCCに対してaddやremove、setの操作を行う時系列のログデータをもとに、現在の値がどうなっているのかを手動で見ていくのは大変かと思います。

2020-05-24 11:25:18,784 INFO jp.co.teruuu.LoggingService [main] add BAA:99.674
2020-05-24 11:25:18,784 INFO jp.co.teruuu.LoggingService [main] set BBB:5.730
2020-05-24 11:25:18,785 INFO jp.co.teruuu.LoggingService [main] hello hello CCC
2020-05-24 11:25:18,785 INFO jp.co.teruuu.LoggingService [main] move from ABCtoCAC : 68.080
2020-05-24 11:25:18,785 INFO jp.co.teruuu.LoggingService [main] add ACC:20.390
2020-05-24 11:25:18,786 INFO jp.co.teruuu.LoggingService [main] hello hello ABA!
2020-05-24 11:25:18,786 INFO jp.co.teruuu.LoggingService [main] add AAA:54.581
2020-05-24 11:25:18,786 INFO jp.co.teruuu.LoggingService [main] globalRemove 46.694
2020-05-24 11:25:18,786 INFO jp.co.teruuu.LoggingService [main] hello world AAC
2020-05-24 11:25:18,786 INFO jp.co.teruuu.LoggingService [main] hello hello BCB!
2020-05-24 11:25:18,786 INFO jp.co.teruuu.LoggingService [main] hello hello ABB!
2020-05-24 11:25:18,787 INFO jp.co.teruuu.LoggingService [main] set AAC:59.363
2020-05-24 11:25:18,787 INFO jp.co.teruuu.LoggingService [main] globalAdd 63.874
2020-05-24 11:25:18,787 INFO jp.co.teruuu.LoggingService [main] set CCC:85.101
2020-05-24 11:25:18,787 INFO jp.co.teruuu.LoggingService [main] hello hello ABC!
2020-05-24 11:25:18,787 INFO jp.co.teruuu.LoggingService [main] hello hello CBC!
2020-05-24 11:25:18,787 INFO jp.co.teruuu.LoggingService [main] hello world ACC!
2020-05-24 11:25:18,788 INFO jp.co.teruuu.LoggingService [main] globalAdd 55.108
2020-05-24 11:25:18,788 INFO jp.co.teruuu.LoggingService [main] move from BBBtoBAC : 46.040
2020-05-24 11:25:18,788 INFO jp.co.teruuu.LoggingService [main] move from CAAtoCCC : 90.571
2020-05-24 11:25:18,788 INFO jp.co.teruuu.LoggingService [main] add BCA:36.741

これを解決するためにログファイルをパースしてElasticsearchに取り込んでみるのを試してみたいと思います。 ちなみにですが今回の検証に使うログは自前で生成したものを使っています。 string_generator/LoggingService.java at master · teruuuuuu/string_generator · GitHub

続きを読む

Rustでlazy_staticを使ってグローバルでイミュータブルな定数を初期化してみる

以前Rustでチケットモデリングの実装をしたとき、グローバルでイミュータブルな定数を実装できず毎回初期化していたのですが、lazy_staticを使えば解決できるとのことだったので試してみました。 steavevaivai.hatenablog.com

詳しくは以下のQiitaの記事が詳しかったので、それを参考にlazy_staticのクレートを追加して修正を行いました。 qiita.com

具体的な修正部分は以下になるのですが、 github.com

続きを読む

チーム開発でInteliJとEclipseを使う場合の注意点調査(work in progress)

InteliJやEclipseではデフォルトの設定だとフォーマットをかけたときに微妙に差があり、gitで細かい差分がでることがあるのが気になっていますのでこのあたりの動きを調べてみたいと思います。

  • import
    • Organize Imports
    • *によるimport省略
続きを読む