ブログ

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

Year 2021

Python for .NETの新しい話

だいぶん前に「PythonからC#で書いた.NET Framewokのクラスライブラリを読みだす」1つ目2つ目
では.NET Frameworkのプログラムを読み出すことだった。

逆の「C#からPythonの関数を呼び出し」は更新が追い付いていないといって最新版をとってきていた。
多少最新バージョンからバージョンがずれていてもよいならpythonnet_py37_winなどなどnugetで入れられるようになっていた。むしろこちらの方が簡単だな。

nugetパッケージは.NET Frameworkならpythonnet_py37_winだし.NET Coreならpythonnet_netstandard_py37_win
やっぱりnugetパッケージは簡単.ただし,embeddable pythonをビルドターゲットフォルダに持ってきている。この参考でscipyまたはnumpyをインストールした方が便利。

ターゲットに入れて一緒に持ち運び....(scipyまで入れると相当 大きい)

using Python.Runtime;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace PythonEmbedSample
{
    class Program
    {
        static void Main(string[] args)
        {
            string strPath = Environment.GetEnvironmentVariable("PATH");

            string appDir = Directory.GetParent(Assembly.GetExecutingAssembly().Location).FullName + @"\python";

            Environment.SetEnvironmentVariable("PATH", Path.PathSeparator + appDir, EnvironmentVariableTarget.Process);

            using (Py.GIL())
            {
                PythonEngine.RunSimpleString("print('SAMPLE')");
            }
        }
    }
}

python37._pthの#import siteのコメントアウトを解除して,https://bootstrap.pypa.io/get-pip.pyをもらってきて,...
embeddable pythonのディレクトリでpython get-pip.pyを実行して,
python -m pip install scipyを実行して... scipyを使えるようになった

例えば,sample.pyを作る splineで補間する例を追加してみた.

import numpy as np
from scipy import interpolate

def spline(x, y, xi):
    x = np.array(x);
    y = np.array(y);
    xi = np.array(xi);
    f = interpolate.interp1d(x, y, kind="cubic", fill_value="extrapolate")
    yi = f(xi);
    return yi;

そしてC#の側を次のようにいじってsample.pyのモジュールを読み込むようにする.

using Python.Runtime;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace PythonEmbedSample
{
    class Program
    {
        static void Main(string[] args)
        {
            string strPath = Environment.GetEnvironmentVariable("PATH");

            string appDir = Directory.GetParent(Assembly.GetExecutingAssembly().Location).FullName + @"\python";

            Environment.SetEnvironmentVariable("PATH", Path.PathSeparator + appDir, EnvironmentVariableTarget.Process);

            using (Py.GIL())
            {
                dynamic sys = Py.Import("sys");
                // sample.pyを置くフォルダをパスに追加
                sys.path.append(Directory.GetParent(Assembly.GetExecutingAssembly().Location).FullName);


                dynamic sample = Py.Import("sample");
                
                List<double> x = new List<double>(); // Python listへの変換予定
                List<double> y = new List<double>(); // Python listへの変換予定

                for (int i = 0; i < 10; i++)
                {
                    x.Add(0.1 * i);
                    y.Add(Math.Sin(2.0 * Math.PI * x[i] / 1.0));
                }

                List<double> xi = new List<double>(); // Python listへの変換予定
                for (int i = 0; i < 100; i++)
                {
                    xi.Add(0.01 * i);
                }
                dynamic yi_ = sample.spline(x, y, xi); // numpy.arrayで返ってくる予定
                List<double> yi = new List<double>(); // List<double>への変換は暗黙的にできないため
                yi.AddRange((double[])yi_);

                {
                    StreamWriter sw = new StreamWriter("sample_init.csv");
                    for (int i = 0; i < x.Count; i++)
                    {
                        sw.WriteLine(string.Format("{0},{1}", x[i], y[i]));
                    }
                    sw.Close();
                }

                {
                    StreamWriter sw = new StreamWriter("sample_interp.csv");
                    for (int i = 0; i < xi.Count; i++)
                    {
                        sw.WriteLine(string.Format("{0},{1}", xi[i], yi[i]));
                    }
                    sw.Close();
                }
            }
        }
    }
}

≫ 続きを読む

2021/02/17 コンピュータ   TakeMe
Tag:Python

BaserCMSのサイト内検索ができない

最近サーバーを入れ替えたが,どうもその前からサイト内検索ができなくなっていたようだ.
全く気付かなかった.

BaserCMSのバグかと思い,ユーザーフォーラムを確認すると,
どうも少し内容が違うが,記載された現象も生じている.

実際にこのサイトの先頭ページでサンプルを作ってみた(トップページの「サイト内検索」は現在動作しません)
このBaserCMSのデータベースをMySQLに移したときとPostgreSQLに移したときとSQLite3に移したときとで動作が異なる.
内部エラーになるか0件と表示されるか.

データベースを入れ替えるとエラー表示だけは消えるので開発側で良く使うデータベースだけ問題が起きないのかと思っている.

ただし,このサイトの場合にはソースコードも書いてしまっているのでセキュリティ的にまずいので止めるように変更されたのかもしれない.
いずれにしても,トップページの「サイト内検索」は現在動作しません もはやいつからかわからないがサーバ入れ替え前にこの状態だったようだ.

≫ 続きを読む

2021/02/06 コンピュータ   TakeMe

Ubuntu 16.04サーバを待機状態に移行しました

今まで公開していたサーバはUbuntu 16.04だった.
これこれをUbuntu 18.04,Ubuntu 20.04とバージョンアップしていってみたがなかなかうまくいかず...

Ubutu 16.04はESMでもないともうすぐサポート期限切れだな.

Ubuntu 16.04を順にバージョンアップすればよいとおもっていたが,一か月間失敗続きだったので新サーバを準備していました.
ようやく本日新サーバを立ち上げ,旧サーバを待機状態に移しました.

契約しているVPSのサービスが更新されていて,若干容量が上がったみたい.

≫ 続きを読む

2021/01/31 リリース   TakeMe

OpenTKの参考ページをいろいろ探していた

OpenTKの参考ページを探していた。かなりたくさんの情報が盛り込まれているページは鳩でもわかるC#
OpenTKだけの参考本はほぼないかもしれない。

Windows FormsやWPFで簡単に GPUを使った描画をやらせたいと思っていた時に,OpenTKの記事が参考になった.

記事では,手動でOpenTKのライブラリを追加しているが,これはopentkのライブラリをインストールさせるところから始まっているため。

nugetパッケージをとってくるのが一番簡単かな。nugetパッケージで入れてやるとビルド時も実行に必要なファイルはターゲットディレクトリに書き出してくれる。ツールボックスからGLControlがドラッグアンドドロップできる状態にもできる。

nugetでは「OpenTK」ではなく「OpenTK.GLControl」を探して選択してインストールして,OpenTKが合わせてインストールされる状態に持っていく方がよさそう。
しばらく参考を見てみるところ。

-- 
参考ページ

 

≫ 続きを読む

2021/01/31 コンピュータ   TakeMe

Basecms SQLiteのデータベース使用

Ubuntu ではphp-sqlite3のインストールが必要

Ubuntu でBaserCMSを入れているとSQLiteが使えないのだとばかり思っていた。

勘違いだった,Postgresqlを使う場合には

sudo apt install php-pgsql

SQLiteを使う場合には

sudo apt install php-sqlite3

の実行が必要だった。よく考えるとMySQL用のモジュールもシステム要件には記載がないので当然かな

≫ 続きを読む

2021/01/24 BaserCMS関係   TakeMe