Unkillable zombie blog

This blog just won't die

Nov 09, 2008

Django tips (part 1)

Στην ενασχόλησή μου με το 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” παράμετρο. Παράδειγμα:

1
2
url(r'^tag/(?P<tagname>\w+)/$','view_profiles_for_tag',
    name='profiles-for-tag'),

Προσέξετε οτι πλέον κάθε 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
from local_settings import *

και να φτιάξετε ένα local_settings.py το οποίο θα το έχετε εκτός version control και στο οποιό θα μπορείτε να κάνετε override τιις ρυθμίσεις στο settings.py. Για παράδειγμα μπορείτε να έχετε άλλα paths (πχ για MEDIA_ROOT ) , άλλες ρυθμίσεις για DATABASE, για mail servers κλπ. Επιπλέον, στο settings.py μπορείτε να προσθέσετε το εξής στην αρχή :

1
2
import os.path
PROJECT_ROOT = os.path.normpath(os.path.dirname(__file__))

Με αυτό τον τρόπο έχετε μια μεταβλητή, το PROJECT_ROOT με το PATH του project σας. Μπορείτε τα υπόλοιπα paths να τα φτιάχνετε σχετικά με αυτή την τιμή αντί να τα κάνετε hardcode στο settings.py. Για παράδειγμα το TEMPLATE_DIRS μπορεί να είναι κάπως έτσι:

1
2
3
TEMPLATE_DIRS = (
    os.path.join(PROJECT_ROOT, 'templates'),
)

MEDIA_URL

Μια πρακτική που θα σας γλιτώσει απο μπελάδες είναι να χρησιμοποιείτε την MEDIA_URL μεταβλητή στα template σας.
Μπορεί σήμερα στον developement περιβάλλον σας να έχετε το MEDIA_URL="" αλλα άυριο στο deployment το πιθανότερο είναι να θέλετε να τρέχετε ένα media.myproject.com όπου θα σερβίρει τα media.
Σε αυτή την περίπτωση τα URL που θα έχετε γράψει στα template σας θα χρειάζονται αλλαγή.
Αυτό ισχύει για αντικείμενα όπως CSS ή εικόνες που δεν τις διαχειρίζεται το Django (οχι ImageFields δηλαδή). Στην περίπτωση τον FileField/ImageField υπάρχει το ειδικό attribute url που δίνει το σωστό url λαμβάνοντας υπόψιν του την ρύθμιση MEDIA_URL.
 Παράδειγμα:

1
<link rel="stylesheet" type="text/css" href="{{MEDIA_URL}}css/main.css" media="screen" />

RequestContext

Για να υπάρχει το MEDIA_URL διαθέσιμο στα template σας δεν αρκεί το κλασικό Context που περνάει το Django απο τα views στα templates. Χρειάζεστε το ειδικό RequestContext (που είναι subclass του Context). Το κλασικό Context στα view είναι κάπως έτσι:

1
return render_to_response('my_template.html',data_dict)

Για να περάσετε το RequestContext θα δώσετε ένα τρίτο argument στο render_to_reponse, ώς εξής:

1
2
return render_to_response('my_template.html', data_dict,
            context_instance=RequestContext(request))

To RequestContext ουσιαστικά λαμβάνει υπόψιν του την ρύθμιση TEMPLATE_CONTEXT_PROCESSORS στο settings.py και εκτελεί κάθε context_processor. ( ένα context processor, τροποποιεί το context που πάει στo template και εκτελείται σε κάθε request. Είναι κάτι σαν middelware.)
Υπάρχουν αρκετά default context processors αλλα είναι πάρα πολύ έυκολο να γράψετε το δικό σας, αν θέλετε κάθε template να έχει έξτρα μεταβλητές στο RequestContext που λαμβάνει.

posted at 18:46  ·   ·  ellak  django  tips  greek
Click to read and post comments

Nov 01, 2008

Excel has magic unicorn powers

Το Excel δεν έχει φτιαχτεί απο προγραμματιστές στην Microsoft. Δεν έχει φτιαχτεί καν απο ανθρώπινα όντα. Eχει φτιαχτεί απο μαγικούς μονόκερους, καί αυτό προφανώς το γνωρίζουν όλοι εκτός απο εμένα.

Δεν εξηγείται αλλιώς γιατί όλοι πιστεύουν οτι τα πάντα γίνονται πολύ απλά με ένα “Εξελάκι”.

Κωνσταντίνε, φτιάξε ένα απλό Εξελάκι για να κρατάμε όλα τα τιμολόγια, έξοδα, επιταγές, ταμεία, πελάτες, προμηθευτές , και όλα αυτά με σύνδεση ανα Project για καταγραφή κόστους ανα project. Α, και φυσικά να είναι σε μορφή βιβλίων τρίτης κατηγορίας. Φτιάξτο μέχρι το απόγευμα. Πρέπει να οργανωθούμε.

Διότι, στο δικό μου μυαλό , αυτά θα τα έκανε το Excel (και μάλιστα έυκολα) μόνο αν είχε φτιαχτεί απο Μονόκερους στο Μαγεμένο δάσος της Enchantia.

Ασε που αν πώ οτι αυτό δεν γίνεται, η απάντηση που παίρνω είναι:

Εσυ τα λύνεις και τα δένεις αυτά τα διαόλια τα γκομπιούτερ, δεν μπορείς να φτιάξεις ένα απλό Εξέλ να κάνουμε την δουλειά μας? Αμα βαριέσαι άστο να πούμε σε κανένα άλλον που δεν βαριέται.

I quit. Απλά λέω ναι και δεν κάνω τίποτα.

Click to read and post comments

Sep 27, 2008

Νέο software στο blog

Εδώ και μερικές ημέρες έχω αλλάξει το 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 δεν δουλεύουν σωστά.

posted at 18:20  ·   ·  blog  greek  django
Click to read and post comments

Sep 13, 2008

Διαθέσιμο και το source code για το gentoo-users.org

Το είπα και το έκανα.
Το 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
πχ:
svn 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

Sep 12, 2008

Ξεκίνημα του www.gentoo-users.org

Πριν λίγο ανέβασα το www.gentoo-user.org.
Είναι ένα google maps mashup όπου οι χρήστες της διανομής Gentoo μπορούν να γραφτούν και προσθέσουν την γεωγραφική θέση τους.

Μπορείτε να δείτε τους πλησιέστερους χρήστες σε εσάς (με χιλιομετρική απόσταση) να δείτε το προφίλ τους και γενικά είναι μια προσπάθεια να δούμε που υπάρχουν κοινότητες (η να δημιουργηθούν!).

Το site δουλέυει με Django με χρήση του contrib.gis (GeoDjango). Τρέχει στο slicehost, σε διανομή … Gentoo :p

Ελπίζω να κάνω και διαθέσιμο μέσω open source άδειας τον κώδικα σύντομα.

Click to read and post comments

Sep 04, 2008

The eagle has landed

Με 4.000 commits, 2.000 bug fixes , προσθαφαιρέσεις 350.000 γραμμών κώδικα,και 40.000 νέες γραμμές documentation το Django 1.0 είναι εδώ.
Στις πολύ σοβαρές αλλαγές σε σχέση με την προηγούμενη έκδοση (0.96.x) έχουμε:
  • Refactored ORM. Με προσθήκη inheritance, και πολλά νέα κόλπα.
  • Newforms. Το νεο σύστημα των forms που αντικαθιστά το παλαιό.
  • Νέο Admin βασισμένο στο newforms
  • GeoDjango. Το Γεωγραφικό framework για Django υπάρχει πλέον σαν contrib στο django.contrib.gis
  • Βελτιωμένη υποστήριξη unicode
  • Αυτόματο escaping στις μεταβλητές στα templates. Προσθέτει ασφάλεια σε XSS attacks.
  • Νέα διαχείριση των αρχείων (και uploads). Πλέον είναι pluggable. Θες τα uploads να πηγαίνουν απευθείας στο S3 Amazon storage? Κανένα πρόβλημα
  • Νέο django.contrib.comments. Το παλαιό έτσι και αλλιώς ήταν undocumented γιατι θα άλλαζε. Η αλλαγή έγινε και έχουμε και documentation.

Υπάρχουν πάρα πολλές αλλαγές μικρότερης εμβέλειας,πολλά bugs που φτιάχτηκαν (και ένα δικό μου :p ).
Απο τα αγαπημένα μου είναι τα named url patterns, όπου δίνεις ένα όνομα στο URL που θες και στα templates δεν κάνεις hardoced τα links αλλα τα ‘ζητάς’ με ένα ειδικό template tag {%url urlname%}. όπου urlname το όνομα του url που έχεις δώσει στο urls.py. Ετσι μπορείς να αλλάξεις όλη την δομή των URL σου χωρίς καμμία αλλαγή στην HTML σου.
Click to read and post comments

Aug 30, 2008

Τρικ στρογγυλοποίησης ακεραίων στην Python

Στην Python για στρογγυλοποίηση αριθμών υπάρχει η build-in function round().
Η round(number,[ndigits]) παίρνει ένα αριθμό και επιστρέφει ένα float αριθμό στρογγυλοποιημένο. Αν δώσουμε το όρισμα ndigits (αριθμός παλι) η στρογγυλοποίηση γίνεται στα ndigits ψηφία. Πχ.
>>> round(1.123456,3)
1.123

Ο αριθμός στρογγυλοποιήθηκε στα 3 δεκαδικά ψηφία.
Υπάρχει όμως ένα undocumented feature της round() που μπορείς να δώσεις αρνητικό ndigits όρισμα!. Τότε αντί να μετράει δεξιά απο την υποδιαστολή, μετράει αριστερά.
Παράδειγμα:
>>> round(12345.123456,-1)
12350.0
>>> round(12345.123456,-3)
12000.0

Στο documentation δεν αναφέρουν τίποτα για αυτό.
posted at 19:10  ·   ·  python  greek  cool
Click to read and post comments

Aug 22, 2008

Django trunk update

Έγινε μικρή αναβάθμιση του blog για να τρέχει με το Django trunk που περιέχει πολλές backwards-incompatible αλλαγές.
Η κυριότερη είναι οτι αφαίρεσα την εφαρμογούλα stockphoto γιατι δεν δουλέυει πια (και είναι μάλλον unmaintained για πολύ καιρό τώρα. Αυτό σημαίνει οτι λίγες φωτογραφίες που είχαν ανέβει με την χρήση του stockphoto δεν θα δουλέυουν πλέον τα links. Είναι τόσο λίγες και παλιές που δεν αξίζει να το φτιάξω.
posted at 17:27  ·   ·  django
Click to read and post comments

Aug 06, 2008

GeoDjango γίνεται merge στο Django trunk?

Πριν λίγο κάνοντας update το Django working copy μου, είδα οτι προστέθηκε ένα νέο contrib app με το όνομα gis.

Απο οτι καταλαβαίνω το GeoDjango θα γίνει merge στο Django trunk σαν contrib εφαρμογή.

 

Super-awesome!

 

ps (φτιάξανε και το ticket 7683 που με βασάνιζε )

posted at 01:01  ·   ·  django  greek
Click to read and post comments

May 07, 2008

PyMOTW and stuff

Ίσως το καλύτερο blog σχετικά με Python.

Ο Doug Hellmann έχει στο blog του μια κατηγορία που την ονομάζει PyMOTW - δηλαδή Python module of the week.

Κάθε εβδομάδα έχει ένα αναλυτικότατο, απόλυτα κατανοητό με πολλά παραδείγματα αφιέρωμα σε ένα module της Python.

Είναι must read. Ακόμα και σε modules που τα ξέρεις βλέπεις features που δεν τα γνώριζες ή νέα tricks που δεν φανταζόσουν.

Αλλα φυσικά η βιβλιοθήκη της Python είναι τεράστια (για αυτό εξάλλου έχουν σαν motto το ‘batteries included’) και τα πιό πολλά modules είναι άγνωστα (ή έχω μια ιδέα, ή τα έχω χρησιμοποιήσει λιγάκι κάποτε).

 

 

Μια και λέμε για Python,

Κάποιοι  βλαμμένοι τύποι (βλαμμένοι με την καλή έννοια) έγραψαν ένα Ruby source code σε Python bytecode compiler (και python decompiler).  Awesome. Απο ότι διαβάζω αυτό είναι εφικτό γιατί το bytecode της ruby είναι εμπνευσμένο απο αυτό της Python. Έτσι εξηγείται αυτή η φωτογραφία  του Matz (δημιουργός της Ruby)

Click to read and post comments
← Previous Next → Page 3 of 6