雑記帳

ソフトを中心に雑記を書いてる割とすぐ転職したい人。コメント貰えると私が喜びます。

Pythonから.NET向けのDLLを使う~Python for .NET~

最近、面白がって Python for .NET | pythonnet.github.ioを使ってアプリケーションの開発をしていたのでその雑記です。

想定パターン

とりあえず、以下のようなケースで利用出来そう。

  1. .NET向けのDLLをPythonで利用したいとき
    アプリケーションの本体がPython側で、.NETのDLLなどを弄る必要がある場合に使える(た)。
    (.NETのUIだけPython側で欲しい時とかは使えないかな?)

  2. .NETのソフトからPythonでロジックを実行してC#側にデータを戻す場合
    分かりやすい事例だと、事務用のデスクトップアプリなどを作る時、Pythonで書くとUIをPyQtやKivyなどで実装する必要があるが、これらは保守性が低いので、C#などでUIを書いてPythonをコールするイメージ。

今回書くのは1のケースのみです。 2のケースをやらないのは後述します。

.NET向けDLLをPythonで利用する

namespace sample_dll
{
    public class Class1
    {
        int mCounter = 0;

        public Class1()
        {
            mCounter = 0;
        }

        public int count()
        {
            mCounter += 1;
            return mCounter;
        }

        public void reset_count()
        {
            mCounter = 0;
        }
        public int out_count(out int c)
        {
            c = mCounter;
            return 0;
        }
        public string class_input(Class2 c2)
        {
            return c2.message;
        }
    }

    public class Class2
    {
        public string message;
        public Class2()
        {
            message = "this is class2.";
        }

    }
}
import clr

clr.AddReference('sample_dll')
from sample_dll import Class1
from sample_dll import Class2

C1 = Class1()

c = C1.count()
print(c)
c = C1.count()
print(c)
c = C1.count()
print(c)

d = 0
a = C1.out_count(d)
print("a: " + str(a))
print("d: " + str(d))

c2 = Class2()
b = C1.class_input(c2)
print("b: " + str(b))
print("c2: " + str(c2))
c:\sample\pythonfornet>python main.py
1
2
3
a: (0, 3)
d: 0
b: this is class2.
c2: sample_dll.Class2

気になったポイント

  • outパラメータやrefパラメータへの入力の扱いが良く分からなかった。
    python側で対応するデータ型にしたダミー変数を準備して放り込む必要がある。
    返り値は、関数の返り値にsetのn番目、として返ってくる。
    optionパラメータだと更に混乱しそう。。。

  • C#の独自型の入力がよく分からなかった。
    上の例くらいだと分からないでもないが、Classの初期化に更に別のClassが必要な場合、書式が煩雑になった。

  • ハマりそうな気がするジェネリック型は意外とサンプル通りで動くので良い。

  • dllしか持っていない場合でもCodeReflect - Free .NET Decompilerでパラメータを見ながら書けば、割と簡単にそれっぽく動かせる。

感想とか

先にも書いたとおり私が必要としたのは1のパターンです。
他社から購入しているプロプラなソフトとの通信を専用のDLLで実装する必要があったものの、C#とかで書くのが面白くないので使い方を調べました。

対して、世間的には2のケースに対する要求の方が多い気がします。
分かりやすい利用ケースとしては、C#で作ったアプリUIから、PythonのNumpyやPandasやscikit-learnなどの高度演算を利用したい場合などが思いつきました。
でも、後者のケースでは、多くの場合は私は利用しないです。
裏側でPythonでサーバを立てて、表面のC#とRESTなどで通信するとか、単にバッチとしてpython側を実装してファイルで通信するとかの方がコードの分離度が高くて保守性が上がるから。.NET (C#)からpythonを呼び出す - Qiitaにも方法論としての記述はあります。
サーバのプロセスが残ることを良しとしない場合や、C#のUI上で思考錯誤しながら、Pythonとハンドシェイクしながら動かす場合などが対象範囲になるだろうか?
Python側の呼び出し単位が小さくて、APIの開発ややバッチの呼び出しコストが高くなる場合が該当するとは思う。

会社であった開発予算の使い道の話

愚痴です。

私は今の仕事から離れることが決まっている。
そして、今年度のIoT開発の業務用に確保した予算が、上半期はほぼ手つかずのままであった。
次の担当者に引き継ぎをするため、自分が今持っているネタを報告する会議を開いた。

