About

All articles, tagged with union of tags “django, greek”

Tools for generating PDFs from django.

For a Django project i’m working on i needed to generate PDF reports. For example a “job ticket” that displays the client data, the material list and a list of “processing” actions to be performed, or an invoice (classic use case).

What i wanted was a way to generate these PDF files from a template using Django’s templating language. I had previously done something similar using PISA but i was not satisfied. There documentation was rather bad, generating HTML/CSS is not my strong point and automatic tools produce unreadable code. It does work though.

After some heavy and masterful googling i came up with several options.

  1. Reportlab. Very well known, very powerful, but the good parts are not free. I did not want to write the layout using Python code. I’d rather use some high level abstraction on top of Reportlab. Their RML framework (which does exactly that) seems great but as far as i can see it is not free. There are open source alternatives though, which i’ll talk about later.
  2. Pod Uses OpenOffice in server mode to generate documents in PDF. I’ll be running my software in a memory limited VPS and running OpenOffice (even in server mode) seems very scary. I did not investigate the exact memory requirements though because it seemed like a waste of time.
  3. rst2pdf. RST is very awesome, Sphinx uses it but from my reading of rst it seems that generating accurate and custom layouts seems somewhat difficult (for a report that needs specific elements in specific locations).
  4. trml2pdf. This is a tiny and free implementation of RML. This seemed to be a better solution, but what i wanted was a way to generate RML documents using a GUI tool (i’m a lazy bastard). The solution is tiny_sxw2rml which produces an RML document from an OpenOffice .odt file.
  5. JasperReports. This is a very impressive Java package and GUI designer that can generate beautiful reports from various data sources. This was a serious contender (** especially** with their very nice GUI designer) but i chose to avoid it because i could not use the Django ORM to do templating (i can use raw SQL but that is severely suboptimal in templating , especially on complex templates). I could use the Django ORM to produce an XML file with all the information but the prospect of using an XML file (using XPath ) seemed dreadful (but it would work nicely). It is a Java package with Python bindings available for it and a web interface that can be used to access it using a standard interface (HTTP)

The fourth solution (trml2pdf) is the one i chose. These tools are developed by the openerp framework for their reporting needs.

However, it is far from a perfect solution. There is no official repository for this package with various versions floating around the web with different features. More specifically, i was only able to use barcode generation using the version from openerp server source code, which i had to patch to make it work (because it relied on other modules of OpenERP).

Additionally, i had to patch it to make it work with unicode fonts as per the instructions from the OpenErp Docs. Not something you would want to depend on.

Nevertheless i was able to make it all work. I could use the tool tiny_sxw2rml to produce an rml template that would first be processed by the Django templating system and then fed into trml2pdf to produce a PDF. It works.

All in all i would have to say that JasperReports is the best solution from a technical standpoint since it has a great GUI designer that produces beautiful documents with perfect layout, has a lot of features, a large community, can be used as an independent server that produces PDF documents and much much more. The main problem is that you lose that advantage of integrating your workflow into the philosophy of Django (ORM/templates etc) and have to walk the extra mile.

I’ve already integrated trml2pdf but i’m keeping my eye open for a way to switch to JasperReports.

I’d like to hear what solutions others may have used/considered for this.

Deployment with Fabric

Τί είναι:

To fabric είναι ένα εργαλείο για αυτοματοποίηση εργασιών μέσω SSH που διευκολύνει το deployment ή την διαχείρηση συστημάτων.

Συγκεκριμένα, πρόκειται για ένα command line εργαλείο και μια βιβλιοθήκη (API) γραμμένη σε Python που επιτρέπει την εκτέλεση προγραμμάτων command line ή και Python κώδικα, σε τοπικό η και απομακρυσμένο server(s).

Παράδειγμα:

Έστω οτι έχω ένα Django site που το αναπτύσσουμε στον υπολογιστή μας, και τρέχουμε ένα production server σε ένα VPS.

Οταν έχω μια νέα έκδοση του site μου, τρέχω μερικές εντολές στο τοπικό PC (πχ το test framework, κάνω push τις αλλαγές κλπ), μετά κάνω login στο VPS μου μέσω SSH και κάνω τις αναβαθμίσεις. Αυτά τα βήματα μπορούν, αφού καταγραφούν, και μετά να αυτοματοποιηθούν κάνοντας χρήση του fabric.

Εγκατάσταση.

Η εγκατάσταση είναι πολύ έυκολη. easy_install fabric ή απο το package manager της διανομής μας

Το fabfile

