Copy Link
Add to Bookmark
Report

Hitnote 0x06

eZine's profile picture
Published in 
Hitnote
 · 4 years ago

     __  _____________   ______  ____________ 
/ / / / _/_ __/ | / / __ \/_ __/ ____/
/ /_/ // / / / / |/ / / / / / / / __/
/ __ // / / / / /| / /_/ / / / / /___
/_/ /_/___/ /_/ /_/ |_/\____/ /_/ /_____/ [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, invece, è 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:

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 sequenze 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 sufficiente 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 già diverse esplosioni ed incendi.

Le ultime notizie purtroppo non ci rassicurano affatto, uno dei reattori ha iniziato a sprigionare del fumo che non promette nulla di buono, gli altri sono danneggiati e si cerca di raffreddarli il più possibile.

Nell'arco di 30 chilometri dalla centrale, il governo giapponese ha disposto l'evacuazione 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 radioattive.

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 più 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 ciò 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.: Solidarietà 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 abbiamo 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

← previous
next →
loading
sending ...
New to Neperos ? Sign Up for free
download Neperos App from Google Play
install Neperos as PWA

Let's discover also

Recent Articles

Recent Comments

Neperos cookies
This website uses cookies to store your preferences and improve the service. Cookies authorization will allow me and / or my partners to process personal data such as browsing behaviour.

By pressing OK you agree to the Terms of Service and acknowledge the Privacy Policy

By pressing REJECT you will be able to continue to use Neperos (like read articles or write comments) but some important cookies will not be set. This may affect certain features and functions of the platform.
OK
REJECT