myRta website won’t talk to me

Back where I come from they say, ‘never mend a bridge unless it is completely broken’ – which couldn’t have been truer then the case with myRta website. The previous website didn’t look very funky, but it did what it was supposed to do. You could place exam booking online with least amount of fuss, you could practice DKT exam and you could obtain whatever information you needed. The new website encourages you to register, but you can also place the exam booking without registering. You know what is funniest bit? Both requires same amount of fields to be filled. So why should both cases be available?

My personal experience was bitter. When I failed my first driving exam; while placing another booking, I thought why not use the website? So I registered myself diligently and after the first screen I was stumped.

myRta is not being friendly

myRta is not being friendly

I can choose the car type – class C but it won’t let me choose exam. What gives?
So I head to RTA and ask them about it, they informed they don’t deal with it.
They helped me place the booking and told me I should call up 13.. for website issues.

So I did.
The woman on phone volunteered to place a booking but couldn’t solve the issue and couldn’t tell me why I wasn’t able to place a booking online. She hazard guessed that because I have a per-existing booking that’s why I see all the options disabled. No matter what I say I couldn’t convince her that it was happening to me beforehand.

At this point I’m fairly pissed off.
Another exam failed.

So a month later I try again. This time the mystery unfolded itself. The lady I called explained, if someone has taken an exam, they can’t place another booking for a week. Now how the heck I would know this?

In the world of web design there is a concept called error/warning/info messaging.
When state of normal functions changes, or when the state of data in view changes, you make it visible to the user.
You can use:

  • loading screens,
  • loading wheels,
  • flash messages.. etc etc..

Without stuffs like these, user would think you are pulling his chair out. Making user uncomfortable is the last thing you want to do. Websites like myRta has a monopoly over the service it provides. But if tomorrow RTA is forced to expose an interface to its service, just about anyone can build a better website with promise of better service; leaving myRta site barren.

Here is a mockup of what would have made things better. Now how hard can it be to implement this?

Letting you know why we disabled all the options because you failed an exam

Letting you know why we disabled all the options..

Now.. activity time!!
Prerequisite: myRta website user login/any driver license number.
Steps:

  • Head out to myrta website.
  • Try to login (I would have absolutely loved to give you a nice url like www.myrta.com/login link without the session key garbage in it, but myRTA is too awesome for it.. don’t click in this url, it lands you in an error page.);
  • ..wait a sec.. instead of using your password, use this random strings !@#$, which are by the way, perfectly normal password characters.
  • myRta login screen

  • click login
  • Wait to see an error message.. what do you see?

Post your findings here in the comment section.

Malaysian airlines website’s server error

How an entire aeroplane, with so much technology at hand, gets vanished will remain a mystery to me. Neither it is clear how the land missile remains unnoticed when fired to an aeroplane. I am no expert in this, but as human I only grieve at the loss. But my today’s post is about smaller tragedy that followed all the MH tragedies.

When my in-laws were flying over, despite the fear, we were looking for tickets with Malaysian Airlines. We have traveled with MH so many times, any other airlines still feels bit foreign to us. While searching for the tickets, we came across this.

Malaysian Airlines website server error

Malaysian Airlines website server error

At this age of internet, a well sought after website like Malaysian airlines *should* bother with proper error pages. But this tragedy was also not handled properly by Malaysian airlines and we came across the horror page.

The amount of technical information that is exposed as part of this is .. slightly scary.
Like now I know, Malaysian airlines (possibly):

  • uses Struts with Spring MVC, with a servlet mapping configuration missing..
  • using Apache Tomcat 6.0.14 – so possibly has security vulnerabilities.
  • From the exposed stack trace, I can see there is abstract factory pattern is in use, and
  • server configuration for needs to be checked out.

Leaving a stacktrace out like this is like doing your laundry in public, and no one wants to see that. :)

If you still don’t have a proper error page in place for your site and looking for inspiration, here is my favorite link.

