Scalaでsshjを使ってsftpでファイルを読み込んでみる

ファイル監視のプログラム実装でリモートのファイル読み込みを行う必要がありまして、リモート側にagentを入れるのであれば実装が簡単そうだったのですが運用が面倒になると思ったのでsftpにてファイルを監視できるようにしてみました。

といってもsshjを利用するだけなのですが、ググっても参考の情報が少なそうだったのでメモ代わりに残しておきます。

実装はscalaで行いまして、build.sbtには以下を追加しておきます。

libraryDependencies += "com.hierynomus" % "sshj" % "0.30.0"
続きを読む

RustでTcpStreamを書き込みと読み込みに利用する

以前RustでTcpStreamを複数スレッドで共有し、それぞれ読み込み、書き込み用に利用するためにArc<Mutex>を使っていたのですが、改めて調べてみますとTcpStreamにはtry_clone()というメソッドがもともと用意されているようでした。 steavevaivai.hatenablog.com www.reddit.com

自前でArc<Mutex>でストリームをスレッド間で共有する場合ロックの制御が難しいと思われるのでtry_clone()を使ったほうが良さそうです。

続きを読む

QuickFIX/Jのカスタムフィールドについて考えてみる

QuickFIX/Jのメッセージでのカスタムフィールドについて考えてみました。動作検証はQuickFIX/Jのソースのサンプルに含まれるbanzaiとexecutorを動かしています。
https://github.com/quickfix-j/quickfixj/tree/master/quickfixj-examples

まず、banzai側でNewOrderSingleのメッセージを作成して送信する部分を修正し、9000のフィールドを追加します。
https://github.com/quickfix-j/quickfixj/blob/QFJ_RELEASE_2_2_0/quickfixj-examples/banzai/src/main/java/quickfix/examples/banzai/BanzaiApplication.java#L372

    public void send50(Order order) {
        quickfix.fix50.NewOrderSingle newOrderSingle = new quickfix.fix50.NewOrderSingle(
                new ClOrdID(order.getID()), sideToFIXSide(order.getSide()),
                new TransactTime(), typeToFIXType(order.getType()));
        newOrderSingle.set(new OrderQty(order.getQuantity()));
        newOrderSingle.set(new Symbol(order.getSymbol()));
        newOrderSingle.set(new HandlInst('1'));
        newOrderSingle.setString(9000, "CustomField");
        send(populateOrder(order, newOrderSingle), order.getSessionID());
    }
続きを読む

Arc<Mutex<T>>でスレッド間でデータを共有する場合のDropの必要性について

前回はArc<Mutex>でスレッド間でデータを共有する動作を確認しました。
steavevaivai.hatenablog.com

その延長で今回はTcpStreamを複数スレッドで共有し片方のスレッドは読み込み続けて、もう片方のスレッドで書き込み続ける場合の動作を確認したのですが、際に自前でMutexGuardをDropしたほうが良さそうでした。

最初に確認した実装は以下のようになります。

続きを読む

Arc<Mutex<T>>でスレッド間でデータを共有してみる

スレッド間でデータを共有するときOSスレッドを直接操作するのは大変な気がしたのでグリーンスレッドがcrossbeamを試してみたのですが、改めて公式のドキュメントを見てみるとちゃんと説明がありました。

doc.rust-jp.rs

ArcとMutexの組み合わせによりスレッド間でデータを安全に共有することが出来るようです。 まずArcについてですが、ArcにはRcがありどちらも参照カウントを使ったスマートポインタであり、データや状態を共有できるとあり、つまり複数の所有者を持てることを意味し、ArcとRcの違いとしてはArcにはスレッド安全性があるようです。またRustには原則として共有しているものには書き込みができないのですが、Mutexは複数のスレッド間でデータを共有するためのスマートポインタになっていましてMutexをArcで包むことにより複数スレッド間でデータを共有して編集、参照できるようです。

試しに昨日書いた複数スレッドでチャンネルを共有し、2つのスレッドでsendし1つのスレッドでreceiveしてカウンタを操作するプログラムを Arc<Mutex<T>> を使って書いてみました。

続きを読む