weblog über Christian Assing und seine Interessen

CA-Networks Blog

Archives Posts

ca-net.org auf Platz 1 der Google Suche

July 15th, 2008 by chris

Yippie, mit meinem letzten Posting ueber die 3 Deskbar Plugins habe ich es jetzt bei der Google Suche auf Platz 1 geschafft. Hier der Beweis (Stand 15. July 2008):

Filed under Planet having No Comments »

Archives Posts

Tasque, Trac und Google Calendar Deskbar-Applet Plugins

July 13th, 2008 by chris

Ich benutze schon seit Jahren das Deskbar-Applet, ein kleines in Python geschriebenes Programm aehnlich dem MacOSX Quicksilver oder Gnome-Do. Durch seine hervorragende Plugin API war es mir jetzt mit sehr geringem Aufwand möglich 3 Plugins zuschreiben die ich schon immer vermisst hatte :)

Installation

Eine Deskbar Plugin Installation ist ganz einfach! Plugin unter ~/.gnome2/deskbar-applet/modules-2.20-compatible abspeichern, Deskbar restarten und das Plugin in den Deskbar Einstellungen aktiviert. Fertig!

Tasque Plugin

Novells Tasque ist ein kleines ToDo Verwaltungstool unter Linux. Es ist in einer Novell Hackweek entstanden und wird seitdem weiter entwickelt und verbessert. Es kann verschiedenste Backends als ToDo Speicher benutzen, z.B. RememberTheMilk oder den Evolution Data Server (EDS). Das Programm ist in seiner Bedienung was Tasks verwalten angeht super, aber ich vermisse globale Tastaturshortcuts für die schnelle Task Eingabe. Aber dieses Manko wird durch mein Tasque Deskbar Plugin verbessert. Dieses Plugin “redet” mit Tasque über den D-Bus und unterstützt das Anlegen eines Task in den verschiedenen vorhandenen Kategorien.

Download: Tasque Plugin

Trac Plugin

Trac ist ein Wiki und Ticketverwaltungs-Web-Applikation. Ich setze es seit der Programmierung von PyCRMan ein und es leistet mit gute Dienste :). Aber wie bei jeder Web Applikation laesst die schnelle Eingabe auch hier zuwuenschen uebrig. Daher musste ich einfach ein Deskbar Plugin dafür schreiben. Die Einstellungen (Trac URL) fuer das Plugin werden im GConf abgelegt und sind somit einfach via gconf-editor zu aendern. In einer naechsten Version gibt es vielleicht einen Einstellungsdialog ueber die Deskbar Einstellungen :) Das Plugin benoetigt das Trac XML-RPC Plugin. Es lohnt auch ein Blick auf den Source Code des Trac Deskbar Plugins, dort kann man noch ein paar Standarteinstellungen zum Ticket vornehmen.

Download: Trac Plugin

Google Calendar Plugin

Wer den Google Calendar nicht kennt ist selbst Schuld :). Es ist ein wunderschoenes Tool zur Verwaltung von Terminen und durch die Reminderfunktionen (SMS aufs Handy bei einem Termin) auch offline sehr brauchbar. Also schnell ein Deskbar Plugin geschrieben welches via python-gdata (Google Python API) einen Termin eintragen kann :) Das Plugin verwendet Googles QuickAdd Feature. Die Einstellungen werden auch hier im GConf abgelegt.

Zum Anlegen eines Termins einfach so etwas ins Deskbar reinschreiben: Daves birthday July 15 9am

Download: GCal Plugin

Archives Posts

Sony Ericsson K550i unter Linux

June 6th, 2008 by chris

Hier ein kleiner und kurzer Erfahrungsbericht zu dem Sony Ericsson K550i unter Linux.

Sync

opensync und multisync-tool über bluetooth funktionieren wunderbar, damit hab ich alle meine Kontakte mal aufgeräumt und gesynct

Fernbedienung

  • die desktop fernbedienung am handy und mein ubuntu hardy arbeiten auch super miteinander.
  • bluetooth am handy einschalten
  • hcitool scan und nach der bluetooth mac adresse suchen
 $ sudo hidd --connect HANDY_BLUETOOTH_MAC
  • am handy “ja” sagen
  • FERTIG! :)
Filed under Linux, Planet having No Comments »

Archives Posts

python elixir query optimierung

June 6th, 2008 by chris

Ich bin vor ein paar Tagen bei der Programmierung von PyCRMan fast verzweifelt. Wie ich schon in einem früheren Eintrag beschrieb, verwende ich Elixir als Wrapper für die Datenbank und mir ist aufgefallen, das Elixir bei meinen Model sehr viele DB-Queries generiert. Die Anzahl der Queries ist so hoch das die Netzwerk Latenzzeiten eine sehr große Rolle spielen :( Nach ewig langen erfolglosem Studieren der etwas dürftigen Elixir Dokumentation bin ich nachts um ca. 1 Uhr in der SQLAlchemy Dokumentation fündig geworden. Die “geheimen” Zauberwörter heißen “lazyload” und “eagerload”, wenn ich das nur vorher schon gewußt hätte ;)

Hier ein kleines Beispiel:

Als erstes mal ein kleines Model (ja das ist das Beispiel aus der Elixir Doku :) )

from elixir import *
metadata.bind = "sqlite:///:memory:"
metadata.bind.echo = True
 
class Movie(Entity):
  title = Field(String(30))
  director = ManyToOne('Director')
 
  def __repr__(self):
    return '<Movie "%s">' % (self.title)
 
class Director(Entity):
  name = Field(String(60))
  movies = OneToMany('Movie')
 
  def __repr__(self):
    return '<Director "%s">' % self.name
 
setup_all()
create_all()

Jetzt ein paar Werte einfügen:

rscott = Director(name="Ridley Scott")
glucas = Director(name="George Lucas")
unknown = Director(name="Nobody Unknown")
alien = Movie(title="Alien", director=rscott)
swars = Movie(title="Star Wars", director=glucas)
brunner = Movie(title="No Name", director=unknown)
session.flush()
session.clear()
 
for m in Movie.query.all():
  print "Movie: name=%s director=%s" % (m.title, m.director.name)

Wenn man nun auf die letzten sql queries schaut, sieht man das erst alle movies aus der DB geladen werden und dann für jeden einzelnen Film wird der Director einzeln geholt. Ha nun ist klar warum das alles so langsam geht :)

SELECT __main___movie.id AS __main___movie_id, __main___movie.title AS __main___movie_title, __main___movie.director_id AS __main___movie_director_id 
FROM __main___movie ORDER BY __main___movie.oid
[]
SELECT __main___director.id AS __main___director_id, __main___director.name AS __main___director_name 
FROM __main___director 
WHERE __main___director.id = ?
[1]
SELECT __main___director.id AS __main___director_id, __main___director.name AS __main___director_name 
FROM __main___director 
WHERE __main___director.id = ?
[2]
SELECT __main___director.id AS __main___director_id, __main___director.name AS __main___director_name 
FROM __main___director 
WHERE __main___director.id = ?
[3]

Damit aus diesen beispielhaften 4 Queries EINE wird kann man an so einer Stelle eagerload verwenden.

# import eagerload from sqlalchemy
from sqlalchemy.orm import eagerload
 
for m in Movie.query.options(eagerload("director")).all():
  print "Movie: name=%s director=%s" % (m.title, m.director.name)

Und schon ist es eine Query:

SELECT __main___movie.id AS __main___movie_id, __main___movie.title AS __main___movie_title, __main___movie.director_id AS __main___movie_director_id, __main___director_1.id AS __main___director_1_id, __main___director_1.name AS __main___director_1_name 
FROM __main___movie LEFT OUTER JOIN __main___director AS __main___director_1 ON __main___movie.director_id = __main___director_1.id ORDER BY __main___movie.oid, __main___director_1.oid

Alternativ zum “eagerload” kann man auch im Model das lazyload abschalten.

class Movie(Entity):
  title = Field(String(30))
  director = ManyToOne('Director', lazy=False) # <- lazyload now False
 
  def __repr__(self):
    return '<Movie "%s">' % (self.title)

Und wenn man mal das ganze Gegenteil braucht, kann man lazyload verwenden und im Model heißt die Option “deferred=True”.


posted with Vim

Archives Posts

schwache schlüssel unter debian und co

May 16th, 2008 by chris

zum weiterlesen: heise meldung zu schwachen schluesseln unter debian und co

Filed under Linux, Planet having No Comments »

Archives Posts

python elixir session

April 14th, 2008 by chris

Zur Zeit mache ich beim ZID mein Praxissemester, ich programmiere für uns den Python Computer Room Manager (pycrman). Dieses Projekt ist in Python geschrieben und benutzt verschiedene Python Erweiterung. Zur einer Erweiterung will ich hiermit ein bissel was schreiben :)

Elixir

Elixir ist “dünner” Wrapper für die SQLAlchemy Library. Beide zusammen vereinfachen den Umgang mit einer Datenbank in Python um ein vielfaches.

Hier ein kleines Beispiel mit 2 Tabellen:

# import elixir stuff
from elixir import *
 
# setup db connection
metadata.bind = "sqlite:///movies.sqlite"
metadata.bind.echo = True
 
# first table
class Device(Entity):
  """representation of a device
  """
  using_options(tablename='device', inheritance='multi')
 
  id = Field(Integer, primary_key=True)
  name = Field(String(127), required=True, unique=True)
  domain = Field(String(255), required=True)
  interfaces = OneToMany('Interface')
 
  def __repr__(self):
    return 'Device %s' % (self.name)
 
# second table
class Interface(Entity):
  """network interfaces
  """
  using_options(tablename='interface')
 
  id = Field(Integer, primary_key=True)
  name = Field(String(16), required=True)
  ip = Field(String(38), required=True, unique=True)
  mac = Field(String(17), unique=True)
 
  device = ManyToOne('Device')
 
  def __repr__(self):
    return '<Interface: %s ip: %s mac: %s>' % (
        self.name, self.ip, self.mac)
 
setup_all()
drop_all()
create_all()

und schon kann mal auf einfache und sehr elegante Weise diese 2 Tabellen benutzen:

# create new device object
device = Device(name="foobar")
device.domain = "test.localdomain"
 
# create new interface object
interface = Interface(name="eth0", ip="1.1.1.1")
 
# add interface object to device object
device.interfaces = [interface]
 
# store objects in db
session.flush([device, interface])
 
# query
device = Device.get_by(name="foobar")
print device

Ein schönes Beispiel gibt es auch im Elixir Tutorial.

Noch ein kleiner Beitrag zu den elixir/sqlalchemy sessions. In der Standard Einstellung sind die Elixir sessions sogenannte “scoped_session”, d.h. das jeder Thread in einer threaded Umgebung seine eigene Elixir session hat. Das hat zur folge, das wenn ein Thread ein Objekt anlegt bzw. verändert, ein anderer Thread das nicht unbedingt mit bekommt, da Elixir/SQLAlchemy die Query Resultate cached. Am besten geht man damit um das man den Cache ausschaltet:

import elixir
elixir.options_defaults['mapper_options'] = dict(always_refresh=True)

oder bei einer Query populate_existing() benutzt.


posted with Vim

Archives Posts

wordpress upgrade

April 14th, 2008 by chris

mal wieder :)

das neue wordpress 2.5 backend is echt hübsch, gefällt mir besser als das alte.

Filed under Planet having No Comments »

Archives Posts

Vimpress, publish WordPress blog posts from Vim

February 22nd, 2008 by chris

Ich habe gerade vimpress installiert. Mit diesem kleinen feinen vim plugin kann man aus dem vim heraus wordpress blog eintraege erstellen, speichern, listen und sogar wieder bearbeiten.

die kommandos sind folgende 4:

  • :BlogList Lists all articles in the blog
  • :BlogNew Opens page to write new article
  • :BlogOpen id Opens the article id for edition
  • :BlogSend Saves the article to the blog

Vielleicht schaffe ich es damit oefters ein posting zu machen ;)

Filed under Linux, Planet having 1 Comment »

Archives Posts

tribalwars

October 25th, 2007 by chris

ich hab ein cooles online stategiespiel mit suchtfaktor entdeckt, dieses nennt sich tribalwars :)

sinn des spiels isses ein dorf/dörfer auf zu bauen. dazu muss man holz, stein und eisen gewinnen. man kann truppen ausbilden und damit andere dörfer plündern in einen stamm eintreten und dessen interressen vertreten … das highlight, es gibt einen ubuntu stamm der immer größer und mächtiger wird.

das gesamte spiel is kostenlos, man kann sich aber einen premium account kaufen (kostet per month ca. 3 euro) wo die bedienung ein bissel mehr kann, aber das ist nicht nötig.

also wenn ich euch jetzt neugierig gemacht hab dann meldet euch einfach an :)

http://www.tribalwars.net/1179085.html

zum weiter nachlesen und tipps und tricks unter:

https://wiki.ubuntu.com/TribalWars

Filed under Fun, Linux, Planet, Private having 2 Comments »

Archives Posts

28 Jahre alt :)

October 4th, 2007 by chris

Da ich dieses Jahr auf einem Sonntag Geburtstag hatte habe ich einfach mit ein paar Freunden rein gefeiert. Wir waren alle, wie üblich, im Klagenfurt im LaVida unterwegs und haben uns voll und ganz dem Alkohol hingegeben. Es war eine sehr schöne Feier und ich danke hiermit alle Gästen für ihr Erscheinen und für die tollen Geschenk :)

Hier ein paar Fotos:

Geburstagsfeier 2007

PS.: An meinem eigentlichen Geburtstag, sprich an dem Sonntag, lag ich den ganzen Tag im Bett und habe mir ein paar Stargate Atlantis Folgen angeschaut. Wer mich kennt bzw. bei der Feier dabei war weiß genau warum ;)

Filed under Planet, Private having 1 Comment »

« Previous Entries