Jabber: Anında Mesajlaşmadan Çok Daha Fazlası

0
vst
Bir çok insan interneti aradıkları bilgiye kolaylıkla ulaş(ama)mak ve önemli bir sosyal ihtiyaç olan modern iletişim imkanlarını değerlendirmek için kullanır. Bu iletişim imkanlarının en önemlilerinden birisi de anında mesajlaşmadır (instant messaging --- IM).

İnternet kullanıcıları, IM nimetinden çeşitli platfomlar aracılığıyla faydalanmaktadır. Bunların başında gelenler ise ICQ, AIM, son günlerin modası MSN gibi programlar ve ağ mesajlaşma protokollerinin oluşturduğu platformlardır. Bu yazıda konumuz ise, özellikle ülkemizde çok da yaygın olmayan, ancak gerek kurulumu ve kullanımı gerekse sağladığı programlama avantajları nedeniyle dünyada yaygınlaşmakta olan bir teknoloji: Jabber.
Jabber bir XML akım teknolojisidir. Jabber Yazılım Derneği web sitesinden gerek platformun kendisine gerekse kullanım amaçlı bilgilere dair ayrıntılı bilgi alınabilir. Bir ``apt-get install jabber'' kadar kolay kurulumu ve bir ICQ istemci ayarı kadar kolay istemci ayarlamasıyla Jabber dünyasına çok yakınsınız.

Jabber, genellikle anında mesajlaşma amaçlı kullanılsa da, bundan çok daha fazlasını sunmaktadır. ``Benim zaten ICQ'um vardı.'' diyorsanız, hemen iştahınızı kabartacak bazı fikirler sunalım: Web sitenizle chat yapmak ister misiniz? Ya da, sunucunuzun sistem yükünü ya da hata mesajlarını sanki bir arkadaşınızmış gibi size mesaj atmasını? Jabber bizlere, esnek protokolü ve hemen hemen tüm popüler programlama dillerinde yazılmış ve özgür yazılım olarak sunulan programlama araçlarıyla, hayal sınırlarımızın genişliğince imkan tanıyor. Bu yazıda, sistem yöneticilerine ve weblog tutarlara bir kaç örnek ile pratik bir giriş amaçlıyoruz.

Jabber Sunucu
Yazımızın amacı her ne kadar Jabber sunucu kurmaya ve ayarlama yapmaya yönelik olmasa da, belitmeliyiz ki kendi bilgisayarınızda kullanmaya yönelik bir Jabber sunucu kurulumu yapmanız mümkün. http://www.jabber.org/software/servers.php adresinden indirebileceğiniz bir Jabber sunucusu ile işe başlayabilirsiniz. Aslında yazının çerçevesi açısından pek bir fark bulunmasa da ``jabberd 1.x'' sunucusunu seçip yükleyebilirsiniz. Yazı yayına hazırlanırken son stabil sürümü 1.4.3 idi. GNU/Linux dağıtımları (Redhat, Debian ve Mandrake), OpenBSD, Solaris ve Windows/XP platformlari için ikilik paketleri mevcut. Debiandaki kurulumu sonrasında en azından kendi makinenizde ayarlama yapmadan çalışabilirsiniz.

Jabber İstemci
http://www.jabber.org/software/clients.php adresinden seçip kuracağınız bir istemci işinizi görecektir. Sonuçta hepsi temelde aynı işi yapıyor. Ancak, hemen hemen diğer tüm anında mesajlaşma platformlarının da desteklendiği Gaim adlı istemciyi şiddetle tavsiye ediyoruz. Aynı anda hem ICQ hem AIM hem MSN hem de Jabber hesaplarını tek bir programda toplamak isteyenler için çok ideal.

Jabber Hesabı Açma
Gaim kullandığınızı ve "localhost" isimli kendi bilgisayarınızda çalışmakta olan Jabber sunucunuz olduğunu varsayarak iki Jabber hesabı açacağız. Eğer kendiniz bir Jabber sunucu kurmadıysanız, tüm ``localhost'' ifadelerinin yerine ``jabber.org'' yazabilirsiniz. Zira, en çok kullanıcı barındıran Jabber sunucu budur.

