GENNAIO 5TH, 2012
By QUALSIASI
I’m making a medium-small client-server program as a final class project, and today I tried for the first time to execute the two main parts on different machines. The “server” was my linux box, running Archlinux, exporting a set of remote objects (well, factories… nevermind) and the “client” was my Macbook.
Something strange happened.
I was running a simple program that did list all remote objects available and execute a method on them (all of them were implementing the same interface). The registry.list() was giving me results, so I tought all was working and then I got a “Connection Refused” Exception, saying it couldn’t connect to “127.0.0.1″.
Of course there would be no need at all to connect to 127.0.0.1 as my RMIRegistry was up and running on 192.168.1.5, so I tried launching the registry with:
rmiregistry -J-Djava.rmi.server.hostname=192.168.1.5
nothing. Same error. It took me more or less an hour on google (mainly because I didn’t know what to search for) and then I got myself to this page, telling that on solaris (and on my linux box!) you need to edit your “/etc/hosts” file to make RMI generate stubs correctly (otherwise it generates stubs which embed 127.0.0.1 as IP address). So I added this line at the end of the file:
192.168.1.5 Server
and all started working as it should.
Nice. Thanks to: http://blogs.oracle.com/observatory/entry/rmi
PS: Excuse my English.
PPS (Italian) : visto che ho avuto molte difficoltà a trovare questo tipo di informazioni ho deciso di riportarle in inglese nella speranza che potessero essere utili per qualcuno.
MARZO 28TH, 2011
By QUALSIASI
Spotlight è un motore, integrato in OSX, per la ricerca di file sia tramite dati che metadati. Poche informazioni sono reperibili online, ma queste ricerche sono disponibili anche da command line (e quindi potenzialmente inseribili in programmi, script, etc…)
Vediamo velocemente una piccola introduzione. Innanzitutto preso un generico file su OSX, che sia indicizzato, possiamo vedere tutti i suoi dati con il comando mdls:
$ mdls update-cm-7.0.0-RC1-N1-signed.zip
kMDItemContentCreationDate = 2011-02-16 12:39:47 +0100
kMDItemContentModificationDate = 2011-02-16 12:42:02 +0100
kMDItemContentType = "public.zip-archive"
kMDItemContentTypeTree = (
"public.zip-archive",
"com.pkware.zip-archive",
"public.data",
"public.item",
"com.apple.bom-archive",
"public.archive"
)
kMDItemDisplayName = "update-cm-7.0.0-RC1-N1-signed.zip"
kMDItemFSContentChangeDate = 2011-02-16 12:42:02 +0100
kMDItemFSCreationDate = 2011-02-16 12:39:47 +0100
kMDItemFSCreatorCode = ""
kMDItemFSFinderFlags = 0
kMDItemFSHasCustomIcon = 0
kMDItemFSInvisible = 0
kMDItemFSIsExtensionHidden = 0
kMDItemFSIsStationery = 0
kMDItemFSLabel = 0
kMDItemFSName = "update-cm-7.0.0-RC1-N1-signed.zip"
kMDItemFSNodeCount = 0
kMDItemFSOwnerGroupID = 20
kMDItemFSOwnerUserID = 502
kMDItemFSSize = 83449050
kMDItemFSTypeCode = ""
kMDItemKind = "Archivio zip"
kMDItemLastUsedDate = 2011-02-16 12:42:02 +0100
kMDItemUsedDates = (
"2011-02-16 00:00:00 +0100"
)
kMDItemWhereFroms = (
"http://mirror.kanged.net/RC/update-cm-7.0.0-RC1-N1-signed.zip",
"http://mirror.teamdouche.net/?device=passion"
)
Vediamo una lunga serie di metadati collegati al tipo di file, per un file audio saranno i tag ID3, per una foto invece avremo altezza, larghezza, risoluzione, colorspace e molte altre informazioni. La cosa, a mio avviso, più interessante è il fatto che tutti i file scaricati da internet avranno il campo “kMDItemWhereFroms” che salva l’url dal quale è stato scaricato il file, e il suo referrer. Il comando “mdfind” funziona come il classico find/locate di unix, ma permette di ricercare anche per “metadati”, ad esempio per trovare tutte le immagini scaricate da facebook, useremo il comando:
mdfind "kMDItemWhereFroms = *fbcdn*"
Divertitevi!
MARZO 10TH, 2011
By QUALSIASI
Non ho pubblicato altre soluzioni ai puzzle di Facebook perché ho scoperto che esiste una community online che contiene questi ed altri puzzle, e ha delle classifiche, punteggi… e non vorrei rovinare il gioco a nessuno.
Visto che di qualcosa devo pur parlare inizio con IntelliJ IDEA che è proprio un ambiente di sviluppo ben fatto – abbastanza leggero e con un autocompletamento/suggerimento molto apprezzato (da me).