http://alistapart.com/article/perfect404

And more.. http://alistapart.com/article/amoreuseful404

And here, I even googled it for you..

Some of these error pages are so awesome, when I get bit bored, I open them up to get a bit of laugh. I mean it is a bit sad really, but I’m sure you would change your mind if you check this website out for a change..
God! I am getting royal treatment here! **wink** **wink**

Bankstown library

Now that I have ample amount of ‘time’ on hand..

I am being sarcastic here. When you are a ‘mom’, your concept of ‘time’ is mixed up. You steal time – in between her sleep, in between her playtime, and when she is in the pram. I have set myself to explore the Bankstown library.

Hats off, the library is outstanding. I have never seen a library this grand!
Much needs to be said about the collection though. I was hard pressed to locate children classics like ‘little house on prairies’, or ‘Rip Van winkel’.. I have asked the library stuff for the books and haven’t heard from them yet.

I have relocated to Bankstown only an year ago from Canterbury council where I have used the Lakemba and Campsie library extensively. The Canterbury council has a system where a borrower is emailed of the upcoming due date for book return, which is really handy to allow borrowers to return the books on time.

Once I started using the Bankstown library, I received similar notice, but only by post. I thought that is the standard procedure, but when I went to return my last set of borrowed books, I discovered it is not the case. I didn’t receive any postal mail and unaware of the deadline, I am charged $30 for fine, for the first time in my life. It is very disheartening for a reader and not encouraging at all. Also, compared to other councils, this is a very high late fine for a public library. With the kiosk and the web portal I was expecting the Bankstown Library to at least have a reminder service via email.

It would be great to receive an email, a week in advance, to remind the borrowers of the books that are due next week. It doesn’t cost as much as the snail mail and a cron-job at the back of the server is sufficient to send this email out. Being a parent of four month old at that time, returning books didn’t come up as priority. But being a defaulter goes against everything I stand for. So I wrote to them and gave them the idea, even volunteered up my help. Two weeks later, they got back to me, with lots of promises and nothing substantial for the moment.

Also the fact that Canterbury council already has a system why not re-use it?
Why do they have to build it again? As a tax payer it does seem like a waste of money..

Dear ..,

Thank you for taking the time to send an email to Bankstown Council on 6 August 2014. We strive to learn and improve our standard of customer services and all feedback helps us in that endeavour.

We appreciate your comments for improvements to our Library Management System which generates patron notifications only by post at present.

We are currently testing patron notices by SMS, with a view to commence testing patron email messaging shortly. As part of conditions of library membership, it is the responsibility of all library members to arrange for borrowed items to be returned or renewed before the date the items are due back to the Library Service. Library items can be renewed twice for three weeks either in person, over the phone, or online on or before the date they are due for return at any of the Bankstown libraries.

If you would like to update your contact notification method, you can do so online through Member Login, or in person at any of Council libraries to receive notices by post at this time.

We value your feedback and hope that you will continue to enjoy the variety of services that our Library Service offers.

If you would like more information or we can be of further assistance please contact Debra Duan, Team Leader Library Member Services at Bankstown Library & Knowledge Centre on 9707 9708.

Yours sincerely
...

Needless to say, I coughed up the dough and got my dignity back.

I am currently traveling with Kunta Kinte in Roots by Alex Haley, beautiful book, very difficult to put down. What have you been reading lately?

Hail the driver

Got a thoroughly lectured down by the bus driver on route from Chullora to Bankstown.

The driver was probably having a bad day. He spent at least 2 minutes (which I swear felt like eternity amidst glaring passengers, oh, wait I was just imagining it..) explaining how he would have left me at the bus stop if he saw an inspector/ranger around. I should count my lucky star that he was kind enough to stop even though a fair 3-4 meter away from the bus stop.

I am to ‘hail the driver’.

I don’t really get it, why would I have to hail the driver if I am actually waiting at the bus stop for the bus, in appropriate time for an upcoming bus?

