martedì 29 settembre 2015

Raggiunti i fondi per SSL con PostgerSQL e Mac a 64bit

Due belle notizie dalla società livecode: sono stati raggiunti i traguardi per finanziare la versione a 64bit di livecode e l'aggiunta della cifratura SSL dentro al driver per PostgreSQL.

Queste due sovvenzioni hanno raggiunto circa $ 30'000, niente male.

lunedì 28 settembre 2015

Datagrid helper

I datagrid sono uno degli oggetti più complicati in livecode. Hanno tantissime proprietà e funzioni, ma le uniche documentazioni a riguardo la trovate qui:



Con i datagrid potete fare sia fantastiche tabelle che elenchi molto complessi (form):
Datagrid in modalità tabella (table)
Datagrid in modalità form


Esiste un plugin chiamato datagrid helper, creato dal programmatore Zyrip. Questo programmino vi permette di poter gestire molto facilmente i datagrid:


Con questo programmino gestire form o tabelle, colori e oggetti dentro al datagrid è molto semplice.
Attualmente il costo è di $45.

Ecco un video dimostrativo:

venerdì 25 settembre 2015

Livecode 64 bit per Mac

Come sapete si sono attivate varie campagne di raccolta fondi con lo scopo di aggiungere delle funzioni a livecode.
Un utente è così preso dal bisogno di fare una versione a 64 bit sul Mac che ha deciso di raddoppiare ogni donazione fatta per questo progetto. In poche parole lui metterà la stessa cifra che ogni altro verserà: se voi versate 10 €, lui verserà 10 €.
La pagina di questa funzionalità è qui: https://livecode.com/project/mac-64%C2%ADbit-support/
La persona che ha fatto questo annuncio è Todd Fabacher  della società Digital Pomegranate.
Uno dei problemi che impediscono di passare a 64bit su Mac (su Linux è già disponibile) è il sistema multimediale, finora basato su quicktime che Apple non supporta a 64 bit. Per passare a 64bit su Mac bisogna riscrivere tutte le API multimediali.
Passando a 64 bit verranno riscritte tutte le API per Mac utilizzando le nuove disponibili.
Se siete degli utilizzatori Mac forse è il caso di donare qualche soldo a questa causa.

mercoledì 23 settembre 2015

The Scripter's Scrapbook

Oggi presento un software fatto con livecode, ma che può essere utile ad ogni programmatore per ogni tipo di linguaggio: The Scripter's Scrapbook.
Si tratta di una libreria personale del codice, dove possiamo mettere e catalogare il nostro codice per poterlo riutilizzare in altri programmi.

I vantaggi di questo programma è che possiamo mettere delle categorie, sottocategorie, icone per trovare e classificare il codice. In questo modo sappiamo se si tratta di Java, C++, oppure se per solo per windows, se è HTML per il web ecc.
E' uno strumento molto utile, soprattutto per i programmatori che utilizzano molti linguaggi alla volta. Con questo programmino possono ricordarsi in che linguaggio era presente quella unzione utile che avevano scritto e trovarla al volo.
Da questa pagina è presente una versione di prova gratuita per 30 giorni: http://www.flexiblelearning.com/ssbk.htm
Il costo del programma è € 68.

martedì 22 settembre 2015

Nuove funzioni per Livecode

Livecode ha appena lanciato una campagna per finanziare nuove funzionalità e renderle disponibili a tutti.
Avete solo 6 giorni a disposizione, sbrigativi a decidere se e quali finanziare.
Da questa pagina trovate una descrizione: https://livecode.com/project/
Ecco la lista:
Remote debugger:
far funzionare il debbuger non solo per le applicazioni che girano dentro l'IDE, ma anche per le applicazioni che girano dentro i dispositivi mobili connessi all'IDE.
PostgreSQL SSL Support:
aggiungere la funzionalità di comunicazione SSL dentro al driver per il database PostgreSQL
IPV6 Support:
aggiungere la funzionalità IPV6 a livecode
Mac 64­bit Support:
Convertire a 64bit la versione di livecode per Mac, che per ora gira a 32bit.