Gaim'de Tools->Accounts sekmesi üzerinden açılan pencereden ``Add'' tuşuna basın. Yeni açılan pencereden protokolü Jabber olarak seçin. ``Screen Name'' alanına seçeceğiniz bir kullanıcı adı girin, biz ``slartibartfast'' diyelim mesela. ``Server'' alanına ``localhost'' yazın ve ``Register'' tuşuna tıklayın. Yeni açılan pencerede şifre, isim ve email sorulacak. Bunları da doldurduktan sonra tekrar ``Register'' tuşuna tıklayın. Evet, artık bir Jabber hesabınız var. Aynı işlemleri tekrarlayarak bir tane de ``cmsbot'' isimli hesap yaratalım. Ardından bu iki kullanıcı için de online konumuna geçelim ve birbirlerini listelere alalım.

Programlama Araçları
Eğer iki kullanıcı hesabımızı birbirleriyle mesajlaştırabiliyorsak işin en heyecanlı kısmına geldik sayılır. ``cmsbot'' kullanıcısından çıkalım. Çünkü bu kullanıcıyı programımızı yazarken kullanacağız.

Programlama araçları, yani kütüphaneler, http://www.jabber.org/software/libraries.php adresinde erişime hazır. Biz, yazı çerçevesince Ruby programlama dili için tasarlanmış ``Jabber4R'' ve Python programlama dili için tasarlanmış ``jabber.py'' kütüphanelerini kullanacağız. Siz daha sonra ihtiyaçlarınıza göre farklı diller için yazılmış kütüphaneleri de kullanabilirsiniz; mesela PHP için ``PHPJabberClass'' gibi.

Ruby ve Sistem Yöneticileri
Ruby programlama dili, GPL olarak dağıtılan, nesne yönelimli ve sitesinde de belirtildiği gibi gerçek bir programcı dostu dildir. Vesile ile Ruby'yi methedip, ufak da olsa motivasyon babında bir giriş yapalım. http://www.ruby-lang.org adresinden dile ait dökümantasyon ve yorumlayıcılar indirilip incelenebilir. Jabber ile ilk deneyimimizi sistem yöneticileri tarafından çok kullanışlı bulunabilecek bir fikir üzerinde edinelim: Sistem her 10 saniyede bir, sistem yükünü ve ayakta olduğu süreyi bize arkadaşımızdan mesaj geliyormuş gibi göndersin. Bu kod parçası için önceden belirttiğimiz gibi ``Jabber4R'' kütüphanesine ihtiyacımız var. Ruby yorumlayıcısını ve kütüphaneyi kurduğunuzu varsayıyoruz. Şimdi sistem.rb isimli bir dosya açalım ve aşağıdaki kod parçasını yazalım:

