lunedì 31 agosto 2015

XML con namespace

Nello standard XML è stato introdotto tempo fa il namespace, vediamo cosa è.
Un normale documento XML è un testo con dei tag, esempio:

<biblioteca>
  <libro>
     <titolo>Via col vento</titolo>
     <autore>Margaret Mitchell</autore>
     <proprietario>Mario</proprietario>
    </libro>
   <libro>
     <titolo>Pinocchio</titolo>
     <autore>Carlo Collodi</autore>
     <proprietario>Luigi</proprietario>
    </libro>
</biblioteca>


Il namespace è una complicazione, inutile, dello standard XML. Permette di aggiungere una proprietà dentro al tag. Ad esempio il proprietario invece di avere un suo tag, lo mettiamo dentro ad altri tag:

<biblioteca>
  <mario:libro>
     <mario:titolo>Via col vento</mario:titolo>
     <mario:autore>Margaret Mitchell</mario:autore>
    </mario:libro>
   <luigi:libro>
     <luigi:titolo>Pinocchio</luigi:titolo>
     <luigi:autore>Carlo Collodi</luigi:autore>
    </luigi:libro>
</biblioteca>


Livecode permette di importare i dati XML sia con i namespace, sia ignorandoli.
Per importare un XML senza namespace, facendolo diventare un array, basta usare il comando revCreateXMLTree, che crea questo array:

libro[1]
 libro[1]/titolo:  "Via col vento"
 libro[1]/autore:  "Margaret Mitchell"
 libro[1]/proprietario:  "Mario"
libro[2]
 libro[2]/titolo:  "Pinocchio"
 libro[2]/autore:  "Carlo Collodi"
 libro[2]/proprietario:  "Luigi"


mentre per averlo con i namespace bisogna usare revCreateXMLTreeWithNamespaces, che crea:

mario:libro[1]
 mario:libro[1]/mario:titolo:  "Via col vento"
 mario:libro[1]/mario:autore:  "Margaret Mitchell"
mario:libro[2]
 mario:libro[2]/mario:titolo:  "Pinocchio"
 mario:libro[2]/mario:autore:  "Carlo Collodi"


come vedete, potete gestire i namespace anche con livecode; ma io li sconsiglio, creano troppa confusione e obbligano a scrivere molto codice in più per interpretarli..

venerdì 28 agosto 2015

PhunPhysics.net

Il sito http://phunphysics.net/ è una pagina piena di applicazione per livecode create da Roger Guay.
Oggi vi mostro uno dei suoi programmi, dove crea dei grafici interattivi basati su formule matematiche:
Divertitivi a spostare la freccia per cambiare la traiettoria

Fuochi d'artificio

Grafico inteattivo
Il programma lo potete scaricare da: http://dl.dropbox.com/u/19136237/PhunPhysicsDwnLds/PhunPhysics.rev.zip

giovedì 27 agosto 2015

Disponibile livecode 8 dp3

Da poco è disponibile la nuova anteprima (DP3) di cosa sarà livecode 8. E' scaricabile da http://downloads.livecode.com/livecode/
Tra le novità maggiori abbiamo:
un property inspector con sotto menù e che tiene conto di tutte le proprietà che aggiungiamo o modifichiamo via codice.
Lo stesso vale anche per la più grande novità della versione 8: i widget. Ricordiamo che i widget, al contrario degli altri elementi di livecode, non sono modificabili. Hanno solo alcune proprietà, decise dal creatore del widget, modificabili dal property inspector o da script.
Il resto delle novità di livecode 8-DP3 riguarda solo i widget.
Questa versione di livecode è ancora molto sperimentale, consiglio di chiudere e riavviare qualunque elemento almeno un paio di volte.

martedì 25 agosto 2015

Leggere i dati EXIF di un'immagine

Se lavorate con le immagini e volete avere qualche informazione in più rispetto al semplice comando:

put the detailed files

vi conviene utilizzare la libreria gratuita per leggere i dati EXIF di Alex Tweedlyhttp://tweedly.org/showpage.lc?page=EXIFLib 
o da qui:  https://github.com/angerangel/livecodeExif
Qui vedete un esempio:
che potete scaricare cliccando qui.
L'uso è semplicissimo, basta dare in basto alla funzione exifProcessFile() il percorso completo del file, preceduto da binfile: (come tutti gli URL per file binari)  e come secondo parametro true.
Il secondo parametro serve per decidere se considerare solo i tag EXIF noti (false) oppure tutti (true).
Ad esempio:

put exifProcessFile("binfile:ImmagineVacanza.jpg", true)


vi restituirà questa lista:

