Archive for Αυγούστου 2009|Monthly archive page

Νέα διεύθυνση

Αν και έχω αρκετό καιρό να κάνω update το blog μου έχω μία πολύ καλή δικαιολογία. Μετακομίζω!

Πρόσφατα πήρα ένα domain βασισμένο στο όνομα μου και αποφάσισα να μεταφέρω εκεί το blog με κάποιες αλλαγές. Το πιο σημαντικό είναι ότι πλέον θα γράφω μόνο στα αγγλικά όπως μου σύστησαν διάφορα άτομα για τους πιθανούς ξένους αναγνώστες. Περισσότερα στο πρώτο post. Η νέα διεύθυνση είναι:

http://fotis.loukos.me/blog

Αν με βάλατε στα bookmark σας μπορείτε να τα κάνετε update!

Δημιουργώντας ένα self referential tweet

Χθες είδα ένα tweet από τον Διομήδη Σπινέλλη σχετικά με έναν διαγωνισμό που άρχισε o Mark Reid, την δημιουργία ενός self referential tweet. Ως self referential tweet ορίζεται ένα tweet που περιέχει μέσα το link προς τον εαυτό του, δηλαδή ένα link της μορφής http://www.twitter.com/username/status/123456789 όπου 123456789 είναι το id του tweet. Σκέφτηκα ότι είναι ωραίος σαν διαγωνισμός οπότε αποφάσισα να κάνω και εγώ ένα δικό μου. Επειδή παρακάτω κάνω μία αναλυτική περιγραφή και έτσι και αυτό το post βγήκε αρκετά μεγάλο σε μέγεθος, όποιοι θέλουν μόνο να κάνουν download το πρόγραμμα μπορούν να πάνε στην σχετική σελίδα.

Αρχικά δημιούργησα ένα νέο account, το selfreftweet, για να μην πάρουν όλοι οι followers μου όλα τα δοκιμαστικά tweets, νομίζω ότι θα ενοχλούσε τους πάντες. Χρησιμοποιώντας το twitter api έκανα μερικά updates για να δω ποια είναι η μορφή των id. Ήμουν σχεδόν σίγουρος ότι παίρνουν σειριακά τιμές μιας και θυμάμαι από πιο παλιά το γνωστό integer overflow problem, κάτι σαν το doomsday του twitter, όπου θα γινόταν post το tweet με id 2^{31} - 1, δηλαδή με τον μεγαλύτερο αριθμό που μπορεί να αποθηκεύσει ένας unsigned 32bit integer. Εάν εσωτερικά το twitter αποθήκευε τα ids ως 32bit integers τότε στο επόμενο tweet θα είχαμε overflow και θα άρχιζαν τα ids ξανά από το 0! Έτσι έτρεξα μερικές φορές το:

curl -u user:password -d «status=Self Ref tweet» http://twitter.com/statuses/update.xml; curl -u user:password -d «status=Self Ref tweet» http://twitter.com/statuses/update.xml

Να σημειώσω ότι το έτρεξα σε αυτή τη μορφή ώστε η χρονική διάρκεια ανάμεσα στα δύο tweets να είναι όσο το δυνατόν περισσότερο σταθερή. Βλέποντας τις διαφορές ανάμεσα στα ids παρατήρησα ότι ήταν περίπου 200. Αλλά δεν ήταν σταθερό. Και μάλιστα μπορεί σε 3 συνεχόμενες φορές να ήταν περίπου 190 και στις επόμενες 3 210. Σκέφτηκα ότι ήταν καιρός να χρησιμοποιήσω κάποια γλώσσα προγραμματισμού για να πετύχω όσο το δυνατόν μεγαλύτερη ακρίβεια και διάλεξα την perl που την θέωρω την καλύτερη για αυτή τη δουλειά. Έγραψα ένα απλό πρόγραμμα που κάνει μερικά updates και μου δείχνει τις διαφορές και ξαναπαρατήρησα το ίδιο πράγμα. Αυτό που κατάλαβα είναι ότι υπάρχουν διαστήματα όπου στο twitter έρχονται πιο μαζικά tweets ενώ υπάρχουν άλλα που το arrival rate μειώνεται. Ίσως αυτό να οφείλεται και στο ίδιο το twitter, γενικώς έχω παρατηρήσει «περίεργες» συμπεριφορές, όπως αυτή που θα αναφέρω και παρακάτω.

