Category: linux

Java RMI stubs keep connecting on wrong IP address ( 127.0.0.1 )

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.

Recuperare l’errore “Invalid node structure” (recovery) su Snow Leopard + English Version

For a short ENGLISH version (very very short) scroll to bottom of the article.

Attenzione: prima di tutto questa non è una procedura standard, è solo il resoconto di come IO abbia risolto questo problema sul MIO MacBook – non mi dilungo in spiegazioni sui comandi e concetti dei sistemi unix-like, se capite quello che c’è scritto bene, altrimenti lasciate un commento e proverò a darvi chiarimenti, oppure rivolgetevi a qualcuno con conoscenze adeguate. È fondamentale capire che non mi assumo alcuna responsabilità se provando questa procedura perdete tutti i dati, vi si rompe il mac, o simili – fatelo a vostro rischio e pericolo.

Ieri sera il MAC si era freezato – il motivo è presto detto: tempo fa mi è scivolato (una ventina di centimetri) mentre il drive stava scrivendo, immagino che si sia rovinato parzialmente il disco, o il filesystem. Il giorno dopo riavviando il sistema andava lentissimo e il comando “sudo dmesg” segnalava diversi “Disk I/O error”. Questo errore in realtà segnala sia problemi hardware (per i quali il drive va sostituito) sia problemi software – ad esempio inconsistenze nel filesystem. Il mio era il secondo caso (è per questo che non sono sicurissimo che il drive si sia danneggiato, potrebbe aver “rimappato” i settori danneggiati su quelli di riserva) – ed ho risolto avviando il mac in modalità singolo utente (bisogna premere cmd+s all’accensione) e lanciando il comando “fsck -fy”, che in teoria è prassi standard per risolvere certi problemi (e in linea di massima non necessita di un backup) – ma il problema che mi si era presentato stamattina era ben diverso, e non risolvibile in questo modo.

Il comando fsck, sta per “filesystem check” ed è in grado di riparare i danni al filesystem, o comunque di renderlo funzionante (al costo di perdere alcuni dati) – per questo consiglio un backup di tutto ciò che è leggibile, e possibilmente anche dell’intera immagine del disco, prima di procedere. Per fare un backup basta inserire un drive esterno (usb), montarlo, e copiarci dentro tutti i dati.

Nel dettaglio, prima di inserire il drive esterno, lanciate questo comando e guardate l’output.

# ls /dev/disk*
/dev/disk0	/dev/disk0s1	/dev/disk0s2

Ora inseriamo il drive e lanciamo di nuovo il comando

# ls /dev/disk*
/dev/disk0	/dev/disk0s1	/dev/disk0s2	/dev/disk1	/dev/disk1s1

Ecco, in questo esempio il drive esterno ha preso il nome di “disk1″ e la sua unica partizione (nel mio caso NTFS) si chiama “disk1s1″. A questo punto, dobbiamo creare una cartella dove “montare” il drive, e fare il mount. Ri-montiamo il root in modalità read-write, con il comando “mount -uw /”, creiamo il mountpoint “mkdir /mnt” e finalmente facciamo il mount (nel caso di ntfs, di avere il supporto ntfs-3g, e del drive disk1 con unica partizione) : “mount -t ntfs-3g /dev/disk1s1 /mnt”.

A questo punto potreste avere qualche warning, o errore di timeout (io ho avuto quest’ultimo) ma facendo “ls /mnt/” possiamo controllare che il drive sia montato – vedendo se il terminale ci elenca i contenuti. A questo punto ho creato un archivio “tar” contenente tutta la mia directory utente, con il comando

tar -cvf /mnt/backup.tar /Users/qualsiasi

Dove sostituirete il vostro username al mio, ovviamente. Se uno volesse proprio essere sicuro, potrebbe anche farsi una copia byte per byte del drive sul mac, con

dd if=/dev/disk0s2 of=/mnt/mac_hd.img

Vi invito a leggere la manpage di dd per conoscere le opzioni aggiuntive da dare (bs count etc…) – Ma soprattutto fate attenzione che il file “mac_hd.img” non esista già sul vostro drive (verrà sovrascritto senza chiedere conferma).

