iPad Pro & Raspberry Pi: come avere un perfetto strumento di sviluppo

Con l’aggiunta del supporto per mouse e tastiera, l’iPad Pro è diventato un vero sostituto di un notebook. Il tablet Apple può contare oggi su un set di applicazioni davvero invidiabili, che coprono quasi tutte le esigenze creative, dalla realizzazione di video al fotoritocco, dalla produzione di musica alla modellazione 3D.

Queste applicazioni non saranno complete come le applicazioni disponibili per i sistemi operativi desktop, ma sono tuttavia più facili e intuitive da usare grazie all’interfaccia touch e alla semplificazione di molti comandi. E’ il caso ad esempio delle app di architettura, dove l’arrivo del Lidar sul nuovo modello ha permesso di creare applicazioni capaci in pochi secondi di ricostruire la struttura di una stanza, con dimensioni precise e ingombri. Un qualcosa che oggi non si può fare un un MacBook Pro.

C’è però un “tallone di Achille”: sviluppare sull’iPad Pro non è affatto semplice. L’iPad Pro non ha, come macOS, una shell e le applicazioni in ambito sviluppo disponibili sono poche; l’unica app di sviluppo firmata Apple è Swift Playground, che però non è propriamente nata per sviluppare ma più che altro uno strumento educativo per insegnare a programmare in Swift.

E’ possibile sviluppare usando solo un iPad Pro?

La risposta è no, ammenochè non decidiate di utilizzare insieme all’iPad Pro un Raspberry Pi di quarta generazione, dotato di porta USB Type C.

Chi oggi sviluppa su web ha bisogno essenzialmente di pochi strumenti: un editor di codice, uno strumento di controllo di versione come Git, un client per spostare e muovere file e un altro client per connettersi ad un server in remoto. Rispetto ad un tablet come Surface, che può contare sul Subsystem di Linux all’interno di Windows 10, l’iPad non ha nulla di tutto questo. 
Ci sarebbe I.sh, ancora in beta, un emulatore che porta la shell di Linux su iOS e iPad OS, tuttavia è un prodotto limitato e immaturo.

Immagine per post

Ci sono così due possibilità. La prima è quella di collegarsi ad un server esterno, ad esempio un server in cloud come quelli forniti da Digital Ocean: servono pochi dollari al mese per creare una istanza di Ubuntu o della propria distribuzione linux preferita alla quale collegarsi usando l’iPad, sfruttando una applicazione terminale. Questa soluzione presuppone tuttavia la presenza di una connessione di rete: durante un viaggio in aereo il nostro ambiente di sviluppo sarà irraggiungibile, è da qualche parte su un server in remoto.

Per la seconda possibilità ci viene in aiuto il Raspberry: il piccolo computer ARM (costo circa 60 euro) nella sua ultima versione è il compagno perfetto per l’iPad Pro. Con una configurazione minima può infatti essere trasformato in quello che viene chiamato Linux USB Gadget, ovvero una periferica che si collega alla porta USB Type C dell’iPad Pro e oltre a ricevere alimentazione abilita una serie di servizi.

Il servizio che a noi serve è il collegamento di rete: in pochi passaggi il Raspberry Pi 4 si trasforma in un hub da collegare all’iPad Pro, che condivide dati con l’iPad e che può essere sfruttato per collegare all’iPad dischi esterni tramite USB o addirittura la rete ethernet.

Possiamo collegare i dischi USB all’iPad come dischi esterni, anche con file system NTFS

Il primo passaggio per dar vita a questo strana joint venture iPad – Raspberry è scaricare su una memoria microSD la distribuzione più diffusa per il Raspberry, Raspbian. Abbiamo deciso di usare la Raspberry Pi OS (32-bit) Lite, senza quindi ambiente desktop: non abbiamo bisogno del desktop linux.

La scelta di Raspbian è ovviamente soggettiva: preferiamo le distruzioni a base Debian, ma quello che abbiamo fatto si può fare con un minimo di conoscenze anche su altre distribuzioni.

La procedura presuppone ovviamente un minimo di conoscenza di Linux: chi sviluppa su web dovrebbe averla, ed è per questo che non andremo a inserire le istruzioni passo passo per trasformare il Raspberry in un Linux USB Gadget, ma vi diciamo che procedura abbiamo seguito. Le istruzioni per ogni singolo step sono facili da reperire online.

  • Abbiamo collegato il Raspberry, senza monitor, ad una rete Wi-fi per avere un indirizzo IP. Lo abbiamo fatto creando sulla scheda microSD nella partizione di boot di Raspbian il file “wpa_supplicant.conf” con all’interno i dati della nostra rete. Online è possibile trovare un esempio di questo file da modificare a seconda della propria configurazione.
  • Abbiamo creato un file vuoto chiamato ssh sulla card, sempre nella partizione di boot: in questo modo il Raspberry abilita il server SSH.
  • Ci siamo connessi tramite ssh da un computer accedendo con l’utente di default, user “pi” e password “raspberry”. Il consiglio è ovviamente quello di eliminare questo utente e creare un utente proprio.
  • Abbiamo seguito questa procedura per trasformarlo in USB Gadget.

