Implementing scrum at tilllate.com

The first sprint is done! Yes we finally started doing Scrum at tilllate.com*. Well, it’s not exactly how Schwaber and Sutherland would expect it. But our way fits our team. And the acceptance in both the IT team and the rest of the organization is high. It improves motivation and therewith the performance of the team. And that’s what matters.

Sprint planning meeting

Sprint planning meeting

Continue reading

Posted in Management, PHP, Programming, Web Development | Tagged | 5 Comments

Nine ways to obfuscate e-mail addresses compared

When displaying an e-mail address on a website you obviously want to obfuscate it to avoid it getting harvested by spammers. But which obfuscation method is the best one? I drove a test to find out. Here are the results:

In 2006 I opened nine different e-mail addresses. On this page I published the nine e-mail addresses. But every address has been obfuscated by a different method. I made sure it’s getting indexed by Google by putting a link to that page on the tilllate.com homepage.

Then I waited 1.5 years (see the original post).

For each e-mail address I counted the amount of spam I received. The amount of spam received started by 21MB (for no obfuscation and a total of over 1800 spam mails) and went down to absolutely no spam.

The following three methods are absolutely rock-solid and keep your addresses safe from the harvesters.
Continue reading

Posted in PHP, Web Development | Tagged , | 128 Comments

Round Robin Data Storage in MySQL

If you want to store large amount of volatile data (e.g. log file entries) in a database with a constant storage memory footprint and no maintenance to purge the old entries, a round robin database is the best solution. But how to implement it in MySQL?

Some of the heaviest tables in our database are tables which do some event logging. Let’s look at a table which log the most recent visitors on a member profile. Look at that ugly output:

mysql> SHOW TABLE STATUS like "profile_visits_log" \G;
*************************** 1. row **********************
           Name: profile_visits_log
           Rows: 6'226'066
 Avg_row_length: 21
    Data_length: 130'747'386
   Index_length: 393'205'760

It grows and grows… And the queries get slower and slower.

This is the case because we are keeping a lot of old, unused data. For example, on my member profile there’s data back to September 2007:

Profile visitor list on tilllate.com

So we have to get rid of that old data. For example we can do it like Xing and store the n most recent entries for each user. Drop the rest:

Profile visitors in Xing

Now, how do we do that in the most elegant way?

Continue reading

Posted in Database, PHP | Tagged | 14 Comments

Unit testing makes coding more fun

“unit testing is a test that validates that individual units of source code are working properly”, that’s what Wikipedia says about unit testing. That’s general knowledge.

But what motivates me even more than the increased software quality is that it saves me development time. This sounds odd as you might believe that TDD means writing more code.

Here’s a real-life example:
Continue reading

Posted in PHP, Programming, Web Development | Tagged , , | 9 Comments

CTO's Saturday Fun: Hackday!

A refreshing change from my daily routine as tilllate CTO (90% meeting, 10% coding) was my visit at the first Webtuesday Hackday yesterday (Hackday = “a day spent hacking with like minds”, as organizer Harry Fuecks defines it).

Continue reading

Posted in Webtuesday | Tagged , , | 1 Comment

Unit test practice at tilllate.com

For now over three years we are working with unit tests. I’d like to share some of those experiences.

As we have two frameworks in place for our website, I can compare two different strategies for unit tests.

In our homemade legacy framework we were using SimpleTest. Mainly because I read PHP|Architect’s Guide to PHP Design Patterns and Simpletest was Jason‘s framework of choice.

We have a cron job running which runs all tests every hour. The results of the tests are being shown on a page. The results are also displayed in Nagios.

Continue reading

Posted in PHP, Programming, Web Development | Tagged , | 4 Comments

Pitfalls with MySQL and auto_increment

There’s a number of pitfalls one should be aware of when working with AUTO_INCREMENT fields in MySQL. Last week, we fell in each of them:

We have the table photos which contains all 15 million pictures on tilllate.com. This table is MyISAM and has id INT NOT NULL AUTO_INCREMENT as the primary key. The position of the auto increment counter was at 112’606’834.
Continue reading

Posted in Database | Tagged | 4 Comments

Comparing queries with mk-query-profiler and diff

EXPLAIN is not the only way to analyze query perfomance im MySql because some things are not being taken into account. For example LIMIT clauses or the cost of the optimizer. There is also the mk-query-profiler.

An interesting way to compare the performance of two queries is to use mk-query-profiler along with diff

Here’s how you do it. As an example I take the queries from this mysql performance blog article article. Because I’d like to learn what excactly SQL_CALC_FOUND_ROWS does.

Continue reading

Posted in Database | Tagged , | Comments Off on Comparing queries with mk-query-profiler and diff

My favourite keyboard moves in Firefox

A weird keyboardI am a lazy guy. I hate moving my hand away from the keyboard to the mouse and back. So I try to use as much keyboard shortcuts as possible. Here’s 2 ways I improve my productivity by avoiding device switches in Firefox:

Keyboard shortcuts

Here’s my personal Top 5 of keyboard shortcuts:

1. Ctrl+L Move the focus to the location/URL field
2. Ctrl+K Move the focus to the search field
3. Ctrl+H Open the history
4. Ctrl+F / F3 Open the search. F3 repeats the last search
5. Ctrl+T Open a new tab

You’ll find a lot more useful shortcuts here

Keywords for your bookmarks

To access my bookmarks quickly I usually use Ctrl+L and then type a keyword. n is our Nagios problem overview. c is our confluence homepage.

Combined with the search variable %s I have extremely fast wikipedia searches (wiki foo) or translations from German to English (leoe fahrvergnügen).

How to set it up? micrux.net tells you more.

Thanks, Patrice, for showing me this. You helped me save hours switching between mouse and keyboard.

Posted in Uncategorized | Tagged | 1 Comment

Holiday season: The best time to… work

Christmas TreeFor me, the time around Christmas and New Year is the best time of the year. Of course, there’s the peaceful family reunions around the christmas tree. The cozy evenings at home on the couch. Or days where you can shamelessly sleep in. In my case I am expecting my son Orell who should be born anytime.

But stop: This is a business related blog. And so I am not talking about my private life. When I say “the best time of the year” I am thinking about work. There’s no better time of year for not taking vacations. Here’s why:
Continue reading

Posted in Management | 2 Comments