Apr 19, 2008
Python’s list comprehension syntax is amazingly concise and easy to use and understand. It make Python even more beautiful than it already is.
However, i came upon some weird behavior today that caused a strange bug in my application.
The common way to use a list comprehension is with a variable named x eg:
my_new_list = [ x.name for x in people ]
The behavior most of us would expect (or assume to be reasonable) is for the scope of variable x to be limited within the execution of the list comprehension.
This is not the case however. If you already have defined an x variable and expect it to be the same after the list comprehension you will be disappointed (not to mention bewildered at your new, seemingly unexplained, bug ).
I am not sure why this feature it was designed that way. I think this is a source of confusion and, as such, un-pythonic, if i may use the term :-)
Be careful when using list comprehensions to use a completely new variable.
Click to read and post comments
Apr 07, 2008
Πριν μερικές ημέρες χρειάστηκα να τραβήξω μερικές φωτογραφίες με την Canon EOS 400D μου, χρησιμοποιώντας remote capture. Συγκεκριμένα ,ήθελα να φτιάξω ένα script που να τραβάω κάποια αντικείμενα φωτογραφία και να συσχετίζονται αυτόματα με την αντίστοιχη εγγραφή τους στη Database.
Ομως το gphoto2 δεν ήθελε με τίποτα να δουλέψει. Έβρισκε την μηχανή, τράβαγε φωτογραφίες, αλλα όταν ερχόταν η ώρα να την ‘κατεβάσει’ μου έριχνε ένα ωραίο segfault.
Είχα δοκιμάσει τα πάντα (εκτός απο ultrex) και δεν είχα δεί λύση. Είχα απογοητευτεί.
Εντελώς τυχαία , σήμερα έπεσα σε αυτό το blog post. Εκεί διαβάζω α) οτι θέλει να δίνω κάποιες εντολές σε μία γραμμή, και β) στα σχόλια έγραφαν οτι πριν φτιάχτηκε στο trunk πριν μόλις 2 ημέρες.
Αμέσως checkout απο το subversion, configure , compile ,install κλπ. και ως δια μαγείας, δουλεύει!
Για παράδειγμα αυτό δουλέυει:
gphoto2 --set-config capture=on -F 1 -I 1 --capture-image
Σκέφτομαι οτι θα ήταν ωραίο ένα GUI για αλλαγή των ρυθμίσεων και remote capture όπως το software της Canon. Ίσως αν έχω χρόνο αυτές της ημέρες (πράγμα πολύ απίθανο μέχρι μέσα Ιουνίου…)
Click to read and post comments
Apr 03, 2008
Reading the scarce documentation on Django’s signals there did not seem to be a way to detect on the post_save handler if the object is a new instance or an update of an existing instance.
Reading the source code, however, reveals that on django/db/base.py at the end of save() method of Model class, we see this snippet:
# Run any post-save hooks.
dispatcher.send(signal=signals.post_save, sender=self.__class__,
instance=self, created=(not record_exists), raw=raw)
So on your post_save hook all you have to do is accept an extra parameter called ‘created’ which will be True if the instance was just created or False if it is simply an update.
Although the documentation of Django is pretty good, and certainly much better than a lot of other Python web frameworks, its still far from complete.
I used to use Webware once upon a time, and the only documentation for the bloody thing was the source code.
Click to read and post comments
Mar 29, 2008
Μια μικρή ιστορική αναδρομή.
Κάποτε στον κόσμο των γραφικών τεχνών, υπήρχαν οι παλιοί μαστόροι. Για να μάθεις την δουλειά πήγαινες σε ένα μάστορα και δούλευες μαζί του τσάμπα για πολύ καιρό και έπρεπε να θεωρείς τον εαυτό σου πολύ τυχερό γιατι οι παλιοί μαστόροι δεν δείχνανε την δουλειά τους. Ακόμα και αν είχες στο μαγαζί σου ένα υπάλληλο δεν σου έδειχνε την δουλειά του. Υπήρχε ο φόβος οτι θα του κλέψουν την δουλειά. Ο τρόπος που έκανε κάτι ήταν μυστικός.
Σήμερα στην εποχή του internet και της υπερπληροφόρησης, η τεχνική ‘δεν σου λέω’ δέν μπορεί να εφαρμοστεί. Έτσι οι η σημερινή μετεξέλιξη των παλαιών μαστόρων, στην κόλπους των οποίων συμπεριλαμβάνονται οι web designers, έχουν άλλους τρόπους να προστατεύσουν τον κλάδο τους.
Οι web designers έχουν βρεί τον καλύτερο τρόπο. Την τεχνική ‘κάνω την δουλειά τόσο διεστραμμένη και πολύπλοκη που χρειάζεσαι χρόνια για να βγάλει άκρη’ . Όπως βλέπετε ακόμα και ο τίτλος της τεχνικής είναι μεγάλος, κάτι που υποδηλώνει την πολυπλοκότητα της εποχής. Αν και σαν ιδέα είναι τρομερή, το CSS έχει γίνει η μάυρη τέχνη που για να την μάθεις χρειάζεσαι να μπείς στην μυστική αδελφότητα του browser.
Γιατι μπορεί τα standard να είναι διαθέσιμα σε όλους, ο browser όμως ξέρει αν είσαι μέρος της αδελφότητας. Ξέρει οτι αν δεν είσαι ακόλουθος του Μεγάλου Φυλλομετρητή στον Κυβερνοχώρο, δεν πρέπει να σε υπακούσει. Όσο και να προσπαθείς, τα text files σου θα γράφονται στα ηλεκτρονικά ζεμπερέκια του αντί για τα ηλεκτρονικά buffers του.
Εντόπισα τον κώδικα στον firefox και είναι:
if (designer.isBrotherhoodMember() ){
processCSS();
}
else{
writeUserCSStoZemperikios(); // infidel!!
}
Οι browsers μάλιστα είναι προγραμματισμένοι να περιπαίζουν το θύμα τους. Μάλιστα στις πρώτες εκδόσεις του Netscape έπαιζε ένα αρχείο ήχου με το ‘Δεν περνάς κυρα Μαριά, δεν περναας δεν περνάς.’ Αλλα σε αργότερες εκδόσεις κατάλαβαν οτι είναι πολύ φανερό το παιχνίδι που παίζανε και έτσι το γύρισαν σε τυχαία συμπεριφορά. Πχ του λές clear:both αυτό πηγαίνει το element σου στο κατακόρυφο μέσω της σελίδας. Ετσι για να σου δείξει ποιός είναι το αφεντικό.
Η μύηση λοιπόν , στην προαναφερθείσα αδελφότητα του browser δεν είναι απλή υπόθεση. Όπως και πολλές άλλες occult οργανώσεις, έτσι και αυτή έχει τελετές βασανιστηρίων και εξάγνισης. Μπορεί να μην χρειάζεται να θυσιάσεις παρθένα (εξάλλου που να την βρεις πλέον, είναι και πρακτικό το θέμα), αλλα σίγουρα θα σε κάνουν να φωνάξεις:
-Δεν αντέχω άλλο! Αφήστε μα να ζήσω και θα φτιάχνω τις σελίδες μου σε μεγάλες πέτρινες πλάκες σαν το Μωυσή! Τέρμα πια η CSS!
Εγώ, ώς κάποιος που τόλμησε να περιδιαβεί τα χωράφια αυτής της πανίσχυρης οργάνωσης, που κάνει τους Illuminati χέζονται στο άκουσμά της, και τους Μασόνους να απορούν γιατί οι δικές τους τελετές δεν είναι τόσο φρικτές και γιατί δεν το σκέφτηκαν πρώτοι, έπαθα αυτό που μου αξίζει. Δείτε το προηγούμενο post για να καταλάβετε.
Συγνώμη μεγάλοι αφέντες της CSS και του Web Design. Είμαι πολύ μικρός ακόμα.
Ο ταπεινός υπηρέτης σας. [arcanum φέυγει σκυφτά με υποκλίσεις]
Click to read and post comments
Mar 26, 2008
Υπάρχει ένα branch του Django που λέγεται GeoDjango, και ειδικεύεται σε GIS. Εδώ και καιρό, απο τότε που έμαθα την ύπαρξή του, είχα ενθουσιαστεί με την ιδέα και ήθελά να ‘παίξω’ μαζί του. Επιτρέπει την ανάπτυξη web εφαρμογών με γεωγραφικό περιεχόμενο πολύ εύκολα (τουλάχιστον σε σχέση με άλλους τρόπους).
Ουσιαστικά πρόκειται για ένα νέο contrib που περιέχει νέα model fields, ένα νέο model Manager (GeoManager) και ένα πλήθος βοηθητικών εργαλείων. Τα νέα Fields ξέρουν πώς να χειρίζονται γεωγραφικά δεδομένα (points, polygonts κλπ) και ο GeoManager επεκτείνει το Django ORM (το Database api) με δυνατότητες σχετικές με τα νέα fields.
Για παράδειγμα μπορείς ζητήσεις τα αντικείμενα που έχουν ένα συγκεκριμένο Point (απο το model A) μέσα στην επιφάνεια που ορίζεται απο ένα σύνολο σημείων (απο το model B).
Μπορείς επίσεις να ζητήσεις τα αντικείμενα που έχουν μια συγκεκριμένη σχέση απόστασης απο ένα σημείο (πχ ποιά Βενζινάδικα είναι κάτω απο 5 χιλιόμετρα απο το σημείο που έχω επιλέξει στον χάρτη.) Και πολλά άλλα queries γεωγραφικού (και συνεπώς γεωμετρικού) περιεχομένου.
Μέχρι στιγμής δεν έχω προσέξει κάποια σοβαρή ασύμβατη απόκλιση απο το trunk και έχω την απορία αν είναι εφικτό (και θεμιτό) στο μέλλον να γίνει merge αυτό το branch με το trunk και απλά να υπάρχει σαν contrib. Θα ήταν καλή ιδέα γιατι χρειάζεται hackery για να τρέχεις και τα 2 ταυτόχρονα (μιας και παίρνουν το ίδιο όνομα στο site-packages).
Ακόμα δεν είναι πλήρες το branch, για παράδειγμα δεν έχουν newforms support κλπ. Επίσης σχεδιάζουν integration με google maps (και άλλα mapping services) ώστε το framework να κάνει generate το σωστό XHTML/javscript για το google maps. Πολύ ενδιαφέρον. (αν και σε non-trivial site η ποσότητα javascript είναι τέτοια που δεν βλέπω πόσο χρήσιμο μπορεί να είναι στην πράξη, αλλα αφού δεν έχω δεί τι πραγματικά σχεδιάζουν περιμένω να δώ για να έχω γνώμη.
Στα αρνητικά είναι οτι απαιτεί κάποια πακέτα (όπως το postgis αν χρησιμοποιείς postgresql) που δεν μπορείς να τα βάλεις έυκολα σε shared hosting (στο webfaction όμως , απο το οποίο μέχρι στιγμής είμαι αρκετά ευχαριστημένος, στο βάζουν αν το ζητήσεις!)
Έχω φτιάξει μια δοκιμαστική εφαρμογή και έχω διάφορες καλές ιδέες για νέα site. Ξεκινώ full ολοταχώς :p
Click to read and post comments
Mar 24, 2008
Πρόσφατα μου έστειλε ένας φίλος πρόσκληση για το hi5. Για να μην του χαλάσω το χατήρι γράφτηκα.
Πρώτα η απορία μου που υπάρχει στον μισό τίτλο. Τι είναι χειρότερο. Το facebook? το myspace ή το hi5? Προσωπικά πίστευα το myspace ήταν το χειρότερο με διαφορά, κρίνοντας και απο τα άτομα που το χρησιμοποιούν , και απο τα templates που βάζουν, τα οποία είναι τόσο οικτρά που μπορούν να σκοτώσουν ένα internet user σε 2 λεπτά. Ακόμα και αν γλιτώσεις, η έκθεση στις σελίδες αυτές θα προξενήσει ανεπανόρθωτες βλάβες στο τμήμα του εγκεφάλου που είναι υπέυθυνο για το browsing (brain web rendering engine?). Θα φοβάσαι να πληκτρολογήσεις www. Θα έχεις εφιάλτες με java applets που παίζουν emo μουσική απο το πουθενά. Θα ξυπνάς φωνάζοντας με πόνους στα μάτια απο τους σατανικά εμετικούς χρωματισμούς στο myspace. Μερικές φορές νομίζω οτι το myspace είναι ένα τεράστιας έκτασης ψυχολογικό πείραμα Αμερικανικού πανεπιστημίου με θέμα τις επιπώσεις του κακού γούστου πάνω στην σωματική υγεία. Για αυτό play it safe. use a condom ^H^H^H^H^H resolve myspace to 127.0.0.1 in hosts.conf.
Στα υπέρ του myspace είναι οτι δεν είναι υποχρεωτικό να το βλέπεις, όπως για παράδειγμα ο γείτονάς σου ή ένα σχολικό βιβλίο. Μεγάλο υπέρ
Όμως τώρα που είδα και το hi5 ομολογώ οτι είναι πολύ κοντά στο myspace. Ίσως είναι ανταγωνιστικό πείραμα γειτονικού πανεπιστημίου που ανταγωνίζονται σε κονδύλια και πάνε να τους φάνε την δόξα.
Το facebook απο την άλλη, δεν επιτρέπει τέτοια χάλια. Έχει όμως άπειρα applets. Είχα κάποτε μια τύπισα στην friends list μου που πρέπει να είχε βάλεί όλα τα applets διαθέσιμα στο facebook. Πήγαινε στην σελίδα της μόνο και μόνο για να δώ τι είναι πιό μεγαλύτερο, ο ρυθμός δημιουργίας νέων applets απο την κοινότητα, ή η ταχύτητα προσθήκης τους στο προφίλ. Για να φορτώσει η σελίδα της ήθελε τόσο χρόνο που σκέφτηκα οτι θα ήταν καλή ιδέα να την κάνουν διαθέσιμη μέσω torrent. Αρχικά είχα απορία πώς προλαβαίνει να κάνει αυτή την δουλειά όλη μέρα, αλλα μετά πρόσεξα οτι είναι παντρεμένη με παιδιά , οπότε φαντάζομαι έχει βάλει τα παιδιά να προσθέτουν applets και δεν τα ταΐζει αν δεν πιάσουν τα quota τους για την ημέρα. - Όχι Μιχαλάκη, δεν μπορείς να πας να παίξεις, δεν πρόσθεσες το vampires vs Jedi vs Manowar vs Barak Obama application.
Το μόνο που μου αρέσει με αυτά τα site είναι οτι βρίσκω φίλους και γνωστούς που είχα να τους δώ χρόνια. Αυτό είναι το πιό ενδιαφέρον κομμάτι των social networking sites για μένα. Αφού βρώ τους φίλους μου και τους ‘καταγράψω’ (δηλαδή τους βάλω στην friend list) δεν έχει κανένα άλλο ενδιαφέρον το site. Δεν με ενδιαφέρουν τα applets, και όλες οι βλακείες. Σύντομα τα βαρέθηκα (και στην περίπτωση του facebook εκνευρίστηκα και με τους όρους χρήσης τους και απενεργοποίησα το account μου).
Μιάς και το μόνο που με ενδιαφέρει απο αυτά τα site είναι η έυρεση φίλων Θα μου άρεσε το εξής. Μια υπηρεσία που να βάζω την contact list μου απο το gmail/yahoo/whatever , να βλέπει να email και να μου δίνει URL με τα blog/profiles του καθενός. Και καλύτερη και γενικότερη υποστήριξη για τεχνολογίες όπως XFN κλπ. Τα social networking sites θα γίνουν obsolete απο το social networking web.
Click to read and post comments
Mar 17, 2008
Έτρεξα το kitchensync για συγχρονισμό του kaddressbook με το κινητό μου. Αμέσως μετά όταν ξεκινούσα εφαρμογές χρησιμοποιούσαν το kaddressbook ήθελαν εκατοντάδες megabytes RAM στο startup τους σε βαθμο το PC μου με 2GB RAM να σέρνεται.
Μετά απο αρκετή ώρα αναζήτησης (δεν ήξερα οτι είναι το kaddressbook αρχικά) ανακάλυψα οτι το ~/.kde/share/apps/kabc είναι περίπου 800MB. (με 99 επαφές μονο).
Έκανα export σε CSV το addressbook , μετονομασία του kabc σε kabc_old και improt απο το CSV. problem solved. Όμως είναι ένα bug που ένας όχι τόσο σχετικός χρήστης δεν θα το έβρισκε ποτέ.
Click to read and post comments
Feb 26, 2008
I’ve used comparator functions while sorting in python quite often. I had a complex object today that i had to sort on using non-standard comparator functions.
My object was a dictionary that contained a list of 2 dictionaries that in turn containd lists of objects. I wanted to sort the first dictinary based on the len() of the objects of the lists at the other end of the hierarchy.
using a cmp function i had to do something like:
def comparator(x,y):
#4 lines do stuff to get the len() of data inside x
#4 lines do stuff to get the len() of data inside y
if len_x > len_y:
return 1
elif len_x == len_y:
return 0
else:
return -1
However i came upon the sorting howto on wiki.python.org and a way to do sorting that i did not know. Using the key funciton.
Instead of sorted(iterable,cmp=my_cmp_func) you can do sorted(iterable,key=my_key_func).
my_key_func is called with each element of the iterable as argument. It must returns a value that is used in sorting (I assume using standard cmp).
This meant that instead of my cmp function i could do only:
def my_key_func(x):
#4 lines do stuff to get the len() of data inside x
return len_x
It makes more sense because basically we are not sorting x and y based on their own value, but we are sorting x and y based on some remote data connected to x and y.
Certainly nicer.
Click to read and post comments
Feb 26, 2008
Recently i have been developing a few small web sites. Some of them are only hobby projects. Naturally i looked for a good domain name for them.
My search for good domain names indicated that most are already taken. Not very surprising as such, ofcourse ,but when i look up a domain name and it turns up unavailable i have the strange impulse to see what its being used for. Well, as it turns out for 80% (number out of my ass) of the domain names i look for they were not being used. Some of them have been registered as far as seven years ago and are still “comming soon”. Others resolve to nothing.
So, we have a strange phenomenon here. While the greek web space is very small, the domain name address space is running out for no useful reason. That bothers me. I don’t mind it so much if i can’t find a good domain name because it’s being used. But so many domain names being unavailable and completely useless for many years is really infuriating.
This reminded me reading a few years back in EETT’s policies (the Greek national body regulating domain names), that a domain name that was unsused for more than 2 (or 3?) years would be expire. Maybe i should turn evil mode on and send a little email to EETT :p
Click to read and post comments
Feb 21, 2008
For a friend’s project, i investigated various ways to generate a site thumbnail.
The obvious one is to simply go to the desired website using your favorite browser, take a snapshot using your favorite program. Guaranteed to work :).
For obvious reasons that never became a real option so my googling revealed various services that do this. Some do it for free but in a limited manner , other are pay services but i was not satisfied with their options (or having to pay). The most famous of them is probably Alexa Site Thumbnails (AST) that is an Amazon web service. I didn’t like it either, especially since according to their terms you can’t store the image , but are only allowed to cache it up to 24 hours. Not good enough for me. (It’s dirt cheap though).
After a little more searching i found out about the fantastic khtml2png utility. What this does is use khtml libs (from kde3.x) to render a site into a png (and a lot of other image types).
The catch is that it requires an X server, but on their project page they have instructions to run it on a headless machine using Xvfb (an X server running on a virtual frame buffer).
It’s really easy:
On my machine i did:
Xvfb :1 -screen 0 1600x1200x24&
export DISPLAY="localhost:1.0"
khtml2png2 --width 1280 --height 1024 http://slashdot.org slashdot.png
And that’s it! I can now turn a headless Pentium III i have running various services (mail etc) to my own private , highly configurable web snapshot service.
Click to read and post comments