martedì 6 aprile 2010

The clever programmer

"Consider two programs. One was written by a clever programmer
using all the tricks. The program contains no comments, but it works.
The other program is well commented and nicely structured, but it
doesn't work. Which program is more useful? In the long run, the
broken one. It can be fixed. Although the clever program works now,
sooner or later all programs have to be modified. The worst thing that
you will ever have to do is to modify a cleverly written program."
-- "Practical C Programming"

martedì 29 settembre 2009

Puoi indovinare cosa faccia questo ciclo?
basta copiarlo in uno script di shell e guardare cosa salta fuori.
interessante promemoria perché contiene numerosi costrutti di base, che non usando spesso bash, si dimenticano alla svelta.

echo -e "\e[32m";
while :; do
for i in {1..16}; do
r="$(($RANDOM % 2))";
if [[ $(($RANDOM % 5)) == 1 ]]; then
if [[ $(($RANDOM % 4)) == 1 ]]; then
v+="\e[1m $r ";
else
v+="\e[2m $r ";
fi;
else
v+=" ";
fi;
done;
echo -e "$v";
v="";
done


martedì 15 settembre 2009

Libri autunno-inverno



Test Driven Development by example
il libro più citato ed autorevole sulle pratiche di testing, metodologia di cui voglio appropriarmi il prima possibile






The Symfony 1.2 reference guide
Symfony è oggi, molto importante nel mio lavoro quotidiano, cercherò di approfondirlo negli aspetti che più spesso mi fanno perdere tempo e pazienza: la ricerca dei settings giusti.





Programming Collective Intelligence
questo libro è abbastanza particolare per i temi trattati e mi porta ben lontano dalla mia area di comfort abituale: spiega come utilizzare tecniche statististiche per realizzare servizi intelligenti come "suggerimenti" alla Amazon, graduatorie, filtri, ricerche automatiche.



Working Effectively with legacy code
Un'altro testo famoso sul Testing e la sua aplicazione pratica, già la premessa iniziale, è legacy software tutto il software senza test automatici, è forte e accattivante.




Code Complete 2
Un testo citatissimo sullo stile di programmazione, che consiste principalmente nel porre attenzione a particolari non evidenti o apparentemente secondari di codifica ma dal peso sorprendente sul lungo periodo, un tema non di moda, ma che ritengo valga la pena approfondire.




Don't make me think
Ancora un testo sulla prevalenza della chiarezza del contenuto sul decoro fine a se stesso? speriamo mi illumini di Spirito Santo e mi dia argomenti convincenti sui colleghi, clienti e utenti in genere. Forse, questa lettura farà cambiare la mia idea in merito. staremo a vedere.



mercoledì 2 settembre 2009

Chromium finalmente su linux

finalmente una soluzione dignitosa ci rende disponibile Chromium, la varsione opensourse di google chrome, su Linux (xubuntu per quanto mi riguarda ), che da mesi è stabilmente il mio sistema operativo di casa.

come al solito occorre editare /etc/apt/sources.list e aggiungere

deb http://ppa.launchpad.net/chromium-daily/ppa/ubuntu intrepid main
deb-src http://ppa.launchpad.net/chromium-daily/ppa/ubuntu intrepid main

che indica il repository aggiornato automaticamente su base quotidiana dei pacchetti necessari a far girare l'applicativo.

non dispongo di misurazioni scientifiche ma l'impressione è che webkit+v8 sia molto più leggero e veloce di tutte le alternative disponibili, anche aggiornatissime:

deb http://ppa.launchpad.net/webkit-team/ppa/ubuntu jaunty main
deb-src http://ppa.launchpad.net/webkit-team/ppa/ubuntu jaunty main
deb http://ppa.launchpad.net/ubuntu-mozilla-daily/ppa/ubuntu jaunty main

similmente, questi sono i repository dev di webkit e mozilla.

il browser non è totalmente funzionante, l'interfaccia è meno curata dell'equivalente windows(usa gtk2 e i temi sembrano Alieni) e alcune funzioni sono disabilittate, non è ad esempio possibile creare shortcut dell'applicazione web come è possibile sugli altri sistemi operativi, a mio parere si tratta di limitazioni di poco conto rispetto alla performance entusiasmante di cui è capace questo browser, uno dei pochi programmi che invidiavo all'altro OS.






lunedì 20 luglio 2009

Linux ha il suo RAD