Fatto questo si può collegare il Raspberry all’iPad Pro tramite il cavo USB Type C che viene dato da Apple nella scatola dell’iPad, quello per la ricarica, e dopo pochi secondi apparirà la connessione di rete ethernet subito sotto la rete Wi-fi nel menu impostazioni dell’iPad.

Utilizzando dnsmasq, un pacchetto open source che fornisce un servizio di cache DNS e di server DHCP, viene assegnato all’iPad un indirizzo IP. Il Raspberry è il router.

Un ultimo passaggio che consigliamo è l’installazione di Samba: installando Samba sul Raspberry viene attivata la condivisione dei file sulla rete creata tra iPad e Raspberry.

File, il browser integrato in iOS e in iPadOS, si può collegare ai server Samba pertanto questa operazione ci permette di avere sotto controllo l’intera struttura file della nostra cartella utente, quella dove teniamo i vari progetti. Nel nostro caso tutte le applicazioni a cui lavoriamo sono nella cartella “progetti” all’interno del nostro spazio “home/robypez”.

Sempre più applicazioni integrano File. Noi abbiamo aggiunto la condivisione Samba a File connettendoci al nostro Raspberry

C’è un’alternativa a Samba: gli sviluppatori di Working Copy (il miglior client GIT che si possa avere su iPad e iPhone) hanno creato Secure Shellfish, un’altra bellissima app che permette di gestire i file del Raspberry tramite connessione SFTP, quindi un FTP sulla porta SSH.

Installando questa applicazione, il contenuto delle cartelle del Raspberry viene visto dall’app File, e può essere gestito come se fosse un normale FTP.

La stessa cosa vale ovviamente per lavorare su server esterni, come quelli di produzione: Secure Shellfish, come gli altri client SSH di cui parleremo sotto, possono gestire accesso con chiavi SSH e funzionano come ogni altro client secure shell esistente oggi.

Secure Shellfish è un FTP tramite SSH Tunnel che ci permette di copiare e scambiare file con server esterni e con il nostro Raspberry

Fatto tutto, e ora cosa posso farci?

Ogni persona ha ovviamente il proprio workflow di lavoro, e iniziando a lavorare con questo setup potrà capire come meglio gestire tutto ottimizzandolo a seconda delle proprie esigenze.

Ci sono due possibilità: la prima è tenere il codice sul quale si sta lavorando sull’iPad Pro, la seconda è tenere il codice sul Raspberry. Nel secondo caso non avremo però accesso al codice senza il piccolo server collegato, quindi abbiamo fatto una scelta che unisce il meglio delle due cose.

Una delle primissime applicazioni che un utente dovrebbe scaricare sull’iPad Pro è Working Copy: Working Copy è un bellissimo client Git che permette di gestire la versione delle nostre applicazioni o dei siti in sviluppo appoggiandosi anche a servizi come GitHub, GitLab o BitBucket.

Working Copy è perfettamente integrata con il File Manager dell’iPad; questo vuol dire che tutti i repository e tutte le cartelle contenenti i progetti di lavoro saranno accessibili anche da altre applicazioni. L’editor di codice, l’FTP, lo Zip: tutti vedranno e avranno accesso alla cartella con i nostri progetti.

Working Copy permette di tenere la directory di ogni repository sincronizzata con la cartella sul Raspberry: non dobbiamo mai più copiare un file

Working Copy integra anche un editor di codice base, che va bene per una correzione volante, per il markdown, per i commenti, ma non per sviluppare.

Questo client git ha un’altra funzione che risulta ben più utile dell’editor: utilizza File di iOS per tenere sincronizzate le cartelle remote.

Questo vuol dire che possiamo attivare una sincronizzazione continua dei progetti, l’intera cartella, tra l’iPad e il Raspberry sfruttando la connessione Samba suddetta: ogni volta che viene modificato un file sull’iPad, questo file viene modificato e replicato anche nella cartella del Raspberry in automatico.

L’editor di testo di Working Copy è valido ma limitato

Passiamo al prossimo step, l’editor di codice. Ce ne sono svariati e sono tutti eccellenti, da Coda di Panic a Kodex, il nostro consiglio è quello di dotarsi di Textastic Code Editor 9: costa 10.99 euro ma ne vale molti di più.

Textastic si integra perfettamente con File e con Working Copy: si può lavorare sull’iPad Pro tenendo nella colonna di destra, in “Split Screen”, il client Git mentre modifichiamo il codice sulle schermata principale. Oppure, lo vedremo sotto, codice più shell.

Le cartelle dei progetti possono essere aperte su Textastic da Working Copy in Drag & Drop, basta trascinarle: per ogni file che modifichiamo usando l’editor di codice (supporta oltre 80 linguaggi di programmazione e evidenzia la sintassi) la versione modificata viene salvata nella cartella controllata da Working Copy.

