venerdì 11 agosto 2017

Livreria QR code dentro livecode

A partire dalla versione 9dp8 (disponibile) la libreria per i codici QR è inclusa in livecode, anche per le versioni gratuite.
Abbiamo a disposizione :

giovedì 10 agosto 2017

Libreria Dropbox dentro livecode

Ora livecode contiene delle librerie per lavorare con Dropbox, sono state rese disponibili per tutti, anche per la versione gratuita, a partire da livecode 9 dp8.

Guardate qua quante sono (48) : http://livecode.wikia.com/wiki/Category:Dropbox

mercoledì 9 agosto 2017

I colori

I colori possono essere espressi attraverso una tripletta che indica i valori di rosso, verde e blu (RGB) tipo

set the backgroundcolor of button 1 to "160,0,255"

oppure attraverso un nome, dalla lista che trovate qui: http://livecode.wikia.com/wiki/ColorNames

set the backgroundcolor of button 1 to "MediumOrchid2"

oppure attraverso il codice HTML:

set the backgroundcolor of button 1 to "#F63526"

Qui trovate un simpatico programma di aiuto: https://mega.nz/#!1IRinbDR!k0iCy7r3VUEZw7_AUsKdVzrRuAnT2SFUZp38Jb7xO5g

lunedì 7 agosto 2017

Sockets

Ci ho messo molto per fare questo post perchè i socket in livecode non sono spiegati molto bene.
Prima di tutto cerchiamo di capire cosa siano e perchè sono così importanti.
Un socket è una via di comunicazione riservata tra due computer. Al contrario di una pagina web, che tutti possono vederla perchè è pubblica e basta sapere l'indirizzo del server per leggerla, il socket è una strada riservata tra due computer.
In linea generate il funzionamento è il seguente:
  1. il server apre una porta sul proprio indirizzo IP, questa porta sarà la comunicazione per chi vuole parlare con lui
  2. uno o più client si mettono in comunicazione col server su quella porta. Per ogni client il server genera un numero di riconoscimento univoco, così riesce a stabilire con chi parlare e cosa dirgli
Attraverso i  socket potreste crearvi il vostro servizio di messaggistica tipo whatsapp o molto altro.
Nel dettaglio lo schema di funzionamento è il seguente, per capirlo bene leggetevi il codice dopo lo schema:
Vediamo il codice.
Il server sarà fatto così:
Basterà cliccare su attivo per aprire la porta 12345, il codice del pulsante Attivo è:

on mouseUp
   if the hilite of me then
      accept connections on port 12345 with message "clientConnected"
   else
      close socket "12345"
   end if
end mouseUp

on clientConnected tSocket   
   put the seconds & " connesso col socket: " & tsocket & return after field "log"
   read from socket tSocket until "§" with message "messageReceived"
end clientConnected

on messageReceived tSocket, pMsg
   put the seconds & space & tsocket & ": " & char 1 to -2 of pMsg & return after field "log"
   write ("Ricevuto messaggio " & char 1 to -2 of pMsg & "§" ) to socket tSocket
   read from socket tSocket until "§" with message "messageReceived"
end messageReceived


Semplice, vero?
Il  codice apre la porta e mette in ascolto il messaggio ClientConnected, se qualche computer si collega il messaggio si attiva per eventuali comandi alla connessione. Il messaggio ClientConnected si attiva per ogni client che si connette.
Subito dopo ClientConnected si attiva messageReceived quando il client ci dice qualcosa. messageReceived richiama sempre se stesso per essere sempre in ascolto di nuovi messaggi.
Come separatore di nuovi messaggi ho scelto il carattere §, ma può essere qualunque altra cosa che il client trasmetta.
Per il client facciamo qualcosa di leggermente più complesso:
Ecco il codice del pulsante Attivo:

local pSocket

-- Disconnect the client from the broadcast server.
command broadcastClientStop
   close socket pSocket
end broadcastClientStop

-- Sent once the client has connected to the broadcaset server.
-- Store the socket for futurure reference and begin reading data
-- from the server.
on broadcastClientConnected tSocket
   put tSocket into pSocket
   read from socket pSocket until "§" with message "broadcaseClientMessageReceived"
