Upgrade to Pro — share decks privately, control downloads, hide ads and more …

レガシーアプリでPythonを活用する方法の検討

Hiroki.Abe
September 11, 2021

 レガシーアプリでPythonを活用する方法の検討

# python charity talks in Japan 2021

Hiroki.Abe

September 11, 2021
Tweet

More Decks by Hiroki.Abe

Other Decks in Programming

Transcript

  1. 私の環境には .NET(C#, VB.NET)で作られた業務アプリ(デスクトップアプリ)が 数多く存在します. (主に工場の製造・検査ソフトウェア) 特性検査では複雑な科学技術計算を使うことがあり, これらアプリ開発の際に Pythonが使えたら と思うことがしばしばあります. (Scipyなど)

    そこで既存資産を活かしつつ, Pythonを導入方法を検討しました. Pythonが使えるとうれしい点 ・豊富なライブラリ群 ・科学技術計算に強い 概要 2021/9/11 SLIDO.COM #582 362 Test ….. …….. 4
  2. 単にPythonに乗り換えると 豊富な既存資産 (.NET) が生かせない • 枯れた既存処理(ロットの処理など), .NET向けのみ提供されているDLLを 使った処理, etc (移植するにも工数がかかる)

    GUIをどうするか問題がある • (あくまで個人的な意見) PythonのGUIライブラリは, .NETのUI フレーム ワーク(WindowForms, WPF) と比べると作成に時間がかかる • かといってWebアプリ(React, Vue.JSなどを使用)は 生技のエンジニアに は習得コストが高い 課題 2021/9/11 SLIDO.COM #582 362 5
  3. 方法の検討 課題を克服して, Pythonを導入できる方法がないか検討した. Python導入方法を 一覧にまとめて比較し, 過去資産活用に重きを置いて候補の案を決めた. 担当者の前提条件: - .NETのアプリを作ることができる -

    現場のデータ解析などで Pythonの使用経験がある - ソフトウェア開発が必ずしも主務ではないエンジニア (例えば生産技術部門のエンジニア) ( できればオープンソースで) 2021/9/11 SLIDO.COM #582 362 6
  4. 構成 UI, 既存処理部 制御部への 橋渡し方法 計算・ 制御部 資産 活用 難易

    度 使用上 の制約 備考 .NET のみ .NET (WindowForms, WPF) - .NET (SciSharpを使う) ◎ ◎ △ SciSharpのパッケージで充分な場合 はこれでOK (Numpy.NET, TensorFlow.NETなど) ほかに機械学習フレームワークとしてMS のML.NETがある 有償の科学技術計算ライブラリ はいくつもある Python のみ PythonのGUIライブラリ使用 - Python × 〇 ◎ Webアプリ (フロントもPython) (Dashなど) REST API (HTTP) × △ ◎ JS + Python SPA (React, Vue.JS等) × × ◎ フロントエンドの習得コストが高い Electron (Web技術でDesktopアプリ) × × 〇 難易度は前提条件のエンジニア視点で記載 ◎易 ×難 Python 導入方法 まとめ 続く 2021/9/11 SLIDO.COM #582 362 採用案 1 使用上の制約は, 使えるPythonモジュールに制約あるか 7
  5. 構成 UI, 既存処理部 制御部への 橋渡し方法 計算・ 制御部 資産 活用 難易

    度 制約 備考 .NET + Python .NET (WindowForms, WPF) IronPython (.NETで動くPython) Python ◎ 〇 △ Pythonスクリプトがどこまで動くかは IronPyton頼み (現在は 3.4をサポー ト) Python for .NET (.NETで動くPython) ◎ 〇 ◎ DLL経由でPythonにアクセスす る.Pythonから.NETを使う(逆の場合) にはいいかも 外部プロセスとして スクリプト実行 ◎ ◎ ◎ 起動のオーバーヘッドがある。速度を気 にせず ピンポイントで使うならあり. プロセス間通信 (Socket通信以外) (共有メモリ, PIPEなど) ◎ 〇 ◎ Socket通信のほうが汎用的か. REST API (HTTP) ◎ 〇 ◎ Socket通信 (TCP/IP, UDP) ◎ 〇 ◎ 常時接続したい場合 双方向通信したい場合 WebSocket (HTTP) ◎ 〇 ◎ 採用案 2 2021/9/11 SLIDO.COM #582 362 Python 導入方法 まとめ 難易度は前提条件のエンジニア視点で記載 ◎易 ×難 使用上の制約は, 使えるPythonモジュールに制約あるか 8
  6. 案1 SciSharpを使う (Pythonを使わない) 2021/9/11 SLIDO.COM #582 362 SciSharp .NET環境で Pythonのデータサイエンス,

    機械学習フレームワークを使えるようにするプロジェクト https://scisharp.github.io/SciSharp/ (NuGetからインストール可能) Numpy.NET, NumSharp, Pandas.NET, TensorFlow.NETなどのプロジェクトが存在する 9
  7. SciSharpとPythonのコード比較 2021/9/11 SLIDO.COM #582 362 - Pythonに似た書き方ができる. - 古い.NET だと動かないので注意.

    ( >= .NET Standard 2.0 (= .NET Framework 4.6.1) ) VB.NET (Numpy.NET) Numpy.NETと比較してみた (最小二乗法) Numpy.NET : Python Numpyのラッパー ライブラリ NumSharp : 100% C# で実装された Numpy (しかしNumSharpには linalg.lstsqの実装がなかった) import numpy as np x = np.arange(0, 10, 0.1) y = 3 * np.sin(x) + np.random.normal(-1, 1, len(x)) a = np.zeros((len(x), 2)) a[:,0] = np.sin(x) a[:,1] = 1 p, res, rank, s = np.linalg.lstsq(a, y) print(f'y = {p[0]} * sin(x) + {p[1]}') 実行速度(10000回実行時, 10回平均) : Numpy.NET 2.1 秒, Python 0.5秒 Imports Numpy Dim x = np.arange(0, 10, 0.1) Dim y = 3 * np.sin(x) + np.random.normal(-1, 1, x.len) Dim a = np.zeros({x.len, 2}) a(":,0") = np.sin(x) a(":,1") = 1 Dim p = np.linalg.lstsq(a, y).Item1 Console.WriteLine($"y = {p(0)} * sin(x) + {p[1]}") Python (Numpy) 10
  8. Socket通信 (TCP/IP, UDP) (複数回データの往復がある処理、常時接続したい場合) REST API (HTTP) (I/Fが明瞭, 簡潔. 色々なWebフレームワークがあ

    りSocket通信よりも構築が楽) WebSocket (HTTP) フロントエンド バックエンド 案2 .NET + Python 制御・計算処理部 UI ・Window Forms ・WPF (XAML) ・(UWP) ユースケースに応じて 通信方式を選択する 2021/9/11 SLIDO.COM #582 362 案2の副次的効果 ・UIと演算, 制御が分離され疎結合になる ・(いつか)フロントをWebアプリにできる 既存処理 11
  9. 案2 導入のための工夫 自由度が高い分, 利用者の導入障壁を下げる工夫が必要. .NET側 - Pythonへの制御・演算要求を橋渡しするライブラリ(DLL)の提供 (HTTP, TCP/IP) -

    サンプルコード, アプリの提供 - Pythonサーバーを起動・管理するユーティリティの提供 Python側 - 計算・制御スクリプトの開発に集中できる仕組みの構築 (スクリプトをプラグイン方式で挿抜できるフレームワークの作成・提供) 2021/9/11 SLIDO.COM #582 362 12
  10. 案2 導入のための工夫 2021/9/11 SLIDO.COM #582 362 フロントエンド UI + 既存処理

    1. 実行させたい処理 (コマンド)を 引数と して橋渡しライブラ リを介して送る バックエンド ユーザー定義 スクリプト群(.py) (プラグイン形式) importlibを使った動 的importで実現でき る Pythonスクリプト実行 フレームワーク 2. コマンドを受領したら, コマンドに対応する. スクリプトを呼び出す 3. スクリプトの実行結果 をフロントに応答する 各担当者が作るのはここだけ コマンド設定 (.JSON) 橋渡しライブラリ (DLL) 13
  11. まとめ 2021/9/11 SLIDO.COM #582 362 既存アプリ資産を活かしつつ, Pythonを導入する方法を検討し2つの案を考えた. 案1 Pythonを使わず代替の.NETのライブラリを使う (SciSharpなど)

    (ライブラリの関数で充足する場合) 案2 Pythonをサーバーとして .NET から 演算・要求を送受信する 自由度が高いので工夫が必要 (もっと良い方法があったらSlidoで是非教えてください.) 終 14