while I.am_alive? do
read.think.innovate.share
I.wannabe_alive += 1
end
Sunday, December 27, 2009
Added Crummy to generate breadcrumbs for CampZero.com
acts_as_permalinkable: SEO friendly rails URLs using my first RoR plugin
Thursday, December 24, 2009
Sitemap-generator for your Rails App and deployment solution
- Installed the site-map generator plugin following this link at Aktagon's, github link
- For some reason, probably because of permission issues, my plugin install didn't generate the sample sitemap.yml file for me. However, I created the config/sitemap.yml file myself and put the following contents there:
domain: www.campzero.com
limit: 5000
priority: 1
change_frequency: weekly
- Then, I put the call to the sitemap method as shown in the github documentation.
- Finally, I ran the command rake sitemap:gerenate to generate my sitemap.xml file inside the public folder.
- So far this went well with the local environment. However, when I deployed this code and ran the rake command in my staging environment, it said it was not finding any model with the sitemap method.
- After some debugging, I found that the problem was with the code at the file generator.rb where they put model.methods.include?('sitemap_options') to see if the model contains a method named sitemap_options. But, at my staging environment, I found that this was returning false although there was this method inside the model. I changed the code to the following so that the include? check is done both for strings and symbols and it worked fine.
if((model.methods.include?(:sitemap_options) || model.methods.include?('sitemap_options')) && model.sitemap_options != nil)
models << model
end- Now, I could generate sitemap at my staging environment.
- However, soon I found another issue with deployment, as I want my sitemap file to stay between deployments. So, I had to ensure the sitemap file is generated at a shared place other than the default public folder. I did the following changes to the sitemap_generator_task.rake file:
if defined?(SITEMAP_FILE_PATH)
SitemapGenerator::Generator.new(SITEMAP_FILE_PATH).find_models_and_generate
else
SitemapGenerator::Generator.run
end
- I added the constant SITEMAP_FILE_PATH in my config/environments/staging.rb file to get it working.
- Finally, I changed my deployment script to define a symlink from the public folder to the shared file path as follows:
Tuesday, December 22, 2009
How to strip html tags, truncate and highlight texts in ruby on rails
- Remove all html tags other than hyperlinks and new lines from a html fragment
- Truncate the text to show only first 200 characters of the text and append ellipsis (...) in case the text was truncated.
- Highlight an array of words in the text to show the search query worlds that matched
<%= sanitize my_html_text, :tags => %w(br a) %>
<%= truncate my_sanitized_text, :length => 200 %>
#in the controller
@query_words = params[:query] ? params[:query].split(/\W/) : ''
#in the view
<%= highlight(truncate(sanitize(my_html_text, :tags => %w(br a)), :length => 200), @query_words) %>
Friday, December 18, 2009
How is Rails plugins helping me in developing CampZero.com?
- Get the latest code from the code repository.
- Create a link to the shared log directory.
- Create a link to the shared assets directory.
- Create a link to the full text search configuration file.
- Migrate the database schema.
- Change the link to the application to the latest code.
- Restart the full text search engine.
- Restart the web server.
- Rollback if any step of 1-8 results in a failure.
- Create account, with password encrypted.
- Get an email with an activation link.
- Verify email address by clicking an activation link.
- Login
- Logout
- Reset password
- Search by full text in the service description, title.
- Also search the service provider names and service categories.
- Rank by the ratings.
- Search using English morphology, for example, if searching for 'cars' it also searches for 'car'.
Thursday, December 17, 2009
"Promises are meant to be broken" and my 2010 promises
- By January 1, find two potential MS research topics and draw an outline of each!
- By January 1, reduce 1kg weight!
Tuesday, December 15, 2009
What I learned from my first semester at University of Calgary as a Grad Student?
Friday, November 06, 2009
Lean Thinking: You will probably like to learn the essence of agile
Image taken from: http://www.leansoftwareinstitute.com/images/img_bigpicture.jpgTuesday, October 27, 2009
Now reading: Lean Software Development: An Agile Toolkit
Saturday, October 17, 2009
Communicating tools for working on remote projects
- Getting the spec as intended by the client.
- Asking specific questions on time.
- Status update about progress, blocks and forthcoming events.
- Getting feedback as intended by the client.
- Making specific suggestions with rationale to the client.
- A note pad: I write down small bullet points as soon as I find a question/suggestion/idea.
- Voice chat/telephone call: It should be #1 preference. Its real time and most speedy after face-to-face. I use Skype for my voice calls and sometimes my phone as well.
- IM: I use GoogleTalk most of the time if it works with client. Otherwise, I just use the one that my client uses most frequently.
- Collaboration tool: I use ScrumPad.com. Post my messages, people get email notification and can directly reply on that notification. This way the collaboration is all captured in ScrumPad and we can also keep using Email.
- A wire framing/drawing tool: Sometimes a small sketch/piece of drawing may greatly ease the communication hurdle. I use MS Visio at times. However, I also use scanned copies of hand drawings and annotations. It works. However, I am looking for a good web based wire framing tool and I believe it will off-load a lot of decision confusions.
- Desktop sharing tool: Screen capture and desktop sharing also works for me. I use LogMeIn and Xing. These tools offer first class feedback capturing capability from remote clients.
- Always have a prioritized list of points that I want to discuss.
- Be on time.
- Never stay disconnected for more than 3 business days.
Tuesday, October 06, 2009
Web application user interface without any Menu
Monday, September 21, 2009
Showing unread posts/comments: An example of rails ActiveRecord 'touch'
"As a partner, when I visit a project's dashboard I want to see five most recently started or updated discussion threads with number of unread comments, if any. If any of these are new, I want to see them in a highlighted view. Next, if I open the thread, I want to see all new comments in a highlighted view as well. However, once seen, the threads/comments should no longer be highlighted from the rest."
class Message
has_many :messages_read_times
end
after_filter :update_message_read_time, :only => [:show]
def update_message_read_time
read_time = MessageReadTime.find_or_create_by_message_id_and_user_id( params[:id], current_user.id)
read_time.last_read_at = Time.now
read_time.save!
end
class Comment
..
belongs_to :message, :touch => true
def unread?(user)
read_time = self.message.message_read_times.find_by_user_id(user_id)
return true unless(read_time)
return read_time.last_read_at < (updated_at || created_at) end end
class Message
...
def unread_comments(user)
self.comments.collect{|comment| comment.unread?(user) ? comment : nil }.compact
end
def unread?(user)
read_time = self.message_read_times.find_by_user_id(user.id)
return true unless read_time
return self.updated_at >= read_time.last_read_at
end
...
end
Thursday, September 17, 2009
Some useful plugins for RoR projects
Wednesday, September 09, 2009
The CGI story on agile scaling success on a large project
PAS was a joint venture development initiative by 4 major oil and gasThis was my first ever meet with the Calgary agile methods user group, CAMUG and it was a great experience. Off late, I have been looking for my graduate research topic on agile methods, especially around scaling agile beyond a single team and this was just a perfect session for me.
companies and CGI. Devon, Encana, Husky and Talisman joined with CGI to
develop a new Production and Revenue Application. Each company put 3 senior
business resources on the project. The development component of the PAS
initiative cost $35M over 5 years with up to 90 people on the team. This
presentation is on how we used Agile to achieve this mammoth undertaking.
The product is currently running in production at 5 major oil and gas
companies with great reviews. It is also in production for several mid and
smaller sized companies. CGI is currently marketing the product.
- The project continued in dev mode for 5 years, a $35M project.
- It started with only 3 members and extended to a team of 90 following Scrum+XP.
- The project had 5 sponsoring companies or clients.
- They had 6 teams working in the same sprint cycles.
- In each team, there were significant members from the business working full time with the team onsite and in the same open-space arrangement.
- They had some 3000+ unit tests and also 300+ acceptance test.
- They automated all repetitive tests.
- The had external experts visiting them from time to time. Eric Evans once visited them and helped them getting better grasp on Domain Driven Design.
- There had been a $800K and one month deviation from the projected cost and timeline.
- They had to balance between features/bug fixes.
- The deployment was taken care of by the respective sponsors, not the teams.
- They had issues with sprint backlog management.
- Open communication is the key to success.
- Onsite and full time real user availability is very important for such a big project.
- Automated tests, partial pair programming and continuous integration is a big plus.
- Staying co-located was really helpful.
- I asked them, if they felt it would still be a similar success if there had been 12 teams or even more with 200 people or so. They said, it would be challenging. But in response, they also said, following waterfall would make life much harder with such a big team, if at all it could be a success at the first place! Yes, I also believe this.
- One of the audiences asked if they outsourced a part of the project and the response was 'No'. CGI has a big team in India with a very high CMM ranking, but the project manager and asst. project manager said, it would be much difficult for differing time zones. Also, it would be difficult to transfer the knowledge as well as replicate the value of onsite client presence. The development manager also added that, the cultural difference between an agile and CMM setup would also been an issue if they had to go for the off-shore team.
Sunday, September 06, 2009
A new home at Calgary and starting days
Wednesday, August 19, 2009
Rambling stories from my days @ Code71 : My Takehome
Tuesday, August 11, 2009
Rambling story from my days @ Code71: My reading list
In my previous post, I got a bit nostalgic! However, ever since I posted the first one, I was looking for another post on the series. Trying to capture what I learned during the past 3 years, I found it would be really time taking for me and my readers. So, I sort of compiled the following list in this post. Hope it helps someone who is just eager to learn about software.
Books
- Founders at work
- Patterns of Enterprise Application Architecture
- Refactoring: Improving the Design of Existing Code - By Martin Fowler
- Patterns & practices Application Architecture Guide 2.0
- Agile web development with Rails
- Head first Object-Oriented analysis and design
- The scrum primer
- Code complete
Most visited sites
Blogs
Community
Saturday, August 08, 2009
Rambling stories from my days @ Code71 : Startup days
Sighs!
Back then, on Friday, May 26, 2006, I was a final year undergrad student at CSE, BUET. I was looking for a part-time software dev job opportunity and found a little one page advert for a student job at asha-technologies (lately renamed as Code71). Visited their website and thought it might be worth giving a try!
As usual, I was interviewed over phone and enjoyed a long 2 hour interview on premise. I found it really inspiring and gained more interest towards the job after this session. I started waiting for a response… but was pretty certain about a positive one!
Good things happen in quick successions in our lives. Agree?
I agree. Because I just started a soul-journey with my soul-mate, Shahana, on the March of 2006. Then got the job offer on the 26th of May! Couldn’t be happier. A job for me during that time was just beyond its compensation, it was an inspiration, opportunity to see the real world and being part of something bigger than myself.

Photo taken at Chhera dip (The Torn Island), St. Martins, Bangladesh. The last photograph taken with my first digital camera bought from my first month’s Salary!
I started my job on the 1st of June, 2006 at Asha-technologies. Asha-tech was still to find an office and Omar asked to meet him at his home office! That’s how it all started. We met a few times a week at Omar’s home until we moved to our office at the green building of green square at green road, Dhaka on the first of July.
Asha-tech signed up a client before it was even formed! So, once we moved into the office, we were building our first asha-tech product, an online loan financing gateway. We were enthusiastic about agile scrum/xp practices from the first day at office. The result was found in just less than 3 months. We rolled out our first release of the product. It was really a happy start. A fantastic start for a start-up. The client started generating revenue in less than 3 months of project inception!
The office setup was a small but adequate enough for our team. We installed long backup UPS (2 hours * 5 computers), A/C, IPS and dedicated internet connection with Wi-Fi. The work environment was full of fun. We were going for an outing to a team event every month and even more often going to delicious buffet places. We played table football and bowling… every time had a record breaking score and a new winner. We went swimming and believe me, Omar is as good a swimmer as he is a master in software technology. He would go to swimming with a flipper and flip like professional swimmers. He can even swim without using his hands/legs at all, lying side-on and in all such actions… I learned swimming keeping heads down and the easy way of breathing from him! Thanks!
Technologically we were maturing as well. Started using XPlanner for managing our project, attended daily standup meetings and started doing TDD. I won’t claim we got everything right at the first try… but, we were trying consistently, improving bit by bit… to this day.
For the most part, I was enjoying my job and became used to the pressure of a job + undergraduate studies. I said, good things happen in close succession. Another proof here! My first term final result with this job was a 4.0/4.0. I never scored 4.0 in a term before this nor had a 20+ hour/week job alongside my studies.
I strongly believe, my job taught me the attitude towards work, “plan, act and retrospect”. After over three years, I would suggest any new entrant in the software industry to start a career with passion. Its fun with passion. Its a win everyday with passion.
Thursday, July 16, 2009
Rails modeling guide#2: naming convention for ruby on rails model methods
Naming conventions play an important role to the software's overall architecture. It is not a rocket science, still, it may lead to unhappy consequences if not taken care of at the early stage of a project. This small best practices can make a code base significantly improved.
Rails does a good job by using the dynamic power of ruby and providing with a handful of dynamic methods with the models. ActiveRecord::Base and its included modules follow a consistent naming, which clearly represent the intended purpose of the methods. At Code71, we are working on ScrumPad, a 2nd generation agile scrum tool using ruby on rails and our model methods are named according to the following rules-
1. All boolean returning methods end with '?'
company.billable?, sprint.current?, story.in_progress?
2. Boolean methods do not start with is_ or has_ or did_ (as you might see in other popular languages)
company.is_billable? -> company.billable?
sprint.is_current? -> sprint.current?
3. find_ and find_all are used only for class (self.find or self.find_all) methods and should return a single/array of object of the class respectively.
find_* methods may return a single object of the class/nil
find_all_* methods return an array of objects of the class or [], but never a nil
4. No methods start with a get_ as other languages.
5. A method ends with ! if it alters the object itself.
sprint.close!()
story.progress!()
6. Methods that persists an object/may throw exception, should always end with ! (implied from rule 5)
invoice.update_status!(:paid)
7. Always use parentheses '()' in method names. Future versions of ruby is deprecating the support for method names without parentheses.
Following these 7 simple rules we have consistent and intuitive model method names across the whole ScrumPad. Let me know if you have any suggestion to these names to make it even better.
Rails modeling guide#1: right structure of a ruby on rails model
Rails models are no exception compared to the super models! You are in the business if and only if you got a good physical structure and can stick to it for years...
At Code71, we are keeping our rails models attractive following a few guidelines. I will be posting these guidelines in a series and here goes the first one - about the physical structure of the ruby on rails models.
We keep the following order consistent in our models:-
- CONSTANTS
- has_one, has_many, belongs_to, has_and_belongs_to relations in dependency order
- plug-ins initialization (acts_as_tree, acts_as_state_machine etc.)
- validates_presence_of
- validates_uniqueness_of
- validates_numericality_of
- validates_format_of
- custom_validations
- named_scopes grouped by related purposes
- active record hooks (after_initialize, before_create, after_create, ...) in execution order in the format (after_initialize [:assign_default_state, :sanitize_content] )
- protected
- hook method implementations according to execution order
- public
- constructor
- class methods in alphabetic order
- other methods alphabetically or grouped if related
- protected
- methods alphabetically or grouped if related
- private
- self methods in alphabetic order or similar methods in a group
other methods in alphabetic order or similar methods in a group
Rule
No method gets code real estate over 20 lines. If needed, one/more private methods are used.
How is this helping us?
- We are absolutely sure where to look for a method or where to write a new method.
- The code base is really consistent.
- The unit test methods also follow the same order, which makes managing the test suite easy.
More to come later this week. Stay tuned!