Pythonista #1: Kdo jsem, proč Python a proč na iPadu

Jmenuji se Robert Vojta a s vývojem pro iOS jsem začal před deseti lety. Byl jsem součástí studia Tapmates a spolupracoval s lidmi jako Robin Raszka a Petr Reichl. Dělali jsme na zajímavých projektech v Silicon Valley, v Londýně a byla to jízda. Doba urputného „soupeření“ se studiem Inmite. Údaje o kreditní kartě jsme museli posílat faxem do Applu, iOS toho z dnešního pohledu moc neuměl, Apple byl hodně striktní, nediskutoval o ničem, házel nám klacky pod nohy… Možná si tu dobu pamatujete, možná ne, ale bylo fajn být u toho od samotného začátku.
Po pár letech jsem se přesunul do TopMonks, kde jsem pracoval na iOS aplikacích pro banky a iPad aplikaci pro Price f(x). TopMonks se postupně transformovali ve startupové studio, kde se začal líhnout zajímavý projekt jménem PurposeFly. Zaujal, a tak jsem se přidal. Naučil jsem se hodně věcí o Amazon Web Services. Skočili jsme do toho rovnýma nohama, studovali dokumentaci, učili se metodou pokus-omyl (dokumentace je moc, je nepřesná a nezmiňuje všechny možné špeky). Je to hydra a po necelých dvou letech mám stále pocit, že neumím ani zlomek toho, co AWS nabízí.

Co dělám dnes? Nic 🙂 Před necelým týdnem jsem se rozhodl, že PurposeFly opustím. Vlastně něco ano, koupil jsem si snowboard a začal se učit jezdit. Zároveň se rozhlížím po zajímavých projektech, ke kterým bych se připojil. Pokud si nezlámu ruce, budu se stále věnovat vývoji pro iOS, macOS, Pythonu a AWS.

Programování na iPadu

Zní to jako sci-fi, ale programování na iPadu je možné. Proč Python? Jednoduchý a oblíbený jazyk. První AWS SDK bylo napsáno v Pythonu, frčí na něm Instagram, používá se pro vývoj webových aplikací, vědecké výpočty a tak dále. V neposlední řadě hraje roli fakt, že neznám aplikaci, která by umožňovala to, co umí Pythonista. Volba byla jednoduchá – Python k mé maličkosti přišel sám a žádná jiná možnost nebyla.

Jako IDE (vývojové prostředí) na Macu používám PyCharm. Jezdím často do Prahy a nechtělo se mi tahat 15palcový MacBook Pro. Pythonista prošel vývojem, iOS prošel vývojem, a tak jsem si řekl, že tomu dám další šanci.

Apple pomalu, ale jistě uvolňuje pravidla, takže je možné dělat čím dál zajímavější věci. iOS 11 byl velký skok kupředu, hlavně pro iPad. Řekl jsem si, když už experiment, tak pořádný. PyCharm jsem si zakázal, naordinoval novou verzi Pythonisty a všechno začal dělat na iPadu. A ono to šlo. Kupodivu velmi dobře.

O čem to bude

Naučíme se používat Pythonistu pro psaní skriptů, které nám umožní zefektivnit práci na iPadu. Podíváme se na integraci s operačním systémem iOS, napíšeme si vlastní Today Widget, uživatelské rozhraní…

Seriál nemá za cíl vás naučit programovat v Pythonu. Existuje mnoho tutoriálů, a to i v českém jazyce. Doporučuji si jich několik proletět. Python je opravdu jednoduchý jazyk, netřeba se bát.

Co budete potřebovat

Pythonista podporuje iPad a iPhone. Velmi jednoduché úpravy dělám i na iPhonu SE, ale co si budeme povídat, ideální to není. Doporučuji iPad a jakoukoli externí klávesnici. Zvládnete to i bez ní, ale půjde to pomalu. O dostupném místě pro zdrojový kód se snad není ani potřeba zmiňovat. Srovnejte iPhone SE bez externí klávesnice a iPad Pro s Apple Smart Keyboard.

