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
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
690
Other Decks in Programming
See All in Programming
Let's Write a Train Tracking Algorithm
twocentstudios
0
220
AI Coding Meetup #3 - 導入セッション / ai-coding-meetup-3
izumin5210
0
240
議事録の要点整理を自動化! サーバレス Bot 構築術
penpeen
3
1.6k
CSC305 Lecture 01
javiergs
PRO
1
380
エンジニアとして高みを目指す、 利益を生み出す設計の考え方 / design-for-profit
minodriven
23
11k
株式会社 Sun terras カンパニーデック
sunterras
0
180
Back to the Future: Let me tell you about the ACP protocol
terhechte
0
120
LLMとPlaywright/reg-suitを活用した jQueryリファクタリングの実際
kinocoboy2
4
660
Pythonスレッドとは結局何なのか? CPython実装から見るNoGIL時代の変化
curekoshimizu
4
1.2k
Pull-Requestの内容を1クリックで動作確認可能にするワークフロー
natmark
1
420
WebエンジニアがSwiftをブラウザで動かすプレイグラウンドを作ってみた
ohmori_yusuke
0
170
気づいて!アプリからのSOS 〜App Store Connect APIで始めるパフォーマンス健康診断〜
waka12
0
260
Featured
See All Featured
Done Done
chrislema
185
16k
Building an army of robots
kneath
306
46k
A Tale of Four Properties
chriscoyier
160
23k
Scaling GitHub
holman
463
140k
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
Learning to Love Humans: Emotional Interface Design
aarron
274
40k
The World Runs on Bad Software
bkeepers
PRO
71
11k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
YesSQL, Process and Tooling at Scale
rocio
173
14k
Build The Right Thing And Hit Your Dates
maggiecrowley
37
2.9k
Fireside Chat
paigeccino
40
3.7k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
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