Ricerca tra la vecchia roba

Genetic Programming

Posted: Gennaio 11th, 2010 | Author: | Filed under: Ci, genetica, Programmazione | 2 Comments »

Succede che giri per la rete e vedi una cosa figa, succede che senti il bisogno impellente di riuscire a farlo anche tu (non sto parlando di fare un figlio con jessica alba) e quindi ti prodighi nel compiere il tuo destino.

Orbene, ho visto questo post in cui l’autore utilizzando algoritmi genetici riesce a riprodurre un disegno della monna lisa usando solo poligoni; non ho guardato il suo codice ma mi pare di aver capito che lo ha fatto in .NET, io l’ho scritto direttamente in C, con interfaccia creata tramite librerie cairo (in realtà uso una mia libreria che infatti va compilata a parte).

Read the rest of this entry »


Sottocomandi custom di git

Posted: Novembre 3rd, 2009 | Author: | Filed under: Bash, Hack, Programmazione | Commenti disabilitati su Sottocomandi custom di git

Da un bel po’ di tempo ormai ho scritto la mia guida git (che peraltro è il mio post più letto) e il tool in questione ormai è andato oltre l’umana comprensione in usabilità e utilità (tranquilli non vengo pagato per questa pubblicità); adesso che sono disoccupato ho un po’ di tempo da dedicare a quello che ho appreso durante quest’anno di lavoro "professionale".

Git come strumento è proprio una toolbox, cioè un insieme di sottocomandi che permettono di eseguire funzioni appropriate su un repository di codice sorgente (e non); come toolbox non potrebbe essere completo se non permettesse di definire comandi custom e non mettesse a disposizione una "libreria" per facilitare le funzioni comuni. Tranquilli, non si parla di linkare codice in C (anche se ha il suo fascino of course) ma di scrivere un semplice (in questo caso di esempio) script per perlustrare le possibilità messe a disposizione.

Partiamo creando un repository di test nella directory temporanea

$ cd /tmp/
$ mkdir testing
$ cd testing
$ git init
Initialized empty Git repository in /tmp/testing/.git/

e di seguito create un file chiamato git-packz

$ cat > git-packz
#!/bin/bash

USAGE="$0 <message>
script di test per sottocomando git
"

PATH=$(git –exec-path):$PATH
. git-sh-setup

if [ $# -lt 1 ]
then
    usage
fi

echo "message: "$1

Adesso dentro questo repository è possibile chiamare il comando eseguendo

$ PATH=.:$PATH git packz miao
message: miao

Questo era solo un esempio, quando avrete scritto uno script che considerate definitivo spostatelo (linkatelo) in una directory puntata dal vostro PATH così da poterlo chiamare tramite un semplice git <nome script da cui si elimina il prefisso "git-">; come potete vedere lo script di esempio è molto semplice e l’unica parte fondamentale è quella in cui viene caricata in memoria dalla shell il contenuto di git-sh-setup. Questo non è altro che uno script che definisce alcune funzioni general purpose proprie di un repository git, cioè

  • die
  • usage
  • set_reflog_action
  • git_editor
  • is_bare_repository
  • cd_to_toplevel
  • require_work_tree
  • get_author_ident_from_commit

Per sapere cosa servono leggetevi la pagina di manuale.


Nasty old people

Posted: Ottobre 14th, 2009 | Author: | Filed under: Programmazione | Commenti disabilitati su Nasty old people

È uscito libero per il download un film indipendente: Nasty old people; la filmaker Hanna Sköld ha chiesto un finanziamento di 10K€ sotto forma di prestito bancario e ha deciso di distribuirlo liberamente tramite una licenza creative commons (pare che sia il primo di questo genere).

 

nasty old people

 

 This is the story of Mette. Member of a neo-Nazi gang, her day job is to take care of four crazy
old people that all are just waiting to die. Her life becomes a journey
into a burlesque fairytale, where the rules of the game are created by
Mette herself. Mette is indifferent about her way of life, until she
one night assaults a man, kicking him senseless. Waking up the day
after, she realizes that something is wrong, and in company with the
her crazy oldies she longs for respect and love. She can tell that the
old folks are marginalized by the modern society, but together they
create a world and a voice of their own.

Io l’ho visto e mi è piaciuto; secondo me è fatto abbastanza bene per essere stato prodotto nel tempo libero, cmq se lo guardate fatemi sapere cosa ne pensate (è in svedese con i sottotitoli a parte).

Il torrent potete trovarlo su piratebay ;-).

UPDATE: esiste anche un torrent con aggiunti i sottotitoli italiani, lo potete trovare a TNTVillage.


Creare un archivio di testing per terze persone usando git & pbuilder

Posted: Settembre 14th, 2009 | Author: | Filed under: Programmazione | Commenti disabilitati su Creare un archivio di testing per terze persone usando git & pbuilder

Succede che uno fa un lavoro e che qualcun’altro (il committente) debba visionarlo per dare un giudizio o feedback su quanto fatto, ma succede anche che questo non se ne intenda di computer, quindi per fare un test di un progetto django in locale, mantenuto tramite git, non possa dirgli di "clonarsi il repository dall’URL blabla e inizializzare il database in maniera opportuna e poi leggi il README per le istruzioni e se non funziona RTFM". Read the rest of this entry »


Use the source luke

Posted: Luglio 17th, 2009 | Author: | Filed under: Hack, Programmazione | Commenti disabilitati su Use the source luke

Oggi ho scoperto questa web application: detexify; in pratica puoi disegnare un simbolo del latex e il programma visualizza la sequenza di controllo relativa. La cosa che mi ha colpito è il fatto che il sito sembra in flash ma in realtà è puro javascript e le funzioni di disegno sono espletate tramite tag canvas (di cui ho già parlato qui).

La ficata è che osservando il codice ho scoperto alcune cose interessanti

  • Esiste una funzione relativa alla tag canvas che permette di esportare una immagine generata sul canvas: toDataURL; prende come argomento il formato dell’immagina che si intende ottenere (tipo ‘image/png’).
  • In javascript è possibile andare a capo in questa maniera particolare:

    $(canvas).mousedown(start)
               .mousemove(stroke)
               .mouseup(stop)
               .mouseout(stop);

    io pensavo che in javascript non si potesse andare a capo fino ad un punto e virgola.

Per chi ha voglia di testare del codice relativo a toDataURL si becchi il codice qui. Come potete vedere fare un mini editor grafico è possibilissimo con poche righe di codice.
Quindi il mio consiglio è: quando vedete un sito fico che fa cose che non sapreste come implementare, scaricatevi il codice.


Indentare file xml

Posted: Luglio 7th, 2009 | Author: | Filed under: Bash, Hack, Programmazione | Commenti disabilitati su Indentare file xml

Magari dovete lavorare su file XML di una discreta dimensione e magari usare xpath per estrane info utili ai vostri scopi (uscire con jessica alba?); il casino è che magari il file XML non è formattato in maniera human readable e quindi dovreste indentarlo per capire dove cazzo si trova il nodo che ci interessa. La maniera da manovale è farlo a mano: si parte dall’inizio del file e alla fine di ogni <tag> si inserisce un "nt" e alla fine di </tag> si inserisce un newline e si toglie un TAB dalla lista (non è proprio semplice come pensavo prima di iniziare a scrivere questo post).
Read the rest of this entry »


Installazione TDS compliant di pgf

Posted: Giugno 28th, 2009 | Author: | Filed under: Hack, Installation party, Life, Programmazione, TeX | Commenti disabilitati su Installazione TDS compliant di pgf

Succede che magari un hosting abbia addirittura installato TeX sulle macchine, ma noi necessitiamo anche di pgf, un ottimo pacchetto per TeX che permette di produrre grafici fichi, alla stregua del metapost ma molto più semplici da codare, che però dobbiamo installare in locale; come fare? non so se avete mai visto la struttura delle directory di pacchetti TeX (situate di solito in /usr/share/texmf/) ma vi posso assicurare che sono un bel groviglio e non avendo accesso come amministratore non posso installarlo se non in locale appunto. Read the rest of this entry »


