BookJetty: Upcoming Updates

WED, 17 OCT 2007

BookJetty is preparing itself to support the social elements so you can follow your friends’ or strangers’ bookshelves.

Did a face lift, opting for a simpler homepage, adding friends ala Twitter.com, with simple news feed to keep you updated of what’s new in your network.

This is probably the biggest change ever at one go, gonna tidy up some back-end codes as well, planning to go REST-ful with RSpec/Behaviour Driven Development (BDD), so it’ll be easier to maintain, as the functionalities get more complex.

So it’s going to take a while, but a sneak preview into what BookJetty will look like. Hope you will like it.

Home Page

Home page

Dashboard

User Profile Page

User Profile

PopOut 07

TUE, 2 OCT 2007

The Digital Movement guys are back in action with PopOut 07. Thanks to them for inviting me to share a bit about BookJetty, and I also look forward to learn from the sharing of other startups which have already made the cut, like Bezurk.com, Recruit.net and the others.

It’s a short meet-up, two and a half hours, this coming Thursday night, at Suntec City, do pop by if you have nothing else better do. To register, click here.

PopOut 07

UPDATED (07 Oct):

Definitely a night to remember, for those who were there, thank you all for your warm response, for the whole TDM Team, thank you for the hard work put in, for the slot given, and for another great event.

For those who missed it, here are some reviews by fellow bloggers:

(continued from previous post)

Code::XtremeAppsI reached School of Information System at about 10:35am, I was early, registration starts at 10:30am, competition starts at 12:00pm. Many people were already there, eager and ready to get started.

I found a corner, sat on the floor, shortly after three familiar faces walked into the briefing area, I stood up, and it was strange that we greeted each other from far, we knew each other’s name, though we had never met before. Well, the power of blog and mailing list, they are the Malaysia Ruby Brigade guys, Kamal, Azizat, and Ke Gan, the RSB Team. Glad to have finally met them in person.

Soon, the briefing started, and minutes before the competition kicked-off, I found out that the package given to us after signing in had a slip of paper with the competition theme. And I was stupidly oblivious to it, no wonder, I saw people were busy brainstorming, drawing diagrams with their group members. “Shit”, I said silently. The theme was Hospitality and/or tourism services in a participative society.

In no time, the competition started, 73 teams in total spread across different seminar rooms, I was in room 2-1, glad to have a front row’s two-seater desk, not much distraction.

Plugged in my iPod, and blasted my favourite songs, I started to brain-storm, 45 minutes passed, I wasn’t still very sure what to do, panic started to kick-in, I quickly decided on one, working on the idea for the next two or three hours, it was getting worse, I knew something was wrong, the functionalities were not clear, there were just too many things to do and too little time.

I thought, I’m dead, this is not going to make it. I seriously thought of just packing my stuff and go back, I have lost too many hours.

Then I got an SMS from my wife saying that some of my friends said ‘Cia Yo‘ (meaning don’t lose your spirit). I was glad that it came at the right time, then I told myself to relax, Herry, you don’t come here to win, you come here to try your best and have fun.

I walked out from the room, took a break, took a deep breath, gazed at the sky, when the pressure is out, my brain started to work again, I remembered what Paul Arden said in his book Whatever you think always think the opposite, so I thought of something else related to the hospitality and tourism industry, someting different, yet it is clearer and it is easier to execute, somthing simple and makes sense. Bingo, I said.

I came into the room as a different person, my old self, I broke the idea into smaller tasks, prioritising improtant tasks, took out all the fancy stuff, will do the fancy stuff only when I got the time. Set a targetted completion time for each task, and I worked like a machine, drank lots of water, went out of the room only to fill up my water bottle, to wee wee, to eat and answer phone calls Yeah I still answer my phones. :)

I could not believe that two days ago I was on this beautiful beach, dozed off in a hammock, and now I’m cracking my brain, and typing like it was gonna be the end of the world tomorrow.

Hours passed, it was morning already, I was still fully awake, iPod still blasting, I felt good, for completing a task each time, I felt better when I completed a few more.

Two hours before the dateline, my fingers started to ache, though I was fully awake, but I felt a bit numb and slow, I told myself, It’s enough Herry, just deploy, test, fix and do whatever necessary in the last two hours.

At 12:00 pm, it was finally over. This is crazy, I thought, this is extreme indeed, exhausted, I was glad that I did not call it a quit, I was glad that I have done my very best.

At this stage, whether you win or not, it does not matter anymore, for those who have gone through that very night, give yourself a pat on your back, we all are winners.

The next day I was shorlisted with 10 other great teams, I gave another short presentation, and this morning I received an email saying that I have won the second prize, not believing my eyes, all I could say, thank you Jesus for the second prize.

And not forgetting Ang, who was kind enough to lend me his notebook, to Peter Bohm who had helped many of us with deployment issues, to Chardy for his last minute’s tip, to the organizer, ITSC, and the supporting organisations. Kudos for the job well done, I was impressed with how smooth and well the event was executed. Hopefully this will be the start for many similar exiciting events to come.

If you are wondering what happens to the two cans of Red-Bull? Good question, I totally forgot about them.

Two Extremes of Life

TUE, 25 SEP 2007

It has been a while since the last time I took a break from work, trekking in Cameron Highland.

Last week, after attending a friend’s wedding in KL, I took another break, I thought it is about time, living in old estate in Ang Mo Kio, every now and then I was reminded that life is short.

So my wife and I headed to Redang island, north-east of peninsula Malaysia, a small island with its white sandy beach, and swimming-pool-clarity sea water.

We were there for three days and two nights, went snorkling each day, seeing lots and lots of fishes and corals, and eat and relaxing for the rest of the day.

It was really weird on the first day; weird and strange that life could be so slow and quiet, no checking of emails, no coding, no phone calls. It was just me, the sun, the sea, the sand and my wife. One extreme of life I thought.

One lazy afternoon, I layed on a hammock, hanged under a big tree facing the beach, it was slightly windy, the breeze was caressing my face and my hair, this must be heaven, I thought, so I took out my wife’s point-and-shoot camera, took a snap, before dozing off.

Redang

Three days had just passed, I was back to Singapore, after a good night sleep, the next morning I packed another bag, loaded with a borrowed notebook from an angel (mine collapsed), an iPod, and two cans of Red-Bull.

I headed to Singapore Management University (SMU) for code::XtremeApps, a 24-hour programming contest, organized by Information Technology Standards Committee, first of its kind in Singapore and first time ever I joined such a competition, not realizing what trouble I have brought myself into, another extreme of life, I thought. (to be continued…)

When I built BookJetty, I knew that I am not going to stop at just one library, our good home library, Singapore National Library Board. I dreamt for BookJetty to integrate with a lot more libraries worldwide, and to benefit more book lovers around the world.

Three weeks ago, I started the quest to fulfill that dream, and I digged through documents, websites, guidelines related to Z3950 protocol and MARC standards, visiting hundreds of online library catalogues worldwide, and rewriting BookJetty library module to create a facade that can easly link up with more libraries.

Library preferences

And today, I am glad to announce that BookJetty finally goes
international, integrating with 300 libraries from 10 countries, covering United States, United Kingdom, Canda, Australia, New Zealand, Singapore, Hong Kong, Taiwan, Ireland, South Africa, and probably more in the future.

For a start, when you sign up for a BookJetty account, your library preference will be empty. When you try to list books with library search, you will be redirected to your library preferences page.

Select on one or more libraries in your area, you can also filter the list of libraries by country. Click once to add the library to your list, or click again to remove.

Your LibrariesOn your library list you should see all the libraries you have added earlier. You can also click on del to remove a library from the list.

Sort librariesTo sort, click on Reorder, then drag and drop to re-order your libraries sequence. Click Done Reordering when you are done.

When you go back to your book list, it will search the first library in your list. To check other libraries, mouse over to the library name, and select another library name, and it will perform the search without a page refresh, thanks to AJAX for that.

Change library

