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
5.9k
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.5k
Privacy Sandbox on Android / DroidKaigi 2024
7pairs
1
1.1k
テキストマイニングによるプロ野球の順位予想 / Baseball Play Study 2020 Winter
7pairs
0
570
2020年の振り返りとBaseball Play Studyの振り返り / Jisyupy 29
7pairs
0
390
Because Python is there. / Jisyupy 27
7pairs
0
530
野球好きのための快適なプレゼンテーション環境の構築 / 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
壊して学ぶAWS CDK: そのcdk deployで消えるもの、残るもの
k_adachi_01
1
480
人とエージェントが高め合う協業設計
kintotechdev
0
750
Amplify Gen2でbackend.tsにCDKを定義する/しない事によるCDKの挙動の違いとユースケース
smt7174
1
490
StepFunctionsとGraphRAGを活用した暗黙知活用のためのRAG基盤
yakumo
0
130
設計レビューとAIハーネスで向き合う AIが生み出した新しいボトルネックの対処法 / Design Reviews and AI Harnesses Against New Bottlenecks Created by AI
nstock
4
430
Webアプリ認証の全体像 / The Big Picture of Web App Authentication
kitano_yuichi
1
420
副作用のある Lambda でも Lambda Power Tuning は使えるのか / lambda-power-tuning-side-effects
koukihosaka
1
140
変更し続けられるシステムをどう保つか — AI時代のSSoTという設計原則
kawauso
1
1.1k
【公開用】AI_Dev_Ex2026_AI_登壇資料
matsuritechnologies
PRO
1
480
仕様駆動開発、導入半年。「本当に速くなってるの?」にデータで答える / AICon2026_hirakawa
rakus_dev
0
320
そのドキュメント、自動化しませんか?
yuksew
1
410
SRENEXT_2026_Chairs__Talks_in_Tamachi.sre.pdf
srenext
1
140
Featured
See All Featured
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
2.1k
WENDY [Excerpt]
tessaabrams
11
38k
Build your cross-platform service in a week with App Engine
jlugia
234
18k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
640
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.4k
Building Flexible Design Systems
yeseniaperezcruz
330
40k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
380
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
340
Paper Plane (Part 1)
katiecoart
PRO
1
9.8k
Building Adaptive Systems
keathley
44
3.1k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
590
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Ͱμϯϩʔυ͠ͳ͍ͰͶʂ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