Το πρώτο βήμα για την χρήση του fabric είναι η δημιουργία του αρχείου στο οποίο βάζουμε τις “εντολές” μας. Το αρχείο αυτό το ονομάζουμε fabfile.py γιατί με αυτό το όνομα το βρίσκει αυτόματα το εργαλείο fab (το command line εργαλείο του fabric)

Στο fabfile αρχείο καταγράφουμε τις διάφορες “λειτουργίες” που θα εκτελεί το Fabric.

Παράδειγμα:

:::python
def hello():
    print "Hello world"

Τώρα μπορούμε να τρέξουμε την “hello” τρέχοντας:

arcanum@localhost ~ $ fab hello

Το fabric αυτόματα θα ψάξει για ένα αρχείο με όνομα fabfile.py και μέσα του για ένα callable με όνομα hello και θα το εκτελέσει.

Φυσικά αυτό είναι υπερβολικά απλό και όχι ιδιαίτερα χρήσιμο απο μόνο του. Η χρησιμότητα του Fabric έρχεται απο το API του.

Παράδειγμα με το API του Fabric

Όπως είπαμε θέλουμε να τρέξουμε μερικές εντολές στο τοπικό PC και μερικές στο απομακρυσμένο. Το fabric μας παρέχει ένα API για αυτή την δουλειά Αυτό είναι ένα (τροποποιημένο για πολλούς λόγους) script που χρησιμοποιώ σε ένα project μου.

def import datetime
from fabric.api import local, run, cd, env

# The app directory of metaxas.gr
PROJECT_DIR='/home/arcanum/django_projects/myproject'

env.hosts = ['arcanum@metaxas.gr:2000']

def deploy():
    backup_database()
    sync_remote_repo()
    run_migrations()
    restart_wsgi()

def push_updates():
    """
    Push updates from local repo to remote repo
    Does *NOT* commit uncommited modifications
    """
    # TODO check for uncommitted modifications and give warning
    local("hg push")

def sync_remote_repo():
    """
    Sync the remote stable repository on the production server
    """
    with cd(PROJECT_DIR):
        run('hg pull')
        run('hg up')

def run_migrations():
    """
    Run any migration on the remote server
    """
    with cd(PROJECT_DIR):
        run('./manage.py migrate')


def restart_wsgi():
    """
    Restart the WSGI app by 'touch'ing the wsgi file.
    Thi means updating the last modification date of that file, which is
    monitored by the WSGI app server
    """
    with cd(PROJECT_DIR):
        run('touch wsgi/django.wsgi')


def backup_database():
    """
    Make a backup of the database.
    """
    with cd(PROJECT_DIR):
        now = datetime.datetime.now()
        now_str = now.strftime("%d-%m-%Y")
        BACK_CMD = 'pg_dump --format=t mydatabase |bzip2 > mydatabase-%s.sql.bz2'%(now_str, )

        run(BACK_CMD)

Θεωρώ οτι είναι αρκετά απλό παράδειγμα και κάποιος με εμπειρία στην Python θα καταλάβει αμέσως τι γίνεται όμως θα ανεφέρω μερικά πράγματα:

  1. Τρέχοντας fab deploy το fabric θα βρεί την function με όνομα deploy και θα την εκτελέσει. Αυτή με την σειρά της καλεί διάφορες άλλες functions μέσα στο fabfile.

  2. Απο το API του fabric χρησιμοποιούμε μερικές τυπικές λειτουργίες όπως local , run, cd κλπ.

Η local μας δίνει την δυνατότητα να τρέξουμε μια εντολή (σαν να είμασταν στο shell) στο τοπικό μηχάνημα.

Η run τρέχει μια εντολή (πάλι shell) στο remote μηχάνημα. Αυτό γίνεται transparently μέσω SSH. Το remote host τον βρίσκει απο το την env.hosts λίστα. Θα μπορούσαμε να συνδεόμαστε σε πολλούς hosts (αν για παράδειγμα είχαμε πολλούς web server σε ένα scalable site).

Το cd κάνει αυτό που φαντάζεσται. Η ανάγκη του προέρχεται απο την έλλειψη state της των shell-less SSH συνδέσεων. Το cd έχει ένα context manager (with statement ) οπότε οτι τρέχει μέσα στο context του with γίνεται prepend το path.

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

Το API του fabric είναι, προφανώς, πολύ μεγαλύτερο με δυνατότητες για prompts, file transfers, κλπ.

Για περισσότερα ανατρέξτε στο fabric documentation

Django generic relations in test fixtures

Το 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

Newsletter με πολλούς παραλήπτες και privacy

Πρόσφατα έλαβα ένα ενημερωτικό email απο ένα ηλεκτρονικό κατάστημα με (πολύ) προκλητικά εσώρουχα. ( Όχι δεν έχω ψωνίσει. Το έχει φτιάξει φίλος μου και γράφτηκα για να δώ την υλοποίηση. Seriously )

Το email αυτό λοιπόν έχει πολλούς παραλήπτες στο Το: header και μπορώ να δώ ποιος άλλος το έλαβε. Απλά απαράδεκτο.

Μου ήταν πολύ απλό να πάρω μερικά email, να πάω στην αναζήτηση του Facebook και να βρω ποιος είναι πελάτης του συγκεκριμένου καταστήματος. Στην συγκεκριμένη περίπτωση δεν ήταν ποιός, αλλά ποιες και μάλιστα πολλές και καλές. Νομίζω οτι λάθος δουλειά κάνω. :-)

Αν δεν είχε ανάμιξη ο φίλος μου (δεν είχε στο email) θα τους έστελνα ένα καλό flame.

Είμαι βέβαιος οτι η ασχετοσύνη κυριαρχεί εδώ και όχι τίποτα πονηρό.

Νέα μέθοδος γρήγορου makeup

Όλες οι γυναίκες κρύβουν ένα Πικάσο μέσα τους. Και αυτό είναι κακό. Πολύ κακό. Διότι το βγάζουν στο βάψιμο τους, και ο Πικάσο δεν είχε ένα ανάλαφρο στύλ, αλλα βαρύ, δυσνόητο, στύλ καρικατούρας που οι δήθεν το ονομάζουν 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 γράφηκε υπο την επήρεια αλκοόλ και ουδεμία ευθύνη φέρουμε για τυχόν ατυχήματα ή απώλειες που πιθανότατα (σχεδόν σίγουρα) θα προκύψουν απο εφαρμογή των προτάσεών μου.

Τα μαγικά λεωφορεία της Πάτρας

Η πόλη της Πάτρας και τα προάστια της έχουν την τύχη να απολαμβάνουν μία απο τις πιο εντυπωσιακές υποδομές μέσων μαζικής μεταφοράς. Όταν λέω, εντυπωσιακές δεν εννοώ όπως λέμε: “πωπω, εντυπωσιακή γυναίκα η Μαρία” αλλα πιό πολύ όπως λέμε: “Πωπωπω, εντυπωσιακή εικόνα καταστροφής απο τον τυφώνα Κατρίνα”.

Το πρώτο πράγμα που εντυπωσιάζει τον επίδοξο επιβάτη είναι η πληροφόρηση ώς προς τις στάσεις επιβίβασης. Είναι κοινά αποδεκτό οτι η πληροφορία είναι πλέον σημαντικός παράγοντας στα σύγχρονα πεδία μάχης, και , μα τον Τουτάτις, αυτή είναι μια μάχη που τα αστικά ΚΤΕΛ σκοπεύουν να την κερδίσουν… με αντίπαλο τον επιβάτη.
Ο μόνος τρόπος για να βρείς που έχει στάση είναι να γυρνάς τους δρόμους σαν άστεγος, ψάχνοντας για μια ανεξήγητα υψηλή συγκέντρωση όρθιου κόσμου στο πεζοδρόμιο. Ο χρυσός κανόνας είναι, οτι ψάχνουμε για ένα σημείο με απόκλιση 3-4 standard deviations πάνω απο το mean.

Η μάχη της πληροφορίας θα ήταν αδύνατον να κερδηθεί αν όλοι γνώριζαν πότε περνάει το λεωφορείο. Ευτυχώς τα αστικά ΚΤΕΛ έχουν το νικητήριο προβάδισμα και σε αυτό τον τομέα. Δεν υπάρχει πρόγραμμα. Δεν υπάρχει site. Δεν υπάρχει κανένας στο τηλέφωνο. Δεν υπάρχει τίποτα γενικά. Σύμφωνα με μια αρχαία πατρινή παράδοση, το πρόγραμμα των λεωφορείων μεταβιβάζεται απο γενιά σε γενιά, απο τους παππούδες στα εγγόνια. Όπως η γιαγιά σου άφησε την παραδοσιακή συνταγή για εκείνη την πίτα που έφτιαχνε και η δική της γιαγιά, έτσι και εμένα έπρεπε να μου αφήσει τα δρομολόγια των λεωφορείων. Συνεπώς, αν δεν είσαι γέννημα θρέμμα Πατρινός, τρεις γενιές πίσω με πλούσια παράδοση, τότε λεωφορείο θα δεις μόνο σε φωτογραφίες.

