ブログ

割とコンピュータよりの情報をお届けします。

2018年3月

WCFによるプロセス間通信を使っていると気づくWindows Formの利点

Windows FormはInvokeという仕組みが使えるが、ConsoleアプリやWindows ServiceなどではInvokeが使えない。

Windows FormではInvokeRequiredで確認してInvokeを使うことで、メソッドを実行するスレッドを1つに絞ることができる。具体的にはメインのUIスレッドでの実行に限定できる。

コンソールアプリケーションやWindowsサービスアプリケーションではInvokeはないInvokeの仕組みはUIのメッセージ処理のループに依存しているためである。通常GUIがない場合には、ブロックしていてもよいとされるためそのような仕様になっている。

時々ある仕様で、今使っている装置との通信機能を提供するDLLではスレッドも見ているようで、スレッドごとにオープンを実行しないと装置の制御を実行できない。

実行スレッドを固定したい処理がある場合には、処理したいスレッドをAutoResetEvent.WaitOneなどで止めておき、AutoResetEvent.Setで動作させ処理が終わるタイミングは別のAutoResetEventで伝えるなどという処理を組み合わせて実装しないといけない。(ようだ)

≫ 続きを読む

2018/03/29 コンピュータ   TakeMe

WCFによるプロセス間通信

WCFによるプロセス間通信の記事を読んでいて,試してみたら32 bitと64 bitが混ざっても使える。とわかって使い方を模索。

今までプロセス間通信はSystem.Runtime.Remotingしか使ったことが無かった。

WCFによるプロセス間通信の記事を読んでいたらまるでDLLのように関数の呼び出しをしているように見える。しかも試してみると32 bitで動いているものと64 btiで動いている者がまざったって使用できる。さらに言うと.NET Frameworkのバージョンが3.5と4.0が混ざったって使用できる。

今度使ってみよう。

≫ 続きを読む

2018/03/27 コンピュータ   TakeMe

SharpDevelopが終息

2018年度中にSharpDevelopが終息しそう。

2018年度中にSharpDevelop Community サイトが終息しそうな状態にある。

Visual Studio Professionalのライセンスが不足しているときに自由に使用できたSharpDevelopであるが、徐々に終息へ向けて進んでいるようです。ただしGitHubに移っただけと考えることもできる。

小規模の開発の場合にはVisual StudioのExpressでも問題はないし大企業でも使用できるといわれている。しかしながら、高度な開発支援機能が便利だった。

2017年の4月ごろまでは5.2がNightly Buildとしてダウンロードできるようになっていた。nuget関係のバグ修正が次々に取り込まれていよいよ次のバージョンが出るのかと期待していた。しかし、現在は公式ビルドの最終となりそうな5.1がダウンロードできるようになっている。

現在ソースはgithubにて公開されており、うまくすれば最新版はビルドはできるかもしれない。普通に考えるとGitHubに移っただけなら開発は続くはずだが変更の頻度が減っている…

≫ 続きを読む

2018/03/24 コンピュータ   TakeMe

Python imageの読み込みだけ

Pythonで画像を読み込んで保存形式を変更する。

Pythonで画像を読み込んで保存形式を変更する。
png形式のファイルを読み込むとRGBA形式になっているようです。これを、RGBに直しておかないとJPEGで保存できません。

from PIL import Image

def main():
    img = Image.open('plot201803.png');
    img = img.convert("RGB")
    img.save('plot201803mod.jpg', 'JPEG', qualtiy=20, optimize=True);

if __name__ == '__main__':
    main()

≫ 続きを読む

2018/03/22 コンピュータ   TakeMe

matplotlib jpeg保存

Matplotlibのsavefigに最近追加されている機能

matplotlibは昔JPEG保存に手間がかかると聞いていたが、普通にできるようになっている。
qualityも指定できるようになっている。1-100で指定できるみたい。ただし、おおむね20未満は質だけが悪くなってあまりサイズの抑制効果が得られない。


import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

from mpl_toolkits.mplot3d import proj3d
def orthogonal_proj(zfront, zback):
    width = zfront - zback;
    a = 1 / width
    b = - a * (zfront + zback) / 2
    return np.array([[1,0,0,0],
                     [0,1,0,0],
                     [0,0,a,b],
                     [0,0,0,zback]])