require 'jabber4r/jabber4r.rb'
$status = {}
session = Jabber::Session.bind_digest("cmsbot@localhost/uptime", "jaberpass")
session.announce_initial_presence
session.add_message_listener{ |msg|
	if (msg.body.include? "basla")
		value = msg.body.split[1]
		$status[msg.from.to_s] = "running"
		t = Thread.new { 
			while $status[msg.from.to_s] == "running" 
				data = `uptime`.split[7] 
				if (data.to_f >= value.to_f) 
					reply = Jabber::Protocol::Message.new(nil) 
					reply.to = msg.from 
					reply.thread = msg.thread 
					reply.type = msg.type 
					reply.set_body(`uptime`) 
					reply.set_subject("your uptime request") 
					session.connection.send(reply) 
			end 
			sleep 10 
		end 
	} 
	elsif (msg.body.include? "dur") 
		$status[msg.from.to_s] = "stop" 
	end 
}
Thread.stop
Bu dosyayı Ruby yorumlayıcısıyla çalıştırabilirsiniz (``ruby sistem.rb'' demeniz yeterli). Umarız her şey yolundadır. Program çalışmaya başladıktan sonra, ``cmsbot@localhost'' isimli kullanıcıya ``basla'' mesajını gönderin. ``cmsbot'' isimli arkadaşınız, size, çalıştığı makinanın anlık sistem yükü bilgilerini ve ayakta kalma süresini postalayacaktır. Kodun üzerinden şöyle bir geçelim. Aynen, bir soket bağlantısı yapıyormuş gibi, session = Jabber::Session.bind_digest("cmsbot@localhost/uptime", "jaberpass") satırıyla Jabber sunucuya bağlantı yapıyoruz. Hemen ardından session.announce_initial_presence diyerek ``roster''ımızdaki, yani kullanıcı listemizdeki tüm kişilere hatta olduğumuzu bildiriyoruz. Daha sonra da, herhangi bir mesaj gelmesi durumuna karşılık, session.add_message_listener{ |msg| ...(aksiyon)...} komutuyla bir aksiyon belirliyoruz. Aksiyonumuz şundan ibaret: Eğer mesajın içeriği ``basla'' ise, ``running'' konumuna geç ve running konumu süresince de mesajı gönderen kişiye her 10 saniyede bir ``uptime'' sistem komutunun sonucunu gönder. Eğer, mesaj içeriği ``dur'' ise, ``running'' konumundan çıkıp, ``stop'' konumuna geç. ``Thread'' komutu ise birden fazla isteğe cevap verebilmek için kullanılıyor.

Bunun ötesinde neler yapılabilir? Sistem yöneticisinin ihtiyaçları doğrultusunda ve yaratıcılık sınırları dahilinde hemen herşey.

Python ve Web Geliştirme
Günümüzde bir çok web içerik yönetim paketi kullanılıyor. Büyük çoğunluğunda, web sitesi sahibi, web üzerinden erişilen bir arayüz aracılığıyla sitesine içerik ekliyor ya da içeriği değiştiriyor. En çok ihtiyaç duyulan şeylerin başında da haber ve bloglar geliyor.

Bu ihtiyacı karşılamanın nasıl daha kolay ve eğlenceli bir yolu olabilir? Mesela anında mesajlaşma yöntemi gibi? Arkadaşlarızla mesajlaştığınız bir program aracılığıyla web sitenizin içeriğine müdahale etmek gibi? Deneyelim, görelim...

Bu sefer Python kullanacağız. Yine Ruby gibi, hızla büyüyen geliştirici topluluğu, öğrenme kolaylığı ve geliştirme zamanını ciddi oranda azaltan özellikleriyle Python geleceğin dillerinden belki de en önemlilerinden. GPL uyumlu lisansı da kendisine olan ilgimizi arttırıyor.

Python kütüphanelerinden ``jabber.py'' internetten indirilebilir. Paketin içerisinden çıkan 3 dosya önemli: jabber.py, debug.py, xmlstream.py. Bu kütüphane dışında ``xmlrpclib'' kütüphanesine de ihtiyacımız var. Bu üç dosyayı kopyaladığımız yerde çalışacağız.

Öncelikle, bir echo sunucu yaratalım. Bizim ona gönderdiğimiz tüm mesajları bize geri atsın. echo.py isimli bir dosya yaratalım ve içerisini aşağıdaki gibi dzenleyelim.

import jabber
import xmlrpclib
import sys

def messageReceived(con, msg):
	con.send(jabber.Message(str(msg.getFrom()), "Echo: " + msg.getBody()))

try:
	con = jabber.Client(host = "localhost", log = sys.stderr)
	con.connect()
except:
	sys.exit(0)

if(not con.auth("cmsbot", "jabberpass", "echo sunucu")):
	sys.exit(1)

con.sendInitPresence()
con.registerHandler("message", messageReceived)
while(True):
	con.process(1) 