end broadcastClientConnected

-- Sent when a message has been received from the server. Output the
-- message and continue reading data from the server.
on broadcaseClientMessageReceived tSocket, pMsg
   put the seconds & ": " & char 1 to -2 of pMsg & return after field "log"
   read from socket tSocket until "§" with message "broadcaseClientMessageReceived" #so we continue to listen
end broadcaseClientMessageReceived

-- Sent when there is an error opening the socket. Log the error.
-- and close the socket.
on socketError tSocket, pError
   close socket tSocket
   put pError & return after field "log"
end socketError

on sendmessage
   write (the text of field "mex") & "§" to socket pSocket
end sendmessage

on mouseUp
   if the hilite of me then
      put the text of field "IPserver" into temp      
      open socket to (temp & ":12345") with message "broadcastClientConnected"
   else
      close socket pSocket
   end if
end mouseUp


Qui abbiamo anche da memorizzare il codice del socket che utilizziamo e indicare al cliente quale è l'indirizzo del server.
Server e client si parlano, per ogni messaggio che arriva al server, il server risponde al client. In questo modo potete fare di tutto, messaggistica, controllo remoto e qualunque cosa vi venga in mente.
Come nel caso del server abbiamo un messaggio che si attiva quando si stabilisce la connessioni (broadcastClientConnected) e un messaggio in ripetizione continua per ascoltare il server (broadcatClientMessagereceived).
Per scrivere ad un socket basta usare write, ricordatevi sempre di indicare un carattere di fine messaggio o una lunghezza fissa predeterminata di caratteri da leggere con il comando read.
Potete scaricare i file da qui: https://mega.nz/#!dN5HWaoY!Wtbb7heTZVAyM3D8O9ddwOp_n7aRHgYyreQKZZTaH_g
Se avete dubbi chiedete nei commenti.

giovedì 20 luglio 2017

Little arrows in un datagrid

A grande richiesta vi illustro il codice da mettere nelle little arrows per modificare il valore di una cella. Per prima cosa modificate il datagrid come illustrato qui aggiungendo le little arrows: http://livecodeitalia.blogspot.it/2016/03/personalizzare-le-colonne-di-un-datagrid.html

Poi mettete come codice delle little arrows il seguente:

on scrollbarLineDec
   put the long id of the owner of me into temp
   add 1 to field 1 of temp
end scrollbarLineDec

on ScrollbarLineInc
   put the long id of the owner of me into temp
   add -1 to field 1 of temp
end ScrollbarLineInc

E tutto funzionerà perfettamente così:
postimage

mercoledì 19 luglio 2017

Evoluzione del codice di Livecode

Qui potete vedere un video che mostra l'evoluzione del codice di livecode creata con gource:
Anche se certe volte non sembra, ci sono sempre parecchie modifiche.


martedì 11 luglio 2017

Menu di scelta su cellulari

Per far fare una scelta sui cellulari abbiamo diverse opzioni percorribili. Possiamo fare con un mobile picker, il metodo più semplice:

on mouseUp
   mobilePick field "countryList"
   put the result into field "countryChoice"
end mouseUp


ecco i risultati:

Oppure usare dei radio buttons, modificati in modo da essere più belli e adatti sui cellulari:

Per modificare un radio buttons, basta modificare le proprietà icon e hiliteIcon.

venerdì 7 luglio 2017

Latino e Greco con Livecode

Un appassionato di greco e latino, oltre ad aver creato dei corsi e dei libri per imparare queste antiche lingue, si è appassionato a livecode e ha creato diversi programmi e giochi per capire queste lingue.
I sui siti sono:
http://www.imperiumlatin.com
http://www.j-progs.com/

martedì 4 luglio 2017

Come usare le little arrows

Le little arrows o freccine, sono quell'oggetto da mettere di soluto vicino ai campi numerici per aumentare o diminuire un valore. Poichè si tratta di uno scrollbar opportunamente modificato, non è intuitivo come usarle, ecco il codice consigliato:

on scrollbarLineDec
   add 1 to field "test"
end scrollbarLineDec

on ScrollbarLineInc
   add -1 to field "test"
end ScrollbarLineInc


Ecco il risultato:


venerdì 30 giugno 2017

Aggiungere o levare minuti

In livecode esistono molti modi per lavorare con ore e minuti, ma a me serviva qualcosa di molto specifico e ho scritto la funzione qui di seguito, ve la riporto perchè potrebbe servirvi. In pratica mettete l'orario e i minuti da aggiungere o togliere, per l'orario potete usare il formato "19:12" o quello con anche i secondi "19:12:59", i minuti posso essere positivi o negativi :

function libdate_addMinutes pTime, pMinutes
   #Usage: libdate_addminutes("18:35",37) = "19:12"
   #pTime format = "13:15" or 13:15:59"
   #pminutes is a integer positive or negative
   set itemdel to ":"
   put item 1 of ptime into tOre
   put item 2 of ptime into tMinuti
   put item 3 of ptime into tSecondi
   put tMinuti + pMinutes into tMinuti
   if pMinutes > 0 then
      put tOre + floor(tMinuti / 60) into tOre
   else
      put tOre - floor(tMinuti / 60) into tOre
   end if
   put   tMinuti mod 60 into tMinuti
   put tOre mod 24 into tOre
   if the number of chars of tMinuti is 1 then put 0 before tMinuti
   if the number of chars of tOre is 1 then put 0 before tOre
   if tSecondi is empty then
      return (tOre & ":" & tMinuti )
   else
      return (tOre & ":" & tMinuti & ":" & tSecondi )
   end if
end libdate_addminutes

giovedì 29 giugno 2017

Screenshot con livecode server

Volete vedere  un sito che usa livecode server e che è a livello professionale? Andate su https://scrshot.io/
troverete un sito che vi permette di fare foto delle schermate in maniera rapida, funziona con windows, linux e Mac.
Si scarica il programma e potete condividere le immagini facilmente.

mercoledì 28 giugno 2017

Datagrid 2

E' partita la raccolta fondi per un nuovo datagrid, che sia più avanzato completo e più adatto anche per i dispositivi mobili.
Se vi piace l'idea, potete leggere e finanziarla qui: https://livecode.com/project/datagrid2/

martedì 27 giugno 2017

Ridimensionare

Modificato
Quando una finestra si ridimensiona, se abbiamo impostato il geometry manager, tutti gli elementi scalano e si riposizionano automaticamente.
Se passate da una card ad un'altra, la nuova card non recepisce automaticamente la nuova impostazione delle dimensioni quando avete ridimensionato. Per aggirare questo fenomeno potete utlizzare questo trucco:


on OpenCard
   revUpdateGeometry
end OpenCard


Ne conoscete altri?

lunedì 26 giugno 2017

Ricerca binaria

La ricerca binaria o logaritmica è un modo di trovare un elemento in una lista molto velocemente, a patto che la lista sia ordinata.
Ecco un raffronto tra la velocità di ricerca normale e quella binaria:
Come potete vedere la velocità della ricerca binaria rimane stabile con il numero di elementi di una lista, mentre una ricerca eseguita in senso classico ha un tempo di ricerca che cresce linearmente col crescere della lista.
Il problema della ricerca di tipo binario è che ha bisogno di una lista ordinata (per valore, alfabeticamente, o qualsiasi altro ordinamento).
Per questo la ricerca di tipo binario porta grandi benefici quando la lista viene modificata raramente, mentre la ricerche sono molto più frequenti; altrimenti il tempo necessario ogni volta a riordinare la lista vanifica ogni vantaggio.
Se per esempio la lista è un array di livecode, per ordinarla è necessaria questa funzione:

function sortedArray @pArray   
   # fetch the keys and sort them using the array entry values   
   get the keys of pArray   
   sort lines of it by pArray[each]   
   split it by return   
   # create a new sorted array using the mapped keys   
   put 1 into tNextIndex
   repeat for each element tIndex in it      
      put pArray[tIndex] into tSortedArray[tNextIndex]      
      add 1 to tNextIndex      
   end repeat   
   return tSortedArray   
