Reading logs with a Named Pipe

November 22, 2012 Leave a comment

Recently I had to write a piece of code that constantly would read a log file and if something wrong had happened a specific action should be taken.
For this reason I wrote this piece of code in Lua using Named Pipes.
If you are not familiar with Named Pipes check them out (from Wikepedia: A named pipe is system-persistent and exists beyond the life of the process and must be deleted once it is no longer being used.).

LOG_FILE = "/path/to/the/log/file"
LOG_PIPE = "/path/to/the/log_pipe"
LOG_STR  = "A word/phrase that we are searching for on the logs"

--- Create the logs pipe
function create_log_pipe()
    print("Creating the Logs' pipe...")

    local cmd_status = os.execute("rm -f " .. LOG_PIPE .. ";" ..
        "mkfifo " .. LOG_PIPE .. ";" ..
        "tail -n1 -f " .. LOG_FILE .." > " ..LOG_PIPE .. "&")

    if cmd_status == nil then
        print("[Error] Couldn't create the Logs' Pipe")
        exit
    else
        print("Logs' pipe was created")
    end
end

--- Open the logs' pipe
-- @return the logs' pipe descriptor
function open_log_pipe()
    print("Opening the Logs' pipe...")

    local logfd, _, _ = io.open(LOG_PIPE, "r")

    if not logfd then
        print("[Error] Couldn't open the Logs' pipe.")
        exit
    else
        print("Logs' pipe has opened successfully.")
    end

    return logfd
end

create_log_pipe()
log_pipe = open_log_pipe()

for line in log_pipe:lines() do
    repeat
        if string.find(line, LOG_STR) ~= nil then
            -- do something
        end
    until true
end

Credits on this thread.

Categories: Lua, Programming Tags: ,

Two 16bit integers that represent one 32bit float

April 24, 2012 3 comments

Recently I came across the following problem…

There was a function that could read from some device’s registers and return their values as uint16_t. The problem was that each two 16bit registers in sequence (reg[0] and reg[1], reg[2] and reg[3], etc) were storing a 32bit float number (in little endian).

The first thing that came into my mind was to concatenate the data

integer_32 = ((integer_16_2 & 0xFFFF) << 16) | (integer_16_1 & 0xFFFF)

and produce a 32bit integer. Then this 32bit integer would be casted to a float.

Nevertheless, this is not correct because the bits of the registers were representing a float and not an integer. So if we produced lets say the integer_32 “3” the float that would be generated would be “3.0” and not the float that is represented by the binary “11”.

The solution to this problem was the following:

#include <string.h>

/**
 * Reform two 16bit unsigned integers that store one 32bit
 * signed float (little endian).
 * @param u1 the first 16bit unsigned
 * @param u2 the second 16bit unsigned
 * return the 32bit float
 */
float reform_uint16_2_float32(uint16_t u1, uint16_t u2)
{
    long int num = ((u2 & 0xFFFF) << 16) | (u1 & 0xFFFF);
    float numf;
    memcpy(&numf, &num, 4);
    return numf;
}
Categories: Programming Tags:

Why do we need cars if we have bicycles?

February 4, 2012 Leave a comment

I don’t know if this story is true, but someone (person, blog, … I don’t remember who) had told me that when the first car was build the other people said that it is useless since there are bicycles. They would never need a car since the most places that they had to transport themselves to, were near enough to buy such an expensive machine.

The same with personal computers, cable phones, mobile phones, internet, open source, electronic money, e-commerce, wikipedia, blogs, online social networks, online activism etc.

I remember to tell when Mercedes had released the first self-parking car, that this is too expensive for such a simple task. But now we have self-driving cars from Google. This is the way research works.

So when you see a product like a washing machine that connects itself on the Internet, don’t tell that this is useless. Just picture a better future. The future of the Internet of Things. Yes it is here and I know that because I am working on that!

Categories: Internet Of Things Tags:

Static IP on OpenWrt

January 23, 2012 Leave a comment

If you want your router to assign a static IP on a specific OpenWrt Machice you just have to run something like the following:

uci set network.lan.proto=static
uci set network.lan.ipaddr=192.168.1.130
uci set network.lan.netmask=255.255.255.0
uci set network.lan.gateway=192.168.1.1
uci set network.lan.dns=8.8.8.8

/etc/init.d/network restart

Also you can edit accordingly the /etc/config/network file.

Categories: OpenWrt, Tutorials

Backup your Gmail account with getmail

December 29, 2011 1 comment

For almost a year now I am using Gmail as a client to access all my mail accounts. In this article I am going to describe how to make backups of you Gmail account with getmail. Getmail is a simple, yet powerful console tool that downloads your mails and of course it is written in Python. Also because it makes a backup of the mails in an mbox-formatted file, you can access them with many mail clients (like Thunderbird) that support this format.

After installing it (for Debian: “sudo apt-get install getmail4”) you just have to create a file named “~/.getmail/getmail.gmail” that will contain the followings:

[retriever]
type = SimplePOP3SSLRetriever
server = pop.gmail.com
username = yourname@gmail.com
password = yourpassword
[destination]
type = Mboxrd
path = ~/gmail-archive/gmail-backup.mbox
[options]
verbose = 2
message_log = ~/.getmail/gmail.log

Here you can find some other examples on how to write the above configuration file.

Also you have to create the empty mbox file, “~/gmail-archive/gmail-backup.mbox”, that will contain your backed-up mails.

Then, go to the Gmail’s settings and select from the “Forwarding and POP/IMAP” tab, “Enable POP for all mail (even mail that’s already been downloaded)”. Also make sure to select for the “When messages are accessed with POP”, “keep Gmail’s copy in the inbox”.