Έστω, όμως, οτι με πλάγιους τρόπους λαμβάνεις την κατάλληλη πληροφόρηση και καταφέρνεις να βρεις την στάση , αλλά και την ώρα. Όταν ως δια μαγείας φτάνει το λεωφορείο, θα εντυπωσιαστείς (βλέπε πρωτύτερο ορισμό του “εντυπωσιαστείς”) με τα Πατρινά υπερσύγχρονα κομψοτεχνήματα μηχανικής και τεχνολογίας. Το μόνο μειονέκτημα τους είναι πως επειδή κατασκευάστηκαν πριν την ανακάλυψη του πετρελαίου, καίνε βοθρολυμάτα . Σε περίπτωση που δεν υπάρχουν διαθέσιμα καύσιμα (πχ η κρίση χτύπησε και την τουαλέτα μας) υπάρχουν ειδικές καταπακτές κάτω απο τα καθίσματα που πέφτουν και βγάζουν τα πόδια τους οι επιβάτες σαν τους Flintstones. Μην ανησυχείτε αν δεν ξέρετε τι να κάνετε, ο οδηγός θα σας δείξει την διαδικασία ακριβώς όπως κάνουν οι αεροσυνοδοί στο αεροπλάνο.
Το να πεί κανείς οτι τα λεωφορεία είναι παλιά, είναι σαν να λέμε οτι το Big Bang είναι κάτι που “έγινε παλιά”. Δεν αποδίδει την έννοια στο πλήρες μεγαλείο της. Η επικρατέστερη, πάντως, θεωρία είναι οτι τα Πατρινά λεωφορεία δεν κατασκευάστηκαν απο τον άνθρωπο αλλά σχηματίστηκαν μόνα τους στο πέρασμα του χρόνου απο την φυσιολογική μεταβολή της ύλης σε μοριακό επίπεδο.

Ακούγοντας αυτά τα προβληματάκια θα σκεφτεί κανείς οτι τα αστικά ΚΤΕΛ δεν έχουν αρκετή χρηματοδότηση γιατί τα εισιτήρια θα πρέπει να είναι πολύ φτηνά. Τα εισιτήρια μας όμως είναι πανάκριβα. Δεν το έχω επιβεβαιώσει, αλλά είμαι σίγουρος οτι στην ιδια τιμή που μου κοστίζει να πάω απο το σπίτι μου στην Πλατεία Γεωργίου, θα μπορούσα να πάρω το αεροπλάνο και να κάνω μια εβδομάδα διακοπές στα νησιά Φίτζι, συνοδευόμενος απο δύο high class escorts , όλα πληρωμένα , προσφορά του εαυτού μου. Όπως είπα, δεν είναι τσεκαρισμένο μεν,αλλά δεν μπορεί να πέφτω και πολύ έξω.

Αν ποτέ επισκεφθείτε την Πάτρα μην παραλείψετε να ζήσετε την μοναδική εμπειρία που είναι οι αστικές συγκοινωνίες μας.

Why PHP sucks.

Με αφορμή ένα facebook status message ενός φίλου (ναι, την μισεί και αυτός :p ), είπα να γράψω οτι είναι στραβό με την PHP κατα την γνώμη μου.

