Slide 1

Slide 1 text

レガシーアプリで Pythonを活用する方法 の検討 HIROKI ABE 2021.09.11 # Python Charity Talks in Japan 2021 Shingen.py

Slide 2

Slide 2 text

ご質問・ご感想はぜひSlidoへお願いします 2021/9/11 SLIDO.COM #582 362 Slido #582 362 2

Slide 3

Slide 3 text

自己紹介 あべ ひろき ・メーカーで組込みソフト, 組込みLinuxアプリの設計・開発に従事. ・転職後, 別のメーカーの生産技術部門にて工場の製造・検査工程の自動化, 立上げに取り組んでいる. 2021/9/11 SLIDO.COM #582 362 3

Slide 4

Slide 4 text

私の環境には .NET(C#, VB.NET)で作られた業務アプリ(デスクトップアプリ)が 数多く存在します. (主に工場の製造・検査ソフトウェア) 特性検査では複雑な科学技術計算を使うことがあり, これらアプリ開発の際に Pythonが使えたら と思うことがしばしばあります. (Scipyなど) そこで既存資産を活かしつつ, Pythonを導入方法を検討しました. Pythonが使えるとうれしい点 ・豊富なライブラリ群 ・科学技術計算に強い 概要 2021/9/11 SLIDO.COM #582 362 Test ….. …….. 4

Slide 5

Slide 5 text

単にPythonに乗り換えると 豊富な既存資産 (.NET) が生かせない • 枯れた既存処理(ロットの処理など), .NET向けのみ提供されているDLLを 使った処理, etc (移植するにも工数がかかる) GUIをどうするか問題がある • (あくまで個人的な意見) PythonのGUIライブラリは, .NETのUI フレーム ワーク(WindowForms, WPF) と比べると作成に時間がかかる • かといってWebアプリ(React, Vue.JSなどを使用)は 生技のエンジニアに は習得コストが高い 課題 2021/9/11 SLIDO.COM #582 362 5

Slide 6

Slide 6 text

方法の検討 課題を克服して, Pythonを導入できる方法がないか検討した. Python導入方法を 一覧にまとめて比較し, 過去資産活用に重きを置いて候補の案を決めた. 担当者の前提条件: - .NETのアプリを作ることができる - 現場のデータ解析などで Pythonの使用経験がある - ソフトウェア開発が必ずしも主務ではないエンジニア (例えば生産技術部門のエンジニア) ( できればオープンソースで) 2021/9/11 SLIDO.COM #582 362 6

Slide 7

Slide 7 text

構成 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

Slide 8

Slide 8 text

構成 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

Slide 9

Slide 9 text

案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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

案2 導入のための工夫 自由度が高い分, 利用者の導入障壁を下げる工夫が必要. .NET側 - Pythonへの制御・演算要求を橋渡しするライブラリ(DLL)の提供 (HTTP, TCP/IP) - サンプルコード, アプリの提供 - Pythonサーバーを起動・管理するユーティリティの提供 Python側 - 計算・制御スクリプトの開発に集中できる仕組みの構築 (スクリプトをプラグイン方式で挿抜できるフレームワークの作成・提供) 2021/9/11 SLIDO.COM #582 362 12

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

まとめ 2021/9/11 SLIDO.COM #582 362 既存アプリ資産を活かしつつ, Pythonを導入する方法を検討し2つの案を考えた. 案1 Pythonを使わず代替の.NETのライブラリを使う (SciSharpなど) (ライブラリの関数で充足する場合) 案2 Pythonをサーバーとして .NET から 演算・要求を送受信する 自由度が高いので工夫が必要 (もっと良い方法があったらSlidoで是非教えてください.) 終 14