Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
レガシーアプリでPythonを活用する方法の検討
Search
Hiroki.Abe
September 11, 2021
Programming
1
1k
レガシーアプリでPythonを活用する方法の検討
# python charity talks in Japan 2021
Hiroki.Abe
September 11, 2021
Tweet
Share
More Decks by Hiroki.Abe
See All by Hiroki.Abe
[信玄パイ LT] LINE Things Mini Award ハッカソン東京 参加レポート
hirokiabe
0
340
LINE_Thingsでオーダーエントリーシステムをつくってみた.pdf
hirokiabe
0
140
形態素解析で勉強会のトレンドワードを調べてみた
hirokiabe
0
420
ARCoreとSceneformでARアプリを作ろう
hirokiabe
0
1.1k
FlashAirとLineNotifyでデバイスのIoT化
hirokiabe
0
570
Python Dashで作るインタラクティブなWebサイト
hirokiabe
2
680
Other Decks in Programming
See All in Programming
MCP連携で加速するAI駆動開発/mcp integration accelerates ai-driven-development
bpstudy
0
310
実践 Dev Containers × Claude Code
touyu
1
210
Microsoft Orleans, Daprのアクターモデルを使い効率的に開発、デプロイを行うためのSekibanの試行錯誤 / Sekiban: Exploring Efficient Development and Deployment with Microsoft Orleans and Dapr Actor Models
tomohisa
0
110
kiroでゲームを作ってみた
iriikeita
0
170
UbieのAIパートナーを支えるコンテキストエンジニアリング実践
syucream
2
520
Google I/O Extended Incheon 2025 ~ What's new in Android development tools
pluu
1
290
Introduction to Git & GitHub
latte72
0
110
フロントエンドのmonorepo化と責務分離のリアーキテクト
kajitack
2
120
Portapad紹介プレゼンテーション
gotoumakakeru
1
130
あのころの iPod を どうにか再生させたい
orumin
2
2.5k
Understanding Kotlin Multiplatform
l2hyunwoo
0
260
JetBrainsのAI機能の紹介 #jjug
yusuke
0
210
Featured
See All Featured
Optimising Largest Contentful Paint
csswizardry
37
3.4k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
139
34k
Designing for humans not robots
tammielis
253
25k
The Power of CSS Pseudo Elements
geoffreycrofte
77
5.9k
Art, The Web, and Tiny UX
lynnandtonic
301
21k
Making the Leap to Tech Lead
cromwellryan
134
9.5k
YesSQL, Process and Tooling at Scale
rocio
173
14k
Reflections from 52 weeks, 52 projects
jeffersonlam
351
21k
Code Review Best Practice
trishagee
69
19k
Transcript
レガシーアプリで Pythonを活用する方法 の検討 HIROKI ABE 2021.09.11 # Python Charity Talks
in Japan 2021 Shingen.py
ご質問・ご感想はぜひSlidoへお願いします 2021/9/11 SLIDO.COM #582 362 Slido #582 362 2
自己紹介 あべ ひろき ・メーカーで組込みソフト, 組込みLinuxアプリの設計・開発に従事. ・転職後, 別のメーカーの生産技術部門にて工場の製造・検査工程の自動化, 立上げに取り組んでいる. 2021/9/11 SLIDO.COM
#582 362 3
私の環境には .NET(C#, VB.NET)で作られた業務アプリ(デスクトップアプリ)が 数多く存在します. (主に工場の製造・検査ソフトウェア) 特性検査では複雑な科学技術計算を使うことがあり, これらアプリ開発の際に Pythonが使えたら と思うことがしばしばあります. (Scipyなど)
そこで既存資産を活かしつつ, Pythonを導入方法を検討しました. Pythonが使えるとうれしい点 ・豊富なライブラリ群 ・科学技術計算に強い 概要 2021/9/11 SLIDO.COM #582 362 Test ….. …….. 4
単にPythonに乗り換えると 豊富な既存資産 (.NET) が生かせない • 枯れた既存処理(ロットの処理など), .NET向けのみ提供されているDLLを 使った処理, etc (移植するにも工数がかかる)
GUIをどうするか問題がある • (あくまで個人的な意見) PythonのGUIライブラリは, .NETのUI フレーム ワーク(WindowForms, WPF) と比べると作成に時間がかかる • かといってWebアプリ(React, Vue.JSなどを使用)は 生技のエンジニアに は習得コストが高い 課題 2021/9/11 SLIDO.COM #582 362 5
方法の検討 課題を克服して, Pythonを導入できる方法がないか検討した. Python導入方法を 一覧にまとめて比較し, 過去資産活用に重きを置いて候補の案を決めた. 担当者の前提条件: - .NETのアプリを作ることができる -
現場のデータ解析などで Pythonの使用経験がある - ソフトウェア開発が必ずしも主務ではないエンジニア (例えば生産技術部門のエンジニア) ( できればオープンソースで) 2021/9/11 SLIDO.COM #582 362 6
構成 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
構成 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
案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
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
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
案2 導入のための工夫 自由度が高い分, 利用者の導入障壁を下げる工夫が必要. .NET側 - Pythonへの制御・演算要求を橋渡しするライブラリ(DLL)の提供 (HTTP, TCP/IP) -
サンプルコード, アプリの提供 - Pythonサーバーを起動・管理するユーティリティの提供 Python側 - 計算・制御スクリプトの開発に集中できる仕組みの構築 (スクリプトをプラグイン方式で挿抜できるフレームワークの作成・提供) 2021/9/11 SLIDO.COM #582 362 12
案2 導入のための工夫 2021/9/11 SLIDO.COM #582 362 フロントエンド UI + 既存処理
1. 実行させたい処理 (コマンド)を 引数と して橋渡しライブラ リを介して送る バックエンド ユーザー定義 スクリプト群(.py) (プラグイン形式) importlibを使った動 的importで実現でき る Pythonスクリプト実行 フレームワーク 2. コマンドを受領したら, コマンドに対応する. スクリプトを呼び出す 3. スクリプトの実行結果 をフロントに応答する 各担当者が作るのはここだけ コマンド設定 (.JSON) 橋渡しライブラリ (DLL) 13
まとめ 2021/9/11 SLIDO.COM #582 362 既存アプリ資産を活かしつつ, Pythonを導入する方法を検討し2つの案を考えた. 案1 Pythonを使わず代替の.NETのライブラリを使う (SciSharpなど)
(ライブラリの関数で充足する場合) 案2 Pythonをサーバーとして .NET から 演算・要求を送受信する 自由度が高いので工夫が必要 (もっと良い方法があったらSlidoで是非教えてください.) 終 14