2022年02月12日

Rust + Eclipse IDE + GDB

今回はWindows環境でEclipse IDEを使用したRust開発環境の構築方法について紹介します。一般的にはVSCodeを使う流れですが、時代錯誤感はありますが、組込系でも慣れたEclipse IDEで構築しました。

Rust版Eclipse IDEは発展途上or見放された?ようでEclipseの2020-12が最新で以降はRust版が提供されていないようです。そのため、MacやLinux環境では比較的うまく動くようですが、Windows環境ではなかなかすんなり動かないようです。既知の問題点として対処方法含めて紹介されていますが、それだけでは分かりずらい点もあったため、環境構築方法を改めて紹介します。


@Rustインストール
既にRust環境が入っている場合は飛ばしてください。コマンドライン等からcargo --versionと打ってバージョン情報の正しい応答があればインストール済&パスOKです。必要に応じて公式サイトからインストールしてください。

AEclipseインストール
残念ながら2020-12が最新で以降はRust版が提供されていないようです。こちらのページの中央右にあるWindows x86_64をクリックしてダウンロードします。なお、右端のボタンは最新版統合インストトーラのため、Rust版ではありませんので間違えないように注意。直リンクはこちらです。Eclipseはzipを解凍するのみでインストール不要です。適当な場所に解凍したフォルダを置きます。

BGDBインストール
コマンドライン等からgdb --versionと打ってバージョン情報の正しい応答があればGDBインストール済です。「gdbは、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。」と表示される場合はインストールされていないorパスが通っていません。既にCygwin等がインストールされている場合、GDBが入っていればパスを通します。何もインストールされていない場合は最低限としてGDBだけの TDM-GCC Compilerをこちらからダウンロード、インストールします。インストールはzipを解凍し、Cドライブ直下かユーザーディレクトリ直下等にフォルダを配置し、gdb.exeがあるフォルダに対して環境変数のPATHにパスを追加します。

例: C:\Users\(ユーザ名)\gdb\bin

環境変数にパスを追加した後、再度開き直したコマンドライン等からgdb --versionと打ってバージョン情報の正しい応答があればOKです。

Cツールチェーンインストール
コマンドラインから下記の2つのコマンドを順番に打ち込んでツールチェーンをインストールします。

rustup toolchain install stable-x86_64-pc-windows-gnu
rustup default stable-x86_64-pc-windows-gnu


Dコマンドファイル追加
Windows環境ではrust-gdb.exeがそのままでは使用できないため、下記のフォルダにrust-gdb.cmdというファイルを生成し、こちらのサイトに記載されたスクリプトをメモ帳等で書き込みます。念のため、既にスクリプト書き込み済みのrust-gdb.cmdのファイルを圧縮してアップロード(rust-gdb.zip)してあります。

C:\Users\(ユーザ名)\.cargo\bin

Eプロジェクト追加
Eclipse IDEのZipファイルを解凍したフォルダ内のeclipse.exeをクリックし、起動させます。プロジェクトのワークスペースは適当なディレクトリを指定します。File→New→ProjectからRust→Cargo Projectをクリックし、プロジェクト名を入力し、Finishボタンでプロジェクトを作成します。その他の設定はデフォルトでOKです。

rust2.jpg

Fデバッグ設定変更
このままではGDBデバッグ機能が利用できないため、デバッグ設定を変更します。Run→Debug ConfigurationからDebuggerタブをクリックし、GDB debuggerにrust-gdbの代わりに先ほど作成、格納したC:\Users\(ユーザ名)\.cargo\bin\rust-gdb.cmdを指定します。また、Environmentタブをクリックし、Addをクリックして適当な名前と値を入れます。面倒な場合は下記のようにHOGE、hogeと入れます。デフォルトの空白だとエラーになるため、その対処のため、何かしらの文字列を指定します。特に意味はないため、空白以外の文字列であれば構いません。

rust3.jpg

rust4.jpg


Gデバッグ
これで設定完了です。Run→Debugから今まで通りにデバッグできます。

rust5.jpg