Now you are ready to backup your Gmail account.
In order to do that, run the following command in the terminal:

getmail -r ~/.getmail/getmail.gmail

You should see a long string of messages begin printing out as getmail starts grabbing the contents of your Gmail account.
Because Google has some limits on how many messages can be retrieved at one time you will have to run the command several times to retrieve all the mails.
Or just run something like the following:

#!/bin/bash
# run the getmail command 1000 times
for i in `seq 1 1000`;
do
    getmail -r ~/.getmail/getmail.gmail
done

It would be useful to auto-backup your mails periodically. Personally, I made a cronjob that checks for new mails hourly.
To do so, run:

crontab -e

And at the end of the document, add the following line:

@hourly /usr/bin/getmail -r path-to-your-home-folder/.getmail/getmail.gmail

See also:
Why getmail and not fetchmail?
Gmail silently destroys mail

Credits to:
http://howto.wired.com/wiki/Make_a_Local_Backup_Of_Your_Gmail_Account

Categories: Linux

Μερικές λέξεις αραδιασμένες για φίλους

December 7, 2011 Leave a comment

Ευτυχώς κανένας άνθρωπος σαν μονάδα δεν προσεγγίζει την κοινωνική νόρμα. Όλοι μαζί αποτελούμε ένα σύνολο που λόγω της διαφορετικότητας, από τα διαφορετικά βιώματα μας, μπορούμε και αλληλεπιδρούμε άλλες φορές με τρόπο δημιουργικό και άλλες με τρόπο καταστροφικό, και παράγουμε αυτό στο οποίο ζούμε σήμερα. Πολλοί θα πουν ότι η εξέλιξη είναι κάτι κακό και ότι όσο περνάνε τα χρόνια ο άνθρωπος γίνεται όλο και πιο “απάνθρωπος”. Κάτι τέτοιο είναι πέρα για πέρα λάθος. Αν κοιτάξετε στο παρελθόν βλέπεται ανθρώπους που περνάγανε πιο ευχάριστα την ζωή τους και πιο απλά. Εμείς ζούμε στον περίπλοκο κόσμο του σήμερα. Όχι. Κάθε άνθρωπος που ζει στην εποχή του την βλέπει εξίσου περίπλοκη και απάνθρωπη σε σχέση με την προηγούμενη. Αυτό όμως δεν ισχύει. Παλιότερα οι άνθρωποι ζούσανε με ανοιχτά τα σπίτια και χωρίς πέντε εκατομμύρια συστήματα ασφαλείας. Από την άλλη όμως είχαν να ανησυχούν καθημερινά για χειρότερα προβλήματα όπως η πείνα και η αρρώστια. Read more…

Categories: Generalities

Ποδηλατώντας συνδεδεμένος σε έξι ασύρματα δίκτυα

October 25, 2011 Leave a comment

Πριν μέρες είχα βγει για μία βόλτα με το ποδήλατο. Παλιότερα, για όσους δε με ξέρουν, ασχολούμουν με την ποδηλασία δρόμου. Αποτέλεσμα αυτόυ είναι να έχω γενικά ότι πάνω κάτω χρειάζεται ένας σχετικός αθλητής.

Καθώς λοιπόν ποδηλατούσα συνειδητοποίησα ότι είμαι συνδεδεμένος σε έξι διαφορετικά ασύρματα δίκτυα, όσο παράξενο και τρομακτικό και να ακούγεται!

Καταρχάς το κοντέρ του ποδηλάτου μου είναι ασύρματο. Συγκεκριμένα ο sensorας που τοποθετείτε στη ρόδα για να πάρει μετρήσεις σχετικά με την ταχύτητα του ποδηλάτου συνδέεται ασύρματα με το κοντέρ (πρώτο δίκτυο). Επίσης ο sensorας που μετράει τις στροφές του πεταλιού (ναι σε αγωνιστικό επίπεδο κάτι τέτοιο είναι αρκετά χρήσιμο) συνδέεται και αυτός ασύρματα με το ίδιο κοντέρ (δεύτερο δίκτυο).

Επίσης τύχαινε εκείνη τη μέρα να φοράω και έναν παλμογράφο (τρίτο δίκτυο). Για όσους δε ξέρουν πως λειτουργεί ένας παλμογράφος πρόκειται για μία ζώνη που τοποθετείτε στο στήθος και επικοινωνεί ασύρματα με ένα ρολόι ενημερώνοντας το κατάλληλα για τους παλμούς μας.

Ωραία ως εδώ θα μου πείτε… τα άλλα τρία που είναι; Μα στο κινητό φυσικά.
Το κινητό που κουβαλούσα εκείνη την ώρα ήταν συνδεδεμένο στο επίγειο δίκτυο (τέταρτο δίκτυο) που υπάρχει για την τηλεφωνία. Επίσης είχα ανοιχτό και το WiFi (πέμπτο δίκτυο) με αποτέλεσμα αυτό καθ όλη την διάρκεια της προπόνησης να scanάρει όλα τα υπάρχοντα δίκτυα και να συλλέγει πληροφορίες για αυτά όπως τα SSID των διαφόρων router. Τέλος επειδή ήθελα να δοκιμάσω και την εφαρμογή RunKeeper είχα ανοιχτό και το GPS (έκτο δίκτυο) του κινητού μου ώστε να χαρτογραφείτε η διαδρομή που κάνω και να συλλέγω διάφορες χρήσιμες (μπα δε νομίζω) πληροφορίες.

Αρκετά τρομακτικό έτσι;

Categories: Generalities