con = jabber.Client(host = "localhost", log = sys.stderr) satırıyla Jabber istemci nesnemizi ilklendiriyoruz ve con.connect() satırıyla da bağlantıyı gerçekleştiriyoruz. Bağlantı gerçekleştikten sonra da con.auth("cmsbot", "jabberpass", "echo sunucu") komutuyla onay alıyoruz. Hata durumunda da program sys.exit() komutuyla sonlandırılıyor. Bu işlemlerin hepsini Rubyde session = Jabber::Session.bind_digest("cmsbot@localhost/uptime", "jaberpass") komutu ile yapmıştık. Daha sonra, con.sendInitPresence() komutuyla listedeki kullanıcılara hatta olduğumuzu söylüyoruz. Bunun ardından con.registerHandler("message", messageReceived) komutu aracılığıyla da, herhangi bir mesaj gelmesi durumunda hangi fonksiyonun çalışacağını bildiriyoruz. Bizim örneğimizde ``messageReceived'' fonksiyonu çalışacak. İş bitti sayılır. En başta tanımladığımız ``messageRecevied'' fonksiyonu da papağan görevini üstleniyor. Kim bize ne söylediyse, biz de ona aynısını söylüyoruz: con.send(jabber.Message(str(msg.getFrom()), "Echo: " + msg.getBody()))

Şimdi ``python echo.py'' diyerek programımızı çalıştıralım. Evet, gönderdiğiniz her mesajı, sanki ilkokulda bizi sinir etmek için her dediğimizi tekrarlayan arkadaşlarımız gibi bize tekrar eden bir program arkadaşımız var. Aslında onu biz programladığımıza göre, ne istersek onu yaptırabiliriz. Ne gibi? Mesela, her gönderdiğimiz mesajı websitemizdeki bir dosyanın sonuna ekleyerek ziyaretçilerin anlık gönderdiğimiz mesajları izlemesine imkan tanımak gibi; bir nevi blog.

Yapacağımız tek bir şey var: messageReceived() fonksiyonunu istediğimiz doğrultuda yani aşağıdaki gibi değiştirmek.

def messageReceived(con, msg):
	file = open("/var/www/html/blog.html", "a")
	content = "<p><b>%s</b></p> <p><b>Posted by %s</b></p>
<p>%s</p>"% (msg.getTimestamp(), msg.getFrom(), msg.getBody())
	file.write(content)
	file.close
Hepsi bu! Biz ona her mesaj gönderdiğimizde, programımız, web sunucumuzun gördüğü ve dosya işlemeye iznimizin olduğu bir klasördeki blog.html isimli bir dosyaya mesajı ekliyor.

