画像ビューア・加工ツールまとめ

IrfanView

  • 昔からある定番ソフト。メインの画像ビューアとして使ってる。
  • 色調補正やリサイズ・トリミング、フィルタといった一通りの加工機能はそろってる。
  • 複数のファイルの一括変換機能もある。(例:座標を指定して一括トリミング)
  • 透過PNGの扱いは苦手?

forest.watch.impress.co.jp

Ralpha

  • 複数のファイルの一括リサイズ・トリミングなどの加工ができる。
  • 特に透過PNGを扱うときに使ってる。
  • IrfanViewにないトーンカーブもある。

www.vector.co.jp

Jcropper

  • JPEGを劣化なくトリミングができる。

www.vector.co.jp

XnRetro

  • 写真をレトロ調に加工できるツール

www.vector.co.jp

メモ:C#でスレッド

今どきはC#ならasync/awaitが使えるのでThreadを使う機会は減ったけどやはり使う時は使うものである。たまにしか使わないと忘れるのでメモ。

(1) スレッドの起動

ThreadStartというデリゲートを使うのがポイント。というかC#の妙ちくりんなところ。短い処理であればラムダ式で書いた方が簡潔。

using System.Threading;
    Thread threadHoge;
    // スレッドの起動
    threadHoge = new Thread(new ThreadStart(funcHoge));
    threadHoge.Start();
    private void funcHoge()
    {
        // スレッドの処理
    }

(2) スレッドの終了待ち合わせ

    // スレッドの終了待ち合わせ
    threadHoge.Join();

(3) スレッドからUIを操作

メインスレッド(UIスレッド)以外のスレッドからUIを操作するにはInvokeまたはBeginInvokeを使う。Actionというデリゲートを使うのがポイント。というかC#の妙ちくりんなところ。たいていは数行ですむのでラムダ式で書くと簡潔だが、ラムダ式そのものを引数にはできない。
Invokeなら同期、BeginInvokeなら非同期で処理される。

    // 同期処理
    this.Invoke((Action)(() => {
        textboxHoge.Text = "Hoge";
    }));
    // 非同期処理
    this.BeginInvoke((Action)(() => {
        textboxHoge.Text = "Hoge";
    }));

(4) 排他処理

ロック用のオブジェクトを定義してロックする。デッドロックに注意。(イベントハンドラはスレッドでないことに注意。)

    // ロック用オブジェクト
    object lockobj = new object();
    lock(lockobj )
    {
        // 排他処理
    }

FTDIのUSBシリアル変換ICのCBUSの機能割り当て

FTDIのUSBシリアル変換ICのCBUSxピンには種々の機能を割り当てることができます。
FT232RLの場合、デフォルトでは下表の機能が割り当てられています。

ピン 機能 説明
CBUS0 TXLED# 送信データLED駆動 (Lowアクティブ)
CBUS1 RXLED# 受信データLED駆動 (Lowアクティブ)
CBUS2 TXDEN RS-485用の送信データイネーブル(DE)
CBUS3 PWREN# 電源イネーブル (Lowアクティブ)
起動後Lowになり、USBサスペンド中はHighになる。
Pch MOSFETで外部回路の電源を制御するのに使える。
CBUS4 SLEEP# スリープ (Lowアクティブ)
USBサスペンド中はLowになる。

機能割り当てはIC内部のEEPROMに記憶されています。
これを変更するにはFTDIが提供するユーティリティー「FT_PROG - EEPROM Programming Utility」を使用します。

FT_PROGによる機能割り当ての変更

  • 下記サイトよりFT_PROGをダウンロードしてインストールします。
  • FT_PROGを起動します。
  • 「EEPROM」タブの「DEVICES」メニューから「Scan and Parse」を実行します。
  • USBに接続されているFTDIデバイスが「Device Tree」に列挙されます。
  • 所望のデバイスの「FT EEPROM」>「Hardware Specific」>「IO Controls」を開く。
  • C0~C4(FT232RLの場合)の機能割り当てが表示されるので、適宜変更します。
  • 「DEVICES」メニューから「Program」を実行します。
  • 「Program Devices」ダイアログが開くので「Program」ボタンを押します。

f:id:licheng:20190312210226p:plain

メモ:モータのトルク定数と逆起電力定数

  • モータのトルク定数と逆起電力定数は理論上は一致する
  • トルク定数の単位は Nm/A (単位電流あたりのトルク)
  • 逆起電力定数の単位は V/rpm (単位回転数あたりの逆起電力)
  • 換算式 1 Nm/A = (2π/60) V/rpm
  • DC電圧[Vdc] か 実効値電圧[Vrms] かも要注意

f:id:licheng:20190312171340j:plain:w500

ブラウザでMQTTクライアント (Paho)

Pahoとは