Sniffjoke

Posted: Aprile 8th, 2009 | Author: | Filed under: Hack, linux, networking, Programmazione | 3 Comments »

I pazzi di delirandom presentano un nuovo strumento per rendere partecipi i people della rete delle problematiche della stessa: sniffjoke; in pratica si tratta di un tool che immette pacchetti che si prendono gioco degli sniffer inserendone alcuni nella comunicazione che lo stack TCP/IP di un OS non caga ma che uno sniffer alla wireshark ha problemi a gestire. Per adesso funziona solo per le connessioni lato client ma se qualcuno è interessato al suo sviluppo può partecipare per implementare il lato server… Read the rest of this entry »


I segreti della linea di comando

Posted: Gennaio 30th, 2009 | Author: | Filed under: Bash, Hack, Life, Programmazione | 3 Comments »

A furia di lavorare al computer ho imparato un paio di cosette veramente cool… prima di tutto però una introduzione su cosa è la shell: l’oggetto che ci permette l’interazione su un sistema *nix, chiamato solitamente terminale, benché abbia un’aria così anni 70 permette un macello di azioni simpatiche e performanti.

Prima di tutto la linea di comando di solito è preceduta da un cosidetto prompt, cioè l’indicatore dello stato del terminale (ne esistono 4 diversi) utile per avere informazioni riguardanti la directory in cui ci troviamo, il computer in cui ci troviamo (il cosidetto host) e che utente siamo (cose non date per scontate in un sistema multiutente). Quando viene eseguito un comando all’interno succede una cosa carina:viene eseguita una chiamata di sistema che sostituisce il processo con quello eseguito (la execv e famiglia) con una piccola accortezza dovuta al fatto che ci sono due tipi di programmi, gli eseguibili e gli script; i secondi hanno la particolarità di necessitare di un interprete per funzionare (può essere la stessa shell, può essere l’interprete python, awk etc…). Proprio a questo scopo esiste il cosidetto numero magico del file: siccome il computer non può fidarsi della estensione del file per riconoscerne la natura, visto che l’estensione non è neanche una specifica di nessun tipo se non per winzoz, legge i primi 3/4 byte di un file per riconoscerlo attraverso una segnatura, chiamata appunto numero magico; provate a eseguire su un file PNG il comando head -c 4 e vedrete che uscirà una stringa contenente proprio il formato. Nel caso di un file di script, la sequenza magica è #!, seguita dal percorso dell’interprete. Se quindi viene chiesto di eseguire un file ‘mioscriptpaura.sh‘ che ha al suo interno come prima riga la sequenza #!/bin/sh, il sistema eseguirà invece /bin/sh mioscriptpaura.sh.

Ogni programma *nix può essere immaginato come una scatola nera, di cui non conosciamo l’implementazione, impegnata in un’azione particolare sul suo input per restituire un output diverso, tenendo conto anche di eventuali messaggi di errore o di log relativi all’azione particolare; ad ognuno di questi flussi di dati (detti stream)  è associato un file descriptor, chiamati rispettivamente standard input, standard output e standard error. La cosa carina è che è possibile concatenare comandi per ottenere una cosidetta pipeline e generare tramite sequenza di comandi semplici, azioni complesse; il modo attraverso cui questo è possibile è la pipe, ottenuta attraverso il carattere |. Per fare un esempio, se necessitiamo di controllare se è stata montata la partizione di swap del sistema al boot, dovremmo spulciare le righe di dmesg una ad una, ma usando grep, comando che cerca l’occorrenza di una data stringa in un file, possiamo facilitarci la vita nella seguente maniera

$ dmesg | grep swap
[   28.276971] Adding 2931852k swap on /dev/sda2.  Priority:-1 extents:1 across:2931852k

