Πολλά πράγματα μου συμβαίνουν αυτή την εποχή, και δυσάρεστα αλλα (μάλλον) και ευχάριστα οπότε δεν έχω χρόνο για το blog.
Για να σας θυμίσω οτι υπάρχω όμως, ορίστε κάτι που είχα φτιάξει πριν καιρό. Είχα πετύχει την αρχική φωτογραφία μέσω stumbleupon και μόλις την είδα αμέσως το συνδύασα με ubuntu και με 2 λεπτά Gimp hacking το έβαλα δίπλα στην λέξη ubuntu.
Προσοχή, δεν είναι για ανήλικους. (ποτέ όμως δεν είπα οτι το blog αυτό είναι σεμνό).
Ήθελα να σκεφτώ κάποιο κατάλληλο tagline για να προσθέσω αλλα ποτέ δεν το έκανα. Πχ κάτι σε στύλ “Ubuntu brings communities closer” ή κάτι σχετικό :p
Ήμουν αρχικά πελάτης της Internet Helllas. Αυτή αγοράστηκε απο την Forthnet και μεταφέρθηκα αυτόματα εκεί. Απο τότε μέχρι σήμερα ήμουν πελάτης της Forthnet.
Πλήρωνα με πιστωτική κάρτα. Κάθε μήνα “τράβαγαν” τα χρήματα αυτόματα και όλα μια χαρά. Μέχρι που στις 29/12 ώρα 15:00 πέφτει η σύνδεσή μου και στα logs του modem βλέπω προσπάθεις για login με λάθος username/password.
Επειδή η πιστωτική κάρτα που χρησιμοποιώ ανανεώθηκε πρόσφατα (άρα άλλαξε ημερομηνία λήξης και CVV) και χρειάστηκε να την ενημερώσω σε πολλές υπηρεσίες (hosting/paypal κλπ) πήγε το μυαλό μου οτι κάτι τέτοιο συμβαίνει και έτσι μίλησα με το τμήμα πωλήσεων της Forthnet.
Αυτό είχε συμβεί και στο παρελθόν. Σε απενεργοποιούν και δεν μπορείς να κάνεις login. Τότε είχα πάρει τηλέφωνο τους έδωσα τα νέα στοιχεία τις κάρτα και όλα καλά.
Να σημειώσω πως και την προηγούμενη φορά, όπως και τώρα μου έκοψαν την σύνδεση χωρις προειδοποίηση. Κάτι που, αν θυμάμαι καλά, απαγορεύεται απο την ΕΕΤΤ. (και ο λογαριασμός δεν μετράει σαν προειδοποίηση. Ετσι και αλλιώς δεν λαμβάνω ,ομως, γιατί έχουν τα στοιχεία μου μπερδεμένα και δεν μπορούν τα τα φτιάξουν)
Στο τηλέφωνο μου λένε οτι υπάρχει ένα χρέος 7 τιμολόγια (7 μήνες δηλαδή). 2 τιμολόγια του 2005 (!?!) και τα υπόλοιπα του 2006! Όλα τα μεταγενέστερα τιμολόγια μέχρι σήμερα είναι πληρωμένα κανονικά! Κανένας δεν μπόρεσε να μου απαντήσει πώς προέκυψε αυτό το χρέος αφού πληρώνω με πιστωτική κάρτα. Στο τηλέφωνο μου λένε οτι δεν γίνεται να δώσω τα στοιχεία της κάρτας μου απο το τηλέφωνο για να πληρωθεί το χρέος (και να συνεχίσουν οι χρεώσεις) και πως πρέπει να πάω στο υποκατάστημα.
Στο υποκατάστημα (που πήγε η αδελφή μου) της λένε οτι μπορεί να πληρώσει μόνο τα τιμολόγια του 2006 και πως τα 2 τιμολόγια του 2005 δεν μπορούν να πληρωθούν γιατι δεν τα “δέχεται” το σύστημα τους. Πρέπει να πάω στην τράπεζα και να τους στείλω το αποδεικτικό κατάθεσης με fax (το σύστημά τους δέχεται αποδεικτικά κατάθεσης, αλλά όχι μετρητά? wtf?). Μιας και όλα αυτά γίνονται απόγευμα, αυτόματα το ξεμπλοκάρισμά μου πάει για την επόμενη ημέρα. Και όλα αυτά ενώ τους έχω εξηγήσει πολλές φορές οτι το internet το χρειάζομαι το συντομότερο δυνατόν για την δουλειά μου.
Την επόμενη ημέρα πάω στο υποκατάστημα και τους λέω:
Έχω το έρθει με μετρητά για χρέος που δεν ξερετε γιατί πρέπει να πληρώσω. Μπορώ να το πληρώσω εδώ?
Οχι, πρέπει να πάτε στην τράπεζα.
Ωραία, φέρτε μου έντυπο να καταργήσω την συνδρομή μου
Όπως και έκανα φυσικά.
Ούτε το ΙΚΑ και η Εφορία δεν είναι τόσο χάος.
Φυσικά θεώρησα αυτονόητο οτι αφού έχω γραμμή adsl απο τον ΟΤΕ και εξοπλισμό δικό μου θα μπορούσα να κάνω μια νέα σύνδεση μέσα σε λίγες ώρες. (username/password χρειαζόμουν μονο). Στα μαγαζιά που πήγα όμως μου είπαν οτι έχουν μονο πακέτα (που θέλουν 10-15 ημέρες) και για αυτό που ζητάω να πάρω τηλ. στον ISP που θέλω.
Παίρνω τηλέφωνο στην HOL και αφού τους εξηγώ την περίπτωσή μου, μου λέει οτι θέλει 7 ημέρες για να ενεργοποιηθεί. (Γιατί?)
Αφού απογοητεύομαι απο την HOL, πάω στην τελευταία επιλογή. Otenet. Και εκεί μου εξηγούν οτι θα κάνουν ότι μπορούν για να μου δώσουν τους κωδικούς το συντομότερο δυνατό. Έκανα την αίτηση απο το 134 στις 15:00 και στις 16:00 με πήραν τηλέφωνο στο κινητό (που δυστυχώς δεν το άκουσα και έτσι με πήραν την επόμενη ημέρα πρωί-πρωί ).
Η εταιρία απο την οποία περίμενα τα λιγότερα ήταν η πιο εξυπηρετική. Φυσικά δεν ασχολήθηκα καθόλου με Tellas και λοιπές εταιρίες επιπέδου Altec.
Πλέον είμαι πελάτης της Otent. Ελπίζω να μην το μετανιώσω. Για να δούμε….
Πάντως το σκηνικό των τηλεπικοινωνιών στην Ελλάδα είναι πολύ απογοητευτικό.
Είμαι γεννημένος το 1980. Ορισμένα παλιά παιδικά και σειρές της εποχής εκείνης έχουν μια ιδιαίτερη θέση στο μυαλό μου. Δυστυχώς για πολλά απο αυτά δεν ήξερα τους τίτλους τους. Σε κάποια θυμόμουν ένα κομμάτι απο την μελωδία, ένα απόσπασμα απο τους στίχους ή μερικές χαρακτηριστικές εικόνες.
Για τις περισσότερες σειρές αυτό δεν ίδιαίτερο πρόβλημα. Αν ρωτήσεις Ποιά είναι αυτή η σειρά που ο ήρωας είχε ένα άσπρο ρομποτάκι και πάλευε αγώνες τότε όλο και κάποιος θα βρεθεί να σου πεί “Ο Τζουμαρού”.
Ορισμένες σειρές όμως είναι πολύ λιγότερο γνωστές για κάποιο λόγο. Ελάχιστοι τις ηλικίας μου τα θυμούνται, και ακόμα λιγότεροι γνωρίζουν ποιές είναι.
Παραθέτω μια λίστα με κάποια απο αυτά τα παλιά παιδικά και σειρές που δυσκολεύτηκα να αναγνωρίσω.
Αυτό το παιδικό που κάτι σχέση είχε με την Αρκαδία και ταξιδεύανε σε ένα μπλέ διαστημόπλοιο που όταν κάτι πάθαινε βγαίνανε εκατοντάδες μικρά διαστημοπλοιάκια στο ίδιο σχήμα και το επισκευάζανε, και τους κυνηγούσαν οι πειρατές.
Απο τα αγαπημένα μου. Γαλλική παραγωγή με τίτλο: “Le mondes engloutis”.
Ακολουθούν οι τίτλοι εισαγωγής. Απο ότι διαβάζω τραγουδάει Αννα Βίσση. Στα γιουτούμπια κυκλοφόρεί και το ελληνικό τραγούδι των πειρατών.
Original τίτλος, “Tales of the gold monkey”. Ήμουνα κάπως μεγαλύτερος όταν έβλεπα αυτή την σειρά, αλλα δεν θυμάμαι ποιά χρονιά την έδειχνε η τηλεόραση. Θυμάμαι τον τίτλο της, και δεν ήταν ιδιαίτερα δύσκολο να την βρώ, αλλα την αναφέρω εδώ γιατί λίγοι θυμούνται αυτή την σειρά.
Φυσικά πολλά ακόμα παιδικά και σειρές λάτρεψα, αλλα είναι σαφώς ποιο εύκολο να βρει κανείς πληροφορίες για αυτά:
Αν και σπανίως βλέπω τηλεόραση, έχω δεί οτι η υπόθεση με την δολοφονία του 15χρονου Αλέξανδρου Γρηγορόπουλου έχει γίνει διεθνώς είδηση.
Δεν είχα συνειδητοποιήσει, όμως, πόσο έχει επηρεάσει την διεθνή κοινότητα μέχρι που στο community (planet βασικά) του Django είδα να ονομάζουν την νέα release του diario blogging software με τίτλο “The Alexandros Grigoropoulos’s Diary Release”
Οπως αναφέρουν στο project :
This version is a tribute to Alexandros Grigoropoulos, 15-year-old boy, libertarian, murdered by greek police in last week (2008-12-06).
Συνήθως η προγραμματιστική κοινότητα είναι πολύ απομακρυσμένη απο την πολιτική/κοινωνική επικαιρότητα, και σίγουρα αυτή η πρακτική δεν είναι κάτι συχνό.
Ενδιαφέρον…
(Βέβαια εδώ έχουν σπάσει και κάψει το σύμπαν και εγώ περιμένω ένα release άγνωστου software για να καταλάβω τι έχει γίνει? Έκαστος στο είδος του :p )
Το Django μας παρέχει (προαιρετικά) το CSRF middleware του οποίου η δουλειά είναι να αποτρέπει τις επιθέσεις CSRF. Για να το πετύχει αυτό, στα response object βρίσκει τις φόρμες με POST method και “εισάγει” ένα ακόμα κρυφό field που περιέχει ένα token μοναδικό για το session. Στα POST request επιβεβαιώνει οτι το token υπάρχει και είναι σωστό.
Όλα ωραία και καλά, αλλα αυτός ο τρόπος έχει το πρόβλημα ότι όταν θέλουμε να κάνουμε AJAX κλήσεις με POST requests δεν θα δουλέψουν γιατί το CSRF middelware δεν θα βρεί tokens.
Για να λύσω αυτό το πρόβλημα με τον πιό απλό τρόπο έφτιαξα ένα template tag που παρέχει ένα token στα template μου.
Έτσι, για παράδειγμα στο YUI όταν κάνω το request είναι κάπως έτσι:
Μιας και βασίζεται στην ύπαρξη του sessionid στο cookie, αυτό το tag δεν θα μας δώσει token όταν ο χρήστης έχει απενεργοποιήσει τα cookies (κάτι που σπάει ένα σκασμό site οπότε δεν με πολυνοιάζει) και όταν είναι το πρώτο request στο site μας. (Μπορούμε όμως να ελέγξουμε αν υπάρχει το token και να πράξουμε κατάλληλα)
fromdjango.confimportsettingsfromdjango.utils.hashcompatimportmd5_constructorimportreclassCsrfNode(template.Node):"""Tag that provides a CSRF token in the context.Usage: {% csrf_token as token %}If the user has no cookies (cookies disabled, or this isthe first ever page view on the site, this tag will providean empty token. You can test that (eg to refresh the page)"""def__init__(self,var_name):self.var_name=var_namedefrender(self,context):SESSION_COOKIE_NAME=getattr(settings,"SESSION_COOKIE_NAME","sessionid")sess_key=context['request'].COOKIES.get(SESSION_COOKIE_NAME,None)ifnotsess_key:# User has no cookie. Empty token.token=""else:val=settings.SECRET_KEY+sess_keytoken=md5_constructor(val).hexdigest()context[self.var_name]=tokenreturn''@register.tag(name='csrf_token')defdo_csrf_token(parser,token):try:tag_name,params=token.contents.split(None,1)exceptValueError:msg="%r tag requires arguments"%token.contents.split()[0]raisetemplate.TemplateSyntaxError(msg)m=re.search(r'^as (\w+)$',params)ifnotm:msg="%r tag had invalid arguments"%tag_nameraisetemplate.TemplateSyntaxError(msg)var_name=m.groups()[0]returnCsrfNode(var_name)
Στην ενασχόλησή μου με το Django έχω κάνει πολλά λάθη και έχω μάθει με τον δύσκολο τρόπο (βλέπε “χτυπάω το κεφάλι μου στον τοίχο” ). Κάνω μια προσπάθεια λοιπόν να καταγράψω μερικά χρήσιμα tips που ελπίζω να κάνουν την ζωή σας λίγο πιό εύκολη η/και να αποφύγετε τα δικά μου λάθη
Pluggables
Πλέον, υπάρχουν πάρα πολλά pluggables για Django. Πριν ξεκινήσετε να γράφετε κάποια λειτουργικότητα , κάντε μια αναζήτηση να βεβαιωθείτε οτι δεν υπάρχει ήδη κάποιο pluggable που κάνει την δουλειά που θέλετε να κάνετε. Ένα site με αρκετά καλή συλλογή απο pluggables είναι το http://djangoplugables.com/.
Ένα pluggable που θα σας βοηθήσει πάρα πολύ , ειδικά στο debugging είναι το django-command-extensions που σας δίνει κάποια υπέροχα εργαλεία για να κάνετε την ζωή σας ποιό έυκολη. Κυρίως προσφέρει νέες εντολές για το manage.py.
Για παράδειγμα σας δίνει το shell_plus που κάνει αυτόματα import όλα τα μοντέλα σας (μεγάλη ευκολία) και διάφορα άλλα. Το σημαντικότερο όμως είναι οτι εαν έχετε εγκαταστήσει το Werkzeug τότε κάνει χρήση του debugger του, και στα traceback στον browser σας δίνει ένα καταπληκτικόAJAX console debugger. Για να δείτε το werkzeug τρέχετε:
./manage.py runserver_plus
(πάντα κάνω chmod +x manage.py για ευκολία )
named urls
Τα named urls είναι μια αντιστοιχία ονόματος (python string) με ένα URL. Αυτό σημαίνει οτι στα urls.py θα προσθέτεις την name=”myname” παράμετρο. Παράδειγμα:
Προσέξετε οτι πλέον κάθε url pattern είναι το αποτέλεσμα της url() function και όχι απλά ένα tuple. Αυτό μας δίνει την δυνατότητα να χρησιμοποιήσουμε 2 πολύ σημαντικά εργαλεία. Την reverse() μέθοδο απο το django.core.urlresolvers και το {% url %} template tag. και τα 2 κάνουν την ίδια δουλειά, απλά η reverse() είναι χρήσιμη στα views (ή models) και το {%url%} στα templates. Η δουλειά τους είναι να βρούν το URL που θέλετε με βάση το όνομα (και τις παραμέτρους, αν το URL πάιρνει παραμέτρους).
Local settings
Μια ακόμα καλή πρακτική είναι που θα σας βοηθήσει πάρα πολύ στο deployment είναι να έχετε την εξής γραμμή στο τέλος του settings.py σας:
1
fromlocal_settingsimport*
και να φτιάξετε ένα local_settings.py το οποίο θα το έχετε εκτός version control και στο οποιό θα μπορείτε να κάνετε override τιις ρυθμίσεις στο settings.py. Για παράδειγμα μπορείτε να έχετε άλλα paths (πχ για MEDIA_ROOT ) , άλλες ρυθμίσεις για DATABASE, για mail servers κλπ.
Επιπλέον, στο settings.py μπορείτε να προσθέσετε το εξής στην αρχή :
Με αυτό τον τρόπο έχετε μια μεταβλητή, το PROJECT_ROOT με το PATH του project σας. Μπορείτε τα υπόλοιπα paths να τα φτιάχνετε σχετικά με αυτή την τιμή αντί να τα κάνετε hardcode στο settings.py.
Για παράδειγμα το TEMPLATE_DIRS μπορεί να είναι κάπως έτσι:
Μια πρακτική που θα σας γλιτώσει απο μπελάδες είναι να χρησιμοποιείτε την MEDIA_URL μεταβλητή στα template σας.
Μπορεί σήμερα στον developement περιβάλλον σας να έχετε το MEDIA_URL="" αλλα άυριο στο deployment το πιθανότερο είναι να θέλετε να τρέχετε ένα media.myproject.com όπου θα σερβίρει τα media.
Σε αυτή την περίπτωση τα URL που θα έχετε γράψει στα template σας θα χρειάζονται αλλαγή.
Αυτό ισχύει για αντικείμενα όπως CSS ή εικόνες που δεν τις διαχειρίζεται το Django (οχι ImageFields δηλαδή). Στην περίπτωση τον FileField/ImageField υπάρχει το ειδικό attribute url που δίνει το σωστό url λαμβάνοντας υπόψιν του την ρύθμιση MEDIA_URL. Παράδειγμα:
Για να υπάρχει το MEDIA_URL διαθέσιμο στα template σας δεν αρκεί το κλασικό Context που περνάει το Django απο τα views στα templates. Χρειάζεστε το ειδικό RequestContext (που είναι subclass του Context). Το κλασικό Context στα view είναι κάπως έτσι:
To RequestContext ουσιαστικά λαμβάνει υπόψιν του την ρύθμιση TEMPLATE_CONTEXT_PROCESSORS στο settings.py και εκτελεί κάθε context_processor. ( ένα context processor, τροποποιεί το context που πάει στo template και εκτελείται σε κάθε request. Είναι κάτι σαν middelware.)
Υπάρχουν αρκετά default context processors αλλα είναι πάρα πολύ έυκολο να γράψετε το δικό σας, αν θέλετε κάθε template να έχει έξτρα μεταβλητές στο RequestContext που λαμβάνει.
Το Excel δεν έχει φτιαχτεί απο προγραμματιστές στην Microsoft. Δεν έχει φτιαχτεί καν απο ανθρώπινα όντα. Eχει φτιαχτεί απο μαγικούς μονόκερους, καί αυτό προφανώς το γνωρίζουν όλοι εκτός απο εμένα.
Δεν εξηγείται αλλιώς γιατί όλοι πιστεύουν οτι τα πάντα γίνονται πολύ απλά με ένα “Εξελάκι”.
Κωνσταντίνε, φτιάξε ένα απλό Εξελάκι για να κρατάμε όλα τα τιμολόγια, έξοδα, επιταγές, ταμεία, πελάτες, προμηθευτές , και όλα αυτά με σύνδεση ανα Project για καταγραφή κόστους ανα project. Α, και φυσικά να είναι σε μορφή βιβλίων τρίτης κατηγορίας. Φτιάξτο μέχρι το απόγευμα. Πρέπει να οργανωθούμε.
Διότι, στο δικό μου μυαλό , αυτά θα τα έκανε το Excel (και μάλιστα έυκολα) μόνο αν είχε φτιαχτεί απο Μονόκερους στο Μαγεμένο δάσος της Enchantia.
Ασε που αν πώ οτι αυτό δεν γίνεται, η απάντηση που παίρνω είναι:
Εσυ τα λύνεις και τα δένεις αυτά τα διαόλια τα γκομπιούτερ, δεν μπορείς να φτιάξεις ένα απλό Εξέλ να κάνουμε την δουλειά μας? Αμα βαριέσαι άστο να πούμε σε κανένα άλλον που δεν βαριέται.
Εδώ και μερικές ημέρες έχω αλλάξει το software του blog μου. Το προηγούμενο software το είχα γράψει εγώ, ήταν πολύ απλό και είχα αρχίσει να θέλω features που δεν είχα χρόνο και όρεξη να γράψω. Έτσι “βγήκα στην γύρα” για αναζήτηση blogging software που θα ικανοποιούσε τις ανάγκες μου.
Το νέο software είναι το byteflow , είναι γραμμένο σε Django.
Το byteflow έχει πολλά χαρακτηριστικά, αλλα αυτά που εγώ ήθελα κυρίως είναι:
Να υποστηρίζει τουλάχιστον μια Lightweight Markup Language. Το να γράφεις τα post σε Markdown αντί για HTML είναι πολύ σημαντικό. Επίσης οι WYSIWYG editors δεν με βολεύουν γιατί βγάζουν απαράδεκτη HTML γεμάτη με HTML entities. Ειδικά στα Ελληνικά κείμενα δεν διαβάζεται η HTML.
Syntax Highlighting σε τμήματα που περιέχουν κώδικα. Το byteflow δεν υποστηρίζει ακόμα syntax highlighting αλλα είναι παρα πολύ εύκολο να προστεθεί αυτή η δυνατότητα για κείμενα με markdown σύνταξη. Το έφτιαξα μόνος μου. Θα ακολουθήσει post με λεπτομέρειες για αυτό.
Pingbacks
Πέρα απο τα features που ήταν σημαντικά για εμένα , το byteflow έχει αρκετά ακόμα features όπως:
threaded comments
Σωστή διαχείριση των χρηστών (το πρώτο comment ισούται εγγραφή, έχεις λογαριασμό, κλπ κλπ)
Υποστήριξη Gravatar
Captcha ( και ReCaptcha ) support
OpenID
Themes (Η δημιουργία theme θα πρέπει να είναι σαφώς ευκολότερη απο κάποια γνωστά PHP πακέτα αφού το Django χρησιμοποιεί μια πολύ απλή templating γλώσσα και δεν έχει PHP/SQL/HTML/Whatever ανακατεμένα σε ένα αρχείο.)
Κάνει import απο το wordpress.
Javascript preview στα comments και απάντηση στο comment που θές (απαραίτητο αφού είναι threaded τα comments)
Στα φιλτράρισμα με βάση τα tags υποστηρίζει σύνολα (intersection με + και union με το |). Για παράδειγμα, αν θέλουμε όλα τα posts που έχουν τα tags django και greek: http://kill9.eu/tag/django+greek/ , ενώ αν θέλουμε όλα τα posts που έχουν τα tags django ή greek τότε: http://kill9.eu/tag/django|greek/ Με τον ίδιο τρόπο φτιάχνουμε και feeds. Πολύ χρήσιμο feature. Κάποιος μπορεί να θέλει μόνο άρθρα σε Django που είναι γραμμένα στα Ελληνικά. Απλά ζητάει το intersection των django και greek tags.
Και άλλα πολλά όπως ένα προαιρετικό WYSIWYG editor (που μάλιστα μοιάζει ενδιαφέρον αλλα δεν πρόλαβα να τον εξερευνήσω ακόμα) , XFN , κλπ.
Αν και έγραψα scripts για να κάνω μεταφορά της database απο το παλιό στο καινούργιο, δυστυχώς τα comments δεν μπορούσα να τα μεταφέρω χωρίς να ενοχλήσω όσους είχαν σχολιάσει στο παρελθόν (μιας και είναι υποχρεωτική η εγγραφή τώρα, στέλνει email με επιβεβαίωση)
Θα προσπαθήσω να τα προσθέσω όταν κάποιος κάνει σχόλιο στο μέλλον (και φτιάξει προφίλ δηλαδή).
To byteflow αναπτύσσεται ενεργά και η εγκατάστασή του είναι εύκολη. Υπάρχουν μερικά bugs και κάποια απο τα default themes δεν δουλεύουν σωστά.
Το είπα και το έκανα.
Το source code για το gentoo-users.org είναι διαθέσιμο εδώ: http://code.google.com/p/genmap/
Έχω κάνει μια προσπάθεια να καταγράψω τα requirements. Λογικά τα περισσότερα θα υπάρχουν σε μια τυπική διανομή , εκτός ίσως απο sorld-thumbnail, django-registration και django-tagging που όλα υπάρχουν στο google code. Απλά svn checkout και python setup.py install (ή symlink το σχετικό directory στo /usr/lib/python2.5/site-packages )
Προσοχή στο checkout θα πρέπει το trunk να το μπεί σε ένα directory με το όνομα genmap
πχ: