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
0
980
レガシーアプリで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
300
LINE_Thingsでオーダーエントリーシステムをつくってみた.pdf
hirokiabe
0
130
形態素解析で勉強会のトレンドワードを調べてみた
hirokiabe
0
380
ARCoreとSceneformでARアプリを作ろう
hirokiabe
0
970
FlashAirとLineNotifyでデバイスのIoT化
hirokiabe
0
490
Python Dashで作るインタラクティブなWebサイト
hirokiabe
2
660
Other Decks in Programming
See All in Programming
LLM生成文章の精度評価自動化とプロンプトチューニングの効率化について
layerx
PRO
2
190
A Journey of Contribution and Collaboration in Open Source
ivargrimstad
0
940
距離関数を極める! / SESSIONS 2024
gam0022
0
280
Amazon Bedrock Agentsを用いてアプリ開発してみた!
har1101
0
340
Ethereum_.pdf
nekomatu
0
460
[Do iOS '24] Ship your app on a Friday...and enjoy your weekend!
polpielladev
0
110
AI時代におけるSRE、 あるいはエンジニアの生存戦略
pyama86
6
1.2k
OnlineTestConf: Test Automation Friend or Foe
maaretp
0
110
「今のプロジェクトいろいろ大変なんですよ、app/services とかもあって……」/After Kaigi on Rails 2024 LT Night
junk0612
5
2.2k
CSC509 Lecture 12
javiergs
PRO
0
160
TypeScriptでライブラリとの依存を限定的にする方法
tutinoko
3
690
Why Jakarta EE Matters to Spring - and Vice Versa
ivargrimstad
0
1.1k
Featured
See All Featured
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
8
890
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
16
2.1k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
93
16k
BBQ
matthewcrist
85
9.3k
Build The Right Thing And Hit Your Dates
maggiecrowley
33
2.4k
Fantastic passwords and where to find them - at NoRuKo
philnash
50
2.9k
Unsuck your backbone
ammeep
668
57k
Statistics for Hackers
jakevdp
796
220k
Why Our Code Smells
bkeepers
PRO
334
57k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
131
33k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
Building Better People: How to give real-time feedback that sticks.
wjessup
364
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