In my ‘old third world’ country, there are no fixed bus stops. You practically chase down/hail the driver for a lift. It’s something akin to hitch-hiking. If the driver feels like stopping, or if there is a seat for you, he might stop.. a fair 3-4 meter away from where you are standing..

But here in Sydney, you get bus stops, named and marked with numbers. With roof for shade and bench to sit on, while you wait for the bus as noted in the post – with map and timetable and promotional texts about ‘opal’ card. Why? Why do still you have to hail the driver? Why would someone simply sit in the bus stop and not want to be in the bus? is it some sort of hobby? Are there not enough benches in the park/shopping mall? Why am I unaware of this trend where people simply hangs out in the bus stop?

Things that move me..

It has been a while since my last post, but as the falgun (spring of 1419) comes by and entire Dhaka city and all the community of Bangladeshi living abroad, unites in protest.. silence doesn’t justify.

One of my junior school-mate shared a request for petition with this video. For those who are coming up with excuse(s) and justifying their silence, let it be a push.

We are always taking the back-seat, waiting for others to take over and lead things. I partly blame our generation’s conservative attitude for the situation in our country, with all the corruption, negligence and misfortune. We have created a void of active intellectuals, we’ve read, we’ve learnt and we moved outside of country and now only complain about what is wrong with our country.

I understand the inconvenience caused by the protest at Shahabag for the conservatives, but for once this is for ourselves, for our country, for our history. Over the years we’ve managed to tolerate all those nuisance created in the city by political parties, why should our younger brothers and sisters be scrutinized in the same scale?

Have you read Jahanara Imam’s ‘Ekatturer Dinguli’?
Collection of true stories Nilima Ibrahim’s ‘Ami birangana bolchi’? Enough of reading all the petty novels, atleast read ‘Shamol Chaya’ by Humayun Ahmed. We are grossed out by the brutality of the fight and we try to escape from the pain that still lingers in the heart of the one who lost someone in the freedom fight.

My heart reaches out to the people who are protesting, standing under the open sky, asking for justice. Islam doesn’t support the brutal acts committed in the name of religion, may Almighty grant us the justice that we have been waited so long for.

Person who is my father i

He was born on Shab-e-borat. He brags how he took his own time to be born, oh! how my dear grandma must have suffered! But he remains unphased when he tells the story, as the pain was worth the outcome.
Being fourth is quite low in hierarchy of siblings. Not even in top 3, always in shadows of predecessors? But
he had mind of his own to make this rule completely false, he would never live in shadow but be the tree on which sheikh family will redefine their status. On the night of Shab-e-borat, so was the luck written.

Person who is my father ii

He always managed to rise to the occasion, nothing ever left him broken.
When his immediate brother died off on a tragic accident(the baby boy was too young to swim and was trying to fetch a spoon from the ****), he started breastfeeding again. In his own way he consoled his mom. Later he honored his brother by taking up his name for himself.
Being brought up with notorious influence of his maternal uncles, he was designed for mischief. However, my grandma was quite strict about how to raise her sons and she made sure all of them headed to school at right age and stayed there.

Mono – take1

So I had to write a client/listener for an MQ server, I planned to use an existing web service that was left out from being used during one of the site makeover.

Since one of the app in java is already doing that using Spring and jms template, I made a point in trying to do the same in .NET. Problem is simple, the MQ server is in Java platform and I needed to run a C# tool/deamon on Linux distribution 5.x.

Mono is a wrapper for C#/.NET to enable user to convert a *.dll/*.exe to run in any environment that does/not support .NET framework.

I’m still testing it, I’ll update you guys when something good comes out of it.

How to link the svn revision with maven pom.xml project version

For a while now we are using tortoise svn to maintain our code repository, no question asked it is an excellent tool.
Now we also have nexus to store our generated artifacts/jar, but I can’t seem to find a way to identify from which svn revision this particular jar file was generated.