Restano quindi anche le modifiche precedenti memorizzate (d’altra parte è git) e se il Raspberry è collegato le modifiche vengono propagate direttamente sul nostro piccolo server web portatile.

Quello che abbiamo ottenuto un sistema dove abbiamo il pieno controllo del codice da noi scritto, con le revisioni e la gestione dei repository: il codice è su GitHub (nel nostro caso), scaricato in locale sull’iPad Pro e sincronizzato con il Raspberry che è il nostro server portatile. Resta solo un ultimo passaggio: il Rspberry andrà a questo punto configurato per poter lavorare come server.

Il Raspberry Pi 4 come server web

Nel caso di sviluppo web, si tratta solo di configurare il Raspberry come se fosse un normale server Linux, con la differenza che mentre i server Linux hanno un processore x86 il Raspberry ha un processore ARM. Non tutte le librerie e non tutti gli strumenti che si usano abitualmente in ambito desktop potrebbero essere disponibili.

Si possono installare i server web più comuni, Apache e NGINX, ci sono sia MySQL che PostgreSQL, MongoDB, Redis, c’è un enorme assortimento di librerie e pacchetti. Non c’è però la certezza di avere tutto: il porting per Raspberry di un paio di librerie che usiamo al momento non esiste.

Sul Raspberry si installano senza difficoltà anche Ruby & Rails, Vue, Node.js e la maggior parte delle utility che si usano in ambito web.

L’installazione dell’ambiente server dev’essere ovviamente fatta collegandosi al Raspberry, e per farlo usiamo un classico client SSH. Per iPad ci sono diverse scelte come Termius e BlinkShell.

La scelta migliore che si possa fare a nostro avviso è BlinkShell, un progetto Open Source dove l’applicazione, da scaricare dall’AppStore, costa 21.99 euro.

Termius è un altro client SSH eccellente come interfaccia grafica e usabilità, tuttavia viene venduto con un modello “subscription”, si paga ogni mese o si paga l’abbonamento annuale. Preferiamo spendere 21.99 euro una volta sola e toglierci il problema per sempre.

Nel nostro caso abbiamo usato la connessione USB Type C tra iPad e Raspberry, che prevede sia l’alimentazione sia la connessione di rete grazie alla funzione Gadget. Avendo il server collegato via cavo non abbiamo mai avuto alcun problema di connettività: è una rete locale.

Nel caso in cui si scelga di usare un server Linux vero, ad esempio noleggiando una macchina virtuale su Digital Ocean, il nostro consiglio è quello di installare Mosh sul server.

Mosh è un pacchetto che permette ad un client di collegarsi ad un server su connessioni poco stabili, come ad esempio quelle 4G o 3G. Chi ha provato a usare un client SSH con una connessione di pessima qualità, si sarà reso conto che il ritardo dovuto alla comunicazione (lag) o le interruzioni possono creare diversi problemi.

Mosh è nato per risolverli: oltre a tenere una connessione stabilissima, Mosh mantiene la connessione tra client e server anche se si cambia IP, e soprattutto il processo resta attivo anche se ci sconnettiamo per problemi di rete e ci riconnettiamo successivamente.

Sia BlinkShell che Termius prevedono la scelta di connettersi usando il classico SSH, scelta preferibile rispetto a Mosh se si usa il cavo perché tramite ssh possiamo richiamare gli ultimi comandi digitati grazie alla history, cosa che su Mosh non si può fare. Mosh ha tuttavia enormi vantaggi se il server di appoggio è in cloud e ci si collega in mobilità.

In side by side su iPad: a sinistra il codice, a destra il terminale aperto sul Raspberry

Debug limitato a Safari, ma c’è un ispector completo

Una volta installato un server sul Raspberry, i nostri progetti web saranno visibili dal browser Safari dell’iPad Pro utilizzando l’indirizzo IP del Raspberry. Chi sviluppa su web è consapevole tuttavia di quanto sia importante avere un web inspector, o uno strumento che permetta di verificare in tempo reale errori javascript, problemi di chiamate client server o problemi di stile.

Il browser su iOS ha però un grosso limite da evidenziare per chi sviluppa: che si tratti di Safari, di Chrome o di Firefox tutti i browser usano lo stesso motore WebKit e questo vuol dire che su iPad non si potrà verificare che un sito si veda correttamente con i diversi browser, cosa questa indispensabile per ogni sviluppatore web. Lo stiamo verificando ma su Safari Mobile, anche se è aperto Chrome.

Tuttavia si possono risolvere il grosso dei problemi, e per farlo esistono diversi Web Inspector: il migliore è Inspect Broswer, che ha quasi tutto quel che serve per un lavoro in mobilità da integrare, con i giusti tempi, quando si ha davanti un browser desktop vero che ci permetterà poi di provare anche gli altri browser.

Inspect Browser permette di modificare i fogli di stile, di simulare i breakpoint dei siti responsive e di verificare tutte le comunicazioni tra client e server, con la ovvia e fondamentale console javascript.

contattaci