Screenshot di IntelliJ IDEA sul mio Mac
Se non sbaglio ha anche qualche opzione per importare progetti già iniziati su Eclipse, e forse pure su NetBeans – io li ho installati tutti e tre, però per il momento il mio voto è per IDEA… purtroppo Google supporta gli sviluppatori Android con plugin per il solo Eclipse, che nel caso di programmi per smartphone sembra più indicato. Sembra. Io ho provato una piccola app anche su IDEA e ha tutti gli shortcut necessari per generare l’apk e per provarlo sull’emulatore.
Buono a sapersi.
FEBBRAIO 25TH, 2011
By QUALSIASI
Periodicamente cercherò, nel tempo libero, di risolvere alcuni dei puzzle “più facili” che si possono trovare in questa pagina: http://www.facebook.com/careers/puzzles.php. Sono dei simpatici modi di esercitarsi a programmare, e nel caso risolviate in modo giusto ed efficiente alcuni di quelli più difficili – c’è il rischio di venire contattati da Facebook per un posto di lavoro (mica male eh?).
I primi di cui invio la soluzione sono banali – quelli di prova. Di seguito la mia proposta di soluzione al problema che si chiama “Hoppity Hop!” (in Java)
package facebookpuzzles;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
/**
* @author Qualsiasi
*/
public class HoppityHop {
private String f_name;
private Integer numero;
private int i;
HoppityHop(String filename) {
f_name = filename;
}
public void run() throws FileNotFoundException {
File in = new File(f_name);
Scanner scan = new Scanner(in);
numero = scan.nextInt();
for (i=1;i < = numero;i++) {
if ( (i%3 == 0) && (i%5 != 0)) {System.out.printf("Hoppity\n");}
if ( (i%3 != 0) && (i%5 == 0)) {System.out.printf("Hophop\n");}
if ( (i%3 == 0) && (i%5 == 0)) {System.out.printf("Hop\n");}
}
}
}
Ovviamente l’oggetto va istanziato, il costruttore prevede il nome del file contenente il numero come parametro e poi si chiama il metodo “run()”.
E ora l’ancor più banale soluzione, in C, a Meep meep! – il secondo puzzle.
#include
int main(int argc, char **argv) {
/* non leggere argv[1] */
printf("Meep meep!\n");
}
Alla prossima.
MAGGIO 14TH, 2009
By QUALSIASI
Cavolo, la passione per la programmazione e lo scripting risale praticamente alla prima superiore, quando si usava il pascal a scuola. Turbo Pascal per la precisione. Un linguaggio da matematici. Adesso per lo più uso PHP e Bash, ma ovviamente sono passato per il periodo C, anzi, tutt’ora reputo il C potentissimo, ma lo uso solo quando ne ho strettamente bisogno.
Oggi, anzi, poco fa, ho riscoperto la mia cartella “projects” che ha sempre contenuto esperimenti vari più che veri progetti, e ho trovato il cuore pulsante di un MUD (si, ci giocavo. si, ho smesso). Riguardando il codice, che alla fine non fa altro che aprire una porta in ascolto, scrivere “Ciao” e stare in ascolto da tutti i client facendo un echo di quello che riceve, mi sono accorto che… tutto sommato non ero proprio un pischello, ma c’era molto copia-incolla nei miei programmi.
Ecco cosa mi ha colpito:
tmp_size = sizeof tmp_sockaddr;
if (getpeername(tmp_socket, (struct sockaddr *) &tmp_sockaddr, &tmp_size) < 0) printf(“[WARNING] Can’t perform getpeername().\n”);
Mah, è ipnotico. Lol.