end sortedArray

Una volta ordinata la ricerca binaria può avvenire con questa funzione:

function logarithmicSearch @pArray, pItem, pLeft, pRight
   local tIndex
   local tResult
   # create a new range pointer that points to the item that lies
   # right between the left and right range pointers
   put round ((pLeft + pRight) / 2) into tIndex
   # if we have found the matching item then stop processing and return it
   if pArray[tIndex] = pItem then
      put tIndex into tResult
      # if any of the range pointers have the same value
      # then the item we are looking for does not exist in the array and we return 0
   else if (pLeft = pRight or pLeft = tIndex or pRight = tIndex) then
      put 0 into tResult
      # if we have not yet found a match and none of the range pointers have the same
      # value then call logarithmicSearch again with a smaller search range
      # we are effectively halving the search area, each time we call logarithmicSearch
   else if pArray[tIndex] > pItem then
      put logarithmicSearch (pArray, pItem, pLeft, tIndex) into tResult
   else
      put logarithmicSearch (pArray, pItem, tIndex, pRight) into tResult
   end if
   return tResult
end logarithmicSearch

Per chiamare la funzione bisogna indicare l'array, il valore cercato, zero e il numero di elementi dell'array, ad esempio:

put sortedArray(tArr) into tArr
put the number of lines of the keys of tArr into tnkeys
put logarithmicSearch (tArr, "testo da cercare", 0, tnkeys )


In alternativa a tutto ciò, vi ricordo che SQLite è integrato in livecode e permette delle ricerche molto veloci.

venerdì 16 giugno 2017

Proposta di lavoro

Keith J. Duggan è alla ricerca di un programmatore livecode per la seguente richiesta:

We are looking for a Rasperry PI specialist to develop firmware on a per project basis. The requirements of the firmware we need are basic power management and visual display. Since we are a funded start up, we will require an NDA for further information.
We are looking for a smart, go-getter type that is willing to grow with the company. This is a paid position, contract basis, based in Los Angeles.

Se siete interessati, potete scrivergli a: keithjduggan@mac.com

giovedì 15 giugno 2017

Lavorare con le matrici

La società EkkoTek ha sviluppato delle librerie aggiuntive per lavorare con le matrici, le potete rrovare qui: http://www.ekkotek.com/index.php?option=com_content&view=article&id=132&Itemid=1360

Questa libreria vi permette di:
  • creare matrici identità (tutti 1 sulla diagonale principale)
  • creare matrici Zero (tutti zero)
  • creare matrici casuali
  • creare matrici binarie casuali
  • fare la trasposta
  • aggiungere righe o colonne
  • rimuovere righe o colonne
  • add edge
  • addizione e sottrazione tra matrici
  • moltiplicazione e divisione per un scalare
  • divisione fra matrici
  • moltiplicazione  fra matrici
  • divisioni fra matrici sia da destra che da sinistra
  • addizione binarie
  • traslare
  • scalare
  • ruotare
Inoltre è disponibile anche un mini dizionario di riferimento.

La libreria è disponibile a pagamento solo per chi possiede un licenza commerciale di livecode.

martedì 13 giugno 2017

Clarify

Oggi vediamo il programma Clarify, serve per creare della documentazione in pochi minuti.
Il programma è stato scritto in livecode, ed è disponibile per Widnows e Mac.
In pratica potete creare delle pagine con testi, immagini, evidenziazioni e numeri in maniera molto veloce e intuitiva:
Potete scaricare Clarify per provarlo da qui: http://www.clarify-it.com

mercoledì 7 giugno 2017

Power tools

Oggi vi presento il PowerTool, si tratta di un pannello alternativo per livecode, più colorato e compatto, ma al tempo stesso semplice da usare, ecco alcune immagini:




Se volete lo potete scaricare da qui: http://www.ahsoftware.net/PowerTools/PowerTools.lc

martedì 30 maggio 2017

PowerDebug