Tengo d'occhio per voi il progetto Freepascal, un progetto che porta avanti l'implementazione opensource del linguaggio ObjectPascal, seguendo con buon senso l'impostazione di Delphi, ma integrando e ripulendo con intelligenza un linguaggio che si è evoluto tumultuosamente, prima con grande slancio in ogni direzione, poi con grossi errori e ora con poco entusiasmo, questa implementazione spartana ma efficace, mi piace sempre di più.
Delphi è ancora un ottimo linguaggio se paragonato ai sui coetanei c++ e Visualbasic e in un certo ambito, è ancora competitivo se paragonato con i linguaggi più moderni.
Questo ambito è l'applicazione nativa con accesso al database, quello per cui è stato originariamente progettato.
Certo le webApp sono molto convenienti oggi per inserire e leggere dati, pascal non ha ancora tool di generazione automatica del livello di Rails(e a dirla tutta, non credo ne abbia bisogno, lasciamo il CRUD alle webApp), ma può assemblare eseguibili veloci e di dimensioni estremamente contenute adatti ad architetture particolari come ARM, può giovarsi del controllo completo del hardware, è multipiattaforma, non richiede alcun runtime, è molto semplice se paragonato a c++.
Do per scontato che Windows avrà meno mercato in futuro, anche se nessuno sa con quale velocità continuerà il declino.
Do per scontato che dispositivi come palmofoni e netbooks saranno i protagonisti del prossimo medio periodo, Nokia, google scommette che avranno OS linux e che saranno soprattutto web App ad accalappiare utenti, il mio modesto parere è che l'approccio webapp, l'approccio nativo e lo scripting abbiano rispettivamente un caso d'uso in cui risultano convenienti e vanno usati contemporaneamente senza pregiudizi ma anche senza che uno prevalga del tutto sull'altro, per fornire all'utente finale il prodotto migliore possibile.
D'altra parte Google stessa usa molte webapp come interfaccia al suo cavallo di battaglia, il motore di ricerca, che è sviluppato in C, tecnologia nativa old fashion.

giovedì 16 luglio 2009

Riprodurre mp3 da linea di comando