Image ,Make,Research In Motion,ASCII,134
Image ,Model,BlackBerry 9700,ASCII,154
Image ,Orientation,1,Short,42
Image ,XResolution,72/1,Ratio,170
Image ,YResolution,72/1,Ratio,178
Image ,ResolutionUnit,Pixels/Inch,Short,78
Image ,Software,Rim Exif Version1.00a,ASCII,186
Image ,DateTime,2010:11:17 23:28:41,ASCII,208
Image ,YCbCrPositioning,2,Short,114
Image ,ExifOffset,228,Long,126
EXIF ,ExposureTime,0/1,Ratio,366
EXIF ,ExifVersion,0220,String,250
EXIF ,DateTimeOriginal,2010:11:17 23:28:41,ASCII,374
EXIF ,ComponentsConfiguration,,Undefined,274
EXIF ,SubjectDistance,0/1,Ratio,394
EXIF ,LightSource,Unknown,Short,298
EXIF ,Flash,Not Available,Short,310
EXIF ,ColorSpace,1,Short,322
EXIF ,ExifImageWidth,2048,Short,334
EXIF ,ExifImageLength,1536,Short,346
EXIF ,Tag a40b,,Undefined,358

Come vedete la lista è divisa in tag che riguardano l'immagine e dati solo per EXIF.

lunedì 24 agosto 2015

Laserface Jones vs Doomsday Odius

Ecco un altro esempio di come utilizzare livecode per fare videogiochi: uno sparatutto ambientato nel futuro.

Laserface Jones è disponibile per Mac a questo indirizzo: https://itunes.apple.com/it/app/laserface-jones/id651107959?mt=12
Ecco altre immagini del gioco:







giovedì 20 agosto 2015

Intelligenza artificiale: soluzione del gioco del 15

Nel post precedente abbiamo visto come creare il gioco del 15, oggi ci spingeremo ben oltre.
Il gioco del 15 è costituito da 16 pulsanti, dove il sedicesimo rappresenta lo spazio vuoto dove spostare le altre tessere, di base si può scrivere la configurazione della vittoria così:


1234
5678
9101112
13141516

che possiamo scriverla anche così:

1,2,3,4,
5,6,7,8,
9,10,11,12,
13,14,15,16


che possiamo scriverla anche così:

1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16

La sequenza di numeri che si presenta quando il gioco comincia è mescolata, il problema che mettendo le tessere a caso, non tutte le combinazioni possono essere risolte. Senza entrare troppo nel dettaglio,sappiate che per essere risolvibile un gioco del quindici, il numero di inversioni deve essere pari o dispari a seconda di alcune condizioni.
Per inversione si intende che nella sequenza scritta tutta in un unica riga, in numero piccolo viene dopo un numero grande; la casella vuota, il 16 nel nostro caso, non conta.
Ad esempio questa combinazione:

12 1102
711414
5915
81363

si scrive così:

12,1,10,2,7,11,4,14,5,16,9,15,8,13,6,3

e in questa combinazione ci sono 49 inversioni, perchè:
  • il 12 ha 11 inversioni dopo di sè
  • il 10 ha 8 inversioni dopo di sè
  • il 7 ha 4 inversioni dopo di sè
  • il 11 ha 6 inversioni dopo di sè
  • il 4 ha 1 inversioni dopo di sè
  • il 14 ha 6 inversioni dopo di sè
  • il 5 ha 1 inversioni dopo di sè
  • il 9 ha 3 inversioni dopo di sè
  • il 15 ha 4 inversioni dopo di sè
  • il 8 ha 2 inversioni dopo di sè
  • il 13 ha 2 inversioni dopo di sè
  • il 6 ha 1 inversione dopo di sè
Se il numero 16, lo spazio vuoto, si trova su una riga pari, il numero di inversioni deve essere pari; se il 16 si trova su una riga dispari, il numero di inversioni deve essere dispari.
Nell'esempio appena mostrato, il 16 si trova sulla terza riga, dispari e il numero di inversioni è dispari, quindi è risolvibile.
Nel nostro programma, quando mescoliamo alla rinfusa i numeri, dobbiamo controllare se è risolvibile. In caso contrario la via più semplice è estrarre una nuova combinazione, poichè la metà delle combinazioni ottenibile è solvibile e il computer è più veloce a generare tantissime combinazioni fino ad ottenere una solvibile, piuttosto che altri metodi.
Il codice del programma va cambiato così:

on openCard
   mescola
end openCard

on controllaVittoria
   put the soluzione of me into ordine
   repeat with i=1 to 16
      put (the loc of button i ) & cr after temp
   end repeat
   if ordine = temp then
      answer "Hai vinto!"
   end if
end controllaVittoria

on impostaVittoria
   repeat with i=1 to 16
      put (the loc of button i ) & cr after temp
   end repeat
   set the soluzione of me to temp
end impostaVittoria

on mescola
   put "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16" into temp
   put the soluzione of me into posizioni
   repeat with i=1 to 16
      put the number of items of temp into nn      
      put random(nn) into elemento
      put item elemento of temp & CR after ordineBottoni
      delete item elemento of temp #così leva anche la virgola
   end repeat   
   put itemoffset("16",ordineBottoni) into n16
   put controllasolv(ordineBottoni) into nInv
   switch n16
      case ((1 <= n16 ) and (n16 <= 4))
      case ((9 <= n16 ) and (n16 <= 12))
         #la casello vuota e' su una riga dispari
         if (nInv mod 2) is 0 then mescola
         break
      case ((5 <= n16 ) and (n16 <= 8))
      case ((13 <= n16 ) and (n16 <= 16))
         #la casello vuota e' su una riga pari
         if (nInv mod 2) is not 0 then mescola
         break
   end switch
   repeat for each line tLine in ordineBottoni
      set the loc of button tLine to the first line of posizioni
      delete the first line of posizioni
   end repeat
   exit to top
end mescola

function controllasolv seq
   put 0 into nInv
   repeat with i=1 to 16
      put item i of seq into temp
      put item (i+1) to 16 of seq into tSeq
      add inversioni(temp,tSeq) to nInv
   end repeat
   return nInv
end controllasolv

function inversioni t,seq
   put 0 into nInv
   repeat for each item tItem in seq      
      if (t > tItem) and (t is not 16) then
         add 1 to nInv
      end if      
   end repeat
   return nInv
end inversioni




Detto ciò, il numero massimo per risolvere il gioco del 15 è di 80 mosse, ma calcolare la soluzione migliore per ogni configurazione richiede una potenza di calcolo spaventosa. Nel 2005 ci volevano settimane utilizzando super computers.
Potete utilizzare varie tecniche per trovare la soluzione, ma la migliore rimane quella di utilizzare un database.
Dalla soluzione, dovete cercare di arrivare alla sequenza di partenza, ogni mossa deve essere registrata nel database almeno nel seguente modo:
n.mossasequenzasequenza precedente

In questo modo, se trovate una sequenza già eseguita, non dovete più proseguire e solo raffrontare il numero di mosse per arrivarci, per stabilire quale è la migliore. Se la nuova sequenza è già presente nel database e ci arrivate con un numero di mosse maggiore, allora non proseguite; in caso contrario cancellate dal database quella vecchia e lasciate quella nuova.
Inoltre segnare la sequenza precedente vi permette di andare a ritroso nella soluzione. Il database vi permette di trovare subito se una sequenza che è già stata elaborate precedentemente e non perde tempo nel calcolare la soluzione.
Finchè la tabella del database non raggiunge le 10'461'394'944'000 righe, voi  non avrete la certezza di trovare la soluzione col minor numero di mosse; ma di sicuro troverete una nel minor tempo di elaborazione possibile.
Ogni volta che cercherete la soluzione ad una sequenza, il database diventerà sempre più grande e la ricerca sarà sempre più veloce.
Qui trovate alcuni link interessanti:

mercoledì 19 agosto 2015

Readerly

Oggi presentiamo un'app fatta in livecode per migliorare la nostra lettura: Readerly.
Questa app, attraverso dei giochi, ci permette di migliorare velocità di lettura e apprendimento.
E' ancora in fase di test, ma è già scaricabile gratuitamente sia per Android sia per iOS registrandosi sul sito http://readerlyapp.com.

Ecco un altro esempio di programmazione con livecode.

martedì 18 agosto 2015

revIgniter

Se volete avere un server web che processi livecode per generare le pagine web (similmente al PHP), sapete già che c'è il webserver livecode scaricabile da qui: http://downloads.livecode.com/livecode/

Per questo webserver esister anche una libreria di sviluppo web chiamata revIgniter, competamente gratuita che potenzia e semplifica tantissime operazioni per il web.
Ad esempio è stato realizzato il sito web http://www.himalayanacademy.com/ con revIgniter.
revIgniter è scaricabile da questo sito: http://revigniter.com/

mercoledì 5 agosto 2015

Creare un launcher per Android

Il programmatore Hedge Hao è riuscito a creare un launcher personalizzabile per Android.
Una volta installato sul cellolare, potete scegliere quale launcher utilizzare, se quello già presente nel vostro cellulare o quello di Hedge Hao:
Avere un launcher personalizzabile con livecode, permette di creare conlivecode facilmente programmi e widget.
Ecco la prima versione del launcher:
Potete contattare il programmatore per avere una copia o per migliorare questa interessantissima app, il suo sito è: http://hedgehao.blogspot.tw/2015/07/use-livecode-to-create-android-launcher.html

lunedì 3 agosto 2015

Nascondere la barra di windows

Per nascondere la barra di windows basta usare il domando hide taskbar:


   hide taskbar




per farla riapparire basta usare show taskbar:


   show taskbar


Semplice, in questo modo potete creare programmi da mettere in pc a contatto con il pubblico, facendo sparire la barra non possono fare danni.