Friday, November 27, 2009

Installing couchdb on CentOS 5

Installing on CentOS 5 i386

(Note: COUCHDB-315 has an attached patch for the CouchDB README which adds instructions for RHEL 5.)

1. Install prerequisites. You will need EPEL for js and erlang (or build those from source).

yum install ncurses-devel openssl-devel icu libicu-devel js js-devel curl-devel erlang libtool gcc

You also require curl (7.19.7 worked for me).I had to build it locally though because of some weird libcomm_err.so missing dependency.

2. Install CouchDB

The configure line below is for 64-bit, adjust for your arch (or leave out --with-erlang if configure can find out for itself). You can use a release tarball instead of a checkout, in that case skip right to the ./confgure line.

svn checkout http://svn.apache.org/repos/asf/couchdb/trunk couchdb
cd couchdb
./bootstrap
./configure --with-erlang=/usr/lib/erlang/usr/include && make && make install

3. Edit config file to suit

vi /usr/local/etc/couchdb/local.ini

4. Create user, modify ownership and permissions

Create the couchdb user:

adduser -r --home /usr/local/var/lib/couchdb -M --shell /bin/bash --comment "CouchDB Administrator" couchdb

See the README for additional chown and chmod commands to run.

5. Launch! In console:

sudo -u couchdb couchdb

or as daemon:

sudo /usr/local/etc/rc.d/couchdb start

6. Run as daemon on start-up:

sudo ln -s /usr/local/etc/rc.d/couchdb /etc/init.d/couchdb
sudo chkconfig --add couchdb

Sunday, March 01, 2009

JQuery AutoComplete - Lessons Learnt

I can actually go to bed tonight after resolving my bugbear of the past few days: jquery.autocomplete. I usually stay away from JavaScript development in my day job but the past few days has seen me trying to do some work that requires autocomplete functionality. Never knowingly backing away from a challenge, I rolled up my sleeves and got to work.

It wasn't very difficult finding resources to get me started on this very useful plugin to the jquery framework library. Where I met my challenge was the use case which I sought to implement. I was going to be populating the lookup elements dynamically and this data would be supplied by the server-side in JSON at that. JSON being a subset of JavaScript made sense and I figured this would work out of the box....untrue. Thanks to Firebug I found that the JSON data coming back from the server side wasn't understood.

After a few days of sulking, I found some succour in the form of a jquery autocomplete implementation which actually speaks JSON. I had to tweak it to do my bidding in the end of the day but this was a better match for my problem and I am grateful to the codeassembly guy(s).

A few points to note:
It would be nice if the JSON functionality is brought into the main jquery.autocomplete.
It would also be nice to have a user defined formatItem function like the main jquery.autocomplete that is called after the JSON data is returned(this is the part of the codeassembly implementation I had to tweak to do my own thing).

All in all an interesting experience. I have a few more things to do in JavaScript land and will let you know how I get on.

Monday, February 23, 2009

Source code in blogger posts.

UPDATE: I am pleased to tell you that I have just installed the Groovy syntaxhighlighter from the trunk of that project.

I am glad I finally found a solution to my problem. I think the guys at blogger need to write up something in their FAQs about having source code in blog posts. Most of the Google searches I undertook came out with nothing until I found this gem.

I am hoping to find some form of blogger plugin that does this in the future, like what the WordPress guys have done. I will also be hoping that the syntaxhighlighter guys will provide Groovy support soon ;)

More later.

Thursday, February 19, 2009

Oracle XMLParser and Grails - Lessons learnt

A few days ago I was trying to integrate the work of a colleague into a light Grails application I am currently maintaining but experienced classpath hell with Oracle's XMLParser V2. A better description of the problem can be found in the JIRA for the Grails project here.

The steps prescribed didn't seem to work so I thought I'd do some digging again. I'll disappoint you by telling you that the JIRA issue remains unresolved and I was only able to come up with a work around. I looked into the script for RunWar and it would appear that for some reason, Grails defaults to a non-validating parser before kicking off Jetty.

The following lines in the RunWar.groovy script for Grails-1.0.3 is telling:

System.setProperty('org.mortbay.xml.XmlParser.NotValidating','true')


This single line of code ensures that you use a non-validating parser to start up Jetty and parse your application's web.xml. Maybe if there was another means for configuring your xml parsing for Jetty in Grails it would solve the problem.

I also tried other hacky things like replacing the SAXParserFactory as suggested here but that didn't work. In the meantime I have had to make do with refactoring my classes so that they don't exchange data of xmlType directly with the database. For now Strings/Clobs will suffice until I can find an unobtrusive way of starting Jetty from Grails that will condone Oracle's XmlParser on the classpath.

Your suggestions are very welcome.

Friday, January 30, 2009

Grails Testing Tip

I had always wondered how to run individual types of tests in Grails. In order words I wanted to be able to run unit tests only or integration tests only. I did some digging in the TestApp.groovy script that ships with Grails and found that all you needed to do was specify it as an option on the command line.

grails test-app -unit
or
grails test-app -integration

This works as far as I know with Grails 1.0.3 not sure of 1.0.4 and 1.1-betas but I assume they won't be decommissioning this feature in a while since it is important. 
Never really got individual tests working though, as I have been unable to find anywhere that says how to run an individual test class.

Pointers to this will be appreciated.

In the coming days, I'll say something about mocking in Groovy using the 'as' feature.

Monday, December 15, 2008

Be Open

I usually am the kind of guy that is easy going and is willing to bend my principles for good reason. But I was greatly annoyed today at instances around the internet where content providers still put content out there in closed formats.

In this day and age of open systems, collaboration and standards, I wonder why this is so. There I was trying to go through my mailbox and sort the chaff from the important stuff. I stumbled upon an email from SpringSource and I was interested in seeing a past webinar about their tweaks to the Tomcat application server that we all know and love. Err wrong! I couldn't or lost the appetite to continue, as they had decided in their infinite wisdom that we all had to be Windows users or that our playback kit on our computers had to understand Windows Media Video.

Why they couldn't support a format like MPEG-4 beats me. They had in making this decision put up a hurdle to my use of the webinar content, along with any sales they may or may not have made as a result of my accessing it.

My advice to them would be, to become a bit more open and aware of the content they put out there, especially seeing that they play in a market that prides itself on open, collaborative standards. I will be assuming this is an oversight, unlike a similar oddity from Yahoo! with their launchCAST offering (rebranded as Yahoo! Music), which one would expect they would have redesigned as well to support Flash and standard JavaScript.

They lost the chance to turn me into a user of the past webinars part of their site. To turn 1st time users of your application (web site and other content included) into return/repeat users, take Joshua Porter's advice in Designing for the Social Web - get out of their way! In this specific case getting out of their way is being open.

'Nuff said.

Thursday, October 30, 2008

BLIP

Just to say that after the uncomfortable loss to Liverpool FC @The Bridge over the weekend, we are back to winning ways. There were a few wasted chances but all in all...great result!

Wednesday, October 22, 2008

The depth of human greed

I read with disgust, incredulity and complete confusion the guardian article about the  securities firm exec whom awarded himself £1.3m from a £1.4m pot and still had the effrontery to sue his firm for deducting/not paying £92,000. 

I am not sure if I am upset because 92,000 pales in comparison to £1.3m or the fact that the court is being dragged in to settle issues like these, given other pressing needs. 

Whatever happens, I think he has just shown how mean and crass we can be as humans once our greed is in full gear.

I shall be commenting on the outcome of the judgement.

Monday, June 23, 2008

TSSJS Prague - Days 2 & 3

Days 2 and 3 have been a breeze. There have been all sorts of interesting things that have been spoken about from Groovy and Grails to JPA 2.0 new features to really cool testing in JRuby. A lot of buzz is being generated in the community by DSLs and I also think Behaviour Driven Development as epitomised by JTestr, JBehave and easyB are all things to look into. Some interesting catch phrases are that XML is deprecated (in favour of DSLs of course). All slides for the presentations are available @ the JavaSymposium Wiki.

A few more things caught my attention and I will be looking at them in more detail in the coming weeks. I will hope to share my joys or...tears as I try them out.
Scala
ServiceMix + Camel
Mule 2
etc.

I thought the JavaRebel class re-loading agent thing was quite cool and can be a productivity booster but seeing that its not free...(the freeloader that I am), I'll be giving it a miss for now.

All in all I'd say that my time in Prague was extremely interesting, especially with the chance I got to catch up with old colleagues and meet new friends that one can rub minds with. Its been well worth it and I will be headed off to the next European even next year.

Thursday, June 19, 2008

TSSJS Prague - Day 1

