Procedure for making changes and deploying those changes to the web site which is powered by Wordpress:

All links should be relative using /. Do not hard code the URL scheme or the host name.

We should have a web based tool to copy the database from one environment to another. We never make change to the production wordpress database. To make change to the web site, we must first copy the production database to another environment (probably the QA environment), make all the changes in that environment, do a thorough test on all the changes, and then copy the database from that environment to production.

We do nightly backup for the wordpress database on production.

The above scheme may work well, but we may lose user comments.

How to mask different ports?

Because we have different products which maybe implemented using different technology, each product may need to run on a different port, how can we allow transparent access to each product so that we do not have to remember the port numbers? To do this we can set up an Apache VirtualHost which proxy the request to different port for different product. We can also set basic authentication, force https on certain resources, and other things that the technology being used by the product does not offer.

Miscellaneous thoughts:

  • Normally I receive the PRD. I have to understand it, break it down into tasks. During this process, I may not see everything. The PRD may seems to be complete to me, and it seems to be complete from the product owner's perspective, but it may not be complete from the QA perspective. Using HTML prototyping may help. Front-load QA resource (collaboration between QA resource, product owner, UI designer, and possibly developers) during the prototyping phase will help. During the prototyping (UI design phase), the product owner (the best person that know the product and the new feature being built) should write the acceptance test plan. QA resource will review the test plan, improve the test plan using the HTML prototype. During this phase, front-end developer will assist in the prototying (write JavaScript code and stub-data-store). Front-end developers should also write automated test for both JavaScript and UI acceptance test. During this phase, back-end developers will plan as much as possible the back-end components that are required. When the front-end developer create a stub-data-store, he should inform the back-end developers, so the back-end developers can work on that (hand in hand), notify the front-end developer when it is done and the front-end developer can switch to use real data store. Back-end developers will also write automated unit test at the code level. When the prototype is done, and deliver to the back-end developers, ideally, all that is left to do is to put the prototype onto the server, commit the code, run through the acceptance test plan once, fix any remaining bug, send the build to QA. As you can see, there is a tight integration between UI designer and the rest of the team during the entire cycle, even during the prototyping phase. Back-end developers should not be the one doing the "task break down" exercise. It should be a team activity.
  • We should take break (days off) between the cycles to recharge ourselves
  • Use e-mail for notification. The email should not contain the data that need to be discussed. What ever tool we use for collaboration should be able to send out the URL for the resource being discuss. The sender address should be moc.baltlob|ylper-on#moc.baltlob|ylper-on. If the recipient accidentally reply to the email, he should receive a bounce message.

Action items:

  1. Sign up for AWS free usage
  2. Set up Subversion server (allow access through an SSH tunnel, no http)
  3. Install wordpress for
  4. Set up Tomcat to run the Java application
  5. Install Redmine or or MantisBT
  6. Install rsyslog. Configure it to work with Apache (both error log and access log), subversion, logrotate (keep the log files for 7 days).
  7. Put together a script that I can use to delete stuck email queue for Clinical Cafe.
  8. Extract out the tooltip library that I created for AstoundLearning and put it on github
  9. Learn Node.js and Meteor
  10. Learn more about using Selenium and other front-end unit-testing to test against the html prototypes. See if we can test the html prototype, and re-use that test suite to test the actual application.
  11. Learn "Ruby on Rails"
  12. Learn more about AWS (VPC, Email, HIPPA)
  13. Evaluate justinmind, axure, to see if we can re-use the prototype code so that UI designer can focus on designing the UI, and back-end developer can focus on the back-end code that provides data to the front-end
  14. Evaluate tool to manage user stories. If all these project management stuff is too complicated, perhaps we should use Wordpress for project management. Perhaps, each week, we can create a new blog to document the tasks that need to be done.
  15. Blog (a blog post) about my background and the challenges that I have at X (see below)

Long term items:

  1. Parse the aggregated access log and store the result in a database. Keep it in the database for one day. We should be able to run the script that parse the access log at any time so that we can query the table that contains all the requests to debug problem. We also want to graph the load pattern to see historical trend, and project future needs. The aggregated access log can be parsed by a cron-job every 3 minutes, and it also submit the sum of all requests with that interval to Nagios.

What I want to do with the intranet?

The intranet is a communication platform, as well as a repository of knowledge which my contains some sensitive information. Therefore, in certain areas (in the intranet), information should flow freely among internal folks, and in other areas (in the intranet) information need to be protected by different realms. We can use Apache htpasswd Users and Groups.

Whenever someone publish a page, publish a post, or provide a comment, I want the system to email all users who should have access to the content. For this purpose, I may need to write a plugin that would query the htpassword file and retrieve all users who should have access to this content. The htpassword database does not contains email, so when I configure the users, I must make sure that the username that I put inside htpassword file match the username used by Wordpress.

Perhaps we can use some iphone / mobile RSS reader which we configure to remember the authentication credentials (htpassword user name and password).

The home page of the intranet should show an activity stream.

Naming themes for our releases / conference rooms / anything:

  • Popular city / vacation spots: when going into meetings, it’s nice to counter act any feelings of stress, anxiety or intimidation with themes that create positive emotions, as in the feelings generated by getting away
  • World leaders
  • Popular athletes
  • Popular movie stars
  • Popular singers
  • Heros
  • Greek Gods
  • Celebrities


How to pin a web site or mobile web application to your mobile device home screen?
eHow: How to Pin a Bookmark to an iPhone Home Screen

Open source micro-blogging software:

The idea behind this is to allow us to blog, tweet, share information, update our thoughts and status from anywhere using our mobile device. We will be using Wordpress for our corporate intranet. Of course, our intranet will be locked-down. On the intranet landing page, we should be able to see activity stream from our micro-blogging app. Ideally, we should be able to use Wordpress from our mobile device and we would not need a micro-blogging software, or we can use a micro-blogging software without using Wordpress.

How to detect mobile browser from the server side?

If the mobile user hit the regular home page, redirect him / her to the home page for mobile devices. The home page for mobile devices would have a link to allow the user to view the regular content. Perhaps we can do this using mod_rewrite (if certain parameter is present in the URL then our server would not redirect the user to the home page for mobile devices).

HTML prototyping:

The idea is to achieve clear separation of responsibility between UI designers and back-end developers. UI designers should not have to wait on the back-end developers to make a change. Back-end developers should not have to tweak UI stuff. If we achieve this, we would be a lot more efficient. documentation



Open source project management tools:

If we use Gmail Tasks, can we share our task list?

Open source collaboration tools:

Open source mind mapping tools:

What is mind mapping and how it can help us?

Open source bug tracking tools:

Open source ERP / CRM tools:

Open source time tracking tools:

Open source test case management:*Z%28SM%29*J%28COL%29*R%28createdate%29*K%28colarchive%29*F%28~%29*&sidx=6&sopp=10&sitewide.asp?sid=1&sqry=*Z%28SM%29*J%28COL%29*R%28createdate%29*K%28colarchive%29*F%28~%29*&sidx=6&sopp=10

Miscellaneous stuffs:

Amazon Book: Building iPhone Apps with HTML, CSS, and JavaScript: Making App Store Apps Without Objective-C or Cocoa For Proposals and Proposal-Management/Sales Capture and Proposal Management Software For SharePoint and Documentum.htm

Challenges that I have at X:

  1. I am a bit shy. I don't talk about myself enough. And due to a variety of reasons (family, language), I tend not to hang out in a group. Therefore, I would like to use this page as a forum to share with you my background, believes, and challenges so that we can work together on the same level of understanding.
  2. I have about 10 years of experiences as software developer. I started my career as a software developer in 1999 with a small startup doing online payment, money transfer, combined with pre-paid phone card distribution. I was there for about 1 year. The company ran out of money. I moved on to another company (private own, about 50 people) doing physical mailing and physical warehousing and distribution of customers' marketing materials. For their inventory system, they were using Pick, UniBasic, and Universe. The previous programmer left, and the vendor that was supporting them also went out of business. They brought me in to support the current system, and to design a new system so that the new system would be accessible to their customers via the web. There was a lot of office politics going on within the company. After about 1.5 years, the new system was deployed successfully. Six months later I was laid off because the company wasn't doing well. One year later, I joined a company (private own, about 250 people) doing online networking. The company made a lot of money, has over 20 million users, and they have about 1 million users online at any given moment. I learned a about back-end performance optimization. I also worked in a team. Due to the nature of the work, I left the company after 11 months to join another startup to do marketing automation. I joined this startup as the first employee. I was responsible for one of the most critical component within their platform. My responsibility was to develop and maintain the component that rewrite web page on the fly. Our customers send emails to their customers using our web application. The email would contain links to their web sites. We parse the email, rewrite all the links so that when the recipient clicks on the links in the email, it would go through our servers. My content-rewriting proxy would fetch the page from the original server, rewrite all the links, and send the page back to the browser. To be able to rewrite all the URLs within a page, I have to do all sort of crazy things because URLs can be dynamically generated via JavaScript, and Flash. We also have a JavaScript snippet (like Google Analytics) that the customer can installed on their web servers, but the content-rewriting proxy was more critical. It allows our customers (marketing people) to try our product without having to get a developers to put the JavaScript snippet onto their site. After they tried our product, if they have some issues or concerns with the content-rewriting proxy, we provide them with instruction on how to install the JavaScript snippet onto their site. Our product is much like Google Analytics, but at the individual level. When the recipient click on a link in the email, we notify our customer. Our customer would then be able to follow the pages that the visitor clicked, and be able to help the visitor find what he / she was looking for. We were a startup. We had a lot of growing pain. Beside the content-rewriting proxy, I also involved in scaling our IT infrastructure, our email infrastructure, and participated in main product development when possible. While we were busy building our product, and struggle with growing pain, we hired a college grad. Because we were very busy, we did not even have time to train and utilize this guy. We didn't utilize him for six straight months. He had a lot of time on his hand. He learned the code. He also learned about Agile Development because one of the founder heard a lot of good thing about Agile Development. This college grad pitch Agile Development to the company and was immediately adopted by the company. This college was also a very talented developer. He pitched good software development practices to other developers (mostly new hires) in the company, and convince the company to hire his friends. He got promoted as the development manager for the main product line. Was this fair to other developers? No. I cannot recall why other developers do not like this college grad, but from this college grad's perspectives, these experienced developers who had been with the company longer were obstructions to his promotions. When he became the development manager for the main product, and when he got his chance, he convinced the management to lay off these experienced developers. Finally, after being with the company for 4 years, they laid me off (separately) due to financial meltdown in November 2008. During these 4 years, I learned about debugging techniques (on the client side, on the server side, at the operating system and network level). I worked alone most of the time due to the nature of my work. I also had limited opportunities to work in a team environment. I joined X (in my context) in August 2009. X has teams, but most teams consist of just a single developer. I prefer to work in a team environment where there is at least two engineers. Those of us who are engineers, and had to work in a team where you are the only engineer, and a tight deadline environment know the challenges. When I was in such environment, from time to time, I made right decision for one problem but broke other things. My design was not solid because I did not have enough time to think, and did not have another engineer who is familiar with the nature of the same product or technology to discuss the designs and alternative designs. Sometimes we just need to talk to another engineer who is familiar with the same product or technology. That engineer may or may not have enough time to understand the problem or propose a proper solution, but just by talking, you may come up with a solution that work. At X, at least for me, it was hard to reach out to other developers we are not integrated. Most team consists of one developer, and is responsible for a single product. When I need help, but reaching out to other developers required that I spend a lot of time explaining the problem, and when I need help, other developers might not be available because they have their own priorities. At X, we also did not have a culture of rotating engineers. We also did not have a culture of sharing knowledge (we were too busy)
  3. My first hand experience with Agile Development. The core principles of Agile Development.
  4. I prefer transparent culture. If I am struggling, I want my peers to know (without me having to tell them, or the environment allows me to tell them of my problems seemlessly) so that the team can help me to solve the problem move the entire company forward. I believe that if one person fails, the whole company is impacted at some level. Of course, the world is not perfect. There are people that will take advantage of this and try to put me down, or to argue in their favor, but collectively, the entire team would know.
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License