θέλω grep για τα dead tree βιβλία..
Εργαλείο που μου λείπει ποιό πολύ όταν διαβάζω βιβλία σε dead tree format:
grep
(και όχι, το index δεν μετράει ακόμα και όταν έχουν)
Click to read and post commentsΕργαλείο που μου λείπει ποιό πολύ όταν διαβάζω βιβλία σε dead tree format:
grep
(και όχι, το index δεν μετράει ακόμα και όταν έχουν)
Click to read and post commentsΑν και σπανίως βλέπω τηλεόραση, έχω δεί οτι η υπόθεση με την δολοφονία του 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 )
Click to read and post commentsΤο 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 είναι κάπως έτσι:
1 2 3 4 | |
Μιας και βασίζεται στην ύπαρξη του sessionid στο cookie, αυτό το tag δεν θα μας δώσει token όταν ο χρήστης έχει απενεργοποιήσει τα cookies (κάτι που σπάει ένα σκασμό site οπότε δεν με πολυνοιάζει) και όταν είναι το πρώτο request στο site μας. (Μπορούμε όμως να ελέγξουμε αν υπάρχει το token και να πράξουμε κατάλληλα)
Ορίστε και το tag:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | |
Ελπίζω να είναι bug free :p
Click to read and post commentsΣτην ενασχόλησή μου με το Django έχω κάνει πολλά λάθη και έχω μάθει με τον δύσκολο τρόπο (βλέπε “χτυπάω το κεφάλι μου στον τοίχο” ). Κάνω μια προσπάθεια λοιπόν να καταγράψω μερικά χρήσιμα tips που ελπίζω να κάνουν την ζωή σας λίγο πιό εύκολη η/και να αποφύγετε τα δικά μου λάθη
Πλέον, υπάρχουν πάρα πολλά 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 είναι μια αντιστοιχία ονόματος (python string) με ένα URL. Αυτό σημαίνει οτι στα urls.py θα προσθέτεις την name=”myname” παράμετρο. Παράδειγμα:
1 2 | |
Προσέξετε οτι πλέον κάθε url pattern είναι το αποτέλεσμα της url() function και όχι απλά ένα tuple. Αυτό μας δίνει την δυνατότητα να χρησιμοποιήσουμε 2 πολύ σημαντικά εργαλεία. Την reverse() μέθοδο απο το django.core.urlresolvers και το {% url %} template tag. και τα 2 κάνουν την ίδια δουλειά, απλά η reverse() είναι χρήσιμη στα views (ή models) και το {%url%} στα templates. Η δουλειά τους είναι να βρούν το URL που θέλετε με βάση το όνομα (και τις παραμέτρους, αν το URL πάιρνει παραμέτρους).
Μια ακόμα καλή πρακτική είναι που θα σας βοηθήσει πάρα πολύ στο deployment είναι να έχετε την εξής γραμμή στο τέλος του settings.py σας:
1 | |
και να φτιάξετε ένα local_settings.py το οποίο θα το έχετε εκτός version control και στο οποιό θα μπορείτε να κάνετε override τιις ρυθμίσεις στο settings.py. Για παράδειγμα μπορείτε να έχετε άλλα paths (πχ για MEDIA_ROOT ) , άλλες ρυθμίσεις για DATABASE, για mail servers κλπ.
Επιπλέον, στο settings.py μπορείτε να προσθέσετε το εξής στην αρχή :
1 2 | |
Με αυτό τον τρόπο έχετε μια μεταβλητή, το PROJECT_ROOT με το PATH του project σας. Μπορείτε τα υπόλοιπα paths να τα φτιάχνετε σχετικά με αυτή την τιμή αντί να τα κάνετε hardcode στο settings.py.
Για παράδειγμα το TEMPLATE_DIRS μπορεί να είναι κάπως έτσι:
1 2 3 | |
Μια πρακτική που θα σας γλιτώσει απο μπελάδες είναι να χρησιμοποιείτε την MEDIA_URL μεταβλητή στα template σας.
Μπορεί σήμερα στον developement περιβάλλον σας να έχετε το MEDIA_URL="" αλλα άυριο στο deployment το πιθανότερο είναι να θέλετε να τρέχετε ένα media.myproject.com όπου θα σερβίρει τα media.
Σε αυτή την περίπτωση τα URL που θα έχετε γράψει στα template σας θα χρειάζονται αλλαγή.
Αυτό ισχύει για αντικείμενα όπως CSS ή εικόνες που δεν τις διαχειρίζεται το Django (οχι ImageFields δηλαδή). Στην περίπτωση τον FileField/ImageField υπάρχει το ειδικό attribute url που δίνει το σωστό url λαμβάνοντας υπόψιν του την ρύθμιση MEDIA_URL.
Παράδειγμα:
1 | |
Για να υπάρχει το MEDIA_URL διαθέσιμο στα template σας δεν αρκεί το κλασικό Context που περνάει το Django απο τα views στα templates. Χρειάζεστε το ειδικό RequestContext (που είναι subclass του Context). Το κλασικό Context στα view είναι κάπως έτσι:
1 | |
Για να περάσετε το RequestContext θα δώσετε ένα τρίτο argument στο render_to_reponse, ώς εξής:
1 2 | |
To RequestContext ουσιαστικά λαμβάνει υπόψιν του την ρύθμιση TEMPLATE_CONTEXT_PROCESSORS στο settings.py και εκτελεί κάθε context_processor. ( ένα context processor, τροποποιεί το context που πάει στo template και εκτελείται σε κάθε request. Είναι κάτι σαν middelware.)
Υπάρχουν αρκετά default context processors αλλα είναι πάρα πολύ έυκολο να γράψετε το δικό σας, αν θέλετε κάθε template να έχει έξτρα μεταβλητές στο RequestContext που λαμβάνει.
Εδώ και μερικές ημέρες έχω αλλάξει το software του blog μου. Το προηγούμενο software το είχα γράψει εγώ, ήταν πολύ απλό και είχα αρχίσει να θέλω features που δεν είχα χρόνο και όρεξη να γράψω. Έτσι “βγήκα στην γύρα” για αναζήτηση blogging software που θα ικανοποιούσε τις ανάγκες μου.
Το νέο software είναι το byteflow , είναι γραμμένο σε Django. Το byteflow έχει πολλά χαρακτηριστικά, αλλα αυτά που εγώ ήθελα κυρίως είναι:
Πέρα απο τα features που ήταν σημαντικά για εμένα , το byteflow έχει αρκετά ακόμα features όπως:
Αν και έγραψα scripts για να κάνω μεταφορά της database απο το παλιό στο καινούργιο, δυστυχώς τα comments δεν μπορούσα να τα μεταφέρω χωρίς να ενοχλήσω όσους είχαν σχολιάσει στο παρελθόν (μιας και είναι υποχρεωτική η εγγραφή τώρα, στέλνει email με επιβεβαίωση) Θα προσπαθήσω να τα προσθέσω όταν κάποιος κάνει σχόλιο στο μέλλον (και φτιάξει προφίλ δηλαδή).
To byteflow αναπτύσσεται ενεργά και η εγκατάστασή του είναι εύκολη. Υπάρχουν μερικά bugs και κάποια απο τα default themes δεν δουλεύουν σωστά.
Click to read and post commentssvn checkout http://genmap.googlecode.com/svn/trunk/ genmapΒug reports are greatly appreciated. Thanx go to homunculus and Rene Jochum for their bug reports. Click to read and post comments
Πριν λίγο ανέβασα το www.gentoo-user.org.
Είναι ένα google maps mashup όπου οι χρήστες της διανομής Gentoo μπορούν να γραφτούν και προσθέσουν την γεωγραφική θέση τους.
Μπορείτε να δείτε τους πλησιέστερους χρήστες σε εσάς (με χιλιομετρική απόσταση) να δείτε το προφίλ τους και γενικά είναι μια προσπάθεια να δούμε που υπάρχουν κοινότητες (η να δημιουργηθούν!).
Το site δουλέυει με Django με χρήση του contrib.gis (GeoDjango). Τρέχει στο slicehost, σε διανομή … Gentoo :p
Ελπίζω να κάνω και διαθέσιμο μέσω open source άδειας τον κώδικα σύντομα.
Click to read and post comments>>> round(1.123456,3) 1.123Ο αριθμός στρογγυλοποιήθηκε στα 3 δεκαδικά ψηφία.
>>> round(12345.123456,-1) 12350.0 >>> round(12345.123456,-3) 12000.0
Πριν λίγο κάνοντας update το Django working copy μου, είδα οτι προστέθηκε ένα νέο contrib app με το όνομα gis.
Απο οτι καταλαβαίνω το GeoDjango θα γίνει merge στο Django trunk σαν contrib εφαρμογή.
Super-awesome!
ps (φτιάξανε και το ticket 7683 που με βασάνιζε )
Click to read and post comments