Rustでもこれまでと同じようにGDBでデバッグできるようになりました。時代錯誤感はありますが、プラグインやアドオンで重くなりがちなVSCodeよりも各プロジェクトで独立した開発環境を構築できるEclipse IDEの方が個人的に好んでいます。最新版とまでは言わなくとも継続してRust版のEclipseを開発して頂きたいと思いました。
posted by Crescent at 00:00| Comment(0) | ナレッジ | このブログの読者になる | 更新情報をチェックする

2021年04月24日

Node-redを用いたシリアルカメラ画像取込

今回はシリアルカメラPTC06をNode-Redを用いて画像として取り込んでみました。シリアルカメラPTC06は高画質や高フレームレートは全く期待できませんが、UARTから気軽に画像データを取得することができます。組込マイコンとの接続や簡易的な遠隔監視といった用途に最適です。Node-Redのシリアルポートを使用して画像を取り込んでみました。なお、シリアルポートのノードを使用するため、Node-Redはクラウド版でなく、オンプレミス版を使用する必要があります。

フローの全体は下記です。

serial_camera_node_red.jpg

必要に応じて、最初に解像度設定等のコマンドを実行(Inject)した後でResetコマンドでリセットします。画像を取得したいタイミングでCapture Imageコマンドを実行します。取得した画像を確認するためにはRead Data Lengthコマンドを実行してファイルサイズを取得します。その後でRead Image Dataコマンドを実行します。一括で取得できるデータは200Byte前後のため、Read Image Dataコマンドではファイルを分割してメモリから取得し、Jpegファイルを生成しています。


img.jpg

実際に取得したファイルです。至近距離のため、ぼやけていますが、3秒程度でファイルを取得できました。画像サイズは320x240で12kBとなりました。今回のNode-Redのフローはこちらにアップしています。640x480の場合は40kB前後で15秒程度取得に時間を要します。

Node-Redを用いてシリアルカメラの初期化、設定、画像取得までできました。PTC06のデータシートの記載ミスなのか分かりませんが、画像取得コマンドが56,00,32,0C,00,0D...と記載されていますが、このコマンドでは取得できませんでした。他のシリアルカメラと同様に56,00,32,0C,00,0A...とすると取得できるようになりました。ファーム等によっても若干、挙動が異なるようです。

今回は使用しませんでしたが、Node-RedのDashboardと組み合わせれば、ファイルとして画像を取得するだけでなく、ボタンとtemplate等を活用してDashboardにボタン操作で表示することも可能です。時間を見つけて実装してみたいと思います。
posted by Crescent at 00:00| Comment(0) | ナレッジ | このブログの読者になる | 更新情報をチェックする

2021年04月17日

WindowsAppによるPython環境、Jupyter Notebook構築

Python環境を構築する場合、AnacondaやWSL、Docker等で環境を構築した方が便利です。PC環境によってはAnacondaやWSL、Docker等を使用できない場合もあります。今回は敢えてWindowsAppでPython環境を構築、jupyter notebookをインストールする場合のポイントについて紹介します。

特に注意点としてWindowsAppの場合、デフォルトではPythonインストールディレクトリにユーザー権限が与えられていないため、pip等で他のソフトをインストールする際に制約があります。

@PythonAppインストール
スタートボタン→Microsoft Storeから検索でPythonをクリック、インストールします。

WinApp0.jpg

単にPythonだけ使用する場合は@のインストール作業だけで十分です。直接、python.exeにアクセスしたい場合は必要に応じてA以降の設定を行います。

Aディレクトリ権限変更
WindowsAppのPythonは下記のディレクトリにインストールされます。ただ、デフォルトではWindowsAppsフォルダにアクセスするユーザー権限が与えられていないため、コマンドラインやエクスプローラからアクセスできません。権限を変更してアクセスできるようにします。

C:\Program Files\WindowsApps\pythonsoftwarefoundation.python.*.**\python.exe


WinApp1.jpg

WindowsAppのフォルダを右クリックして、セキュリティから詳細設定をクリックします。

WinApp2.jpg

画面真ん中の所有者の「変更」をクリックします。

WinApp3.jpg