Σκέφτηκα να βάλω μπρος τα μαθηματικά. Να χρησιμοποιήσω την διαφορά των ids από μερικά συνεχόμενα tweets και μετά με χρήση διακριτών παραγώγων να δω τον ρυθμό μεταβολής της. Έτσι θα έπρεπε να κάνω ένα tweet το οποίο θα είχε id ίσο με το id του προηγούμενου tweet προσθέτοντας την διαφορά των δύο προηγούμενων και τον ρυθμό μεταβολής. Αλλά πριν προχωρήσω στον υπολογισμό των διακριτών παραγώγων σκέφτηκα κάτι πολύ πιο απλό. Να στείλω μερικά tweets και να μετρήσω τις διαφορές των ids. Μετά να βγάλω έναν μέσο όρο και να χρησιμοποιήσω αυτό σαν σταθερή διαφορά.

Και αυτό έκανα στην πρώτη έκδοση του προγράμματος. Έστειλα 10 tweets και χρησιμοποιώντας την μέση διαφορά έστειλα ακόμη ένα. Στην συνέχεια το ρύθμισα ώστε στην περίπτωση που δεν πετύχει να παίρνει το id του νέου tweet και με βάση την προηγούμενη μέση διαφορά να στέλνει ακόμη ένα. Και αυτό το έκανε 10 φορές. Την πρώτη φορά που το δοκίμασα έπεσα έξω κατά 1! Αλλά αυτό που παρατήρησα είναι ότι η διαφορά στα τελευταία tweets πάντα μεγάλωνε. Ξαναέτρεξα μία φορά το πρόγραμμα και πέτυχα αυτό που περίμενα!

Βέβαια είχα και αρκετή τύχη. Γι’ αυτό θέλησα να μειώσω αυτές τις διαφορές. Το μόνο που έπρεπε να κάνω είναι κάθε φορά που δημιουργώ ένα νέο tweet αλλά δεν έχει το σωστό id, να το χρησιμοποιώ για να υπολογίσω την νέα μέση διαφορά αγνοώντας το id του πιο παλιού tweet. Έτσι θα είχα μια πιο αντιπροσωπευτική μέση διαφορά για εκείνη τη στιγμή. Σε αυτή τη δεύτερη έκδοση είχα πολύ καλύτερα αποτελέσματα.

Στο τέλος πρόσθεσα και ένα τμήμα κώδικα το οποίο διαγράφει τα δοκιμαστικά tweets. Και εδώ είναι το πρόβλημα του twitter api. Όπως αναφέρεται στην σχετική σελίδα:

Twitter currently applies limits to any person who reaches:

  • 1,000 total updates per day, on any and all devices (web, mobile web, phone, API, etc. )
  • 250 total direct messages per day, on any and all devices
  • 150 API requests per hour

Εγώ με τις δοκιμές μου δεν είχα φτάσει τα 1000 updates. Επίσης σχετικά με το API request limit η σελίδα αναφέρει:

Rate limiting only applies to methods that request information with the HTTP GET command. API methods that use HTTP POST to submit data to Twitter, such as statuses/update do not affect rate limits.

Άρα εγώ δεν έπρεπε να έχω πρόβλημα. Αλλά έστω και να είχα κάποιο πρόβλημα όπως αναφέρει η σελίδα του update:

This method is subject to update limits. A HTTP 403 will be returned if this limit as been hit.

Και το πρόβλημα που αντιμετώπισα εγώ ήταν το ακόλουθο. Ενώ έστελνα τα πρώτα test tweets, τα δεχόταν και μου έλεγε το οκ, αλλα συνεχώς επέστρεφε σαν νέο tweet το τελευταίο που είχα κάνει post. Και έτσι κατάφερα να διαγράψω ένα self referential tweet θεωρώντας ότι είναι ένα από τα test tweets! Thank you twitter!

Το τελικό πρόγραμμα βρίσκεται σε μία δικιά του σελίδα, κάτω από αυτή με τα προγράμματά μου. Μπορείτε να το κάνετε download από εκεί. Καλό είναι να μην κάνετε downloads όταν το τρέχετε ώστε να είναι σταθερός ο χρόνος που διαρκεί ένα update.

Όποιος καταφέρει και κάνει τα δικά του tweets ας αφήσει ένα comment με το πόσες φορές δοκίμασε, θα ήταν ενδιαφέρον!

Περιπέτειες στο linux με τον i-gotU GT-200 gps logger