Bitirirken
Bu örnekler, daha genişletilebilir ve güvenliği arttırılması gereken betiklerden oluşuyor. Genişletmekten kastımız ne? Örneğin, Python ile MySQL veritabanına erişmek ve yazmak çok kolay. Blog örneğimizi bu şekilde değiştirebiliriz. Üstelik, blog örneğinin web sunucusu tarafında da ``PHPJabberClass'' kullanarak gönderdiğiniz blog girişlerine gelen ziyaretçi yorumlarını onaylama işlemini anında yapabilirsiniz. Böylece istenmeyecek yorumları engellemiş olursunuz. Bu arada unutulmaması gereken nokta; prensipte, Gaim programı da ICQ da bizim bu sayfalarda yaptığımızdan çok farklı şeyler yapmıyorlar. Sonuçta, ihtiyacınıza yönelik bir Jabber istemcisi yazmak elinizde. Mesela, ``Subject'' alanına ihtiyac duyuyor ve resim dosyası gibi bir ikilik dosya göndermek istiyorsanız, istemciyi de kendiniz yazabilirsiniz. Böylece tam anlamıyla bir içerik yönetim platformunun yaratıcısı olmuş olursunuz. Çok daha farklı bir uygulama imkanı daha; istatistiki ve matematiksel hesaplamada faydalı olabilir: siz kodu ya da veriyi yazıp gönderin, programınız da bulunduğu yerde kodu ya da veriyi yorumlasın ve sonucunu size göndersin. Son bir not: bir Jabber sunucunuz varsa, bu sunucuyu diğer tüm anında mesajlaşma protokolleriyle haberleştirme imkanınız da var (bknz: http://www.jabber.org/software/components.php). Daha önce de dediğimiz gibi, aslında yaratıcılığımız el verdiğince Jabber dünyasından dilediğimizce faydalanabiliriz.

Jabber bir XML akım teknolojisidir. RPC kullanarak programlanıyor. Jabber protokolünü kendi kendinize uygulama imkanına da sahipsiniz. Çok daha gelişmiş, ticari ve düşük seviyeli programlama işlerini yapmanıza da olanak tanıyan bu protokol, sağladığı çalışma çerçevesi ile gerçekten iyi bir programlama aracı. Az uğraş ile çok işler yapabileceğimiz şeyler aramıyor muyduk?

Mutlu ve Jabberli günler!

[1] http://www.jabber.org
[2] Dr. Dobbs Journal, Mart 2004
[3] http://jabberpy.sourceforge.net
[4] http://jabber4r.rubyforge.org

Vehbi Sinan Tunalıoğlu

Görüşler

0
T-u-N-i-X
Süper bir yazı olmuş, elinize sağlık..!
0
FZ
Son zamanlarda FM sitesinde gördüğüm en güzel teknik yazılardan biri.

Çoğu kişinin basit bir anında mesajlaşma (IM) sistemi gibi gördüğü Jabber'ı Ruby ve Phyton gibi modern, kullanışlı ve rahat diller ile ne kadar yaratıcı ve farklı şekillerde programlayabileceğimize dair örnekler verdiğin için çok teşekkür ederim!

0
eoy
Daha bugün okuldan çıktığımızda birkaç arkadaşımla jabber sunucusu kurmakla ilgili konuşmuştuk, üstüne çok güzel geldi.
Ellerinize sağlık, güzel, açıklayıcı, ufuk açıcı bir yazıydı.
İyi çalışmalar.
0
tongucyumruk
Uzun zamandır şu Python-Jabber ilişkisine bir el atayım diyordum. Çok güzel bir mazeret oldu bu yazı. Sanırım artık yönettiğim sunucuları daha yakından takip edebileceğim.

Bu aralar python xml/xslt ilişkisini irdelemek amacıyla ufak bir blog uygulaması yazayım diyordum, blog'a yazı göndermek için jabber oldukça enteresan bir yöntem olabilir. Aslında ben e-posta düşünüyordum ama böylesi daha iyi gibi...
0
vst
E-posta kullanarak yapacağınız uygulamayı yanılmıyorsam FZ'den duymuştum. Çok verimli bir yöntem diye düşünmüştüm. Açıkçası yazıyı hazırlarken de blog fikrinizden esinlenmiştim. E-posta, yaygın kullanılan bir araç olarak çok avantajlı. Fakat, makinaya fazladan admin yükü getirecek bir uygulama yönü var. Jabber uygulamasında ise, istemcilerin sayfayı çağırmasıyla ya da CRON gibi bir zamanlayıcı ile tetiklenecek bir mesaj alımı sunucu tarafında daha az "overhead" meydana getirir diye düşünüyorum. Mesaj gönderimi için ise, Jabber e-posta'ya nazaran yine de daha şık bir yöntem gibi duruyor ;)
0
bahadirkandemir
Python ve JavaScript ile geliştirdiğim blog'uma Jabber desteği vermek zevkli olacak :)
0
lifesdkver0_1
yazı pek güzel, velakin hiç bir referans verilmemiş. misal ruby ile ilgili örnek ddj mart 2004'den: http://blog.csdn.net/jiangtao/archive/2004/04/08/268.aspx
0
butch
Yazarın bir hatası yok. Ben bir düzeltme yaparken silmişim. Tekrar ekledi.
0
zentoo
Fikrinize sağlık, çok güzel makale. :-]

Lisede bile sizi tekrar eden papağanlar vardı. :-/
0
T-u-N-i-X
Çok afedersiniz ama ufak bir sorum olacak.. Jabber'ın sunucuları kişiye özel mi ? Yani ICQ veya MSN gibi merkezi bir sunucu değil de herşeyin kendi bir sunucusu mu var ? Yani mesela Uludağ'ın üzerinde bir Jabber sunucusu var. Ona bağlanarak ana sunucuya mı bağlanmış olurum yoksa yalnızca Uludağ'ın kendi sunucusuna mı ?

Bunu söylememin nedeni mesela bir sayfada bir kişinin Jabber adresini gördüm ve eklemek istiyorum..? Eğer sunucular ayrıysa o kullanıcıyı ekleyememiş olacağım çünkü..
0
FZ
Uzun zamandır Jabber ile uğraşmıyorum ama bir "educated guess" yapayım (ne diyeceğiz buna Türkçe?)

Jabber istemcinize falacan@filancaserver.org gibi bir Jabber kontağı eklediğinizde sonuç itibari ile bu istemcinin orası ile temas kurması ile alakalı değil mi? Yani falacan@filancaserver.org benim Jabber sunucumdadır, filanca@hedehodo.org baska bir sunucudadır, vs. vs. Bu niye problem doğursun? Ben mi yanlış hatırlıyorum yoksa son baktığımda kullandığım Jabber istemcileri belli bir sunucuya bağlanıyor ve fakat farklı farklı Jabber sunuculardaki insanlarla iletişim kurmama da izin veriyorlar mıydı?
0
tongucyumruk
educated guess = destekli atmak?

Jabber sistemi relay tarzı bir mantıkla çalışıyor. E-posta veya IRC ağlarında olduğu gibi... Nasılki siz Freenode ağındaki herhangi bir sunucuya bağlandığınızda diğer freenode sunucularındaki insanlarla konuşabiliyorsanız, veya nasıl ki ali@himini.com adresinden veli@hobarak.org adresine e-posta yollayabiliyorsanız Jabber'da aynı mantıkla çalışıyor. Yani ICQ veya MSN'de olduğu gibi merkezi bir sunucu yok...
0
demolish
ha şimdi bende bunu yazacaktım.

educated guess : destekli atış
non-educated guess : işkembeden atış
0
FZ
Sağolasın :)
0
arsenelupin
ICQ üstüne bir
Görüş belirtmek için giriş yapın...

İlgili Yazılar

Bir saldırının anatomisi: Fazlamesai

sundance

28 Temmuz 2006 sıradan bir gün olarak başlamıştı. Normal iş temposunda giderken saat 11 civarında cep telefonum çaldı. Açtım, konuşma şu şekilde gerçekleşti:

-Kıvılcım Bey mi?
-Evet?
-Merhaba Kıvılcım Bey, benim adım ... sitenizdeki bir açıkla ilgili bilgi vermek için aramıştım.
-Hımm, dinliyorum.
-Bir e-mail ya da msn alabilir miyim, oraya yollayayım açıklamayı.
-Tamam, e-mail ...de ...

Garip Ama Gerçek

redogre

Beni Bul Bebek

redial

Bebek bir yapay zeka programıydı...
Mehmet Emin Arı'nın yeni bir hikayesi...
turk.internet.com ' dan okuyabilirsiniz

Büyük Oto Soygunu

redogre

2000lerde Müzik Kalitesi ve Yüksek Ses Savaşları

FZ

Matematikçi, müzisyen ve yazılım geliştirme uzmanı bir dostumdan önemli bir konuya dikkat çeken ilginç bir e-posta alınca tüm müziksever FM üyeleri ile paylaşmadan edemedim:

"Emre kadresim,

Yeni yılın kutlu olsun.