Basercmsで本文の追加ができない
Basercmsで本文が登録できなくなっているのだけど…困ったCMSだな
Basercmsで本文が追加できなくなってしまった。本当に安定を待たないと使用に耐えない。実用には、もう1年くらい待った方がよかったかな
データベースのテーブルに直接書き込むことはできるのでこの記事はそのように追加した。
割とコンピュータよりの情報をお届けします。
Basercmsで本文が登録できなくなっているのだけど…困ったCMSだな
Basercmsで本文が追加できなくなってしまった。本当に安定を待たないと使用に耐えない。実用には、もう1年くらい待った方がよかったかな
データベースのテーブルに直接書き込むことはできるのでこの記事はそのように追加した。
Windows FormはInvokeという仕組みが使えるが、ConsoleアプリやWindows ServiceなどではInvokeが使えない。
Windows FormではInvokeRequiredで確認してInvokeを使うことで、メソッドを実行するスレッドを1つに絞ることができる。具体的にはメインのUIスレッドでの実行に限定できる。
コンソールアプリケーションやWindowsサービスアプリケーションではInvokeはないInvokeの仕組みはUIのメッセージ処理のループに依存しているためである。通常GUIがない場合には、ブロックしていてもよいとされるためそのような仕様になっている。
時々ある仕様で、今使っている装置との通信機能を提供するDLLではスレッドも見ているようで、スレッドごとにオープンを実行しないと装置の制御を実行できない。
実行スレッドを固定したい処理がある場合には、処理したいスレッドをAutoResetEvent.WaitOneなどで止めておき、AutoResetEvent.Setで動作させ処理が終わるタイミングは別のAutoResetEventで伝えるなどという処理を組み合わせて実装しないといけない。(ようだ)
WCFによるプロセス間通信の記事を読んでいて,試してみたら32 bitと64 bitが混ざっても使える。とわかって使い方を模索。
今までプロセス間通信はSystem.Runtime.Remotingしか使ったことが無かった。
WCFによるプロセス間通信の記事を読んでいたらまるでDLLのように関数の呼び出しをしているように見える。しかも試してみると32 bitで動いているものと64 btiで動いている者がまざったって使用できる。さらに言うと.NET Frameworkのバージョンが3.5と4.0が混ざったって使用できる。
今度使ってみよう。
2018年度中にSharpDevelopが終息しそう。
2018年度中にSharpDevelop Community サイトが終息しそうな状態にある。
Visual Studio Professionalのライセンスが不足しているときに自由に使用できたSharpDevelopであるが、徐々に終息へ向けて進んでいるようです。ただしGitHubに移っただけと考えることもできる。
小規模の開発の場合にはVisual StudioのExpressでも問題はないし大企業でも使用できるといわれている。しかしながら、高度な開発支援機能が便利だった。
2017年の4月ごろまでは5.2がNightly Buildとしてダウンロードできるようになっていた。nuget関係のバグ修正が次々に取り込まれていよいよ次のバージョンが出るのかと期待していた。しかし、現在は公式ビルドの最終となりそうな5.1がダウンロードできるようになっている。
現在ソースはgithubにて公開されており、うまくすれば最新版はビルドはできるかもしれない。普通に考えるとGitHubに移っただけなら開発は続くはずだが変更の頻度が減っている…
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()
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()
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()
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();
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();
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の支援があれば別の方法も使える)
