venerdì 29 maggio 2015

Accorciare un URL

Esistono vari servizi che accorciano un indirizzo URL, come ad esempio http://tinyurl.com/, che prendono un indirizzo internet tipo:
http://livecodeitalia.blogspot.it/2015/05/aggiungere-un-correttore-ortografico-ai.html

e lo trasformano in:
http://tinyurl.com/o9pxx5v

Questo tipo di trasformazione è semplicissima in livecode e oggi vedremo come fare.
I siti che usano l'accorciamento dell'url prendono la vostra richiesta e se non è già stata fatta la numerano. Ad esempio il vostra richiesta può essere la 15'478. Fatto ciò si trasforma il numero in base 36, in modo anche un numero enorme è rappresentato da pochissimi caratteri, e in livecode la trasformazione si ottiene con la  seguente riga di codice:

put baseconvert("15478",10,36)

questo codice creai il numero BXY che in base 36 significa 15'478 in base 10 (quella che usiamo di solito per contare).
A questo punto dal numero BXY per tornare al numero originale basta usare il seguente codice:

put baseconvert("bxy",36,10)

Chiaramente in questi siti c'è dietro anche un database dove legare il numero della richiesta a l'url corretto.
Usare la base 36 rende molto piccoli numeri, ad esempio al momento esistono 968'882'453 (novecentosessantotto milioni) di siti web e in base 36 questo numero è G0UIHH. Sempre oggi al momento ci sono circa 4.7 miliardi di pagine che in base 36 si scrive 6P598G.
Come vedete, anche se si volesse indicizzare tutte le pagine di internet, il nostro url non supererebbe 6 caratteri!

giovedì 28 maggio 2015

Aggiungere un correttore ortografico ai nostri programmi

Se scriviamo un programma di elaborazione testi, ad esempio per scrivere libri, pubblicità , email, sicuramente ci serve l'opzione di avere un correttore ortografico integrato.
E' disponibile a pagamento sul sito http://www.runrevplanet.com/rrpspell.html il correttore ortografico per livecode (RRPSpell). Questo strumento ha già all'interno i vocabolari per l'inglese e l'austriaco, ma potete anche aggiungere i vostri.
Ad esempio su http://coding.napolux.com/post/42114980272/ruzzle-lista-parole-italiane sono disponibili i vocabolari italiani. Fate attenzione che RRSpell funziona solo con la versione di livecode a pagamento.
Se non vogliamo comprare il programma RRPSpell, possiamo farcelo da noi. Per fare questo, mettere in un array tutte le parole del vocabolario italiano come chiavi, e come valore true. Ad esempio:

repeat for each line riga in dizionario
   put true into arrdiz[riga]
end repeat

Poi create la seguente funzione di verifica:

function verificaParola parola
   return arrdiz[parola]
end verificaParola

Finito! Solo tre righe di livecode per fare un controllo delle parole, ed è velocissimo! Questa funzione vi risponde true se una parole è nel dizionario.

mercoledì 27 maggio 2015

libDate

Una delle funzionalità che andrebbero aggiunte a livecode sono tutte quelle funzioni per lavoare con le date, ad esempi se un anno è bisestile, fare il conto dei giorni tra due date e così via. Per fortuna la società Debril sta colamndo questa lacuna. Sul sito https://github.com/derbrill/libdate potete vedere e copiare tutte le funzioni su tempo e date, inoltre potete collaborare per aggiugnere funzioni, traduzione, guide, ecc.
Nel sito ci sono sia il codice per fare copia e incolla nel vostro programma che lo stack di esempio.
Ad esempio una delle funzioni a disposizione calcola il numero di giorni tra due date: libdate_dayBetween(anno1,mese1,giorno1,anno2,mese2,giorno2).

martedì 26 maggio 2015

Calcolare il tempo di esecuzione

Quando programmate ci sono frangenti in cui il tempo di esecuzione gioca un ruolo decisivo. Scegliere la strategia corretta tra uso di file di testo, array o database dedicati, capire se un programma segue alla stessa velocità comandi con più o meno opzioni è fondamentale.
Per sapere quanto ci mette ad eseguire un'operazione possiamo sfruttare seconds oppure milliseconds. Queste due funzioni ci danno il numero di secondi o millisecondi intercorsi 1/1/1970 all'istante in cui sono chiamate, in questo modo basta una semplice differenza per calcolare il tempo impiegato.
Ad esempio:

put the seconds into inizio
#codice da cronometrare...
put (the seconds - inizio) into tempoImpiegato
answer "Il tempo impiegato e' di " & tempoImpiegato & " secondi"