Co je to ten Pythonista?

Pythonista je plnohodnotné IDE pro iOS. Umožňuje psaní skriptů pro automatizaci každodenních úloh, her, animací, práci s grafy, manipulaci s obrázky nebo tvorbu vlastního uživatelského rozhraní. Obsahuje standardní knihovnu jazyka Python a vlastní moduly pro práci s nativními knihovnami operačního systému iOS – kontakty, upomínky, fotografie, geolokační služby a další.

Nedočkaví jedinci mohou začít studovat dokumentaci aplikace a nabízené moduly.

Python

Poslední verze Pythonisty (3.2) podporuje Python 2.7 a 3.6. Konkrétně jde o CPython – referenční implementaci jazyka Python.

Jak jsem již zmiňoval, Pythonista obsahuje standardní knihovnu jazyka Python a vlastní moduly pro snazší integraci s funkcemi operačního systému iOS. Pythonistu je možné rozšiřovat pomocí dalších balíčků z PyPI (obdoba „npm“ pro JavaScript).

Omezení

Na rovinu si řekneme, jaká omezení nás čekají. Apple nedovoluje spouštění více procesů – na multiprocessing ze standardní knihovny můžeme zapomenout. Instalace balíčků je možná, ale pouze těch, které jsou napsané v čistém Pythonu. Rozšíření napsané v C není možné nainstalovat, protože binární kód musí být podepsán a to v Pythonistovi udělat nelze.

Zásadní překážka to nicméně není, protože i tak nám nabízí nepřeberné množství možností. Pokud s tím dokážete žít, nainstalujte si Pythonistu a čtěte dál.

Poslední věc, kterou je potřeba zmínit, jsou aktualizace. Pythonista se aktualizuje jednou až dvakrát za rok. Vývoj zaštiťuje pouze Ole, který k tomu navíc vyvíjí ještě aplikaci Editorial. Na to, že vše dělá jeden člověk, jde o úctyhodný kus práce. Co to pro nás znamená a jak toto omezení obejít, si řekneme někdy příště.

První seznámení s Pythonistou

Knihovna

Knihovnu skriptů zobrazíme / skryjeme pomocí tlačítka vlevo nahoře.

Co obsahuje:

  • SCRIPT LIBRARY
    • This iPad – skripty jsou uložené v aplikaci Pythonista, nejsou dostupné z jiných aplikací.
    • iCloud – skripty jsou uložené na iCloud Drive ve složce Pythonista 3, jsou dostupné z jiných zařízení, aplikací a Macu.
  • FAVORITES – záložky na oblíbené soubory z výše uvedených míst
  • EXTERNAL FILES – záložky na soubory/složky z jiných aplikací (Open in Place)
  • Python Modules
    • Standard Library (2.7) – moduly pro Python 2.7
    • Standard Library (3.6) – moduly pro Python 3.6
    • site-packages – vaše vlastní moduly pro obě verze Pythonu
    • site-packages-2 – vaše vlastní moduly pro Python 2.7
    • site-packages-3 – vaše vlastní moduly pro Python 3.6
  • File Templates – šablony
  • Trash – smazané soubory, složky

Pro začátek doporučuji používat SCRIPT LIBRARY/iCloud. Skripty budete mít dostupné nejen na iPadu, ale i na jiných zařízeních.

Spuštění skriptu

Skript spustíte pomocí tlačítka „přehrát“ (vpravo nahoře). Pokud skript běží, tlačítko se změní na křížek a skript tak můžete předčasně zastavit. Podržíte-li prst na tlačítku delší dobu, můžete spustit testy, testy dokumentace, vybrat interpreter (2.7 nebo 3.6), případně skriptu předat vstupní parametry.

Interaktivní konzole

Interaktivní konzoli zobrazíte/skryjete pomocí klávesové zkratky CMD+J. Pokud nemáte externí klávesnici, konzole se skrývá vpravo a můžete ji „vytáhnout“ prstem z okraje obrazovky.