Εχουμε λοιπόν:

  1. Χιλιάδες functions στο default namespace.
    Είναι πραγματικά απίστευτο. Μέχρι πρόσφατα η PHP δεν υποστήριζε namespaces και υπάρχουν κυριολεκτικά χιλιάδες functions στο default namespace. Εντελώς απαράδεκτο.
  2. Unicode. Πού είναι? οεο!
    Έχουμε 2009 και η PHP δεν υποστηρίζει Unicode. Μοιάζει μα ανέκδοτο αλλά δεν είναι.
  3. Κανένα database abstraction.
    Πόσο δύσκολο είναι ένα καλύτερο API για database access που να μην είναι δεμένο σε μια συγκεκριμένη database? Υπάρχουν διάφορα modules/scripts κλπ για να το λύνουν αυτό , παρόλα αυτά πάρα πολλά project χρησιμοποιούν functions συγκεκριμένες σε μια μόνο database. Και δεν μιλάω για χρήση ORM. Απλά ένα DB API όπως της Python.
  4. Χάος με deprecated functions.
    Συχνά functions σπάνε την συμβατότητα, αλλάζουν όνομα και υπάρχουν διαφορετικές και ασύμβατες functions παράλληλα. Παράδειγμα: mysql_* με mysqli_* και mysql_escape_string vs mysql_real_escape_string.
  5. Δεν υπάρχουν στάνταρ στις functions.
    Η σειρά των παραμέτρων αλλάζει ανάμεσα σε string μεθόδους. Παράδειγμα
  6. Ασυνεπές περιβάλλον Με τα .ini αρχεία ο developer δεν μπορεί να γνωρίζει είναι διαθέσιμο και τι όχι.
    Επιπλέον, υπάρχουν functions όπως η money_format() που δεν είναι portable και χωρίς σημαντικό λόγο. Η money_format() δεν είναι fork() ή κάποιο system call δεμένο σε μια πλατφόρμα. Γιατί το υλοποίησαν με non-portable τρόπο?
  7. Βλαμμένες χακιές
    Πχ magic_quotes. Το magic quotes ήταν μια χαζή ιδέα γεμάτη προβλήματα. Η ιδέα εγκαταλείφθηκε αλλα άφησε τα απομεινάρια της. Ο developer δεν γνωρίζει αν είναι ενεργοποιημένα ή όχι, και πρέπει να ελέγχει με get_magic_quotes_gpc().
    Φυσικά έχουμε και το register_globals. Μια ακόμα βλαμμένη ιδέα που καταργήθηκε. Ήταν μια πηγή απο bugs και απο σοβαρά κενά ασφαλείας. Δείτε εδώ για περισσότερα.
  8. Δεν προάγει διαχωρισμό HTML , κώδικα και SQL.
    Υπάρχουν MVC frameworks αλλα η συντριπτική πλειοψηφία του PHP κώδικα είναι “όλα αχταρμάς”. Τα περισσότερα βιβλία και tutorial σε μαθαίνουν την λογική όλα μέσα. Για κάθε PHP project που είναι καλά σχεδιασμένο/γραμμένο υπάρχουν άλλα χίλια που θες να βγάλεις τα μάτια σου και να τα φάς.

Αυτή η λίστα περιλαμβάνει μόνο σοβαρά προβλήματα που έχω διαπιστώσει μόνος μου. Μια απλή αναζήτηση για PHP sucks θα φανερώσει πολλά ακόμα προβλήματα.

Η PHP είναι μια άναρχη γλώσσα που δεν σχεδιάστηκε απο την αρχή αλλά εξελίχθηκε βιαστικά και απρόσεκτα για να καλύψει τις ανάγκες των χρηστών της. Η ευκολία της τόσο στην εκμάθηση όσο και στο deployment την έκαναν πολύ δημοφιλή γλώσσα. Αυτό δεν σημαίνει οτι είναι καλή γλώσσα. Είναι μια γλώσσα γεμάτη κακές πρακτικές, bugs, κακό σχεδιασμό , ένα σωρό προβλήματα και παγίδες, ειδικά για νέους χρήστες.

Applications meme

Ένα ενδιαφέρον blog meme απο εδώ:

Answer the following questions with less than 50 words each (mind, only desktop/gui applications):

  1. which desktop manager do you use more often ?
  2. which desktop application you would not like to see implemented again on linux? and why?
  3. which desktop application you definitely would like to see implemented on linux? describe it briefly or point out to a similar application.
  4. 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! :-)
  5. (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.

Οι απαντήσεις μου:

  1. KDE αποκλειστικά.
  2. audio players. Έχουμε πολλούς και πολύ καλούς. Ας βελτιώσουμε αυτούς.
  3. Video editing. πχ Sony Vegas κλπ.
  4. Django. Thank you people. You’re super awesome.
  5. Whatever…

Δημιουργία ImageSurface στο pycairo με χρηση της PIL.

Πρόσφατα δοκίμαζα το 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) δεν δουλεύει.

Ορίστε λοιπόν:

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.

Ubuntu is all about the community

Πολλά πράγματα μου συμβαίνουν αυτή την εποχή, και δυσάρεστα αλλα (μάλλον) και ευχάριστα οπότε δεν έχω χρόνο για το blog.

Για να σας θυμίσω οτι υπάρχω όμως, ορίστε κάτι που είχα φτιάξει πριν καιρό. Είχα πετύχει την αρχική φωτογραφία μέσω stumbleupon και μόλις την είδα αμέσως το συνδύασα με ubuntu και με 2 λεπτά Gimp hacking το έβαλα δίπλα στην λέξη ubuntu.

Προσοχή, δεν είναι για ανήλικους. (ποτέ όμως δεν είπα οτι το blog αυτό είναι σεμνό).

Ubuntu Porn

Ήθελα να σκεφτώ κάποιο κατάλληλο tagline για να προσθέσω αλλα ποτέ δεν το έκανα. Πχ κάτι σε στύλ “Ubuntu brings communities closer” ή κάτι σχετικό :p