Wednesday, 13 February 2013

[Python] Monitor directory in linux

Description
I was looking for  something that could tell me when a file has been modified into a specific directory, I found that with Python and Linux, you can use the system call FCNTL.

Solution
The system call FCNTL helps you to monitor a directory and call a personalized function when it is happening.
Below you can find an example that I found on Stack Overflow.


Tuesday, 12 February 2013

[JS] Prevent selection when drag

Description
I had a case where I was dragging an object in my canvas and when the mouse was going outside of it, the whole website was selected by my cursor.

Solution
I found this fix that resolve my problem:


Friday, 11 January 2013

[JS] Webcam in HTML5



Webcam in HTML5



Introduction
HTML5 has introduced a few months ago this opportunity to access your personal webcam from a webpage, in that way you can avoid to use any flash plugin to grab a snapshot.
You might asking about compatibility with browsers and this is a bad point for this technology because IE still a step behind from other browsers, you can check to this website.

HTML part
You need to add two tags on your page that are the follow:








JS part
The follow part of code is made that will work cross-broswer:




The next part is to get a snapshot when you press on the video object, that is the follow part:



Testing
Now your are ready to try to grab your first snapshot from your webcam, just put everything together and you should see yourself.



Monday, 3 December 2012

[Supervisor] How to Monitor your program

Description
Supervisor is a great program that takes care about the healthy of your application.
The main feature is to monitor your application and then if something happens e.g. crash, it will restart the program.
There is a web interface where you can check the healthy of your programs and check uptime and logs, also you can stop/restart the process.

Installing

The follow command is to install supervisor on your Ubuntu/Debian machine:

sudo apt-get install supervisor

Configuration
The configuration file is located on your etc folder, I found it into /etc/supervisor/supervisor.conf on my Ubuntu.

You can easier add your applications to the file, just following the guide at this link, but I can give you some advice to configure it.
Each application that you want to monitor have to start with this header:
[program:name_your_application]

Add your path where the application is:
command=/bin/cat

and the process name

process_name=%(program_name)s


after that you are ready to restart your supervisor and it should start the process, just check it with "ps aux".
If everything is fine, continue to add more features, otherwise go back and check what is wrong.

These are helpful settings that you should have on your process that makes it alive even if it crashes
autostart=true
autorestart=true
startsecs=10 
startretries=3 

Also add some settings to save all logs from your application:
stdout_logfile=/a/path
stderr_logfile=/a/path

After that, restart your supervisor and everything should be fine.

Enable Web Interface
Usually the web interface is not enabled by default but you can do it , just adding these 3 lines on your configuration file

[inet_http_server]
port = 127.0.0.1:9001
username = user
password = 123

Wednesday, 7 November 2012

[Python] HUAWEI E3131 library

Description
The modem Huawei E3131 is used to connect any pc or laptop to internet through a 3G network, you can also think about it and create a program that  needs a 3G connection.
This model is very useful because you don't need to install any drivers and it works strength away on each operate system, due the clever idea to show this device as a normal Ethernet card.
I used this great product on my Raspberry project and I can say that I am very happy with it!


API
I found a website that talks about how to use the API with the modem Huawei and which commands you can send.
Check this out to understand what can you do with this little device, on the website is not described all functions but just the basic one.
You can even looking for a specific action when you are browsing the web interface of the modem, it's very simple and clear! Just go to http://192.168.1.1 when the dongle is attached on your computer.

Library
I had to create a library to use this dongle with my project, you may not like Python but you can even port my helper class to any other languages!
Just remember that each call have to be sent as XML content

Link of the library


How to use it
The library is very easy to use, just import it on your own project and then create the object:
a  = Huawei()
after that you can easily check if your dongle is already connected, just calling:
a.is_connected()

Issues
Please send me an email if you are going to find any issue with this library or if you want to add some other things.

Implementation with Raspberry 

Friday, 12 October 2012

[NodeJS] Write bytes to a file

Description
The idea is to get a buffer of bytes from a socket or a file, and then convert them into a file, you can thinking about to transfer an image through a socket, that is my case.

Buffer library
NodeJS has a library buffer that takes care to convert decimal to hex, and then you can use it to write into a file. In my case, I have to convert decimal to hex but you can even populate the buffer with only hex values.

This is a piece of code to write into a file:

var Buffer = require('buffer').Buffer;
var fs = require('fs');


var myBuffer= new Buffer(3);
myBuffer[0] = 71;
myBuffer[1] = 73;
myBuffer[2] = 70;

console.log(test);


fs.writeFile("test.txt", test, function(err) {
    if(err) {
        console.log(err);
    } else {
        console.log("The file was saved!");
    }
});

Your output should be something like that:

<Buffer 47 49 46>

means that your values has been converted into bytes, from decimal to hex, you can check it with a Calculator.
Also you should get the message "The file was saved!" and then if you check what there is inside, you have to read "GIF".

That is all you need to convert your buffer of bytes into a file, image, text, etc...

Wednesday, 12 September 2012

Arduino: Establish a socket between 3G and NodeJS

Introduction
This article is about the modem GPRS with Arduino and NodeJS, everything connected with a socket.
I am going to show how can you create your little client on Arduino that is connected with a NodeJS server.

Create Arduino client
Arduino has a great GPRS Shield that is a little bit expensive but I found it very powerful, although a few months ago Cooking Hacks has released an awesome GPRS Shield with a Camera, SD, etc..

The shield communicate via Serial port and you have to use AT Commands to setup a internet connection, no worries I have done all the hardest job for you and these are commands:

//Basic setup
AT+CFUN=1
AT+CMGF=1
AT+CREG=1
AT+COPS=0
//Remove comment if you have SIM CARD Pin
//AT+CPIN=xxxx

//Setup APN T-mobile UK
AT+CGDCONT=1,"IP","general.t-mobile.uk"
AT+CGACT=1,1

//Get GPRS status, when is 1 means you have internet connection
AT+CGATT?

//Connect to your server on the port 66
AT+SDATACONF=1,"TCP","IP",66
//Start connection
AT+SDATASTART=1,1

//Read message from socket
AT+SDATATREAD=1

//Send message to socket
AT+SSTRSEND=1,"test"

I have made a simple script that is not stable 100% but you can try it and connect to your server.

Download script

Please note that after you have started the socket, the modem is taking a few seconds to establish a connection.

Create NodeJS server
The server is a simple script that is receiving only information through a socket, you can also send information but that is up to you.
My example is only to check that everything is working and you can make a communication even if you don't have a Ethernet cable or a wifi connection.


var net = require('net');
var netServer = net.createServer(function (stream) {
        stream.setTimeout(0);
        stream.setEncoding("utf8");
        //Arduino is connected
 stream.addListener("connect", function () {
  console.log("Arduino connected");
        });
 //Arduino has sent an information
        stream.addListener("data", function (data) {
  console.log("Get data: "+data);         
 });
 //Arduino has terminated connection
        stream.addListener("end", function() {
  console.log("Arduino disconnected");
                stream.end();
        });
});
netServer.listen(66);

Result
  1. Upload and run the client
  2. Wait from the green signal by serial port
  3. Check on your server that Arduino is connected and sending messages