Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Pie Meets Py / PyCon JP 2019
Search
7pairs
September 16, 2019
Technology
6k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Pie Meets Py / PyCon JP 2019
7pairs
September 16, 2019
More Decks by 7pairs
See All by 7pairs
Pythonによる契約プログラミング入門 / PyCon JP 2025
7pairs
7
4.8k
Privacy Sandbox on Android / DroidKaigi 2024
7pairs
1
1.2k
テキストマイニングによるプロ野球の順位予想 / Baseball Play Study 2020 Winter
7pairs
0
590
2020年の振り返りとBaseball Play Studyの振り返り / Jisyupy 29
7pairs
0
410
Because Python is there. / Jisyupy 27
7pairs
0
550
野球好きのための快適なプレゼンテーション環境の構築 / Baseball Play Study 2019 Winter
7pairs
0
1.1k
ちゃんと実装してちゃんとテストしよう / PyCon mini Hiroshima 2019
7pairs
2
1.1k
テキストマイニングによる新外国人選手の分析 / Baseball Play Study 2019 Spring
7pairs
0
3.1k
テキストマイニングによる応援歌の分析 / Baseball Play Study 2018 Winter
7pairs
0
2.4k
Other Decks in Technology
See All in Technology
LambdaWebFunctionsを試してみた / exploring-lambda-web-functions
koukihosaka
1
390
Conditional PED-ANOVA: Hyperparameter Importance in Hierarchical & Dynamic Search Spaces
pfn
PRO
0
150
DBについての基礎説明(MySQL編) - コロプラ 2026年度 新卒研修
colopl
0
170
React改造してみた
tsukina_7mochi
0
150
LLM Content Moderationを支える評価・改善ループの実践
suikabar
2
310
Metadata - Section 2: Simple Metadata & Meta Tags
mohab1
0
120
Claude Code on Bedrock で統制をかける小ネタ集/claude-code-bedrock-governance-tips
emiki
1
430
フィンテック養成勉強会#68
finengine
0
230
Rustuna: Rustによる高速なOptuna実装
pfn
PRO
0
220
What Is JetBrains Air
x5gtrn
PRO
0
150
スプシの手作業からの解脱 ~更新はClaude Codeに、見せ方と使い方はGASアプリに任せる~
kentarofujii
0
190
野良MCPサーバーを排除せよ!MCPサーバーのガバナンス
yukiogawa
1
160
Featured
See All Featured
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
790
Designing for Performance
lara
612
70k
My Coaching Mixtape
mlcsv
0
360
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
460
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
740
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
640
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
860
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
2
410
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.9k
The Cost Of JavaScript in 2023
addyosmani
55
10k
WCS-LA-2024
lcolladotor
0
900
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
360
Transcript
Pie Meets Py - PythonͰAndroidΞϓϦΛͭ͘Ζ͏ 2019-09-16 (PyCon JP 2019) ୩
५
ࣗݾհ • ୩ ५ (ͤ ͡ΎΜ) • ֤छSNSͰ 7pairs Ͱ׆ಈத
• ͖ͳେࡕۅӂதଜ߶ " / ͖ͳ࢜େֶ֎࡚मଡ # • ͓ࣄͰAndroid (Java / Kotlin) / iOS (Objective-C / Swift) ͕த৺ • ͋·ΓҰൠతͱݴ͑ͳ͍Pythonͷ͍ํΛࡧ͢Δͷ͕େ͖ • PyCon JP 2018ͰTranscryptʹ͍ͭͯൃද • https://speakerdeck.com/7pairs
ஶॻ Chalice, Transcrypt, pytest, SeleneΛར༻ͯ͠ αʔόʔϨεΞϓϦΛ࣮ɾςετ͢ΔຊͰ͢ AmazonଞͰઈࢍൢചதʂ
͜ͷηογϣϯͰ͢͜ͱ • PythonʹΑΔAndroidΞϓϦͷ։ൃڥ • ֤։ൃڥͷॴɾॴ • ։ൃڥͷબͼํ
͜ͷηογϣϯͰ͞ͳ͍͜ͱ • ֤։ൃڥͰͷৄࡉͳ࣮ํ๏ • ֤։ൃڥͰͷςετํ๏
͜ͷηογϣϯͷΰʔϧ • AndroidΞϓϦ։ൃʹڵຯΛ͍࣋ͬͯͨͩ͘ • Pythonͷଟ༷ͳՄೳੑΛ͍ͬͯͨͩ͘ • ύʔςΟͰࢲ͕΅ͬͪʹͳΒͳ͍
ͳͥ “Pie Meets Py” ʁ
PieͱPyͷൃԻ (ถࠃӳޠ) • Pieʲpάɪʳ • Pythonʲpάɪθɑnʳ
Pieͱʁ • Android 9.0ͷίʔυωʔϜ • Android 1.5 (3൪ͷόʔδϣϯ) Ҏ߱
֤όʔδϣϯʹΞϧϑΝϕοτॱʹ ͓՛ࢠͷίʔυωʔϜ͕͚ͭΒΕ͍ͯΔ
Android 1.5 Cupcake
Android 1.6 Donut
Android 2.0 Eclair
Android 2.2 Froyo
Android 2.3 Gingerbread
Android 3.0 - 3.2 Honeycomb
Android 4.0 Ice Cream Sandwich
Android 4.1 - 4.3 Jelly Bean
Android 4.4 Kitkat
Android 5.0 - 5.1 Lollipop
Android 6.0 Marshmallow
Android 7.0 - 7.1 Nougat
Android 8.0 - 8.1 Oreo
Android 9.0 Pie
Android 10 • 20199݄3ϦϦʔε • PixelγϦʔζ͔Βॱ࣍৴ • ͓՛ࢠͷίʔυωʔϜ͕ഇࢭ $ •
ੈքதͷͯ͢ͷϢʔβʔ͕ ಉ͡Α͏ʹೝࣝͰ͖Δ໊લͰͳ͍ͨΊ
ͳͥPythonͰAndroid։ൃʁ
2018य़ͷϫΠক
ڝ߹ͦ͠͏ͳྖҬ • WebΞϓϦͷόοΫΤϯυ • ΫϩʔϦϯάʗεΫϨΠϐϯά • σʔλੳɾՄࢹԽ • ࣗવݴޠॲཧ
ͤʂAltJSͰCfPग़ͨ͠Ζʂ
PyCon JPʹAltJSͷηογϣϯ͕ര
2019य़ͷϫΠক
ڝ߹ͦ͠͏ͳྖҬ • WebΞϓϦͷόοΫΤϯυ • (ࣗಈ) ςετ • σʔλੳɾՄࢹԽ • ࣗવݴޠॲཧ
ͤʂAndroidͰCfPग़ͨ͠Ζʂ
PyCon JPʹAndroidͷηογϣϯ͕ര
PyCon mini HiroshimaͰൃද͠·͢
Why did you want to develop Android apps in Python
?
Because it's there.
։ൃڥ
બఆͷ݅ • ࣮ݴޠ͕PythonͰ͋Δ • ࣮༻ʹ͑ΔͰಈ࡞͢Δ • Google Play StoreʹϦϦʔεͰ͖Δ
͝հ͢Δ։ൃڥ • React Native + Transcrypt • Kivy • Chaquopy
React Native + Transcrypt
React Native • Facebook͕։ൃ͍ͯ͠ΔΦʔϓϯιʔεͷ ϞόΠϧΞϓϦέʔγϣϯϑϨʔϜϫʔΫ • جຊతʹReactͱಉ༷ͷݪཧͰಈ࡞͢Δ͕ ඳը֤OSͷωΠςΟϒAPIΛར༻͢Δ
• ࣮ʹJavaScriptΛར༻͢Δ • Android / iOS / UWPʹରԠ
Transcrypt • PythonΛJavaScriptʹม͢ΔAltJS • ެࣜαΠτᐌ͘ “subset of Python” Ͱ͋Γ
ͯ͢ͷػೳΛαϙʔτ͍ͯ͠ΔΘ͚Ͱͳ͍ • Ұ෦ͷඪ४ϥΠϒϥϦ͕ར༻Ͱ͖ͳ͍ͳͲ • JavaScriptͷॲཧΛγʔϜϨεʹݺͼग़ͤΔ • JavaScriptͷ֎෦ύοέʔδར༻Մೳ
AltJSͱͯ͠ͷPython • PyCon JP 2018ʹͯ Transcryptʹ͍ͭͯൃද͠·ͨ͠ • https://www.youtube.com/watch?v=zGqUysiC1xA&t •
https://speakerdeck.com/7pairs/pycon-jp-2018
React Native + Transcrypt • React NativeϓϩάϥϜΛ JavaScriptͰ࣮͢Δ •
TranscryptPythonΛJavaScriptʹม͢Δ • Έ߹ΘͤΕPythonͰReact Nativeͷ ϓϩάϥϜ͕ॻ͚ΔͷͰʁ
ݕূ݁Ռ • ΤϯτϦϙΠϯτ (App.js) Λআ͍ͯ ͯ͢PythonͰ࣮͕Ͱ͖·ͨ͠ʂ %
Positive ! • ιʔεͷߋ৽Λࢹͯ͠τϥϯεύΠϧ͢Ε Fast RefreshͷԸܙʹ͔͋ͣΕΔ • ܕώϯτΛ͚ͭΔ͜ͱͰ τϥϯεύΠϧ࣌ʹܕνΣοΫ͕Մೳ
TypeScriptͰेͳͷͰ &
TranscryptͷܕνΣοΫ def concat(a: str, b: str) -> str: return f"{a}-{b}"
# 33-4 concat("33", "4") # error: Argument 2 to "concat" has # incompatible type "int"; expected "str" concat("33", 4)
Negative $ • Pythonͷlambdaࣜͷ੍ݶʹਏΈ͕͋Δ • ͋ΔఔͷنͷॲཧΛॻ͖͍ͨέʔε͕ଟ͍ • JSXͷѻ͍ʹਏΈ͕͋Δ • ֎෦ͷJSXίϯύΠϥΛݺͼग़ͯ͠
ͦͷ݁ՌΛຒΊࠐΉͳͲͷখࡉ͕ඞཁ
Kivy
Kivy • Φʔϓϯιʔεͷ ϚϧνλονΞϓϦέʔγϣϯϑϨʔϜϫʔΫ • OpenGL ES 2.0ͱޓੑͷ͋Δ
άϥϑΟοΫඳըϥΠϒϥϦ • தؒݴޠKVͰͷը໘ɾΟδΣοτͷఆٛ • Android / iOS / Linux / Mac / WindowsʹରԠ
KivyʹΑΔΞϓϦέʔγϣϯ։ൃͷ͢͢Ί • PyCon JP 2017ͰͷJun Okazaki͞Μͷൃද • https://www.youtube.com/watch?v=iVOVpIXzbYY • https://www.slideshare.net/JunOkazaki1/pyconjp2017-kivy
KivyʹΑΔHello world from kivy.app import App from kivy.uix.button import Button
class TestApp(App): def build(self): return Button(text='Hello World') TestApp().run()
Buildozer • KivyΞϓϦͷAndroid / iOS͚ͷύοέʔδϟʔ • Android͚ͷύοέʔδϯάͷࡍʹ Buildozer෦Ͱpython-for-androidΛར༻ •
Ұ෦ͷPythonύοέʔδͷΠϯετʔϧʹରԠ • ඇରԠͷύοέʔδΛΠϯετʔϧ͢Δʹ recipeΛࣗྗͰ࡞͢Δඞཁ͕͋Δ
Plyer • OSݻ༗ͷػೳΛ Python͔Βར༻͢ΔͨΊͷAPI܈ • ৼಈ / Χϝϥ /
GPS ... • ରԠ͍ͯ͠ͳ͍ϓϥοτϑΥʔϜͰ NotImplementedErrorΛraise͢Δ
Plyerͷαϯϓϧ from plyer import vibrator vibrator.vibrate(10)
Pyjnius • Python͔ΒJavaͷΫϥεʹ ΞΫηε͢ΔͨΊͷϞδϡʔϧ • Plyer෦ͰPyjniusΛར༻͍ͯ͠Δ
Pyjniusͷαϯϓϧ from jnius import autoclass Context = autoclass('android.content.Context') PythonActivity =
autoclass('org.kivy.android.PythonActivity') activity = PythonActivity.mActivity vibrator = activity.getSystemService(Context.VIBRATOR_SERVICE) vibrator.vibrate(10000)
Positive ! • ϑϨʔϜϫʔΫͷઃܭࢥͱͯ͠ Ϛϧνλον͕ߟྀ͞Ε͍ͯΔ • OS͝ͱͷذ͕සग़͢Δ ͳΜͪΌͬͯϚϧνϓϥοτϑΥʔϜͰͳ͍
• ։ൃ͕׆ൃʹߦΘΕ͍ͯͯ҆৺ײ͕͋Δ
Negative $ • FlutterJetpack Compose͕ଘࡏ͢Δ ྩͷ࣌ʹ͓͍ͯ UIͷͨΊʹผͷݴޠ͕ඞཁʹͳΔͷඍົ •
ଞϑϨʔϜϫʔΫͱൺΔͱ ͯ͢ʹ͓͍ͯϫϯςϯϙಈ࡞͕͍
Chaquopy
Chaquopy • ެࣜαΠτᐌ͘ “Python SDK for Android” • build.gradleʹهड़ΛՃͯ͠ಋೖ •
Java / KotlinͷΘΓʹ PythonͰ࣮͢ΔΠϝʔδ (ࠞࡏՄೳ)
ChaquopyͰͷHello world from android.os import Bundle from android.support.v7.app import AppCompatActivity
from java import jvoid, Override, static_proxy class MainActivity(static_proxy(AppCompatActivity)): @Override(jvoid, [Bundle]) def onCreate(self, state): AppCompatActivity.onCreate(self, state) self.setContentView(R.layout.activity_main)
ࠓԶ͕ॻ͍͍ͯΔͷJava͚ͩͬʁ &
static_proxy • JavaͷclassΛҾͱͯ͠͠ JavaͷιʔείʔυΛੜ͢Δ • Activity͜ͷϝιουͷΓΛܧঝ͢Δ • XMLͳͲίʔυҎ֎͔Βࢀর͞ΕΔͨΊ
͍ͬͨΜJavaʹ͢Δඞཁ͕͋ΔͱࢥΘΕΔ
static_proxyͷαϯϓϧ # <略> class MainActivity(static_proxy(AppCompatActivity)): # <略>
dynamic_proxy • JavaͷinterfaceΛҾͱͯ͠͠ ࣮ߦ࣌ʹಈతʹJavaͷΫϥεΛੜ͢Δ • ෦Ͱjava.lang.reflect.ProxyΛར༻͍ͯ͠Δ • AndroidͰinterfaceΛଟ༻͢ΔͨΊ
ඇৗʹॏཁʹͳΔؔ
dynamic_proxyͷαϯϓϧ # <略> @Override(jvoid, [Bundle]) def onCreate(self, state): AppCompatActivity.onCreate(self, state)
self.setContentView(R.layout.activity_main) class Listener(dynamic_proxy(View.OnClickListener)): def onClick(self, view): # クリック時の処理 self.findViewById(R.id.button).setOnClickListener(Listener())
Pythonύοέʔδͷಋೖ • ΞϓϦϨϕϧͷbuild.gradleʹಋೖ͢ΔύοέʔδΛྻڍ͢Δ • ެࣜαΠτᐌ͘PyPIͷ্Ґ1000ύοέʔδத 88%ΠϯετʔϧՄೳ • ChaquopyͷαʔόʔͰҰ෦ύοέʔδͷwheelϑΝΠϧΛఏڙ •
طଘͷAndroid͚ύοέʔδͰ࣮ݱෆՄೳͳػೳΛ ఏڙ͢ΔํʹৼΓ͍ͬͯΔҹ (ݸਓͷײͰ͢)
Android্Ͱಈ͘pandas from android.os import Bundle from android.support.v7.app import AppCompatActivity from
java import jvoid, Override, static_proxy import pandas as pd class MainActivity(static_proxy(AppCompatActivity)): @Override(jvoid, [Bundle]) def onCreate(self, state): AppCompatActivity.onCreate(self, state) self.setContentView(R.layout.activity_main) url = "http://npb.jp/bis/players/81085115.html" df = pd.read_html(url)[1].query('年度 == 年度') Log.d("PyConJP", str(df['本塁打'].sum()))
ϥΠηϯεྉۚ • ΦʔϓϯιʔεͰͷར༻ແྉ • ΫϩʔζυιʔεͰͷར༻ ։ൃऀʹԠͨ͡ϥΠηϯεܖ͕ඞཁ • 1ΞϓϦͷΈ༗ޮͳϥΠηϯε $39/ਓ
• ΞϓϦແ੍ݶͷϥΠηϯε $79/ਓ
Positive ! • ಋೖ͕༰қ • Java / Pythonͷύοέʔδͱ࿈ܞ͕Մೳ • Java
/ KotlinʹΑΔΞϓϦ։ൃͷݟΛ ΄΅ͦͷ··׆͔͢͜ͱ͕Ͱ͖Δ
Negative $ • ແྉͰͳ͍ • ϓϩΩγΛ௨ͨ͠ΫϥεͷิʹਏΈ͕͋Δ • ·ΔͰJavaKotlinΛॻ͍͍ͯΔؾʹͳΔ
͓·͚
੯͘͠બ֎ • BeeWare • PySide for Android
BeeWare • PythonʹΑΔΫϩεϓϥοτϑΥʔϜ։ൃڥ • Mac / Windows / Linux /
iPhone / iPad / Android AppleTV / tvOSʹରԠ • AndroidVOCͱͷ࿈ܞͰಈ࡞͢Δ • PythonόΠτίʔυΛJavaόΠτίʔυʹม
BeeWareબ֎ͷཧ༝ • Android Studio 3ܥͰಈ࡞͠ͳ͍ • Apple༏ઌͷํΛެݴ͓ͯ͠Γ ରԠ͞ΕΔ·Ͱ͕͔͔࣌ؒΓͦ͏
PySide for Android • PySide (QtͷPythonόΠϯσΟϯά) ʹΑΔ AndroidΞϓϦ։ൃڥ •
Qtͱ͍͏࣮ͷ͋ΔGUIϥΠϒϥϦΛ AndroidͰར༻͢Δ͜ͱ͕Ͱ͖Δ
PySide for Androidબ֎ͷཧ༝ • Android্Ͱಈ͔ͤ·ͤΜͰͨ͠…… • ͠ݟΛ͓࣋ͪͷํ͕͍Βͬ͠ΌͬͨΒ ΞυόΠεΛ͍͚ͨͩΔͱ͍Ͱ͢
·ͱΊ
React Native + Transcrypt • ࣮ͷ͋ΔReact Nativeʹ͔ͬΔ͜ͱ͕Ͱ͖Δ • React NativeΛૉͷJavaScriptͰ
ॻ͍͍ͯΔͷͰ͋Ε࠾༻ͯ͠ྑ͍͔ • ೦ͳ͕ΒTypeScriptͷ༗ྗͳAltJSΛ ஔ͖͑Δ΄ͲͷΠϯύΫτ……
Kivy • ଞݴޠʹҾ͖ͣΒΕΔ͜ͱͷͳ͍ PythonicͳAndroid։ൃ͕Ͱ͖Δ • ։ൃ͕׆ൃͰࠓޙʹظ͕࣋ͯΔ • Androidʹؔͯ͠
ͷεϖοΫ͕͍͍͍ͭͯͳ͍͔
Chaquopy • ࣮༻ੑͰτοϓΫϥε • طଘͷAndroid։ൃͷࣝΛ ͦͷ··׆͔ͤΔͷେ͖͍ • ϥΠηϯεྉ͕ۚʹͳΒͳ͚Ε
༗ྗͳબࢶʹͳΔͣ
࠷ޙʹ • ʮPythonͰAndroidΞϓϦ։ൃݫ͍͠ʯ ͱ͍͏݁ʹ͢ΔͭΓͰCfPΛఏग़͕ͨ͠ ͍͍ҙຯͰཪΒΕͨ • Android StudioαΠζ͕େ͖͍ͷͰ
ձͷWi-FiͰμϯϩʔυ͠ͳ͍ͰͶʂ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