Ovviamente il carattere | non può essere utilizzato normalmente, ma deve essere trattato con cura (provate a creare una file che lo contenga ;-)). Altre ficate della shell *nix sono la redirezione degli stream descritti sopra: magari noi vogliamo salvare il risultato della elaborazione su un  file oppure prendere un file come standard input per un comando e proprio per questo ecco la magia

COMANDO < INPUT_FILE
COMANDO > OUTPUT_FILE
COMANDO >> OUTPUT_FILE
COMANDO < INPUT_FILE > OUTPUT_FILE
COMANDO < INPUT_FILE >> OUTPUT_FILE

Nel primo caso usiamo le righe di INPUT_FILE come se fossero scritte direttamente sul terminale dopo aver avviato COMANDO (equivalente peraltro a cat INPUT_FILE | COMANDO), nel secondo caso in OUTPUT_FILE viene scritto il risultato dell’esecuzione di COMANDO; il terzo caso è l’unione dei due precedenti. Particolare attenzione riveste l’operatore >> che apre il file in questione e aggiunge alla fine il risultato del comando (l’operatore > nel caso esista già il file e non sia vuoto, lo riscrive da zero).

Esiste anche l’operatore << che permette di ottenere i cosiddetti Here document; eseguendo

cat <<EOF > porcatroia.txt
sei solo una troia, pensi solo ai $soldi
EOF

ottieni nel file porcatroia la riga "sei solo una troia, pensi solo ai ", la mancanza di $soldi è dovuto al fatto che la shell cerca di sostituirlo con una variabile, per essere riprodotto testualmente, bisogna quotare EOF, ma quello del quoting nella prossima puntata.

Per finire mostro solo la presenza di ulteriori operatori logici presenti nella shell: un programma può nella sua esecuzione incontrare dei problemi/errori dovuti a situazioni particolari (disco pieno, file inesistente, digos) e quindi può comunicarlo alla shell tramite il suo valore di ritorno: nel caso questo sia diverso da zero allora c’è stato un problema altrimenti è tutto ok. La variabile che contiene il valore di ritorno è $?.

Bene, questo può essere usato per concatenare comandi; nel caso vogliamo eseguire un dato comando dopo il successo di un altro dobbiamo porre l’operatore && tra di essi. Nel caso in cui vogliamo eseguire un comando nel caso il primo fallisca, si usa l’operatore ||. Ovviamente non potrete utilizzare normalmente questi comandi in nomi di file.


Comunicazione fra processi e “non aprite quello STREAM”

Posted: Agosto 30th, 2008 | Author: | Filed under: Ci, Programmazione | Commenti disabilitati su Comunicazione fra processi e “non aprite quello STREAM”

Quello che segue è un esempio di codice in cui viene utilizzato l’output di un programma come input di quello principale; viene utilizzato un sistema di pipe(7) per far comunicare la coppia di processi che si originano in seguito ad una fork(2): in particolare questo programma prende come argomento il nome di un file e ne restituisce il checksum effettuatto attraverso il commando da shell md5sum(1). Il codice lo trovate qui.

Quest’altro invece mette in risalto una caratteristica di un sistema operativo nel trattare i file descriptor, cioè gli indici che internamente vengono usati per tenere conto dei file aperti; i file descriptor sono molto importanti siccome nella filosofia degli Unix è che ogni cosa è vista come un file ed in particolare ogni programma al suo avvio ha almeno tre file descriptor (o stream nella terminologia dell’ANSI C) lo standard input, output ed error. Il problema che si può avere è che chiudendo questi file descriptor all’avvio del programma, un eventuale successiva apertura di un file andrebbe ad occupare quelli che precedentemente erano collegato con gli stream standard citati precedentemente (il sistema restituisce il primo file descriptor libero) e se magari avete una routine di logging che cerca di scrivere su qualche stream che pensa aperto, le conseguenze potrebbero essere belle bastarde. Il codice può farvi capire quello che sto cercando di spiegare.