Attenzione: dev’essere vostra cura fare il backup di tutti i file necessari, nel mio caso mi importava solo della directory utente, ma voi potreste avere file importanti anche in altri punti del filesystem. Io per i dati più importanti uso anche un servizio esterno, gratuito, e multipiattaforma (OSX, Linux, Windows, Android..) che è Dropbox, questo è il mio “referral link”.

Completati questi passaggi possiamo tentare questo comando, che è un po’ l’ultimo tentativo prima di dover formattare tutto (o addirittura cambiare drive) e ripristinare i propri dati dal backup.

Riavviamo di nuovo in “single user” (con cmd+s all’accensione) e lanciamo questo comando:

# fsck_hfs -pfry /dev/disk0s2

Ricordatevi che il risultato potrebbe portarvi in qualunque situazione, da un mac completamente funzionante (come quello dal quale sto scrivendo quest’articolo) ad un limbo con il drive vuoto – potrebbe perdervi tutti i dati non backuppati, e per sfregio potrebbe anche autodistruggere il macbook. A vostro rischio e pericolo, divertente il fatto che le opzioni contengano proprio “fry” a ribadire la pericolosità. Se siete fortunati, dopo un bel po’ di lavoro vi dirà che il filesystem è ok. Se siete sfortunati come lo sono stato (parzialmente) io, vi dirà che dopo tre tentativi non è riuscito a correggere l’errore. In questo caso lanciate il comando “fsck -fy” una o due volte, finchè non vi dice che è tutto ok. Se continua a darvi errore – mi sa che dovete buttare il drive e/o formattarlo e reinstallare tutto. Almeno ci abbiamo provato.

Attenzione: prima di tutto questa non è una procedura standard, è solo il resoconto di come IO abbia risolto questo problema sul MIO MacBook – non mi dilungo in spiegazioni sui comandi e concetti dei sistemi unix-like, se capite quello che c’è scritto bene, altrimenti lasciate un commento e proverò a darvi chiarimenti. È fondamentale capire che non mi assumo alcuna responsabilità se provando questa procedura perdete tutti i dati, vi si rompe il mac, o simili – fatelo a vostro rischio e pericolo.

Warning: this is NOT a standard procedure – it’s the way I have fixed MY macbook – i’m not here to explain unix-like commands and concepts, I you understand what’s written good – if not you could leave a comment or ask someone who knows. I’m not taking any responsibility over any damage this procedure could cause to your mac, ranging from data loss to global termonuclear war (and all things in between).

This morning I had a “Disk I/O Error” in the dmesg, and I tried the standard procedure of booting single user and running fsck, but i got an “Invalid node structure” error. So I did a backup on a USB external drive of my user folder. To do this backup i ran (at command line) “ls /dev/disk*” before and after connecting the drive – so I could identify what was his name in the system. In the examples above you could see my drive was “disk1s1″ (this means disk one – partition one, my usb drive has only one partition). I had to make root filesystem writeable, with “mount -uw /” and to create a mountpoint “mkdir /mnt” – after this I mounted the drive with “mount -t ntfs-3g /dev/disk1s1 /mnt” (pay attention, this is for a NTFS drive on a MAC with macfuse+ntfs-3g installed, your setup may be different).

After mounting the drive, I did a “tar -cvf /mnt/backup.tar /Users/my_user” to backup all my stuff. If I had enough space (and enough time) I could have done a “dd if=/dev/disk0s2 /mnt/disk.img” (check on the drive if disk.img already exists, this command doesn’t ask for confirmations to overwrite).

Warning: backup ALL you need. I kept all my files in my user directory, but it’s up to you to see where your data is and backup it properly. For important files I use an external service available on OSX, Linux, Windows and Android, Dropbox: this is my referral link.

After this i did a (be careful, this command will likely loose some data, or ALL data, on the disk) “fsck_hfc -pfry /dev/disk0s2″ and waited to finish (takes long time). It reported it cannot fix the drive in 3 attempts, so I ran “fsck -fy” after that (i needed to run two times) to finally read on the screen that the filesystem was successfully fixed. If yours keeps saying it’s not fixed chances are that you’re gonna have to change the hard drive, or at least need to do a full format and reinstallation. At least we tried.

Creare un Video partendo da una serie di immagini

Un amico mi ha chiesto se potevo montare una serie di immagini in un video, di modo da proiettarlo durante una serata in cui si esibiva. La prima cosa che ho pensato, da buon Linux-user, è stata quella di usare mencoder per codificare la serie di immagini in un video, usando un FPS piuttosto basso.