Call no tooltipClick on library call number, to view the book holding information or to reserve. Or if you mouse over, you can also click on SMS call no to your phone on a small yellow tooltip, if you need to visit the library to pickup the book. For special integration with Singapore National Library Board (NLB), you are able to view holding information directly from BookJetty.

Multiple libraries searchThe library search on the book list is very convenient to check multiple books availability in a library. But if you go to a book details page, you will be able to check if the book is found in all your local libraries.

If you no longer need the library service, you can click on the collapse button on top right corner.

Library search collapsedCollapsed state of library search panel, it will stay collapsed when you browse other books until you expand it again.

Now try BookJetty with your local libraries. Click here for the list of libraries supported in BookJetty. If you can’t find your local library, suggest it here, or find out more about library integration with BookJetty.

If you encounter any problem, drop me a note, and I hope that you will find BookJetty useful. There are still tonnes of todo lists to work on BookJetty, your suggestions, comments, and bug reports will be definitely priceless to me.

Thank you.

NLB LogoYes, you get it right, it is a web service and it is with Singapore National Library Board (NLB), and it has been successfully integrated nicely with BookJetty for slightly over a week in stealth mode, and today after it is more or less stable, I can finally announce it.

This is probably one of first integration using web service with a public sector in Singapore. In anyway, it’s a new beginning, which I hope this will lead to more of amazing stuff that will benefit many when more organisations be it public or private starts to open up their non-sensitive data through an Application Programming Interface (API).

I am glad that today has finally come, before, BookJetty has been slogging through the hard way, using screen scrapping and session pooling, with worries that the service can easily break with a small change in the library online catalog, scalability issue due to sessions maintenance, and worse, blocked.

Today, those worries should not no longer be there, it definitely makes day, and the day for all the BookJetty users in Singapore.

Many thanks to Singapore NLB for taking this initiative, special thanks to Jamieson Teo who helped to advocate and facilitate this integration, and to Ling Xia, for her fast and excellent support during the integration phase, and finally to the management for giving the green light.

My warmest gratitude to all.

Book Review: The Dip

MON, 20 AUG 2007

The Dip: A Little Book That Teaches You When to Quit (and When to Stick)

I have to ashamely say that I read this book at Kinokuniya book store, after a failed attempt to look for a sketch book this afternoon.

If you look at the cover, the part where the stick man stands, is the dip, the period when beginner’s luck has run out, when things are going tough, when many call it a quit, and cause you to be scarce if you stay on – which is a good thing – and when you persevere and take the right steps to ride through the storm, that’s when you your efforts will pay off again and the dip turns upside down.

I’m not sure if I’m getting lazy, but nowadays I started to have a good impression with thin books. This book will help you to analyse your current situation, if you are in the dip or in a cul de sac, if you should stay on or if you should call it a quit.

Advocating that successful people are not the ones who don’t quit, but also those who know when to quit. It is alright to call it a quit, the idea is not to waste time and resources on things that will not work, but to focus on areas that will work.

Something that I can relate to as a young startup, and it also reminds me of my hurdle in relationship.

BookJetty gets another new feature, last night, I applied the Add to Favorites feature replacing the loveit tag. All books tagged with loveit are now marked as your favorite books, and that tag has been removed.

Add to favoritesThe Add to favorites icon is a nice looking small flower-pattern icon on your book list, when not selected, it is shown in light gray to reduce the amout of noise in the book list. Following its close cousin, the AJAX-based star rating feature, adding to favorites is a breeze; just click on the icon without a page refresh.

Book favoritesOn your book details page, we now have an indicator showing home many people have favorited this book, and you can also add/remove from favorites through a shortcut found under your shelf panel.

Favorites shelfOn your book list page, there is an additional favorites shelf to filter out your favorite books.

Favorites can be a great indicator for a good book supporting the book rating and review information. So start adding your favorite books now, and more to come for BookJetty.

I was playing with SOAP4R again lately, as I needed to connect to a web service, and the experience had been smooth, from the code generation using wsdl2ruby up to the part when I tried to connect to the service.

My SOAP request could not be translated by the server, because SOAP4R will automatically append n1, n2, n#…namespace to your elements or attributes, and the service that was expecting elements without n# namepace.

 <n1:ServiceContext xmlns:n1="http://domain.com/name">
      <n1:UserName>x</n1:UserName>
      <n1:UserAccessKey>x</n1:UserAccessKey>
      <n1:Password>x</n1:Password>
 </n1:ServiceContext>

I thought, to fix this should be easy, by changing some settings when generating the request document, but the problem was, where should I set.

Not being able to find any clue in the rdoc and SOAP4R how-tos, forced me to code-trace like a British spy, but thanks to ruby-debug for making it easier.

And here is the trick, to use default namespace or to remove the default n1, n2, n# namepace, when calling SOAP::RPC::Driver#add_[rpc|document]_operation method, set the elementformdefault or attributeformdefault option to true, for element and attribute namespace handling respectively.

If you are using wsdl2ruby to generate your SOAP::RPC::Driver, edit [ServiceName|default]Driver.rb and append the options to each of the methods generated:

Methods = [
  [ "http://domain/ws/ServiceName:Operation", "operationMethod",
    [ ["in", "operationMethodRequest", ["::SOAP::SOAPElement", "http://domain.com/ws/ServiceName", "OperationMethodRequest"]],
      ["out", "OperationMethodResult", ["::SOAP::SOAPElement", "http://domain.com/ws/ServiceName", "OperationMethodResponse"]] ],
         { :request_style =>  :document, :request_use =>  :literal,
           :response_style => :document, :response_use => :literal, :faults => {},  
           :elementformdefault => true, :attributeformdefault => true  }
    ],
    
    # Other methods
    ....
  ]

If you are like me, most likely you will have quite a number of methods to apply, what you can do is to put a short plug in init_methods to enable that options for all methods, and that, will be nice and DRY.

[ServiceName|'default']Driver.rb
-------------------------------

def init_methods
  Methods.each do |definitions| 
    # set options to use default namespace instead of using n[#]
    opt = definitions.last
    opt.merge!({
      :elementformdefault => true,
      :attributeformdefault => true
    })
    
    # rest of the codes generated by wsdl2ruby
    if opt[:request_style] == :document
      add_document_operation(*definitions)
    else
      add_rpc_operation(*definitions)

      ....              
    end
  end
end

Apple Worlwide Developers Conference 2007 has passed for almost two months by now, and all the huzz and buzz of iPhone has started to calm down.

But, time-travelling to about a month ago, the day when I met Joe Goh, one of the very few Mac developers we have in Singapore. It was over a-cup-of-coffee talk, a nasi-briyani and roti-prata meal at Ang Mo Kio (AMK) Hub, he shared his experience at the conference, and one thing that caught my attention was The Bay Area Rapid Transit (BART) Widget, the winner of 2007 Apple Design Award (Dashboard Widget Category).

BART_widgetBART widget is small swiss-army tool that allows commuters to plan trips on the BART subway system in the San Francisco Bay Area.

When he showed me the widget, I was fast to be impressed at the amount of information packed nicely into such a small widget, and its intuitive design that delves with immediate feedback and speech synthesis. The best of all, that widget was all done basically with HTML, CSS and Javascript!!

The BART Widget proved to us, that given enough thoughts and creativitity, much we can do to replace the simple and traditional web interfaces that we all have been familiar with.

Finding out more about Bret Victor, the guy behind BART Widget, I found a paper he has written on User Interface (UI) design, named ‘Magic Ink‘. If you are a software developer or a UI designer, nothing beats bumping into a resource as delicious as this.

Bret stresses that information software design can be seen as the design of context-senstive information graphics, which he shows clearly through his widget, and he steps through the process and throughts behind the creation of BART widget, which I think is an invaluable information.

In the paper, he also shows other great examples on how a typical information-rich page, can be redesigned into a context-sensitive information graphic. An example shown below:

Flight Original

Consider the re-design:

Flight Redesign