The TSSJS Europe conference has begun in earnest in the lovely city of Prague. Between swinging alfresco dining and lovely continental beer I have regarded the 1st day of the conference as intellectually rewarding. There were quite a few talks that stood out for me.

First of all the introductory but well thought out talk by Nati Shalom of GigaSpaces on Cloud computing. There was informative eye candy on his slides and his talk brought to the fore-front of my consciousness the fact that capacity planning and scalability are thorny issues in general. I will be investigating the GigaSpaces stack, as before now it has been on my radar but hasn't been high priority enough.

There was the double whammy of Spring talks one of which was by Costin Leau. It raised important questions in my mind on things I could be doing better. The fact that SpringSource is re-aligning, re-inventing and re-positioning itself with offerings like Spring DM (which plays quite well with OSGi), Spring Batch and Spring Integration has not gone unnoticed and personally from the capabilities demoed today, I'd advise anyone to give the new Spring stack a look in. I have already started to look into some OSGi bundling tools like aQute and will be sharing my thoughts in a while.

The SCA talk by Mike Keith of Oracle to my mind raised more question than answers. Not the least the fact that some of the issues it addresses like assembly, overlap with other product sets in the market like ESBs and even the JBI spec. I have resolved to go away from that talk and
undertake more research to see if there's more to this shining new spec.

The Grails talk was well articulated but gave very little in terms of TDD support in Grails. Issues of this nature are close to my heart and I hope improvements will be made for future talks.

With regards to organisation, I'd like to see a conference where the video content of presentation is available to attendees by close of play everyday, even if in a raw/unedited form (a-la Parleys.com and JavaPolis). This can help if you are torn between two sessions you desperately want to attend.

All in all 8 out of 10 for Day 1. Bring on day 2.

Monday, May 12, 2008

Affirmative action

It is with some glee and a bit of confusion that I read this morning about France breathalysing citizen at pubs. The idea is to preempt accidents which are caused by drink-and-drive patrons. Noble. It beats hiking the prices as has been done on the other side of the Channel.
But I have a few questions:
Will this apply to all punters?
How will this be funded: as in will the test equipment be provided in partnership with vendors?
What happens to a punter whose breath is deemed un-Kosher?
Will there be some enforcement to ensure that they won't drive...in fact how do you determine punters who have driven to the pub?

Nice concept though. This is the kind of creative thinking that is required of politicians. Is it ready for prime time? Not quite sure but we'll see.

Enjoy the week ahead!

Thursday, March 27, 2008

GTalk rant

I upgraded my IM client lately. I had been using Pidgin 2.2.2 for a few months and decided to move up to 2.4.0. I had a number of work mates and just friends on Gtalk but Pidgin just wouldn't work with my previous settings.
Finally I found some blog entry which inspired me. Notice how I have qualified its effect...it didn't really solve my problem but changed the way I thought about it.
The solution? Click on the images on the below.






Tuesday, February 05, 2008

Environment specific properties - the spring way.

This problem is easily solved via the use of 2 Spring IoC bean post-processor classes viz:

org.springframework.beans.factory.config.PropertyPlaceholderConfigurer
org.springframework.beans.factory.config.PropertyOverrideConfigurer


To use this functionality you would need to have them declared in your app-context config files
as follows:


<bean id="ppConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="order" value="1" />
<property name="locations">
<list>
<value>classpath:ppc-sample.properties</value>
</list>

</property>

</bean>
<bean id="poConfigurer"
class="org.springframework.beans.factory.config.PropertyOverrideConfigurer">
<property name="location"
value="classpath:poc-sample-${my.env}.properties" />
<property name="order" value="10" />
<property name="ignoreResourceNotFound" value="true" />
</bean>


They are like any other bean definitions but there are few properties in their definitions that need special attention
as they are responsible for the magic. They are order, location and ignoreResourceNotFound.


order - determines how these post processors are loaded or applied to beans via Spring IoC.
location - (atleast in the case of the PropertyOverrideConfigurer bean) matters because of the use of an ant/JSTL/groovy property.
This is where the PropertyPlaceholderConfigurer comes in. It is used to define the default value for the my.env environment variable. Without this the PropertyOverrideConfigurer will have problems when Spring tries to load it.
ignoreResourceNotFound - makes sure there are no complaints by Spring when initialising the PropertyOverrideConfigurer bean.

Any bean where you want to use environment specific values can now be defined in your poc-sample-${my.env}.properties file.
Given the following bean configurations where you wish to use this functionality