Konzole obsahuje výpisy a chybová hlášení ze spuštěných skriptů. Dole je vstupní řádek umožňující zadat kód v Pythonu, který se po stisknutí klávesy Enter obratem vyhodnotí (REPL).

Malá ochutnávka

Aby to nebyla jenom teorie, tak si pojďme ukázat něco jednoduchého – naplánujeme si lokální notifikaci. K tomu slouží modul notification a funkce schedule.

import notification

notification.schedule('Mrkni co je nového na iPure.cz', delay=5)

Co se stane? Za 5 sekund od spuštění skriptu dojde k zobrazení notifikace s výše uvedeným textem. Způsob zobrazení se liší podle toho, zda-li je Pythonista v popředí, nebo v pozadí. Zkrátka známé fungování notifikací v iOS.

Součástí notifikace může být i odkaz, například http://www.ipure.cz/. Po tapnutí na notifikaci se otevře Safari se zvoleným odkazem.

import notification

notification.schedule(
   'Mrkni co je nového na iPure.cz', delay=5,
   action_url='http://www.ipure.cz/'
)

Podobně jednoduše se pracuje i s ostatními moduly.

Závěr

Pythonista je opravdu mocný nástroj a pokud si chcete tvořit vlastní pracovní postupy, nemohu než doporučit jeho koupi a instalaci. Příklady z článků budou dostupné v repositáři na GitHubu.

Chcete-li vidět implementaci něčeho konkrétního, nebudete si s něčím vědět rady, založte nové issue a něco s tím v rámci možností uděláme. Mimo dokumentaci ještě doporučím fórum, kde naleznete spoustu užitečných informací a příkladů.

