Dec 28, 2009
Yes, this is an X-Sucks post.
Around May 2009, i bought a Fujitsu-Siemens Amilo Mini UI-3520. This is a small netbook. It was probably the cheapest netbook i could find at this time, but it was also one of the smaller and lighter ones.
My experience with it has not been a happy one however.
- Upon arrival, the battery was dead. I had to send the whole thing back, and get a new one.
- After a few months the screen begun flickering. Note that I’ve used it very little (it mostly sits on my bookshelf). Since it is still in the warranty i sent it back for repair. I was told today that the motherboard needs replacing and there is none in stock, either here or in the factory in Germany. No word on when i’ll have it back.
- The keyboard is rather horrible. The keys are very small and i keep making typos. My sister’s Acer Aspire One has a far better keyboard, and it was marginally more expensive.
- The pre-installed Windows XP came with broken WiFi drivers that required an update to work. How could they miss that before shipping?
Click to read and post comments
Dec 11, 2009
One of my servers had a lot of traffic due to image hotlinkers (they are now being served Goatse) and while examining the logs i noticed an unusual referer from hi5. It had get variables like loginToken , loginid and reviewCommentLink. I thought that was a little strange and thought, could it be?
One click later i was logged in as some Mexican guy.
I never liked Hi5, but i can’t deny its one of the big social networking sites. Using information in links that can log someone in without any validation (or, at least, expiring them upon first use), is a serious mistake. Its not a mistake i would expect from the likes of Hi5.
I thought about reporting it, but after a google search i came upon this blog post which describes the same issue and that guy has already reported it. So, there’s no point of reporting it again. They know and don’t care. That post is from 2006.
This is really sad. This seems like a very exploitable hole. Host an image in your server that enough people will click ( keira knightley is a great choice :p ) and just wait until you get this kind of link in your referer log. It doesn’t get any simpler. (the image on my server was probably used as a profile image for someone else)
Click to read and post comments
Oct 16, 2009
Το Django framework περιλαμβάνει μια λειτουργικότητα που την ονομάζει content types. Το content types framework επιτρέπει, μεταξύ άλλων, στο Django να έχει λειτουργίες όπως τα generic relations
Ο τρόπος λειτουργίας είναι σχετικά απλός. Το content types framework βασικά λέει:
Για κάθε μοντέλο του ORM φτιάχνω μια εγγραφή στον πίνακα django_content_type που περιέχει ,μεταξύ άλλων, το όνομα του application και το όνομα του μοντέλου και φυσικά ένα ID.
Το generic relationship επιτρέπει σε ένα μοντέλο να έχει ένα foreign key σε ένα οποιοδήποτε άλλο μοντέλο στο django. Αυτό το επιτυγχάνει προσθέτοντας 2 πεδία στο μοντέλο που περιέχει το foreign key. Το content type και το id.
Έστω οτι έχουμε ένα μοντέλο Comment. Μιας και θέλουμε το Comment μπορεί να μπορεί να αναρτηθεί σε διάφορα μοντέλα (πχ Story, άλλα Comments, News, Product κλπ) χρησιμοποιούμε generic relations.
Αν ονομάζαμε το πεδίο αυτό “commenting_on” τότε όταν ζητήσουμε απο το django να μας δώσει το object στο οποίο δείχνει το commenting_on, το Django θα δεί το content_type πεδίο, θα αναζητήσει την αντίστοιχη εγγραφή στον πίνακα django_content_types και θα βρεί το application και model στο οποίο αναφερόμαστε. Γνωρίζοντας αυτά, και αφού έχει και το id μπορεί έυκολα να μας επιστρέψει ένα instance του μοντέλου.
Εδώ πρέπει να αναφέρω μιά ακόμα τεχνολογία του django. Το serialization framework που μας επιτρέπει να κάνουμε serialize και να εξάγουμε τα δεδομένα μας σε αρχείο κειμένου (YAML,XML, JSON και άλλα) όπως και να τα εισάγουμε στην βάση μας απο ένα serialized αρχείο.
Τα serialization είναι εξαιρετικά χρήσιμο σε πάρα πολλές περιπτώσεις, με πιθανότατα πιο συχνή το Testing framework, όπου μας δίνει την δυνατότητα πριν απο κάθε test να φορτώνουμε κάποια γνωστά δεδομένα στην database.
Όταν κάνουμε serialize ένα μοντέλο που περιέχει generic foreign keys, οι serializers του Django απλά καταγράφουν το content_type_id και το object_id.
Εδώ δημιουργείται το πρόβλημα.
Τα content_types φτιάχνονται κατα το syncdb (κάτι που γίνεται στην αρχή του test runner ) και τα id που θα πάρουν εξαρτώνται απο την σειρά με την οποία θα διαβάσει τις εφαρμογές και τα μοντέλα το django.
Τα test fixtures που φτιάξαμε νωρίτερα μεσω του serializer θα βγούν άχρηστα όταν για κάποιο λόγω αλλάξουν τα id των content types, και τα test μας θα αρχίσουν να σπάνε και χωρίς εμείς να ξέρουμε γιατί (αφού τα φόρτωσε χωρίς πρόβλημα).
Δυστυχώς δεν υπάρχει καλή λύση για αυτό το πρόβλημα.
Μια προσωρινή αλλα πολύ άσχημη λύση είναι στο test να κάνουμε lookup για το σωστό content type και να το αλλάζουμε on-the-fly. Yuck.
Είμαι γκαντέμης ή απλά άτυχος? :p
Click to read and post comments
Aug 20, 2009
Πρόσφατα έλαβα ένα ενημερωτικό email απο ένα ηλεκτρονικό κατάστημα με (πολύ) προκλητικά εσώρουχα. ( Όχι δεν έχω ψωνίσει. Το έχει φτιάξει φίλος μου και γράφτηκα για να δώ την υλοποίηση. Seriously )
Το email αυτό λοιπόν έχει πολλούς παραλήπτες στο Το: header και μπορώ να δώ ποιος άλλος το έλαβε. Απλά απαράδεκτο.
Μου ήταν πολύ απλό να πάρω μερικά email, να πάω στην αναζήτηση του Facebook και να βρω ποιος είναι πελάτης του συγκεκριμένου καταστήματος. Στην συγκεκριμένη περίπτωση δεν ήταν ποιός, αλλά ποιες και μάλιστα πολλές και καλές. Νομίζω οτι λάθος δουλειά κάνω. :-)
Αν δεν είχε ανάμιξη ο φίλος μου (δεν είχε στο email) θα τους έστελνα ένα καλό flame.
Είμαι βέβαιος οτι η ασχετοσύνη κυριαρχεί εδώ και όχι τίποτα πονηρό.
Click to read and post comments
Aug 11, 2009
Όλες οι γυναίκες κρύβουν ένα Πικάσο μέσα τους. Και αυτό είναι κακό. Πολύ κακό. Διότι το βγάζουν στο βάψιμο τους, και ο Πικάσο δεν είχε ένα ανάλαφρο στύλ, αλλα βαρύ, δυσνόητο, στύλ καρικατούρας που οι δήθεν το ονομάζουν cubism αλλα οι γνώστες το ονομάζούν "Απέτυχα σε όλες τις χρήσιμες δουλειές και έγινα ζωγράφος"
Παρά τα χάλια του, Ο Πικάσο δεν έφτιαχνε τα έργα του σε δέκα λεπτά. Μια αηδία τέτοιου μεγέθους χρειάζεται χρόνο για επιμονή για να φτάσει το απόγειο της. Έτσι και οι ο γυναικείος πληθυσμός, δεν βάζει make-up σε 10 λεπτά αλλα, όπως ο Πικάσο, χρειάζεται χρόνο, χρήμα (o Hondos κλέφτης θα γίνει?) και επιμονή για να φτάσει στην αηδία που ονομάζουν βάψιμο.
Σίγουρα όλοι έχουμε σχετική εμπειρία. Είτε περιμένοντας τις αδελφές μας, τις γκόμενες ή τις γυναίκες μας. Όλες νομίζουν οτι ο Πικάσο θα ζήλευε αν έβλεπε το αριστούργημα που δημιούργησαν μe τα λιγοστά ευρώ που ξόδεψαν στον Hondo (την μισή τους προίκα και τα χωράφια του παππού σου δηλαδή).
Το πρόβλημά μου ως μέλος του ανδρικού πληθυσμού, είναι ο χρόνος που χρειάζονται για τα αριστουργήματά τους. Χωρίς να θέλω να βιάσω την τέχνη, πρέπει να ομολογήσω οτι ορισμένες φορές (πάντα δηλαδή) ο χρόνος είναι δυσανάλογος του αποτελέσματος ( "τόση ώρα για να μοιάζεις με πουτάνα του δεκάευρου στα όρθια σε ξεχασμένο πάρκινγκ στην ερημία?" ).
Έστυψα το μυαλό μου λοιπόν για να βρω τρόπου να συγκεράσουμε την τέχνη με την γρήγορη εφαρμογή της.
Ιδέες:
Εφαρμογή make-up με προτυπωμένο χαρτί σαν αυτοκόλλητο.
Η τεχνολογία πιστεύω υπάρχει για να δημιουργηθεί ένα φύλο χαρτιού με προ-τυπωμένο make-up. Απλά το εφαρμόζεις στο πρόσωπό σου και αφήνει το make-up στα κατάλληλα σημεία. Προφανώς θα πρέπει να έχει σημάδια, (σταυρούς, εγκοπές, κλπ) για υπάρξουν σωστές συμπτώσεις αλλά πιστεύω οτι αυτά λύνονται εύκολα.
Θα μπορούσαν να κυκλοφορούν σε μια μεγάλη γκάμα make-up όπως "Πόρνη της Βαβυλώνας" , "Ξεπεσμένη Κλεοπάτρα", " Δειγματολόγιο της Lancome" , "Τροχαίο με φορτηγό που μεταφέρει μπογιές" , "Ο βιασμός του Ουράνιου Τόξου" και όλα τα δημοφιλή patterns.
Σκαλωσιά
Μια ακόμα λύση στο πρόβλημα είναι η δημιουργία μιας μινι σκαλωσίας (όπως στης οικοδομές) γύρω απο πρόσωπο της ενδιαφερόμενης. Αυτό θα επιτρέψει στα Oompa Loompas να έχουν πρόσβαση σε όλα τα επίπεδα και να εφαρμόσουν το επιθυμητό make-up πολύ γρήγορα και με την γνωστή τελειομανία τους. Τα ηθικοπλαστικά τραγούδια είναι προαιρετικά, αλλά ενθαρρύνονται.
Αλγοριθμική δημιουργία make-up pattern
Αυτό είναι ελκυστικότερο στα geek-girls αλλα νομίζω οτι έχει γενικότερη εφαρμογή. Αντί να αποφασίζει η γυναίκα για το που ακριβώς θα εφαρμοστεί ποιο καλλυντικό, αφήνουμε αυτές τις αποφάσεις σε ένα αλγόριθμο. Σκέψου Fractals.
Έχει το πλεονέκτημα αν κάποιος πλησιάσει πολύ κοντά στο πρόσωπό σου, το make-up σου δεν θα pixelιάσει αλλα θα κάνει σωστά zoom.
Επιπλέον κάθε make-up θα έχει ένα web interface που θα ψηφίζει ο αντρικός πληθυσμός αν θέλει να δεί κάτι τέτοιο στον δρόμο. Κάτι σε στυλ stumbleupon. Τα make-up με υψηλή βαθμολογία θα εμφανίζονται πιό συχνά. Ετσι οι σύγχρονη γυναίκα θα είναι πάντα στην μόδα.
Μόνιμο Μακιγιάζ
Ναι, μιλάω για τατουάζ. Μπορεί να μοιάζει δραστικό, αλλά είναι μια πολύ εύκολη και αποτελεσματική λύση. Ξέρω πόσο οι γυναίκες βαριέστε να κάνετε ντεμακιγιάζ όταν γυρνάτε αργά σπίτι σας και ξυπνάτε την άλλη μέρα σαν ατύχημα σε εργοστάσιο μαρκαδόρων ή σαν διαφήμιση για κέντρο κακοποιημένων γυναικών. To Τατουάζ προσφέρει μόνιμη και σωστή λύση. Αρκεί να διαλέξετε κάτι διαχρονικό, και όχι την μόδα της εποχής.
Γενικότερες φιλοσοφίες
Πέρα απο τρόπους για ταχύτερη εφαρμογή του make-up πιστεύω οτι οι εταιρίες καλλυντικών δεν έχουν εφαρμώσει σωστές μάρκετινγκ τεχνικές. (insert buzzwords here, like synergize, leverage κλπ κλπ Βλέπε Dilbert για λεπτομέρειες).
Για παράδειγμα θα μπορούσαν μαζί με ένα σετ μακιγιάζ να δίνουν και ένα dvd με τον Steven Seagal ώστε το να έχει κάτι να ασχοληθεί ο φίλος σας. (Εξάλλου είναι γνωστό οτι ο Steven Seagal είναι αυτό που πραγματικά ξεχωρίζει του άντρες απο τις γυναίκες)
Είμαι σίγουρος οτι υπάρχουν και άλλοι τρόπου που δεν σκέφτηκα. Περιμένω τις ιδέες σας. :-)
Disclaimer: Το παρόν post γράφηκε υπο την επήρεια αλκοόλ και ουδεμία ευθύνη φέρουμε για τυχόν ατυχήματα ή απώλειες που πιθανότατα (σχεδόν σίγουρα) θα προκύψουν απο εφαρμογή των προτάσεών μου.
Click to read and post comments
Aug 07, 2009
Blog Meme time:
Using only song names from ONE ARTIST, cleverly answer these questions. Pass it on to 15 people you like and include me. You can’t use the band I used. Try not to repeat a song title. It’s a lot harder than you think! Repost as “My life according to (band name)
Irene tagged everyone in My Life According to Rory Gallagher and i’ve always considered myself to be part of everyone so here it is:
My life according to AC/DC
Pick your artist: AC/DC
Are you a male or female: Cold hearted man
Describe yourself: Problem Child
How do you feel?: Nervous Shakedown
Describe where you currently live: Hell ain’t a bad place to be
If you could go anywhere, where would you go?: bedlam in belgium
Your favourite form of transportation: Ride on
You and your best friends are: Let there be rock
What’s the weather like?: Get it Hot
If your life was a TV show, what would it be called?: Have a drink on me
What is life to you?: Ain’t no fun (waiting ‘round to be a millionaire)
Your relationship: What do you do for money Honey
Your fear: All screwed up
What is the best advice you have to give?: Stick around
Thought for the day: moneytalks
How I would like to die: Shot down in flames
My soul’s present condition: back in black
My motto: Come and get it
Who tagged you: Irene
Tagged in this post: karametos , myclick , homunculus , stavrosg , Anyone bored enough to do this.
Click to read and post comments
May 06, 2009
Η πόλη της Πάτρας και τα προάστια της έχουν την τύχη να απολαμβάνουν μία απο τις πιο εντυπωσιακές υποδομές μέσων μαζικής μεταφοράς. Όταν λέω, εντυπωσιακές δεν εννοώ όπως λέμε: “πωπω, εντυπωσιακή γυναίκα η Μαρία” αλλα πιό πολύ όπως λέμε: “Πωπωπω, εντυπωσιακή εικόνα καταστροφής απο τον τυφώνα Κατρίνα”.
Το πρώτο πράγμα που εντυπωσιάζει τον επίδοξο επιβάτη είναι η πληροφόρηση ώς προς τις στάσεις επιβίβασης. Είναι κοινά αποδεκτό οτι η πληροφορία είναι πλέον σημαντικός παράγοντας στα σύγχρονα πεδία μάχης, και , μα τον Τουτάτις, αυτή είναι μια μάχη που τα αστικά ΚΤΕΛ σκοπεύουν να την κερδίσουν… με αντίπαλο τον επιβάτη.
Ο μόνος τρόπος για να βρείς που έχει στάση είναι να γυρνάς τους δρόμους σαν άστεγος, ψάχνοντας για μια ανεξήγητα υψηλή συγκέντρωση όρθιου κόσμου στο πεζοδρόμιο. Ο χρυσός κανόνας είναι, οτι ψάχνουμε για ένα σημείο με απόκλιση 3-4 standard deviations πάνω απο το mean.
Η μάχη της πληροφορίας θα ήταν αδύνατον να κερδηθεί αν όλοι γνώριζαν πότε περνάει το λεωφορείο. Ευτυχώς τα αστικά ΚΤΕΛ έχουν το νικητήριο προβάδισμα και σε αυτό τον τομέα. Δεν υπάρχει πρόγραμμα. Δεν υπάρχει site. Δεν υπάρχει κανένας στο τηλέφωνο. Δεν υπάρχει τίποτα γενικά. Σύμφωνα με μια αρχαία πατρινή παράδοση, το πρόγραμμα των λεωφορείων μεταβιβάζεται απο γενιά σε γενιά, απο τους παππούδες στα εγγόνια. Όπως η γιαγιά σου άφησε την παραδοσιακή συνταγή για εκείνη την πίτα που έφτιαχνε και η δική της γιαγιά, έτσι και εμένα έπρεπε να μου αφήσει τα δρομολόγια των λεωφορείων.
Συνεπώς, αν δεν είσαι γέννημα θρέμμα Πατρινός, τρεις γενιές πίσω με πλούσια παράδοση, τότε λεωφορείο θα δεις μόνο σε φωτογραφίες.
Έστω, όμως, οτι με πλάγιους τρόπους λαμβάνεις την κατάλληλη πληροφόρηση και καταφέρνεις να βρεις την στάση , αλλά και την ώρα. Όταν ως δια μαγείας φτάνει το λεωφορείο, θα εντυπωσιαστείς (βλέπε πρωτύτερο ορισμό του “εντυπωσιαστείς”) με τα Πατρινά υπερσύγχρονα κομψοτεχνήματα μηχανικής και τεχνολογίας. Το μόνο μειονέκτημα τους είναι πως επειδή κατασκευάστηκαν πριν την ανακάλυψη του πετρελαίου, καίνε βοθρολυμάτα . Σε περίπτωση που δεν υπάρχουν διαθέσιμα καύσιμα (πχ η κρίση χτύπησε και την τουαλέτα μας) υπάρχουν ειδικές καταπακτές κάτω απο τα καθίσματα που πέφτουν και βγάζουν τα πόδια τους οι επιβάτες σαν τους Flintstones. Μην ανησυχείτε αν δεν ξέρετε τι να κάνετε, ο οδηγός θα σας δείξει την διαδικασία ακριβώς όπως κάνουν οι αεροσυνοδοί στο αεροπλάνο.
Το να πεί κανείς οτι τα λεωφορεία είναι παλιά, είναι σαν να λέμε οτι το Big Bang είναι κάτι που “έγινε παλιά”. Δεν αποδίδει την έννοια στο πλήρες μεγαλείο της. Η επικρατέστερη, πάντως, θεωρία είναι οτι τα Πατρινά λεωφορεία δεν κατασκευάστηκαν απο τον άνθρωπο αλλά σχηματίστηκαν μόνα τους στο πέρασμα του χρόνου απο την φυσιολογική μεταβολή της ύλης σε μοριακό επίπεδο.
Ακούγοντας αυτά τα προβληματάκια θα σκεφτεί κανείς οτι τα αστικά ΚΤΕΛ δεν έχουν αρκετή χρηματοδότηση γιατί τα εισιτήρια θα πρέπει να είναι πολύ φτηνά. Τα εισιτήρια μας όμως είναι πανάκριβα. Δεν το έχω επιβεβαιώσει, αλλά είμαι σίγουρος οτι στην ιδια τιμή που μου κοστίζει να πάω απο το σπίτι μου στην Πλατεία Γεωργίου, θα μπορούσα να πάρω το αεροπλάνο και να κάνω μια εβδομάδα διακοπές στα νησιά Φίτζι, συνοδευόμενος απο δύο high class escorts , όλα πληρωμένα , προσφορά του εαυτού μου. Όπως είπα, δεν είναι τσεκαρισμένο μεν,αλλά δεν μπορεί να πέφτω και πολύ έξω.
Αν ποτέ επισκεφθείτε την Πάτρα μην παραλείψετε να ζήσετε την μοναδική εμπειρία που είναι οι αστικές συγκοινωνίες μας.
Click to read and post comments
May 04, 2009
Με αφορμή ένα facebook status message ενός φίλου (ναι, την μισεί και αυτός :p ), είπα να γράψω οτι είναι στραβό με την PHP κατα την γνώμη μου.
Εχουμε λοιπόν:
- Χιλιάδες functions στο default namespace.
Είναι πραγματικά απίστευτο. Μέχρι πρόσφατα η PHP δεν υποστήριζε namespaces και υπάρχουν κυριολεκτικά χιλιάδες functions στο default namespace. Εντελώς απαράδεκτο.
- Unicode. Πού είναι? οεο!
Έχουμε 2009 και η PHP δεν υποστηρίζει Unicode. Μοιάζει μα ανέκδοτο αλλά δεν είναι.
- Κανένα database abstraction.
Πόσο δύσκολο είναι ένα καλύτερο API για database access που να μην είναι δεμένο σε μια συγκεκριμένη database? Υπάρχουν διάφορα modules/scripts κλπ για να το λύνουν αυτό , παρόλα αυτά πάρα πολλά project χρησιμοποιούν functions συγκεκριμένες σε μια μόνο database. Και δεν μιλάω για χρήση ORM. Απλά ένα DB API όπως της Python.
- Χάος με deprecated functions.
Συχνά functions σπάνε την συμβατότητα, αλλάζουν όνομα και υπάρχουν διαφορετικές και ασύμβατες functions παράλληλα. Παράδειγμα: mysql_* με mysqli_* και mysql_escape_string vs mysql_real_escape_string.
- Δεν υπάρχουν στάνταρ στις functions.
Η σειρά των παραμέτρων αλλάζει ανάμεσα σε string μεθόδους. Παράδειγμα
- Ασυνεπές περιβάλλον
Με τα .ini αρχεία ο developer δεν μπορεί να γνωρίζει είναι διαθέσιμο και τι όχι.
Επιπλέον, υπάρχουν functions όπως η money_format() που δεν είναι portable και χωρίς σημαντικό λόγο. Η money_format() δεν είναι fork() ή κάποιο system call δεμένο σε μια πλατφόρμα. Γιατί το υλοποίησαν με non-portable τρόπο?
- Βλαμμένες χακιές
Πχ magic_quotes. Το magic quotes ήταν μια χαζή ιδέα γεμάτη προβλήματα. Η ιδέα εγκαταλείφθηκε αλλα άφησε τα απομεινάρια της. Ο developer δεν γνωρίζει αν είναι ενεργοποιημένα ή όχι, και πρέπει να ελέγχει με get_magic_quotes_gpc().
Φυσικά έχουμε και το register_globals. Μια ακόμα βλαμμένη ιδέα που καταργήθηκε. Ήταν μια πηγή απο bugs και απο σοβαρά κενά ασφαλείας. Δείτε εδώ για περισσότερα.
- Δεν προάγει διαχωρισμό HTML , κώδικα και SQL.
Υπάρχουν MVC frameworks αλλα η συντριπτική πλειοψηφία του PHP κώδικα είναι “όλα αχταρμάς”. Τα περισσότερα βιβλία και tutorial σε μαθαίνουν την λογική όλα μέσα. Για κάθε PHP project που είναι καλά σχεδιασμένο/γραμμένο υπάρχουν άλλα χίλια που θες να βγάλεις τα μάτια σου και να τα φάς.
Αυτή η λίστα περιλαμβάνει μόνο σοβαρά προβλήματα που έχω διαπιστώσει μόνος μου. Μια απλή αναζήτηση για PHP sucks θα φανερώσει πολλά ακόμα προβλήματα.
Η PHP είναι μια άναρχη γλώσσα που δεν σχεδιάστηκε απο την αρχή αλλά εξελίχθηκε βιαστικά και απρόσεκτα για να καλύψει τις ανάγκες των χρηστών της. Η ευκολία της τόσο στην εκμάθηση όσο και στο deployment την έκαναν πολύ δημοφιλή γλώσσα. Αυτό δεν σημαίνει οτι είναι καλή γλώσσα. Είναι μια γλώσσα γεμάτη κακές πρακτικές, bugs, κακό σχεδιασμό , ένα σωρό προβλήματα και παγίδες, ειδικά για νέους χρήστες.
Click to read and post comments
Mar 23, 2009
Ένα ενδιαφέρον blog meme απο εδώ:
Answer the following questions with less than 50 words each (mind, only desktop/gui applications):
- which desktop manager do you use more often ?
- which desktop application you would not like to see implemented again on linux? and why?
- which desktop application you definitely would like to see implemented on linux? describe it briefly or point out to a similar application.
- write the name of the last project (not the very best, the last!) that made you wish to thank their developers so you can thank them now! :-)
- (optional) Link the blogs of 1-3 people you’d like to take part to this meme. (no more than three). you can skip this question if you like.
Οι απαντήσεις μου:
- KDE αποκλειστικά.
- audio players. Έχουμε πολλούς και πολύ καλούς. Ας βελτιώσουμε αυτούς.
- Video editing. πχ Sony Vegas κλπ.
- Django. Thank you people. You’re super awesome.
- Whatever…
Click to read and post comments
Feb 28, 2009
Πρόσφατα δοκίμαζα το cairo (με την χρήση των python bindings, pycairo). Μια 2D vector graphics βιβλιοθήκη γραμμένη σε C με bindings για πολλές γλώσσες.
Ήθελα να μπορώ να φορτώνω εικόνες απο αρχεία με διάφορα format και να τα βάζω στο canvas μου.
Η PIL (Python Imaging Library) είναι μια πολύ καλή βιβλιοθήκη που μας επιτρέπει να διαβάζουμε και να επεξεργαζόμαστε πολλά αρχεία είκόνας.
Η PIL μας δίνει την δυνατότητα να πάρουμε τα “raw” δεδομένα μιας εικόνας, το cairo μας επιτρέπει να φτιάξουμε ένα ImageSurface απο τα “raw” δεδομένα μιας εικόνας αρα το πρόβλημα θα έπρεπε να είναι απλό. Μετατρέπουμε μια εικόνα σε RGBA format (γιατί μπορεί πχ να είναι pallete ) , παίρνουμε τα raw δεδομένα και τα δίνουμε στο cairo. Δεν είναι ακριβώς έτσι όμως. Η PIL χρησιμοποιεί RGBA format στα raw δεδομένα ενώ η cairo ARGB. (δηλαδή πρώτα το alpha channel αντί για τελευταίο όπως στο RGBA). Το αποτέλεσμα είναι οτι αντιστρέφονται τα χρώματα στο B και R color bands.
Για να το λύσουμε αυτό πρέπει να αντιστρέψουμε τα B και R color bands (blue και Red δηλαδή). Το οτι χρειάζεται να γίνει αυτό, όπως και το πώς γίνεται το βρήκα με αρκετό ψάξιμο ψάξιμο στα intertubes και για αυτό το καταγράφω εδώ. Υπάρχει στο cookbook του cairo σχετικό θέμα αλλα δεν λύνει την μετατροπή RGBA->ARGB και αυτό που αναφέρει σαν λύση (οτι το PIL μπορεί να μετατρέψει ARGB) δεν δουλεύει.
Ορίστε λοιπόν:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | import Image
import cairo
import numpy
img = Image.open('our_file.jpg')
img = img.convert("RGBA")
r , g , b, a = img.split()
img = Image.merge("RGBA" ( b, g, r ,a ) )
buff = numpy.asarray(img)
buff.flags.writeable = True
width,height = img.size
stride = cairo.ImageSurface.format_stride_for_width(
cairo.FORMAT_ARGB32,width)
surface = cairo.ImageSurface.create_for_data(buff,
cairo.FORMAT_ARGB32, width,height,stride)
|
Εδώ χρησιμοποιώ την numpy για writeable buffer που χρειάζεται η μέθοδος create_for_data() αλλα γίνεται το ίδιο απλά και με το array module.
Click to read and post comments