詳細設定から検索を押して、現在ログインしているユーザを探し、選択してOKを押します。オブジェクトにユーザ名が選択されていればOKです。OKボタンを押して閉じます。


C:\Program Files\WindowsApps以下にあるpythonsoftwarefoundation.python.*.**のPythonフォルダに対しても同様にユーザ権限を付与します。

WinApp5.jpg

アクセス許可エントリから追加をクリックします。

WinApp4.jpg

プリンシパルから検索をクリックし、同様に現在ログインしているユーザを選択して、フルコントロールの権限にチェックを入れてOKを押します。なお、前回と異なる点として権限変更時に「サブコンテナーとオブジェクトの所有者を置き換える」にチェックを入れます。

WindowsAppのフォルダを右クリックして、セキュリティタブのユーザ名に現在ログインしているユーザを選択して、フルコントロールにチェックが入っていることを確認します。これでC:\Program Files\WindowsAppsフォルダ、WindowsApps以下にあるpythonsoftwarefoundation.python.*.**のPythonフォルダにアクセスできるようになりました。

Bjupyter notebookインストール
下記のコマンドでjupyter notebookをインストールします。
"c:\program files\windowsapps\pythonsoftwarefoundation.python.*.**python.exe" -m pip install notebook

インストール後、下記のコマンドでjupyter notebookがインストールされたフォルダを確認します。
"c:\program files\windowsapps\pythonsoftwarefoundation.python.*.**python.exe" -m pip show notebook

今回は下記のようなディレクトリに格納されていました。
C:\Users\(ユーザ名)\AppData\Roaming\Python\Python38\Scripts\jupyter.exe notebook

Cjupyter notebookショートカット作成
毎回コマンドを打ち込むのは面倒なのでショートカットを作成しました。上記で確認したjupyter.exeフォルダにエクスプローラで確認し、jupyter.exeに対して右クリックで「送る」から「ショートカットをデスクトップに作成」をクリックます。デスクトップで作成されたショートカットのリンク先に「~~\jupyter.exe」から「(半角空白)notebook」を追記して「~~\jupyter.exe notebook」に変更してOKボタンを押して設定を反映させます。

winApp7.jpg

これでショートカットをダブルクリックするだけでjupyter notebookにアクセスできるようになりました。
posted by Crescent at 00:00| Comment(0) | ナレッジ | このブログの読者になる | 更新情報をチェックする

2021年03月27日

Elasticsearchデータ修復

今回はelasticsearchのデータが破損してしまった場合(シングルノード)の修復方法について紹介します。簡易的なデータストレージとしてelasticsearchを使用する場合、クラスター化させずにシングルノードで使用する場合があります。データが冗長化されていないため、誤って電源断をしてしまった時やストレージに障害が発生した時にインデックスがred状態となってしまう場合があります。最悪のケースとしては.kibana_*等のElasticのシステム系インデックスがred状態になるとkibanaが起動できなくなり、開発consoleでコマンド操作といったkibanaの操作が一切できません。

重要なデータでない場合はred状態のindexを丸ごと削除するということが多いと思います。一方で重要でないが可能なら残っているデータを可能な限り復元、修復したいといった場合もあると思います。障害の種類によって修復方法が異なりますが、今回はtranslogの破損による障害の修復方法を紹介します。

translogの細かい説明はここではしませんが、負荷を分散させるためにインデックス内のデータを書き込む前にデータを一時保存するファイルです。translogの破損によってred状態となっている場合、一時保存された直近のデータは消える可能性があります。ただ、red状態で該当するインデックスのすべてのデータにアクセスできない、新規データ投入できない状態から回復したいという場合に有効です。

まずはブラウザやcurlコマンドで下記を実行し、red状態のノードを確認します。修復で使用するため、red状態となったインデックス名のUUIDも合わせて確認します。

続いて、ブラウザやcurlコマンドで下記を実行し、red状態の理由を確認します。

理由として表示された内容で下記の様にTranslog関連の障害が発生している場合は今回の方法で修復できます。unassigned_infoのdetailsにTranslogCorruptedExceptionと表示されており、translog関連の障害と分かります。TranslogCorruptedException以外にもtranslog整合性が合わないといった障害も同様に今回の方法で修復できます。