Per dare un effetto più “psichedelico” al video però decidemmo che le immagini dovevano comparire per un numero di frame variabile, fra i 2 e i 5 frame (che in un video a 25fps vuol dire, dagli 8 ai 20 centesimi di secondo) – così lo script è stato modificato di conseguenza.

Le immagini andavano montate in una sequenza casuale, e andavano ricercate nella cartella corrente e in tutte le sotto-cartelle – nessun problema in quanto l’utilizzo di find per trovare i file, e shuf per rimescolarne la lista rendono il compito davvero facile. I passaggi da fare prima di lanciare mencoder per la codifica finale sono: convertire le immagini alla risoluzione finale del video (in questo caso 720×576 PAL) e inserire un logo (al centro, ma è modificabile) – tutto questo viene fatto con convert e composite. Il loop finale crea un file list.txt contenente ad ogni riga il nome del file che deve comporre ogni frame del video – in questo caso tutte le immagini compaiono 10 volte, come impostato dalla variabile $ITER.

Lo script è molto grossolano – però funziona abbastanza bene, ed è comunque una base di partenza per chiunque abbia necessità di fare qualcosa di simile. Eccolo:

#!/bin/bash
SAVEIFS=$IFS
IFS=$(echo -en “\n\b”)

ITER=10
DIR=`mktemp -d`
LISTA=`find -iname *.jpg | shuf`
COUNT=0

for i in $LISTA; do
COUNT=$(($COUNT+1))
cp “$i” “$DIR/$COUNT.jpg”
done;

for i in `seq 1 $COUNT`; do
convert -resize 720×576! “$DIR/$i.jpg” “$DIR/$i.jpg”
# watermark
composite -gravity center logo.png $i.jpg $i.jpg
done;

for k in `seq 1 $ITER`; do
for i in `seq 1 $COUNT | shuf`; do
for j in `seq 1 $((2+$RANDOM%4))`; do
# 5FPS – for j in `seq 1 5`; do
echo “$DIR/$i.jpg” >> “$DIR/list.txt”
done;
done;
done;

mencoder mf://@$DIR/list.txt -mf w=720:h=576:fps=25:type=jpg -ovc lavc \
-lavcopts vcodec=mpeg4:mbd=2:trell -oac copy -o output.avi

IFS=$SAVEIFS

Purtroppo ho perso l’indentazione, non che sia necessaria per così poche righe di testo. Se non funzionasse, fate attenzione al comando mencoder spezzato su due linee… per altri problemi, ci sono i commenti!

Aggiornare automaticamente ArchLinux

Dopo il passaggio da Slackware ad ArchLinux, mi sono ritrovato ad abituarmi ad una rolling-relase, ovvero una distribuzione continuamente aggiornata (tecnicamente non adatte a dei server.. ma io ne faccio un uso desktop). Di tanto in tanto gli aggiornamenti sono massicci, anche più di 1 GB, tanto che non possono essere completati in pochi minuti. Per ovviare a questo problema ho creato un file in /etc/cron.daily/ con il nome di ‘pacman-brake’ (il nome è comunque arbitrario) per lanciare ogni giorno il download (ma non l’installazione!) di nuovi pacchetti. Le dipendenze da installare sono, nel mio caso, solo netbrake (e immagino anche nel vostro, visto che cron dovrebbe essere incluso nell’installazione core), in ogni caso:

pacman -S netbrake cron

Fatto questo, basta creare il file /etc/cron.daily/pacman-brake, e al suo interno:

#!/bin/sh
# Scarica aggiornamenti
/usr/bin/netbrake -r 150000 /usr/bin/pacman -Syuw –noconfirm > /dev/Null 2>&1

Così il vostro sistema eseguirà giornarlmente il comando, scaricando ad una velocità massima di 150 kB/s gli aggiornamenti senza chiedere conferma (–noconfirm) e senza installarli (-w).

Sono abitudinario, e al mattino…

… mi sveglio, faccio colazione, mi lavo e poi lancio

rsync -avz –delete –delete-after –progress rsync://$MIRROR_PREFERITO/slackware/slackware64-current /Slackware/

