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
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.6k
Privacy Sandbox on Android / DroidKaigi 2024
7pairs
1
1.2k
テキストマイニングによるプロ野球の順位予想 / Baseball Play Study 2020 Winter
7pairs
0
580
2020年の振り返りとBaseball Play Studyの振り返り / Jisyupy 29
7pairs
0
400
Because Python is there. / Jisyupy 27
7pairs
0
540
野球好きのための快適なプレゼンテーション環境の構築 / 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
ハッカソンで入賞した話 @ Findy LT
asari194617
0
1.5k
コミュニティから始まった農業IoTとの7年間 ——人との関わりが教えてくれたこと
peacemaker07
0
110
AWSとAzureのマルチクラウド活用における強い味方___AWS_Kiroを使った二刀流スキル作成.pdf
duelist2020jp
0
110
平文パスワードはログに“残り” ── 肝心の侵入は“痕跡すら残らない”
kuroneko13
0
130
アクセスキー流出時の対応で再認識した攻撃側と防御側の非対称性について
kazzpapa3
0
300
AIエージェントのためのデータ設計
daiz21
0
250
OpenID for Verifiable Credentials 実装から見えた相互運用性確保までの道のり(OAuth/OIDC Numa (Immersion) Workshop 2026)
oidfj
PRO
0
280
AI開発に用いられるHPC技術について
gpuunite_official
0
290
AWS Blocks が楽しい #ゆるWeb札幌
tacck
PRO
0
150
パスキーでドライブする アカウント統合(OAuth/OIDC Numa (Immersion) Workshop 2026)
oidfj
PRO
0
280
型落ちシンクライアント端末のPoEモジュールを自作したかった話
logica0419
0
440
VLMで2.3万枚のPyCon JP写真を検索!
terapyon
1
520
Featured
See All Featured
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
6.1k
A better future with KSS
kneath
240
18k
Code Reviewing Like a Champion
maltzj
528
40k
Building an army of robots
kneath
306
46k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.4k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1k
Making Projects Easy
brettharned
120
6.7k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
480
Thoughts on Productivity
jonyablonski
76
5.3k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.8k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
450
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Ͱμϯϩʔυ͠ͳ͍ͰͶʂ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