err_info.jpg


破損したtranslogファイル等を削除して新規に空のtranslogファイルを生成するために下記のコマンドを実行します。なお、ファイル操作を伴うため、elastcisearchを終了させた状態で実行します。また、破損ファイルを削除するため、必要に応じてdataフォルダのバックアップをしてください。インデックスに反映される前のtranslogにのみ記録された直近のデータは削除される場合があります。コマンドラインから下記のコマンドを実行します。

Elasticsearch7以降
bin/elasticsearch-shard remove-corrupted-data --index (インデックス名) --shard-id 0

Elasticsearch6以前
bin/elasticsearch-translog truncate -d (データフォルダ)/elasticsearch/data/nodes/0/indices/(UUID)/0/translog/

elasticsearch7以降の場合は下記のように表示され、translogの破損を発見した場合、修復の有無を聞いてきます。yキーを押して修復させます。

------------------------------------------------------------------------
WARNING: Elasticsearch MUST be stopped before running this tool.
-----------------------------------------------------------------------
Please make a complete backup of your index before using this tool.
-----------------------------------------------------------------------
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
No problems were detected with this index.
Took 0.025 sec total.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> Translog is corrupted at \data\nodes\0\indices\~\0\translog
-----------------------------------------------------------------------
Documents inside of translog files will be lost.
The following files will be DELETED at \0\translog
--> translog-2_.tlog
--> translog.ckp
WARNING: YOU MAY LOSE DATA.
-----------------------------------------------------------------------
Continue and remove corrupted data from the shard ?
Confirm [y/N] y
Checking existing translog files
Reading translog UUID information from Lucene commit from shard at
Translog UUID :
History UUID :
Removing existing translog files
Creating new empty checkpoint at \translog\translog.ckp]
Creating new empty translog at [translog\translog-1.tlog]
Marking index with the new history uuid :
Changing allocation id to
You should run the following command to allocate this shard:
POST /_cluster/reroute
{
 "commands" : [
  {
   "allocate_stale_primary" : {
    "index" : "(インデックス名)",
    "shard" : 0,
    "node" : "(UUID)",
    "accept_data_loss" : false
   }
  }
 ]
}
You must accept the possibility of data loss by changing the `accept_data_loss` parameter to `true`.
上記は一部を書き換えています。

上記のコマンドだけでは修復したインデックスはred状態のままです。続いて、elasticsearchを起動させ、下記のコマンドを実行して再割り当てを行います。先ほどの修復コマンドの最後に表示されているように、accept_data_lossをtrueにしてcurlコマンドで下記のように実行すると再割り当てが行われ、red状態から回復します。

curl -XPOST localhost:9200/_cluster/reroute --header "Content-Type: application/json" --data "{\"commands\":[{\"allocate_stale_primary\":{\"index\":\"(インデックス名)\",\"shard\" : 0,\"node\" : \"(UUID)\",\"accept_data_loss\" : true}}]}"


再度、下記のコマンドで再割り当てされたノードを確認します。red状態から回復していれば修復完了です。

今回はelasticsearchのtranslog破損時の修復方法について紹介しました。elasticsearch-shard remove-corrupted-dataコマンドはtranslogの破損以外にも対応できるようで他の障害でも使えそうです。

もし、正常な状態のバックアップデータ(スナップショット)がある場合、邪道な方法ではありますが、該当するインデックスのtranslogファイルを丸ごと置き換える方法もあります。http://localhost:9200/_cat/indices?vでインデックス名とUUIDの関係を調べ、dataフォルダ内の該当するUUIDフォルダを見つけます。その中にtranslogフォルダがあり、同じUUIDの正常なtranslogフォルダを丸ごと置き換えます。translog自体の破損は修復できますが、インデックスデータとの整合性が合わない可能性が出てきます。ただ、この方法の場合、コマンド操作が不要なため、ダメ元で修復したい場合は作業として非常に楽になります。なお、当然ではありますが異なるUUIDのtranslogフォルダを置き換えた場合は整合性が取れないため、red状態のままです。
posted by Crescent at 00:00| Comment(0) | ナレッジ | このブログの読者になる | 更新情報をチェックする