Quali ritenete più utili?

venerdì 18 settembre 2015

Generatore di particelle per Second Life


Second Life è un mondo virtuale dove possiamo addentrarci con un personaggio creato da noi, ecco qui un esempio:


In questo mondo è possibili modificare l'aspetto del proprio personaggio che di alcuni luoghi che ci appartengono:

Sapendo programmare possiamo creare degli stupendi effetti.
E' inoltre possibile vendere il nostro codice o altri programmi su second life, come ad esempio sul market: https://marketplace.secondlife.com
Ebbene uno degli strumenti più di successo venduti è il generatore di particelle, (disponibile sia su Windows, Linux e Mac) fatto in Livecode: Mote.
Questo programmino viene venduto alla ragguardevole cifra di L$ 1'790 (L$ è la valuta di second life). Vi permette di generare il codice per poi controllare dal vostro PC tutta una serie di effetti spettacolari, ecco un video di esempio:
Complimenti alla programmatrice Paladin per suo business di successo. Sul suo sito potete trovare altri prodotti: http://www.paladinpinion.com/

martedì 15 settembre 2015

Copiare i gradienti

I gradienti sono degli effetti grafici molto utili da applicare ai nostri elementi. I dati sono tutti contenuti nella proprietà fillGradient.
Se provate a copiare la proprietà fillGradient, non a ottenere lo stesso gradiente, perchè l'immagine del gradiente è creata da livecode quando la prorietà del gradiente cambia, e utilizza i punti assoluti dello schermo (per far prima).
Per questo motivo, teoricamente, non è possibile creare un modello per i gradienti. Per fortuna questo problema può essere aggirato.
Per copierà il gradiente basta che l'oggetto originale e quello a cui vogliamo applicare il gradiente abbiamo la stessa proprietà rect, cioè occupino lo stesso spazio sullo schermo.
Gradiente copiato correttamente
In pratica si tratta di:

  •  creare il modello
  • spostare gli oggetti nella posizione del modello
  • applicargli lo stesso gradiente
  • rimettere a posto gli oggetti modificati
Che nel codice di livecode significa:


   #graphic 1 è il modello
   put the rect of graphic 2 into temp
   set the rect of graphic 2 to the rect of graphic 1
   set the fillGradient of graphic 2 to the fillgradient of graphic 1
   set the rect of graphic 2 to temp



lunedì 14 settembre 2015

Zygodact

Se volete creare un software che necessiti di una chiave di attivazione o registrazione, esiste il plugin Zygodact.
Lo potete trovare qui: http://www.hyperactivesw.com/solutions_zygodact.html
Questo stack da aggiungere ai nostri programmi permette di:

  • avere un sistema di registrazione
  • poter aggiungere una data di scadenza al software quando la registrazione scade
  • aggiungere un periodo di valutazione gratuita
  • inoltre può creare dei programmi associati a delle chiavi
Quest'ultima funzione è da installare su un web server come CGI. Ogni scaricamento del programma sarà associato ad una chiave diversa. In modo che due programmi abbiano due chiavi diverse.



giovedì 10 settembre 2015

Lavorare con numeri molto grandi 2

In un post precedente avevo scritto delle funzioni per avere una precisione assoluta facendo le operazioni basilari con un numero grande quanto si vuole, superando così i limiti imposti dai bit del processore.
Mi è stato fatto notare che l'operazione di divisione diventava estremamente lunga quando la differenza di cifre tra i due numeri erano notevoli.
Per questo ho scritto una nuova funzione, bigDivide2() per dividere i numeri molto grandi, che spezza l'operazione in operazioni più piccole, come facciamo noi esseri umani quando facciamo la divisione, rendendo l'operazione complessiva velocissima. Si appoggia dalla funzione bigDivide(), che già conoscete.
Vi metto qui tutto il codice:



function bigAdd a1, a2
   #let's check if it's negative...
   #end check
   put reverse2(a1) into b1
   put reverse2(a2) into b2
   put 0 into mem
   if length(b1) < length(b2) then
      put b1 into temp
      put b2 into b1
      put temp into b1
   end if
   repeat while b2 is not empty
      put (char 1 of b1) + (char 1 of b2) + mem into ppp
      if length(ppp) = 1 then
         put 0 into mem
         put ppp before rrr
      else
         put 1 into mem
         put char 2 of ppp before rrr
      end if
      delete char 1 of b1
      delete char 1 of b2
   end repeat
   repeat while (b1 is not empty)
      put mem + (char 1 of b1) into ppp
      if length(ppp) = 1 then
         put 0 into mem
         put ppp before rrr
      else
         put 1 into mem
         put char 2 of ppp before rrr
      end if
      delete char 1 of b1
   end repeat
   if mem = 1 then
      put 1 before rrr
   else
      put b1 before rrr
   end if
   return rrr
end bigAdd

function reverse2 temp
repeat for each char tChar in temp
put tChar before temp2
end repeat
return temp2
end reverse2


function bigMultiply a1,a2
   put reverse2(a1) into a1
   put 0 into temp
   repeat for each char tChar in a1
      repeat with i=1 to tChar
         put bigAdd(temp,a2) into temp
      end repeat
      put 0 after a2
   end repeat
   return temp
end bigMultiply

function bigGreater a1,a2
   #compare two bignumbers:
   #return true if n1 > n2
   #return false if n1 < n2
   #return empty if n1 = n2
   #let's check is a number is negative
   if ((char 1 of a1 = "-") or (char 1 of a2 = "-")) then
      if ((char 1 of a1 = "-") and (char 1 of a2 is not "-")) then
         return false
      end if      
      if ((char 1 of a1 is not "-") and ( char 1 of a2 = "-" )) then
         return true
      end if      
      #if we are here, both are negative
      delete char 1 of a1
      delete char 1 of a2
      if a1 = a2 then
         return empty
      else
         return (not bigGreater(a1,a2))
      end if
   end if
   if length(a1) is not length(a2) then
      return ( length(a1) > length(a2) ) #this is evalueted true or false
   else
      if a1 = a2 then
         return empty
      else
         repeat while ((char 1 of a1) = (char 1 of a2) )
            delete char 1 of a1
            delete char 1 of a2
         end repeat
         return ((char 1 of a1) > (char 1 of a2)) #this is evalueted true or false
      end if
   end if
end bigGreater

function bigSub a1,a2
   #substract the smallest big number from the largest one
   if bigGreater(a2,a1) then
      put a1 into temp
      put a2 into a1
      put temp into a2
   end if
   put reverse2(a1) into a1
   put reverse2(a2) into a2
   put 0 into mem
   repeat while (a2 is not empty)
      put (char 1 of a1) - mem + 10 - (char 1 of a2) into minus
      if length(minus) = 1 then
         put 1 into mem
         put minus before rrr
      else
         put 0 into mem
         put char 2 of minus before rrr
      end if
      delete char 1 of a1
      delete char 1 of a2
   end repeat
   repeat while (a1 is not empty)
      put char 1 of a1 + 10 - mem into minus
      if length(minus) = 1 then
         put 1 into mem
         put minus before rrr
      else
         put 0 into mem
         put char 2 of minus before rrr
      end if
      delete char 1 of a1
   end repeat
   #remove inital zeros
   repeat while (char 1 of rrr is "0")
      delete char 1 of rrr
   end repeat
   return rrr
end bigSub

function bigDivide a1,a2
   #output is a block of two numbers "quotient , remainder"
   if bigGreater(a2,a1) then
      return ("0," & a1)
   end if
   if a1 = a2 then
      return "1,0"
   end if
   put 0 into count
   repeat while (bigGreater(a1,a2))
      put bigSub(a1,a2) into a1
      put bigAdd(1,count) into count
   end repeat
   if a1 = a2 then
      put bigAdd(count,1) into count
      put 0 into a1
   end if
   return (count & comma & a1)
end bigDivide

