Archive for the ‘twitter’ Category

Δημιουργώντας ένα 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 με το πόσες φορές δοκίμασε, θα ήταν ενδιαφέρον!

Ο αριθμός ‘Swine Flu Number’

You can find an english version below.

Μελετώντας λίγο τα social networks μπορεί κάποιος να δει καταπληκτικές ιδιότητες. Πολλά βιβλία έχουν γραφτεί που περιγράφουν το φαινόμενο small world και δίκτυα που βασίζονται πάνω σε αυτό. Ως εισαγωγή έχω να προτείνω το Linked: The New Science of Networks από τους Albert-Laszlo Barabasi και Jennifer Frangos.

Σύμφωνα με το γνωστό six degrees of separation που βασίζεται πάνω σ’ αυτή τη θεωρία καθένας από μας βρίσκεται έξι βήματα μακριά από οποιοδήποτε άλλο άτομο στον κόσμο. Τι εννοούμε με αυτό; Κάθε γνωστός μας απέχει ένα βήμα από εμάς. Κάθε γνωστός ενός γνωστού μας απέχει δύο βήματα από εμάς. Με τον ίδιο τρόπο πηγαίνοντας έξι βήματα μακριά μπορούμε να βρούμε οποιοδήποτε άτομο σε όλο τον κόσμο!

Χρησιμοποιώντας αυτή την παρατήρηση άρχισαν να δημιουργούνται διάφοροι αριθμοί που χαρακτηρίζουν τον καθένα σε μία κατηγορία ατόμων. Στους μαθηματικούς υπάρχει ο αριθμός Erdős. Ο αριθμός αυτός χαρακτηρίζει τα ενδιάμεσα βήματα μεταξύ ενός μαθηματικού και του μεγάλου μαθηματικού Erdős ορίζοντας ως βήμα την συγγραφή ενός paper από κοινού από δύο άτομα. Στους ηθοποιούς υπάρχει ο αριθμός Bacon που είναι τα βήματα ανάμεσα στον ηθοποιό Kevin Bacon και έναν άλλο ηθοποιό. Αυτή τη φορά δύο άτομα έχουν απόσταση ίση με ένα αν έχουν συμπρωταγωνιστήσει σε μία ταινία.

Με βάση αυτούς τους αριθμούς και με μία έμπνευση μιας φίλης σκέφτηκα τον αριθμό Swine Flu. Ο αριθμός αυτός μετράει τα βήματα που έχει κάποιος από ένα άτομο που έχει κολήσει την γρίπη των χοίρων (γνωστή και ως swine flu). Για παράδειγμα εγώ έχω μία φίλη η οποία έχει κολλήσει, άρα έχω swine flu number ίσο με ένα. Η φίλη μου αυτή έχει αριθμό ίσο με μηδέν μιας και έχει η ίδια την γρίπη! Από την άλλη ένας άλλος φίλος μου ο οποίος δεν ξέρει κανένα άτομο που έχει κολλήσει έχει swine flu number ισο με δύο.

Βέβαια είναι δύσκολο να μετρήσει κάποιος αυτόν τον αριθμό. Το μόνο σίγουρο είναι κάποιος να ξέρει ότι έχει αριθμό ένα, όπως εγώ, και να ενημερώσει όλους τους φίλους του ότι αν δεν έχουν κάποιο γνωστό με swine flu τότε αυτοί έχουν αριθμό δύο. Με την σειρά τους πρέπει να ενημερώσουν όλους τους φίλους τους ότι αν δεν έχουν κάποιο γνωστό που να έχει swine flu ή να έχει αριθμό ένα, τότε αυτοί έχουν τρία. Μιας και η γρίπη έχει αρχίσει να εξαπλώνεται ο αριθμός αυτός θα αλλάζει δυναμικά και θα κάνει ακόμη πιο δύσκολο τον υπολογισμό του.

Ο πιο εύκολος τρόπος εύρεσης του αριθμού που σκέφτηκα είναι το twitter. Έτσι έγραψα ένα πρόγραμμα που μετράει αυτόν τον αριθμό. Το μόνο που χρειάζεται είναι να γράψει κάποιος ένα tweet της μορφής:

Το swine flu number μου είναι 1 #swineflunumber

ή

My #swineflunumber is 1

Το μόνο που χρειάζεται είναι να γράψετε μέσα στο tweet το tag ‘#swineflunumber’ και τον αριθμό σας. ΠΡΟΣΟΧΗ: καλό θα είναι να μην έχετε κάποιον άλλο αριθμό μέσα στο κείμενο! Αν υπάρχουν και άλλοι αριθμοί το πρόγραμμα διαλέγει αυτόματα αυτόν που βρίσκεται πιο κοντά στο tag. Επίσης λόγω ενός προβλήματος του twitter search api πολλές φορές στο search δεν εμφανίζονται διάφορα tweets οπότε αν μπορείτε να στείλετε δύο φορές το tweet σας θα βοηθούσε. Μην ανησυχείτε, το πρόγραμμα είναι έτσι σχεδιασμένο ώστε να μην παίρνει υπόψιν του πολλαπλά ίδια entries.

Αφού μαζέψω έναν ικανοποιητικό αριθμό από swine flu numbers θα τα δημοσιεύσω εδώ. Όσοι μπορείτε ενημερώστε τους γνωστούς σας! Σε περίπτωση που αλλάξει ο αριθμός σας μην ξεχάσετε να γράψετε τον νέο! Έτσι θα μπορέσω να βγάλω και στοιχεία για το πως αλλάζουν δυναμικά οι αριθμοί αυτοί και κατά συνέπεια πως μεταδίδεται η ασθένεια!

ΠΡΟΣΘΗΚΗ: Λόγω των προβλημάτων στο twitter search api και για να μην χάνονται τα tweets σας έχω κάνει έναν νέο user, τον swineflunumber. Πλέον μπορείτε να κάνετε και ένα απλό mention, δηλαδή να χρησιμοποιείτε tweets της μορφής:

Το swine flu number μου είναι 1 @swineflunumber

Με τον τρόπο αυτό δεν θα χαθεί κανένα tweet!

Παρακάτω παραθέτω ένα μικρό κείμενο για τους πιθανούς ξένους αναγνώστες.


The swine flu number is based on the small world phenomenon. It has the same concept as the Bacon or the Erdős number. It counts the links between a person and another person who is infected by the swine flu (H1N1 virus). Your swine flu number is the smallest swine flu number of all your friends plus one. For example I know a person who is infected so my swine flu number equals one. If I have a friend who doesn’t know anyone infected then his swine flu number equals two.

In order to count this I have used twitter. I created a simple program which extracts the information from all tweets having the tag ‘#swineflunumber’. So if your tweet is ‘My #swineflunumber is 2’ then this will be identified and stored in a database. WARNING: Don’t put another number in the tweet, just your swine flu number and remember to use digits (‘2’ and not ‘two’)! Since the twitter search api has some problems you may need to tweet your number twice. Don’t worry, the program is designed to ignore duplicate entries!

Since this number isn’t constant (more people get infected every day), please tweet your new number every time it changes!

EDIT: Since some tweets are lost due to the twitter search api problem I created a new user, swineflunumber. Now you can use a simple mention and your tweets won’t be lost, e.g.  ‘My swine flu number is 2 @swineflunumber’