PahoとはオープンソースのMQTTクライアントのライブラリです。Pahoはさまざまな言語で実装されています。(Java, Python, JavaScript, C, C++, C#, Goなど) 今回はブラウザベースで使えるJavaScript版の使い方を説明します。JavaScript版Pahoは、MQTT over WebSocketプロトコルを使っており、MQTTブローカーとの通信はWebSocket上でおこなわれます。当然ながらMQTTブローカー側がMQTT over WebSocketに対応している必要があります。
www.eclipse.org

ダウンロード

JavaScript版の説明は下記のページにあります。

ダウンロードは下記のページの「JavaScript client x.x.x」のリンクからできます。

paho.javascript-x.x.x.zipを解凍すると、フル版のpaho-mqtt.jsと圧縮版のpaho-mqtt-min.jsが得られます。これがJavaScript版Pahoライブラリです。これを自分のWebアプリに配置して使います。上記の説明ページにはソースからのビルド方法についても書かれていますが、なんのことかよく分からないので今回は無視します。

CDNでの利用

または、CDNで配信されているものを利用する方法もあります。ただし、少しバージョンが古いようです。

<!-- フル版 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/paho-mqtt/1.0.1/mqttws31.js" type="text/javascript"></script>
<!-- 圧縮版 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/paho-mqtt/1.0.1/mqttws31.min.js" type="text/javascript"></script>

使い方

  // MQTTクライアント生成
  var client = new Paho.MQTT.Client(
    "MQTTブローカーのドメイン",
    WebSocketポート番号,
    "web_" + parseInt(Math.random() * 100, 10));

  // コールバックの定義
  client.onConnectionLost = onConnectionLost; // 接続が切れたとき
  client.onMessageArrived = onMessageArrived; // メッセージ受信したとき

  // 接続
  var options = {
    useSSL: true,
    userName: "ユーザー名",
    password: "パスワード",
    onSuccess:onConnect, // 接続したときのコールバック
    onFailure:doFail // 失敗したときのコールバック
  }
  client.connect(options);

  // 接続したとき
  function onConnect() {
    console.log("onConnect");
    
    // トピックを購読する
    client.subscribe("トピック名");
    
    // トピックにメッセージを発行してみる
    message = new Paho.MQTT.Message("Hello, World!");
    message.destinationName = "トピック名";
    client.send(message);
  }
  
  // 失敗したとき
  function doFail(e){
    console.log(e);
  }

  // 接続が切れたとき
  function onConnectionLost(responseObject) {
    if (responseObject.errorCode !== 0) {
      console.log("onConnectionLost:"+responseObject.errorMessage);
    }
  }

  // メッセージを受信したとき
  function onMessageArrived(message) {
    console.log("onMessageArrived:"+message.payloadString);
  }

リファレンスドキュメント

メモ:WindowsでEtherCATマスター

やりたいこと

Windows PCで通常のLANポートを用いてEtherCATのマスターになる。

SOEM

SOEM (Simple Open EtherCAT Master) とは、Open EtherCAT Society が提供しているオープンソースの小規模なEtherCATマスターのスタック。ソースコードGitHubで公開されている。ちなみにEtherCATスレーブのスタックとして SOES (Simple Open EtherCAT Slave) も提供されている。

SOEMのビルド

mkdir build
cd build
cmake .. -G "NMake Makefiles"
nmake
  • 成功するとbuild/test/linux/にsimple_test.exeができる
    • なぜwin32フォルダでなくlinuxフォルダなのかは謎

simple_test.exeの実行

下記のようにネットワークインターフェースを指定して実行

cd test\linux\simple_test
simple_test.exe \Device\NPF_{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}

【実行結果】 (とりあえずスレーブ機器が無い状態なので No slaves found! となっている)

SOEM (Simple Open EtherCAT Master)
Simple test
Starting simple test
ec_init on \Device\NPF_{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} succeeded.
No slaves found!
End simple test, close socket
End program

このネットワークインターフェース名は、PowerShellで下記を実行すると確認できる。

Get-NetAdapter | select Name,DeviceName

【実行結果】

Name                DeviceName
----                ----------
ローカル エリア接続 \Device\{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}

また、このネットワークインターフェース名は、C#アプリからは下記のようにして取得できる。

using System;
using System.Net.NetworkInformation;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            var interfaces = NetworkInterface.GetAllNetworkInterfaces();
            foreach (var ni in interfaces)
            {
                Console.WriteLine($"{ni.Id},{ni.Name}");
            }
        }
    }
}

【実行結果】

{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX},ローカル エリア接続
{YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY},Loopback Pseudo-Interface 1

Herokuアプリをスリープさせない対策

Herokuアプリの無料枠だとアクセスが30分間無いとスリープしてしまう。
スリープさせない簡単な方法はHeroku Schedulerを使うこと。

手順

  • Herokuにログインする (アプリはすでにあるものとする)
  • Dashboard画面右上のメニューの「Elements」をクリック
  • Heroku Elementsで「Heroku Scheduler」を検索
  • 「Add-ons」の「Heroku Scheduler」を選択
  • 「install Heroku Scheduler」をクリック
  • 「App to provision to」で自分のアプリ名を検索して選択
  • 「Provision add-on」でアプリに追加する
  • アプリの「Resources」の「Add-ons」に「Heroku Scheduler」が追加されている
  • 「Heroku Scheduler」を開いて以下の設定をする
    • $ の欄に「curl https://アプリ名.herokuapp.com/」を設定
    • 「Frequency」に「Every 10 minutes」を設定