Personalmente uso i secondi, misurare le prestazioni sui millisecondi è troppo soggetto a lo stato del pc in quel momento.

lunedì 25 maggio 2015

Il terminale


Con la parola terminale, si indica quello che gli inglesi chiamano shell, cioè l'interazione diretta con il computer inviandogli direttamente dei comandi; per questo motivo molti la chiamo anche riga di comando.
Livecode ci permette di inviare dei comandi direttamente al computer con la funzione shell(). Ad esempio:

put shell("ls -l *.txt") into listaFileDiTesto

Sui sistemi Linux/Mac la shell è /bin/sh, mentre su windows è command.com, se vogliamo cambiare questa shell con un'altro inteprete basta impostare la proprietà shellcommand, esempio:

set the shellCommand to "/bin/sh/ksh"

Un altra cosa che possimo fare è interagire con le varibili di sistema utilizzando il carattere del dollaro ($). Ad esempio possiamo cambiare la variabile di sistema PATH:

put "/usr/local/bin" into $PATH

Oppure possiamo recuperare il valore delle varibili di sistema, su Windows il seguente codice:

put $temp

fornisce la seguente stringa: C:\DOCUME~1\max\IMPOST~1\Temp
ed è giusto perchè è il contenuto corretto della variabile per i file temporanei di Windows.
Su Linux/Mac vi ricordo che esistono le seguenti variabili di sistema:
  • $# tutto l'ultimo comando  (ls -l *.txt)
  • $0 il comando (ls)
  • $1 la prima opzione del comando (-l)
  • $2 la seconda opzione del comando (*.txt)
  • e così via...

    giovedì 21 maggio 2015

    mercoledì 20 maggio 2015

    Cambiare versione automaticamente

    Quando scrivete un programma e create l'eseguibile, un compito noioso è dover andare a cambiare il numero della versione del programma. Molte volte ce lo scordiamo e non si capisce più che versio stia utilizzando un dato utente.
    Con livecode avete il messaggio on StandAloneSaved che vi permette di eseguire dei comandi solo quando è creato l'eseguibile. In questo modo, ad esempio col codice seguente, anche se fate delle modifiche ma non create l'eseguibile, non c'è una modifica al numero della versione.

    Io di solito metto un campo di testo del tipo "Versione: 3" e poi uso questo codice:

    on StandAloneSaved
       put the text of field "versione" of card "principale" into temp
       put the last word of temp into numero
       add 1 to numero
       put numero into last word of temp
       set the text of field "versione" of card "principale" to temp
    end StandaloneSaved

    Nei commenti scrivetemi le vostre soluzioni in merito.

    martedì 19 maggio 2015

    Videogiochi

    Oggi vi mostro un esempio di un videogioco fatto con livecode (la versione 5):

    mi sembra che per essere solo una dimostrazione di cosa si possa fare sia impressionante, voi che dite?

    lunedì 18 maggio 2015

    Livecode, Nasdaq e l'autismo

    Livecode ha deciso di supportare una campagna per educare le persone che soffrono di autismo. Per questo motivo è stata invitata a suonare la campana di inizio scambi.
    La campagna che trovate qui: https://www.indiegogo.com/projects/empower-individuals-with-autism-through-coding

    aveva come scopo quella di educare 3'000 persone a programmare e quindi renderle utili e produttive per la società. Livecode, a seconda del livello della donazione, ha offerto corsi di formazione o abbonamenti speciali.
    La campagna si è conclusa con un bassissimo numero di adesioni, ma comunque quei pochi fondi raccolti verranno utilizzati nel modo migliore.
    A parte la campagna in sè, questo è un chiaro esempio di come una società possa fare del volontariato anche in campi molto diversi dal proprio.

    mercoledì 13 maggio 2015

    Mettere l'effetto swipe ad una app

    Quando realizziamo una app per dispositivi mobili, per risparmiarci un pulsante o per aggiungere un tocco moderno, possiamo implementare lo swipe. Con questo termine si indica il movimento di scorrimento del dito sullo schermo, di solito per passare alla scheda successiva.
    Nel nostro esempio possiamo considerare che l'utente voglia gare uno swipe quando striscia il dito sullo schermo per almeno 200 pixels. Inoltre vogliamo attivare solo se fa swipe partendo da destra verso sinistra.
    Per fare questo utilizziamo il messaggio MouseMove che ci dice le coordinate del mouse dall'angolo in alto a sinistra.
    Il codice da usare è il seguente:


    global gPosition #in questo modo questa variabile e' visibile da tutti

    on openCard
       #meglio verificare che sia vuota
       put empty into gPosition
    end openCard

    on mouseDown
       put item 1 of the mouseLoc into gPosition
    end mouseDown

    on mouseUp
       put empty into gPosition
    end mouseUp

    on mouseMove pX   
       if gPosition is not empty and 200 < (gPosition - pX) then
          put empty into gPosition
          visual effect push left
          go to next card      
       end if
    end mouseMove

    se volete lo swipe verso sinistra, al posto di (gPosition - pX) mettete (pX-gPosition). Notate infine che utilizziamo il visual effect push, per avere l'effetto di scorrimento tra una card e l'altra; potete divertirvi ad utilizzare anche altre effetti messi a disposizione dal visual effect di livecode.

    martedì 12 maggio 2015

    Ordinare e raggruppare

    Molti linguaggi di programmazione permetto di ordinare una lista, sia alfabeticamente che numericamente, nel verso che preferiamo (ascendente o discendente). La questione diventa più spinosa se non c'è una sola chiave di lettura dei dati, ma dobbiamo ordinare secondo più criteri contemporaneamente.
    Per fortuna la funzione di ordinamento di livecode (sort) e un ordinamento di tipo stabile, solo questo tipo di ordinamento permette di fare i raggruppamenti.
    Immaginiamo di avere una lista di risultati di una maratona, dove sono indicati i metri percorsi, il tempo impiegato e il nome dell'atleta:

    500,30,Mario
    500,25,Luigi
    500,25,Arianna
    600,25,Sara
    600,35,Clara
    400,10,Marco
    400,20,Alberto

    Per creare la classifica, bisogna prima mettere chi ha corso di più, poi chi ha impiegato meno tempo a parità di risultato e poi in ordine alfabetico i nomi. Quando si ordina per gruppi, ricordatevi sempre di partire dalla voce più annidata, in questo caso il codice è:



    sort classifica by item 3 of each
    sort classifica by item 2 of each
    sort classifica descending by item 1 of each


    e il risultato sarà quello voluto, cioè:

    600,25,Sara
    600,35,Clara
    500,25,Arianna
    500,25,Luigi
    500,30,Mario
    400,10,Marco
    400,20,Alberto

    lunedì 11 maggio 2015

    Mettere in sopra le altre una finestra

    Quando vogliamo porre una finestra sopra tutte le altre sulle schermo, anche non del nostro programma, bisogna impostare a true la proprietà systemwindow dello stack:

    set the systemWindow of this stack to true

    Tenete presente questa proprietà che ritorna sempre molto utile.

    venerdì 8 maggio 2015

    Hosting livecode

    Se cercare un server web che capisca il linguaggio livecode potete scaricarlo dalla pagina dei downloads sotto la voce Community Server, oppure potete appoggiarvi al servizio offerto da livecode.
    Il servizio si chiama on-rev, perchè prima livecode si chiamava revolution: la pagina con tutte le informazioni la trovate qui: http://www.on-rev.com
    Si può chiedere di avere il semplice hosting o il server dedicato.
    Il vantaggio di usare livecode anche dal lato server permette di usare sempre le stesse funzioni che conoscete o che avete già scritto per tutto. Per chi sviluppa sia su fisso, mobile e server, non dover ricominciare da zero per l'applicazione ma poter sfruttare sempre lo stesso linguaggio è un risparmio di tempo notevole.
    Il codice livecode va racchiuso dentro il tag <?lc ?> oppure il tag <?rev ?>, è indifferente.
    Ad esempio per avere una pagina che mostri la data corrente basta scrivere:

    <html>
    <?lc put the date ?>
    </html>

    Come vedete in grassetto è il classico codice livecode.
    Qui sotto avete i link degli esempi, cliccate sull'immagine per aprire la relativa guida:

    Alla seguente pagina avete tutti i video tutorial per gli esempi mostrati e altro: http://www.screencast.com/users/Runtime_Revolution/folders/On-Rev

    Questo invece è il pannello di controllo del servizio di hosting:

    mercoledì 6 maggio 2015

    Programmi statistici

    M.J. Williams
    Da questa pagina potete scaricare una serie di programmi di calcolo e analisi statistica creati con livecode,  sia per mac , sia per windows: http://www.learnpsychology.com/courses/statcourse/programs.htm
    I programmi sono stati scritti dal prof. Michael J. Williams insegnante alla Drexel University; la sua email è jw37@drexel.edu.
    Ecco alcune immagini dei suoi programmi:

    Deviazione standard
    Probabilità caduta
    Regressione
    Influenze statistiche
    Analisi distribuzioni
    Visualizzatore test T
    Calcolatrice
    Analisi varianza

    martedì 5 maggio 2015

    Espressioni regolari e le date

    I formati delle date possono essere sempre fonte di problemi, non c'è un vero standard, ogni programma le scrive secondo le proprie convenzioni. Un modo per ottenere tutti gli elementi che ci servono per riscrivere le date come preferiamo è utilizzare matchText. Grazie ad esso e la conoscenza delle espressioni regolari possiamo estrarre tutte le informazioni di una data con una sola riga di codice!
    Prendiamo ad esempio il formato di data di Apache server:

    10/Oct/2000:13:55:36 -0700

    Abbiamo la data l'ora e il fuso orario tutto diviso da  barre (/) due punti (:) e un segno (- in questo caso). Senza impazzirci possiamo scrivere:

    put matchText(ladata,"(.*?)/(.*?)/(.*?):(.*?):(.*?):(.*?) (.*?)$",tGiorno,tMese,tAnno,tOra,tMinuti,tSecondi,tFusoOrario) into errore

    in questo modo abbiamo inserito tutti i dati in variabili separate e abbiamo anche la variabile errore in caso di problemi. Per l'esattezza abbiamo:
    • tGiorno: il giorno del mese
    • tMese: il mese (in questo caso Oct)
    • tAnno: l'anno
    • tOra: l'ora
    • tMinuti: i minuti
    • tSecondi: i secondi
    • tFusoOrario: il fuso orario col segno (+ o - a seconda se in avanti o indietro)
    Questo è solo un esempio, ma si può adattare agevolmente a qualunque caso

    lunedì 4 maggio 2015

    Campi coperti dalla tastiera

    Quando si scrive un programma per mobile, Android o iOS, può succedere che la tastiera vada a coprire il nostro campo. Qui di seguito vi mostro un codice che sposta il campo sopra la tastiera, solo se non è visibile.
    Tanti campi, bisogna fare qualcosa quando appare la tastiera

    Questo codice agisce in automatico per tutti i campi nativi presenti e li sposta solo se e necessario, una volta finito di inserire i dati nel campo, esso ritorna al posto di partenza.
    Ecco il codice:
    on InputbeginEditing
       set the spostacontrollo of me to empty
       put mobilecontroltarget() into nomec #nome del controllo nativo
       put mobilecontrolget(nomec,"rect") into rectc #rect del controllo nativo
       #facciamo il controllo se si trova dentro l'area visibile
       put item 1 to 2 of rectc into altosx #angolo alto a sinistra del controllo
       put item 3 to 4 of rectc into bassodx #angolo in basso a destra del controllo
       if (altosx is not within the effective working screenrect) or (bassodx is not within the effective working screenrect) then
          set the spostacontrollo of me to (nomec & CR & rectc)
          mobilecontrolset nomec,"rect",the effective working screenrect
       end if
    end InputbeginEditing

    on inputEndEditing
       riportatuttoaposto
    end inputEndEditing

    on riportatuttoaposto
       put the spostacontrollo of me into temp
       put line 1 of temp into nomec
       put line 2 of temp into rectc
       mobilecontrolset nomec,"rect",rectc
    end riportatuttoaposto

    on keyboarddeactivated
       riportatuttoaposto
    end keyboarddeactivated

    come vedete per capire quale controllo si è attivato utilizzo la funzione mobilecontroltarget() dentro il messaggio InputBeginEditing. Questa accoppiata mi dà il nome del campo che l'utente sta digitando.
    Poi si fa una verifica se il controllo sia visibile con within. Se non è visibile memorizziamo la posizione nella proprietà personalizzata spostacontrollo. Poi spostiamo il controllo in modo da renderlo visibile cambiando la sua proprietà rect. Una volta che l'utente ha finito di inserire i dati rimettiamo tutto a posto.
    Visto che l'utente potrebbe semplicemente chiudere la tastiera, è meglio mettere il messaggio per riposizionare il controllo sia in InputEndEditing, sia in keyboardDeActivated.
    Questo codice è un esempio, potete anche aggiungere il titolo sopra il campo quando lo spostate, rendere grigio tutto il resto facendo apparire o scomparire un rettangolo grigio, magari semitrasparente.
    Un'altra strada sarebbe far scorrere tutti gli elementi, per far prima raggruppati in un gruppo, fino a rendere visibile il campo; ma richiede più codice da scrivere.
    Eventualmente nei commenti proponete altre soluzioni.