Monthly Archive for 05.2005

mmCache na Home.pl

Jeśli ktokolwiek zastanawia się nad używaniem Turck mmCache, a przynajmniej jego wersji proponowanej przez Home.pl, to niech lepiej zastanowi się jeszcze kilka razy.

Problemy pierwszy raz pojawiły się jakieś pół roku temu, kiedy to przenosiłem serwis Teatru Muzycznego Capitol (ja odpowiadam tam tylko za system ekstranetowy, więc proszę mnie nie posądzać o autorstwo kodu HTML strony) na serwery Home.pl. Zwykle kod PHP szyfrujemy za pomocą ionCube, Home.pl nie udostępnia ichniego loadera, więc zmuszony byłem użyć wspieranego przez Home, darmowego mmCache.

Z początku wszystko wydawało się działać, problem pojawił się dopiero drugiego dnia, kiedy to ktoś z pracowników Teatru postanowił wygenerować sobie plik PDF z planem zajęć. Skrypt zadyszał ciężko, parsknął błędem i legł w konwulsjach cyfrowego bólu w ostatnich stadiach komputerowej agonii. Innymi słowy, nie działało. Winna okazała się biblioteka obsługi PDF, która działa doskonale, lecz tylko do momentu jej zakodowania przez mmCache.

Skończyło się więc na rozkodowaniu biblioteki, która i tak jest darmowa. Nic wielkiego. Problem powrócił jednak w lutym, kiedy to pisałem kolejne moduły dla Teatru i okazało się, że jakimś cudem encoder mmCache psuje obsługę tablic. Dynamicznie generowana tablica stringów przed zakodowaniem wyglądała tak:

array
(
	0 => "lorem",
	1 => "ipsum",
	2 => "dolor",
	3 => "sit",
	4 => "amet"
)

Po zakodowaniu zaś:

array
(
	0 => array
	(
		1 => "lorem"
	),
	1 => array
	(
		1 => "ipsum"
	),
	2 => array
	(
		1 => "dolor"
	),
	3 => array
	(
		1 => "sit"
	),
	4 => array
	(
		1 => "amet"
	)
)

Nie wiem, z czego to wynika, czy błąd leży po stronie mmCache, czy jego konkretnej konfiguracji na serwerach Home.pl. Skończyło się na przepisywaniu części kodu do postaci przewidywalnej w działaniu po potraktowaniu encoderem. Zastanówcie się więc przed używaniem tego wynalazku, tylko pamiętajcie, że ostrzegałem.

Python-DBUS do niczego

Zachciało mi się dzisiaj wygodnego powiadamiania o poczcie. Evolution udostępnia od jakiegoś czasu powiadomienia za pomocą interfejsu D-BUS, Python ma binding dla D-BUSa, czemu więc nie napisać appletu, który by słuchał tych powiadomień?

Szybko przekonałem się, że łatwo nie będzie, bo Evolution nie posiada dla interfejsu powiadomień nazwy kanonicznej. Znaczy to mniej-więcej tyle, że D-BUS przydziela mu przy każdym włączeniu programu losową nazwę postaci :X.Y (podobnie, jak X11 numeruje swoje sesje i ekrany). Nazwa oczywiście zmienia się z każdym restartem Evo.

I tu pojawia się problem: binding Pythona pozwala bardzo wygodnie obsługiwać typowe przypadki użycia D-BUSa. Innymi słowy, wszystko byłoby pięknie, gdyby dało się zrobić tak:

#!/usr/bin/python
import gtk
import dbus
import gnomeapplet
import sys

class evoNotify:
	def handleNewMail(self, int, sig, srv, pth, msg):
		self.label.set_label('new mail')
		print('test')

	def handleReadingMail(self, int, sig, srv, pth, msg):
		self.label.set_label('read mail')
		print('test')

	def __init__(self, applet):
		label = gtk.Label('test')
		self.label = label
		bus = dbus.SessionBus()
		evolution = bus.get_service(':1.0')
		ifc = evolution.get_object('/org/gnome/evolution/mail/newmail',
				'org.gnome.evolution.mail.dbus.Signal')

		applet.iface = ifc

		applet.iface.connect_to_signal('MessageReading',
				self.handleReadingMail)

		applet.iface.connect_to_signal('NewMail',
				self.handleNewMail)

		applet.add(self.label)

		applet.show_all()

def appletFactory(applet, iid):
	evoNotify(applet)
	return gtk.TRUE

gnomeapplet.bonobo_factory('OAFIID:GNOME_evoMailApplet_Factory',
		gnomeapplet.Applet.__gtype__,
		'evoMailApplet', '0.1', appletFactory)

gtk.main()

Ale nie można, bo niby skąd znać wcześniej unikalny numerek serwisu przyznany przez demona? W C można to prosto obejść, tam można posłużyć się add_match i wyłapywać wiadomości po filtrach, niezależnie od nadawców (mam wszelkie powody, żeby założyć, że właśnie tak działa dbus-monitor, ale nie chce mi się teraz sprawdzać), w Pythonie nie można, bo nie jest eksportowana taka metoda.

Póki co, oznacza to śmierć projektu. Przynajmniej do czasu, kiedy naprawione zostaną pythonowe wrappery, bo w C pisać tego nie zamierzam.