Category Archives: tech

JSSh for Firefox on Linux (because Firewatir loves it)

It goes like this: Firewatir, the Firefox port of WATIR, depends on JSSh. And JSSh does not install & run nicely on Linux. Clear ?
Annoyed by this situation, I looked what’s the problem with this JSSh. To make the story short, success – downlaod the working JSSh for Linux here.
Update 2007-04-11: modified to work also with FF 1.5.3+

Oh, by the way, JSSh stands for JavaScript Shell and it allows you remotely manipulate Firefox remotely. Firewatir gives you a higher-level toolkit for “Web Application Testing in Ruby” (of course not Web scraping ;>>> ). Talking about it let me show how to install the whole thing:

(0. I would recommand to create a dedicated Firefox profile run Firefox in a dedicated profile firefox -ProfileManager)

1. Downlaod and install JSSh extension to Firefox and restart it.

2. Start Firefox:
firefox -P testyard -jssh

The JSSh should be up, listening on port 9997 (note: consider security issues). You should be able to communicate with Firefox via telnet. For example:

>telnet localhost 9997
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Welcome to the Mozilla JavaScript Shell!
> 1+1
2
> help()
....
> exit()

3. Dowload firewatir (you have to do it from its homepage, it is not on rubyforge yet). Use the mswin32 version, although you are on Linux. Install:
sudo gem install firewatir-1.0.1-mswin32.gem

3. Get to the real ruby test. For example:

require 'rubygems'
require 'firewatir'
include FireWatir

ff=Firefox.new
ff.goto("http://www.google.com/ncr")
ff.text_field(:name,"q").set("ruby")
ff.button(:value,"Google Search").click
puts ff.element_by_xpath("//a[@class='l']").text
ff.close

PS: For those interested in what did I fix: I took one of the latest builds from Dave, repackaged it so that it installs “properly” – as an extension of “21st century” – and added the config GUI shipped originally with the JSSh. It was tested with FF 2.0.0.1 on Ubuntu (Eft), Kubuntu, Gentoo. Update: tested also on FF 1.5(.0.7)

Subversion: move, migrate, split

Common problems: a repository in on server A and needs to be migrated onto server B; a single repository needs to be spit into few separate ones; what to do with local working copies after server migration; the repository storage method needs to be changes e.g. from berkleyDB to file-system.

In some simple cases the repository can be moved directly on file system level. However, the following steps describes a more complex case, in a generally applicable way: a migration and split of repositories from one server to another, fixing the local working copies. Assume this situation:

ServerA, repository: projects  path: /proj1
                            path: /proj2

->

ServerB: repository: proj1     path: /
ServerB: repository: proj2     path: /

For example: https://svn.server.com/projects/proj1 -> https://mysvn.com/proj1

1. Export the repository on ServerA
svnadmin dump /path/to/repos/projects > projects.dump

2. Split / filter out repositories
svndumpfilter include proj1 < projects.dump > proj1.dump
svndumpfilter include proj2 < projects.dump > proj2.dump

3. Fix the paths
As the dump is in a text format you can easily edit it to change prune the projects root directory. You do it:

  1. by renaming the paths:
    sed -e "s/Node-path: projects//Node-path: /" < proj1.dump > proj1-fixed.dump
    The same for proj2.dump
  2. and removing the section that creates the root directory, i.e. delete the following lines form somewhere at the beginning of both dumps proj1-fix.dump and proj2-fix.dump:
    Node-path: projects
    Node-action: add
    Node-kind: dir
    Prop-content-length: 10
    Content-length: 10

    PROPS-END

4. Import the repositories on Server
Create a new repository for each project and import the dumps. (A detailed description of how to setup a Subversion (and friends) is in my previous post)

svnadmin create /path/to/repos/proj1
svnadmin load /path/to/repos/proj1 < proj1-fixed.dump

Do it analogically also for proj2.

Done
Happy checkout :) After migration you'd rather check/modify/recreate the hooks, users for authentication (if you used some of those). And again, read the official SVNBook for details.

Fixing existing working copies
If you don't want to checkout but rather continue using existing working copies you can (cannot be done in case of some repository splits).

First of all, use --force-uuid option for svnadmin load (step 4). Then you can tweak the local copy by running (in the root of the local repo):
svn switch --relocate http://ServerA/testproject https://ServerB/project .

Installation of Subversion on Ubuntu, with Apache, SSL, and BasicAuth.

I did it again! Yet another installation of Subversion for “standard” project development purposes, i.e. using Apache2, WebDAV, SSL, Basic Authentication. In case I do it again … and soon again, I recorded the installation howto logs.

NOTE: The target OS is Ubuntu Edgy 6.10, and Feisty. I use $NAME notation to refer to places to be substituted by the installation specific values

1. Install packages:
sudo apt-get install subversion libapache2-svn libapache-mod-dav apache2

2. Enable SSL:
sudo a2enmod ssl
sudo sh -c "echo 'Listen 443' >> /etc/apache2/ports.conf"

3. Generate Certificate:
Ubuntu < Feisty:
sudo apache2-ssl-certificate
Use the server name to be used for access the web server.

Ubuntu >= Feisty: (thanx Roderik)
sudo apt-get install ssl-cert
sudo mkdir /etc/apache2/ssl
sudo /usr/sbin/make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /etc/apache2/ssl/apache.pem

4. Create Virtual Host:
sudo cp /etc/apache2/sites-available/default /etc/apache2/sites-available/$SITENAME
sudo vim /etc/apache2/sites-available/$SITENAME

change:
NameVirtualHost *:443
<VirtualHost *:443>

add:
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/apache.pem
SSLProtocol all
SSLCipherSuite HIGH:MEDIUM

5. Enable the site:
sudo a2ensite $SITENAME
sudo /etc/init.d/apache2 restart

A warning that complaints about failure of server name determination can be fixed by adding ServerName $SERVERNAME to the main Apache config /etc/apache2/apache2.conf

6. Adding repository(ies):
The following setup assumes we want to host multiple repositories.
sudo mkdir /var/svn
sudo svnadmin create /var/svn/$REPOS
sudo chown -R www-data:www-data /var/svn/$REPOS
sudo chmod -R g+ws /var/svn/$REPOS

7. Adding Basic Authentication:
sudo htpasswd2 -c -m /etc/apache2/dav_svn.passwd $AUTH_USER

8. Enable and configure WebDAV and SVN:
Add to /etc/apache2/mods-available/dav_svn.conf
DAV svn
SVNParentPath /var/svn
AuthType Basic
AuthName "Subversion Repository"
AuthUserFile /etc/apache2/dav_svn.passwd
Require valid-user
SSLRequireSSL

and for non-anonymous access comment out:
#<LimitExcept GET PROPFIND OPTIONS REPORT>
#</LimitExcept>

(optionally the same configuration can be set for particular virtual host only, i.e. /etc/apache2/sites-available/$SITENAME)

9. Finalization: (guess what?)
sudo /etc/init.d/apache2 restart

Testing:
Web access:
lynx https://localhost/svn/$REPOS exposes the repository.
lynx http://localhost/svn/$REPOS says: eat my shorts , i.e. 403-forbidden.

An initial import:
svn import --username $AUTH_USER $A_FILE https://localhost/svn/$REPOS/testdir -m "Testing"

… and check-out:
svn co --username $AUTH_USER https://localhost/svn/$REPOS

To add a new repository just repeat the step 6 (without making the root directory of course).
If you wish to configure a single repository only, instead of point 6:
sudo svnadmin create /var/svn
sudo chown -R www-data:www-data /var/svn
sudo chmod -R g+ws /var/svn

and in /etc/apache2/mods-available/dav_svn.conf (step 8) use this instead of SVNParentPath:
SVNPath /var/svn

Above all, check the great SVN Book.

Mozilla DOM W3C Connector announced

Mozilla DOM to W3C ConnectorJust an information: Peter Szinek, a friend of mine is about to release the Mozilla DOM W3C Connector he implemented. It allows you to access the Mozilla DOM as W3C DOM from within Java when embedding Mozilla. This is fundamental if you want to use standard XML tools and libraries to operate directly on Mozilla DOM, e.g. XML, XSLT, XPath, XQuery. Read more in his original  post.

We’ve been using it for few months and it proved to be stable. The bad guy seems to be sometimes JavaXPCOM ;)

A Year with SCRUM

It’s been a year we implanted Scrum (or something Scrum-like) as our development management methodology in the company that employs me atm. Today we said goodbye to the 12th sprint/month, which was a great chance to make a “1st birthday of Scrummy boy” party as well. Besides the regular Sprint-end presentation I presented also a look-back yearly review. Has it worked ? What do we do differently ? What have we learned ?

Year ago

We were in a situation that reached some critical-mass. Maintenance of actual products – unfortunately quite complex, running critical new development, prof. services requests hitting us daily, ever changing priorities, recursive interruptions, ill communication, organizational changes. All this with limited resources. Stress and frustration for every one. Gannts and quarterly planning surprisingly didn’t help ;)) We thought we did extreme programming. We did extreme… just in other aspect :) A small dev-team uprising was unavoidable.

…blah..blah…and so we decided to go with Scrum as project management tool. Backlog, ScrumMasta, Sprints, Daily scrum… Because anything was better than the status-quo the installment was smooth and accepted. Personally, I don’t like very much the way Scrum is promoted. And for the book: Ken Schwaber: Agile Project Management with Scrum… ok, but no big thing. Importantly, what is very sound and pragmatic are the the Scrum concepts. Of course, as we are somewhat creative people, we could have never been orthodox followers. Moreover it’s just about project management so you have to complement and stir it with other concepts (An Agile Roadmap)to get the most tasty and nourishing soup for the complete development process.

Year after

We are team of 6 devels, quite cross-functional. Very flat structure. New development vs. professional services,support, and maintenance goes 1:1. Besides the basic principles, we came up with some Scrum patches and local customs:

  • ScrumMaster is one of the devel team, as his part-time job. This eats max 20h of his time, which is sufficient for the duties.
  • Rotating Scrum Master -1-3 times each; to avoid stereotype.
  • PPTS – The tool. Web based, GPL, SCRUM, extreme programming. Very useful.
  • Scrummaries – each member writes a mail with a brief description of his achievements, status, open points at the sprint-end. It’s helpful later on to have such info persistent.
  • Half-time round-trips – SM and PO has a short talk to each devel get the big picture view on the progress. Some steering is usually done here.
  • Emergency time slots – we experience cca 15% of unpredictable situations, so-called emergencies. Therefore, we add a constant-time slots to each sprint.
  • DailyScrum mailinglist – as the team cannot be daily together, the missing person ports the “daily answers” to the mailing list.
  • Bad task” – unpredictable, NP-hard, R&D, we fix time per sprint.

After all, I have to say this approach worked for us quite well. The major improvements came in process transparency, much better planing, much much more relaxed development and thus also efficiency. And not so “agile” as before :)

So can I recommend this? Look at your problems, your team, the project and company culture. And make your judgment yourself.

Text Manipulation in Gimp

I’m running Ubuntu Breezy. The latest Gimp available – 2.2.x still suffers from insufficient text manipulation functionality e.g. letter spacing, transfomations. It seems some improvements will be available in 2.4. Till then a Freetype plugin can help a bit.
The page offers just a source so you need to compile and install it:

  1. Get the source code
  2. apt-get install libgimp2.0-dev
  3. Untar source/configure/make/make install
  4. Start gimp, you'll find it in Filters>Text>Freetype
  5. Add path (configure) of each font you want to use separately. Adding just /usr/share/fonts is not enough.