__ _____________ ______ ____________
/ / / / _/_ __/ | / / __ \/_ __/ ____/
/ /_/ // / / / / |/ / / / / / / / __/
/ __ // / / / / /| / /_/ / / / / /___
/_/ /_/___/ /_/ /_/ |_/\____/ /_/ /_____/ [0x06 :: April 2011]
Hackkappatoio Isn't The Name Of This Ezine
http://hitnote.gotdns.org :: http://unofficialhj.gotdns.org
**********************************
* HITNOTE 0x06 :: Open Your Eyes *
**********************************
Davvero siamo davanti a un cambiamento epocale??
Abbiamo un potere che fino a trent'anni fa pareva fantascienza degna di spock
e del capitano kirk, pensate che in questo momento centinaia di persone sapranno
nel giro di qualche minuto quello che penso. Stupefacente come cosa. Non sto
parlando di... chessò, telepatia, pensiero collettivo, chiaroveggenza o chissà
che cosa. Sto parlando di internet.
Abbiamo un potere che ci rende intellettualmente superiori a qualunque altra
cultura/società/sistema. La cosa farà piacere a persone con manie di grandezza.
La nostra società è arricchita come l'uranio da questo potere. Forse troppo
e troppo accessibile.
Grazie a facebook l'egitto ha un dittatore in meno, la Libia presto pure.
Siamo forti, internet è il futuro. Siamo superiori, ne sono certo.
No.
Guardiamo bene la realtà dei fatti. sia la Libia che L'Egitto sono dei paesi
"Arretrati" come concezione. Non fraintendete quello che voglio dire;
Non intendo dire che vivono come nel medioevo o che sono dei morti di fame.
Non è qui che voglio arrivare.
La Libia è sorretta da un capo che per certi versi è pari a un monarca, la vita
si basa ancora per lo più su cose concrete simili per concezione nostra a quello
che capitava più o meno cento anni fa. Dal punto di vista organizzativo.
Facebook, internet invece hanno portato una rivoluzione.
E' il futuro e l'evoluzione: come in natura il più forte vince.
Ma qui non si parla di facebook, dittatori e monarchia, la realtà è che grazie
all'immenso potere che internet ha concesso a una popolazione sottomessa
avviene una rivoluzione.
E dopo Mubarak/Gheddafi? Arriverà la democrazia, elezioni libere. Non abbiamo
dimenticato nessuno? Ah già, arriveranno prima i jeans, la coca cola e la tv.
Non che prima non ci fossero, ma è un fatto che l'Egitto e la Libia avevano
una concezione "orientale" di stato e non "occidentale". Al termine di questa
cosa qua, l'occidente forse sarà un po' più grosso e si rivolgerà verso sud.
Porteremo il nostro sistema occidentale, lo imporremo e loro saranno felici e
ci sorrideranno. Di certo una dittatura non è una bella cosa, ma noi non siamo
liberi tanto da poterci sentire "superiori". Abbiamo una parvenza di libertà
che ci fa sentire bene, ma in realtà la nostra è solo una forma evoluta di
dittatura.
Combattere per la libertà. Chi di noi, io compreso, sa cosa significa essere
liberi? La verità è che a noi ci va bene così, le scelte difficili preferiamo
lasciarle ad altri. È più importante andare su facebook che vivere. Siamo
prigionieri della nostra libertà.
Non siamo liberi, ma ci va bene comunque perchè abbiamo questo immenso potere
apparente. Siamo così liberi da poter parlare con ogni persona che conosciamo
in modo quasi istantaneo.
Noi usiamo questo potere per dirci "LOL KyKina km 6 figa", ma sfido chiunque
a dire in faccia ciò che veramente pensa in una situazione difficile.
Non dico che sia impossibile, ma una volta fatto compare un sintomo post
traumatico che ti lascia una strana sensazione, che non è sempre piacevole.
Stiamo perdendo il potere di dire quello che pensiamo.
Forse siamo più schiavi noi che quei guerrieri ribelli giù in libia dopo 40 anni
di oppressioni.
+-----------------------------------------------------------------------------+
| . . . . . . . . . . ___ .__ . ___ .___. __. .__ . _ _ . . . . . . . . . . . |
|. . . . . . . . . . |__ .|__) |_. .|_ . | .\./. \ | V | . . . . . . . . . . .|
| . . . . . . . . . .|. . | .\.|___ |___.|__/ \__/.|. .|. . . . . . . . . . . |
|. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .|
|.............................................................................|
| _,,---.._ |
| ,' .-'''-: |
| / ,' . |
| | / .!\.-: |
| | | <: < |
| | `. '|/'-: |
| \ `. ' |
| `.. `-...-; |
| ``---'' |
|.............................................................................|
|: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :|
| : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : |
|: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :|
| : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : |
+-----------------------------------------------------------------------------+
"Dio salvi la regina, che i turisti sono soldi".
[cit. Manuale del nuovo ordine globale]
Turbocotoletta MMXI
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Indice:
* 0x00 . TCP Scanning
* 0x01 . IrssiBook
* 0x02 . Videodrome
* 0x03 . Lo zaino delle emergenze
* 0x04 . Sfida mentale ed ingegneristica
* 0x05 . Introduzione alla programmazione con SVGALib in C
* 0x06 . Goodbye blue sky
* 0x07 . Il cubo di resistori
* 0x08 . Riddle
* 0x09 . Ringraziamenti
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
************************
* 0x00 :: TCP Scanning *
************************
Tanto per cominciare, tutto ciò che segue non vuole essere una vera e propria
guida a tutti i metodi possibili per effettuare un port scanning,
bensì una semplice introduzione per schiarire le idee a chiunque
le abbia confuse a riguardo.
Tratteremo qui di seguito uno dei metodi più semplici per quanto riguarda
questa tecnica: il TCP scanning, ovvero la scansione delle porte TCP.
Molto semplicemente, tale tipo di portscanning avviene inviando all'host
con il quale è aperta una connessione, dei pacchetti TCP per l'appunto,
il risultato dell'operazione poi lo si evincerà dalla risposta che si otterrà
dall'host stesso.
Per renderla più semplice immaginiamo che il nostro host sia un hotel e,
che ogni pacchetto sia rappresentato da un cameriere.
Il nostro cameriere viene incaricato di dirigersi alla porta n. TOT dell'host
e da bravo cameriere svolge il suo incarico.
Una volta arrivato di fronte alla camera il cameriere può trovarsi
in 3 diverse situazioni.
1)Bussa e la porta gli viene aperta;
2)Porta chiusa, cartello non disturbare;
3)Bussa e nessuno risponde;
Ora, per quanto riguarda il primo caso c'è da precisare che
quando una porta è in "listening" ovvero è aperta, significa che è utilizzata
da un servizio che la tiene aperta .
Per quanto riguarda il secondo e terzo caso, entrambi ci dicono che la porta
è inaccessibile al nostro cameriere:
Nel secondo caso l'host ci comunica espressamente che la porta è irraggiungibile
e le connessioni in entrata su quella porta non saranno accettate;
nel terzo invece la situazione cambia, la porta è filtrata, controllata
probabilmente da un firewall(uomo cattivo), il quale rapisce il nostro cameriere
non facendo pervenire dalla porta nessuna risposta.
Di seguito è allegato un sorgente scritto in perl e opportunamente commentato,
per far capire ancora meglio la dinamica dello scanning tcp.
#!/usr/bin/perl
#usage: portscan.pl <host> <minrange> <maxrange>
use IO::Socket;
$ip=@ARGV[0]; #Indirizzo dell'host
$min=@ARGV[1]; #porta minima
$max=@ARGV[2]; #porta massima
print "ip: $ip\nminimum range: $min\nmaximum range: $max\n\n";
#Fino a che il numero minimo di porta non supera quello massimo
while($min<=$max){
$err = 0;
#Viene effettuata una connessione all'host
my $sock=IO::Socket::INET->new(
PeerAddr=>$ip,
PeerPort=>$min, # sulla porta indicata da $min
Proto=>'tcp') || $err++; #Ogni volta che la connessione
#non è possibile stando agli
#ultimi due casi spiegati, si
#incrementa la variabile di errore
#e successivamente viene chiusa la connessione con
#l'host per poi aprirne nuovamente un'altra
shutdown($sock,2);
#se invece la connessione viene accettata dall'host, e il socket esiste
if ($sock){
#il sorgente aggiunge la porta alla nostra lista @ports
push(@ports,$min);
}
#e il numero di porta minima viene incrementato per poi riprendere il ciclo
$min++;
}
#e stampare poi a processo terminato, la lista con le porte aperte
print "\nopen ports: @ports\n";
Per quanto riguarda invece la variabile di errore, siete liberi di utilizzarla
come meglio credete, per poter stilare una lista delle porte chiuse,
o del numero di porte chiuse.
Credo che come prima lezione basti a darvi una prima idea di come avviene
lo scanning delle porte aperte sull'host remoto,
alla prossima .
skerno a.k.a riot
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**********************
* 0x01 :: IrssiBook *
**********************
Diciamocelo: Facebook è talmente "infiltrato" nella rete sociale che spesso può
essere vitale accedervi per rimanere in contatto con una buona fetta dei propri
amici -- gli amici-AMICI, quelli veri, quelli in 'real-life' che magari si
organizzano per una pizza in centro solo tramite il social network. Però è
anche vero che per alcuni, come il sottoscritto, non è esattamente gradito il
dover visitare Facebook.com, leggere tonnellate di inutili 'blabla' e link
condivisi e via dicendo.
Con questo breve articolo si vedrà come utilizzare la chat Facebook attraverso
il client IRC irssi e BitlBee in locale. Questa guida è stata stesa utilizzando
Arch Linux come sistema host, ma è possibile sfruttare software e script qui
descritti sulla propria Linux box, qualunque essa sia, senza difficoltà
particolari.
Per introdurre un minimo agli strumenti utilizzati, abbiamo irssi, un potente
client IRC per l'utilizzo da riga di comando particolarmente interessate per
l'utente in quanto particolarmente estendibile grazie a script PERL; e BitlBee,
nvece, è un gateway che, basandosi sul protocollo IRC, permette di
usufruire di molti canali di messaggistica quali Twitter, XMPP, AIM e
così via.
Per tutte le informazioni a riguardo, rimando ai siti web dei due progetti:
- <http://irssi.org>
- <http://bitlbee.org>
Grazie al fatto che Facebook ha "aperto i confini" della propria chat,
utilizzando il protocollo XMPP, è ormai da tempo possibile accedervi da
client standalone multi-protocollo come Empathy e Pidgin (tramite
apposito plugin). Naturalmente, utilizzando BitlBee lo
stesso tipo di protocollo, è possibile (e immediato) configurare BitlBee
per comunicare con i nostri contatti Facebook.
>> Perchè usare irssi?
Perchè il supporto a BitlBee è ottimo, perchè irssi è un *ottimo* client, perchè
irssi+screen è un'accoppiata vincente e perchè gli script disponibili per irssi
permettono di ottenere più o meno qualsiasi cosa si voglia durante la propria
esperienza d'utilizzo.
>> Installazione
Come già detto in precedenza, si utilizzerà Arch Linux come sistema ospite per
questo articolo; qualsiasi altra distribuzione ovviamente permetterà di ottenere
gli stessi risultati. Per utenti Debian, ad esempio, sarà molto semplice
cambiare il comando 'pacman' in 'apt-get install'; per tutti gli altri utenti,
rimando ai pacchetti disponibili per la propria distribuzione o molto
più semplicemente ai sorgenti di irssi/bitlbee.
Per prima cosa, installiamo irssi e BitlBee:
~$ yaourt -S irssi bitlbee
Dopodichè, andiamo a modificare il file ~/.irssi/config, aggiungendo alla lista
servers il record:
{ address = "localhost"; chatnet = "Bitlbee"; port = "6667"; use_ssl =
"no"; ssl_verify = "no"; autoconnect = "no" ; }
Fatto questo, andiamo a preparare bitlbee per l'avvio in locale, editando il
file '/etc/bitlbee/bitlbee.conf'. In questo file dovremo aggiungere
(o decommentare) le linee
RunMode = ForkDaemon
e
User = bitlbee
lasciando invariate le altre impostazioni.
A questo punto, siamo pronti per lanciare il demone bitlbee. Per farlo, con i
privilegi di root eseguiamo
# /etc/rc.d/bitlbee start
Naturalmente questo path è relativo al sistema Arch Linux; per gli utenti
Debian, ad esempio, si dovrà utilizzare il percorso '/etc/init.d/'.
Nota: essendo un demone, è possibile (a propria scelta) di lanciare o meno il
demone bitlbee all'avvio della propria macchina.
>> Configurazione dell'account e utilizzo
Lanciare irssi e digitare il comando
/connect localhost
A questo punto, se Bitlbee è correttamente in funzione, saremo pronti per
configurare il nostro account Facebook (ma non solo, ovviamente). È necessario,
per poter utilizzare FB con bitlbee, avere a disposizione un
username del tipo 'http://www.facebook.com/LOLEPHANT' (supponendo che
il vostro username sia LOLEPHANT). Se per qualche strano motivo non
vi fosse un username associato al vostro account, è possibile
crearne uno visitando il link
http://www.facebook.com/username
Nota fondamentale per il proseguimento dell'articolo: NON saranno spiegate le
funzioni basilari, per esempio, per muoversi all'interno delle tab di irssi o
dei comandi di chat. Per quelli, rimando alla completissima documentazione
ufficiale di irssi reperibile sul sito del progetto; stesso dicasi per BitlBee.
Iniziamo configurando la nostra identità BitlBee per l'uso in irssi:
register PASSWORD
Una volta lanciato irssi e connessi a bitlbee, basterà utilizzare il comando
identify PASSWORD
per connetterci ai nostri account.
Andiamo ora a creare un account Bitlbee locale per l'uso di facebook: nel tab di
irssi &bitlbee, diamo il comando
account add jabber LOLEPHANT@chat.facebook.com LULZPWD
dove, di nuovo, LOLEPHANT e LULZPWD sono rispettivamente i nostri username
(http://facebook.com/LOLEPHANT) e password Facebook.
[INCISO]
>> Fix dei nomi dei contatti
A questo punto l'account è già pronto all'uso, salvo una spiacevole
particolarità: al posto dei nick dei nostri contatti, vedremmo una lista
alquanto incomprensibile di codici numerici del tipo -XYZABCD. Posto che è
possibile risalire all'utente associato a tale codice attraverso il comando
/info CODICE tale rappresentazione risulta ovviamente alquanto scomoda.
Questo inconveniente può essere risolto in due modi: attraverso un settaggio di
bitlbee oppure tramite uno script esterno da caricare in irssi.
Con versioni >= 3 di bitlbee è possibile visualizzare i propri contatti
nella forma
NomeCognome
dando il comando
account facebook set nick_source full_name
Utilizzo correntemente BitlBee 3.0.1-1 e questo comando ha risolto il problema.
Stando a quanto riporta il wiki di BitlBee, per le versioni precedenti è
possibile sostituire tale comando con
account set facebook/nick_source full_name
ma personalmente ho fatto un test e riscontrato dei problemi (in ogni caso, se
siete in questa situazione, provate).
Se invece preferite usare uno script esterno, ce ne sono vari che permettono di
ottenere lo stesso risultato. Un esempio è lo script 'bitlbee_rename.pl' di Tim
Angus, opportunamente modificato da Lakitu7, reperibile a questo indirizzo:
<http://browsingtheinternet.com/temp/bitlbee_rename.txt>
Come consueto per gli script irssi, bisognerà spostare tale file (rinominato in
.pl) nella cartella .irssi/scripts/ e caricarlo da irssi con il comando
/script load SCRIPT_NAME
[/INCISO]
A questo punto, andiamo ad attivare l'account dando il comando
account on
E, se quanto detto sopra è stato fatto correttamente, entreremo nel "chan" della
chat di FB e otterremo una lista dei contatti online. Ricordo che il comando per
visualizzare gli utenti online è '/names' .
Ovviamente, non essendo un vero e proprio channel IRC, per dialogare con i
nostri contatti sarà necessario farlo nella classica modalità private di IRC.
Per iniziare una query con un contatto è sufficiente usare
/q NOMECONTATTO
che aprirà una nuova tab di irssi riservata alla nostra conversazione con
NOMECONTATTO. La stessa cosa avverrà quando un nostro contatto vorrà parlare con
noi. Da notare che il contatto con cui parleremo vedrà come mittente i nostri
Nome e Cognome impostati su Facebook e non il nick impostato nella parte
'settings' di '~/.irssi/config'.
Unica cosa da tenere presente è che se utilizzando la chat integrata del sito
web di Facebook o un client di messaggistica classico l'arrivo di un nuovo
messaggio è facilmente riscontrabile, non è così immediato con irssi e rischiamo
di perdere il messaggio di un amico che in quanto non ci accorgiamo della query
nei nostri confronti.
Di nuovo, esistono due vie per risolvere:
Modo 1: Utilizzare uno script esterno per avere notifiche irssi; ce ne sono
davvero per tutti i gusti e le necessità, come ad esempio un irssi notifier per
dzen. Una breve ricerca su Google vi fornirà ciò di cui avete bisogno.
Modo 2: Settare irssi per switchare tab portando in primo piano l'ultima tab
creata da una query ricevuta; per fare ciò basterà dare il comando
/set window_auto_change ON
Le due soluzioni sono ugualmente valide, quindi a voi scegliere quella che più
vi può risultare utile (o entrambe).
A questo punto avrete irssi e BitlBee configurati e perfettamente funzionanti
per utilizzare la chat di FB direttamente dalla vostra shell preferita.
Personalmente, da quando utilizzo l'accoppiata bitlbee/irssi non ho più avuto
bisogno di aprire Facebook.com, se non sporadicamente e per casi eccezionali.
In conclusione, ricordo che una volta usciti da irssi, le proprie impostazioni
resteranno inalterate; per connettersi alla chat di FB in seguito basterà, una
volta lanciato irssi, dare i comandi
/connect localhost
seguito da, nella tab '&bitlbee',
identify PASSWORD
dove PASSWORD corrisponde a quella scelta inizialmente con il comando
'register'.
Buon divertimento e buon IRC a tutti.
tragic0mic
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**********************
* 0x02 :: Videodrome *
**********************
Questo non è il solito splatter dove sangue e maceti la fanno da padrona..
è più concentrato su temi quali la televisione e la sua influenza sul nostro
modo di pensare:
"Come altre opere dell'autore, affronta il tema della mutazione della carne e
della fusione fra tecnologia e uomo."
Da Wikipedia l'enciclopedia del sistema
In effetti non si può parlare di videodrome senza parlare di tecnologia e di
come da essa siamo diventati dipendenti; il personaggio principale di questo
film è il proprietario di una televisione privata che trasmette film porno
e simili. Andando avanti nel film si trovano ottimi spunti per riflettere,
geniale è la premessa del film: Videodrome è la televisione che è più reale
dela realtà e che evolve l'essere umano dandogli un nuovo organo che di fatto
è lo strumento chiave di Videodrome: un tumore celebrale. Questo film,
in chiave fantascientifica ha gettato le basi di varie correnti psicologiche.
Possiamo davvero dire di non essere influenzati dalla televisione?
Videodrome c'era già arrivato.
Non è un film facile da spiegare, ma lo potete vedere voi stessi su MegaVideo o
comprandolo in un negozio specializzato.
Trama: 3.5/5 Temi nuovi e ancora attuali, molto contorto il che non
lo rende adatto a visioni "così tanto per"
Effetti speciali: 4/5 Considerando che sono stati fatti negli 80s si può dire
magnifici!
Personaggi: 3.5/5 Solita storia all'americana, capo figo, segretaria figa,
troiona di turno e alla fine muoiono tutti.
Interpretazioni: 4/5 Ottimo il personaggio principale e veramente geniale
O'blivion, uomo che si rifiuta di farsi vedere se non
in televisione e che parla solo tramite essa.
Un po' meno carini sono le interpretazioni della figlia
di quest'ultimo, tratti troppo "secchi" della
personalità che non si addicono.
Anti commerciale: 4.5/5 Non il solito film dove i buoni vincono sempre e
diventano eroi. E' un film che fa pensare, cosa che
Hollywood ha smesso di inserire nei suoi film
commerciali.
Pesantezza: 1/5 Si segue con interesse.
---------------------------------------------
Voto globale 4/5
Un film non immune a errori ma che comunque lascia il segno
all'interno delle persone che l'hanno visto.
Consigliato se siete in vena di sperimentare.
Un po' meno se siete distrutti.
Turbocotoletta MMXI
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
************************************
* 0x03 :: Lo zaino delle emergenze *
************************************
Dio non voglia che accada qualcosa di simile,
ah ah ah, davvero non ce la faccio ad iniziare così.
I media hanno spostato, come di dovere, la loro attenzione negli ultimi giorni
sull'evento drammatico avvenuto al largo delle coste del Giappone, ossia il
terremoto di magnitudo 8.9 con susseguente onda anomala («tsunami») che ha
provocato danni così ingenti e sbalorditivi che le seguenze girate dagli
operatori in questi giorni non differiscono di molto dal graficamente
elaborato ma ultrafantascientifico film 2012.
Vedere case incendiate attorniate da masse d'acqua trascinanti fanghiglia,
detriti ed automobili mi ha fatto riflettere su cosa sarebbe accaduto in
questo paese se una scossa tellurica di tale portata si fosse verificata nel
nostro bel Paese là dove 'l si suona.
E credetemi che mi sono spaventato.
Se osserviamo attentamente il sito dell'INGV (istituto nazionale di geologia
e vulcanologia) senza difficoltà troveremo una infografica riportante i punti
in cui ultimamente sono avvenuti terremoti in Italia e nel Sud-Est Asiatico.
Facilmente ci renderemo conto che quest'ultimi generano una sorta di eco nel
meridione d'Italia, alquanto preoccupante.
Ecco perché, da buon uomo che tiene alla sopravvivenza del suo codice genetico
ho pensato bene di preparare uno zaino d'emergenza, la cui utilità non è
tuttavia circoscritta al caso in cui la terra voglia sobbalzare, ma quand'anche
i fiumi vogliano straripare, il mare infuriarsi e lambire le zone interne delle
coste, le slavine rovinare sulle valli, le dighe cedere, vostra suocera
pranzare la domenica in cui avevate previsto un «Meeting sull'attento studio
dell'incremento dell'efficenza lavorativa settimanale in relazione alla visione
di partite di calcio in compagnia di fidi amici sotto l'effetto di sostanze
blandamente alcooliche quali la tradizionale birra o il vino».
Cominciamo dalla scelta dello zaino: deve essere resistente, privo di fronzoli
estetici, di lacci che possano impigliarsi, di cerniere facili ad aprirsi (così
che possa cascarvi tutto no?), di stoffe che possano bagnarsi o strapparsi.
Cosa portare con sé? Ognuno deve rispondere a questa domanda prevedendo quale
possa essere l'evento catastrofico che possa accadere più probabilmente,
o che si teme maggiormente.
Dato che abbiamo introdotto l'argomento parlando di terremoti, ecco un set da
me predisposto nell'eventualità che possa verificarsene uno:
- Cerotti di varie dimensioni
- Garze STERILI
- Coltellino svizzero, possibilmente non fasullo (tributo a turbocotoletta)
- Accendino
- Piede di porco (non immaginate quanto possa servirvi dopo :D)
- Batteria da 12v 1200mA caricata
- Fili e led in pacco sigillato
- Vestiti "da mezzo tempo", ossia indossabili facilmente in aggiunta al pigiama
- Acqua potabile
- Flacone con zucchero, ermeticamente chiuso (avrete una scorta sufficente a
sopravvivere all'evento traumatico e all'intensa attività fisica che farete
nel prestare soccorso ai feriti)
- Soldi (meglio se molti)
- Matita e quadernetto (utilissimi a prendere nota di ogni dettaglio importante,
nonché a mantenervi lucidi nelle tristi serate)
- Copia delle chiavi di casa e della macchina
In aggiunta medicinali se ne avete di bisogno e un manuale di pronto soccorso,
nel caso in cui non possediate le nozioni di base dell'intervento paramedico.
In ultimo, collocate il tutto, ben chiuso, in un punto facilmente raggiungibile
e possibilmente protetto (quale un incavo presso la soglia della porta, sopra un
mobile al riparo sotto una trave, sotto il vostro letto.
Non sono scientificamente preparato ad un evento naturale, né posseggo
qualifiche professionali.
Questo è il mio semplice consiglio che intendo condividere con voi
affinché vi sia di salvifico spunto per la vostra salvaguardia.
Piston Churchell
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*******************************************
* 0x04 :: Sfida mentale ed ingegneristica *
*******************************************
In questo articolo vi propongo un gioco, un gioco diverso dal solito
un gioco che dura da milioni di anni.
Lo ripropongo sotto forma di sfida di capacità ingenieristiche e mentali.
Ecco in cosa consiste:
costruire una macchina che sia in grado di auto-alimentarsi per rimanere accesa.
Cosa centra con la sopravvivena? Io sono un patito di robotica e proprio
in questo momento sto costruendo il mio..fatemi contare..quattordicesimo
robot; questa volta è diverso, la sfida si rende più appetibile:
ho scelto l'energia solare perchè è l'unica che mi è venuta in mente
abbastanza sensata: ho pensato anche ad un macchinario che si caricasse con
il vento, ma è difficile trovare vento dove abito io.
Ora buttiamo giù un po di regole:
La macchina può essere di qualunque tipo con qualunque tipo di alimentazione.
Può non possedere attuatori meccanici ma deve segnalare in qualche modo
che "è viva" (luci, suoni, ecc).
Una volta caricata per la prima volta non deve essere toccato da esseri umani.
Ora il gioco è semplice: sopravvivere più tempo possibile.
Nel mio caso ho optato per un cervello "leggero" un PIC16F648A che richiede
una corrente molto bassa per funzionare, è limitato per il fatto che
non ha integrati convertitori AD ma va bene lo stesso. Come alimentatore
un pannellino da 5V 1W massimo. Non è il migliore ma è pur sempre buono.
Ora prendiamo come esempio il basare il robot sul pannello solare,
i B.E.A.M.ers che ci leggono si sentiranno a casa ;) .
Il bello di questa sfida è il trovare le soluzioni a problemi come
"quando è notte con cosa lo alimento?" "se li non c'è luce il resto del giorno?"
ovviamente si potrebbe attaccare un leddino ad una piccola batteria ricaricabile
un phototransistor e un pannellino solare sotto ad una forte lampada, se volete
siete liberi di farlo, ma che gusto c'è? Oltre a entrare nel club
"amici dell'enel" vi annoiereste a morte.
L'unico consiglio che do ai meno esperti è che se decidono di usare il pannello
solare devono ricordarsi di mettere un interruttore per il carico.
Perchè? perchè con carico non carica molto bene e finiremmo per avere una
batteria "parassita".
Detto questo è molto importante(grazie morbido6868) è di mettere dei
riduttori all'eventuale motore, altrimenti non avremo abbastanza torsione
nemmeno per sognare una rotazione.
I riduttori per chi non lo sa sono ingranaggi, puleggie ecc...
servono a diminuire i giri dell'albero a giovo della torsione.
Degli ottimi ingranaggi possono essere trovati nei videoregistratori:
ne ho smontati un paio e ho uno scatolone pieno.
Per quanto riguarda l'elettronica va bene di tutto, purchè non si usino
ovviamente motori da aviomodellismo che assorbono 30Ampere.
Ahimè i fan di arduino saranno un pelo in difficoltà: dico per esperienza
personale che è un po "ingordo" e tende al reset sotto basse energie,
bastano tre servomotori da 6V per renderlo "narcolettico" anche a batteria
carica. Si potrebbe risolvere con un driver per servi ma come lo alimentiamo?
Ora ho detto tutto e non mi resta altro che finire il progetto,
tra poco sarà acceso il prototipo e vedremo quanto sopravviverà.
********************************
********************************
**Io sto già giocando, e voi? **
********************************
********************************-----------------------------------------------+
|
Per chi è interessato alla robotica o vorrebbe cominciare |
il mio gioco è nient'altro che una corrente della |
robotica B.E.A.M. un po esaltata. Ottima sia per esperti che per principianti, |
amanti del riciclo, degli insetti e che non amano spendere capitali |
per cose che potrebbero costruirsi :) |
-------------------------------------------------------------------------------+
d0ct0r
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*************************************************************
* 0x05 :: Introduzione alla programmazione con SVGALib in C *
*************************************************************
Il linguaggio C, a differenza di altri linguaggi di programmazione «moderni» non
presenta una libreria standard per la gestione della grafica e di volta in volta
sta al programmatore scegliere a quale libreria appoggiarsi per lo sviluppo
delle proprie applicazioni.
Sebbene al giorno d'oggi sia spesso scartata a favore di prodotti più «completi»
e moderni, la libreria SVGALib è stata un punto fermo per molti anni nello
sviluppo, ad esempio, di videogiochi ed altri programmi che necessitavano di
output grafico evoluto su sistemi *nix in assenza di X11.
In particolare, per citare un esempio famoso, il videogioco Doom è stato
sviluppato utilizzando per l'appunto SVGALib per la parte video (e un set di
campioni free per la parte audio).
SVGALib offre una gestione abbastanza completa dello schermo e una serie di
primitive per la gestione dei colori, delle forme geometriche e via dicendo; in
questo articolo vedremo un'introduzione all'uso di tale libreria e alla sua
applicazione per lo sviluppo di un semplice puzzle-game utilizzando il
linguaggio C. In particolare, utilizzeremo le librerie `vga.h` e `vgagl.h`,
un'estensione di vga che fornisce una serie di primitive aggiuntive "evolute"
che permettono svariate operazioni non direttamente accessibili da `vga.h`.
Prerequisiti:
- conoscenza minimamente decente della sintassi del linguaggio C;
- saper utilizzare il compilatore GCC;
- conoscenza del proprio hardware;
- S.O. Linux o FreeBSD.
Ulteriore premessa: la documentazione di SVGALib è costituita quasi
esclusivamente dall'output di `man`; non mi tratterrò troppo a lungo sulla
sintassi delle singole funzioni/primitive e costanti di SVGALib in quanto `man
bla bla` vi fornirà tutto il supporto necessario (è ovviamente necessario quindi
saper leggere le pagine del manuale).
INSTALLAZIONE DI SVGALIB
=========================
Installare SVGALib non dovrebbe essere un problema per un qualsiasi utente
Linux/FreeBSD: questo grazie al fatto che le maggiori distribuzioni includono in
qualche maniera una versione pre-pacchettizzata della libreria; nel caso non
fosse questa la vostra situazione, basterà scaricare i file sorgenti dal sito
ufficiale di SVGALib (http://www.svgalib.org) e compilarli.
Per utenti Arch Linux, ad esempio, è sufficiente installare da AUR `svgalib` e
`svgalib-helper`, ricordandosi di caricare il modulo svgalib-helper con il
comando `# modprobe svgalib-helper`; per utenti Ubuntu, per continuare con un
altro esempio, basta installare i pacchetti `libsvga1-dev`, `libsvga1` e
`svgalib-bin`.
CONFIGURAZIONE
===============
Posto che SVGALib probabilmente funzionerà out-of-the-box, è probabile che voi
dobbiate settare il chipset video corretto nel file di configurazione di
svgalib; editate il file `/etc/vga/libvga.config` (o path equivalente o, se
presente, `~/.svgalibrc`) decommentando la riga
`# chipset XYZ ....`
dove XYZ indica il nome del chipset disponibile adatto al vostro hardware; nel
caso non fosse presente, è sempre possibile utilizzare il chipset VESA che
tendenzialmente funzionerà in ogni situazione.
SVGALib può anche gestire l'utilizzo del mouse; è necessario configurare
anch'esso, nel caso lo si voglia utilizzare nelle proprie applicazioni, sempre
tramite il file di configurazione di cui sopra.
IL GIOCO
=========
Il puzzle-game che andremo a sviluppare sarà una versione molto semplice del
"Gioco del 15": in una griglia 4x4 sono disposti casualmente i primi 15 numeri
naturali, mentre una cella rimane vuota; è possibile muovere ortogonalmente la
cella vuota in una delle caselle adiacenti. Scopo del gioco è, ovviamente,
ordinare i numeri della griglia portando, infine, la cella vuota nella posizione
4x4.
L'implementazione che vedremo in questo articolo sarà piuttosto basilare in
quanto ci servirà solo come pretesto per vedere le caratteristiche basilari
delle librerie SVGA; starà poi a voi e alla vostra fantasia migliorare il gioco
nelle sue parti. Per come verrà impostato lo sviluppo, sarà possibile con il
semplice cambio di una macro impostare griglie di lato N, per il vostro
divertimento :-)
PIANIFICAZIONE
===============
La parte progettuale dell'algoritmo di gioco è piuttosto semplice, vediamo
velocemente COSA andremo a costruire; la parte di interazione con l'utente
avverrà con le primitive di SVGALib, come vedremo in seguito:
- Una matrice 4x4 viene riempita con i primi 15 numeri naturali posti in
posizioni casuali; il 16o elemento viene considerato come casella vuota.
- L'utente sposta la casella vuota in una delle quattro celle adiacenti
aggiornando il contenuto della matrice; quando ogni n-esima riga della matrice
contiene in ordine gli elementi da n a n+4 (n+3 nel caso della 4^ riga), il
puzzle è risolto e il gioco termina; il gioco mostra il numero delle mosse
impiegate a risolverlo.
La libreria SVGALib si occuperà di disegnare la matrice a schermo come una
griglia 4x4 evidenziando la casella vuota riempiendola con un colore vivace;
ciclicamente si attenderà che l'utente prema un tasto; quando il tasto sarà uno
di quelli scelti come direzionali, la matrice verrà ridisegnata spostando la
casella vuota nella nuova posizione e stesso dicasi per la cella sostituita. Al
termine della partita una dialog box informerà l'utente dell'esito del gioco
indicando le mosse impiegate.
Vediamo ora, passo-passo, la realizzazione del programma, con particolare
attenzione alle funzioni proprie di SVGALib:
INIZIO: righe 1-21
===================
#include <stdlib.h>
#include <vga.h>
#include <vgagl.h>
#include <time.h>
#define DIM 4
#define BLANK 16
#define UP 65
#define DOWN 66
#define RIGHT 67
#define LEFT 68
#define QUIT 'q'
#define BGCOLOR 0
#define LINECOLOR 4
#define FONTCOLOR 15
#define BLANKCOLOR 12
#define DIALOGLINE 9
#define BLOCKDIM 50
Le direttive #include mi sembrano alquanto autoesplicative: vga.h e vgagl.h sono
le librerie di SVGALib di nostro interesse; stdlib.h e time.h servono per le
funzioni accessorie come rand() e time().
Vediamo le macro in successione:
- DIM: la dimensione della riga della matrice; nel "classico" gioco del 15, si
tratta appunto di una griglia di lato 4.
- BLANK: il valore intero 16 identifica la cella vuota.
- UP, DOWN, RIGHT e LEFT: codici interi riferibili ai tasti direzionali della
tastiera; se si volesse controllare la matrice con i tasti WASD, basterebbe, ad
esempio, sostituire `UP 65` con `UP 'w'`.
- QUIT: il tasto associato all'uscita dal gioco in qualsiasi momento; premendo
'q' il programma termina.
- BGCOLOR: il colore di sfondo per la griglia, lo schermo e il testo.
- LINECOLOR: colore di base per le linee.
- FONTCOLOR: colore del font.
- BLANKCOLOR: colore di sfondo della cella vuota, per differenziarla e renderla
più visibile.
- DIALOGLINE: colore delle linee di bordo della finestra di dialogo.
- BLOCKDIM: lunghezza del lato di ogni cella della griglia.
Piccolo appunto sui colori: di base SVGALib fornisce 16 colori da utilizzare
nello schermo, numerati da 0 a 15:
- 0 Nero
- 1 Blu
- 2 Verde
- 3 Ciano
- 4 Rosso
- 5 Magenta
- 6 Marrone
- 7 Grigio
- 8 Grigio scuro
- 9 Azzurro
- 10 Verde chiaro
- 11 Ciano chiaro
- 12 Rosa
- 13 Magenta chiaro
- 14 Giallo
- 15 Bianco
CONTESTI GRAFICI: righe 23-24
==============================
GraphicsContext *physical;
GraphicsContext *virtual;
Visibili globalmente, i due puntatori `*physical` e `*virtual` identificano
quelli che in SVGALib si chiamano "Contesti grafici", ovvero delle
rappresentazioni in memoria di uno "schermo"; come comunemente accade nella
programmazione con librerie grafiche, per ovvi motivi di efficienza le nostre
modifiche andranno ad agire su uno "schermo virtuale" - di fatto invisibile
all'utente; quando lo riterremo necessario, semplicemente passeremo allo
"schermo fisico" il contenuto di quello virtuale, ottenendo come risultato la
visualizzazione concreta, sul monitor, di quanto presente nel dato momento sullo
schermo virtuale.
FUNZIONI ACCESSORIE/ PROTOTIPI: righe 26-29
============================================
void shuffleBoard(int board[][DIM], int *x, int *y);
Questa funzione si occupa di riempire la griglia con numeri da 1 a DIM^2 in
posizioni casuali; ritorna per riferimento tramite le variabili `x` e `y` le
coordinate della cella vuota (contenente il valore DIM^2).
void drawBlock(int x, int y, int number);
Questa funzione disegna alla posizione x,y dello schermo virtuale un quadrato
("blocco") di lato BLOCKDIM con, al centro, il numero intero `number`.
void drawBoard(int board[][DIM]);
Funzione che si occupa di disegnare concretamente la griglia, richiamando
ciclicamente la funzione `drawBlock(...)`, piazzando la griglia al centro dello
schermo (virtuale).
int isCompleted(int board[][DIM]);
La funzione si controlla se i valori all'interno della matrice `board` sono
ordinati in senso crescente; in caso affermativo, ritorna il valore 1, indicando
che il puzzle è stato risolto; in caso contrario ritorna il valore 0.
FUNZIONE MAIN: righe 31-127
============================
int board[DIM][DIM]={0}, k, blank_x, blank_y, tmp, moves=0;
srand(time(NULL));
shuffleBoard(board, &blank_y, &blank_x);
Qui dichiariamo le variabili necessarie all'interno del main:
- board[DIM][DIM]: la matrice di gioco, con tutti i valori, per il momento,
impostati a 0.
- k: variabile che conterrà di volta in volta il tasto premuto dall'utente.
- blank_x/y: le coordinate della cella vuota.
- moves: contatore delle mosse effettuate, inizializzato a 0.
Dopodichè viene lanciato srand per inseminare la funzione rand (utilizzando
time(NULL)) e la matrice viene riempita utilizzando la funzione shuffleBoard (di
cui si vedrà il contenuto in seguito).
vga_init();
vga_setmode(G640x480x256);
gl_setcontextvga(G640x480x256);
physical = gl_allocatecontext();
gl_getcontext(physical);
gl_setcontextvgavirtual(G640x480x256);
virtual = gl_allocatecontext();
gl_getcontext(virtual);
gl_setcontext(virtual);
gl_setwritemode(FONT_COMPRESSED);
gl_setfont(8,8,gl_font8x8);
gl_setfontcolors(BGCOLOR, FONTCOLOR);
Ecco finalmente un po' di lavoro con SVGALib :-)
vga_init() è la funzione che inizializza la libreria; da notare che vga_init()
necessita dei permessi di root e questo è il motivo per cui è necessario
lanciare il programma con i privilegi di root (con sudo o con su -c ), come
spiegato più avanti.
Dopodichè vga_setmode e gl_setcontextvga si occupano di impostare la modalità
video a 640x480 pixel a 256 colori; questa ovviamente non è l'unica
configurazione disponibile; SVGALib permette di lavorare con MOLTE modalità
diverse, tutte elencate nella pagina di manuale di vga_setmode.
La modalità caricata viene poi passata al puntatore `physical` che viene
richiamato da gl_getcontext(physical) che semplicemente salva il contesto
attuale nella variabile `physical`.
La stessa modalità (virtuale) viene poi associata a `virtual` permettendo di
poter lavorare su di esso; le ultime tre righe invece sono quelle che permettono
di lavorare concretamente con i font: la funzione
`gl_setwritemode(FONT_COMPRESSED)` permette di lavorare con font bitmap senza
doverli espandere. Il font viene poi impostato a un font default 8x8 i cui
colori di background e foreground vengono impostati con gl_setfontcolors.
Annotazione 1: le funzioni gl_* vengono dalla libreria vgagl.h; le funzioni
vga_* vengono dalla sola vga.h.
Annotazione 2: come premesso a inizio articolo, non mi addentro più di tanto
nella trattazione dettagliata delle singole funzioni per un motivo ben preciso:
installando SVGALib installerete automaticamente anche le pagine di manuale
relative (che sono comunque anche reperibili online) che forniscono, nella nota
forma ambivalente prolissa/essenziale tipica delle pagine man, tutte le
possibili informazioni necessarie che vorrete sapere (ma non avete mai osato
chiedere!). Volendo essere un articolo introduttivo e "stuzzicante" a
programmare con SVGALib, mi sembra più che sufficiente quanto detto sopra.
gl_printf(WIDTH/2-23*8,HEIGHT/2-48," F I F T E E N\n\n
\n A simple puzzle game written with SVGALib.\n\n\nPress any key to
start or 'q' anytime to quit.");
gl_copyscreen(physical);
A questo punto, utilizzando la funzione gl_printf, scriviamo a centro schermo un
semplice messaggio introduttivo del programma; la funzione gl_printf utilizza la
stessa sintassi della normale printf della standard i/o library, eccezion fatta
per i due parametri iniziali che indicano la posizione iniziale da cui iniziare
a scrivere. Per chi ha utilizzato un po' le librerie ncurses, si tratta dell'
equivalente di mvprintw(), con la differenza che il primo parametro indica le
ascisse e il secondo le ordinate. Da notare l'uso delle macro WIDTH e HEIGHT che
corrispondono, come facilmente intuibile, alla dimensione dello schermo su cui
si sta lavorando (nel nostro caso, 640x480).
La funzione gl_copyscreen si occupa di copiare sullo schermo fisico il contenuto
dello schermo virtuale (su cui noi stiamo lavorando); senza questa essenziale
funzione le modifiche effettuate in output NON SARANNO VISIBILI sullo schermo
fisico. C.V.D. ;-)
Vediamo ora il ciclo di gioco vero e proprio:
while((k = vga_getch()) != QUIT)
{
Inizia un ciclo while che ad ogni iterazione attende la pressione di un tasto da
parte dell'utente con la funzione vga_getch(), memorizzandone il valore in `k`;
nel caso in cui tale valore fosse equivalente alla macro QUIT, il ciclo termina
e con esso il gioco.
switch(k)
{
case LEFT:
if(blank_x>0)
{
moves++;
tmp = board[blank_y][blank_x-1];
board[blank_y][blank_x-1] = board[blank_y][blank_x];
board[blank_y][blank_x] = tmp;
blank_x--;
}
break;
case RIGHT:
if(blank_x<DIM-1)
{
moves++;
tmp = board[blank_y][blank_x+1];
board[blank_y][blank_x+1] = board[blank_y][blank_x];
board[blank_y][blank_x] = tmp;
blank_x++;
}
break;
case DOWN:
if(blank_y<DIM-1)
{
moves++;
tmp = board[blank_y+1][blank_x];
board[blank_y+1][blank_x] = board[blank_y][blank_x];
board[blank_y][blank_x] = tmp;
blank_y++;
}
break;
case UP:
if(blank_y>0)
{
moves++;
tmp = board[blank_y-1][blank_x];
board[blank_y-1][blank_x] = board[blank_y][blank_x];
board[blank_y][blank_x] = tmp;
blank_y--;
}
break;
}
Questo switch controlla il movimento della casella vuota: se il valore del tasto
premuto equivale a uno di quelli delle macro direzionali, nel caso in cui lo
spostamento della cella non dovesse comportare l'uscita dalla griglia (ad
esempio spostare in una colonna di indice > 4):
- viene incrementato il contatore delle mosse;
- nella variabile `tmp` viene memorizzato il valore contenuto nella cella in cui
verrà spostata quella vuota;
- viene spostata la cella vuota;
- il valore in `tmp` viene ora memorizzato nella precedente posizione della
cella vuota;
- viene modificata conseguentemente la variabile contenente l'ascissa o
l'ordinata della cella vuota.
gl_clearscreen(BGCOLOR);
drawBoard(board);
gl_printf(WIDTH/2-16, HEIGHT/2+(BLOCKDIM*DIM/2)+8,"%d x %d",
blank_x+1, blank_y+1);
gl_copyscreen(physical);
Dopo aver controllato il movimento della cella, andiamo ad aggiornare l'output:
per prima cosa viene pulito lo schermo con la funzione gl_clearscreen, che
riempie lo schermo con il colore passato per argomento; poi viene disegnata la
griglia con `drawBoard`, seguita, in basso al centro, da una stringa "di
supporto" contenente le coordinate correnti della cella vuota; infine tutte
le modifiche vengono applicate e inviate allo schermo fisico con
`gl_copyscreen(physical)`.
if(isCompleted(board))
{
gl_fillbox(WIDTH/2-(15*8), HEIGHT/2-(5*8), 30*8, 64,
DIALOGLINE);
gl_fillbox(WIDTH/2-(15*8)+1, HEIGHT/2-(5*8)+1, 30*8-2,
62, BGCOLOR);
gl_printf(WIDTH/2-(14*8), HEIGHT/2-(4*8),
" YOU WIN!\n\nPuzzle completed in %d %s.\n\n\n Press any key to
quit.", moves, moves>1?"moves":"move");
gl_copyscreen(physical);
vga_getch();
break;
}
}
Per chiudere il ciclo di gioco, viene controllato infine se il puzzle allo stato
corrente è risolto, chiamando `isCompleted`; nel caso in cui lo sia, viene
disegnata una dialog box con un messaggio di congratulazioni e il conteggio
delle mosse impiegate per risolvere il puzzle. Infine, viene attesa la
pressione di un tasto cui segue l'uscita dal ciclo.
Fuori dal ciclo di gioco, la funzione main() viene chiusa con
gl_clearscreen(BGCOLOR);
vga_setmode(TEXT);
return 0;
}
`gl_clearscreen` pulisce lo schermo, la modalità VGA viene settata nuovamente a
quella testuale e il programma termina.
FUNZIONI ACCESSORIE/ DEFINIZIONI: righe 149-187
================================================
void drawBlock(int x, int y, int number)
{
gl_fillbox(x,y, BLOCKDIM, BLOCKDIM, LINECOLOR);
gl_fillbox(x+1,y+1, BLOCKDIM-2,BLOCKDIM-2, BGCOLOR);
if(number < 10)
gl_printf(x-4+BLOCKDIM/2, y-4+BLOCKDIM/2, "%d", number);
else if(number != 16)
gl_printf(x-9+BLOCKDIM/2, y-4+BLOCKDIM/2, "%d", number);
else
gl_fillbox(x+1,y+1, BLOCKDIM-2,BLOCKDIM-2, BLANKCOLOR);
}
Questa funzione, come detto, disegna alla posizione x,y dello schermo un
quadrato di lato BLOCKDIM con al centro il numero `number` passato per
argomento.
Per prima cosa, utilizzando due volte la primitiva gl_fillbox, che serve a
disegnare rettangoli PIENI di un determinato colore, viene disegnato il blocco,
di cui si vedrà solo il bordo.
Viene poi, utilizzando gl_printf, scritto centralmente il numero in questione
(spostandolo di 5 pixel nel caso sia > 10) oppure viene colorato con il colore
BLANKCOLOR nel caso in cui il numero passato sia 16.
void drawBoard(int board[][DIM])
{
int i, j, posx=WIDTH/2-(DIM*BLOCKDIM/2), posy=HEIGHT/2-
(DIM*BLOCKDIM/2);
for(i=0; i<DIM; i++)
{
for(j=0; j<DIM; j++)
{
drawBlock(posx, posy, board[i][j]);
posx+=BLOCKDIM;
}
posy+=BLOCKDIM;
posx=WIDTH/2-(DIM*BLOCKDIM/2);
}
}
Dichiarate posx e posy individuando la posizione iniziale per ottenere la
griglia centrata nello schermo, `drawBoard` richiama DIM^2 volte `drawBlock`
passando ad essa l'n-esimo elemento della matrice `board`.
int isCompleted(int board[][DIM])
{
int c=1, completed=1, i, j;
for(i=0; i<DIM; i++)
for(j=0; j<DIM; j++)
if(board[i][j] != c++)
completed=0;
return completed;
}
Infine, la funzione isCompleted: inizializzata a 1 la variabile `completed`, se
il contatore c non equivale ad ogni iterazione dei cicli innestati
all'ixj-esimo elemento di `board`, completed viene portato a 0.
Ritornando il valore di completed, la funzione quindi ritornerà un valore
interpretabile come TRUE nel caso in cui i numeri di `board` siano crescenti
da 1 a DIM^2, FALSE in caso contrario.
CODICE SORGENTE COMPLETO
=========================
In questo articolo è presente l'intero listato del programma del gioco del 15
sviluppato da me per l'occasione.
Nel caso voi foste pigri (come me) e non voleste perdere tempo in ricopiature
e "copincollature" che possono portare ad errori, faccio presente che il
sorgente può anche essere recuperato facilmente a questo indirizzo:
http://sprunge.us/NIQi?c
http://sprunge.us/NIQi (senza syntax highlighting)
COMPILAZIONE ED ESECUZIONE
===========================
Il sorgente può essere compilato con varie opzioni, in generale il modo più
semplice è
$ gcc fifteen.c -o fifteen -lvgagl -lvga
Da notare che `-lvgagl` va invocato PRIMA di `-lvga`.
Il lancio dell'eseguibile invece, come tutti i programmi che fanno uso di
SVGALib, necessita dei privilegi di root; questo è "causato" da SVGALib stessa
ed è spiegato sul sito ufficiale della libreria, svgalib.org, da cui cito:
"[...] While SVGAlib apps must be setuid root, that privilege is given up
immediately after execution. There is no need to be concerned."
Nel caso ci fossero problemi di visualizzazione sullo schermo, consultare la
documentazione di SVGALib e/o controllare le impostazioni di `libvga.config`.
CONCLUSIONI
============
SVGALib è una libreria abbastanza duttile, con cui lavorare in molti frangenti.
Oltre alle primitive qui descritte, ce ne sono per la visualizzazione di bitmap,
per il disegno di altre forme geometriche e così via.
Si tratta di software che ha goduto di grossa popolarità, ma che ormai è
abbastanza snobbato in favore di alternative più potenti e moderne. Senza
dubbio, però, per chi non avesse bisogno di feature particolari o per la prima
volta si affaccia a librerie grafiche, può essere un buono strumento.
Personalmente ritengo siano delle valide librerie.
Sicuramente, oltre a non avere praticamente documentazione ulteriore a quella
delle pagine `man`, hanno lo "svantaggio" di essere quasi unicamente per
sistemi Linux e FreeBSD; ma, d'altro canto, se c'è gente che programma con le
librerie Allegro, perchè diamine non dovremmo programmare con SVGALib? :-)
Detto ciò, ringrazio tutta la combriccola di HITNOTE e di UHJ che mi danno la
possibilità di scrivere per loro.
Ringrazio anche chi avrà la pazienza di leggere questo articolo e vi invito a
joinare il canale IRC di UHJ e nel farlo vi rimando al sito
unofficialhj.gotdns.org.
Buona programmazione a tutti.
tragic0mic <tragic0mic@anapnea.net> <tragic0mic.users.anapnea.net>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
****************************
* 0x06 :: Goodbye blue sky *
****************************
Guerre,crisi economica, catastrofi e teorie complottistiche:
quanto c'e' di vero in quello che ci raccontano?
Tutti abbiamo visto o sentito ciò che è accaduto al Giappone in questi giorni,
e Hitnote è profondamente vicina al dolore della popolazione nipponica.
Uno dei piu' violenti terremoti mai registrati sulla terra, a cui purtroppo è
seguito uno tsunami con onde alte piu' di dieci metri, che hanno spazzato via
tutto quello che hanno incontrato sulla loro strada...
Purtroppo le vittime sono migliaia e in continuo aumento, e anche i dispersi
sono tantissimi...
A tutto questo cè da aggiungere l'allarme nucleare, alcune centrali infatti
hanno subito gravi danni, soprattutto quella di Fukushima dove ci sono state
gia' diverse esplosioni ed incendi.
Le ultime notizie purtroppo non ci rassicurano affatto, uno dei reattori ha
iniziato a sprigionare del fumo che non preomette nulla di buono, gli altri
sono danneggiati e si cerca di raffreddarli il piu' possibile.
Nell'arco di 30 chilometri dalla centrale, il governo giapponese ha
disposto l'evaquazione delle famiglie, ed ha invitato le altre persone a non
uscire di casa e a razionare energia e provviste.
La nube anche se in piccolissima parte, sta sorvolando anche l'Europa, l'acqua
a Tokyo e' contaminata e il panico inizia ad imperversare in molte città...
In Italia il dibattito sulle centrali nucleari si è "magicamente" riaperto.
Sono molti ad urlare a voce alta che bisogna attuare una svolta nella produzione
di energia nel nostro paese, appoggiando la creazione di nuove e moderne
centrali che soddisferebbero in buona percentuale il nostro fabbisogno
energetico, sono molti pero' anche quelli che nel "nucleare italiano" vedono
delle possibili ripercussioni negative, possibili "appalti truccati" ad esempio,
problemi con lo smistamento delle scorie, rischi di gravi danni ambientali e
perdite radiottive.
La legge della domanda e dell'offerta è spietata, la storiella che il petrolio
sta finendo e che stiamo inquinando il pianeta devastandolo è vera purtroppo,
il tutto è condito da guerre con relativi blocchi di importazioni di energia,
da un "fare" mafioso, dove tutto e' un enorme gabola e da catastrofi ambientali
che ci fanno sempre piu' pensare ad un imminente fine del mondo, che fino a
qualche tempo fa ritenevamo improbabile (imho, anche ora è rimane comunque poco
probabile). È comunque degli ultimi giorni la notizia che il nostro Governo
abbia fatto un mezzo passo indietro sulla questione del nucleare,
forse spaventato dal caos e dal clima di incertezza che si sono venuti a creare
addirittura in un paese come il Giappone, dove solitamente tutto è rigoroso e
funziona alla perfezione.
Questa era solo una delle mie solite introduzioni noiose, ma credo che questa
volta fosse davvero d'obbligo.
In realta' mi vorrei focalizzare su temi che stanno più sullo sfondo,
ma che riguardano comunque guerre, catastrofi ambientali e le varie crisi
economiche che stanno affliggendo il nostro pianeta ultimamente.
Partiamo dal presupposto che tutti ci dovremmo essere accorti che qualcosa
non va...
Con "qualcosa" intendo una serie di avvenimenti negli ultimi anni, che si sono
susseguiti a catena, apparentemente senza un filo logico, ma che in realta'
hanno fin troppe coincidenze.
Tutto forse ha avuto inizio in quell'ormai "lontano" 11 Settembre 2001,
data difficile da scordare, da allora in poi tante cose sono successe,
attentati, tsunami, pandemie, crolli vertiginosi in borsa...
Tante cose, tante cose che la storia ci insegna accadere solitamente nell'arco
di centinaia di anni, successe in un decennio.
Coincidenze, normale "ciclo della vita" o cè qualcosa di piu'?
La teoria del complotto è una teoria molto generale che tende a schematizzare
dei possibili aspetti complottistici riguardo i piu' disparati avvenimenti.
Questa teoria (e ribadisco TEORIA), è applicabile un po a tutto ciò di strano
o catastrofico accada in un determinato giorno o in un determinato periodo al
fine di trovare appunto "qualcosa di losco"...
Ovviamente nella maggior parte dei casi queste sono solo simpatiche storielle,
poco credibili, spesso inutili e fastidiose, più simili a leggende
metropolitane che a fatti che realmente si possono verificare.
Vi invito a leggere questo articolo di Wikipedia per fare piu' chiarezza:
http://it.wikipedia.org/wiki/Teoria_del_complotto
Detto cio'proviamo ad analizzare alcuni degli avvenimenti degli ultimi anni.
-11 Settembre 2001, tragedia a New York, cadono le Torri Gemelle, dopo che due
aerei di linea americani dirottati, si vanno a schiantare contro i due
grattacieli.
Migliaia di morti e feriti, caos, allarme terrorismo, guerra in Afghanistan.
Ecco qui il punto, le Torri Gemelle cadono, gli Stati Uniti hanno un buon
"pretesto" per bombardare l'Afghanistan di Bin Laden, terra di terroristi
che vuole annientare gli USA, terra di terroristi che opprime il suo popolo,
terra di dirottatori di aerei, dirottatori addestrati proprio negli USA...
Cosa ci sarebbe di complottistico? I due aerei di linea americani non sarebbero
stati due aerei di linea, bensì due aerei dell' esercito.
Inoltre il terzo l'aereo, che si schiantò sul Pentagono, secondo alcune fonti
e ricostruzioni non era un aereo, bensì un missile.
Tutto questo lo potete trovare in un famoso "documentario" reperibile in rete.
Coincidenze, o cè qualcosa di piu'?
-Crisi economica: si è venuta a creare pian piano, nel corso degli anni, col
succedersi delle guerre, dei rispettivi blocchi di importazioni ed esportazioni,
con le catastrofi "naturali", ma soprattutto con la crisi dei mutui e delle
banche...
Tutto è iniziato nelle banche britanniche (e non negli States come tutti
credono) che hanno attuato un operazione di trasformazione dei mutui in pure e
semplici obbligazioni, vendute poi in tutto il mondo, tramite numerosi
e complessi passaggi.
Morale, le banche di tutto il mondo si sono arricchite a dismisura negli ultimi
periodi, creando una bolla che inevitabilmente e' esplosa, visto che la maggior
parte della gente non è riuscita piu' a pagare dei mutui preparati perfettamente.
Le banche d'altro canto hanno e continuano a dichiararsi impoverite da questo
"blocco del mercato immobiliare", molte di queste banche hanno quindi
dichiarato fallimento, ovviamente per nascondere il tutto...
Anche qui, tutto "regolare" oppure è stata un operazione studiata a tavolino
dai vari organismi economici mondiali?
-Guerra in libia: qui la questione è molto semplice...
Perchè fare una guerra in Libia? Ovviamente il petrolio, e le riserve di altri
materiali di cui è "ricco" questo paese c'entrano,
ma non sono il fulcro di tutto...
Come è nata la rivolta del popolo libico? Internet...
I giovani Libici che hanno avuto sempre più accesso alla rete, hanno scavalcato
la barriera della censura...
Quei giovani ben pensanti e che finalmente hanno il coraggio addirittura in un
paese oppresso come la Libia di esprimere le loro idee, diventano semplicemente
un pericolo per l'occidente...
E allora ecco il pretesto della poca democrazia, delle rivolte violente
ineccepibili, per fare una nuova guerra, ancora una volta un conflitto inutile,
per i soliti motivi...
-N1H1 e la cura per il cancro: Ci ricordiamo tutti dell'influenza n1h1?
Ma come mai non ne sentiamo piu' parlare?
Semplicemente perchè è stata un enorme bufala!
L'influenza che avrebbe dovuto "decimare" l'umanità, ha fatto meno vittime di
una normale influenza, secondo le fonti ufficiali questo è accaduto grazie
all'ottimo vaccino che è stato prodotto e distribuito su scala mondiale in
fretta e furia e che è stato in grado di curare tutti.
Le stime parlano di circa 600 milioni di vaccini somministrati...
Ma era proprio necessario questo vaccino? Assolutamente no, semplicemente perchè
ripeto, questa era un influenza uguale a tutte le altre...
Ci hanno spaventato, "pubblicizzato" un prodotto che non ci serviva, al fine di
farci spendere, e ancora una volta chi ci ha guadagnato sono state le
multinazionali, le aziende farmaceutiche in questo caso.
Ovviamente non è la prima volta che vengono create finte pandemie col solo scopo
di farci spendere, e ovviamente non sarà nemmeno l'ultima.
Qualche tempo fa inoltre lessi un'interessante teoria sul cancro...
In questo breve "articolo" si parlava della possibilità che il cancro fosse in
realtà curabilissimo, che la cura DEFINITIVA fosse stata trovata già da anni,
un semplice vaccino che avrebbe debellato per sempre questa malattia bruttissima.
Ma allora perchè questo vaccino non è già nelle nostre vene, e perchè forse non
sarà mai nemmeno in quelle dei nostri figli?
Anche in questo caso la risposta è molto semplice.
Le aziende farmaceutiche (queste sconosciute...), le stesse che hanno
"progettato" questo vaccino, producono tutte quelle medicine e quei macchinari
che servono per "curare" il cancro, che sappiamo tutti essere una malattia ormai
curabile, ma che comunque abbrevia la durata della vita, e soprattutto ne
abbassa la qualità.
Per farvi capire meglio vi farò un esempio, un po aggressivo ed esagerato, ma
per fare capire bene alle persone come le cose possono stare, questo ed altro...
La signora Gina Pinella (nome OVVIAMENTE di fantasia) a 30 anni purtroppo
scopre di avere il cancro. Ovviamente cerca di curarsi, e cerca di farlo con la
sanità pubblica, che attenzione non è affatto gratuita, perchè la paghiamo
salatamente con alcune tasse.
Come sappiamo non sempre la sanità pubblica ci viene incontro
(visite disponibili solo dopo molti mesi, qualità del servizio bassissima,...)
e allora la signora Gina è costretta anche a ricorrere a visite e cure private,
ovviamente per far prima, il tempo è prezioso per tutti, figuriamoci per un
malato...
Morale: la signora Gina dopo cinque anni ha sconfitto il cancro, spendendo circa
sei mila euro tra visite, medicine, eccetera...
È brutto fare questa domanda, ma...Chi ci ha guadagnato?
Ovviamente ancora una volta le aziende farmaceutiche!
Quanto ci avrebbe guadagnato un azienda farmaceutica con il vaccino? Circa cento
volte di meno di quanto non ha fatto curando lentamente la signora Gina, bene,
ora allargate questo discorso ad una fetta di popolazione molto ampia, fate 2+2,
e forse capirete...
-Haarp: ed eccoci arrivati purtroppo alla catastrofe verificatasi ultimamente
nel Sol levante. Partiamo da un "allegra storiella" per tentare di spiegare
cosa è effettivamente l'Haarp...
Il Giappone da anni sperimenta l'"energia fredda", un energia pulita, a basso
costo, che di fatto renderebbe addirittura obsoleto il petrolio.
L'intensità del sisma in Giappone è stata incredibile, è stato
uno dei sette terremoti piu' potenti mai registrati su questo pianeta.
Il Giappone è uno dei paesi (se non il paese) con la "struttura antisismica"
meglio organizzata del mondo.
Sia la prima devastante scossa, che tutte le altre scosse di "assestamento"
successive, sono avvenute alla stessa profondità , ovvero a circa 10 km sotto
il livello del mare.
Ci sono anche in rete alcuni grafici prodotti da magnetronomi, strumenti che
sono in grado anche di valutare la quantità di "perturbazioni" nella
ionosfera, che mostrano dei livelli sconsiderevoli di queste perturbazioni
proprio nel periodo del terremoto.
Detto cio' tentiamo di capire che cosa è realmente l'HAARP.
Innanzitutto, HAARP sta per High-Frequency Active Auroral Research Program,
ovvero (citando Wikipedia) "un'installazione civile e militare in Alaska
per la ricerca scientifica sugli strati alti dell'atmosfera e della ionosfera.
Un altro scopo è la ricerca sulle comunicazioni radio per uso militare."
Da cosa è composta questa installazione? Da un trasmettitore molto potente,
e da 180 antenne alimentate da potenti motori diesel.
L'uso ufficiale dell'HAARP è quello di creare piccolissime perturbazioni, per
studiare come esse possano influire nelle comunicazioni militari a lunga
distanza. Il principio è molto semplice: se si manda un onda radio verso la
ionosfera quest'ultima si surriscalda e crea piccoli mutamenti climatici.
Con lo stesso principio, secondo alcune persone, si potrebbero creare anche dei
sismi di incredibile potenza a migliaia e migliaia di chilometri, utilizzando
l'enorme "potenza" che l'HAARP può generare.
Ci tengo ancora una volta a precisare che tutto ciò che ho scritto sono
semplici teorie cospirazioniste, quindi non è detto che corrispondano al vero,
ma è anche possibile che un briciolo (se non più di un briciolo) di verità
ci sia.
Meditate: chi ha potere, può tutto...
P.S:
Solidareetà anche al popolo libico, o meglio a quella parte di popolo che
da diversi anni è oppresso da un regime barbaro e ingiusto e cerca la libertà,
la VERA libertà.
Disgusto, verso chi ancora appoggia le dittature, siano essi facenti parte del
"popolo" o siano essi potenti imprenditori e/o politici.
Disgusto, verso quegli stati occidentali che nel corso dei secoli hanno reso in
schiavitù molte popolazioni africane (e non solo), quegli stessi stati che ora
dipingono il nord Africa e il Medioriente come l'officina del terrorismo,
quegli stessi stati che da anni sono i primi terroristi (ecco un esempio per i
più scettici http://it.wikipedia.org/wiki/Operazione_Northwoods).
Ribrezzo, verso l'ONU, la Francia, la Gran Bretagna, la Danimarca, la Norvegia,
gli Stati Uniti e l'Italia, e tutti quegli altri stati che ancora una volta
stanno conducendo una guerra inutile.
PP.S: Questa volta voglio andare un po fuori dagli schemi, e fare una sorta di
spam, e ringraziare nonchè "pubblicizzare" un sito molto valido che mi ha dato
ancora una volta una grande mano nella stesura di questo "articolo":
http://www.disinformazione.it
dany15gni
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
********************************
* 0x07 :: Il cubo di resistori *
********************************
Allego un simpatico rompicapo che mi ha regalato Morbido6868(grazie!:D)
lo ritengo ottimo per imparare a calcolare sulle reti:
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Dedicated to d0ct0r
by Morbido6868
...............................................................................
Il cubo di resistori
--------------------
Calcolare la R totale di una rete resistiva costruita come un cubo avente un
resistore da 1 ohm su ciascuno spigolo e la V applicata a due vertici
diagonalmente opposti:
[VCC]
\
\
\
\_________R3__________
|\ |\
| \ | \
| R | R
| 4 | 2
| \ | \
R \________R1 ___|_____\
8 | | |
| | R |
| | 7 |
| R | |
| 5 | |
|______|____RC_______| R
\ | \ 6
\ | \ |
R | R |
9 | B |
\ | \ |
\|_________RA________\|
\
\
\
R1 = R2 = R3 = R4 = R5 = R6 = [GND]
= R7 = R8 = R9 = RA = RB = RC = 1 ohm
...............................................................................
/
/
/
/
/
/
/
/
/
____ /
/ ___| /
\___ \ /
___) |/
|____//
___ /
/ _ \ /
| | | | /
| |_| |/
_ \___//
| | /
| | /
| |___ /
|_____|/
_ _ /
| | | | /
| | | | /
| |_| |/
\___//
_____ /
|__ / /
/ / /
/ /_ /
/____|/
___ /
|_ _| /
| | /
| | /
|___|/
___ /
/ _ \ /
| | | | /
| |_| |/
\___//
_ _ /
| \ | | /
| \| | /
| |\ | /
|_| \_|/
_____ /
| ____| /
| _| /
| |___ /
|_____|/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
...............................................................................
Soluzione
---------
Occorre scomporre la rete per trovare le equivalenti sezioni minime.
R3, R4, R8 sono collegati allo stesso vertice di potenziale iniziale VCC perciò
possono essere considerati come tre resistori in parallelo dato che la VCC si
distribuisce equamente fra i tre; e lo stesso vale per R6, RA, RB che sono
collegati allo stesso vertice di potenziale finale GND:
sezione_1 : [VCC]
|
|
|
.---+---.
| | |
| | |
R R R
3 4 8
| | |
| | |
'---+---'
|
|
|
[AAA]
sezione_2 : [BBB]
|
|
|
.---+---.
| | |
| | |
R R R
6 A B
| | |
| | |
'---+---'
|
|
|
[GND]
Dopodichè rimangono solo 6 resistori (R1, R2, R5, R7, R9, RC) tra i punti
estremi AAA e BBB della rimanente sezione di circuito:
[AAA]
_
|\
| \
| R
| 2
[AAA] | \
________R1 ___|_____\
| |
| R [BBB]
| 7
R |
[AAA] 5 |
______|____RC_______|
\ |
\ | [BBB]
R |
9 |
\ |
\|
[BBB]
I quali 6 possono essere collegati secondo i circuiti equivalenti:
[AAA]
|
|
| .-------+-------.
.-----+-----. | | |
| | | | | |
| | | | | |
R | R R | R
1 | 2 1 | 2
| | | | | |
| | | | | |
.-----+ | +-----. .------+ [AAA] +------.
| | | | | | | | | |
| | | | | [BBB] | | | [BBB]
| R | R | R | R
| 5 | 7 | 5 | 7
| | | | | | | |
| | | | | | | |
| +-----+-----+ | +-------+-------+
| | | | | |
| | | | | |
| R R | R R
| 9 C | 9 C
| | | | | |
| | | | | |
| '-----+-----' | | |
| | | [BBB] [BBB]
'-----------+-----------'
|
|
|
[BBB]
sezione_3 : [AAA]
|
|
|
.---+---+---+---+---.
| | | | | |
| | | | | |
R R R R R R
1 5 9 C 7 2
| | | | | |
| | | | | |
'---+---+---+---+---'
|
|
|
[BBB]
Quindi non rimane che sommare le tre sezioni trovate, riconducibili al
circuito equivalente:
[VCC]
|
|
|
.---+---.
| | |
| | |
sezione_1 : R R R
3 4 8
| | |
| | |
'---+---'
|
| [AAA]
|
.---+---+---+---+---.
| | | | | |
| | | | | |
sezione_3 : R R R R R R
1 5 9 C 7 2
| | | | | |
| | | | | |
'---+---+---+---+---'
|
| [BBB]
|
.---+---.
| | |
| | |
sezione_2 : R R R
6 A B
| | |
| | |
'---+---'
|
|
|
[GND]
E calcolare infine la R totale della rete resistiva:
R_sezione_1 = 1/((1/R3)+(1/R4)+(1/R8)) =
= 1/((1/1)+(1/1)+(1/1)) =
= 1/3 =
= 0,333333 ohm
R_sezione_3 = 1/((1/R1)+(1/R5)+(1/R9)+(1/RC)+(1/R7)+(1/R2)) =
= 1/((1/1)+(1/1)+(1/1)+(1/1)+(1/1)+(1/1)) =
= 1/6 =
= 0,166666 ohm
R_sezione_2 = 1/((1/R6)+(1/RA)+(1/RB)) =
= 1/((1/1)+(1/1)+(1/1)) =
= 1/3 =
= 0,333333 ohm
R_totale = R_sezione_1 + R_sezione_3 + R_sezione_2 =
= 1/3 + 1/6 + 1/3 =
= 2/6 + 1/6 + 2/6 =
= 5/6 =
= 0,833333 ohm è la R totale del cubo di resistori :)
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
d0ct0r & Morbido6868
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
******************
* 0x08 :: Riddle *
******************
Soluzione dello scorso riddle(HITNOTE 0x05):
La prima pagina da visitare era:
http://hitnote.gotdns.org/riddle/0x05.jpg
Un'immagine..uhm... la parte in basso a destra risulta danneggiata..
Aprendo l'immagine con un semplice editor di testo si poteva scorgere qualche
byte prima della fine la scritta
PASSWORD: 2865
hitnote.gotdns.org/riddle/RD05.htm
Visualizzando il source di http://hitnote.gotdns.org/riddle/RD05.htm
si leggeva una scritta: <!-- SDVVZRUGLVQLQHQLQHQLQH <3 -->
Che decodificata usando il cifrario di cesare, si arrivava a:
PASSWORDISNINENINENINE
e quindi
PASSWORD: 999
Abbiamo due vincitori:
gumis => Livello 1
Piston Churchell => Livello 1 + Livello 2
---------------------------------------------
Da questo numero abbiam deciso di sospendere i riddle...
ma non temete, abbiamo nuove idee per il futuro ;)
r0b0t82
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**************************
* 0x09 :: Ringraziamenti *
**************************
Per questo numero si ringrazia, in ordine alfabetico:
dany15gni, d0ct0r, Morbido6868, Piston Churchell,
r0b0t82, riot, tragic0mic, turbocotoletta
La ezine HITNOTE è a cura dell' Unofficial HJ Forum:
http://unofficialhj.gotdns.org
Il sito ufficiale di HITNOTE è:
http://hitnote.gotdns.org
Insultateci, criticateci, inviateci tutto quel che vi passa per la testa a:
mailhitnote@gmail.com
Il canale IRC su cui ci incontriamo è:
#hj @ unofficialhj.gotdns.org:6667 [6697 via SSL]
#hjssl @ unofficialhj.gotdns.org:6697 [solo via SSL]
HITNOTE 0x06 [April 2011] -- Released under Creative Commons