Blog : Ricerca

Mano Robotica Arduino sketch

Mano Robotica Arduino sketch

Uno tra i progetti piu’ interessanti e d’effetto da intraprendere in campo robotica è certamente quello della mano robotica che si può realizzare utilizzando Arduino. In questo articolo pubblicherò lo sketch realizzato per dare un primo movimento ad una mano robotica al fine di capire il meccanismo di funzionamento e consentirvi quindi di estendere lo sketch con ulteriori personalizzazioni.

La mano robotica da me realizzata consiste in una struttura metallica dotata di dita snodabili qui movimento viene imposto da fascette da elettricista le quali dispongono di capacità di trazione ma soprattutto di ritorno in posizione di memori essendo in materiale plastico.

Ogni dito è legato da una fascetta ad un servo motore che rappresenta ovviamente la forza propulsiva di movimento.

Senza perderci troppo in lungaggini, vediamo lo sketch della mano robotica  Arduino commentando successivamente il codice. Premetto che il codice scritto non è sintatticamente dei migliori ma aiuterà i meno esperti a capire di piu’.

#include <Servo.h>

Servo myservo;

int pos = 0;
int ciclo = 0;

void setup()
{
myservo.attach(9);
}

void loop()
{
for (ciclo = 0; ciclo < 3; ciclo+=1){
for (pos = 0; pos < 45; pos += 1)
{
myservo.write(pos);
delay(15);
}
for (pos = 45; pos >= 1; pos -= 1)
{
myservo.write(pos);
delay(15);
}
}

myservo.attach(10);
for (ciclo = 0; ciclo < 3; ciclo+=1){
for (pos = 0; pos < 45; pos += 1)
{
myservo.write(pos);
delay(15);
}
for (pos = 45; pos >= 1; pos -= 1)
{
myservo.write(pos);
delay(15);
}
}

myservo.attach(11);
for (ciclo = 0; ciclo < 3; ciclo+=1){
for (pos = 0; pos < 45; pos += 1)
{
myservo.write(pos);
delay(15);
}
for (pos = 45; pos >= 1; pos -= 1)
{
myservo.write(pos);
delay(15);
}
}

myservo.attach(12);
for (ciclo = 0; ciclo < 3; ciclo+=1){
for (pos = 0; pos < 45; pos += 1)
{
myservo.write(pos);
delay(15);
}
for (pos = 45; pos >= 1; pos -= 1)
{
myservo.write(pos);
delay(15);
}
}

myservo.attach(13);
for (ciclo = 0; ciclo < 3; ciclo+=1){
for (pos = 0; pos < 45; pos += 1)
{
myservo.write(pos);
delay(15);
}
for (pos = 45; pos >= 1; pos -= 1)
{
myservo.write(pos);
delay(15);
}
}

}

Il codice comincia con l’inclusione della libreria utile per gestire i Servo Motori che è la Servo.h . Questa ci consente di impartire la rotazione di ogni singolo motore in gradi di rotazione.

Ci creiamo quindi un oggetto di tipo servo motore che inizializzeremo nel setup con il numero di porta su cui è agganciato il motore. Nel mio caso ho iniziato dalla porta 9 che corrisponde al mignolo della mano robotica.

Nel loop del programma ho avviato due cicli di for per ciascun dito con una variabile incrementale da 0 a 45 che corrisponderanno a 45 gradi di rotazione dei motori. Il primo ciclo di for sarà incrementale mentre il secondo in decremento e consentirà al dito di ritornare nella sua posizione iniziale.

Terminati i cicli di for per ciascun dito si setta l’oggetto servo sulla porta successiva per cambiare movimento di dito.

Video Mano Robotica Arduino Sketch

Acquisizione Forense Pagine Web come prova

Acquisizione Forense Pagine Web come prova

Ormai gran parte delle informazioni e soprattutto delle discussioni viaggiano sul web. E’ quindi inevitabile che anche molti reati o presunti tali vengano commessi all’interno di pagine web. Hai fini giudiziari risulta quindi indispensabile fornire come prova una pagina internet quale elemento probatorio di accusa o difesa.  Spesso però si commettono errori grossolani che invalidano molto semplicemente una prova in quanto non acquisita in metodo scientifico.

 

Foto o stampa della pagina web non basta come prova