function bigDivide2 a1,a2   
   put length(a1) into ldividendo
   put length(a2) into ldivisore   
   if ldividendo <= ldivisore then
      return bigDivide(a1,a2)
   end if   
   put char 1 to ldivisore of a1 into tDiv
   put bigDivide(tDiv,a2) into rrr
   put item 1 of rrr into quoziente
   put item 2 of rrr into resto
   put ldivisore + 1 into nn   
   repeat with i = nn to ldividendo
      put char i of a1 after resto
      put bigDivide(resto,a2) into temp
      put item 1 of temp after quoziente
      put item 2 of temp into resto      
   end repeat
   put removezeros(quoziente) into quoziente
   put removezeros(resto) into resto
   return (quoziente & comma & resto)
end bigDivide2

function removezeros temp
   repeat while char 1 of temp is "0"
      delete char 1 of temp
   end repeat
   return temp
end removezeros

venerdì 4 settembre 2015

Corso livecode

Il post di oggi è autopromozione, poichè la società Neol srl, mi ha chiesto di tenere dei videocorsi su livecode.
Io seguirò tutta la parte per creare applicazioni Android con Livecode.
In questa pagina trovate tutte le informazioni: http://www.didacta.com/corsi_livecode.html
Ci sono due percorsi:


Per i corsisti ci sarà anche un forum privato dove possono discutere con i professori.
Si possono iscrivere tutti: sia dei docenti, che non pagano l'IVA sull'iscrizione, e sia chiunque sia interessato (che però deve pagare anche l'IVA).

Le iscrizioni sono aperte dal 2 al 30 settembre 2015.

I corsi saranno dal 1 ottobre al 8 dicembre 2015.

giovedì 3 settembre 2015

Incorporare una app HTML5

Ieri abbiamo visto che è disponibile l'esportazione in HTML5, ma come possiamo incorporarla in una pagine web?
Semplice, basta inserire il seguente codice HTML:

<div><!--Don't change start !-->
  <canvas style="border: 0px none;" id="canvas" oncontextmenu="event.preventDefault()"></canvas>
  <script type="text/javascript">
    var Module = { canvas: document.getElementById('canvas') };
  </script>
  <script async type="text/javascript" src="standalone-community-8.0.0-dp-4.js">   </script>
</div><!--Don't change stop !-->


Chiaramente il codice in verde è l'indirizzo di dove si trova il vostro file javascript e gli altri file generati da livecode.
Una volta incorporata, apparira anche un'icona per scaricare il sorgente, ad esempio (dategli qualche secondo per caricare tutto):


mercoledì 2 settembre 2015

E' arrivata l'esportazione HTML 5

E' appena uscita una nuova versione di test di livecode 8, la DP4, che include l'esportazione del vostro programma come una pagina web.
Nella cartella dell'esportazione troverete:

  • il file HTML
  • il file javascript
  • il file MEM
al momento dovete caricarli tutti su internet per far funzionare il programma.
Ecco degli esempi:

Chiaramente la versione 8 di livecode è molto sperimentale, continuate ad usare la 7 se non vi serve l'esportazione in HTML.

martedì 1 settembre 2015

Lavorare con numeri molto grandi

Se si deve lavorare con numeri molto grandi, composti da centinaia di cifre, non si possono utilizzare le normali funzioni matematiche dei software.
Quasi tutti i linguaggi di programmazione usano delle funzioni di basso livello per velocizzare i conti, ma questo implica portarsi dietro i limiti dei processori ad esempio in linea teorica un computer a 32bit può gestire solo numeri fino a 232, mentre computer a 64 bit possono gestire 264.
Ogni software opera un certo grado di approssimazione per numeri molto grandi, quindi bisogna scrivere delle funzioni particolari che possano elaborare numeri senza limiti od errori.
Qui di seguito trovate il codice per fare somma (bigSum), sottrazione (bigSub), moltiplicazione (bigMultiply) e divisione (bigDivide) e anche per capire se un numero è più grande di un altro (bigGreater).
Con queste funzioni potrete gestire tutti i numeri senza alcune errore e di qualunque dimensione.


function bigAdd a1, a2
   put reverse2(a1) into b1
   put reverse2(a2) into b2
   put 0 into mem
   if length(b1) < length(b2) then
      put b1 into temp
      put b2 into b1
      put temp into b1
   end if
   repeat while b2 is not empty
      put (char 1 of b1) + (char 1 of b2) + mem into ppp
      if length(ppp) = 1 then
         put 0 into mem
         put ppp before rrr
      else
         put 1 into mem
         put char 2 of ppp before rrr
      end if
      delete char 1 of b1
      delete char 1 of b2
   end repeat
   repeat while (b1 is not empty)
      put mem + (char 1 of b1) into ppp
      if length(ppp) = 1 then
         put 0 into mem
         put ppp before rrr
      else
         put 1 into mem
         put char 2 of ppp before rrr
      end if
      delete char 1 of b1
   end repeat
   if mem = 1 then
      put 1 before rrr      
   else
      put b1 before rrr
   end if
   return rrr
end bigAdd

function reverse2 temp
   repeat for each char tChar in temp
      put tChar before temp2
   end repeat
   return temp2
end reverse2


function bigMultiply a1,a2
   put reverse2(a1) into a1
   put 0 into temp
   repeat for each char tChar in a1
      repeat with i=1 to tChar
         put bigAdd(temp,a2) into temp
      end repeat
      put 0 after a2
   end repeat
   return temp
end bigMultiply

function bigGreater a1,a2
   #compare two bignumbers:
   #return true if n1 > n2
   #return false if n1 < n2
   #return empty if n1 = n2
   if length(a1) is not length(a2) then
      return ( length(a1) > length(a2) ) #this is evalueted true or false
   else
      if a1 = a2 then
         return empty
      else
         repeat while ((char 1 of a1) = (char 1 of a2) )
            delete char 1 of a1
            delete char 1 of a2
         end repeat
         return ((char 1 of a1) > (char 1 of a2)) #this is evalueted true or false
      end if
   end if
end bigGreater

function bigSub a1,a2
   #substract the smallest big number from the largest one
   if bigGreater(a2,a1) then
      put a1 into temp
      put a2 into a1
      put temp into a2
   end if
   put reverse2(a1) into a1
   put reverse2(a2) into a2
   put 0 into mem
   repeat while (a2 is not empty)
      put (char 1 of a1) - mem + 10 - (char 1 of a2) into minus
      if length(minus) = 1 then
         put 1 into mem
         put minus before rrr
      else
         put 0 into mem
         put char 2 of minus before rrr
      end if
      delete char 1 of a1
      delete char 1 of a2
   end repeat
   repeat while (a1 is not empty)
      put char 1 of a1 + 10 - mem into minus
      if length(minus) = 1 then
         put 1 into mem
         put minus before rrr
      else
         put 0 into mem
         put char 2 of minus before rrr
      end if
      delete char 1 of a1
   end repeat
   #remove inital zeros
   repeat while (char 1 of rrr is "0")
      delete char 1 of rrr
   end repeat
   return rrr
end bigSub

function bigDivide a1,a2
   #output is a block of two numbers "quotient , remainder"
   if bigGreater(a2,a1) then
      return ("0 , " & a1)
   end if
   if a1 = a2 then
      return "1 , 0"
   end if
   put 0 into count
   repeat while (bigGreater(a1,a2))
      put bigSub(a1,a2) into a1
      put bigAdd(1,count) into count      
   end repeat
   if a1 = a2 then
      put bigAdd(count,1) into count
      put 0 into a1
   end if
   return (count & " , " & a1)
end bigDivide


Ad esempio per fare la sottrazione "123456789123456789123456789 - 1234567891023456789", basta usare :

bigSub(123456789123456789123456789, 1234567891023456789) = 123456787888888898100000000

mentre per molti altri software il risultato è 1.23456787888889E+26 che è sbagliato!

La spiegazione è che molti software approssimano quando non hanno più bit a disposizione, quindi usano solo le prime 15 cifre e poi aggiungo zeri. In questo modo danno come risultato

1.23456787888889E+26

che significa
123456787888889000000000000

mentre il risultato corretto è
123456787888888898100000000

L'errore è di 101'900'000'000, vi sembra un piccolo errore?