lunedì 28 novembre 2016

Generatore di chiavi per app

Il programmatore Kroka ha rilasciato il programma per generare facilmente e velocemente della chiavi valide per poter firmare le nostre app, un requisito obbligatorio per pubblicare le app su siti Google Play Store o SlideMe. Chiaramente questo programma lo ha fatto con livecode:

Ecco i link dove scaricarlo:
Per poterlo contattare potete scrivergli sul forum cliccando qui.

venerdì 25 novembre 2016

Cache di un'immagine

Quando creiamo un programma con delle immagini, senza che ce ne accorgiamo, al momento di visualizzare le immagini il nostro programma deve scompattarle dal formato utilizza (JPG, PNG, GIF, ecc.) e trasformarle in un dato pronto all'uso per lo schermo.
L'immagine scompattata pronta all'uso viene messa nella memoria cache.
Possiamo impostare la dimensione della memoria di cache con le immagini impostando la proprietà ImageCacheLimit. Il valore preimpostato per i sistemi mobili (Android, iOS) è 64Mb, mentre per i computer è 254Mb.
Se la cache si riempie, i dati più vecchi vengono cancellati per far spazio ai nuovi. Svuotare e riempire la cache rallenta il programma, quindi per avere delle prestazioni migliori, se usate tante immagini, valutate quanto vi serve grande la cache.
Per sapere quanto è piena la cache potete leggere la proprietà imageCacheUsage, che restituisce il valore in bit. Ad esempio 268435456 è 256Mb (basta dividere 1'048'576 per ottenere il valore in MegaByte).
Se volete che sia subito decompattata nella cache all'apertura della card, potete impostare la proprietà alwaysBuffer su true. Anche qui fate attenzione a non esagerare.
Se un qualunque momento volete forzare delle immagine a essere caricate nella cache, potete usare il comando prepare image.

giovedì 24 novembre 2016

Ordinare a caso una sequenza

Oggi vedremo una peculiarità del comando sort  molto sottovalutata.
Come esempio creiamo una sequenza e ordiniamola in modo casuale:
put "1,2,3,4,5,6" into temp
sort items of temp by random(6)

nell'esempio il codice usa comando sort con la funzione random(). Il comando sort per ogni elemento chiede ogni volta alla funzione dopo la parola by il valore per l'ordinamento. Poichè random() è una funzione che estrae un valore casuale, nell'esempio da 1 a 6, l'ordine dei numeri sarà casuale.
Questo sistema è comodissimo nel caso di estrazioni di numeri casuali, perchè creiamo prima l'elenco dei numeri gli ordiniamo a caso e prendiamo i primi n che ci servono!
Rispetto a tanti altri modi per estrarre dei numeri casuali, non dobbiamo fare alcuna verifica se il numero estratto è già contenuto nei numeri generati precedentemente.
Al posto di random() si può usare un funzione personalizzata e ottenere ordinamenti con logiche molto complesse.

mercoledì 23 novembre 2016

Rimuovere elementi duplicati

Molte volte ci capita di avere a che fare con una lista che contiene duplicati, qual è il modo più veloce per rimuovere i duplicati? Semplice passare per un array!
Ecco come in poche righe di codice si possono eliminare le linee duplicate di un testo, e potete applicare lo stesso codice anche ad altre code (parole, numeri, ecc.); per esempio la variabile theList contiene la lista da cui eliminare i doppioni:

split theList by return and return
combine theList by return and empty
delete the last char of theList

Vediamo che succede:
  • Il comando split trasforma la variabile theList in un array
  • l'array conterrà una cella per riga
  • ogni cella conterrà cosa c'è dopo il primo carattere di accapo (cioè nulla, visto che gli stiamo dando in pasto una riga alla volta)
  • ogni cella avrà un'etichetta pari al testo della riga.
  • Poichè non possono esistere due celle con la stessa etichetta, in questo modo si eliminano le righe uguali.
  • il comando combine rimette insieme le righe
  • poi eliminiamo l'ultimo carattere di accapo
Semplice, geniale e velocissimo. Che ne dite?

giovedì 17 novembre 2016

Livecode per FileMaker

Livecode ha appena lanciato una versione specificatamente creata per supportare il database FileMaker. Per ora è in versione beta.
Potete provarla per Mac gratuitamente da questa pagina: https://filemaker.livecode.com/
Tra le altre cose contiene:
  • integrazione con google drive
  • possibilità di selezionare, mostrare e editare solo alcune parti di un PDF
  • Cattura video da webcam

lunedì 14 novembre 2016

Risolvere il problema del browser e del dizionario in livecode 8 e 9

Finalmente è stato capito dove sia il problema che affliggeva livecode dalla versione 8 per quanto riguardava il browser e il dizionario su Linux.
Su questo sistema operativo, infatti, sia il dizionario che il widgert borwser rendevano inutilizzabile livecode.
Poichè entrambi sono basati su Chromium, l'utente Saa  ha scoperto che lo stesso bug affligge Steam su linux (che sia basato su livecode?) e gli utenti linux hanno trovato una soluzione. Prima di avviare livecode su linux, prima bisogna impostare le varabile LC_ALL e LC_NUMERIC su C.
In pratica, per lanciare livecode 8 o livecode 9 su linux, bisogna scrivere:

LC_ALL= LC_NUMERIC=C
/opt/livecode/livecodecommunity-9.0.0-dp-1.x86_64/livecodecommunity.x86_64