Molti ritengono che sia sufficiente stampare una pagina di un sito web o farle una foto per acquisirla quindi come prova ed essere esibita quindi in corso di giudizio. Questo purtroppo o per fortuna non è assolutamente sufficiente in quanto una foto potrebbe essere facilmente manipolata così come una stampa rendendo non veritieri gli elementi di accusa o difesa che compongono il sito web (Corte di Cassazione, con sentenza n. 2912/94). Anche se una foto di una pagina di un sito web o una stampa della stessa venissero autenticate da un pubblico ufficiale o notaio, questa sarebbe del tutto inefficace dal punto di vista probatorio a meno che il notaio non verifichi anche la presenta di quanto si vuole dimostrare direttamente online. Questo però comporta che tra la pubblicazione del contenuto oggetto di prova e l’acquisizione certificata con un pubblico ufficiale può passare diverso tempo, tempo che può essere utilizzato dalla controparte per modificare o eliminare quanto proposto su un sito internet.

 

Acquisizione Forense di una pagina Web

Utilissima in caso di reati quali ingiuria, calunnia, minacce, stalking e diffamazione, l’acquisizione forense di una pagina web viene eseguita utilizzando particolari accorgimenti tecnici che legano il contenuto di una pagina internet ad una data certa rendendo impossibile la manipolazione del contenuto e del suo legame con la data di acquisizione. Attraverso questo espediente si può dare valore legale ad una pagina web utilizzandola quindi come prova in sede di giudizio. Il metodo più frequente e meno dispendioso per effettuare una certificazione di una pagina web, è quello di utilizzare algoritmi di crittografia quindi utilizzando le funzioni HASH

 

Acquisizione Forense con Funzioni Hash

Gli algoritmi MD5 e SHA1 sono detti anche di hash in quanto, partendo da un testo qualsiasi, generano una stringa di lunghezza fissa. L’aspetto forte è che la funzione opera solo in un verso, non è quindi possibile risalire ad un testo partendo da una stringa hash. Questa funzione rappresenta una sorta di impronta digitale del contenuto di un file e viene spesso usata per asserire che un testo o un file non sia stato alterato da una persona, virus o malware. Allo stesso modo è possibile utilizzare le funzioni HASH per autenticare una pagina web.  A tal fine gli algoritmi procedono all’acquisizione del contenuto di una pagina web e anche delle comunicazioni che il server invia ad un utente dove sono contenute anche la data e l’orario in cui una pagina viene richiesta. I testi ricavati vengono quindi passati sotto un algoritmo di hash il quale genera una stringa univoca ripetibile solo avendo gli stessi testi come input. Viene da se quindi che queste funzioni sono molto utili per avere un’acquisizione forense di una pagina web che non potrà essere invalidata.

SCOPRI IL SERVIZIO GRATUITO DI ACQUISIZIONE FORENSE

Brevetto Sistema Anticontraffazione

Brevetto Sistema Anticontraffazione

Qualche anno fa, ancora in ambiti universitari,  ho depositato un brevetto, come modello di utilità, circa un sistema anticontraffazione basato sulle tecnologie QR-code, Rfid ed NFC Tag unito ad un sistema di crittografia a chiave simmetrica. Il brevetto rende possibile applicare sistemi anticontraffazione a biglietti eventi, documenti come patente, passaporto ecc e qualsiasi prodotto o servizio che utilizzi un identificativo univoco.

Di seguito, le slide di presentazione del sistema anticontraffazione

Fullscreen Mode
Estrarre indirizzi email da Pagine Gialle

Estrarre indirizzi email da Pagine Gialle

Qualche annetto fa, ho avuto la necessità di (far finta 😉 ) di ottenere svariati indirizzi email dal portale Pagine Gialle per contattare qualche azienda di una determinata categoria merceologia. In quel periodo studiavo PERL quindi perché non provarci 🙂 Ora, a distanza di anni, ritrovo lo script e da bravo Opensourcer pubblico qui l’estrattore.

 

Non ho verificato se sia ancora possibile estrarre indirizzi email da Pagine Gialle poiché probabilmente il portale avrà cambiato qualche parametro. Sono sicuro però che con qualche semplice modifica può tornare funzionante 😉 .

 

NB: inviare e-mail ad indirizzi che non hanno prestato il consenso è reato. Lo script è rilasciato a scopo di ricerca, si diffida ogni uso illecito.

 

#! usr/bin/perl
$queryString='http://www.paginegialle.it/pgol/p-1/4-';
$keywords = $ARGV[0];
$location = $ARGV[1];
$raggio = $ARGV[2];
unless(open DATI, '>' . 'export.txt') {
die "\nNon è stato possibile creare il file di esportazione\n";
}
##########################################################################################################
######################## Creo il finto Browser ###########################################################
##########################################################################################################
#use strict; 
#use warnings; 
 
use LWP::UserAgent;
use HTTP::Cookies;
$ua = LWP::UserAgent->new();
print "Fake browser creato.\n";
$cookies = HTTP::Cookies->new(
file => "cookies.txt",
autosave => 1,
);
print "Ricezione cookies abilitata.\n";
$ua->cookie_jar($cookies);
print "Codifica cookies effettuata.\n";
$ua->agent("Windows IE 7");
print "Dichiarazione di essere il browser più scadente in circolazione comunicata ;)\n";
##########################################################################################################
######################## Rendo GET friendly la keyword della categoria da ricercare ######################
##########################################################################################################
$keywords =~ s/\s/%20/g;
$queryString=$queryString.$keywords;
##########################################################################################################
######################## Rendo GET friendly la location da ricercare #####################################
##########################################################################################################
if($location){
 $location =~ s/\s/%20/g;
 $queryString = $queryString."/3-".$location; 
}
##########################################################################################################
######################## Porto al massimo il numero di risultati per una pagina ##########################
##########################################################################################################
$queryString = $queryString."?mr=50";
##########################################################################################################
######################## Rendo GET friendly il raggio entro il quale devo cercare ########################
##########################################################################################################
if($raggio){
 if($raggio == '25'){
 $queryString = $queryString."?&enl=7";
 }elsif($raggio == '50'){
 $queryString = $queryString."?&enl=8";
 }elsif($raggio == '100'){
 $queryString = $queryString."?&enl=9";
 }else{
 die "Formato raggio non corretto. Inserire '25' '50' o '100'";
 }
}
print "Query string pronta.\n";
$pageNumber = 1;
##########################################################################################################
######################## Calcolo il numero di pagina da visualizzare #####################################
##########################################################################################################
for($i=1;$i<=$pageNumber;$i++){
$response = $ua->get($queryString);
 print "Scaricata la pagina $queryString di dimensione ".length($response->decoded_content)." bytes\n";
unless($response->is_success) {
 print "\nErrore nello scaricamento file HTML: " . $response->status_line."\n";
 }
$fileOut = "result-$i.html";
unless(open OUT, '>' . $fileOut) {
 die "\nNon è stato possibile creare il file '$fileOut'\n";
 }
print "Creato il file $fileOut\n";
# Setto la codifica
binmode(OUT, ":utf8");
print OUT $response->decoded_content;
close OUT;
$fileIn = "result-$i.html";
open(IN,$fileIn);
@contenuto=<IN>;
##########################################################################################################
######################## Verifico il numero di risultati trovati e lo memorizzo ##########################
##########################################################################################################
if($i==1){
 foreach (@contenuto){
 if ($_ =~/<span class="h-bold">(\d+)<\/span>/){
 $resultNumber= $1;
 print "Trovati $resultNumber risultati.\n";
 break; 
 }
 }
}
$pageNumber = $resultNumber/50;
$quote = $pageNumber/int($pageNumber);
if($quote!=1){
 $pageNumber = sprintf("%d", $pageNumber)+1;
}
foreach (@contenuto)
{
chomp ($_);
 if($_=~/<a title=\"Scheda Azienda (.+)\" class="_lms _noc"/)
 {
 $ragione_sociale = $1;
 $ragione_sociale =~ s/\&amp\;/\&/g;
 }
 elsif($_=~/\<span class\=\"street-address\"\>(.+)\, ([\w|\.|\s]+).+ class="locality">(\d\d\d\d\d) ([\w|\.|\s]+) \((\w\w)\)<\/span>/)
 {
 $civico = $1;
 $indirizzo = $2;
 $cap = $3;
 $citta = $4;
 $provincia = $5;
 }
 elsif($_=~/<div class="address">/){
 $inizio = 1;
 }
 elsif($inizio==1 && $_=~/<span class\=\"type\"> tel\:<\/span>/){
 $tel = 1;
 }
 elsif($inizio==1 && $_=~/^<span class=\"type\"> fax\:<\/span>/){
 $fax = 1;
 }
 elsif($tel==1 && (($_=~/^<span class="value">([\d|\s]+), ([\d|\s]+)<\/span>/) || ($_=~/<span class="value">([\d|\s]+)<\/span>/)) ){
 $tel1 = $1;
 $tel2 = $2;
 $tel = 0;
 }
 elsif($fax==1 && $_=~/^<span class="value">([\d|\s]+)<\/span>/ ){
 $fax1 = $1;
 $fax = 0;
 }
 elsif($inizio==1 && $_=~/<\/div>/ ){
 $inizio = 0;
 print DATI "$ragione_sociale,$indirizzo,$cap,$citta,$provincia,$tel1,$tel2,$fax1\n";
 }
}
close(IN);
#Ogni pagina visitata, setto la nuova pagina da visitare
$queryString =~ s/p-(\d*)/p-$i/;
}
close (DATI);