Poi se mi sveglio fin troppo fresco, reinstallo tutto e creo l’iso del DVD con:

mkisofs -o ~/slackware64-dvd.iso \
-R -J -A “Slackware Install” \
-hide-rr-moved \
-v -d -N \
-no-emul-boot -boot-load-size 4 -boot-info-table \
-sort isolinux/iso.sort \
-b isolinux/isolinux.bin \
-c isolinux/isolinux.boot \
-V “SlackDVD” .

Ecco, questo per dire che avevo dei problemini con Arch e sono tornato alla distribuzione regina, la Slackware.

Diagnostica di un sistema Linux, ovvero “threads gone wild”

Ogni tanto succede che qualcosa non vada nel verso giusto, nel mio caso qualche processo fa troppo input/output ogni tanto, facendo laggare per qualche secondo il sistema. Non sapendo dove sbattere la testa sono andato a chiedere sul forum di supporto e ho scoperto l’esistenza di un tool che permette di confrontare diverse statistiche del sistema in parallelo. Dstat, un tool davvero formidabile. Io consiglio di provarlo con

dstat -cdnmgsf –top-cpu –top-bio –top-io

L’output di cui agevolo screenshot perchè è troppo largo è il seguente:

Output del comando suggerito "dstat"

Output del comando suggerito "dstat"

Esistono ovviamente molti altri parametri, io usavo questi per vedere chi faceva troppo I/O. Come vedrete genera una linea al secondo (delay personalizzabile, ovviamente) con tutte le statistiche (selezionabili) più salienti, mancherebbe il parametro “-f” di “full” che però usa troppe colonne e non può essere visualizzato (e succederà a chiunque di voi abbia più di un core…)

Rimane il dubbio che il problema sia Xorg, o addirittura in sync_supers che da quanto ho capito è parte del kernel, quindi per il momento ogni tanto mi becco delle laggatine, se qualcuno ha un’idea si faccia avanti.

Nortek HDBOX R1 HDMI – 1Tb

L’altro ieri ho comprato questo box, con incluso un hard-disk da 1Tb, al prezzo di 139 euro. Vediamo le caratteristiche che mi hanno spinto a comprarlo

  • 1Tb di spazio è tanto. Tanto.
  • HDMI, così posso collegarlo con un cavo solo (e non 5, 3YUV+2Audio) alla TV
  • Linux. È un embedded device, processore MIPS, 64Mb di RAM, e un’organizzazione interna da far venire il mal di testa, ma possiede delle partizioni scrivibili nelle quali depositare eventuali programmi compilati per quell’architettura
  • Ethernet. Ha la porta di rete, e oltre a poter riprodurre video da una condivisione windows (nel mio caso samba), ha anche funzionalità NAS (sebbene sia rumoroso quando è acceso), in più ci si può far girare molte cose (proxy, ssh, wget, …)
  • 2 porte USB, con supporto per qualche modello di chiavetta wifi-usb, e soprattutto per attaccarci eventualmente la stampante (se riuscirò a cross-compilare cups), o molte altre cose (l’UPS?)
  • 1 porta USB, la terza, per connettere il disco direttamente a un PC e scriverci dentro a velocità folli (ok, no, non così folli…)
  • Uscita YUV/AV, ingresso solo AV – potrebbero servire. L’ingresso per registrare, e per la funzione time-shift che non ho ancora provato…
  • Led blu. Tutti amano i led blu.

Per contro è rumoroso e non è adatto a stare sempre acceso come NAS nella stessa camera in cui io dormo, molta gente online dice che senza ventolina (che è la principale fonte di rumore) funziona comunqe alla grande senza surriscaldarsi. Vedrò.

Di default ha un’accesso telnet, senza password, che mi lascia un po’ basito se penso che dovrei usarlo come NAS, ma ovviamente si può rimediare spegnendo il telnet e usando SSH con keyfile (non ho ancora provato, quindi per ora sono ipotesi). Mi farebbe molto piacere se avesse qualcosa tipo il wake-on-lan e non so il perchè, mi è venuto in mente ora.

Nortek HDBOX R1 HDMI

Nortek HDBOX R1 HDMI

Non legge moltissimi formati, ma comunque legge tutti quelli che mi interessano, cito dal sito:

Formati video supportati: AVI, MPG, VOB, DAT, MPEG-2 TS, IFO
CODECs video supportati: MPEG-1, MPEG-2, MPEG-4 (DivX 5.x, DivX 4.x, DivX 3.x, XviD)
Decodifica video ad alta definizione: 720p, 1080i

Più che onesto, certo gli MKV sarebbero stati utili, ma conoscendoli… anche no. Per ora così. Magari in futuro avrò più informazioni da condividere.

Schede audio integrate…

… non sono proprio eccezionali se dovete lavorare i modi digitali. Ecco uno il “waterfall” della mia scheda integrata senza alcun ingresso.

Ingresso flottante, da 0 a 3.9 kHz

Ingresso flottante, da 0 a 3.9 kHz

Fino a 750 Hz notevoli i disturbi, o meglio, le interferenze rilevate. Dopo questa frequenza già meglio, però qualcosa anche a 1kHz si vede. Notevole la riga a 3.1 kHz circa. Molto notevole. L’immagine l’ho stampata da “fldigi” mettendo la sensibilità al massimo. Ovviamente queste righe non sono così forti in confronto ai segnali “veri” che dovremo analizzare. Però non danno tutta questa sicurezza. Ora vediamo con un cavo jack-jack 2.5mm lungo circa 1 metro, lasciato flottante (non è schermato, è un cavo economicissimo) cosa riusciamo a rilevare, che sostanzialmente è anche cosa non vorremmo rilevare.

Ingresso con cavo jack jack economico flottante, da 0 a 2.9 kHz

Ingresso con cavo jack jack economico flottante, da 0 a 2.9 kHz

E in questo caso, chi più ne ha, più ne metta, farei prima ad elencare gli intervalli “liberi” che quelli “occupati”. Insomma il cavetto raccoglie un sacco di immondizia radiata da chissà cosa (computer, monitor, periferiche, etc…). Fatto questo piccolo test, credo che mi metterò alla ricerca di una buona scheda audio USB, da tenere il più vicino possibile all’RTX, e di buon cavettame schermato.

Salvare i video da qualsiasi player flash

So che per i siti più popolari esistono delle comode estensioni, come Easy YouTube Video Downloader, ma di tanto in tanto ci si ritrova a voler salvare un video da un player personalizzato di qualche sito web. Ora vi spiego un modo semplice ed efficace per salvare tutti questi video.

Innanzitutto aprite la pagina col video, mettete il video in pausa, e lasciatelo caricare completamente. Quando il caricamente è finito (ricordatevi di lasciare aperto il browser su quella pagina), dobbiamo solo cercare sul nostro hard-disk dov’è il file che lo contiene. Su linux, o per lo meno sulla mia linuxbox, i flash video (e i flash in genere) vengono stipati nella directory /tmp/, quindi io faccio così:

ls -alh /tmp/Flash*

Verrà stampata a video una lista di file dal nome Flash?????? (dove al posto dei punti di domanda c’è un misto di numeri e lettere), ora con un player video (io uso mplayer) provate a visionare questi file, se il vostro sistema è abbastanza in ordine ce ne saranno pochi, e probabilmente il più grande in dimensioni sarà proprio il video che volete salvare. Alcuni potrebbero essere vecchi video che per qualche crash o altro motivo non sono stati eliminati alla chiusura del browser, visionateli ed eliminateli se non volete salvarli. Quelli che vi interessano li copierete dandogli un nome indicativo e con l’estenzione .flv e il gioco è fatto.

Per gli utenti windows il metodo è lo stesso, però i file vengono salvati in una directory nascosta che ora non ricordo, comunque basta fare una piccola ricerca all’interno delle directory come “dati applicazioni” e simili (tipo le varie “temp” e affini) e scoprirete velocemente dove vengono salvati i video.

Buon salvataggio.

MPlayer inserito in Slackware.

Ho appena lanciato il mio periodico (mensile?) aggiornamento del tree di slackware-current, che tengo sul desktop in caso abbia bisogno di installazioni d’emergenza (creo la iso con l’ultima -current e sono pronto a dar battaglia a qualsiasi hard disk). Ecco dicevo, lanciato rsync mi sono accorto che dentro la Slack finalmente c’è MPlayer, che io fino ad ora ho pazientemente ricompilato ogni volta che installavo.

Sono curioso di vedere se e qualche codecpack viene distribuito.