2021年02月27日

楽天UNLIMITルーター

今回は電子工作や組込系から少し離れた話題となりますが、メイン回線として耐えうる楽天UNLIMITに最適なモバイルルーターを紹介します。キャリア以外から購入可能なモバイルルーターは数年前に比べると数が絞られています。楽天UNLIMITで使用可能なモバイルルーターは主にこちらの3つです。NEC MP02LN富士ソフト FS030WHUAWEI E5785です。

現状、コロナ禍で海外旅行は難しいものの、今後、海外での利用を考えるとバンドがより多い方が好ましいです。また、キャリアを変更した際にそのまま使用可能かを考えるとよりマルチバンドが好ましいです。この時点でNEC MP02LNはLNとLSで対応バンド毎に機種が異なるため、除外しました。残る候補として、富士ソフト FS030WとHUAWEI E5785になります。実際に使ってみて違いをまとめてみました。


■富士ソフト FS030W
・対応バンド
B1,B3,B8,B11,B18,B19,B21
・有線LAN対応
・最大150Mbps
 USBEthernetアダプタで有線LANでの接続が可能になります
・バッテリ無動作
 バッテリを抜いた状態で使用できます
・バッテリ劣化軽減機能
 電池充電を70%程度に抑えて劣化を抑制します

■HUAWEI E5785
・対応バンド
B1,B3,B5,B7,B8,B18,B19,B20,B28,B32,B38,B41,B42
・最大300Mbps
・SMS対応
 専用アプリorブラウザ経由の設定画面からSMSを確認できます

正直、モバイルルーターに付帯する機能としては圧倒的に富士ソフト FS030Wが便利です。特に有線LANやバッテリ無動作は自宅でメイン回線として使用する場合に非常に便利です。一方、HUAWEI E5785はモバイルルーターの基本機能に徹しており、正直あまり特徴がありません。

それぞれ2週間ほど2つを使ってみた結論はHUAWEI E5785です。電波が強く安定している場所では富士ソフト FS030Wで問題ありませんが、電波の弱い場所や室内では富士ソフト FS030Wの速度低下が大きく、速度が不安定になりがちでした。また、FS030Wは一度掴んだバンドが気づいたらローミングになっているということが多々ありました。


横浜の自宅マンションにてスピードテストで確認した結果を下記に記します。高速モードをOFFにして速度が低下の有無でパートナー回線か確認しています。楽天回線で土曜日の夜9時に測定しました。


fs_speed2.jpg
富士ソフト FS030Wの結果


hw_speed.jpg
HUAWEI E5785

上記の結果ではHUAWEI E5785よりも富士ソフト FS030Wが早い結果となっています。ただ、体感としては圧倒的にHUAWEI E5785が早いと感じました。上記の結果で各図中央の速度変化の推移をみると分かりますが、HUAWEI E5785の方が速度の立ち上がりが早く、以降は安定して推移しています。一方、富士ソフト FS030Wは立ち上がりが遅く、以降も速度が上下して安定していません。

最高速度で比較するとどちらも互角ですが、立ち上がりや速度安定が大きく異なりました。特に画像検索や動画の視聴で差が出ました。電波が強く安定している場所では差は感じにくいですが、電波が弱い場所で立ち上がりや速度安定に顕著な差がでました。


ここでは詳細については述べませんし、対応有無等はすべて自己責任の範囲となりますが、ファーウェイはバンド固定や確認ツール[1]が非常に充実しています。huawei_band_tool_config.txtで事前設定して各バッチファイルをクリックすることで任意のバンドに変更、状態の確認ができます。

これらの含めて、貿易摩擦の中で日本国内の存在感が薄れていますが、HUAWEI E5785が楽天UNLIMITに最適なモバイルルーターだと思いました。なお、電波は利用場所や設置環境によって大きく異なるため、参考の情報となります。また、速度や結果を保証するものではありません。
posted by Crescent at 00:00| Comment(0) | ナレッジ | このブログの読者になる | 更新情報をチェックする