<bean id="myBean" class="com.lhfville.sample.POC"
lazy-init="true">
<property name="prop1" value="${prop1}" />
</bean>

<bean id="myBean" class="com.lhfville.sample.POC"
lazy-init="true">
<property name="prop1" value="hi" />
</bean>

you can have poc-sample-dev.properties poc-sample-test.properties poc-sample-prod.properties files in your classpath with varying values for myBean.prop1.


Thats pretty much it.

Monday, February 04, 2008

Facebook Foray - dead in the water

Like any fairy tale this one has come to a screeching halt looking more like a nightmare. Well my facebook app will be dying a natural death as a consequence of the woeful display by my team in the Africa nations cup. I thought they'd have the balls to march all the way to the finals after surviving the scare of a horrid first round. Even after the lifeline of a penalty and a sending off for their opponents...they still lost.

Well at the very least this dilettant has enjoyed working with the Facebook API. Who knows I might do something with it again in the near future.

Have a swell week!

Wednesday, January 30, 2008

Facebook foray - extended

As promised, I am happy to tell you that my team DID progress to the next stages of the competition. This means that the motivation to keep @ my facebook application has been rekindled. The coming days will see me trying to implement the features as promised.

Stay tuned.

Tuesday, January 29, 2008

Facebook Foray

Decided to build a facebook app for the african cup of nations. Not sure that it was a useful exercise now that the fate of my favorite team hangs in the balance. For now all the application does is to allow users make predictions on the games in the first round. Features to come include:
  • Placing stories in the user's mini feed after a prediction has been added.
  • Making predictions about the highest goal scorer, number of cards etc.
I'll tell you if I get around to doing it after the fate of my team is decided today. Stay tuned.

Thursday, September 20, 2007

Adieu Jose


This is to mourn the loss of a great manager..the best that Chelsea FC has ever had. Now I definitely know that the board is decidedly crazy and has no ambitions. My last post as a Chelsea FC fan. Jose we will miss you. Over and Out!













Photo Credits:
http://pinker.wjh.harvard.edu/photos/Iceland/pages/iron%20grave%20marker.htm

Sunday, July 15, 2007

Groovy Weblogic Migration

This is a bit of a change in direction being that I prefer to rant about football and other such easy-on-the-eye material but I thought I'd bore you a bit with techie stuff...read on.

In the past few months I have begun to re-acquaint myself with Scripting/Dynamic languages and would say that they have become quite sexy and even more expressive than I remembered. I have had cause to look at Ruby and Groovy in more detail and they each have unique selling points for me. Ruby because of its expressive nature and its wicked cohort Rails and Groovy for its near Java syntax and its inherent support for all things Java. Blessings like JSR 223 and more support in the JVM for dynamic languages (JRuby and Jython) seem to have helped.

So you can imagine that the first chance I got to make something really helpful with a scripting language I decided to give Groovy a spin. I will say that it has good documentation and is quite mature. My use case? I needed to migrate a number of system resources (DataSources and Mail Sessions) from Weblogic 8.1 to Weblogic 9.2.

I had heard from a team member on my project about WLST (Weblogic Scripting Tool) and the administrative magic you could do with it..so my head started ticking. I bet there are a number of ways I could have gone about migrating these resources (I welcome suggestions) but a notion had formed in my mind about the path I would go.

The change in configuration information structure was much between the two versions so I decided I was going to read a WLS 8.1 config.xml, then generate WLST scripts to recreate interesting elements from it in WLS 9.2. Initially I wrote the first rough sketch in Java (being a masochist :-D ) but after it became unmanageable, I had written XSLT code in lieu of JAXP or XSD and JAXB, I decided to re-implement in Groovy and I am loving every minute of it..XmlSlurper rocks! I made sure to pepper my script with closures right Groovy-newbie that I am. I have put up a copy of the code here for your viewing....free gift eh?
So without further ado here is the code. Enjoy!


