Friday, December 16, 2011

Arduino Lilypad CyberHat

Arduino Lilypad CyberHat

last updated: dec, 18, 2011

Arduino LilyPad is a special version of Arduino, designed by Leah Buechley at MIT Media Lab. It is specifically designed for integration in clothes and garments. With a special conductive thread, you can sew it on your jacket, and it is easy to program it with the same Arduino IDE we use for the standard Arduino boards.
Check Leah's great LilyPad tutorial which is a great introduction to this wonderful device.

I bought an Arduino LilyPad Simple board kit (LilyPad Beginner's kit), online from british shop SkPang: I bought again (using paypal account) from this shop and I got good service and fast delivery.

This kit includes a simple version of the Lilypad(*), a lithium LiPO 1 cell 3.7V battery, 5 leds, a multicolored led, a loudspeaker, a vibration button, a light sensor, a temperature sensor, and two spools of conductive thread, along with needles. There is also the small "FTDI basic" board that allows to connect to pc USB via a cable (not included): I use a Nokia DKE-2 phone cable, the same to talk with other arduinos equipped with "USB2Serial light".

(*) This simple Lilypad version differs from the standard one, because has less "petals" (9 available I/Os). But it has a plug for the included 1 cell 3.7V LiPO battery, and the recharging circuit to recharge it from the USB connector. I think these features are not available in the standard LilyPad, which requires an external power supply and is powered via conductive threads.
Arduino LilyPad should not be powered with more than 5Vdc.


In the winter, I am using a cap that I bought in Riga, Latvia. It is made of wool felt. It is a perfect fit for a first project for electronic integration with cloth.

Here are some pictures of the hat:

Here is how it looks on the inside. The battery is kept in place with a little bit of Patafix.

And this is a particular image of a led. It is quite small. Connecting threads are invisible from the outside.

And here is a detail view of the inside. I had to use some thermal glue to have the components stick well on the cloth material. The small circle on top is the speaker, while the one on the bottom right is the multicolored led.

The board, being inside just sits on top of my head when I am wearing the cap. It is completely invisible from the outside, and also the leds are very small and fit nicely in the felt. You would not say this hat has anything unusual until I turn it on. :-)

Code is very simple. I just prepared a set of routines for some light effects on the 5 blue leds, a small tune (shamelessly copied from arduino sample code library), and some random flickering of the multicolored led.


ledcap lilypad
Marco Guardigli
I dressed a winter cap with an arduino lilipad
this code is GPL. see



#define LEDFC  10      // front center
#define LEDFR  11      // front right
#define LEDFL  9       // front left
#define LEDBR  19      // back right
#define LEDBL  6       // back left
#define MCLR   16       // multicolor led: Blue (when low)
#define MCLB   17       // multicolor led: red (when low)
#define MCLG   18       // multicolor led: green (when low)
#define SPK    5        // speaker  

int melody[] = { NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4 };
int noteDurations[] = { 4,8,8,4,4,4,4,4 }; // note durations: 4 = quarter note, 8 = eighth note, etc.:

void sing() {
  for (int thisNote = 0; thisNote < 8; thisNote++) {
    // to calculate the note duration, take one second divided by the note type.
    //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
    int noteDuration = 1000/noteDurations[thisNote];
    tone(SPK, melody[thisNote],noteDuration);
    // to distinguish the notes, set a minimum time between them.
    // the note's duration + 30% seems to work well:
    int pauseBetweenNotes = noteDuration * 1.30;
    // stop the tone playing:

void setup() {
  pinMode(LEDFC, OUTPUT);
  pinMode(LEDFR, OUTPUT); 
  pinMode(LEDFL, OUTPUT); 
  pinMode(LEDBR, OUTPUT); 
  pinMode(LEDBL, OUTPUT); 
  pinMode(MCLR, OUTPUT); 
  pinMode(MCLG, OUTPUT); 
  pinMode(MCLB, OUTPUT); 
  pinMode(SPK,  OUTPUT);
  digitalWrite(MCLR,HIGH);  // multicolor led is off when the inputs are all high

// RGB
// LLL purple
// HLL orange
// LHL deeppurple
// LLH light blue
// LHH blue
// HHL red
// HLH green
// HHH off

void rainbow() {
  for (int i=1; i < random(100); i++) {
    if (random(100)>50) { digitalWrite(MCLR,LOW); } else { digitalWrite(MCLR,HIGH); }
    if (random(100)>50) { digitalWrite(MCLG,LOW); } else { digitalWrite(MCLG,HIGH); }    
    if (random(100)>50) { digitalWrite(MCLB,LOW); } else { digitalWrite(MCLB,HIGH); }

void allblink() {
  for (int i=1; i < random(100); i++) {

void randomblink() {
  int lev = random(100);
  for (int i=1; i < random(100); i++) {
    if (random(100) > lev) { digitalWrite(LEDFC,HIGH); }
    if (random(100) > lev) { digitalWrite(LEDFR,HIGH); }
    if (random(100) > lev) { digitalWrite(LEDFL,HIGH); } 
    if (random(100) > lev) { digitalWrite(LEDBR,HIGH); }
    if (random(100) > lev) { digitalWrite(LEDBL,HIGH); }

void spinleft() {
  int d = random(500);
  int d1 = random(100);

void spinright() {
  int d = random(100);
  int d1 = random(50);

void front3() {
  int ton=random(50);
  int toff=random(500);
  for (int i = 1; i < 10; i++) {

void loop() {
  // cycles random effects
  switch (random(10)) {
    case 0:
    case 1:  
      if (random(100) > 90) { sing(); }
    case 2:
    case 3:    
    case 4:
    case 5:
    case 6:


Friday, November 18, 2011

TomWare Arduino-Ethernet Datalogger

Arduino-Ethernet Datalogger
last updated on nov 18 2011

For a customer project I needed to build a datalogger that had to be periodically and asynchronously polled via ethernet. Main task of the datalogger was counting raising pulses from an external sensor outputting a TTL 0-5v  signal.

Customer requirements were to have it simple, reliable, and tolerant of possible ethernet network disconnections.

I decided to work using the new Arduino Ethernet, which integrates the wiznet ethernet shield, and also has the sdcard slot.
I made this with Arduino022 software version.

I needed to perform accurate timestamping in the logs, so I decided to use NTP protocol to periodically sync a local clock built via the DS1307RTC time library.
Given the nature of the pulses I had to count, I decided to simply connect the counter line using the interrupt feature, and so decoupling the pulse detection from all the other code.

After initializing network, sdcard, synchronizing time with NTP server, and setting up the interrupt pulsereading line, the main loop just cycles waiting for browser to connect, then checking if it is time to log on the sdcard, and checking if it is time to resync clock with NTP to avoid excessive drift.

To test it, I built a simple random pulse generator and run it on another arduino 2009, feeding its digital output to the Arduino ethernet pulsecounter in.

I used just the external timekeeping library

Here is the code. Some portions are freely taken from arduino libraries samples. Also I got some inspiration from this page by Ms. Limor Fried (aka LadyAda) describing her SDcard Datalogger and Ethernet server. My SD code is different (and a bit simpler) because I use the standard SD card library.

Web Server, Pulse Logger, NTP time client, for Carcano spa
This code is GPL. see for details

be careful in increasing string space. this software uses almost all the arduino ATMEGA328 memory (2Kb)

SDcard Datalogger v0.8

TCPIP Webserver with 
NTP client
Asynchronous Interrupt (IRQ0) pulse counter on Digital pin2
DataLogger on Micro SDcard file

* Ethernet shield attached to pins 10, 11, 12, 13
* Analog inputs attached to pins A0 through A5 (optional)
* Digital input with raising front pulse counter on digital PIN2

NTP protocol is used to sync from a time server 
in arduino 022 download
   and put its contents in 

SDcard is accessed via SPI protocol standard, which is also used to program ethernet Wiznet controller.
In order to interact with SD, we need to set pin10 as output otherwise SD library will not work



byte mac[] = { 0xDA, 0xAD, 0xBE, 0xEE, 0xFE, 0xED };
byte ip[] = { 10, 2, 3, 51 };
byte mask[] = { 255, 255, 0, 0 };
byte gateway[] = { 10, 2, 0, 1 };
byte timeServer[] = { 10, 2, 3, 60 };
                                          // seconds to add to UTCtime to consider correct timezone
// const unsigned long UTCcorrection = 7200; // CET = UTC + 1 (+2 in summer):  (HOW to properly calculate DST?)
const unsigned long UTCcorrection = 0;    // keep UTC
const int NTP_PACKET_SIZE= 48;            // NTP time stamp is in the first 48 bytes of the message
byte packetBuffer[NTP_PACKET_SIZE];       // buffer to hold incoming and outgoing packets
unsigned int localPort = 8989;            // local port to listen for UDP packets
Server server(80);                        // local listener port for http services

// variable for pulsecounter, to be altered from inside interrupt routine (requires volatile)
volatile unsigned long pulses = 0;
int pulsePin = 2;  // use pin2 for async pulse counter IRQ0 is connected to PIN2, (IRQ1 is connected to pin 3)

const unsigned long seventyYears = 2208988800UL;     
unsigned long epoch = seventyYears;

const int EthChipSelect = 10;
const int SDChipSelect = 4;
time_t logInterval = 10UL;          // append to file every loginterval seconds
time_t lastLogTime = 0UL;         
time_t syncInterval = 60UL;         // ntp sync every syncinterval seconds
time_t lastSyncTime = 0UL;        

unsigned long logLinesWritten = 0;
const int maxLogLines = 7;
boolean fileFull = false;
char* logFileName = "log.txt";
unsigned long logFileSize = 0;  //logfilesize added from last powerup

unsigned long sendNTPpacket(byte *address) {
  memset(packetBuffer, 0, NTP_PACKET_SIZE); // set all bytes in the buffer to 0
  // Initialize values needed to form NTP request
  packetBuffer[0] = 0b11100011;   // LI, Version, Mode
  packetBuffer[1] = 0;     // Stratum, or type of clock
  packetBuffer[2] = 6;     // Polling Interval
  packetBuffer[3] = 0xEC;  // Peer Clock Precision
  // 8 bytes of zero for Root Delay & Root Dispersion
  packetBuffer[12]  = 49;
  packetBuffer[13]  = 0x4E;
  packetBuffer[14]  = 49;
  packetBuffer[15]  = 52;
  // Now send packet requesting a timestamp to server udp port NTP 123
  Udp.sendPacket( packetBuffer,NTP_PACKET_SIZE, address, 123);

void ntpTimeSync() {
  sendNTPpacket(timeServer); // send an NTP packet to a time server & wait if a reply is available
  if ( Udp.available() ) {  
    Udp.readPacket(packetBuffer,NTP_PACKET_SIZE);  // read the packet into the buffer
    // the timestamp starts at byte 40 of the received packet and is four bytes,
    // or two words, long. First, esxtract the two words:
    unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
    unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);  
    // combine the four bytes (two words) into a longint: NTP time (seconds since Jan 1 1900)
    unsigned long secsSince1900 = highWord << 16 | lowWord;  
    // NTP gives secs from 1 1 1900. Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
    // subtract seventy years:
    epoch = secsSince1900 - seventyYears;  
  } else {
  time_t t = epoch + UTCcorrection;
  setTime(t);    // sets arduino internal clock

String getTimeString() {
  // gives back hh:mm:ss
  time_t t = now();
  String s = "";
  if (hour(t) <10) s = s + "0";
  s = s + hour(t) + ":";
  if (minute(t) <10) s = s + "0";
  s = s + minute(t) + ":";
  if (second(t) <10) s = s + "0";
  s = s + second(t);

String getDateString() {
  // gives back dd/mm/yyyy
  time_t t = now();
  String s = "";
  if (day(t) <10) s = s + "0";
  s = s + day(t) + "/";
  if (month(t) <10) s = s + "0";
  s = s + month(t) + "/";
  s = s + year(t);

void tic() {  // IRR Interrupt response routine, bump counter when signal raising front seen

void setup()
  // setup interrupt logic
  pinMode(pulsePin, INPUT);        // non strettamente necessaria, in quanto IRQ0 e' sempre agganciata a pin2
  attachInterrupt(0, tic, RISING); // LOW-CHANGE-RISING-FALLING tic is the function pointer to the RRI
  pinMode(EthChipSelect, OUTPUT);
  if (!SD.begin(SDChipSelect)) {
    while(1); // fatal: wait forever

void webServer() {
// sends log content if something is specified
  String creq;
  Client client = server.available();
  if (client) {
    while (client.connected()) {
      if (client.available()) {
        char c =;
        if (c != '\n' && c != '\r') {
          creq += c;
      if (creq[5] != 'x' && creq[5] != 'X') {      // or requests log, else std page
        client.println("HTTP/1.1 200 OK");
        client.println("Content-Type: text/html");
        client.print("TomWare PulseLogger 0.8");

http://ip/X ->log"); client.println("

"); client.print("T:"); client.print(getTimeString()); client.println("

"); client.print("D:"); client.print(getDateString()); client.println("

"); client.print("p2 pulses:"); client.print(pulses); client.print("

"); client.print("log:"); client.print(logFileName); client.println("

"); client.print("lines:"); client.print(logLinesWritten); client.println("

"); client.print("logsize:"); client.print(logFileSize); client.println("

"); client.print("ram:"); client.print(FreeRam()); client.println("

"); } else { // LOG REQUESTED File dataFile =, FILE_READ); if (! dataFile) { client.println("HTTP/1.1 404 Not Found"); client.println("Content-Type: text/html"); client.println(); client.println("File Not Found!"); } Serial.println("W"); client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/plain"); client.println(); char k; while ((k = > 0) { client.print((char)k); } dataFile.close(); if (fileFull) { // start a new file if file full, deleting contents just sent Serial.print("D"); SD.remove(logFileName); Serial.println("."); fileFull = false; } } delay(1); // give the web browser time to receive the data client.stop(); } } } void logToFile() { // always log to logFileName file File logFile =, FILE_WRITE); if (logFile) { String s = ""; time_t t = now(); s = String(t) + "," + String(pulses); for (int analogChannel = 0; analogChannel < 6; analogChannel++) { s += ","; s += String(analogRead(analogChannel)); } logFile.println(s); logFileSize = logFile.size(); logFile.close(); Serial.println(s); logLinesWritten++; } else { Serial.println("SDe!"); while(1); // fatal: wait forever } } void loop() { webServer(); time_t t = now(); if ((t - lastLogTime) >= logInterval) { lastLogTime = t; Serial.print("F:"); Serial.println(FreeRam()); Serial.print("L:"); Serial.println(logLinesWritten); logToFile(); if ((logLinesWritten % maxLogLines) == 0) { Serial.println("FF"); fileFull = true; } } if ((t - lastSyncTime) > syncInterval) { lastSyncTime = t; Serial.println("N"); ntpTimeSync(); } }

@mgua .

Thursday, October 6, 2011

Thank you, Steve Jobs


your marks
on this shore

your song
in the wind

to think

to do it
the harder, better way

for excellence

thank you
for the lessons
and the change.


Here is a beautiful tribute video I found on Youtube: (added feb 2, 2012)


Saturday, October 1, 2011

Arduino Ethernet

Here are some notes about my experience with the new (summer 2011) Arduino-Ethernet.

Created: October 1, 2011
Last Updated: December 12, 2011

Arduino Ethernet is a single board which integrates a basic Arduino UNO with Wiznet Ethernet shield.
The board is obviously more integrated, and the components are much smaller.

The board has a MicroSD slot, like the newest Ethernet Shields, but does not have anymore a direct USB interface, like the Arduino Classic boards.

Arduino Ethernet supports a POE addon that allows Power Over Ethernet. I did not buy that too.

To program it, it is needed a small component (also manufactured by the arduino factories, but sold separatedly) called Arduino USB2SERIAL light, that plugs on a 6 pin connector on the board.

This component also can power via USB the whole Arduino. Once programmed, and once ethernet communications are setup, this component is not necessary anymore and can be disconnected, but then Arduino must be powered via the power plug, or via POE.

Here is a picture of the two connected, and with a micro-SD card inside the socket:

You can also program Arduino using a standard serial RS232 interface, connected to GND, RX (digital pin 0), TX (digital pin 1).

My Arduino Ethernet is manufactured by Smart Projects srl.
I was pleased to find a nice booklet inside the package, with 6 small cool adhesives. Here is the introductory note:

Connection Problems
I was surprised not to be able to connect to my new Arduino thru the standard software already available in my PC (from which I was working on my other Arduino 2009 boards).
The latest (as of oct 1, 2011) distribution package arduino-22 does not support this board, and the USB2SERIAL drivers are simply not there.
My environment is Windows 7 64bit.

After some panic, and after some unuseful trials to download and use FTDI drivers, I found this note: by Federico_Vanzati.

Actually, the correct USB drivers for USB2SERIAL Light can be downloaded from or as well as this necessary update of the boards.txt file is needed in arduino-22 distribution so to correctly identify Arduino Ethernet.

With this driver and with the boards.txt update, Arduino Ethernet was correctly identified and i was able to download and run sketches on it.

Available I/O: Caveats
Since Arduino Ethernet is actually and Arduino embedding Wiznet 5100 Shield, some pins are not available, because used by the ethernet interface.
Here is a good description of the Arduino Ethernet architecture, which is based on ATMEL ATMega328.

Digital I/O 10,11,12,13 are not available, since used for ethernet interfacing (exactly like in the Ethernet shield).
Digital I/O 4 is used for interfacing with SDcard.
Digital I/O 0,1 are used for serial interface (native or via USB2SERIAL connector)

So, the available Pins are:

7 Digital I/O: 2,3,5,6,7,8,9

of these, PIN 2,3 can support interrupt triggering, to detect an asynchronous change in a signal, like detecting an edge (see AttachInterrupt()) and for example could be used for pulse counting.
PIN 7 is a normal digital I/O

PINs 3,5,6,9 can support PWM (pulse width modulation, needed for example in servo controlling).

6 Analog I/O 0,1,2,3,4,5 can be used to read/write analog values with 10 bit resolution (4.9mV) in the range 0-5V.



Sunday, September 11, 2011

How I became an hollywood actor

This is a really unbelievable and amazing story.
So strange that almost seems impossible.

But it is true.

My mom Adriana died on sept 11, 2008.

About two months after her loss, I found a website: where many send old pictures of their parents.

I decided to send this picture, where mom holds me, as a very little child. Along with the picture I left my email address.

In april 2010, that picture was published. And I was very happy because I felt that my mom picture was available on the web, and maybe other people could see her. I did non even write she was dead. It was a sort of private joy for me knowing that "our" picture was online.

I did not even tell the story to anyone.

Months later, I received an email from a lawyer, Ashley Kravitz, working for CBS copyright cleaning.
CBS wanted to use my mom picture in a movie!

The movie is an action packed gangster story: Faster, starring Dwayne Johnson and Billy Bob Thornton

And at 53 minute in the movie, there is my mom, and there is me.

So, this is how I became an hollywood actor in an action movie.

Life is wonderful.



for our moms

for our moms

moms are
made of a matter
that is hard and tender

moms are gifts
from past to future
seeds for your flowers

moms work
plan, dream
for a distant future

and give unselfishly
care and care
with the warmest endless trust

moms do not
need words
for understanding

moms do not ask
do not expect
never leave you alone

their core within
your future
your story

and they give
their greatest gift
when leaving


-crossposted from

Monday, August 29, 2011

Be strong. Be alive. Be an example. Be a leader.

Here is a short video by Nick Vujicic.

So, do not be sad. 
Do not complain.
Do not consider you to be unlucky.
Do not give up.


Many people need your help.

Enjoy every single moment.
Because there are so many beautiful things.

Life is beautiful.

Marco   ( @mgua )

PS: the Video is not shown in some places. Check this one instead.


Thursday, August 25, 2011

Network interface bonding and trunking VLANs with different MTUs on RedHat Linux

Network interface bonding and trunking VLANs with different MTUs on RedHat Linux

(Last updated on aug 30 2011)

Configuration of Red Hat Enterprise Linux Server 6.1 (Hardware: HP DL380G7, 2 CPU Intel core) connected with two 10Gbit/sec ethernet interfaces (HP NC522SFP Dual Port 10GbE Server Adapter Board), with interface bonding, high availability, bandwidth aggregation and multiple VLAN transport.

Two 10Gbit/s physical network interfaces have to be connected to two FEX (Nexus Fabric EXtension "switches") upstreaming to two different Nexus 7000 cores, in a high availability configuration, allowing also to use both links simultaneously, and to transport different VLANs.
The different VLANs have then to be mapped on different linux logical subinterfaces.

The two physical interface are joined to form a bond, called bond0.
A specific channel configuration exists on the cisco nexus switches, so to allow these ports to form a single trunk channel, and to transport on it tagged frames from the selected VLANs, complying to the 802.1q transport.

Here are the settings on the Cisco Nexus Side (only one "side" is shown, the other is symmetric):

Core to FEX2232

  interface port-channel131
    switchport mode fex-fabric
    fex associate 131
    mtu 9216

  FEX to server

  interface Ethernet131/1/5
    description srv
    switchport mode trunk
    switchport trunk allowed vlan 10-13
    flowcontrol send off
    channel-group 88 mode active
    no shutdown

On the RedHat linux side, my two physical interfaces are eth0 and eth2. I check with ethtool that on both I can see the link, and that the speed and duplex settings are ok (autonegotiation has been disabled both on the switch side and on the server).

The two physical interfaces are joined in bond0

Here are the configuration files of the physical and logical interfaces, in /etc/sysconfig/network-scripts
bond0.10 and bond0.11 are the two logical interfaces sitting on VLANs 10 and 11
bond0.10 has MTU 1500
bond0.11 has MTU 9000 so to allow more efficient traffic of large blocks of data on the storage VLAN

[root@srv network-scripts]# cat ifcfg-eth0

[root@srv network-scripts]# cat ifcfg-eth2

[root@srv network-scripts]# cat ifcfg-bond0
BONDING_OPTS="mode=4 miimon=100"

[root@srv network-scripts]# cat ifcfg-bond0.10

[root@srv network-scripts]# cat ifcfg-bond0.11

[root@srv network-scripts]# ifconfig eth0 && ifconfig eth2 && ifconfig bond0 && ifconfig bond0.10 && ifconfig bond0.11
eth0      Link encap:Ethernet  HWaddr 78:E3:B5:F4:E0:50
          RX packets:30750 errors:0 dropped:0 overruns:0 frame:0
          TX packets:12992 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:3590043 (3.4 MiB)  TX bytes:3577302 (3.4 MiB)

eth2      Link encap:Ethernet  HWaddr 78:E3:B5:F4:E0:50
          RX packets:36472 errors:0 dropped:0 overruns:0 frame:0
          TX packets:7248 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:27483898 (26.2 MiB)  TX bytes:906669 (885.4 KiB)

bond0     Link encap:Ethernet  HWaddr 78:E3:B5:F4:E0:50
          inet6 addr: fe80::7ae3:b5ff:fef4:e050/64 Scope:Link
          RX packets:67224 errors:0 dropped:0 overruns:0 frame:0
          TX packets:20242 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:31074081 (29.6 MiB)  TX bytes:4484967 (4.2 MiB)

bond0.10  Link encap:Ethernet  HWaddr 78:E3:B5:F4:E0:50
          inet addr:  Bcast:  Mask:
          inet6 addr: fe80::7ae3:b5ff:fef4:e050/64 Scope:Link
          RX packets:51880 errors:0 dropped:0 overruns:0 frame:0
          TX packets:13135 errors:0 dropped:10 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:8963296 (8.5 MiB)  TX bytes:3972360 (3.7 MiB)

bond0.11  Link encap:Ethernet  HWaddr 78:E3:B5:F4:E0:50
          inet addr:  Bcast:  Mask:
          inet6 addr: fe80::7ae3:b5ff:fef4:e050/64 Scope:Link
          RX packets:14599 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6891 errors:0 dropped:7 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:20770093 (19.8 MiB)  TX bytes:486535 (475.1 KiB)

[root@srv network-scripts]# ethtool eth0
Settings for eth0:
        Supported ports: [ FIBRE ]
        Supported link modes:   10000baseT/Full
        Supports auto-negotiation: No
        Advertised link modes:  10000baseT/Full
        Advertised pause frame use: No
        Advertised auto-negotiation: No
        Speed: 10000Mb/s
        Duplex: Full
        Port: FIBRE
        PHYAD: 0
        Transceiver: external
        Auto-negotiation: off
        Supports Wake-on: g
        Wake-on: g
        Current message level: 0x00000005 (5)
        Link detected: yes

[root@srv network-scripts]# ethtool eth2
Settings for eth2:
        Supported ports: [ FIBRE ]
        Supported link modes:   10000baseT/Full
        Supports auto-negotiation: No
        Advertised link modes:  10000baseT/Full
        Advertised pause frame use: No
        Advertised auto-negotiation: No
        Speed: 10000Mb/s
        Duplex: Full
        Port: FIBRE
        PHYAD: 0
        Transceiver: external
        Auto-negotiation: off
        Supports Wake-on: g
        Wake-on: g
        Current message level: 0x00000005 (5)
        Link detected: yes


With this configurations, the server keeps correctly the configuration at reboot, and all the interfaces have the correct MTU sizes.

The definition of the MTU is only needed in the bond0 and in the proper subinterface. The physical interfaces do not have any MTU settings attached.

The behaviour of ethtool command appeared consistent. mii-tool was not. 
ethtool is the command to be used.

Performance metering:
With this setup, I was able to squeeze an amazing end-to-end tcp speed of 9.8Gbit/sec

here is the nuttcp test output.
[root@srv network-scripts]# nuttcp -t -v -T 60
  nuttcp-t: v6.1.2: socket
  nuttcp-t: buflen=65536, nstream=1, port=5001 tcp ->
  nuttcp-t: time limit = 60.00 seconds
  nuttcp-t: connect to with mss=8948, RTT=0.277 ms
  nuttcp-t: send window size = 28440, receive window size = 87380
  nuttcp-t: available send window = 21330, available receive window = 65535
  nuttcp-t: 70086.0000 MB in 60.00 real seconds = 1196131.87 KB/sec = 9798.7123 Mbps
  nuttcp-t: retrans = 0
  nuttcp-t: 1121376 I/O calls, msec/call = 0.05, calls/sec = 18689.56
  nuttcp-t: 0.2user 29.7sys 1:00real 49% 0i+0d 468maxrss 0+2pf 25844+75csw
  nuttcp-r: v6.1.2: socket
  nuttcp-r: buflen=65536, nstream=1, port=5001 tcp
  nuttcp-r: accept from
  nuttcp-r: send window size = 28440, receive window size = 87380
  nuttcp-r: available send window = 21330, available receive window = 65535
  nuttcp-r: 70086.0000 MB in 60.00 real seconds = 1196065.83 KB/sec = 9798.1712 Mbps
  nuttcp-r: 2319818 I/O calls, msec/call = 0.03, calls/sec = 38661.42
  nuttcp-r: 0.4user 33.9sys 1:00real 57% 0i+0d 330maxrss 0+17pf 1103994+76csw
  [root@srv network-scripts]#

which is a quite good result!
during the nuttcp test, the servers were having about a 50KHz interrupt rate and a very low average load.

here is the vmstat 1 output of the transmitting server during the test:

  procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
   r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
   0  0      0 15100956  44948 525388    0    0     0     0  280  152  0  0 100  0  0
   0  0      0 15100956  44948 525388    0    0     0     0  159   73  0  0 100  0  0
   1  0      0 15096676  44948 525388    0    0     0     0 44407  536  0  2 98  0  0
   1  0      0 15097296  44956 525384    0    0     0    44 51087  455  0  6 94  0  0
   1  0      0 15097792  44956 525388    0    0     0     0 51025  556  0  2 98  0  0
   1  0      0 15098056  44956 525388    0    0     0     0 50067  656  0  7 93  0  0
   1  0      0 15098304  44956 525388    0    0     0     0 49978  774  0  2 98  0  0
   1  0      0 15098676  44956 525388    0    0     0     0 50264  769  0  6 94  0  0
   1  0      0 15098676  44956 525388    0    0     0  1076 50428  843  0  2 98  0  0
   1  0      0 15098676  44956 525388    0    0     0     0 50832 1202  0  5 95  0  0
   0  0      0 15099296  44956 525388    0    0     0     0 51193 1350  0  2 98  0  0
   1  0      0 15099544  44956 525388    0    0     0     0 51228 1198  0  7 93  0  0
   0  0      0 15102948  44956 525388    0    0     0     0 6756  681  0  0 100  0  0
   0  0      0 15103072  44964 525380    0    0     0   360  684  462  0  0 100  0  0
   0  0      0 15103400  44964 525388    0    0     0     0  234  147  0  0 100  0  0

Marco    ( @mgua )


Friday, August 19, 2011


Youth, by Samuel Ullman (1840-1924)

Youth is not a time of life; it is a state of mind; it is not a matter of rosy cheeks, red lips and supple knees; it is a matter of the will, a quality of the imagination, a vigor of the emotions; it is the freshness of the deep springs of life.

   Youth means a temperamental predominance of courage over timidity of the appetite, for adventure over the love of ease.  This often exists in a man of sixty more than a body of twenty.  Nobody grows old merely by a number of years.  We grow old by deserting our ideals.

   Years may wrinkle the skin, but to give up enthusiasm wrinkles the soul.  Worry, fear, self-distrust bows the heart and turns the spirit back to dust.

   Whether sixty or sixteen, there is in every human being's heart the lure of wonder, the unfailing child-like appetite of what's next, and the joy of the game of living.  In the center of your heart and my heart there is a wireless station; so long as it receives messages of beauty, hope, cheer, courage and power from men and from the Infinite, so long are you young.

   When the aerials are down, and your spirit is covered with snows of cynicism and the ice of pessimism, then you are grown old, even at twenty, but as long as your aerials are up, to catch the waves of optimism, there is hope you may die young at eighty.

Painting by Valeriy Skrypka


Sunday, May 22, 2011

Apple ipad lost notes

Last updated on 2011 may 22

It seems quite a common situation that Apple devices notes are being lost.
The loss of information is always a very frustrating experience, and it is even more frustrating to know that a backup of the lost information is present, but is apparently unaccessible.

The following article is related to my experience on my Ipad, but it is probably applying also to iphone and ipod.

The problem:
Notes on the device appear completely empty.

Possible causes:
1. The user was changing the email account synchronization settings on the device. Maybe an account was removed, or its settings were changed.
2. An itunes sync operation was interrupted abruptly, disconnecting the cable
3. Your ipad was hit by a spell of disgrace (:-).

Possible solutions (basic):
1. If you had Gmail synchronization in place, open your gmail account from your PC, and look for a "Notes" label among your email labels. It can be that your notes are there. If so, save them, and thank big G. Then go back to your ipad and reactivate gmail notes synchronization tapping Settings/Mail,Contacts,Calendar/your Gmail account/">"

2. If you had a non-gmail notes synchronization with your email system, check the settings. Some email systems allow notes synchronization, other do not (as an example, IBM Lotus Traveler do not sync notes).

Possible solution (advanced):
Do not sync your device, and prepare for opening the guts of your iTunes. The reason for not syncing is that apparently iTunes sync operation keeps only a single copy of the last state of the device. It can be you have another backup system that backs up the iTunes folders, so maybe you also have hopes if you already performed an iTunes sync.

The following instructions require some not so common skills, so if you are not confident, please ask for professional help. It can be you will need to enable access and proper visibility to files in these folder, as well as detailed view mode.

The following instructions are based on my iTunes installation on a Windows 7 64 bit english edition. Paths could be different under other operating systems.

On my pc, the iTunes backup folder is this:
      C:\Users\mgua\AppData\Roaming\Apple Computer\MobileSync\Backup

 in this folder, there are maybe some other folders with ugly names like:
Each of which contains the backup data of each apple devices that ever synced with your iTunes setup.
Inside these data folder there are a bunch of files with similarly ugly names and no extensions. There are no subfolders.

In my installation I have 2108 backup data files. File dates and size are very different. Dates and times reflect the moments in which iTunes synchronization updated the file.

Now sort the folder content by last modification date (clicking on the top of column date modified, in view-details mode) and look for the file named info.plist
You have to check this file contents (IMPORTANT: open it without saving any changes) to be sure you are checking the right directory (you could have more than one apple device and you can identify which backup directory you are in by checking the contents of this file).
In order to open this file, you will need a text editor which is somewhat smarter than Microsoft notepad. A good choice could be notepad++ (see ).

Here is an excerpt of my info.plist contents (some data has been edited and replaced with [omissis] placeholder)

    Build Version
    Device Name
    Display Name
    Last Backup Date
    Product Type
    Product Version
    Serial Number
    Target Identifier
    Target Type
    Unique Identifier

The backup data files contain your data. The problem is that the majority of those files are not text files and are not easily readable, and specific tools are needed.
A simple quite unspecific tool is grep, but unfortunately it is not available in basic windows installations. A very good implementation of grep for windows is included in cygwin set of tools, but this requires a big and complex installation.
Windows comes with a simpler tool, called find, that can be useful in our situation.

First we need to open a command box, and go in the aforementioned folder that contains our backup. We use the command "cd" to go to the specific folder (the path was copied and pasted from the explorer window).

We need also an unusual word that was included in one of our lost notes. A surname or any unusual and uncommon word would be great. This will be our bait. We will use the bait to go fishing for our lost notes contents.

In my case I used the word "prodexpo" that was in one of my lost notes, and found it inside a specific file, with the following command line command:

      find /I "prodexpo" *

Then I opened (with notepad++) the now identified file and was able to read the contents of one of my lost notes and recover manually the important data (names, emails and phone numbers). (be careful not to save!!).

Further analysis and reverse engineering can be performed using sql-lite tools from cygwin, but this is definitely out of scope here.


As a reference, there is a tool named decode_iphone_backup available at the following url which decodes the itunes backup directory in a more suitable filesystem format.
After the decoding, sql-lite tools can be used to access the semi-relational data structures.
The tool is intended to be run on a mac computer, but it is written in pyton, so it is easily understandable.
The tool requires another program called plutil (property list tool) which is part of Apple Mac OSX operating system.
Windows/Linux ports of plutil are probably available here (Erica Sedun great site) here and here, but I dont know if they are current:

The author of the iphone-backup-decoder tool is named Pádraig. The original tool available is dated 2007.
An extended version with a GUI interface appears to be available on the site
which apparently is Pádraig website.

I did not test any of the these tools at the time.

I learned of the existance of  Pádraig's tool from a blog post by Sharninder:

Marco   ( @mgua )


Tuesday, February 22, 2011

Drowning in data

Drowning in Data

We are drowning in data,
But good poetry is still short.


If there were no clouds
boring would be always blue skies.

And sparkling jewels are there
in a whole life,
a few carefully chosen moments
to be framed
without polaroid,

Even to be lost
and yes, wasted
tears in the rain.


The shorter the story
the deeper the meaning.


Image by Dopludo Collective, St. Petersburg.

(text crossposted from ebmb)

Monday, January 10, 2011

Books are dying

I have been an avid reader: for many years.
Actually I grew up with books: reading, and dreaming.

Carl Spitzweg, the bookworm, 1850

Books were my friends: loyal, discrete, sincere, silent. They were with me on the train, at school, during many long summer afternoons, and in the deep night. (I remember reading frightening ghost stories while my parents were asleep).

Dear old books are gradually disappearing and passing by. They are shifted away by other forms of entertainment, gradually put aside by screens, and much more quickly consumed.

Books lives are now much shorter than in the past. Far too many books are available, and the content quality of the average book is quickly declining. Many people write books, but the same amount of worth books are written. Signal to noise ratio is going down.

Shop life of a book is now measured in weeks.

Inevitably, cheaper electrons will gradually substitute books.
Books will become a form of classic knowledge, with their inefficient cross-referencing, inability for full text searching, and their unacceptable lack of multimedia content.

Books will get old and dusty. They will be preserving their words for centuries, buried in libraries shelves.
Their pages will become yellow.
Their smell will change.

Some lucky old books will be scanned, and in some way shared to a broader potential amount of readers. Their paper will be digested into magnetic hard disk oxide, in huge datacenters under some mountain.

Books will evaporate, their bits dispersed in computing clouds.

Immaterial, electronic, aseptic, up-to-date, searchable, multimedia ebooks are growing.
Internet connected readers are reding internet connected books.
Book pages will share the screen with email, blogs, social networks, videogames.

E-tears will fall.

Books are dying, yes.
And old Readers are dying too.

The London Holland-House library after blitz german bombings. Picture taken on oct 1, 1940.

(My friend Fravia told me about this devastated library picture. Check this page of him about quality books, as described in a great lesson by prof. Fritjhof Sielaff)