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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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.7k
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
現場で役立つ技術負債の効果的な返済方法
masuda220
PRO
8
4k
Claude in Chrome 入門 / Introduction to Claude in Chrome
cielo1985
0
810
銀行勘定系システムにおける開発プロセス刷新×AIによる環境モダナイゼーション / Development Process Transformation and AI-Driven Environment Modernization
muit
0
2.2k
【技術的負債conf】事業成長に伴う技術的負債の説明責任とAIによるモニタリング、認知的負債について
i35_267
2
1.6k
負債のメタファと2026年 / Debt Metaphor in Agentic Engineering Age 202609 Edition
twada
PRO
5
2.4k
Screen Lens - 今見てる画面を翻訳する
komagata
0
290
ソフトウェアDNAとクラウドエージェントのススメ
cloudace
0
100
生成AIエージェントを用いた、 手動テスト手順書から自動テストへの 変換手法の検討
magicpod
0
160
顧客に向き合う開発組織へ。リアーキテクチャとフィーチャーチーム化で挑む組織改革
safie
0
1.9k
10Xに技術的負債をもたらした「2つの境界の歪み」その構造と解消への営み
10xinc
0
1.9k
SREは、MCPとAutopilotをこう使え!
kazumax55
2
800
Reactの設計論
uhyo
24
13k
Featured
See All Featured
The untapped power of vector embeddings
frankvandijk
2
1.9k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
280
Odyssey Design
rkendrick25
PRO
2
810
Six Lessons from altMBA
skipperchong
29
4.5k
The SEO Collaboration Effect
kristinabergwall1
1
560
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.6k
Prompt Engineering for Job Search
mfonobong
0
450
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.8k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
4.8k
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.8k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.3k
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Ͱμϯϩʔυ͠ͳ͍ͰͶʂ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