Oggi vi presento un tool alternativo per fare il debug:
Si chiama PowerDebug e potete trovarlo qui: http://powerdebug.ahsoftware.net
Ha una serie di funzioni aggiuntive rispetto al debug dell'IDE di livecode, tra cui bloccare l'esecuzione quando una variabile cambia valore.

lunedì 29 maggio 2017

TinyDict

Esiste un dizionario per livecode compatto e veloce da usare:

Potete scaricarlo da qui: http://livecodeshare.runrev.com/stack/825/TinyDictionary
ve lo consiglio, è più veloce del dizionario standard.

giovedì 25 maggio 2017

DBLib e DB

Per chi è interessato ai database Andre Garzia ha sviluppato la libreria aggintiva DBLib che funziona anche su dispositivi mobili.
Mentre per chi è interessato ai database NoSQL c'è la libreria datastorage lib
Per più informazione potete leggere la seguente pagina: http://andregarzia.com/en/projects/dblib
oppure i sorgente su gitHub: https://github.com/soapdog/livecode-dblib

martedì 23 maggio 2017

CouchDB

Livecode è compatibile con il database CouchDB, qui potete trovare una guida: http://livecode.wikia.com/wiki/CouchDB
CouchDB è un database a documenti stile NoSQL, quindi non ha tabelle, ma solo documenti con dati.
Ogni documento può conentere un numero infinito di dati e sotto documenti.
Il vantaggio del NoSQL è quando non si sa con cosa si avrà a che fare. Ad esempio un negozio che aggiunge oggetti con proprietà sempre diverse: colore, grandezza, peso, luminosità, velocità, ecc. Grazie a NoSQL, quando arriva una nuova proprietà da inserire, non bisogna modificare le tabelle.

lunedì 22 maggio 2017

Installer linux

Ho appena creato i pacchetti DEB e RPM per installare livecode su linux a 64bit, si possono scaricare da qui: http://www.maxvessi.net/livecode/linux/
Rispetto all'installatore classico sono più semplici da installare e risolvono qualche bug.
Se vi servono per qualche altro formato fatemi sapere.

giovedì 18 maggio 2017

SVG widget a colori

La Ah Software ha creato un widget SVG che riprende il modello in bianco e nero di livecode, ma si può usare a colori!
Ecco un esempio:
Vi ricordo che la grafica SVG è vettoriale, e non perde definizione nè ingrandendola, nè rimpicciolendola.
Per fare una grafica in SVG ci sono tantissimi programmi, anche InkScape, che convertono quello che fate in SVG e poi vi basterà impostare la proprietà iconPathsTagData alla stringa SVG.
I file SVG sono solo una stringa di testo del tipo: <rect x="360" y="47.6" width="80" height="152"...
Potete scaricare il widget da qui 
Una volta scaricato, vi basterà scompattare il file ed utilizzare il Tools -> Extension builder per installare il widget.
Potete contattare l'inventore a: ahsoftware@ahsoftware.net

venerdì 12 maggio 2017

Gli array, una precisazione

Ho sempre usato gli array di livecode, monodimensionale e pluridimensionali, ma ancora non mi ero accorto di alcune peculiarità.
Se inserite un valore in un array tipo arr[Rossi] e poi inserite un secondo valore in arr[Rossi][Mario], ciò che è contenuto in arr[Rossi] si cancella perchè arr[Rossi] diventa un contenitore di un altro array: il suo secondo livello, con chiavi e valori.

Esempio

put "cognome" into arr["Rossi"]
put "nome marito" into arr["Rossi"]["Mario"]
put "nome moglie" into arr["Rossi"]["Anna"]

il valore di arr["Rossi"] non è più la stringa "cognome", ma un array con le chiavi "Mario" e "Anna".
Questo modalità può tornare utile quando dobbiamo lavorare solo una parte di un array, perchè così possiamo inviarne solo una parte, ad esempio:

put "nome marito" into arr["Rossi"]["Mario"]
put "nome moglie" into arr["Rossi"]["Anna"]
elencaArr arr["Rossi"]

on elencaArray tArr
   put the keys of tarr
end elencaArray

mostrerà solo Mario e Anna, perchè il messaggio elencaArray vede solo:
  • tArr["Mario"]
  • tArr["Anna"]
