Gradle SSH Plugin 2.1.1をリリースした
Gradle SSH Plugin/Groovy SSH 2.11をリリースしました。
2.1.1の変更点
SCP GET/PUTの性能を改善しました。
2.1.0でSCPサポートを追加しましたが、非効率な実装が残っていたため、2.1.1で性能を改善しました。
Test Item | scp vs sftp (2.1.0) | scp vs sftp (2.1.1) |
---|---|---|
get a large file | 419% | 132% |
get many files | 75% | 74% |
put a large file | 144% | 114% |
put many files | 1025% | 143% |
2.1.0ではSCPはSFTPに比べて4〜10倍も遅い結果になっていましたが、2.1.1では若干遅いレベルまで改善しています。
改善点は以下です。
- Stream Interactionのバッファサイズを1kBから1MBに変更しました。大容量のファイルを扱う際の処理効率が改善しました。
- 1つのSCPコマンドで複数のファイルやディレクトリをまとめて作成するように変更しました。もともとは、ファイルやディレクトリごとにSCPコマンドを実行していたため、通信遅延やコマンド実行のコストがかかっていました。
おまけ
Groovy 2.xでコンパイルしたコードをGroovy 1.xで実行すると様々な問題が起こるのですが、また新たに1つ見つけてしまいました。Groovy 2.xの @groovyx.transform.Immutable
で生成されるコンストラクタはGroovy 1.xで動作しないようです。
Caused by: java.lang.IncompatibleClassChangeError: the number of constructors during runtime and compile time for org.hidetake.groovy.ssh.extension.helper.ScpPutHelper$EnterDirectory do not match. Expected -1 but got 3
代わりに、フィールドをすべてfinalにして自分でコンストラクタを書けばOKです。
Gradle 1.xサポートを早く外したいなぁ。
Gradle SSH Plugin 2.1.0をリリースした
Gradle SSH Plugin 2.1.0、Groovy SSH 2.1.0をリリースしました。
2.1.0の変更点
SCPによるファイル転送をサポートしました。SFTPはJSchに組み込まれている機能を利用しているので簡単に実装できましたが、SCPはコマンドの標準入出力とのやり取りを実装する必要があります。そこで、過去のコードを捨てて、一から新しくStream Interactionの仕組みを実装しました。
具体的には、JSchのOutputStreamで受信バイトを受け取る方式から、InputStream#read()で受信バイトを取りに行く方式に変えました。これにより、受信スレッドの開始や受信バイトの受け取りのタイミングを自分でコントロールできるようになったので、ずいぶんとコードが書きやすくなりました。
まだ非効率な実装が残っているので、今後パフォーマンスを改善する予定です。
SCPコマンドの仕様については下記の記事がとても役に立ちました。
AndroidでBLEデバイスから通知を受け取る
AndroidでBLE(Bluetooth Low Energy)デバイスから通知を受け取る方法でハマったのでメモしておきます。
セントラルがペリフェラルから通知を受け取るには setCharacteristicNotification()
でセントラル側の通知受信を有効にするだけでなく、 writeDescriptor()
でペリフェラル側の通知送信を有効にする必要があります。
enum class BLE_UUID(uuidString: String) { BUTTON_SERVICE("0000ffe0-0000-1000-8000-00805f9b34fb"), BUTTON_STATE("0000ffe1-0000-1000-8000-00805f9b34fb"), CLIENT_CHARACTERISTIC_CONFIG("00002902-0000-1000-8000-00805f9b34fb"), ; val uuid = UUID.fromString(uuidString) } // セントラル側の通知受信を有効にする val characteristic = bluetoothGatt.getService(BUTTON_SERVICE.uuid).getCharacteristic(BUTTON_STATE.uuid) bluetoothGatt.setCharacteristicNotification(characteristic, true) // ペリフェラル側の通知送信を有効にする val descriptor = characteristic.getDescriptor(CLIENT_CHARACTERISTIC_CONFIG.uuid) descriptor.value = BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE bluetoothGatt.writeDescriptor(descriptor) // BluetoothGattCallback#onCharacteristicWrite()でBluetoothGatt.GATT_SUCCESSを受け取ったら成功です
上記のコードで指定しているUUIDはiTAGというBLEタグのものです。980円で買える安物ですが、アプリを自作して遊ぶにはもってこいですね。
白 ワイヤレス キーファインダー Bluetooth4.0 紛失防止 ワイヤレスリモート 盗難防止 キーホルダー 置き忘れ防止 落し物 KeyFinder◇ITAGシロ
- 出版社/メーカー: BlueOcean
- メディア:
- この商品を含むブログを見る