[Off-Topic] Toxicity

Conversion, software version 7.0,
Looking at life through the eyes of a tire hub,
Eating seeds as a past time activity,
The toxicity of our city, of our city,

New, what do you own the world?
How do you own disorder, disorder,
Now, somewhere between the sacred silence,
Sacred silence and sleep,
Somewhere, between the sacred silence and sleep,
Disorder, disorder, disorder.

More wood for their fires, loud neighbors,
Flashlight reveries caught in the headlights of a truck,
Eating seeds as a past time activity,
The toxicity of our city, of our city,

New, what do you own the world?
How do you own disorder, disorder,
Now, somewhere between the sacred silence,
Sacred silence and sleep,
Somewhere, between the sacred silence and sleep,
Disorder, disorder, disorder. {x2}

When I became the sun,
I shone life into the man’s hearts,
When I became the sun,
I shone life into the man’s hearts.

Javascript TIP - addslashes

Dopo svariate ricerche e inutili tentativi sono riuscito a definire una funzione per l’aggiunta di slash per gli apici e doppi apici.

function addslashes(str) {
 
	return (str+'').replace(/([\\"'])/g, "\\$1").replace(/\0/g, "\\0");
	}

Spero che sia utile a qualcuno ed eviti un bel po’ di mal di testa..

Linux, python e problemi di ottimizzazione

Glpk è un tool per risolvere dei problemi di programmazione lineare rilasciato sotto licenza GNU. Esso viene rilasciato un due formati: uno come eseguibile a riga di comando e un’altro come libreria dinamica. E’ stato realizzato un binding per python (ce ne sono anche per altri linguaggi) che permette di sottomettere un problema di programmazione lineare al risolutore ed avere la risposta direttamente dall’ambiente interpretato di python. Non starò qui a discutere sulla bontà (ossia, sull’efficienza) di tale risolutore rispetto alle sue controparti commerciali. Alcuni articoli e documentazioni sono reperibili nel sito ufficiale di glpk e spiegano anche gli algoritmi implementati per risolvere problemi di programmazione lineare. Ciò che invece mi piace osservare è la flessibilità di python come linguaggio di scripting. Di frequente python viene usato come linguaggio per uso scientifico/matematico, anche se è diventato famoso per la facilità di programmazione di strumenti per web. Non sono mai stato portato a realizzare applicazioni totalmente in python, ma lo uso molto spesso per avere una componente flessibile a run-time che realizzi un determinato compito. Ad esempio, usare python per risolvere istanze di problemi di programmazione lineare o combinatorici rappresenta una buona soluzione all’interno di un’applicazione più grande scritta in un linguaggio non interpretato come C/C++ oppure java o C# (Jython, IronPython). In questo modo, l’applicazione dovrà solo preoccuparsi di formattare l’input utente comprensibile a script python e lanciarli per la soluzione.

ES:

#include <Python.h>
 
int
main(int argc, char *argv[])
{
  Py_Initialize();
  PyRun_SimpleString("from time import time,ctime\n"
                     "print 'Today is',ctime(time())\n");
  Py_Finalize();
  return 0;
}

Non andando oltre confermo che è possibile lanciare interi script da programmi c o c++. Implementando algoritmi di ottimizzazione in python, possiamo separare la parte del software relativa alla presentazione dei risultati con quella relativa alla risoluzione del problema. Infatti, sarà necessario solo scrivere nuovo codice python per aggiungere un nuovo algoritmo. Una soluzione simile, ma per scopi diversi, è quella usata da blender. Blender infatti usa python per scrivere plug-in, come ad esempio importer o exporter di formati di modelli 3d.

Passiamo ora all’oggetto del topic. Premetto che il binding di glpk per python è più semplice da installare per linux, anche se non ho tentato di farlo per win. Infatti, sotto ubuntu basta impartire il seguente comando:

sudo apt-get install python-glpk

per avere tutto a disposizione. Scrivere un problema di programmazione lineare è molto semplice dando in input un file .mod:

ES:

var x >=0 integer;
var y >= 0;

maximize z: x + y;

subject to r:
x + y <= 10;
subject to s:
x + 10*y <= 1;
subject to t:
10*x + y <= 1;

end;

Salviamo il contenuto in un file chiamato example.mod. Da python lanciamo il seguente script:

import glpk
 
print "starting..."
example = glpk.lpx("example.mod")
example.solve()
print "solution:", example.sol
print "solution is also here:", example.x

Il risultato sarà il seguente:

>>>
starting…
solution: {’y': 0.099999999999999992, ‘x’: 0, ‘z’: 0.099999999999999992}
solution is also here: array(’d', [0.099999999999999992, 0.0, 0.099999999999999992])

il campo example.sol ci da la soluzione sotto forma di dizionario, mentre il campo example.x ci da la soluzione sottoforma vettoriale. Per chi ha bisogno di una libreria più avanzata consiglio PuLP contenente una documentazione accurata e molte soluzioni implementative a problemi noti.

Applicazioni Desktop con Eclipse (RCP)

Alla domanda : che cos’è eclipse ? Molti di voi risponderanno: “è un IDE”. Alcuni diranno: “Si, ma ha delle funzionalità tipiche anche di un RAD”. Entrambi hanno ragione, ma eclipse è anche molto di più. Esso infatti permette di costruire applicazione stand-alone facendo uso dell’architettura stessa di eclipse. Ossia, creare applicazione estensibili, flessibili e riusabili. Tutto questo va sotto il nome di RCP ( Rich Client Platform). Perchè usare questa tecnologia anzichè JFC/Swing o AWT è facilmente intuibile: “l’architettura”. Chi di voi ha esperienze con le applicazioni desktop (ma vale anche per l’enterprise) sa come sono difficili da mantenere e come sia difficoltoso aggiungere nuove funzionalità se non si è stati attenti a dare all’applicazione una struttura modulare che faciliti il refactoring. Usando una struttura estensibile a plug-in come quella che usa eclipse nelle nostre applicazioni è senz’altro un grande vantaggio e per di più a costo zero ( o quasi). Eclipse RPC permette di ereditare lo stesso framework usato da Eclipse Workbench quindi permette al programmatore di dividere le funzionalità applicative in diversi plug-in. Per iniziare a programmare applicazioni usando RCP è possibile scaricare una versione apposita di eclipse con tutti i plugin necessari, inoltre è disponibile un tutorial abbastanza completo per la programmazione.

Refs

Eclipse RCP/ Ganymede

Eclipse RCP Tutorial

Good programming!

JSE , Swing e JFileChooser

E’ ormai risaputo che la classe JFileChooser è tra le più problematiche in termini di performance. Al primo avvio, il dialog prende circa 7/8 secondi su un PC dotato di un’intel da 1.5 Ghz e 512 MB di memoria e la cosa sembra migliorare di poco anche con hardware migliore. Ero molto scontento di tale performance che persiste anche nella versione 1.6 della JVM. L’unico modo per poter migliorare la situazione è usare il controllo nativo di windows, richiamabile tramite la classe java.awt.FileDialog.  La grafica di tale controllo ovviamente è meno ricca e bella da vedere, ma la velocità di caricamento e visualizzazione è notevolmente migliorata ( circa del 80%). Infatti la classe FileDialog fa apparire il controllo in circa 1/2 secondi al primo avvio e diventa istantaneo nei successivi. Benchè le performance delle JFC/Swing siano notevolmente migliorate nella nuova versione rispetto alle precedenti, programmare applicazioni desktop in Java ha ancora bisogno di qualche trucco da volpe come questo. Per la Java 6 direi che la gestione degli eventi tramite Action condivise ha migliorato notevolmente le respositività del software ad eventi esterni.

TIP del giorno : Usare java.awt.FileDialog invece di javax.swing.JFileChooser per aprire o salvare file.