Bored with my ISP connection issues, finally I’ve moved my blog to Slicehost and got really surprised with the fast installation. Just one minute after the registration process I was accessing to my new baked Ubuntu virtual machine. One hour after, I had my blog migrated to Slicehost. Impressive!
XMPP PubSub with ejabberd and XMPP4R
After reading “Beyond REST? Building Data Services with XMPP PubSub” and other articles about PubSub with XMPP, I decided it would be worth to test it. However, I didn’t find any complete step by step guide in how to test it with ejabberd as XMPP server and XMPP4R as XMPP client.
Below are the steps I followed to test a subscriber (user “sub”) waiting for items published to the node (”home/localhost/pub/updates”) for the publisher (user “pub”). Note you can add as many subscribers/publishers as you want.
- install ejabberd (XMPP server). I followed instructions of this article (spanish) or article (english) without any surprise.
- create two ejabberd users: “pub” (the publisher) and “sub” (the subscriber).
sudo ejabberdctl register pub localhost pub sudo ejabberdctl register sub localhost sub
- install XMPP4R Ruby gem.
sudo gem install xmpp4r - create file nodecreator.rb. See code below.
#! /usr/bin/ruby require "rubygems" require "xmpp4r" require "xmpp4r/pubsub" require "xmpp4r/pubsub/helper/servicehelper.rb" require "xmpp4r/pubsub/helper/nodebrowser.rb" require "xmpp4r/pubsub/helper/nodehelper.rb" include Jabber Jabber::debug = true service = 'pubsub.localhost' jid = 'pub@localhost/laptop' password = 'pub' client = Client.new(JID.new(jid)) client.connect client.auth(password) client.send(Jabber::Presence.new.set_type(:available)) pubsub = PubSub::ServiceHelper.new(client, service) pubsub.create_node('home/localhost/pub/') pubsub.create_node('home/localhost/pub/updates') - create file publisher.rb. See code below.
- create file subscriber.rb. See code below.
#! /usr/bin/ruby require "rubygems" require "xmpp4r" require "xmpp4r/pubsub" require "xmpp4r/pubsub/helper/servicehelper.rb" require "xmpp4r/pubsub/helper/nodebrowser.rb" require "xmpp4r/pubsub/helper/nodehelper.rb"include Jabber #Jabber::debug = true jid = 'sub@localhost/laptop' password = 'sub' node = 'home/localhost/pub/updates' service = 'pubsub.localhost' # connect XMPP client client = Client.new(JID.new(jid)) # remove "127.0.0.1" if you are not using a local ejabberd client.connect("127.0.0.1") client.auth(password) client.send(Jabber::Presence.new.set_type(:available)) sleep(1) # subscribe to the node pubsub = PubSub::ServiceHelper.new(client, service) pubsub.subscribe_to(node) subscriptions = pubsub.get_subscriptions_from_all_nodes() puts "subscriptions: #{subscriptions}\n\n" puts "events:\n" # set callback for new events pubsub.add_event_callback do |event| begin event.payload.each do |e| puts e,"----\n" end rescue puts "Error : #{$!} \n #{event}" end # infinite loop loop do sleep 1 end - run nodecreator.rb. It creates the XMPP node “home/localhost/pub/updates”. It creates first the node “home/localhost/pub” and then the “home/localhost/pub/updates”. Seems quite obvious but I spent some hours after I got it.
- check the nodes have been created. I used the discovery service functionality of Psi client.

- run subscriber.rb file. The “sub” user subscribes to the node ‘updates’ and waits for items in the “updates” node. Be aware you should close any XMPP connection with users “pub” and “sub” in case you are using any XMPP client such as Pidgin, Psi,… otherwise it won’t work.
- run publisher.rb file. It will send a message “<greetings>hello world!”</greetings> to the subscriber. Run it as many times as you want.
- If everything goes well yo will see in the subscriber screen a message like this.
subscriptions: <subscription node='home/localhost/pub/updates' jid='sub@localhost' subscription='subscribed' xmlns='http://jabber.org/protocol/pubsub'/> events: <items node='home/localhost/pub/updates'><item id='3376'><greeting>hello world!</greeting></item></items> ----
#! /usr/bin/ruby
require "rubygems"
require "xmpp4r"
require "xmpp4r/pubsub"
require "xmpp4r/pubsub/helper/servicehelper.rb"
require "xmpp4r/pubsub/helper/nodebrowser.rb"
require "xmpp4r/pubsub/helper/nodehelper.rb"
include Jabber
Jabber::debug = true
jid = 'pub@localhost/laptop'
password = 'pub'
service = 'pubsub.localhost'
node = 'home/localhost/pub/updates'
# connect XMPP client
client = Client.new(JID.new(jid))
# remove "127.0.0.1" if you are not using a local ejabberd
client.connect("127.0.0.1")
client.auth(password)
client.send(Jabber::Presence.new.set_type(:available))
# create item
pubsub = PubSub::ServiceHelper.new(client, service)
item = Jabber::PubSub::Item.new
xml = REXML::Element.new("greeting")
xml.text = 'hello world!'
item.add(xml);
# publish item
pubsub.publish_item_to(node, item)
Good Luck!
For this test, I used the following versions:
- Operating System: Ubuntu 8.04
- Ruby: 1.8.6
- XMPP4R: 0.4
- ejabberd: 1.1.4
Ubuntu 8.04 in HP Compaq 8510p laptop
I installed successfully Ubuntu 8.04 in a HP Compaq 8510p laptop. My applications at the moment are:
- text editor: vim 7.1
- web browser: Firefox 3.0.3 (webdeveloper, firebug, firecookie, YSlow, vimperator, del.icio.us)
- IM client: pidgin 2.4.1
- java editor: eclipse 3.3.2
- web server: apache2 2.2.8 (php5, “mod_ruby”)
- gnome-do (quicksilver for gnome)
- glipper (similar to klipper)
- network protocol analyzer: wireshark
- virtual machine: VirtualBox 1.5.6_OSE with Windows XP.
- oracle client: SQLDeveloper
There is still a list of issues pending to fix:
- battery life. I followed the tips (powertop, cpufrequtils, …) of this article although not sure anot the improvement.
- screen resolution. 1200×800 maximum resolution. I installed fglrx driver through envy but does not improve the resolution (1680*1050 seems the maximum, see this article).
- CD/DVD writer. brasero nor cdrecord command tool worked.
- video codecs. AVI files are reproduced very slowly.
- email client with Exchange support. Evolution does not manage properly meeting requests.
- glipper. It crashes in every start up.
- rubygems. Rubygems from repository does not work properly. You have to install it manually.
gizmo installed
I have just installed gizmo, another voIP service similar to Skype but using SIP instead, on my Ubuntu Feisty with some minor issues:
- download gizmo deb package from here
- mv ~/.asoundrc.asoundconf ~/.asoundrc.asoundconf.bak
- sudo mv /etc/asound.conf /etc/asound.conf.bak
- mv .asoundrc .asoundrc.bak
- sudo /etc/init.d/alsa-utils restart
- sudo dpkg -i ~/Desktop/gizmo-project_3.0.1.68_i386.deb
Now it’s up and running but no friend with gizmo to call!