mercoledì 11 aprile 2018

Risolvere il bug del dizionario di livecode 9 su Linux

Su alcune distribuzioni Linux il dizionario appare bianco, c'è un bug misterioso che affligge la libreria di sqlite dbsqlite.so e al momento per risolverla c'è da aggiornare sqlite3 all'ultima versione e copiare il vecchio dbsqlite.so da livecode 8.
Quindi dopo aver aggiornato sqlite vi conviene eseguire come root, oppure con sudo i seguenti comandi:


cd /opt/livecode/livecodecommunity-9.0.0.x86_64/Externals/Database\ Drivers

mv dbsqlite.so dbsqlite.so.bak

cp /opt/livecode/livecodecommunity-8.2.0-dp-2.x86_64/Externals/Database\ Drivers/dbsqlite.so ./

cd ../../Runtime/Linux/x86-64/Externals/Database\ Drivers/

rm dbsqlite.so

ln -s ../../../../../Externals/Database\ Drivers/dbsqlite.so

venerdì 30 marzo 2018

Livecode 9.0.0-RC1

E' uscita la nuova versione di livecode: 9.0.0.rc1
ed è piena di novità!
Vediamole insieme:
  • un nuovo spinner come widget
  • OAuth2 per l'integrazione con Facebook, Google, GitHub e simili
  • funzioni per creare dei comandi stile Linux
  • quando si crea l'eseguibile, adesso tutte le finestre sono chiuse e riaperte. Così facendo ricevono i messaggi di chiusura e apertura. Tenetelo in considerazione.Per evitarlo potete usare questo codice:
    on closeStack
      if the mode of stack "revStandaloneProgress" > 0 then
       exit closesStack
      end if
    end closeStack
  • Supporto da Windows 7 in su
  • Supporto da Linux Ubuntu 14.04 in su
  • Supporto da Mac 10.9 in su
  • Supporto da iOS 6.2 in su
  • Supporto da Android 4.1 in su
  • gli stack script possono contenere un behavior
  • se esportate come HTML5, adesso potete usare più finestre
  • file e folder adesso hanno anche il parametro kind per scegliere il tipo di risultato
  • supporto ad Android AAR
  • possibilità di unire il manifesto Adnroid con altri manifesti
  • le estensioni possono appoggiarsi a librerie esterne
  • c'è il pulsante per testare i programmi in versione HTML5
  • supporto ai jar files per Android
  • supporto alla variabile CLASSPATH del sistema operativo
  • supporto migliorato per l'internet se esportato in HTML5
  • Add support for accepting socket connections on a port in the ephemeral port range
  • possibilità di parlare col javascript nei programmi esportati in HTML5
  • nuovo comando difference per gli array
  • nuovo comando symmetric difference per gli array
  • messageDigest() supporta ora anche SHA-2 e SHA-3 
  • grafica migliorata appoggiandosi a Skia (https://skia.org)
  • CTRL + . non blocca le finestre modali
  • corretto create in
  • recordformats() ritorna la lista dei formati in cui può registrare il sistema operativo
  • conversione di pacchetti Java in linguaggio livecode builder (https://github.com/livecode/livecode/blob/develop/toolchain/lc-compile-ffi-java.1.md)
  • il terminale message box è stato riscritto
  • revVideoGrabber rimane disponibile solo per Windows
  • Supporto NFC per Android
  • in livecode builder si possono indicare i permessi richiesti ad Android usando i metadata.
  • revFontLoad e revFontUnload sono stati sostituiti da start using font.
  • si possono specificare le porte per i socket
  • ora è possibile indicare il numero massimo di caratteri di un campo di testo iOS
  • una app HTML5 può chiamare il javascript
  • migliorato libURLMultipartFormAddPart.
  • tabalign è la nuova proprietà per allineare il testo in HTMLtext e StyledText
  • se scrivete in livecode builder, adesso potete utilizzare più file, uno chiamato main.lcb e gli altri nella stessa cartella con estensione lcb.
  • ora ci sono le proprietà cDeveloperExtensionsFolders e cDeveloperExtensionsActiveFolders
  • i datagrid di tipo FORM ora hanno in più l'edit mode (proprietà dgEditMode) e lo swipe più altre funzioni per modificarne le icone, l'ordinamento e far scomparire e apparire alcune parti.
  • le estensioni possono avere il proprio property inspector
  • aggiunta l'opzione che una app su iOS si chiude se il cellulare va in sospensione
  • aggiunto il build number per le app iOS, così potete inviare più volte la stessa app
Questa è solo una concisa lista di tutto quello che porta di nuovo la nuova versione.

martedì 6 marzo 2018

VFR Course Calculator

Oggi vediamo una app per iOS fatta in 3 giorni: VFR Course Calculator.
Questa app permette di calcolare la rotta degli aerei. Calcola la vera rotta, direzione e rotta magnetica, la direzione della bussola, angolo di correzione del vento, vento trasversale e vento contrario, direzione e velocità del vento, velocità dell'aria reale, variazione e deviazione. Inoltre è possibile calcolare il tempo di volo (TL) per una distanza in funzione della velocità al suolo. In base a questi valori, calcola il carburante necessario e il suo peso. Non importa quale unità usi, l'app convertirà automaticamente i dati inseriti in sistemi metrici, statunitensi e britannici.


Questa app è utile ai piloti e agli apprendisti di aerei per pianificare il tuo volo VFR in modo rapido e semplice.

Che dire, è incredibile che con livecode si possa fare così tanto in così poco tempo! 

Potete scaricarla da qui: https://itunes.apple.com/us/app/vfr-course-calculator/id954985075?mt=8

giovedì 15 febbraio 2018

Libreria per GPIO raspberryPi

Abbiamo già visto precedentemente come lavorare con i GPIO della raspberry, ma ecco il codice di una libreria che rende tutto più facile:


on Pi_gpio_init nbr dir
   /* Pi_gpio_init RaspberryPi
   Syntax:
   Pi_gpio_init nbr, dir   # Command #
   Examples:
   Pi_gpio_init 2, "in"
   Pi_gpio_init 2, "out"
   Description:
   Initialize the gpio and set the direction of the operation
   nbr is one of the gpio pins: "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,32"
   dir is "in" or "out"
   
   Source:
   Michael Doub
   Pi_gpio_init */
   /* Include
   RaspberryPi_var
   Pi_gpio_output
   */
   local cmd, direction_path
   if nbr is not among the items of good_pins then return "error: invalid pin nbr"
   if lower(dir) is not among the items of good_directions then return "error: invalid direction"
   if the platform is "Linux" then
      put ("/sys/class/gpio/gpio" & nbr & "/direction") into direction_path
      if there is not a file direction_path then
         put "echo" && nbr && "> /sys/class/gpio/export" into cmd
         get shell (cmd)
         if it is not empty then return "error:" & it
      end if
      if there is not a file direction_path then return "error:" && direction_path && "does not exist"
      open file direction_path for write
      write dir to file direction_path
      close file direction_path
   end if
   put dir into gpio[nbr][direction]
   return empty
end Pi_gpio_init

on Pi_gpio_input nbr
   /* Pi_gpio_input RaspberryPi
   Syntax:
   Pi_gpio_input nbr   # Command #
   Examples:
   Pi_gpio_input 2
   
   Description:
   Input from the gpio nbr
   nbr is one of the gpio pins: "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,32"
   
   Source:
   Michael Doub
   Pi_gpio_input */
   /* Include
   RaspberryPi_var
   Pi_gpio_init
   */
   
   local value_path
   if nbr is not among the items of good_pins then return "error: invalid pin nbr"
   if the platform is "Linux" then
      put ("/sys/class/gpio/gpio" & nbr & "/value") into value_path
      if there is not a file value_path then return "error:" && value_path && "does not exist"
       open file value_path
       read from file value_path until EOF
       close file value_path
   end if
   return it
end Pi_gpio_input


on Pi_gpio_output nbr val
   /* Pi_gpio_output RaspberryPi
   Syntax:
   Pi_gpio_output nbr, val   # Command #
   Examples:
   Pi_gpio_output 2, 1
   Pi_gpio_output 2, 0
   Description:
   Output to the gpio nbr, with value of val
   nbr is one of the gpio pins: "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,32"
   val is 1 or 0
   
   Source:
   Michael Doub
   Pi_gpio_output */
   /* Include
   RaspberryPi_var
   Pi_gpio_init
   */
   
   local value_path
   if nbr is not among the items of good_pins then return "error: invalid pin nbr"
   if val is not among the items good_values then return "error: invalid value"
   if the platform is "Linux" then
      put ("/sys/class/gpio/gpio" & nbr & "/value") into value_path
      if there is not a file value_path then return "error:" && value_path && "does not exist"
      open file value_path for write
      write val to file value_path
      close file value_path
   end if
   put val into gpio[nbr]["value"]
   return empty
end Pi_gpio_output

on Pi_to_Gert_Close
   /* Pi_to_Gert_Close RaspberryPi
   Syntax:
   Pi_to_Gert_Close    # Command #
   Examples:
   Pi_to_Gert_Close
   Description:
   This reoutine actually closes the serial port to the GertDuino.
   Source:
   Michael Doub
   Pi_to_Gert_Close */
   /* Include
   Pi_to_Gert_Variables
   */
   put false into _pi_okToRead
   wait for _pi_readrate with messages
   close file _pi_thePort
end Pi_to_Gert_Close


on Pi_to_Gert_Open pPortName, pReadrate, pBaud, pParity, pDatabits, pStopbits
   /* Pi_to_Gert_Open RaspberryPi
   Syntax:
   Pi_to_Gert_Open pPortName, [pReadrate], [pBaud], [pParity], [pDatabits], [pStopbits]    # Command #
   Examples:
   Pi_to_Gert_Open
   Description:
   Set the serial port configuration paramenters and opens the serial port to the GertDuino.
   
   Defaults:
   .    pPortName: "/dev/ttyAMA0"
   .    readrate: 10
   .    pBaud: 9600
   .    pParity: N
   .    pDatabits: 8
   .    pStopbits: 1
   
   Source:
   Michael Doub
   Pi_to_Gert_Open */
   /* Include
   Pi_to_Gert_Variables
   */
   
   if pPortName is empty then
      put "/dev/ttyAMA0" into _pi_theport
   else
      put pPortName into _pi_thePort
   end if
   if pReadrate is empty then put 10 into _pi_readrate
   if pBaud is empty then put 9600 into pBaud
   if pParity is empty then put "N" into pParity
   if pDatabits is empty then put 8 into pDatabits
   if pStopbits is empty then put 1 into pStopbits
   Put "BAUD=" & pBaud &&\
   "PARITY="& pParity &&\
   "DATA=" & pDatabits &&\
   "STOP=" & pDatabits into serial
   if the platform = "Linux" then
      set the serialControlString to serial
      open file _pi_thePort for binary update
   end if
end Pi_to_Gert_Open

on Pi_to_Gert_Start_Reading pCallbackname, pObj
   /* Pi_to_Gert_Start_Reading RaspberryPi
   Syntax:
   Pi_to_Gert_Start_Reading pCallbackname, pObj    # Command #
   Examples:
   Pi_to_Gert_Start_Reading "WeGotData", me
   Description:
   This routine starts the reading process between the Gertduino and
   the raspBerryPi. Since you must read the serial port until empty, this
   means that you must constantly have a read active on the port.   
      
      When data is actually recieved it is passed
      to pCallbackname of pObj thru the message path with a single parameter
      of the data base64encoded.
      
      Source:
      Michael Doub
      Pi_to_Gert_Start_Reading */
      /* Include
      Pi_to_Gert_Variables
      readPort_Gert
      */
      put true into _pi_okToRead
      put pCallbackname into _pi_callbackname
      put pObj into _pi_owner
      readPort_Gert
end Pi_to_Gert_Start_Reading

on Pi_to_Gert_Stop_Reading
   /* Pi_to_Gert_Stop_Reading RaspberryPi
   Syntax:
   Pi_to_Gert_Stop_Readingj    # Command #
   Examples:
   Pi_to_Gert_Stop_Reading
   Description:
   This routine stops the continious read process that is expecting data
   from the Gertdino serial port.
   Source:
   Michael Doub
   Pi_to_Gert_Stop_Reading */
   /* Include
   Pi_to_Gert_Variables
   */
   put false into _pi_okToRead
end Pi_to_Gert_Stop_Reading

on Pi_to_Gert_Write theData pDecode
   /* Pi_to_Gert_Write RaspberryPi
   Syntax:
   Pi_to_Gert_Write theData, [pDecode]    # Command #
   Examples:
   Pi_to_Gert_Write thedata
   Pi_to_Gert_Write thedata, true
   Description:
   Writes theData to the Gertduino serial port.   If pDecode is true then the data
   will be base64decoded
   Source:
   Michael Doub
   Pi_to_Gert_Write */
   /* Include
   Pi_to_Gert_Variables
   */
   if pDecode then
      write base64decode(theData) to file _pi_thePort
   else
      write theData to file _pi_thePort
   end if
end Pi_to_Gert_Write


venerdì 9 febbraio 2018

LifeTree Discipleship App

Oggi presentiamo una app scritta creata da un pastore anglicano: LifeTree Discipleship.
Si tratta di una app con video esplicativi della bibbia, commenti e riflessioni.
L'app è ben fatta, i video sono caricati dall'esterno ogni volta, quindi bisogna aspettare qualche secondo che vengano scaricati.
Questa app dimostra che anche un pastore può programmare facilmente con Livecode.
La potete scaricare da qui: https://play.google.com/store/apps/details?id=com.LifeTreeChurch.LifeTreeApp

martedì 6 febbraio 2018

Numeri causali sicuri per criptografia

Quando bisogna generare dei numeri casuali, bisogna essere sicuri che siano molto casuali. I computer generano i numeri casuali facendo dei conti, vengono chiamati pseudocasuali, ma alcuni conti possono genere dei numeri più casuali di altri.
Livecode ha la funzione random per generare numeri casuali, ma ha anche la funzione randomBytes per generare numeri causali sicuri criptograficamente.
La funzione randomBytes utilizza OpenSSL per generare i numeri casuali.

Se volete saperne di più vi consiglio di leggere qui: https://en.wikipedia.org/wiki/Cryptographically_secure_pseudorandom_number_generator

giovedì 1 febbraio 2018

Stampare su iOS

Per stampare su iOS c'è il nuovo comando RreHardcopyPrintPDF.
In pratica prima si crea un PDF e poi quel PDF verra stampato con rreHardCopy.