最後の方になって、あれこれ考えていて、予算も多少はあるのになんで手を付けてないの?と聞かれた。
自分が出した回答は以下2つ。

続きを読む

OpenCVでの画像キャプチャで少し困った

出来事

そんなに難しいことではないけど、半日くらい調べてたので雑記。
下のUSBカメラを使っていて、なぜか1280x1024以上の解像度の画像を取得出来ない問題を調べた話。

結果

以下の部分がポイント。6や5あたりの設定の順番が何気に重要だった。
設定順を間違えると真っ黒画像になります。理由は知らない。逆順に設定した方が良い?

cap0.set(6,cv2.VideoWriter_fourcc(*'MJPG'))
cap0.set(5,10)
cap0.set(4,1944)
cap0.set(3,2592)

コード

import numpy as np
import cv2

cap0 = cv2.VideoCapture(0)
cap0.set(6,cv2.VideoWriter_fourcc(*'MJPG'))
cap0.set(5,10)
cap0.set(4,1944)
cap0.set(3,2592)

for c,x in enumerate(range(37)):
    print("%4d:%s"%(c,cap0.get(x)))

while(True):
    ret, frame0 = cap0.read(0)
    cv2.imshow('frame1',frame0)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap0.release()
cv2.destroyAllWindows()

参考

OpenCV 3(core + contrib)をWindows & Python 3の環境にインストール&OpenCV 2とOpenCV 3の違い&簡単な動作チェック - Qiita

Capturing 1080p at 30fps from logitech c920 with openCV 2.4.3 - Stack Overflow

部屋が汚いので片付けた話

全然技術系のネタじゃないけど、私としては切実な問題だったので書きます。
今年に入ってからダラダラと部屋の掃除をはじめました。
そしたら少し綺麗になったので書いておきます。
※写真無いです。

解決したいこと

部屋が汚い。

症状

部屋をざっと見渡して見たところ、汚い理由は主に、服・本・ゴミの3つ。

いくらか現状

  • 部屋を片付ける気はあり、実際月一程度には片付けを試みていた。けど散らかっていった。
  • 服をしまう収納はある
    • 有効活用出来ていない
  • ゴミ箱は部屋に1つはある
    • が利用頻度が低く、ゴミ袋をそのまま利用することもある
  • 本を並べる収納が足りていない
    • 本棚の上に本が寝かせておいてある
    • 本が足元にちらばっている
    • 本は約1冊/日のペースで増えている

今回の解決策

下のような収納(ファイルボックスというらしい)を20個ほど本棚の上に設置。本を並べるスペースを確保した。
自分はコクヨじゃなくて、家の近くにあった無印で買った。

ブックエンドはたくさん使われていたけど、使わない本を支えるだけでしかなかったのでズボラさんにはオススメしません。

コクヨ ブックエンド 大 黒 滑止め付 BS-34ND

コクヨ ブックエンド 大 黒 滑止め付 BS-34ND

考察

以前、台所で同じことをやったけど、テーマを決めてやると上手く片付けが進む。

今になって思うと、足元に本が散らばっていたことで無意識に避ける必要があったが、何かを片付ける時にコストになっていて、それが想定よりも高かったらしい。
部屋の中での、移動コストが減ったことで片付ける際の総コストが減ったので億劫にならなくなった。

まだ部屋は汚いので次は服を片付けたい。

副作用

ごちゃごちゃして見えなかったものが見えてきたので他のものごとが片付いた。 * 食器が片付いた * 服も少し片付いた * 電気代を払った * ふるさと納税の手続きが進んだ * テレビを捨てた

雑記

片付けの際、少しだけ本を処分した。
その中で少し思い切ったのが漫画クロノクルセイドの処分。
アニメも嫌じゃないけど漫画のがオススメです。ラストが泣けます。

処分に当たって電子版を買ったけど、一つ残念なのが紙版の表紙やカラーページが無いこと。
紙の本は絶版になってたらしいので見る機会は無いのかな。
表紙とかカラー絵好きだったんだけどなぁ。
一番きれいな空を飛ぼうよ〜〜

クロノクルセイド (Vol.7) (ドラゴンコミックス)

クロノクルセイド (Vol.7) (ドラゴンコミックス)