class Migrator {

static void main(args) {
def domain = new XmlSlurper().parse(new File(args[0]))
def msClosure = {ms ->
new PrintWriter(new FileOutputStream("c:\\stuff\\migration\\"+ms.@Name.text().replaceAll(" ","")+".py")).withWriter {writer ->
writer.println("connect('${args[1]}','${args[2]}','${args[3]}')")
writer.println("edit()")
writer.println("startEdit()")
writer.println("myMailSession = create('${ms.@Name.text()}','MailSession')")
writer.println("myMailSession.setJNDIName('${ms.@JNDIName.text()}')")
writer.println("myMailSession.setProperties(makePropertiesObject('${ms.@Properties.text()}'))")
writer.println("myMailSession.addTarget(getMBean('Clusters/${ms.@Targets.text()}'))")
writer.println("save()")
writer.println("activate(block='true')")
writer.println("dumpStack()")
writer.println("disconnect()")
}
}
def dsClosure = {ds ->
def wlstOut = new PrintWriter(new FileOutputStream("c:\\stuff\\migration\\"+ds.@Name.text().replaceAll(" ","")+".py")).withWriter {writer ->
def poolInfo = domain.JDBCConnectionPool.find{it.@Name.text() == ds.@PoolName.text()}
def startPos = poolInfo.@Properties.text().toString().indexOf("user=")
if (startPos > -1) {
def userName = poolInfo.@Properties.text().substring(startPos+5)
writer.println("connect('${args[1]}','${args[2]}','${args[3]}')")
writer.println("edit()")
writer.println("startEdit()")
writer.println("jdbcSR = create('${ds.@Name.text()}','JDBCSystemResource')")
writer.println("theJDBCResource = jdbcSR.getJDBCResource()")
writer.println("connectionPoolParams = theJDBCResource.getJDBCConnectionPoolParams()")
writer.println("connectionPoolParams.setConnectionReserveTimeoutSeconds(25)")
writer.println("connectionPoolParams.setMaxCapacity(100)")
writer.println("connectionPoolParams.setTestTableName('SQL SELECT 1 FROM DUAL')")
writer.println("dsParams = theJDBCResource.getJDBCDataSourceParams()")
writer.println("dsParams.addJNDIName('${ds.@JNDIName.text()}')")
writer.println("driverParams = theJDBCResource.getJDBCDriverParams()")
writer.println("driverParams.setDriverName('oracle.jdbc.OracleDriver')")
writer.println("driverProperties = driverParams.getProperties()")
writer.println("proper = driverProperties.createProperty('user')")
writer.println("proper.setValue('${userName}')")
writer.println("driverParams.setPassword('${userName}')")
if (args.length > 4) {
writer.println("driverParams.setUrl('${args[3]}')")
writer.println("jdbcSR.addTarget(getMBean('Clusters/${ds.@Targets.text()}'))")
} else {
writer.println("driverParams.setUrl('${poolInfo.@URL.text()}')")
writer.println("jdbcSR.addTarget(getMBean('Clusters/${ds.@Targets.text()}'))")
}
writer.println("save()")
writer.println("activate(block='true')")
writer.println("dumpStack()")
writer.println("disconnect()")
}
}
}

domain.JDBCTxDataSource.collect dsClosure
domain.JDBCDataSource.collect dsClosure
domain.MailSession.collect msClosure
}

Friday, February 16, 2007

Valentine Splash

Woah! Its was that time of the year a few days ago when you have love songs crooning on the radio, the gift shops swirling with most folks trying to surprise..or at the very least impress their lovers, restaurants all trying to out-do each other. Well yours truly was not about to be left out but, being of the regular and boring sort, I went down the safe gift route (don't ask dont tell).

I am sure that most folks know the saying that Diamonds are a girl's best friend but I daresay that conventional piece of wisdom was challenged in Gloucestershire this Valentines. How? Well the laudable Herr Jasin Boland gave as a token (though that would be an understatement) of his love a £500,000 shrink-wrapped house to his fiancee (BBC Story). I know there have been sensational gifts in the past but this one was gob-smacking. He put me and my boring gift idea to shame and that has got me thinking.....next year!

I bet his only problem now is how to beat this achievement next year. What in your opinion will knock that gift next valentines? A wedding in Rome? ;) What love luxury did you splash out on? Are you looking to better it?

Have a great weekend!

Tuesday, February 06, 2007

Hairapy

Its amazing the lengths people will go to actually get their hair looking all shiny and pretty. I was reading somewhere in the metro last week that there is a new hair treatment using bull semen. It actually costs £55 a pop and allegedly brings body and shine to your hair. Wow!
Who knows what next people will be trying out on their hair. In my uni days, some of my pals with hairlines receding faster than that of their contemporaries were partial to honey. They had to answer to ants though seeing that we were based in a tropical town. Some have used hemp, eggs...all sorts.

What are you willing to do for your hair?


Have a great week ahead!