Also all of us are quite lazy to go up to the version node in the pom.xml and change it, and for months and months we are usually generating the same version, which is 1.0-SNAPSHOT.

I did a bit of digging around and tried something very simple..
STEP 1: Added a placeholder in pom.xml and property field in settings.xml
STEP 2: Made sure the mvn.bat performs a svn update at mvn build and supplies the property value to it.

STEP 1 goes something like this : pom.xml with variable ${svn.version}

<project>
 <modelVersion>4.0.0</modelVersion>
 <groupId>com.somedomain</groupId>
 <artifactId>mysuperproject</artifactId>
 <packaging>war</packaging>
 <version>1.0.${svn.version}</version>
...
</project>

Just to make sure the editor(netbeans) build doesn’t complain, I added a placeholder in settings.xml

<profiles>
 <profile>
  <id>my-usual-profile</id>
  <properties>
   <svn.version></svn.version>
  </properties>
...
 </profile>
....
</profiles>

STEP 2 was a bit trickier, keep a backup in case you break it, it is updating the mvn/mvn.bat
The dirty fix is to edit mvn.bat and at the top just add this bit above the Apache license declaration.


@REM ----------------------------------------------------------------------------
@REM Farlin : Adding a bit of logic to update project version number with svn revision
@REM ----------------------------------------------------------------------------
@ECHO OFF
:; Turn echo off (above) to keep it clean
:; Clear any previous variables set, and set your desired property name
SET PropertiesName=svn.version
SET SvnCurrentRev=
:; Get the output from the "svn up" and trim to revision number
SET temp=
FOR /F "tokens=*" %%i in ('svn up') do SET temp=%%i
FOR /F "tokens=3 delims= " %%A IN ("%temp%" ) DO (
SET temp=%%A
)
FOR /F "tokens=1 delims=." %%A IN ("%temp%" ) DO (
SET SvnCurrentRev=%%A
)
:;ECHO %SvnCurrentRev%
:; create a mvn commandline switch with svn revision number
SET MAVEN_CMD_LINE_BUILD_VERSION=-D%PropertiesName%=%SvnCurrentRev%
:;ECHO %MAVEN_CMD_LINE_BUILD_VERSION%
@REM ----------------------------------------------------------------------------
@REM Licensed to the Apache Software Foundation (ASF) under one
....

and also locate the place where Start MAVEN2 is configured in the mvn.bat file

....
@REM Start MAVEN2
:runm2
%MAVEN_JAVA_EXE% %MAVEN_OPTS% -classpath %CLASSWORLDS_JAR% "-Dclassworlds.conf=%M2_HOME%\bin\m2.conf" "-Dmaven.home=%M2_HOME%" org.codehaus.classworlds.Launcher %MAVEN_CMD_LINE_ARGS% %MAVEN_CMD_LINE_BUILD_VERSION%
if ERRORLEVEL 1 goto error
goto end
...

This should do the trick and append the revision number when you do a mvn build.
To check, go to your checked out version and do :

mvn clean install

