jo-say-yan

My First (Strophe) Air App

April 20, 2009 · 1 Comment

First Attempt at writing an AIR (Adobe Integrated Runtime) application. It’s a simple chat “widget” that users install and allow to chat with “Jane”, who can be a “helpdesk” or “expert” or “customer service”. I call it “VJ”.

The environment that I chose to run it after some searching and recommendations is:

  1. Open Fire – This is really the chat server using XMPP (jabber)
  2. StropheJS – This is the XMPP JS library that I choose to use.

Setting up Open Fire

Setting up Open Fire was relatively easy. I basically followed the steps from the documentation and help from Malcom .

However 2 things complicate matters.

  1. I am running Open Fire behind a firewall so needed to set up a Reverse Proxy in order to configure it.
  2. VJ’s maybe running behind a firewall too. So Open Fire needs to be able to communicate on port 80 as well. Luckily Open Fire supports “http-bind” so I just need to set it up.

Reverse Proxy for Open Fire and HTTP-BIND

In order to configure Open Fire, I need to access the port 9090. But I can’t change the firewall. So instead, set up a Virtual Host to (Reverse) proxy it. This is also where I administer my Open Fire server.

/etc/httpd.conf


<VirtualHost openfire.mydomain.com>
ServerName openfire.mydomain.com

ServerAlias openfire.mydomain.com
ProxyRequests Off
ProxyPass / http://127.0.0.1:9090
ProxyPassReverse / http://127.0.0.1:9090
</VirtualHost>

Now I can configure Open Fire by going to http://openfire.mydomain.com/ without the 9090 port reversed proxied. example

Important (for HTTP-BIND)

Configure the Server/Domain Name to be Another sub-domain – instead of openfire.mydomain.com, use chat.mydomain.com because

  1. openfire.mydomain. com is reverse proxied for administration only and chat.mydomain.com is the server/domain of the XMPP server that clients will connect to.
  2. So chat.mydomain.com needs 5222 open for chat clients talking XMPP. But because I am behind a firewall and chat clients may also be behind a firewall, we cannot use 5222 to communicate.
  3. Luckily Open Fire has HTTP-BIND, that means it can talk HTTP that wraps the XMPP. But HTTP-BIND runs on port 7070.
  4. Since I cannot open 7070 in the firewall. I need to Reverse Proxy this as well so that clients can use a normal looking URL to talk HTTP(XMPP) to.

/etc/httpd.conf

<VirtualHost chat.mydomain.com>
ServerName chat.mydomain.com
ServerAlias chat.mydomain.com

ProxyRequests Off
ProxyPass /http-bind http://127.0.0.1:7070/http-bind/
ProxyPassReverse /http-bind http://127.0.0.1:7070/http-bind/

</VirtualHost>

SparkWeb

I need also a web chat client for JANE, the “helpdesk” agent. so I installed Spark Web. Installing it is straight forward too. download it and put it in the server.

<VirtualHost chat.mydomain.com>
...
<Directory "/usr/local/sparkweb">
AllowOverride All
Order deny,allow
</Directory>
</VirtualHost>

and edit the index.html


function jive_sparkweb_getConfig()
{
return {
server: "localhost",
connectionType: "http",
port: "80"
};
}

Now Start Coding!!

I use these for development.

  1. Eclipse IDE
  2. Aptana Studio

With the help of the samples from Aptana, I was able to get started with a chrome window for my chat widget. However, the main task for me here is to integrate with the Strophe JS.

Integrate with Strophe.js

Basically I modified echobot.js since it already provides the Login and onMessage Handler.

First include all the necessary Strophe .js files.

....
<script language='javascript' type='text/javascript' src='lib/strophejs/strophe.js'></script>
...

BOSH SERVICE (credit to Malcom)

specify the BOSH Service url

var BOSH_SERVICE = "http://chat.mydomain.com/http-bind";

Login

The login function is straight forward, except I am fixing the domain so that the client (user) need not remember it.

var DOMAIN = "chat.mydomain.com";

….

connection.connect($(‘#jid’).get(0).value + “@” + DOMAIN, $(‘#pass’).get(0).value, onConnect);

….

Send Message

  • This function just sends the message, here I pass in the elemid which is a textarea.
  • and JANE is my “helpdesk” so this widget only can only chat with her.
  • sends a .c(“body”).t(text) instead of cnode(body)
  • clears the textarea

var JANE = "Jane@chat.mydomain.com";

function sendMessage(elemid){

if (connection.connected && connection.authenticated) {
var text = $('#' + elemid).get(0).value;
if (text.length > 0) {
var from = Strophe.getNodeFromJid(connection.jid);
var to = JANE;
var reply = $msg({
to: JANE,
from: connection.jid,
type: "chat"
}).c("body").t(text);

connection.send(reply.tree());
log(text, "from");

$('#' + elemid).get(0).value = "";
}

}
else {
log("You have to log in before you can ask Jane");
}
}

Receive Message

  • This function is a registered handler when a message arrives

function onMessage(msg){
var to = msg.getAttribute('to');
var from = msg.getAttribute('from');
var type = msg.getAttribute('type');
var elems = msg.getElementsByTagName('body');


if (type == "chat" && elems.length > 0) {

var body = elems[0];
log(Strophe.getText(body), "to");
}

return true;
}


→ 1 CommentCategories: Development · System
Tagged: , ,

chmod 755 for dir 644 for files

January 16, 2009 · 2 Comments

find . -type d -print0 | xargs -0 chmod 0775 # For directories
find . -type f -print0 | xargs -0 chmod 0664 # For files

→ 2 CommentsCategories: System
Tagged:

Mac OS X defaults : Add recents to Dock nearly killed my Dock

September 17, 2008 · Leave a Comment

Nice tip from TUAW : Add recent Applications … simply

> defaults write com.apple.dock persistent-others -array-add '{ "tile-data" = { "list-type" = 1; }; "tile-type" = "recents-tile"; }'

> killall Dock

if you’ve mis-typed and the Dock would no start again you can remove this domain(com.apple.dock) and key(persistent-others) by using

> defaults delete com.apple.dock persistent-others

and redo the above…. you can also use

> defaults read com.apple.dock persistent-others

to see the current values

defaults man page and more excellent tips from MacOSXTips.co.uk

→ Leave a CommentCategories: System
Tagged: ,

mvn release:*

September 12, 2008 · Leave a Comment

I am trying to use maven release plugin to cut releases, I really like maven’s dependency management, and here’s trying to use maven to manage releases. Special thanks to John and Nick.

It’s really just 3 steps :

  1. mvn release:prepare -DdryRun=true
  2. mvn release:clean release:prepare
  3. mvn release:perform

But here are some things I learnt though…

  1. Upon release:prepare errors, use release:rollback before release:clean (wipe out all the pom.* release.properties that’s needed for release plugin)
  2. Undoing subversion changes using  svn merge -r 999:998 http://subversion/project/dir to revert back to the last working version. This is because release:prepare errors might have occurred after copy checked into subversion.

And finally, some pre-requisites :

Working copy must be SNAPSHOT

Dependencies must NOT be SNAPSHOT – to overcome this I had to  download and install a ’special version’ into your own (local) maven repository :

mvn:deploy

will deploy to my scm definition in my pom.xml

<scm>
<connection>scm:svn:http://subversion/project/dir</connection>
<developerConnection>scm:svn:http://subversion/project/dir</developerConnection>
<url>http://subversion/project/dir</url>
</scm>

and reference to it in your repository

<repository>
<id>vocanic-m2</id>
<url>http://subversion/m2/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>

Mac OS subversion 1.4.4 – use this version because on Leopard, subversion 1.5.1 has a problem and somehow can’t create tags on subversion causing the release:prepare to check in the release copy but cannot move/create a tag copy – that’s where I learn (2) above – see here also

→ Leave a CommentCategories: Development
Tagged:

Firefox autocomplete on HTML Form

September 11, 2008 · Leave a Comment

Just learn t something today…

FireFox will cache your form values when you refresh a page…. I had this problem and was causing my animation to go haywire…. if you need to turn this auto caching off you can do :


<form autocomplete="off" /> or <input ... autocomplete="off" />

→ Leave a CommentCategories: Development
Tagged: ,

Default Gateway on Ubuntu

September 11, 2008 · Leave a Comment


josh@wombat:/etc/network$ more interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

## Network interface(s)
## You should (un)comment and edit according to your needs.

# The primary network interface (dhcp)
#auto eth0
#iface eth0 inet dhcp

# The primary network interface (static IP)
auto eth0
iface eth0 inet static
address 192.168.1.45
netmask 255.255.255.0
#gateway 192.168.1.1
gateway 192.168.1.254
broadcast 192.168.1.255

→ Leave a CommentCategories: System
Tagged: ,

Blogging from iphone

August 11, 2008 · Leave a Comment

Trying out wordpress iPhone app ….. Below is a French toast from the Hong Kong cafe in Singapore!!

→ Leave a CommentCategories: Stuffs
Tagged:

Colourful PS1 that still auto wraps

July 9, 2008 · Leave a Comment

export PS1="\u@\h\[\e[1;4;33m\][LIVE]\[\e[0m\]:\W$ "

\u@\h\

  • user @ hostname

\[\e[1;4;33m\]

  • enclosing “\[" and "\]” – to /not/ confuse the screen mode so that auto wrapping is preserved.
  • “\e” – is the escape, you could use “33″ too
  • “1;4;33″ – “1″ is for “bold”, “4″ is for “underline”, and “33″ is for “yellow”, you can add background colour by adding the ascii code for background colour – just separate these numbers with “;”

\[\e[0m\]

  • 0 resets to normal display

\W

  • working directory

→ Leave a CommentCategories: System
Tagged: ,

find and delete

September 11, 2007 · Leave a Comment

find . -name ".svn" -exec rm -rf {} \;

→ Leave a CommentCategories: System
Tagged:

tar gzip several files into a single archive

September 11, 2007 · 1 Comment

from http://www.gzip.org/#faq7

for GNU tar: gtar cvzf file.tar.gz filenames
for any tar: tar cvf - filenames | gzip > file.tar.gz

→ 1 CommentCategories: System
Tagged: