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
Continue reading →
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 →
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:

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:

Now, how do we do that in the most elegant way?
Continue reading →
Posted in Database, PHP
|
Tagged mysql
|
“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 →
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 →
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 →
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 mysql
|
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 Database, mysql
|
I 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 firefox
|
For 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 →