Want to check if this worked? Just browse inside your *.jar/*.war and inspect the file called pom.properties
mysuperproject.war\META-INF\maven\com.somedomain\mysuperproject\pom.properties
you will see :

#Generated by Maven
#Fri Jul 09 15:05:59 EST 2010
version=1.0.1326
groupId=com.somedomain
artifactId=mysuperproject

And when you deploy your artifact to nexus, it will automatically create a folder for your jar with respective build number. Hope this helps!

Trouble relocating nexus folder?

I got a bit adventurous and decided to install the Nexus in our Dev server. We already have a working version in a virtual environment, but I’ve got my hands on a clean Linux machine and I thought to make best use of it.

I have found this blog post very helpful for a non-Linux native person.
It was very simple to get it started (after I have sorted out some environmental and user right issues).

Once I got it started at port 8081, I wanted to move the folders around. But I didn’t want to set the environment variables, just to make sure my folder structure works..

In order to do this the main file you want to edit is located here,

/[your system folder structure]/nexus-webapp-[version]/conf/wrapper.conf

the wrapper.conf looks like this – just out of the box..

#********************************************************************
# Wrapper Properties
#********************************************************************
# Java Application
wrapper.java.command=java

# Wait a bit longer than default before assuming jvm hasn’t started properly
wrapper.startup.timeout=90

#wrapper.debug=true
#This should be set to the base of your system, which is one folder below the container and nexus folders
#wrapper.working.dir=../../../../

# Java Main class.  This class must implement the WrapperListener interface
#  or guarantee that the WrapperManager class is initialized.  Helper
#  classes are provided to do this for you.  See the Integration section
#  of the documentation for details.
wrapper.java.mainclass=org.codehaus.plexus.classworlds.launcher.Launcher

# Java Classpath (include wrapper.jar)  Add class path elements as
#  needed starting from 1
#wrapper.java.classpath.1=../lib/wrapper.jar
#wrapper.java.classpath.2=../lib/my-app-1.0-SNAPSHOT.jar
wrapper.java.classpath.1=../../../lib/*.jar
wrapper.java.classpath.2=../../../conf/

# Java Library Path (location of Wrapper.DLL or libwrapper.so)
wrapper.java.library.path.1=./lib

# Java Additional Parameters
#wrapper.java.additional.1=-d64
#wrapper.java.additional.2=-Dcom.sun.management.jmxremote
#wrapper.java.additional.3=-Dorg.tanukisoftware.wrapper.WrapperManager.mbean=true
wrapper.java.additional.1=-Dbasedir=../../..
wrapper.java.additional.2=-Djava.io.tmpdir=../../../runtime/tmp
wrapper.java.additional.3=-Dsun.net.inetaddr.ttl=3600
#wrapper.java.additional.4=-Xdebug
#wrapper.java.additional.5=-Xnoagent
#wrapper.java.additional.6=-Djava.compiler=NONE
#wrapper.java.additional.7=-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
#wrapper.java.additional.8=-XX:+HeapDumpOnOutOfMemoryError

# Initial Java Heap Size (in MB)
#wrapper.java.initmemory=3
#

# Maximum Java Heap Size (in MB)
#wrapper.java.maxmemory=64
#

# Application parameters.  Add parameters as needed starting from 1
#wrapper.app.parameter.1=com.mycompany.app.App
#

# Make wrapper reload configuration between app restarts (NEXUS-3032)
wrapper.restart.reload_configuration=TRUE
wrapper.on_exit.12=RESTART

#********************************************************************
# Wrapper Logging Properties
#********************************************************************
# Format of output for the console.  (See docs for formats)
wrapper.console.format=PM

# Log Level for console output.  (See docs for log levels)
wrapper.console.loglevel=INFO

# Log file to use for wrapper output logging.
wrapper.logfile=../../../logs/wrapper.log

# Format of output for the log file.  (See docs for formats)
wrapper.logfile.format=LPTM

…..

I didn’t like the idea of having relative paths and leaving all the standard stuff aside, I only wanted to make sure it has got the correct base directory to work with.

So all I did is introduce couple of variable like this at the top :

set.REPO.HOME=/usr/local/your-base-directory-for-nexus/
set.NEXUS.HOME=/usr/local/your-base-directory-for-nexus/nexus
set.NEXUS.PLATFORM=linux-x86-xx

and for all the relative path-ed variable, just update them like this:

….

wrapper.java.additional.1=-Dbasedir=%NEXUS.HOME%
wrapper.java.additional.2=-Djava.io.tmpdir=%NEXUS.HOME%/runtime/tmp

# Log file to use for wrapper output logging.
wrapper.logfile=%NEXUS.HOME%/logs/wrapper.log

If you want to change the folder location, all you need to do is just update your HOME variable to the new path and all will be well. Hope this helpful !