Komentářů:

  1. Jak v Pythonistovi nainstalovat scikit-learn a tensorflow?

    Jde nainstalovat package přímo jako clone GitHub setup install?

    Jde mít ty sítě-packages sdílené přes Dropbox?

    Dekuju moc za odpovědi!

    1. Tak to vezmem postupně …

      scikit-learn jsem nezkoušel, ale jelikož je to založené na SciPy, tak o tom pochybuji. Více informací o SciPy na fóru. Balíčky jdou, stačí si nainstalovat StaSh.

      Tam je pip (2, verze 3 zatím není) a přes něj je možné nainstalovat „jakékoli“ balíčky. Je to v uvozovkách, protože:

      to musí být pouze čistý Python,
      a i tak ne všechno funguje (většina ano), protože v Pythonistovi jsou okleštěné setup tools.

      Proč čistý Python? iOS vyžaduje aby byl binární kód podepsaný. V opačném případě ho nespustí. A to není jak udělat, proto nefunguje nic co je založeno na C, apod. Cokoli co vyžaduje C, kompilaci, podepisování, … musí přidat sám Ole (autor Pythonisty).

      Pokud je to čistý Python a pip ze StaShe nefunguje, dělám to tak, že to nainstaluju lokálně na Macu v venvu a potom to jenom zkopíruju na iPad.

      Celé site-packages jsem nezkoušel, ale nevidím důvod proč ne. Pokud máte iOS 11, je tam Open in Place (EXTERNAL FILES) v Pythonistovi = Pythonista dokáže otevřít soubor / složku z jakékoli aplikace, tj. včetně Dropboxu. A zmiňovaný StaSh obsahuje terminál, příkazy jako ln, … takže se dají dělat symbolické linky, apod. Dropbox má jenom jedno menší issue.

      Osobně nemám v This iPad nic, všechno v iCloudu a nebo na GitHubu. To zase otvírám z aplikace Working Copy.

  2. A např. scipy tedy pythonista nemá defaultně vůbec predinstalovane? Kvůli fortranovskym knihovnam? Svého času na iPadu existovalo něco, co se jmenovalo computable a to scipy obsahovalo. Jak to ti vývojáři udělali?

    1. Viz. předchozí komentář, Pythonista nemá SciPy. Důvod je prostý – Pythonista je „one man show“, SciPy není priorita a zároveň to není tak jednoduché portovat. Co vím, tak ostatní používají Pythonistu v kombinaci s Analyserem.

      Ještě k tomu tensorflow – nezkoušel jsem. Ale jsou tu aktivity jako ML-from-Scratch.

      1. Dekuju za zajimave linky.
        Jsem moc rád za článek, který jste napsal!

        Mohl byste mi prosím popsat systém práce, když má člověk adresář git projektu na kompu, řekneme v dropboxu a chce na nem pracovat z iPadu, tj psát kusy kódu, testovat kusy kódu, ukládat do git repo atd. Může v tomhle nějak Pythonista pomoct?

        Nebo je lepší nějaký “externí” editor zdrojáků (jaký byste doporučil pro iPad?), který to ukládá do dropboxu/iCloudu a vše spustitelné řešit přes ssh tunel?

        Díky za radu!

        1. Variant je několik …

          Dropbox

          V současné době nedoporučuji, protože Pythonista a/nebo Dropbox mají bug, který je popsán zde. Jinak řečeno – nejdou otevřít celé složky z Dropboxu. Kdy bude vyřešeno, no idea.

          Working Copy

          Osobně používám tohle flow. Je k tomu potřeba aplikace Working Copy.

          Kroky, které jsou potřeba provést jenom jednou:

          Otevřít Working Copy
          Naklonovat repository
          Otevřít Pythonistu
          Zobrazit knihovnu souborů (vlevo, tam kde je This iPad, iCloud, …)
          EXTERNAL FILES – Open…
          Vybrat Working Copy a otevřít celou složku s repem
          Repository se objeví v Pythonistovi v EXTERNAL FILES

          Tomuhle se v terminologii iOS 11 říká Open in Place. Doporučuji si přečíst Ticciho review. Nebo jsem to popisoval tady.

          To co je vidět v EXTERNAL FILES je tzv. bookmark, záložka. Výše uvedeným postupem dala aplikace Working Copy svolení aplikaci Pythonista zapisovat přímo do složky v aplikaci Working Copy.

          Úpravy v Pythonistovi:

          V dané složce (bookmark) můžu vytvářet soubory, složky, modifikovat existující, mazat je, …
          Jakmile chci něco commitnout / pushnout, opustím Pythonistu a udělám to ve Working Copy.
          Nezapomenout, že Pythonista edituje přímo ve složce Working Copy.

          Vzdálené úpravy:

          Dejme tomu, že jsem udělal změny a ty jsou už v repu, ale ne na iPadu.
          Otevřu Working Copy kde fetchnu, mergnu, rebasnu, …
          Otevřu Pythonistu a ty změny vidím hned
          Opět nezapomenout, že Pythonista všechno dělá ve složce v aplikaci Working Copy.

          Tohle flow předpokládá, že repo je někde na serveru.

          iCloud & StaSh

          Pak je tu druhá varianta, pokud repo není na serveru, přesunout ho do iCloudu (složka Pythonista 3). Všechno z této složky je vidět na Macu a zároveň i na iPadu v Pythonistovi (knihovna – iCloud). A pokud jste si nainstaloval StaSh, tak ten obsahuje git. Tzn. můžete commitovat, checkoutovat, … přímo v repu co je na iCloudu bez nutnosti pushovat.

          Tohle jsem nikdy nezkoušel a asi ani nebudu, přijde mi to dost dangerous – jsem závislý na tom kdy a jak to iCloud syncne a dokážu si představit, že commitnu na iPadu, na Macu, … ještě se to nesynclo a budu řešit kolize – nikoli konflikty na úrovni změn v souborech, ale konflikty na úrovni git souborů. A to asi nechcete. Spíš jenom jako ukázka, že to jde i takto.

  3. Btw, jde nějak zařídit, abych dostával upozornění, že mi někdo tady na dotaz odpověděl? Člověk by řekl, že e-mail se zadává právě proto. Díky.

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *