Archive

Archive for July, 2007

Emphatic Epiphany

July 19th, 2007 Senko 1 comment

Update: I’ve updated the extension to a newer version of Empathy (0.12+), you can read about it here.

There’s lots of exciting things going on in Telepathy and Empathy projects. Telepathy has been quite stable and usable for some time now, but since it’s really a backend service, it wasn’t very visible on the desktop, and the Empathy client (a fork of Gossip) is still mainly used as a standalone client.

Better way to use Empathy is actually to use the provided API and widgets and incorporate them into other applications and desktop components, so that the instant communication (both text-based and audio/video) really becomes a first-class object in GNOME and free desktops in general. There is some work already on the way – Soylent can use contact information provided by Telepathy to display information about the contacts, and there is a Google SoC project to enable Jokosher to use audio calls (using Telepathy) as Jokosher instruments.

Empathy provides a rich set of reusable components which can be used to easily incorporate im-related stuff into other application, and consists of two libraries, libempathy, which is the core API not dependant on GNOME or GTK+ (glib is required, though), and libempathy-gtk, a set of readily-available widget for things such as contact lists, account creation, chat windows, etc. Empathy is written in C, but one of the benefits of the Jokosher+Telepathy projects (which aims to reuse Empathy widgets) is that we now have Python bindings for Empathy! It’s a work in progress and some things are missing, but it is already usable.

To show how easy it is to integrate IM components into other application, and why it would be nice to do it in the first place, I’ve spent a couple of hours writing an Epiphany extension that allows the user to share the links on a web page with their IM contacts. Most of the time was spent figuring out how to make an Epiphany extension, and installing
the required Empathy libraries and bindings.

The result:

Hover over the interesting link and right click


Select one of your contacts


The contact gets the message with the link

The code for the extension is here. As you can see, the actual code for getting the contacts and initiating the chat is the smallest part of the extension :) The stuff is currently just a hack and needs to be cleaned up and properly packaged, which I do intend to do in the near future, by which time hopefully the pyempathy-gtk will be stable enough to sport real contact list chooser widgets instead of a hacked-up version I did here.

Update: I’ve confused Sabayon with Soylent. Thanks to cassidy for the correction

Categories: English Tags:

Scheme tutorial

July 6th, 2007 Senko Comments off

Pred par godina sam za neke kolege FERovce koji su me zapitkivali o programskom jeziku Lisp napisao kratki tutorial sa nekakvim osnovama (polazeći sa stajališta nekog tko zna C). Kako je moj omiljeni dijalekt LISPa Scheme, i tutorial se odnosi na taj dijalekt, iako su principi identični i za recimo Common Lisp.

Kad već imam tekst, šteta da ga ne stavim javno dostupnim na blog (bio je prije na jednoj mojoj stranici koja je sad totalno zapuštena), pa sam ga malo uredio, dodao naša slova, kvačice i kukice, i evo ga.

Da ne duljim: Scheme crash course.

Categories: Croatian Tags:

Naslovnica Widgets

July 5th, 2007 Senko Comments off

Već neko vrijeme planiram napraviti nekakve widgete za Naslovnicu, odnosno skripte/snippete čijim uključivanjem u svoje stranice bi drugi siteovi mogli jednostavno preuzimati i prikazivati vijesti s Naslovnice.

Nakon što dugo vremena nisam radio ništa povodom toga, danas sam napokon na nagovor Dade složio prvi widget.

Stvar je prilično jednostavna, dodate dvije linije na željeno mjesto u stranici, podesite parametre kako bi preuzimali one vijesti koje vas zanimaju, te dodate CSS po želji.

Primjer kako to izgleda možete vidjeti na mom blogu, detaljnije informacije o tome kako postaviti widget naveo sam u blogu Naslovnice, a za primjer CSS-a koji sam koristio za widget na svom blogu možete vidjeti ovdje (zadnjih 5 linija datoteke definira CSS za widget).

Za korištenje widgeta ne treba nikakva registracija, možete ga složiti u par minuta, pa što još čekate? ;-) Pogledajte, poigrajte se s ovime, javite što mislite…

Update: čini se da skripta ima neke probleme na IE6 (koji kaže “operation abort” nakon što su vijesti uspješno učitane i ubačene u stranicu), ali samo kad se stavi na ovaj blog – na testnoj stranici stvar radi bez problema. Kako sad bježim na godišnji, ne stignem posvetiti par sati debuggiranju, pa se nadam da će i na vašim stranicama uredno raditi. Ako i vi naiđete na probleme (ili ove ili bilo koje druge) svakako mi javite, pa kad se vratim, bacam se ukoštac s IE6. *sigh*..

Categories: Croatian Tags:

Naslovnica 101

July 4th, 2007 Senko 4 comments

…iliti kako je lako u Pythonu sakupljati stvari sa raznih izvora, koristeći dva korisna Python modula, Universal Feed Parser te Beautiful Soup HTML scraper.

Prvo, primjer RSS-a. Ovaj snippet:

  import feedparser
  f = feedparser.parse('http://blog.senko.net/feed/')
  print f['items'][0]['title'].encode('utf-8')

..će iz vašeg omiljenog RSS feeda izvući i ispisati naslov najnovijeg posta. Osim jednostavnosti, feedparser se odlikuje i robustnošću, pa tako može prežvakati različite verzije RSS i Atom feedova, a ne zbunjuju ga previše niti nepravilnosti poput ne-escapeanih & ili < znakova, što je česta boljka blogova na jednom popularnom blog servisu kod nas.

Drugi primjer je izvlačenje informacija iz neke HTML stranice. Za Naslovnicu sam scrapere pisao posebno za svaki izvor (nije neka velika znanost), ali danas sam baš naletio na zanimljiv modul, Beautiful Soup, koji dodatno olakšava tako nešto. Primjer:

  import re
  import BeautifulSoup
  import urllib

  lines = urllib.urlopen('http://www.index.hr/').readlines()
  soup = BeautifulSoup.BeautifulSoup(''.join(lines))
  links = soup.findAll(name='a', href=re.compile('.*clanak.aspx.*'))
  for l in links:
    print l.string.encode('utf-8')

Ovaj snippet će pokupiti vijesti s naslovne stranice jednog poznatog domaćeg portala, i ispisati te naslove (za oba snippeta pretpostavlja se da terminal ispravno prikazuje UTF-8 encoding).

Stvar je naprosto prelagana. Primjeri jesu trivijalni, ali dobro pokazuju kako za Python praktički sve što vam treba a da je koliko-toliko standardno (i nije specifično baš za vašu primjenu) već postoji napisano u obliku nekog modula. Predobro :)

PS. Iz teme se može zaključiti se da namjeravam uskoro pozabaviti Naslovnicom malo … već predugo nisam nikakve novotarije izvodio. Premalo vremena, pa hobi projekti pate :-(

Categories: Croatian Tags:

Hoću bazu, neću RDBMS

July 3rd, 2007 Senko 7 comments

Davno prije, u dalekoj galaksiji, ljudi su koristili dBase i u njega spremali podatke u recorde, od kojih je svaki imao nekoliko polja. Onda su se relacijske baze podataka spustile iz znanstvenih krugova k običnim smrtnicima, i oni pametniji prepoznali su da je pametnije slagati relacije između koreliranih podataka nego trpati podatke u neugodne flat liste.

Onda se web, pa nedugo zatim PHP i MySQL koji su bili toliko dobra kombinacija da je svima bilo očito da su RDBMsovi očigledan način za spremanje podataka na web servisima.

Trenutno su u modi Railsi, Django, Turbogears i tome slični web frameworci, koji se među ostalim trse i svojim ORM (Object Relational Mapper)-ima, odnosno layerima koji sjede između aplikacije i baze i pretvaraju pristupanje objektima aplikacije u SQL querye.

SQL čistunci općenito pljuju po ORMovima, zato jer mapiranje između objekata u aplikaciji i relacija nije jednoznačno, i praktički je drugačije za svaki pojedini slučaj – u praksi to znači da niti jedan ORM nije optimalan, te da ako ga se koristi na “naivan” način može se poprilično narušiti performanse sustava.

Ali, sve nekako imam osjećaj da greška u ovom slučaju nije na strani ORM-a, nego RDBMS-a kao takvog. Zašto bi morali sve podatke organizirati kao nizove n-torki kojima možemo raditi unije, presjeke i sve ostale divne stvari iz baze? RDBMS nije silver bullet. Ovisno o tipu podataka, za neke primjene je sjajan, ali za neke je jednako smislen kao i stari dBase princip recorda.

Trenutno radim na jednoj TurboGears aplikaciji, za koju moram imati neke persistentne objekte s nekim podacima. Prirodan način organizacije ovih objekata je stablo / graf, svaki objekt ima reference na mnoge druge. Optimalna organizacija ovih podataka u RDBMsu se može postići spretnom kombinacijom raznih tablica, keyeva i pametnih selectova, ali ja se ne želim zamarati SQL-om, imam objekte i želim izravno manipulirati njima. Ako iskoristim neki ORM nad recimo MySQLom, i pretvaram se da su to obični objekti, garantirano mi je da ću imati veliki overhead u SQL upitima.

Ono što bih zapravo želio je neki način serijalizacije pojedinih objekata u memoriji koji čuva reference između pojedinih objekata, ali ne forsira strukturu stabla (odnosno promjena podataka određenog objekta i njegov update na “disku” ne znači da se istovremeno moraju zapisivati i objekti koje on referencira, ako oni nisu mijenjani – pythonov shelve/pickle je blizu, ali ima problem sa ovime).

Dakle poštovano moje mnogobrojno čitateljstvo, što mislite o ovakvom pristupu, te znate li za takvu nekakvu “bazu”?

Update: Hvala na komentarima i linkovima, zahvaljujući kojima sam naišao na ZODB i Durus projekte, koji mi izgledaju obećavajuće (kako favoriziran Python programski jezik, usredotočio sam se na komponente pisane za njega, ali bilo bi zanimljivo čuti i ima li Ruby ili čak PHP neki pandan ovome).

Categories: Croatian Tags: