11. April 2012 04:50:44 / web
Mein Favorit:
=== compares values and type… except with objects, where === is only true if both operands are actually the same object! For objects, == compares both value (of every attribute) and type, which is what === does for every other type. What.
http://me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-design/
10. April 2012 07:13:07 / code
Grade brauchte ich für einen RSS Reader die Möglichkeit, längere Jobs mit Django "mal eben" asyncron auszuführen. Google sagt: Celery bzw. django-celery.
Wenn man da etwas weiter liest kommt man fast dazu direkt RabbitMQ als Broker aufzusetzen. Dabei geht der Schnellstart doch um einiges einfacher.
Installieren
pip install django-celery
Das wars schon.
Ins Projekt einbinden
Um django-celery einfach ins Projekt einzubinden und keinen externen Broker zu verwenden kann als Broker-URL django:// verwendet und die App kombo.transport.django eingebunden werden. In der settings.py/localsettings.py kommt also folgdens hinzu:
# celery
import djcelery
djcelery.setup_loader()
BROKER_URL = "django://"
INSTALLED_APPS = (
...
'djcelery',
'kombu.transport.django',
)
Danach manage.py syncdb und bei Verwendung von South auch noch manage.py migrate aufrufen.
celeryd
Den celeryd kann man mit manage.py celeryd starten, desweiteren gibt es auch noch fertige init Scripte zum starten.
Benutzen
django-celery läd automatisch alle Module namens tasks.py in den Verzeichnissen der INSTALLED_APPS. Hier kann man sich also am besten Wrapper für die Modellmethoden o.ä. machen, die man aufrufen möchte.
from celery.decorators import task
@task()
def update_feed(feed):
feed.update()
Diese Tasks werden durch den task Decorator registriert. Fehlt noch der Aufruf an der Stelle wo man die langlaufende Aktion asyncron aufrufen möchte :
from myapp.tasks import update_feed
update_feed.delay(feedobject)
Falls Fehler auftreten sieht man die nun direkt in dem Terminal in dem manage.py celeryd läuft. Mit manage.py celeryd -l debug gehts auch noch ein Loglevel tiefer.
Das reicht schon für einen Schnellstart mit Celery. Es gibt allerdings noch viele weitere möglichkeiten Tasks zu starten und Ergebnisse abzufragen.
7. April 2012 16:36:06 / code
#!/usr/bin/env python
from BeautifulSoup import BeautifulSoup
import urllib
import urllib2
import urlparse
def get_favicon(url):
f = FavIconFetcher(url)
f.fetch()
return f.as_file()
def get_favicon_url(url):
f = FavIconFetcher(url)
f._get_icon_url()
return f.as_url()
def make_url_absolute(url, netloc):
if url.startswith('/'):
return netloc+url
return url
REL_LIST = [
"shortcut",
"shortcut icon",
"icon",
]
class FavIconFetcher(object):
def __init__(self, url):
self.url = url
self.icon_url = None
self.icon_file = None
def _get_icon_url(self):
# try link rel tags
data = urllib.urlopen(self.url)
bs = BeautifulSoup(data)
for rel in REL_LIST:
try:
self.icon_url = make_url_absolute(bs(rel=rel)[0]['href'], self.url)
except IndexError:
pass #skip non-existant tags
if self.icon_url is not None:
return
# fallback to favicon.ico
self.icon_url = "http://%s/favicon.ico" % urlparse.urlparse(self.url).netloc
def fetch(self):
self._get_icon_url()
if self.icon_url is not None:
self.icon_file = urllib.urlretrieve(self.icon_url)
return
def as_file(self):
return self.icon_file is not None and self.icon_file[0] or None
def as_url(self):
return self.icon_url is not None and self.icon_url or None
if __name__ == '__main__':
import sys
try:
print get_favicon(sys.argv[1])
print get_favicon_url(sys.argv[1])
except IndexError:
print get_favicon("http://nimbostratus.de")
print get_favicon_url("http://nimbostratus.de")
28. November 2011 01:01:48 / web
Etherpad Lite
Etherpad lite is a really-real time collaborative editor spawned from the Hell fire of Etherpad. We're reusing the well tested Etherpad easysync library to make it really realtime. Etherpad Lite is based on node.js ergo is much lighter and more stable than the original Etherpad.
Im Prinzip also wie das originale Etherpad, nur dass der Server nicht in Java, sondern in node.js geschrieben ist, einer performanten Javascriptumgebung basierend auf Googles V8.
27. November 2011 16:57:48 / web
Jetzt bin ich endlich einmal dazu gekommen ein wenig zu sortieren. Es sind definitiv zu viele angefangene Projekte, und ich bin versucht schon das Nächste anzufangen. Aber jetzt wird erst einmal nacheinander weitergemacht, und was liegen bleibt bleibt halt liegen.
Dieser Blog halt, und alles was daran hängt. Wird weitergebaut wenn mal etwas anliegt, ich müsste nur mal zusehen ab und zu auch mal etwas zu schreiben und das ganze nicht gleich wieder verwaisen zu lassen.
Ist eigentlich "fertig", ein paar interessante Features fallen mir fürs erste noch ein. Zudem könnte es noch einige zusätzliche Feeds vertragen. Die werde ich bei Gelegenheit mal einbauen.
Das muss eigentlich mal über ein Wochenende soweit funktional werden dass es benutzbar ist. Dazu fehlt noch ein wenig Design, und eine Punkteabrechnung. Vielleicht werde ich über ein Adventswochenende mal dazu kommen das noch soweit anzupassen. Es währe schon schön das einfach mal zu öffnen und dann auch zu benutzen. Maps gibt es ja schon einige
Das müsste eigentlich nur einmal richtig starten, alles steht eigentlich bereit, ich glaube es fehlt ein wenig ein Modus, also eine Funktion im System die dem nächsten sagt dass es "dran" ist.
FMB läuft auch immer noch auf einem Django-Projekt was größtenteils noch der Code von Django 0.95 Zeiten ist. Es gibt viele Ideen was man noch damit anstellen kann, aber es tut auch einfach das was es soll, und solange sich da keine Notwendigkeit ergibt lasse ich es einfach so laufen wie es ist.
Am meisten stört mich an unserem Pen'n'Paper Rollenspiel dass das im Moment zwischen Wiki und App so zerrissen ist. Einige Daten im Wiki sind outdated, weil sie schon in der Datenbank stehen, vieles fehlt noch in der App. Das ganze ist eine Menge kopieren, eine Menge anpassen in der DB und dazu fehlen auch noch einige Konzepte. Naja, Tirakan gibt es jetzt seit bald 15 Jahren, und es hat auch schonmal mehrere Jahre "gelegen", so dass ich das jetzt auch erst einmal liegen lasse. Irgendwann finden sich genug Interessierte die an der Webseite weitermachen wollen und ein freies Wochenende.
Project X
Ja, auch etwas neues gibt es, aber da lasse ich mir genug Zeit überhaupt erst einmal eine Idee zum Ablauf und zum groben Layout der Anwendung zu machen.
19. Oktober 2011 02:27:48 / games
Ausgegraben aus dem alten Blog, hauptsächlich um die Gallerie hier zu testen.
Das als erstes vorgestellte Programm soll das Spiel Avanor sein, das ich vor zwei Tagen entdeckt habe, und das mir bereits einige Abendstunden gestohlen hat. Avanor ist ein Konsolenspiel der Rogue-Klasse, also im weitesten Sinne verwandt mit Nethack und ähnlichen.
Im Spiel erstellt man einen Charakter der üblichen Rollenspielklassen Mensch, Halbelf, Hochelf, Halbling, Halbork, Zweg oder Gnome, um sich dann in einer sehr
kleinen Welt zu bewegen, die eine überschaubare Zahl von Questen enthält. Trotzdem ist das Ganze nicht anspruchslos, die Quicksave Funktion ist gerade am Anfang wirklich hilfreich.
Zu der hübschen ASCII Karte gibt es dann noch ein gut zu benutzendes Charaktermanagement, bestehend aus Inventar, Fertigkeiten und Ausrüstung.
Das ganze sollte auf jedem curses-fähigen System compilierbar sein, Nach dem Build fällt nur ein Binary heraus, sämtliche Mapdaten sind hardcoded. Dafür ist der Code sehr überschaubar.
15. Oktober 2011 13:29:53 / linux
Und damit verschwindet einer der großen Kritikpunkte an Arch Linux - die fehlende Paketsignierung. Seit dieser Woche ist pacman4 in testing, und das prüft die pgp Signaturen der Pakete. Signiert wird von den TUs selbst (also praktisch wie bei Debian) und bereits seit einigen Monaten, so dass die Signaturen bei vielen Paketen bereits eingetragen sind.
Trotzdem macht derzeit noch folgendes in der /etc/pacman.conf Sinn:
SigLevel = Optional TrustAll
Zudem muss man den Keyring zunächst mit
initialisieren.
13. Oktober 2011 02:34:04 / code
Gestern gefunden, da ich was schnelles brauchte um mal eben statisch einen Report zu generieren: analog demo report.
Ist etwas schlichter als AWStats und co, lässt sich aber einfach aufrufen:
analog access.log > /var/www/.../stats.html
12. Oktober 2011 23:27:27 / web
Nachdem ich nun seit März 2008 kein Blog, ja eigentlich keine private Webseite mehr hatte gibt es hier jetzt ein Revival. Mal sehen ob es hier etwas mehr Inhalt gibt, und ob sich dies etwas länger hält.
Der letzte Blog war ein Serendipity (aka s9y) und ist noch immer unter dieser Adresse zu finden. Ich finde immer noch dass das s9y in der Welt der PHP Blogs eines der besten ist, wobei ich das schon lange nicht mehr gesehen habe. Es ist lange nicht so überfrachtet wie etwa Wordpress und hat alles was nicht direkt zum Kern gehört in Plugins ausgelagert.
Trotzdem habe ich wenig Lust auf diesem Rechner eine PHP Anwendung einzurichten, auch wenn der Apache PHP Support hat.
Nimbostratus.de ist ein bislang sehr klein gehaltenes Django Projekt. Es kann Posts in einer Liste und getrennt anzeigen, Markdown-Formatierung und pygments Syntaxhervorhebung und, äh genau, das wars. Das nächste wird dann vielleicht ein RSS Feed, aber da mir die Domain und das Projekt dazu dient alles im Netz verteilte zusammenzuziehen wird sich zeigen was das nächste ist. Mein Mercurial Server ist jedenfalls heute auch schon umgezogen :)