proj3d.persp_transformation = orthogonal_proj

def main():

    r = 50.0;
    theta = np.arange(0.0, 360.0, 30.0);
    x = np.array([]);
    y = np.array([]);
    z = np.array([]);

    for i in range(10):
        x_ = r * np.cos(theta / 180.0 * np.pi);
        y_ = r * np.sin(theta / 180.0 * np.pi);
        z_ = 10.0 * i * np.ones(x_.shape[0]);
        
        x = np.append(x, x_);
        y = np.append(y, y_);
        z = np.append(z, z_);
    
    X = np.array([x, y, z, np.ones(x.shape[0])]);
    
    fig = plt.figure()
    ax = fig.gca(projection='3d')
    ax.scatter3D(X[0], X[1], X[2]);
    ax.set_aspect('equal')
    plt.grid()
    plt.savefig('plot20180321.jpg', format='jpeg', quality=10);
    plt.show();

if __name__ == '__main__':
    main()

≫ 続きを読む

2018/03/21 コンピュータ   TakeMe

Pythonで3次元プロット と回転

Pythonで3次元プロットをする前に座標回転を追加してみた。

前のコードに追加を行った。

回転行列をかけるということで座標変換を行う。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

from mpl_toolkits.mplot3d import proj3d
def orthogonal_proj(zfront, zback):
    width = zfront - zback;
    a = 1 / width
    b = - a * (zfront + zback) / 2
    return np.array([[1,0,0,0],
                     [0,1,0,0],
                     [0,0,a,b],
                     [0,0,0,zback]])
proj3d.persp_transformation = orthogonal_proj

def rotX(X):
    theta = X / 180.0 * np.pi;
    Rx = np.array([[1,0,0,0],
                   [0,np.cos(theta),np.sin(theta),0],
                   [0,-np.sin(theta),np.cos(theta),0],
                   [0,0,0,1]]);
    return Rx;

def rotY(Y):
    theta = Y / 180.0 * np.pi;
    Ry = np.array([[np.cos(theta),0,-np.sin(theta),0],
                   [0,1,0,0],
                   [np.sin(theta),0,np.cos(theta),0],
                   [0,0,0,1]]);
    return Ry;

def rotZ(Z):
    theta = Z / 180.0 * np.pi;
    Rz = np.array([[np.cos(theta),np.sin(theta),0,0],
                   [-np.sin(theta),np.cos(theta),0,0],
                   [0,0,1,0],
                   [0,0,0,1]]);
    return Rz;

def trans(x):
    Tr = np.array([[1,0,0,x[0]],
                   [0,1,0,x[1]],
                   [0,0,1,x[2]],
                   [0,0,0,1]]);
    return Tr;

def main():

    r = 50.0;
    theta = np.arange(0.0, 360.0, 30.0);
    x = np.array([]);
    y = np.array([]);
    z = np.array([]);

    for i in range(10):
        x_ = r * np.cos(theta / 180.0 * np.pi);
        y_ = r * np.sin(theta / 180.0 * np.pi);
        z_ = 10.0 * i * np.ones(x_.shape[0]);
        
        x = np.append(x, x_);
        y = np.append(y, y_);
        z = np.append(z, z_);
    
    X = np.array([x, y, z, np.ones(x.shape[0])]);
    X = np.dot(rotX(45.0), X);
    X = np.dot(rotY(45.0), X);
    X = np.dot(rotZ(10.0), X);
    X = np.dot(trans([10, 10, -10]), X);
    
    fig = plt.figure()
    ax = fig.gca(projection='3d')
    ax.scatter3D(X[0], X[1], X[2]);
    ax.set_aspect('equal')
    plt.grid()
    plt.savefig('plot201803.svg');
    plt.show();

if __name__ == '__main__':
    main()

≫ 続きを読む

2018/03/20 コンピュータ   TakeMe

ヒストグラムを作成

Pythonヒストグラムの作成について

Pythonでヒストグラムを作成してみた。
バーの周辺にエッジをなくす場合にはedgecolor="none"とするらしい。

import numpy as np
import matplotlib.pyplot as plt

R = np.random.randn(100000) * 2. + 10.;
plt.hist(R, bins=50, edgecolor="black");
plt.grid();
plt.savefig('test2.png');
plt.show();

≫ 続きを読む

2018/03/16 コンピュータ   TakeMe

Pythonで3次元プロット

Pythonで3次元プロットしてみた

Pythonで3次元プロットしてみたが、なかなか難しいのがパースペクティブ表示になっているところ。

参考をみて直してもらった。

 

import matplotlib
import matplotlib.pyplot as plt
import numpy as np

from mpl_toolkits.mplot3d import proj3d
def orthogonal_proj(zfront, zback):
    width = zfront - zback;
    a = 1 / width
    b = - a * (zfront + zback) / 2
    return np.array([[1,0,0,0],
                     [0,1,0,0],
                     [0,0,a,b],
                     [0,0,0,zback]])
proj3d.persp_transformation = orthogonal_proj

r = 50.0;
theta = np.arange(0, 360.0, 30);

x = np.array([]);
y = np.array([]);
z = np.array([]);

for i in range(10):
    x_ = r * np.cos(theta / 180 * np.pi);
    y_ = r * np.sin(theta / 180 * np.pi);
    z_ = 10. * i * np.ones(x_.shape[0]);

    x = np.append(x, x_);
    y = np.append(y, y_);
    z = np.append(z, z_);

fig = plt.figure();
ax = fig.add_subplot(111, projection='3d')
ax.scatter3D(x, y, z);
plt.show();

≫ 続きを読む

2018/03/15 コンピュータ   TakeMe

Pythonで一定間隔で実行

Pythonで一定間隔で実行することが難しい。JavaScriptではsetInterval()が使えるのだが,Pythonは標準で用意されていないよう

Pythonで一定間隔であるコードを実行する方法を知べていたがなかなか見つからない。
標準ではないのかもしれない。微妙にこれでいいのか不安。

(今更気付いたがPythonの関数内では関数の外の変数も読めてしまうのですね)

 

import threading
import time
import sys

threadStop = False;
count = 0;
def run():
    global count, threadStop;
    count += 1;
    if threadStop != True:
        thread = threading.Timer(1, run)
        thread.start()
        print('run {0}'.format(count));
    else:
        threadStop = False;
    
    

thread = threading.Thread(target=run);
thread.start();

try:
    while (True):
        time.sleep(1);
    
except KeyboardInterrupt:
    threadStop = True;
    while threadStop == False:
        time.sleep(0.01);
    sys.exit();

(2018/08/25追記: .NETの支援があれば別の方法も使える)

≫ 続きを読む

2018/03/14 コンピュータ   TakeMe
タグ:Python

PythonとJavaScriptの時刻やり取り

PythonとJavaScriptのDateのやり取りで困ったことを書いてみる。

PythonのdatetimeとJavaScriptのDateのやり取りにかなり苦労した。

最終的に以下のようなコードができた。
うまくいっているのかがよくわからない。
なかなか思ったような処理にならない。難しい。最後はtzlocalモジュールを使用してつじつま合わせをしている。

from datetime import datetime, timedelta, timezone
from tzlocal import get_localzone
import pytz
import time

#tstr = '2016-11-29T10:00:30Z'

def fromtstr(tstr):
    try:
        tdatetime = datetime.strptime(tstr, '%Y-%m-%dT%H:%M:%S.%fZ').replace(tzinfo=timezone.utc);
    except:
        tdatetime = datetime.strptime(tstr, '%Y-%m-%dT%H:%M:%SZ').replace(tzinfo=timezone.utc);
    return tdatetime;

def valueOf(datetime):
    return int(time.mktime(datetime.timetuple())*1e3 + datetime.microsecond/1e3);

def fromValue(value):
    tz = get_localzone() # local timezone 
    d = datetime.now(tz) # or some other local date 
    utc_offset = d.utcoffset().total_seconds()
    epoch = datetime(1970, 1, 1).replace(tzinfo=timezone.utc)
    val = epoch + timedelta(milliseconds=value+utc_offset*1000)
    return val;

 

≫ 続きを読む

2018/03/14 コンピュータ   TakeMe