Linux dispone di un interessante programma a linea di comando che permette di riprodurre files musicali sulla macchina corrente.
la playlist è testuale e si può creare ad esempio in questo modo:
find ~/Music/* -type f -name '*.mp3' > ~/Music/Playlist.m3u
e ascoltare con questo comando
mpg123 -@ ~/Playlist.m3u
la cosa è molto interessante perché la generazione della playlist poterbbe essere automatizzata ad esempio con una interfaccia web, utile in un ufficio in cui più persone vorrebbero accedere ad una condivisione di molti files musicali e collaborare alla decisione della playlist.

giovedì 18 giugno 2009

I designer devono essere anche programmatori?

Essere grafico puro ottimizza la creatività, essere competente su più aspetti ottimizza i tempi di consegna.

Si potrebbe anche dire lo stesso dei programmatori, se conoscono molto bene css, js e un programma di fotoritocco possono portare molta + estetica nel progetto senza bisogno della costante supervisione di un grafico.

Da una parte il cervello umano è limitato, le ore di una giornata sono limitate, le energie sono limitate e infine, il talento è limitato.
Se si chiede a una persona di apprendere su fronti troppo dispersivi, otterrà risultati modesti su tutti i fronti perché oltre il livello base o intermedio, cioè al livello "master", si arriva soltanto con un abnegazione, sacrifici sforzi duro lavoro di una vita. E talento.

Dall'altra è dimostrato che le persone provenienti da campi diversi, con formazioni non convenzionali e variegate, possono apportare dosi di creatività addirittura tali da rivoluzionare un settore, una volta però che siano giunte ad un grado di padronanza della materia, tale da tenerle lontane dagli errori grossolani.

E' una equazione difficile, la mia interpretazione è che per la legge di Pareto(80% del beneficio dal 20% dello sforzo) sia conveniente masticare di un po' di tutto, al contempo occorre per forza essere al livello master in almeno una specialità, cioè il programmatore deve avere capacità logiche ferree, il grafico deve avere un senso estetico granitico, per una questione diciamo di Marketing, per ottenere la necessaria credibilità da parte degli altri membri del team occorre avere una identità professionale, essere un sicuro punto di riferimento per almeno un tipo di problema.




martedì 28 aprile 2009

I bambini imparano ciò che vivono.

Se un bambino vive nella critica impara a condannare.
Se un bambino vive nell'ostilità impara ad aggredire.
Se un bambino vive nell'ironia impara ad essere timido.
Se un bambino vive nella vergogna impara a sentirsi colpevole.
Se un bambino vive nella tolleranza impara ad essere paziente.
Se un bambino vive nell'incoraggiamento impara ad avere fiducia.
Se un bambino vive nella lealtà impara la giustizia.
Se un bambino vive nella disponibilità impara ad avere una fede.
Se un bambino vive nell'approvazione impara ad accettarsi.
Se un bambino vive nell'accettazione e nell'amicizia impara a trovare l'amore nel mondo.

Doret's Law Nolte

martedì 21 aprile 2009

Ottenere l'icona della prima pagina di un pdf

la stada più documentata è l'uso di imagemagick.

sudo apt-get install imagemagick

convert -thumbnail 300x300 test.pdf test.png
convert -thumbnail 300x300 test.pdf[0] test.png


massimo santi nel suo blog
propone il comando per estrarre la thubnail di una intera cartella di pdf

FOR %i IN (*.pdf) DO convert -thumbnail 30000@ "%i"[0] -strip -quality 95 PNG8:"%i".png

purtroppo la versione 6.3.7 che viene installata attualmente non funziona correttamente, provabilmente un bug.

la seconda possibilità prevede l'uso del programma GhostScript.

l'ottimo Jed’s fridge nel suo blog condivide uno script che fa uso di gs

allo stesso scopo.

aggiunto il parameto necessario per convertire solo la prima pagina lo script fa esattamente quello che cercavo

#!/bin/bash

if [ $# -ne 2 ];then
echo “Usage: $0 target.pdf outfile”
exit
fi

TARGET=$1

# -dFirstPage=1 -dLastPage=1 => serve a convertire solo la prima pagina!
#-sDEVICE=png16m
OUTFILE=$2
gs \
-dSAFER \
-dBATCH \
-dNOPAUSE \
-sDEVICE=jpeg \
-r150 \
-dTextAlphaBits=4 \
-dGraphicsAlphaBits=4 \
-dMaxStripSize=8192 \
-dFirstPage=1 \
-dLastPage=1 \
-sOutputFile=${OUTFILE}_%d.jpg \
${TARGET}

il passo successivo è scrivere il codice php necessario a sfruttare questa potente applicazione nel vostro progetto:

la mia prima proposta è molto semplice

function pdf_get_thumbnail($pdf){
$pdf = escapeshellarg($pdf);
$OUTFILE = $pdf.'.jpg';
$cmd = "gs -dSAFER -dBATCH -dNOPAUSE -sDEVICE=jpeg -r150 -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -dMaxStripSize=8192 -dFirstPage=1 -dLastPage=1 -sOutputFile=$OUTFILE $pdf";

exec($cmd, $output, $return_var );
return ( $return_var == 0 ? true : false)

}

$output = pdf_get_thumbnail($TARGET);
echo "
$output
";


a seconda delle esigenze applicative è possibile gestire ulteriori parametri, come il percorso
e il nome e il formato del file in output, le dimensioni dell'anteprima e molto altro.

man gs

per ulteriori ispirazioni.

martedì 14 aprile 2009

Growl: Notifiche the Unix way

Condivido con voi questo software interessante:

è un servizio di rete nativo da installare sui computer client, che ha la funzione di mostrare dei popup di notifica in stile outlook,

ariginariamente sviluppato per mac esiste un porting per windows,

la cosa è particolarmente interessante nel caso dei software web che normalmente per ragioni di sicurezza sono isolati da funzionalità di questo tipo

client win: http://www.growlforwindows.com/gfw/examples/js/

client mac: http://growl.info/about.php

implementazione delphi: http://growl.matf.de/

implementazione php: http://clickontyler.com/php-growl/

esiste poi un componente javascript simile negli intenti: http://ajaxian.com/archives/notimoo-brings-growl-to-mootools

giovedì 6 novembre 2008

ottenere il numero di versione dell'applicazione con svn e php

E' piuttosto semplice anche se utilizza una funzionalità poco conosciuta di svn.

inserendo la seguente linea di codice nel vostro file di configurazione generale es. config.php

define('APP_VERSION', substr(substr('$Rev: 146 $' , 6) , 0, -2) );

basta portarsi nella directory del file a dare il seguente comando svn

$svn propset svn:keywords Revision config.php

et voilà, ogni volta che si committa il file viene automaticamente aggiornato con il numero di versione corrente.

La cosa risulta particolarmente utile per sincronizzare l'applicazione su più server e con più sviluppatori contemporaneamente o per scrivere aggiornamenti automatici.

Potete sugerire qualche uso creativo di questa possibilità?

lunedì 27 ottobre 2008

classi css dinamiche vs. hacks

Tradizionalmente, abbiamo combattuto contro le incongruenze dei vari browser, aggiungendo codice css specifico per fissare il comportamento non standard.
il problema fino ad ora è stato individuare questi browser e porvi rimedio.
alla prima parte del problema, si può ovviare con i così detti hacks, cioè istruzioni mal formate che vengono interpretate solo in certe circostanze. nelle situazioni più favorevoli l'unico browser di cui occorrerà curarsi sarà IE, per il quale esiste una tecnica specifica, detta commento condizionale, con cui generalmente si include un css apposito.
questo css separato è sempre meglio degli hacks, che sono francamente inleggibili e impossibili da mantenere, ma ancora scomodo perché divide su più files le regole necessarie alla resa corretta della pagina.
una prima evoluzione del problema consiste nel usare i commenti condizionali per taggare il documento, in questo modo possiamo organizzare efficacemente il css.
questa tecnica è efficace, veloce e pulita ma funziona esclusivamente su IE, non funziona per safari ed opera e non distingue le diverse versioni dei navigatori ne il sistema operativo.
La naturale evoluzione di questo sistema permette di rivelare ogni dettaglio del navigatore in modo da scrivere codice preciso e pulito, prendendo spunto da questo articolo, ho ricavato la seguente funzione:


(function(){
var u=navigator.userAgent.toLowerCase(),
i=function(t){return u.indexOf(t)>-1;},
g='gecko',w='webkit',
c=[(!(/opera|webtv/i.test(u))&&/msie\s(\d)/.test(u)) ? ('ie ie'+RegExp.$1):
i('firefox/2')?g+'ff2':
i('firefox/3')?g+'ff3':
i(g+'/')?g:
/opera\s(\d)/.test(u)?'opera opera'+RegExp.$1:
i('konqueror')?w+'konqueror':
i('chrome')?w+'chrome':
i('applewebkit/')?w+'safari':
i('mozilla/')?g:'',
,i('mac')?'mac':i('win')?'win':''
,'js'];
alert(u);
document.getElementsByTagName('html')[0].className += c.join(' ');
})();


questa funzione è leggerissima ed esegue istantaneamente, regala a css l'elasticità che dovrebbe avere di default.

A mio parere una ulteriore evoluzione di questo metodo dovrebbe avvenire con un calcolo effettuto sul server, il browser deve infatti conoscere in anticipo come applicare i selettori e se il dom viene modificato da uno script, la renderizazione si ferma fintanto che non avviene la modifica e poi la cascata css deve essere ricalcolata, per cui o la si carica prima di ogni file css, oppure alla fine del caricamento del documento.

martedì 9 settembre 2008

Recipe to learn a programming language

1) find motivation, money is good motivation but love is better
2) study the theory, from books is better, from 3 to 10 books per subject seems to be the more efficient trade off
3) apply what you learn on real problems
4) test it with real people and real data
5) read the solution of others, look for them in the internet
6) refactor what you did with what you have recently learned
7) setup a more productive environment
8) pack your libs and utils and share them with others so that masters can review your code
9) repeat until you learned enough to be considered master
10) teach someone else, review the code of someone else

sabato 31 maggio 2008

python entra nella mia vita

E' ufficiale, python entra nella mia esistenza e in questo blog.
Da circa 2 mesi leggo http://reddit.com/r/programming/ ed è evidente dal numero dei post che la comunità mondiale tiene in grande stima python, mentre è piuttosto critica nei confronti di PHP.

il modo più semplice per scrivere una applicazione web in python è usare un .htaccess

AddHandler mod_python .py
PythonHandler mod_python.publisher
PythonDebug On

quindi in index.py

def index():
return "Hello, World!"
def test():
return "test"

ogni funzione in index.py corrisponde ad una azione, per cui ad
http://localhost/py/index.php/index
risponderà la funzione index, ad
http://localhost/py/index.php/test
risponderà la funzione test.

fin qui neinte di eccitante ma è significativo che questo sia il modo più semplice che io abbia trovato per far funzionare un handler, se mi posso permettere la "convention over configuration" dell'architettura di php, una pagina una richiesta, mi sembra di gran lunga più semplice e chiara di questa configurazione.

lunedì 31 marzo 2008

Mi son imbattuto in un post Illuminante, che voglio condividere con voi:
http://www.valuedlessons.com/2008/01/garlic-programmers-for-silver-code.html

buona lettura