Πρόσφατα αγόρασα το i-gotU GT-200. Πρόκειται για ένα bluetooth GPS travel logger. Αυτό το οποίο κάνει είναι να κρατάει ανά ορισμένα χρονικά διαστήματα τις γεωγραφικές συντεταγμένες και την ακριβή ώρα εκείνη τη στιγμή ώστε αργότερα να μπορεί ο χρήστης, μεταφέροντας τα δεδομένα στον υπολογιστή του, να αναπαράγει ακριβώς το ταξίδι του. Περισσότερες πληροφορίες μπορούν να βρεθούν στην σελίδα του προϊόντος.

Δυστυχώς από την εταιρία δεν παρέχεται κάποιος driver για το linux. Το μόνο που μπόρεσα να βρω είναι το πρόγραμμα igotu2gpx το οποίο μπορεί να μεταφέρει αποθηκευμένες διαδρομές από τη συσκευή στον υπολογιστή. Χρησιμοποιεί την libusb οπότε δεν χρειάζεται κάποιο kernel module. Και αυτό όμως δεν έχει όλη την λειτουργικότητα του @trip, του προγράμματος που παρέχεται από την ίδια την εταιρία. Αυτό που βρήκα ως καλύτερο συνδυασμό είναι το igotu2gpx για απλή μεταφορά δεδομένων και το @trip που έχω εγκατεστημένο σε ένα windows virtual machine. Χρησιμοποιώ την closed source edition του VirtualBox που παρέχει πλήρη υποστήριξη για usb και έτσι δεν υπάρχει κανένα πρόβλημα. Χρησιμοποιώντας λίγο usb sniffing είδα ότι δεν είναι και τόσο δύσκολη η επικοινωνία με το device οπότε μπορεί να γράψω και εγώ ένα πρόγραμμα. Θα μου ήταν πιο εύκολο να βοηθήσω στο development του igotu2gpx αλλά είναι γραμμένο σε C++ και χρησιμοποιεί qt, έναν συνδυασμό που ΔΕΝ τον αντέχω!

Κάτι άλλο που προσφέρει το gadgetάκι αυτό είναι live gps data είτε το συνδέσεις με usb είτε με bluetooth. Μετά από λίγο ψάξιμο βρήκα ότι υπάρχει driver για linux αλλά δυστυχώς αυτός δεν αναγνωρίζει αυτόματα το device. Ο driver είναι ο navman. Αφού τον φορτώσουμε χρησιμοποιώντας την εντολή:

# modprobe navman

πρέπει να τρέξουμε τo

# echo «0x0df7 0x0900» > /sys/bus/usb-serial/drivers/navman/new_id

Τα 0x0df7 και 0x0900 είναι το vendor και product id της συσκευής. Τα στοιχεία αυτά μπορείτε να τα δείτε τρέχοντας την εντολή lsusb. Πλέον ανοίγοντας το device /dev/ttyUSB0 (ή /dev/ttyUSB1 κλπ) θα πάρουμε gps data σε μορφή NMEA.

Για να συνδεθούμε μέσω bluetooth πρέπει πρώτα να βρούμε την διεύθυνση που χρησιμοποιεί. Αυτό γίνεται τρέχοντας την ακόλουθη εντολή

$ hcitool scan
Scanning …
00:18:8C:16:03:1F MAGPS GT-200

Η διεύθυνση είναι η 00:18:8C:16:03:1F την οποία πρέπει να κρατήσουμε.

Επόμενο βήμα είναι η σύνδεση και το pairing. Για να γίνει αυτό χρησιμοποιούμε τις ακόλουθες εντολές:

# hcitool cc 00:18:8C:16:03:1F
# hcitool auth 00:18:8C:16:03:1F

Στο σημείο αυτό αν έχει οριστεί ένας helper για την εισαγωγή του pin θα εμφανιστεί πιθανώς ένα παράθυρο όπου πρέπει να δώσουμε το νούμερο 0000. Αν χρησιμοποιούμε κάποιο άλλο σύστημα πάλι πρέπει να ορισθεί ως pin το 0000. Το τελευταίο βήμα είναι να συνδέσουμε ένα rfcomm device με το igotu. Αυτό γίνεται με την εντολή

# rfcomm bind 0 00:18:8C:16:03:1F 1

Από εδώ και πέρα το device /dev/rfcomm0 προσφέρει NMEA data.

Εδώ προτείνω το πρόγραμμα gpsbabel το οποίο μπορεί να διαβάζει τέτοια δεδομένα και να δίνει διάφορες πληροφορίες. Αν και όπως λέει χρησιμοποιείται για το conversion ανάμεσα σε διαφορετικά file formats, με την χρήση του option -T είναι δυνατό να παίρνουμε και realtime data.