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
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
スキルを作る、その前に!複数人で使われるスキルを 作るためのプロセス
junkifurukawa
2
180
Lambda MicroVMsは常駐サーバーの代わりに なるか? Kiro Crew を動かして検証してみた / Kiro Crew on Lambda MicroVMs
k_adachi_01
2
350
TiDBファミリーにDWHが新登場!! TiDB最新情報 / TiDB update 202609
yoshiakiyamasaki
0
190
【データ横丁主催】AI Agentがコンテキストを使って仕事をした後、何が残るのか― 組織の経験を次の判断に引き継ぐ「Agent Memory」
shisyu_gaku
2
320
2026-10-01_MagicPod_QAハーネスエンジニアリングとQA組織の未来像
ynisqa1988
1
420
人にやさしく、AIにやさしく、書き手を選ばないIaCのガードレール再考 / Rethinking IaC Guardrails for Humans and AI Alike
kohbis
5
2k
20260929_AmazonGuardDutyの検出通知メールにAWS DevOpsAgentの調査結果を追加する
yhana
1
410
認知負荷を吸収し、プロダクトをまたぐPR Preview基盤の設計事例
taiki45
2
570
HolmesGPTで始めるSREエージェント入門!プラットフォームの障害調査はAIにお任せ 〜
leveragestech
PRO
0
140
HacobuにおけるFDEとは/登壇資料(戸井田 裕貴)
hacobu
PRO
1
710
AIに攻撃される前に、AIに攻撃させる
tsuchikazu
0
120
Claude Designがめちゃくちゃ便利なので使ってほしい
diggymo
0
220
Featured
See All Featured
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
58k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
550
Building Applications with DynamoDB
mza
96
7.2k
The World Runs on Bad Software
bkeepers
PRO
72
12k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
910
From π to Pie charts
rasagy
1
380
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
350
GraphQLとの向き合い方2022年版
quramy
50
15k
4 Signs Your Business is Dying
shpigford
187
23k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Fireside Chat
paigeccino
43
4k
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Ͱμϯϩʔυ͠ͳ͍ͰͶʂ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