E tutto funzionerà perfettamente:

venerdì 11 novembre 2016

Python Vs Livecode

In giro ho trovato il seguente script python per aggiungere la filigrana (watermark) al centro di un'immagine:
import sys
import os
import Image

def modifica(filename, watermarkname):
        photo = Image.open(filename)
        watermark = Image.open(watermarkname)

        Pwidth = photo.size[0]
        Pheight = photo.size[1]

        Wwidth = watermark.size[0]
        Wheight = watermark.size[1]

        x = (Pwidth/2)-(Wwidth/2)
        y =  (Pheight/2)-(Wheight/2)

        photo.paste(watermark, (x, y), watermark)
        photo.save(filename.split(".")[0]+"_watermark.jpg")



if len(sys.argv) < 3:
    print "Esempio d'uso: python watermark.py foto.jpg watermark.png"
    sys.exit()

foto = os.path.abspath(sys.argv[1])
watermark = os.path.abspath(sys.argv[2])

if os.path.isdir(foto):
    for file in os.listdir(foto):
        modifica(foto+"/"+file, watermark)
else:
    modifica(foto, watermark)

Sono 28 righe di codice abbastanza semplice da capire.
In livecode si può fare come puro script con:

on OpenCard
   if $# <> 3 then
      put "Esempio d'uso: livecode -ui watermark.livecode foto.jpg   watermark.png"
      quit 64 #command line usage error
   end if
   import paint from file $2
   set the name of last image to watermark
   if last char of $1 is "/" then
      set the defaultFolder to $1
      put files() into lista      
   else
      put $1 into lista
   end if   
   repeat for each line tFile in lista
      applicaW tFile
   end repeat
   quit
end openCard

on applicaW tFile
   import paint from file tFile
   set the name of last image to foto
   set the loc of image watermark to the loc of image foto   
   set itemdel to "."
   put item 1 of tFile into tFile
   export snapshot from rect (the rect of image foto) of this card to file ( tFile & "_watermark.jpg") as JPEG
   delete image foto
end applicaW

Circa 27 righe. La gestione della posizione è più semplice in livecode, perchè la proprietà loc è il baricentro dell'oggetto e basta farli coincidere per mettere al centro di un'immagine la filigrana.
A sfavore del Python è il sistema di gestione dei blocchi di codice solo su indentazione, è un attimo fare degli errori. Al contrario in Livecode è l'indentazione è automatica, e i cicli sono racchiusi da delimitatori ben chiari tipo ON/END.
Voi che ne pensate?

giovedì 10 novembre 2016

Bash Vs Livecode

Ho trovato in giro il seguente script bash per catturare tutti i riferimenti esterni:

#!/bin/bash
pagina=$1
if [ ${pagina:0:4} = "http" ]; then
  #web
  curl $pagina | grep -o 'href=['"'"'"][^"'"'"']*['"'"'"]' | sed -e 's/^href=["'"'"']//' -e 's/["'"'"']$//' >> links.txt
else
  #locale
  less $pagina | grep -o 'href=['"'"'"][^"'"'"']*['"'"'"]' | sed -e 's/^href=["'"'"']//' -e 's/["'"'"']$//' >> links.txt
fi

Sono 7 righe di codice (ignorando i commenti). In pratica prende quello che c'è dopo "href=", solo che l'espressione di grep e sed sono veramente difficili da comprendere.
Ho provato a farlo in livecode e il risultato è questo:
 
put $1 into indirizzo
#web o locale?
if (char 1 to 4 of $1) is not "http" then put "file:" before indirizzo
put url indirizzo into pagina
set itemdel to "="
put the number of items of pagina into nn
repeat with i=1 to nn
   if (char -4 to -1 of item i of pagina ) = "href" then put word 1 of item (i+1) of pagina & return after listaLink
end repeat
put listaLink


Sono 9 righe, solo due di più di bash, ma forse molto più chiare. Voi che ne dite?

mercoledì 9 novembre 2016

Behavior concatenati

In livecode è possibile associare a più oggetti lo stesso codice. Questa operazione è fatta con il behavior.
Alcune delle novità delle ultime versioni consistono nel poter assegnare dei behavior concatenati e il codice del behavior può essere scritto sia nei pulsanti, sia nelle card.
La possibilità di concatenare i behavior riduce ancora di più le righe di codice necessari per scrivere un programma.
Un oggetto può avere del codice, ma se ha anche un behavior, poi esegue anche il codice del behavior e i messaggi passati col comando pass. Se anche l'oggetto contenete il codice behavior ha un behavior anch'esso, anche quest'ultimo passerà i messaggi al behavior successivo se vengono passati con pass.
Ecco un esempio:

venerdì 4 novembre 2016

Il dizionario su Linux 32 bit è tornato a funzionare

Il dizionario di Livecode dalla versione 8 è diventato una pagina HTML+Javascript, non è più un programma incorporato su livecode. Sfortunatamente su linux non ha mai funzionato.
Ora nella versione 9 almeno su Linux 32bit è tornato a funzionare!
Vi allego una schermata:
Se avete un linux a 64 bit potete utilizzare la guida non ufficiale: http://livecode.wikia.com/wiki/Livecode_Wiki
ha un motore di ricerca che funziona come (o meglio) del dizionario. Inoltre potete correggere o aggiungere voi stessi voci o guide.