Se avete ulteriori dubbi, chiedeteli nei commenti.

mercoledì 10 maggio 2017

Tree view widget

Oggi vediamo come funziona il misterioso controllo tree view. Si tratta di un controllo per fare le liste ad albero.
Queste liste possono avere tutte le nidificazioni che volete. Vediamo nel dettaglio come fare. Trascinate nel vostro programma il tree view:
Ci basta settare la proprietà ArrayData per creare il nostro albero. Mandiamo questi comandi:


set the readOnly of widget "tree View" to true
put empty into temp[Rossi][Mario]
put empty into temp[Rossi][Lisa]
put empty into temp[Rossi][Mario]["Gatto di Mario"]
put empty into temp[Rossi][Lisa]["Cane di Lisa"]   
put empty into temp[Verdi][Luigi]
put empty into temp[Verdi][Anna]
put empty into temp[Verdi][Luigi]["Gatto di Luigi"]
put empty into temp[Verdi][anna]["Cane di Anna"]
set the arrayData of widget "Tree View" to temp
e otterrete questo:


abbiamo impostato anche la proprietà readOnly su true così non possiamo modificare le scritte o aggiungerci elementi cliccandoci sopra.
Volendo è possibile aggiungere anche un valore, si può fare solo all'ultima voce si un ramo, se il valore di una voce è diverso da empty, allora diventa l'ultima voce di quel ramo.
Ad esempio il codice:

put the arraydata of widget "tree view" into temp
put "Lampo" into temp[Verdi][Anna]["Cane di Anna"]
put "(marito)" into temp[Rossi][Mario]
set the arrayData of widget "Tree view" to temp

il risultato è questo:
Come vedete la voce finale del ramo il "Cane di Anna" ha una seconda voce "lampo", mentre avendo messo un valore a "Mario" la sotto voce "gatto di Mario" è sparita, perchè le voci che hanno un valore diventano la fine di un ramo.
Il mio consiglio è di non dare mai un valore alle voci, usate la voce stessa, che può contenere anche degli spazi, se usate le virgolette, per mettere più informazioni su una sola riga.
Vi ricordo che potete scegliere anche il tipo di ordinamento con SortType and SortOrder.

martedì 9 maggio 2017

Intercettare i pulsanti speciali (Ins, Home, PgSU, PgUp, ecc...)

In livecode per intercettare un pulsante di solito usiamo il messaggio keyUp, ma questo messaggio non gestisce tutto.
Ecco una lista di messaggi utili:
  • ArrowKey  per le frecce della tastiera
  • ControlKey  per il tasto Control ed eventuali combinazioni
  • FunctionKey per i tasti F1, F2, F3 e così via...
  • enterKey  per il tasto invio grosso della tastiera
  • returnKey per il tasto invio piccolo del tastierino numerico
  • deleteKey per il tasto Canc
  • backspaceKey  per il tasto backspace sopra l'invio grosso
  • CutKey  il taglia, cioè CTRL+X o qualunque cosa sia in quel momento
  • copyKey  il copia, cioè CTRL+C o qualunque cosa sia in quel momento
  • PasteKey  l'incolla, cioè CTRL+P o qualunque cosa sia in quel momento
  • TabKey  il tasto TAB
  • OptionKey  il tasto ALT  (o META su Mac)
  • rawKeyDown / rawkeyUp  la versione down o up differiscono se allo schiacciare del pulsante o al rilascio dopo averlo schiacciato. Questi messaggi ricevono il segnale da qualsiasi pulsante e vi restituisce il numero. Ecco alcuni numeri utili:
    • Ins: 65379
    • Home: 65360
    • Canc: 65535
    • Fine: 65367
    • Pag Up: 65365
    • Pag down: 65366 
Se vi servono ulteriori informazioni, chiedete pure nei commenti.

lunedì 8 maggio 2017

Migliorata barra della ricerca

Finalmente la barra della ricerca nella colonna qui a destra dovrebbe funzionare correttamente.
Provatela anche voi e ditemi nei commenti che vi sembra.

venerdì 7 aprile 2017

Mostrare e far scomparire la tastiera Android

Se volete nascondere la tastiera virtuale di Android, vi basta creare un campo di testo con la proprietà lockText impostata su true, e invisibile (proprietà visible su false).
A questo punto vi basta usare il codice:



focus on field "invisibile"


Ecco un video dimostrativo:

martedì 4 aprile 2017

HexThello

Oggi vediamo una app per iOS creata con livecode in una settimana: HexThello.
Si tratta di una specie di Othello, ma con le tessere esagonali. Rispetto ad Othello che ha le tessere quadrate, le combinazione e strategie possibili sono molte di più.
Qui di seguito vedete una schermata:
Potete giocare contro il computer o contro un amico.
Complimenti a David Probert per il programma.

venerdì 31 marzo 2017

Immagini PNG e iOS

Il sistema di sviluppo per creare app per iOS, chiamato da Apple XCode, quando incontra un'immagine PNG, la compatta rendendola illegibile per molti programmi.
Per farle tornare normali bisogna usare il comando:
xcrun -sdk iphoneos pngcrush -revert-iphone-optimizations -q compresso.png nonCompresso.png

Ma come farlo dentro la APP?
Ecco il codice:
on mouseUp
   -- CHECK FOR EXISTENCE OF PNGCRUSH UTILITY
   put "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/pngcrush" into crushPath
   if there is not a file crushPath then
      answer error "Unable to locate pngcrush tool. Check location of xCode."
      exit mouseUp
   end if
   -- APPEND THE SHELL COMMAND PARAMETERSTO THE PNGCRUSH PATH
   put crushPath && "-revert-iphone-optimizations -q source.png destination.png" into theCommand
   -- ESTABLISH SOURCE AND DESTINATION FOLDERS
   put directory into D -- store the current directory
   answer folder "Locate folder containing PNG files:"
   if the result is "Cancel" then exit mouseUp
   put it into theSourceFolder
   set directory to theSourceFolder
   put the files into theList
   set directory to D -- restore the directory
   answer folder "Choose output folder:"
   if the result is "Cancel" then exit mouseUp
   put it into theDestinationFolder
   -- PROCESS FILES
   put 0 into theCount
   repeat for each line theFile in theList
      put theCommand into newCommand
      if char -4 to -1 of theFile is not ".png" then next repeat -- ignore non-PNG files
      put q(theSourceFolder & "/" & theFile) into theSourceFile
      put q(theDestinationFolder & "/" & theFile) into theDestinationFile
      replace "source.png" with theSourceFile in newCommand
      replace "destination.png" with theDestinationFile in newCommand
      get shell(newCommand)
      wait 20 millisecs with messages
      add 1 to theCount
      put theCount -- show processed file count in message box
   end repeat
   answer "PNGs have been fixed!"
end mouseUp

function q pString
   return quote & pString & quote
end q

lunedì 27 marzo 2017

Markdown

Oggi vediamo cosa fa la funzione mergMarkdownToXHTML(). In pratica prende un testo formattato MarkDown e lo converte in HTML.
Ad esempio il testo MarkDown:

An h1 header
============

Paragraphs are separated by a blank line.

2nd paragraph. *Italic*, **bold**, and `monospace`. Itemized lists
look like:

 * this one
 * that one
 * the other one


diventa:

<h1>An h1 header</h1>
 
 <p>Paragraphs are separated by a blank line.</p>
 
 <p>2nd paragraph. <em>Italic</em>, <strong>bold</strong>, and <code>monospace</code>. Itemized lists
 look like:</p>
 
 <ul>
 <li>this one</li>
 <li>that one</li>
 <li>the other one</li>
 </ul>

venerdì 24 marzo 2017

blur

Un nuovo comando è disponibile in livecode: blur.
Questo comando può sfocare un'immagine, ad esempio il seguente codice:

put the imageData of image 1 into theOriginalImageData
blur 5,"theOriginalImageData",the width of image 1,the height of image 1,"theNewImageData"
set the imageData of image 2 to theNewImageData


potete sfocare un'immagine così: