Moo-Wahnsinn
martin@pixelbox:~$ apt-get moo
1 2 3 4 5 6 7 | (__)
(oo)
/------\/
/ | ||
* /\---/\
~~ ~~
...."Have you mooed today?"...
|
martin@pixelbox:~$ aptitude moo
In diesem Programm gibt es keine Easter Eggs.
martin@pixelbox:~$ aptitude -v moo
In diesem Programm gibt es wirklich keine Easter Eggs.
martin@pixelbox:~$ aptitude -vv moo
Habe ich nicht bereits erklärt, dass es in diesem Programm keine Easter Eggs gibt?
martin@pixelbox:~$ aptitude -vvv moo
Hör auf!
martin@pixelbox:~$ aptitude -vvvv moo
Okay, wenn ich Dir ein Easter Egg gebe, wirst Du dann aufhören?
martin@pixelbox:~$ aptitude -vvvvv moo
Gut, Du hast gewonnen.
1 2 3 4 5 6 | /----\
-------/ \
/ \
/ |
-----------------/ --------\
----------------------------------------------
|
martin@pixelbox:~$ aptitude -vvvvvv moo
Was das ist? Natürlich ein Elefant, der von einer Schlange gefressen wurde.
Inhalte von Passwort-Feldern nicht wieder anzeigen
Das Passwort-Widget aus Django Newforms zeigt bei einer erneuten Ausgabe den Formulares den Inhalt wieder an. Das ist zum einen sicherheitskritisch: in einem ungünstigen Fall könnte ein Dritter die Daten des Formulares erkunden und das Passwort sehen (Der Wert eines Passwort-Feldes ist im HTML-Quelltext klar zu sehen), zum anderen soll der User sowieso beide Passwörter neu eingeben.
Als Beispiel dient dieses einfache Registrierungsformular:
1 2 3 4 5 6 7 8 9 10 11 12 13 | class RegistrationForm(forms.Form): name = forms.CharField(label='Name') password = forms.CharField(label='Passwort', widget=forms.PasswordInput) password_confirm = forms.CharField(label='Passwort (Bestätigung)', widget=forms.PasswordInput) # Prüfe hier, ob überhaupt korrekte Passwörter eingegeben wurden # def clean_password(self): # ... bspw. auf mindestens 8 Zeichen prüfen, wovon mindestens 1 Ziffer dabei ist def clean(self): if self.cleaned_data.get('password') != self.cleaned_data.get('password_confirm'): raise forms.ValidationError('Die beiden Passwörter müssen identisch sein') return self.cleaned_data |
Angenommen wir klicken einmal auf den Submit-Button so würde das Formular (da in unserem Fall die Passwörter nicht identisch sind) wieder angezeigt:
Das Passwort wird wieder angezeigt.
Das PasswordInput-Widget bietet aber eine (nicht dokumentierte?) Funktion, den Inhalt des Feldes nicht mehr, genauer gesagt: nie, anzeigen zu lassen. Füge dem Wigdet das Attribut render_value=False hinzu und das Passwort-Feld ist bei jedem Rendern des Formulares leer.
Beispiel:
1 2 3 4 5 6 | class RegistrationForm(forms.Form): name = forms.CharField(label='Name') password = forms.CharField(label='Passwort', widget=forms.PasswordInput(render_value=False)) password_confirm = forms.CharField(label='Passwort (Bestätigung)', widget=forms.PasswordInput(render_value=False)) # ... |
Mehr Mausinformationen
Wieder ein Beitrag zum Thema "Warum gibts das nicht bei Windows?": Den (Lade)Zustand der Maus konnte ich unter Windows nie sehen; auch nicht mit dem 60MB (sic!) Treiberpaket von Logitech.
Dazu muss man sich nur das Paket lomoco aus dem universe Repository installieren:
1 | sudo apt-get install lomoco |
der Rest geht automatisch.
Gnome Desktop Icons
Eines der kleinen Features die ich unter Ubuntu zu schätzen wisse ist, dass je nach Typ des angehängten Geräts/Dateisystems ein eigenes Icon auf dem Desktop landet. Unschätzbar intuitiv.
![]()
Die Icons stammen aus dem "Ubuntu Studio" Paket (ubuntustudio-icon-theme), das iPod-Icon ist von Wolfgang Bartelme.
Senfeitag 2008
Heute ist bei uns der inoffizielle Senfeitag. Ich mag die Dinger nicht, muss sie heute aber wohl doch verputzen. Bilder folgen...
Update
Unspektakulär... wie das Essen.
Templatefilter allen Templates zur Verfügung stellen
Das kennst du sicher auch. Du hast dir ein paar hübsche Templatefilter geschrieben, die du praktisch in jedem Template brauchst. Ein Markdown-Filter oder Djangos I18N-Tags währen solche Kandidaten. Nun ist es super nervig, diese Templatefilter jedem Template zur Verfügung zu stellen:
1 | {% load i18n mymarkdown imagefilter ... %} |
Was bei einer Hand voll Templates noch in Ordnung ist, artet im späteren Entwicklungsstadium zu einer Kaffee-vernichtenden {%load%}-Orgie aus. Ganz zu schweigen davon, dass sich der Templatefilter-Name auch ändern könnte.
Django bietet aber eine Möglichkeit, diese Templatetags zu den "globalen" Templatetags hinzuzufügen, sie stehen damit allen Templates sofort zur Verfügung. Füge dazu irgendwo* deinem Projektcode diesen Block hinzu:
1 2 3 4 | from django.template import add_to_builtins add_to_builtins('django.templatetags.i18n') add_to_builtins('my_project.lib.templatetags.mymarkdown') add_to_builtins('my_project.lib.templatetags.imagefilter') |
* Wenn du keine Applikation mit dem Namen »irgendwo« hast, setze diesen Codeblock in die __init__.py die den entsprechenden templatetags Ordner beinhaltet.
Danke Jannis für den Tipp.