<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet href="/martijn/templates/default/atom.css" type="text/css" ?>

<feed 
   xmlns="http://www.w3.org/2005/Atom"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/">
    <link href="http://www.madcat.nl/martijn/feeds/atom.xml" rel="self" title="The Madcat Weblog" type="application/atom+xml" />
    <link href="http://www.madcat.nl/martijn/"                        rel="alternate"    title="The Madcat Weblog" type="text/html" />
    <link href="http://www.madcat.nl/martijn/rss.php?version=2.0"     rel="alternate"    title="The Madcat Weblog" type="application/rss+xml" />
    <title type="html">The Madcat Weblog</title>
    <subtitle type="html">Powered by Martijn Gorree</subtitle>
    <icon>http://www.madcat.nl/martijn/templates/default/img/s9y_banner_small.png</icon>
    <id>http://www.madcat.nl/martijn/</id>
    <updated>2009-01-20T20:50:34Z</updated>
    <generator uri="http://www.s9y.org/" version="1.0.2">Serendipity 1.0.2 - http://www.s9y.org/</generator>
    <dc:language>en</dc:language>

    <entry>
        <link href="http://www.madcat.nl/martijn/archives/21-Selling-my-domains.html" rel="alternate" title="Selling my domains" />
        <author>
            <name>Martijn Gorree</name>
            <email>nospam@example.com</email>
        </author>
    
        <published>2009-01-20T20:50:34Z</published>
        <updated>2009-01-20T20:50:34Z</updated>
        <wfw:comment>http://www.madcat.nl/martijn/wfwcomment.php?cid=21</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://www.madcat.nl/martijn/rss.php?version=atom1.0&amp;type=comments&amp;cid=21</wfw:commentRss>
    
    
        <id>http://www.madcat.nl/martijn/archives/21-guid.html</id>
        <title type="html">Selling my domains</title>
        <content type="xhtml" xml:base="http://www.madcat.nl/martijn/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                I've decided to sell my domains. I've all registered these with the intention to create something interesting. So basically these are all or have been business ideas of mine.<br />
<br />
My tender auction-ish site idea. Where all kinds of tenders can be made available. You've got a job to do? Sell your contract to the highest (or in this case lowest) bidder. Sort of making the tender process availble for the common folk.<br />
 - <a href="contractveiling.nl">contractveiling.nl</a><br />
 - <a href="contractveiling.com">contractveiling.com</a><br />
 - <a href="gotender.nl">gotender.nl</a><br />
<br />
Me and my girlfriend had the idea to write a book about cutting back on your impact to the environment. Sort of like a diet.<br />
 - <a href="hetmilieudieet.nl">hetmilieudieet.nl</a><br />
 - <a href="milieudieet.nl">milieudieet.nl</a><br />
<br />
My domains for a job-offer site. GeekRecruit and JobFoo would be geared towards technical jobs. Foo being a popular with computer programmers.<br />
 - <a href="carrierematch.com">carrierematch.com</a><br />
 - <a href="geekrecruit.com">geekrecruit.com</a><br />
 - <a href="jobfoo.com">jobfoo.com</a><br />
<br />
A site for location based data. For instance data used for google maps type applications.<br />
 - <a href="geocontent.nl">geocontent.nl</a><br />
<br />
A site for mashups and web2.0 type activities. Public API's, REST like interfaces, anything mash-able :)<br />
 - <a href="mashed.nl">mashed.nl</a><br />
 - <a href="mashedpotato.nl">mashedpotato.nl</a><br />
<br />
We, my brother and I, had the idea to create a whiskey review site. We were into whiskey and this seemed like a good way to receive free booze.<br />
 - <a href="nosingandtasting.co.uk">nosingandtasting.co.uk</a><br />
 - <a href="nosingandtasting.com">nosingandtasting.com</a><br />
<br />
All of these were meant to serve as a Poker home game organizer. We had the idea that it would grow into a social-network site for poker players. You'd be able to group with your friends and be able to easily organize home games.<br />
 - <a href="pokenizer.nl">pokenizer.nl</a><br />
 - <a href="pokenizer.com">pokenizer.com</a><br />
 - <a href="pokernizer.nl">pokernizer.nl</a><br />
 - <a href="pokernizer.com">pokernizer.com</a><br />
 - <a href="cardgameplanner.com">cardgameplanner.com</a><br />
<br />
I've registered these for an viral site idea we had at <a href="http://www.fabrique.nl">Fabrique</a>. But they were never used. Might be nice gay porn site address? Or something like <a href="http://www.collegehumor.com">CollegeHumor</a><br />
 - <a href="nietvoormeisjes.nl">nietvoormeisjes.nl</a><br />
 - <a href="verbodenvoormeisjes.nl">verbodenvoormeisjes.nl</a><br />
<br />
So if you're interested in any of these domains. Mail me at martijn [at] madcat.nl and make me an offer.<br />
<br />
 
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://www.madcat.nl/martijn/archives/20-Peopleware-considered-harmful..html" rel="alternate" title="Peopleware considered harmful." />
        <author>
            <name>Martijn Gorree</name>
            <email>nospam@example.com</email>
        </author>
    
        <published>2007-09-15T18:15:49Z</published>
        <updated>2007-09-17T14:52:52Z</updated>
        <wfw:comment>http://www.madcat.nl/martijn/wfwcomment.php?cid=20</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://www.madcat.nl/martijn/rss.php?version=atom1.0&amp;type=comments&amp;cid=20</wfw:commentRss>
    
            <category scheme="http://www.madcat.nl/martijn/categories/2-Life" label="Life" term="Life" />
    
        <id>http://www.madcat.nl/martijn/archives/20-guid.html</id>
        <title type="html">Peopleware considered harmful.</title>
        <content type="xhtml" xml:base="http://www.madcat.nl/martijn/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                To the uninitiated; Peopleware (the book) is the bible of software development management. Its short, to the point and after more then 20 years later still very relevant. If you're high up the corperate ladder of some software building business and you havent read Peopleware, buy it now. I'll wait here.<br />
<br />
HURRY!<br />
<br />
(Here I'll help you: <a href="http://www.amazon.com/Peopleware-Productive-Projects-Teams-2nd/dp/0932633439">@ Amazon.com</a>, <a href="http://www.comcol.nl/detail/11773.htm">@ Computercollectief</a>)<br />
<br />
To sumarize:<br />
<ul><br />
 <li>It tells you how to deal with office space.</li><br />
 <li>It shows you how to optimize developer cycles.</li><br />
 <li>It shows you how you can keep your people happy.</li><br />
</ul><br />
<br />
"Dude! if this is such a great book then why is it considered harmful?".<br />
<br />
Well, it has a bit of depressing after effect on the people in the trenches; the actual software developers. Because after reading this book, you're eyes will be opened. You will be able to see the corperate dysfunction in all its evil glory. And worst of all, you can never go back to that blisfull ignorant state. This book will make you angry, I'm sure of it.<br />
<br />
I've been talking (and getting angry) about this with a good friend of mine for a while now, swapping war stories of how bad the work enviroment has been and what needs to change to get motivation and job satisfaction back. The problem is that sooner or later you will go "fuckem" and end up becomming a passionless corperate drone (or worse; quit). As soon as this happens the company has lost. It cannot be repaired. Every attempt will look like disception. Its a trust issue. If the trust is gone, its not comming back. Its like finding out your (boy|girl)friend has been cheating on you. How can you trust them again? Its just not going to happen. You need to catch it before this happens.<br />
<br />
Reading peopleware excelerates this process. It will make you go "aargh! fuckem" a lot quicker. Because after reading this book, you will actually know how to do your managers job. You don't of course, but this book will make you think you can.<br />
<br />
Thats why its considered harmful.<br />
<br />
Before you say anything; I'm not preaching that you should just tough it out and stick by your employer whatever happens. If you're not happy at work then talk about it as soon as possible. And if that doesn't work or nothing ever changes, leave damnit!<br />
<br />
 
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://www.madcat.nl/martijn/archives/19-Three-laws-of-software-development.html" rel="alternate" title="Three laws of software development" />
        <author>
            <name>Martijn Gorree</name>
            <email>nospam@example.com</email>
        </author>
    
        <published>2007-09-13T20:11:32Z</published>
        <updated>2007-09-14T10:04:48Z</updated>
        <wfw:comment>http://www.madcat.nl/martijn/wfwcomment.php?cid=19</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://www.madcat.nl/martijn/rss.php?version=atom1.0&amp;type=comments&amp;cid=19</wfw:commentRss>
    
            <category scheme="http://www.madcat.nl/martijn/categories/1-Programming" label="Programming" term="Programming" />
    
        <id>http://www.madcat.nl/martijn/archives/19-guid.html</id>
        <title type="html">Three laws of software development</title>
        <content type="xhtml" xml:base="http://www.madcat.nl/martijn/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                On one of the last pages of the <a href="http://www.dangerousbookforboys.com/">Dangerous book for boys</a> there is a list of books which every boy should read. Having read none, except of course <a href="http://en.wikipedia.org/wiki/Hitchhikers_guide_to_the_galaxy">The Hitchhiker's Guide to the Galaxy</a>, which is considered required reading if you're ever to join the club of nerd.<br />
<br />
So my quest this summer was to read up on my classics. I've so far read "<a href="http://en.wikipedia.org/wiki/Brave_New_World">Brave new world</a>", "<a href="http://en.wikipedia.org/wiki/Lord_of_the_Flies">Lord of the flies</a>", "<a href="http://en.wikipedia.org/wiki/Of_Mice_and_Men">Of mice and men</a>", "<a href="http://en.wikipedia.org/wiki/Animal_Farm">Animal farm</a>", "<a href="http://en.wikipedia.org/wiki/I,_Robot">I Robot</a>" and "<a href="http://en.wikipedia.org/wiki/The_Foundation_Series">The Foundation series</a>". I've never been much of a fantasy or sci-fi man but after the first foundation book I was sold. The minute I came home I ordered the lot of them. I finished "<a href="http://en.wikipedia.org/wiki/Foundation%27s_Edge">Foundation's Edge</a>" today and on my way home something struck me.<br />
<br />
I was thinking how we software/web/whatever-developers deal with ethics at work. Will you write software for weapons industry? Will you write code to block free speech? Dealing with these questions are all personal. But Asimov can help. I find the <a href="http://en.wikipedia.org/wiki/Three_Laws_of_Robotics">three laws of robotics</a> apply to engineering (software in this case) just as well as they do to robots. <br />
<br />
1. Software may not injure a human being or, through inaction, allow a human being to come to harm.<br />
<br />
2. Software must obey orders given to it by human beings except where such orders would conflict with the First Law.<br />
<br />
3. Software must protect its own existence as long as such protection does not conflict with the First or Second Law.<br />
<br />
The third law sticks out as it does not apply as well to software as it does to "hardware" (robots). But in a way it does work when you consider security. "Software must protect itself against haxoring as long as such haxoring does not conflict with the first or second law".<br />
<br />
These laws are, of course, very hard to maintain. How can anyone be sure if your code, open source and free software especially, isn't used for evil? But then again as long as code is not self-aware, the keeper of the laws should be us humans. We, as developers, have an obligation to do the right thing when it comes to "instructions" we create.<br />
<br />
<br />
 
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://www.madcat.nl/martijn/archives/18-PHP-Throwdown-is-over.html" rel="alternate" title="PHP Throwdown is over" />
        <author>
            <name>Martijn Gorree</name>
            <email>nospam@example.com</email>
        </author>
    
        <published>2007-01-28T19:39:57Z</published>
        <updated>2007-01-28T21:42:28Z</updated>
        <wfw:comment>http://www.madcat.nl/martijn/wfwcomment.php?cid=18</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://www.madcat.nl/martijn/rss.php?version=atom1.0&amp;type=comments&amp;cid=18</wfw:commentRss>
    
            <category scheme="http://www.madcat.nl/martijn/categories/1-Programming" label="Programming" term="Programming" />
    
        <id>http://www.madcat.nl/martijn/archives/18-guid.html</id>
        <title type="html">PHP Throwdown is over</title>
        <content type="xhtml" xml:base="http://www.madcat.nl/martijn/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                "Who'll join me!" I exclaimed when the news of a 24 hour 'lets see what can be done with php'-competition was announced. 3 brave colleges answered the call. <br />
<br />
And so began what was to be a long day of code, sleep deprivation and caffeine.<br />
<br />
We, the '<a href="http://hotpinkcrusaders.blogture.com">hot pink crusaders</a>', signed up for the <a href="http://www.phpthrowdown.com">PHP Throwdown</a> competition and desided to create a game. A planetarion-ish game called 'Incursion'. Mark and I actually graduated on a c / c++ / ncurses version of this game and we've since played with the idea of porting it to the web. And this competition, so it seemed, was a great chance to revitalize the concept. <br />
<br />
The 'new' Incursion took 4 people 24 hours to get to a point that it nearly worked. It never made it beyond the suck phase though. It was a good exercise and we had lots of fun trying. There was just not enough time. <br />
<br />
I believe I've spent a total of 7 hours trying to get some kind of battle calculation algorithm working. I had to 'invent' this from scratch and it proved to be extremely difficult during the wee hours. I got it working about an hour before the competition ended. A bit too late.<br />
<br />
Our plan was to get something 'playable' before halftime and then just fix the bugs and tweak it so that it would be enjoyable to play. We never had a chance :).<br />
<br />
The code we checked in at the end is full of fatal errors for which we just lacked the time to fix. Also, security wise, its quite a mess. We've made sure to filter all data going through <a href="http://smarty.php.net">Smarty</a> but if register_globals is on, it will be easy to by-pass the 'dispatcher' file and go straight to the controllers which are wide open for all the world to see because none of us had the time to include a .htaccess that would prevent said access. Oh well.<br />
<br />
Now we have to wait for the judging to commence.<br />
<br />
The judging of our application is based on the following criteria:<br />
<blockquote><br />
    Code Readability &amp; Documentation (5 pts)<br />
    Installation/Configuration (5pts)<br />
    Functionality (20pts)<br />
    Performance (5pts)<br />
    Error handling &amp; Security (15pts)<br />
    UI/Appearance (5pts)<br />
    Accessibility/Standards Compliance (5pts)<br />
    Code Innovation/Creativity (30pts)<br />
    Overall Quality of the App (10pts)<br />
</blockquote><br />
<br />
Oh boy. <br />
<br />
My predictions are..<br />
<br />
<b>Code Readability &amp; Docs</b> <br />
I say; 3 out of 5 points. We started out fine, trying to create a bit of structure, trying to be verbose. But that quickly faded into a code frenzy trying to get stuff working as fast as possible. So I give us 3 points.<br />
<br />
<b>Instalation and Configuration</b><br />
3 points. We actually made an effort to create a database creation script and config file. The only thing needed for installation is a php 5.1 and higher, mysql 4, the cron and a little fiddling in the config.<br />
<br />
<b>Functionality</b><br />
5 out of 20 points. Well the app barely works. So what it does, it does badly. I predict not very many points in this category.<br />
<br />
<b>Performance</b><br />
4 out of 5 points. It's not fast, but its certainly not slow either. Incursion is made for 'smaller' groups of people. So some performance loss might happen when a lot of users are playing. The battle code for instance, does a lot of work.<br />
<br />
<b>Error handling &amp; Security</b><br />
5 out of 15 points. We have basically no error handling and security isn't much better. But if you have register_globals Off and close down all the private directories it should be pretty air-tight. So perhaps 5 points is a bit too low.<br />
<br />
<b>UI/Appearance</b><br />
2 out of 5 points. Our UI sucks. Its very very basic. We've changed the way it looks a couple of time and we lacked the design-skill to make it look pretty. Basically we needed a hands on designer dude. But we didn't have anyone. Ever seen coders create a UI. Yeah.. thats how it looks. The tabs are nice though but there is just a sense of unity missing.<br />
<br />
<b>Accessibility/Standards Compliance</b><br />
4 out of 5 points. We tried to adhere to the standards as much as possible. We tried making the html output conform with XHTML Transitional and CSS. But having done virtually no compliance/validation checks I can't say how we did. Also, the HTML is a mess. Did I say that already?<br />
<br />
<b>Code Innovation/Creativity</b><br />
10 out of 30 points. Did we innovate? I don't know. We have some nice pieces of code, but the whole 'planetarion' concept is not very innovative. The thing where we differ from planetarion is that its made for small fast-pased games. We tried to make it into a 'planetarion for LAN gaming' kind of game where you can join a lobby and the administrator will start the game. The winner will then be determined by having the highest score. Which means having the most kills. What might also be innovative is the way we handle the battles, since we designed this from scratch. <br />
<br />
Let me show you how its done (I'm quite proud of this, so bear with me):<br />
<br />
<pre><br />
Unit statistics:<br />
Name            Offence Defense Type    Strength    Weakness<br />
Marine          10      5       light   light       light<br />
Commando        13      10      light   medium      medium<br />
Raptor          25      20      medium  light       medium<br />
Goliath         50      40      heavy   medium      heavy<br />
Battlecruiser   100     150     heavy   heavy       light<br />
<br />
Our fleet:<br />
10  Marines<br />
5   Commandos<br />
10  Goliaths<br />
1   Battlecruiser<br />
<br />
Opponents fleet:<br />
30  Marines<br />
3   Commandos<br />
10  Raptors<br />
</pre><br />
<br />
When they attack the 'attacking' fleet fires first, after which the defending fleet (if they are still standing) fire back. In Incursion this happens once after which the fleets return home.<br />
<br />
Every unit has a weakness and strength against certain types of units. The attackers targets its 'strength' the its 'not strength, not weakness unit' and after that his 'weakness'. It also incurs a penalty for the amount of shots that hit target based on the type of unit it prefers.<br />
<br />
The bonuses:<br />
<br />
Shots that 'hit' based on its strength are 80% +- random(0..10)% amount of total shots. Shots that 'hit' based on its weakness are 30% +- random(0..10)% amount of total shots. Shots that 'hit' everything else are 50% +- random(0..15)% amount of total shots.<br />
<br />
So basically, you always miss a few shots.<br />
<br />
10 Marines fire 10 shots each. They prefer 'light' units so the 'light'-typed units of the opponent are targeted first. In this case the 'Marines' and the 'Commandos'.<br />
<br />
The amount of shots that hit target are:<br />
<br />
(80 + 5)% of a 100 shots = 85 Shots hit in total for all marines shooting.<br />
<br />
The attacking marines target the opponents marines who have a collective 30*5=150 total defense. <br />
<br />
So 85 shots hit 150 of total defense. This results in a total 65 defense left on the opponents side. 85 damage also means 85/5 losses on the opponents side, resulting in 17 dead and 30-17=13 marines left to see another day.<br />
<br />
In this case all the 'hitting' shots are absorbed by the total defense of all the opponents marines. However! there is a possibility that the amount of damage being dealt exceeds the total defense the opponent provides. When this happens the 'hitting' shots will be transfered to hit the next group of units. In this case the 'Commandos' and going trough the same process as before.<br />
<br />
After the marines fire, our commandos get a shot and everything goes through the motions again.<br />
<br />
There. Thats what I spent the last 24 hours on trying to figure out.<br />
<br />
Last but not least, quality. <br />
<br />
<b>Overall quality of the app</b><br />
3 out of 10 points. I try to spend a lot of my time approving quality in code-bases and of the app in general. But in 24 hour, how much quality control can you have? If there are any sacrifices to save time, you bet it will be quality that pay's the price.<br />
<br />
Anyhow, this post has become quite long enough. Let me just say that I've had lots of fun competing and hope I'll be around long enough to be able do it again. Just not within a month or two. 
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://www.madcat.nl/martijn/archives/17-Tracer-bullet-style-recruiting.html" rel="alternate" title="Tracer bullet style recruiting" />
        <author>
            <name>Martijn Gorree</name>
            <email>nospam@example.com</email>
        </author>
    
        <published>2007-01-23T12:05:31Z</published>
        <updated>2007-01-23T12:21:59Z</updated>
        <wfw:comment>http://www.madcat.nl/martijn/wfwcomment.php?cid=17</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://www.madcat.nl/martijn/rss.php?version=atom1.0&amp;type=comments&amp;cid=17</wfw:commentRss>
    
            <category scheme="http://www.madcat.nl/martijn/categories/2-Life" label="Life" term="Life" />
    
        <id>http://www.madcat.nl/martijn/archives/17-guid.html</id>
        <title type="html">Tracer bullet style recruiting</title>
        <content type="xhtml" xml:base="http://www.madcat.nl/martijn/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                I hate browsing trough job descriptions. Why? Well, let me tell you. First and foremost, they don't tell you what you want to know. What I want to know is "What will it be like working at your toko" and none of the descriptions focus on that.<br />
<br />
Questions like the following are mostly left unanswered:<br />
<br />
<b>Whats the environment like? Is it going to be the 'corporate grind'?</b><br />
<br />
Personally I have some sort of fear working for 'large' companies. I've never actually worked at those large corporate monoliths, but I imagine a very impersonal style and lots of unifomity. Frankly that scares the living shit out of me.<br />
<br />
<b>What will I be working on? </b><br />
<br />
Specifics please! Because "You will be implementing Initech's strategy on the web" doesn't tell me squat. What that does tell me is that there is a large chance developers will be treated as coporate drones and being micromanaged till they break. I bet turnover is pretty high eh? Nobody wants to be doing the bidding of whomever without having a little creative input. A feeling of personal accomplishment is very important and your company better have some sort of system in place to maximize this with your staff.<br />
<br />
<b>What kind of individual are you looking for? Character specifics.</b><br />
<br />
Are you looking for evangelists, dreamers, readers, pragmatic folk or loyal followers? Personally I'd be looking for pragmatic readers. Those that get the job done while improving all the time. Job description never reveal this. Either companies don't think it matters or they just want to cast the widest net. I bet those companies get all the "mediocre" people and never the <a href="http://www.randsinrepose.com/archives/2005/03/20/free_electron.html">free electrons</a>. If you want to hire smart people, have a smart job description. Meta data matters.<br />
<br />
<b>How's nice is the location are surrounding area?</b><br />
<br />
I've recently been to a job interview where the actual location of there office put me off the job, even before I entered the building. The appearance they have on the web was very nice. Yet the location of their office was really depressing. I don't like working at a company where you get depressed even before you enter the building. If you're going to tell the world that you're a young and dynamic company with a playful spirit, then make sure the surroundings reflect that.<br />
<br />
How are the working conditions? Will there be a lot of noise? On average; how many people on a team? What 'development methologies' are being used? How great will you're personal input be? How are skunk works handled and thought of? How about training courses? What about conferences? How does the company handle personal development?<br />
<br />
These things are usually answered in your first face-to-face job-interview, but wouldn't it be nice if you had these answers before you actually send out your resume?<br />
<br />
Why haven't I focused on the hard requirements? Well, because they don't really matter now do they. The "x years of experience needed" or "Expertly skilled in Java or C#" doesn't tell you squat. It only weeds out the 'starters', but beyond that its just fluff. People send in their resumes anyway. They don't care if they're qualified. Its just spam. I call this tracer-bullet-style job-hunting. Just fire lots of resumes and hope one bites. Next to that recruiters contact people with absolutely no experience just as easily. I've had dozens of emails like this:<br />
<br />
<blockquote><br />
"We're a .NET shop and looking for experienced C# .NET developers. We've looked at your resume and want to schedule a interview. Please contact us if you're interested"<br />
</blockquote><br />
<br />
I've never done C# or .NET and its certainly not on my resume. Honestly, why the hell would you contact me? What, for heavens sake, were the criteria for selecting me out of the immense list of 'actual' C# / .NET developers? Was it the "experienced web developer" thing? Was that it? Did that make you hot?<br />
<br />
Not only poor developer folk are using ye old tracer bullet to look for new work but the recruiters are firing that shit right back at them. The problem with this is that there is too much white noise. You can't possibly find the sweet spots, the companies that actually fit your personal taste. Because the information needed to select said companies is missing.<br />
<br />
If you ask me "why can't I get any good recruits". Then my answer would be "because they can't hear you through all the noise". You might be the greatest company to work for, but if you provide only hard criteria, you'll never find the good people.<br />
<br />
Companies like <a href="http://www.google.com">Google</a>, <a href="http://www.sourcegear.com">SourceGear</a> and <a href="http://www.fogcreek.com">FogCreek</a> don't get the best people because they select on hard criteria. They get the best people trough word of mouth and the knowledge that meta data concerning your company matters more then just the amount of years you've put into Java. The next web 2.0 startup I'm hoping to see is a recruiting site which puts meta-data <u>first</u> on both sides of the equation; the people looking for a job and the companies looking for people. And then go from there.<br />
<br />
 
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://www.madcat.nl/martijn/archives/16-Using-smarty-to-prevent-HTML-injection..html" rel="alternate" title="Using smarty to prevent HTML injection." />
        <author>
            <name>Martijn Gorree</name>
            <email>nospam@example.com</email>
        </author>
    
        <published>2007-01-08T11:08:20Z</published>
        <updated>2007-01-08T13:15:31Z</updated>
        <wfw:comment>http://www.madcat.nl/martijn/wfwcomment.php?cid=16</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://www.madcat.nl/martijn/rss.php?version=atom1.0&amp;type=comments&amp;cid=16</wfw:commentRss>
    
            <category scheme="http://www.madcat.nl/martijn/categories/1-Programming" label="Programming" term="Programming" />
    
        <id>http://www.madcat.nl/martijn/archives/16-guid.html</id>
        <title type="html">Using smarty to prevent HTML injection.</title>
        <content type="xhtml" xml:base="http://www.madcat.nl/martijn/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                You know that strange thing that when you have to explicitly handle output filtering, things will inevitably go wrong? Well I do. <br />
<br />
You see, I've been using <a href="http://smarty.php.net">Smarty</a> as my templating buddy for some time now but once in a while I get bitten in the ass by me not handling output filtering and thus having HTML injection 'holes' in my applications.<br />
<br />
The problem starts with the fact that I have to 'work' to get filtering included. What I actually want is filtering to be 'on by default', so that I can shut it off when needed. That way the default is 'safe' (there are always other way to get compromised of course) except in those cases that I explicitly turn the filtering off.<br />
<br />
I want Smarty to do my filtering! "But Smarty already does this!" I hear you say, and I'd have to agree. Except Smarty does this by providing the "escape" modifier. But I don't want to write '|escape:"html"' after every bloody variable I use in my templates. I want Smarty to filter the little buggers by default.<br />
<br />
I know what you're thinking. "No no no, you've got it all wrong. You should handle filtering at the logic layer and not at the presentation layer". Well.. then you'd be wrong. Since HTML (and Javascript) injection is only present in the presentation layer I want my presentation layer to handle the filtering. I can't really be bothered at the logic layer, since the problem does not exists there. I do, however, need to filter the input at the logic part of my code, but thats another story.<br />
<br />
So what needed to be done was, reverse the way you handle escaping in Smarty. This means variables need to be escaped by default and can be 'unescaped' using the newly crafted 'unescape' modifier.<br />
<br />
Ok, so how exacly does one handle this. Well, Smarty has a hand full of usefull API hooks with which you can 'plug' into the compiling process. I chose to use  a 'postfilter' to process the template vars and encode them before they end up in the template.<br />
<br />
You could also use a pre-filter since they both do their stuff <u>after</u> the all the variables are assigned and before the output is actually shown. I chose postfilter because this is the last possible point in the compilation process before the variables are forged into the template and pushed out to whatever device is doing the request.<br />
<br />
So how does this look, code-wise:<br />
<div style="text-align: left"><ol><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">// create the smarty object</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000ff;">$smarty</span> = <span style="color: #000000; font-weight: bold;">new</span> Smarty<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">// register the template and compile dir</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000ff;">$smarty</span>-&gt;<span style="color: #006600;">template_dir</span> = <span style="color: #ff0000;">'templates'</span>;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000ff;">$smarty</span>-&gt;<span style="color: #006600;">compile_dir</span> = <span style="color: #ff0000;">'templates_c'</span>;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">/**</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;"> <strong> This is a modified htmlspecialchars function, created to</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;"> </strong> encode values in arrays as well. We want <u>all</u> strings to be</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;"> <strong> encoded.</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;"> </strong>/</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #000000; font-weight: bold;">function</span> htmlspecialchars_recursive<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$var</span>, <span style="color: #0000ff;">$quote_style</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160; &#160; <span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span><a href="http://www.php.net/is_array"><span style="color: #000066;">is_array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$var</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160; &#160; &#160; &#160; <span style="color: #0000ff;">$ret</span> = <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160; &#160; &#160; &#160; <span style="color: #b1b100;">foreach</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$var</span> <span style="color: #b1b100;">as</span> <span style="color: #0000ff;">$key</span> =&gt; <span style="color: #0000ff;">$val</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160; &#160; &#160; &#160; &#160; &#160; <span style="color: #0000ff;">$ret</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$key</span><span style="color: #66cc66;">&#93;</span> = htmlspecialchars_recursive<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$val</span>, <span style="color: #0000ff;">$quote_style</span><span style="color: #66cc66;">&#41;</span>;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160; &#160; &#160; &#160; <span style="color: #66cc66;">&#125;</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160; &#160; <span style="color: #66cc66;">&#125;</span> <span style="color: #b1b100;">elseif</span><span style="color: #66cc66;">&#40;</span><a href="http://www.php.net/is_string"><span style="color: #000066;">is_string</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$var</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160; &#160; &#160; &#160; <span style="color: #0000ff;">$ret</span> = <a href="http://www.php.net/htmlspecialchars"><span style="color: #000066;">htmlspecialchars</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$var</span>, ENT_QUOTES<span style="color: #66cc66;">&#41;</span>;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160; &#160; <span style="color: #66cc66;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160; &#160; &#160; &#160; <span style="color: #0000ff;">$ret</span> = <span style="color: #0000ff;">$var</span>;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160; &#160; <span style="color: #66cc66;">&#125;</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160; &#160; <span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$ret</span>;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#125;</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">/**</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;"> <strong> This is the actual postfilter function. It loops through the tpl_vars</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;"> </strong> and uses the custom htmlspecialchars_recursive function to excode</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;"> <strong> the vars.</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;"> </strong>/</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #000000; font-weight: bold;">function</span> inoculate<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$tpl_output</span>, &amp;<span style="color: #0000ff;">$smarty</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160; &#160; <span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>!<a href="http://www.php.net/empty"><span style="color: #000066;">empty</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$smarty</span>-&gt;_tpl_vars<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160; &#160; &#160; &#160; <span style="color: #b1b100;">foreach</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$smarty</span>-&gt;_tpl_vars <span style="color: #b1b100;">as</span> <span style="color: #0000ff;">$key</span> =&gt; <span style="color: #0000ff;">$value</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160; &#160; &#160; &#160; &#160; &#160; <span style="color: #0000ff;">$smarty</span>-&gt;_tpl_vars<span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$key</span><span style="color: #66cc66;">&#93;</span> = htmlspecialchars_recursive<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$value</span>, ENT_QUOTES<span style="color: #66cc66;">&#41;</span>;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160; &#160; &#160; &#160; <span style="color: #66cc66;">&#125;</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160; &#160; <span style="color: #66cc66;">&#125;</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160; &#160; <span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$tpl_output</span>;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#125;</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">/**</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;"> <strong> The actual unescape modifier. Used to revert HTML encoding when needed.</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;"> </strong> NOTE: the htmlspecialchars_decode is available for PHP 5.1 and higher.</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;"> <strong>&#160; &#160; &#160; &#160;So this won't work on any PHP4 systems.</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;"> </strong>/</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #000000; font-weight: bold;">function</span> unescape<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$string</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160; &#160; <span style="color: #b1b100;">return</span> htmlspecialchars_decode<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$string</span>, ENT_QUOTES<span style="color: #66cc66;">&#41;</span>;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#125;</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">// register the modifier</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000ff;">$smarty</span>-&gt;<span style="color: #006600;">register_modifier</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'unescape'</span>, <span style="color: #ff0000;">'unescape'</span><span style="color: #66cc66;">&#41;</span>;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">// register the postfilter</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000ff;">$smarty</span>-&gt;<span style="color: #006600;">register_postfilter</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'inoculate'</span><span style="color: #66cc66;">&#41;</span>;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160;</div></li></ol></div><br />
<br />
Ok so now that the filters are in place, we need to test the stuff. <br />
<br />
The php file:<br />
<div style="text-align: left"><ol><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">/**</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;"> <strong> .. snip .. (all of the code above)</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;"> </strong>/</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">// assign some test vars. </span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000ff;">$smarty</span>-&gt;<span style="color: #006600;">assign</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'str1'</span>, <span style="color: #ff0000;">'&lt;h1&gt;Hello!&lt;/h1&gt;'</span><span style="color: #66cc66;">&#41;</span>;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000ff;">$smarty</span>-&gt;<span style="color: #006600;">assign</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'str2'</span>, <span style="color: #ff0000;">'&lt;script type=&quot;text/javascript&quot;&gt;alert(document.cookie);&lt;/script&gt;'</span><span style="color: #66cc66;">&#41;</span>;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000ff;">$smarty</span>-&gt;<span style="color: #006600;">assign</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'list1'</span>, <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160; &#160; <span style="color: #ff0000;">"&lt;h2&gt;One&lt;/h2&gt;"</span>, </div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160; &#160; <span style="color: #ff0000;">"&lt;script&gt;alert('two');&lt;/script&gt;"</span>, </div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160; &#160; <span style="color: #ff0000;">"&lt;script&gt;document.write('three');&lt;/script&gt;"</span>, </div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160; &#160; <span style="color: #ff0000;">"fo<span style="color: #000099; font-weight: bold;">\"</span>'''<span style="color: #000099; font-weight: bold;">\"</span>ur"</span>, <span style="color: #ff0000;">"five"</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000ff;">$smarty</span>-&gt;<span style="color: #006600;">assign</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'list2'</span>, <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160; &#160; <span style="color: #ff0000;">'a'</span> =&gt; <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160; &#160; &#160; &#160; <span style="color: #ff0000;">'b'</span> =&gt; <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160; &#160; &#160; &#160; &#160; &#160; <span style="color: #ff0000;">'c'</span> =&gt; <span style="color: #ff0000;">'&lt;script&gt;alert(&quot;burried&quot;);&lt;/script&gt;'</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160; &#160; &#160; &#160; <span style="color: #66cc66;">&#41;</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160; &#160; <span style="color: #66cc66;">&#41;</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">// force smarty to compile on every hit. This is for testing purposes only,</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">// turn this off on production systems. It will slow you down. A lot.</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000ff;">$smarty</span>-&gt;<span style="color: #006600;">force_compile</span> = <span style="color: #000000; font-weight: bold;">true</span>;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">// Display the testing template.</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000ff;">$smarty</span>-&gt;<span style="color: #006600;">display</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'output_filter.tpl'</span><span style="color: #66cc66;">&#41;</span>;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160;</div></li></ol></div><br />
<br />
The template file:<br />
<div style="text-align: left"><ol><br />&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; <br />&#160; &#160; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;<br />&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;<br />&lt;head&gt;<br />&#160; &#160; &lt;title&gt;Output filter test&lt;/title&gt;<br />&lt;/head&gt;<br />&lt;body&gt;<br /><br />{$str1}<br />&lt;br/&gt;<br />{$str2}<br />&lt;br/&gt;<br />{$str1|unescape}<br /><br />&lt;ul&gt;<br />{foreach from=$list1 item=item}<br />&#160; &#160; &lt;li&gt;{$item}&lt;/li&gt;<br />{/foreach}<br />&lt;/ul&gt;<br /><br />&lt;br/&gt;<br />{$list2.a.b.c}<br />&lt;br/&gt;<br />{$list2.a.b.c|unescape}<br /><br />&lt;/body&gt;<br />&lt;/html&gt;<br /><br /></ol></div><br />
<br />
And voila, the output is nicely escaped and safe by default. Oh the joy of carelessness. I can't really show you a demo since I'm too lazy to set one up, so you need to test this for yourself.<br />
<br />
Using this has some obvious advantages and some disadvantages. Unicode support, for instance, is an issue. Though htmlspecialchars can handle charset conversion quite nicely, it has to be provided. So you <u>have to</u> know the exact charset you are sending out for this to function like it should. It defaults to ISO-8859-1 so the not-so-internationalized applications can use this whithout worries.<br />
<br />
Another thing which might be annoying is that all the HTML you use in variables will inadvertally be escaped. One place where we've had this problem is when dealing with language files. In some places we used HTML inside the language strings, these got escaped as well. Whoops!<br />
<br />
Also performance could be slow when handling large sets of data. So you would need to do some benchmarking before putting stuff like this in production.<br />
<br />
<b>UPDATE</b>: After reading <a href="http://www.phpinsider.com/smarty-forum/viewtopic.php?t=7806">some discussion</a> on this very problem I've noticed another issue with my implementation.<br />
<br />
Doing this:<br />
<div style="text-align: left"><ol><br />{if $var eq 'foo'}<br />&#160; &#160; // stuff<br />{/if}<br /></ol></div><br />
<br />
Is doing a comparison on an encoded value and could possibly go wrong. Then again, this will probably not happen as long as you're not comparing to any 'weird' variables which contain quotes or other unholy characters. WHO DOES THAT ANYWAY.<br />
<br />
Also my implementation does not function in sync with the current 'escape' functionality using options like html, htmlall, url etc for describing the type of escaping to be used.<br />
<br />
A possible solution for the use of escaped vars in expressions would be changing the post-filter a bit. Instead of looping through all the template vars we could preg_replace the echo code in the actual compiled template. Personally I think that would be quite a gross hack. Not even thinking about the implications when using other modifiers. I like my first implementation better even though it requires an extra function and even though its not complete.<br />
<br />
The stuff I read on the smarty forum gives some me hope that Smarty is going to have output escaping functionality of its own. Which is good and saves me the time hacking 'nice-yet-not-quite-right' solutions to these problems.<br />
 
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://www.madcat.nl/martijn/archives/15-Pass-by-Reference-in-PHP5..html" rel="alternate" title="Pass by Reference in PHP5." />
        <author>
            <name>Martijn Gorree</name>
            <email>nospam@example.com</email>
        </author>
    
        <published>2006-11-21T14:09:20Z</published>
        <updated>2006-11-21T14:09:20Z</updated>
        <wfw:comment>http://www.madcat.nl/martijn/wfwcomment.php?cid=15</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://www.madcat.nl/martijn/rss.php?version=atom1.0&amp;type=comments&amp;cid=15</wfw:commentRss>
    
            <category scheme="http://www.madcat.nl/martijn/categories/1-Programming" label="Programming" term="Programming" />
    
        <id>http://www.madcat.nl/martijn/archives/15-guid.html</id>
        <title type="html">Pass by Reference in PHP5.</title>
        <content type="xhtml" xml:base="http://www.madcat.nl/martijn/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                Since the release of PHP5, the object model has changed. While it 'fixes' a lot of 'wrongs' I still get confused as to the how it should be used and what the result should be.<br />
<br />
My biggest gripe is that the 'where should references be defined' part is not enforced.<br />
<br />
By example:<br />
<br />
<div style="text-align: left"><ol><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">// use the '&amp;' reference thingy in the function arguments</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #000000; font-weight: bold;">function</span> foo<span style="color: #66cc66;">&#40;</span>&amp;<span style="color: #0000ff;">$var</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160; &#160; <span style="color: #0000ff;">$var</span> = <span style="color: #cc66cc;">2</span>;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#125;</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">// function doesn't care what the arg is, reference of not.</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #000000; font-weight: bold;">function</span> bar<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$var</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160; &#160; <span style="color: #0000ff;">$var</span> = <span style="color: #cc66cc;">2</span>;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#125;</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000ff;">$var</span> = <span style="color: #cc66cc;">1</span>;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">foo<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$var</span><span style="color: #66cc66;">&#41;</span>;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/print"><span style="color: #000066;">print</span></a> <span style="color: #0000ff;">$var</span>; <span style="color: #808080; font-style: italic;">// prints 2</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">// overwrite $var;</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000ff;">$var</span> = <span style="color: #cc66cc;">1</span>;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">bar<span style="color: #66cc66;">&#40;</span>&amp;<span style="color: #0000ff;">$var</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">// declare $var a reference in the function call.</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/print"><span style="color: #000066;">print</span></a> <span style="color: #0000ff;">$var</span>; <span style="color: #808080; font-style: italic;">// prints 2</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160;</div></li></ol></div><br />
<br />
This confuses me. Which of these implementations is preferable over the other? Should I just pick one and 'not worry be happy'? Why isn't one of these enforced.<br />
<br />
I would say that the second implementation is the 'prefered way', because it doesn't force the reference on you, and leaves the choice of $var being a reference to the person using the function. <br />
<br />
Even more confusing is the fact that the following also works without a hitch:<br />
<br />
<div style="text-align: left"><ol><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #000000; font-weight: bold;">function</span> foo<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$var</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160; &#160; <span style="color: #0000ff;">$var</span> = <span style="color: #cc66cc;">2</span>;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#125;</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000ff;">$int</span> = <span style="color: #cc66cc;">1</span>;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000ff;">$var</span> =&amp; <span style="color: #0000ff;">$int</span>;</div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">foo<span style="color: #66cc66;">&#40;</span>&amp;<span style="color: #0000ff;">$var</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">// passing a reference to a reference.</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/print"><span style="color: #000066;">print</span></a> <span style="color: #0000ff;">$var</span>; <span style="color: #808080; font-style: italic;">// prints 2, wuh?</span></div></li><li><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&#160;</div></li></ol></div><br />
<br />
I know the manual states:<br />
<br />
<blockquote><br />
They are not like C pointers; instead, they are symbol table aliases.<br />
</blockquote><br />
<br />
But its still confusing nonetheless. In my opinion E_STRICT should give me a notice (at least) to inform me of my questionable behaviour. But it doesn't, it just ignores me and goes on its merry way.<br />
<br />
 
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://www.madcat.nl/martijn/archives/14-Gijzeling-bij-de-NS..html" rel="alternate" title="Gijzeling bij de NS." />
        <author>
            <name>Martijn Gorree</name>
            <email>nospam@example.com</email>
        </author>
    
        <published>2006-11-08T11:02:19Z</published>
        <updated>2006-11-08T16:20:54Z</updated>
        <wfw:comment>http://www.madcat.nl/martijn/wfwcomment.php?cid=14</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://www.madcat.nl/martijn/rss.php?version=atom1.0&amp;type=comments&amp;cid=14</wfw:commentRss>
    
            <category scheme="http://www.madcat.nl/martijn/categories/5-Usability" label="Usability" term="Usability" />
    
        <id>http://www.madcat.nl/martijn/archives/14-guid.html</id>
        <title type="html">Gijzeling bij de NS.</title>
        <content type="xhtml" xml:base="http://www.madcat.nl/martijn/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                De NS. Die maatschappij die die vrolijke gele bananen gevuld met dat chagerijnige volk het hele land door stuurt. Die maatschappij die het niet zo nodig vond het 'seinen-beheer-computer-systeem' dubbel uit te voeren, waardoor het treinhart van nederland vele uren uitgeschakeld was. Die maatschappij die <u>altijd</u> op tijd is. U kent ze wel. De nederlandse spoorwegen.<br />
<br />
Deze maatschappij wist mij vandaag te verblijden met wat spam met de titel '<b>Kerstshoppen met NS Internationaal</b>'. Aangezien dit mij natuurlijk geen fuck kan schelen, zocht ik met mijn 'opt-out'-getrainde oog naar de miniscule letters waar vermeld stond hoe men zich kan uitschrijven.<br />
<br />
<blockquote><br />
U ontvangt deze e-mail omdat u als klant bij ons bekend bent of omdat u via de website van NS of NS Internationaal heeft aangegeven onze nieuwsbrief te willen ontvangen. Uw gegevens zijn opgenomen in het NS-klantenbestand. We gebruiken deze gegevens o.a. om u te informeren over voor u relevante diensten en producten van NS Internationaal. <b>Als u geen prijs stelt op informatie van NS Internationaal via internet of e-mail, of als u uw gegevens wilt wijzigen, klik dan hier.</b><br />
</blockquote><br />
<br />
"Mooi" dacht ik. Ik stel het inderdaad <b>niet</b> op prijs. Dus wil ik ook zo snel mogelijk mijn email adres verwijderen uit het 'bestand' van de NS. Bij 'klik hier' klikte ik dan ook 'daar'.<br />
<br />
Een normaal bedrijf zou hier een pagina plaatsen met een tekst in de vorm van:<br />
<blockqoute><br />
Klik hier om uit te schrijven voor de nieuwsbrief.<br />
</blockquote><br />
<br />
Maar niet de NS. Nee de NS doet het op haar manier. Evil. De NS laat zich hier van haar duistere kant zien. Het volgende presenteerde zich op mijn scherm:<br />
<br />
<img width='343' height='266' border='0' hspace='5' src='http://www.madcat.nl/martijn/uploads/ns.PNG' alt='' /><br />
<br />
Let vooral op de 'verplichte velden'. Als ik namelijk de vinkjes ontvink en klik op 'Opslaan' vertelt de NS site mij doodleuk 'Dude, screw you!'.<br />
<br />
De NS wil dus eerst weten hoe ik heet en waar ik woon in ruil voor het uitschrijven en zoals je al kunt raden ben ik dat natuurlijk niet van plan. Want zo kan de NS mij in plaats van spam gewoon een folder sturen. Krijgen ze toch nog wat ze willen. Soort gijzeling van prive gegevens als het ware. Ik vraag me af welke 'genius' dit verzonnen heeft. Vraag me ook af of 'klant vriendelijkheid' op het lijstje van te implementeren features stond.<br />
<br />
Ik zit dit nu in een soort van deadlock. Ik wil geen spam, ik wil geen folders en ik wil de NS geen gegevens geven die ze in mijn ogen nergens voor nodig hebben. Wat ik wel wil is een keuze. Maar die biedt de NS niet. Het is kiezen tussen 'the lesser of two evils'. Jammer hoor.. heel jammer!<br />
<br />
<b>UPDATE:</b> Net de NS even gebeld. In de hoop dat een 'mens' mij beter kan helpen dan een applicatie.<br />
<br />
<b>NS</b>: hallo dit is een systeem en kost 10 ct p/m bla bla keuzes bla bla<br />
<b>NS</b>: <klik>Hallo dit is 'dude bij ns', hoe kan ik u van dienst zijn?<br />
<b>Ik</b>: Ik wil dat mijn email adres verwijderd wordt uit het systeem.<br />
<b>NS</b>: Dat is prima, wat is uw postcode en adres<br />
<b>Ik</b>: (wtf?!) Nou dat is het hem juist, dat gaat jullie geen moer aan, ik wil gewoon dat het verwijderd word<br />
<b>NS</b>: [geiriteerd] OH! nou dan kan ik niets voor u doen!<br />
<b>Ik</b>: (wtf++) Maar dat soort gegevens hebben jullie toch niet nodig, hoe moeilijk kan het zijn, ik wil gewoon het adres verwijderd hebben<br />
<b>NS</b>: [geiriteerd] Nou u vind dat het ons geen moer aan gaat, dus .. dag meneer<br />
<b>NS</b>: [klik] piep piep piep<br />
<b>Ik</b>: WTF!<br />
<br />
Het moet toch niet veel gekker worden. Volgens mij gaat dit ook tegen de nieuwe <a href="http://wetboek.net/nl/Tw.html">Telecommunicatie wet</a> in. Want je moet ten alle tijden kunnen uitschrijven zonder extra informatie.<br />
<br />
Uit <a href="http://wetboek.net/nl/Tw/11.7.html">artikel 11.7</a> van de wet: (bedankt <a href="http://www.optinoptout.nl">optinoptout.nl</a>)<br />
<br />
<blockquote><br />
Een ieder die elektronische contactgegevens voor elektronische berichten heeft verkregen in het kader van de verkoop van zijn product of dienst mag deze gegevens gebruiken voor het overbrengen van communicatie voor commerciële, ideële of charitatieve doeleinden met betrekking tot eigen gelijksoortige producten of diensten, <b>mits bij de verkrijging van de contactgegevens aan de klant duidelijk en uitdrukkelijk de gelegenheid is geboden om kosteloos en op gemakkelijke wijze verzet aan te tekenen tegen het gebruik van die elektronische contactgegevens, en, indien de klant hiervan geen gebruik heeft gemaakt, hem bij elke overgebrachte communicatie de mogelijkheid wordt geboden om onder dezelfde voorwaarden verzet aan te tekenen tegen het verder gebruik van zijn elektronische contactgegevens.</b> Artikel 41, tweede lid, van de Wet bescherming persoonsgegevens is van overeenkomstige toepassing.<br />
</blockquote><br />
<br />
Hier staat nergens iets in dat ik mijn gegevens aan de NS moet verstrekken om zo van de spam af te komen. Sterker nog ik vraag me ook af of de NS het volgende kan bewijzen, aangezien ze gegevens vragen die ze eigenlijk al moesten weten alvorens mij spam te sturen.<br />
<br />
Uit dat zelfde <a href="http://wetboek.net/nl/Tw/11.7.html">artikel</a>:<br />
<blockquote><br />
Het gebruik van automatische oproepsystemen zonder menselijke tussenkomst, faxen en elektronische berichten voor het overbrengen van ongevraagde communicatie voor commerciële, ideële of charitatieve doeleinden aan abonnees is uitsluitend toegestaan, <b>mits de verzender kan aantonen dat de desbetreffende abonnee daarvoor voorafgaand toestemming heeft verleend</b>, onverminderd hetgeen is bepaald in het tweede lid. <br />
</blockquote><br />
<br />
Want zover ik weet, heb ik hier nooit om gevraagd.<br />
<br />
 
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://www.madcat.nl/martijn/archives/13-Recruiters.html" rel="alternate" title="Recruiters :/" />
        <author>
            <name>Martijn Gorree</name>
            <email>nospam@example.com</email>
        </author>
    
        <published>2006-10-30T14:39:51Z</published>
        <updated>2006-10-30T14:39:51Z</updated>
        <wfw:comment>http://www.madcat.nl/martijn/wfwcomment.php?cid=13</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://www.madcat.nl/martijn/rss.php?version=atom1.0&amp;type=comments&amp;cid=13</wfw:commentRss>
    
            <category scheme="http://www.madcat.nl/martijn/categories/2-Life" label="Life" term="Life" />
    
        <id>http://www.madcat.nl/martijn/archives/13-guid.html</id>
        <title type="html">Recruiters :/</title>
        <content type="xhtml" xml:base="http://www.madcat.nl/martijn/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <blockquote><br />
"We have a few interesting opportunities, why don't you call us to find out".<br />
</blockquote><br />
<br />
I go through these "i've got something but aint tellin" reactions like I go through spam. Ruthlessly. In my opinion; recruiters are lazy.<br />
<br />
The main reason I don't react to offers like this, is that its the recruiter's job to contact me with anything interresting, not the other way arround. I'm not spending my energy on <u>her</u> commision, forget it. If you want me to give you <u>any</u> kind attention, then bring this stuff to me like you're supposed to. Explain the jobs to me, tell me which companies you're working for. TELL ME SOMETHING, ANYTHING FFS.<br />
<br />
No.. they rather have me call <u>them</u> to ask what kind of jobs they've got. So I have to actually spend money on some vague assumption that there 'might' be something interresting. Well, no thanks, I'd rather poke my eyes out with a spoon. I'll just as easy go to the gazillion online job boards, where I can contact the companies directly, doing it <u>my</u> way.<br />
<br />
The whole 'carrot and stick' routine that a lot of recruiting companies are using is getting old. Very old.<br />
<br />
Fortunatly I'm not the only one with these sentiments:<br />
<br />
From <a href="http://www.joelonsoftware.com/items/2006/09/05b.html">Joel</a>:<br />
<blockquote><br />
Now, about the rule we made that you have to post the company name. A lot of recruiters are working on a contingency basis. They don't get paid unless they fill an opening. These recruiters generally don't want to post a company name, because then applicants could go straight to the employer and the recruiter would be cut out of their commission. That's why you see so many job ads in traditional places like classifieds that are totally vague about the specific company where you'd be working.<br />
<br />
That, unfortunately, is not going to work for us. Every good software developer I know has a choice of where to work. They don't want to work for a "TOP INVESTMENT BANK". Some investment banks are really nice places to work. Others are sweatshops. Some are ethical. Many are ethically challenged. Some require suits. Others are business casual. That's why we want to know the name of the company that's hiring, and unfortunately that means that recruiters who don't want to reveal the company name are really barking up the wrong tree.<br />
</blockquote><br />
<br />
From <a href="http://www.gravitonic.com/blog/archives/000163.html">Andrei</a>:<br />
<blockquote><br />
I frequently get phone calls or emails from recruiters. Their general expertise and cluefulness range is pretty wide: some are knowledgeable and do their research on my background before contacting me, while others expect that Hey, I have a C#/.NET as well as Java positions in New York City, please get back to me as soon as possible will garner some sort of response. And of course there's the middle ground. But by and large, the scale is definitely skewed towards the not so good side.<br />
</blockquote><br />
<br />
 
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://www.madcat.nl/martijn/archives/12-Grill-your-applicants!.html" rel="alternate" title="Grill your applicants!" />
        <author>
            <name>Martijn Gorree</name>
            <email>nospam@example.com</email>
        </author>
    
        <published>2006-06-23T09:44:40Z</published>
        <updated>2006-06-23T09:58:49Z</updated>
        <wfw:comment>http://www.madcat.nl/martijn/wfwcomment.php?cid=12</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://www.madcat.nl/martijn/rss.php?version=atom1.0&amp;type=comments&amp;cid=12</wfw:commentRss>
    
            <category scheme="http://www.madcat.nl/martijn/categories/1-Programming" label="Programming" term="Programming" />
    
        <id>http://www.madcat.nl/martijn/archives/12-guid.html</id>
        <title type="html">Grill your applicants!</title>
        <content type="xhtml" xml:base="http://www.madcat.nl/martijn/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                After I read <a href="http://terrychay.com/blog/">Terry Chay's</a> post about "<a href="http://terrychay.com/blog/article/php-coders.shtml">PHP Coders</a>", I wondered about what skill you would possibly need to call yourself a "professional" webdeveloper. I, for one, believe that there is a lot more to it then PHP/HTML/CSS/Javascript skill alone. So this is my addition to the "Grill your applicants!" question pool.<br />
<br />
Mine are mostly about all the stuff non-php-javascript-html-css.<br />
<br />
Has she ever worked with high traffic websites? How does one administer those? What can you do to speed up websites on both Win as Linux systems? How does one secure a Linux box? How does one work with a linux box securely? How well does she work the command line? Does she know shellscripting? Perl? Python? bash? Does she know vim or emacs or any ohter texteditor via commandline? How do you prevent data coruption? How do you handle data coruption? How do you set up backup systems? And in what situation is one backup setup preferable to the other? How do you make sure your data is transfered safely?<br />
<br />
What about webservers? Has she ever administered Apache or IIS?. Has she ever compiled PHP? Could he tell me why Apache2 is not preferable for PHP and why Apache1.3 is? Does she know how to secure a apache server? How do you tune apache? Could she tell me how DNS servers work? Could she tell me how HTTP works?<br />
<br />
How about database servers? Is she a phpmyadmin kinda girl (red flag!)? or does she use the command line? Has she ever installed and administered MySQL? How does one tune a MySQL server? How about PostgreSQL? What other database server does she have experience with? What are the specific defining features off both database servers? What are the situations for which you choose the one over the other? Why does or doesn't oracle suck for the web? When should you use sqllite, when should you use something else? How do MySQL indexes work? How do you optimize MySQL queries? How does PostgreSQL autovacuum work? Why is it useful? How does MySQL replication work? What does myisamchk do?<br />
<br />
Also, Coding in general. What are best pratices when coding websites? Has she ever used version control? What kind? Why are those useful? Which editors does she use? Does she know how to write Unit-tests? Does she know how to write maintainable code? Does she know unicode? How do you handle internationalisation? <br />
<br />
Doing webdevelopment is more then just pure coding skill. I value the whole "webdeveloper enviroment work experience" greatly. I, for one, would very much like to be sure that when the shit hits the fan (and it always hits.. badly too) that she would be able to handle the crisis accordingly. If you haven't had to simultaniously reinstate a mysql backup while making sure you're other database slaves arent crumbling under the extra load and handling multiple phone calls as to "WHY THE FUCKING SITE AINT WORKIN!" while your boss is stomping behind you because "WE'RE LOSING MONEY HERE DAMNIT! FIX IT NOW!".... Then you aint no webdeveloper. 
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://www.madcat.nl/martijn/archives/11-Adreswijzing.html" rel="alternate" title="Adreswijzing" />
        <author>
            <name>Martijn Gorree</name>
            <email>nospam@example.com</email>
        </author>
    
        <published>2006-06-21T14:43:25Z</published>
        <updated>2006-06-21T14:55:43Z</updated>
        <wfw:comment>http://www.madcat.nl/martijn/wfwcomment.php?cid=11</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://www.madcat.nl/martijn/rss.php?version=atom1.0&amp;type=comments&amp;cid=11</wfw:commentRss>
    
            <category scheme="http://www.madcat.nl/martijn/categories/5-Usability" label="Usability" term="Usability" />
    
        <id>http://www.madcat.nl/martijn/archives/11-guid.html</id>
        <title type="html">Adreswijzing</title>
        <content type="xhtml" xml:base="http://www.madcat.nl/martijn/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                Heuh! weer een voorbeeld van "usability gone bad". Dit keer bij <a href="http://www.hi.nl">http://www.hi.nl</a>.<br />
<br />
Zoals sommigen weten ben ik sinds kort verhuisd. Dus, dacht ik, "laat ik mijn hi abbonnement maar is overzetten". Vol goede moed ga ik naar de <a href="http://www.hi.nl">hi.nl site</a>. "Whoa! paars!" is mijn eerste reactie. <br />
<br />
"<a href="http://www.hi.nl/klantenservice/">Klantenservice</a>" zie ik staan, daar moet ik vast zijn. Het eerst wat me opvalt is de overweldigende keuze aan opties en geen zoek functie. De zoek functie is wel, maar het is niet in een klap duidelijk waar je moet zijn. Een kant en klare "zoek hier je shit" invulveld zou geen overbodige luxe zijn. "Zoeken naar de zoek functie" geeft een raar gevoel.<br />
<br />
Aangezien ik geen zin heb die hele lijst door te lezen (ondanks dat mijn antwoord daar, bij nader inzien, gewoon tussen staat) ga ik direct naar het zoeken. Macht der gewoonte denk ik. Ik voer "adreswijziging" in en klik op zoek.<br />
<br />
"1 Antwoorden gevonden" zegt de site. "Online diensten regelen". Niet bepaald wat ik zoek. Mag ik de mensen van KPN er aan helpen herinneren dat een zoek functie die niet functioneerd een van de grootste usability ergenissen is. Ondanks dat het antwoord uitkomt op de plek die ik eigenlijk nodig heb, klik ik er niet op. Om de simpele reden dat er niet staat wat ik zoek, zelfs al heb ik het gevonden. Daarnaast is het ronduit zielig dat <a href="http://www.google.nl/search?q=adreswijziging+site%3Awww.hi.nl">google</a> met "adreswijziging site:www.hi.nl" wel precies vind wat ik wil hebben. <br />
<br />
Uiteindelijk kom ik op de juiste plek terecht. Er verschijnt een mooie popup met daarin het formulier. Jammer van de <a href="http://www.guuui.com/posting.php?id=1792">popup</a> denk ik gelijk. Goed, met popups kan ik leven, ik moet immers alleen even een adreswijziging doorvoeren.<br />
<br />
Een paar dingen in het formulier vallen me op:<br />
<br />
<b>Ten eerste:</b><br />
<br />
De postcode velden zijn kut. Ik haat het werkelijk om in een bepaald formaat strings in te voeren. "9999ZZ is graag hoe wij het willen" krijg ik te horen van hi. Oh! Sinds wanneer gaan we bij het maken van een site, waar mensen zelf hun shit kunnen regelen, uit van hoe <u>het_bedrijf</u> het graag wil hebben? Misschien zou je dat eens om moeten draaien en moeten kijken naar hoe de klant het wil. Misschien zou je het zo kunnen maken dat het niet mogelijk is om fouten te maken; select boxes bijv. Of misschien is een "niet zo stricte input parser" een goed idee.<br />
<br />
<b>Ten tweede:</b><br />
<br />
Na het invullen van het formulier krijg ik dit: "De verhuisdatum moet minimaal 5 dagen in de toekomst en op een werkdag (maandag t/m vrijdag) vallen.". WTF!? Dus ik mag niet verhuizen in het weekend? En ik mag niet al verhuisd zijn? Dit is gewoon lachwekkend.<br />
<br />
Nou valt het allemaal wel mee, het zijn immers kleine puntjes die net even niet lekker werken. Die "kleine puntjes" worden echter snel grote irritaties. Dit is vooral zo met <a href="http://en.wikipedia.org/wiki/Feature_creep">feature creep</a>. Ik ken de geschiedenis van de hi site niet zo goed, maar het voelt aan als een oude site die over de jaren veel aanpassingen heeft gehad. Hi zou er goed aan doen een keer flink de bezem door de klantenservice heen te halen. Maar ja, als je vast zit aan een <a href="http://www.gx.nl/webmanager/show/id=66376/langid=43/GX_WebManager.html">CMS</a> (althans zo lijkt het) is dat misschien erg lastig.<br />
<br />
Over Search valt nog wel wat te zeggen:<br />
<br />
<a href="http://www.useit.com/jakob/">Jakob Nielsen</a>: <a href="http://www.useit.com/alertbox/20050509.html">Mental Models For Search Are Getting Firmer</a>, <a href="http://www.useit.com/alertbox/9707b.html">Search and You May Find</a>, <a href="http://www.useit.com/alertbox/20010513.html">Search: Visible and Simple</a><br />
<br />
<a href="http://www.37signals.com">37signals</a>: <a href="http://www.37signals.com/report_search_0103.php">the 37signals E-Commerce Search Report</a><br />
<br />
En uiteraard: <a href="http://www.google.nl/search?q=Search+usability">http://www.google.nl/search?q=Search+usability</a><br />
 
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://www.madcat.nl/martijn/archives/10-Klantvriendelijke-Caiway.html" rel="alternate" title="Klantvriendelijke Caiway" />
        <author>
            <name>Martijn Gorree</name>
            <email>nospam@example.com</email>
        </author>
    
        <published>2006-05-16T10:12:26Z</published>
        <updated>2006-06-21T14:44:23Z</updated>
        <wfw:comment>http://www.madcat.nl/martijn/wfwcomment.php?cid=10</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://www.madcat.nl/martijn/rss.php?version=atom1.0&amp;type=comments&amp;cid=10</wfw:commentRss>
    
            <category scheme="http://www.madcat.nl/martijn/categories/5-Usability" label="Usability" term="Usability" />
    
        <id>http://www.madcat.nl/martijn/archives/10-guid.html</id>
        <title type="html">Klantvriendelijke Caiway</title>
        <content type="xhtml" xml:base="http://www.madcat.nl/martijn/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                Je zult het niet geloven maar mijn lokale <a href="http://www.caiway.nl">kabel boer</a> heeft een <i>klantvriendelijke, no nonsense benadering</i>. Althans .. dat zegt de site. Maar zoals iedereen weet is de realiteit vaak anders.<br />
<br />
Nou is dit natuurlijk geen wereldschokkend nieuws, aangezien je dit in de maatschappij van vandaag kan verwachten. Veel van de bedrijven waar je zaken mee doet interreseren zich niet in haar klanten. Als ze maar wat aan je verdienen is het best, verder moet je gewoon je muil houden. Het voelt aan als; "Dat wij dingen als support / klantvriendelijk op onze site zetten, betekend natuurlijk niet dat we er ook echt iets aan doen".. "WEET JE WEL HOEVEEL DAT KOST". <br />
<br />
Het ergste van allemaal is nog wel dat we er gewoon niets aan kunnen of willen doen. Het is tegenwoordig algemeen geaccepteerd dat je behandeld word als 'lastig', terwijl jij, als klant geld komt brengen. Ik moet er bij zeggen dat ik zelf ook schuldig ben aan het "oh.. laat maar gaan" gedrag. Het word weer is tijd voor een goeie punk beweging. Een collectief "dit pikken we gvd niet meer". Want we worden steeds vaker slecht behandeld terwijl we er niets aan doen.<br />
<br />
Hoe ik hier zo bij kom? Nou, dat zal ik eens haarfijn uitleggen.<br />
<br />
Ik ben, wat voor velen als een schok zal komen, Caiway gebruiker van het eerste uur. Ik heb zelfs nog met die ranzige coax/seriele crap-ass modems gewerkt. En dat alles(!) met plezier. Moeilijk voor te stellen, ik weet het, maar de afgelopen jaren heb ik een prima aansluiting gehad. <br />
<br />
Aangezien ik best tevreden was met de prijs / snelheid van Caiway, besloot ik voor mijn nieuwe woning ook een Caiway abbonement te nemen. Een internet junkie als ik moet natuurlijk een beetje bandbreedte hebben, dus ik besloot om maar gelijk het snelste abbonnement in de buurt te nemen. WANT JA! Je moet toch iets.<br />
<br />
Dus ik naar de caiway site...<br />
<br />
<blockquote><br />
    "Kies je abbo en vul je shit in"<br />
</blockquote><br />
<br />
Ok... dus ik invullen.. alles ingevuld. Klik "OK".<br />
<br />
<blockquote><br />
    "Print deze shit uit en stuur dit op"<br />
</blockquote><br />
<br />
Oh humm.. <br />
<br />
Goed, je bent een internet provider. "<u>INTERNET</u>" provider.... Waarom moet ik dan (in godsnaam) een brief in een envelop stoppen, naar de brievenbus lopen en de brief erin stoppen, als jullie net zo goed online, zonder dat ik uit mijn stoel hoef te komen, dat zelfde formuliertje kunnen verwerken? Leg me dat is uit. En kom niet met "ja maar, ja maar" Jullie zijn een INTERNET TOKO, laat is zien dat je er verstand van hebt.<br />
<br />
We kunnen tegenwoordig <u>ALLES</u> via het internet bestellen. Van <a href="http://www.christineleduc.nl/">dildos</a> tot <a href="http://albert.nl">voer</a>. Alleen een connectie met dit befaamde internet gaat via papier. Sorry hoor, maar aan mensen zoals ik, die dit soort dingen voor hun beroep maken, is dat moeilijk uit te leggen.<br />
<br />
Maar Goed! dit kan ik nog wel hebben. Zei het zo.. dan zei het zo.<br />
<br />
Een paar dagen later krijg ik vier(!) brieven thuis. Misschien dachten ze, "allemaal aparte brieven sturen is makkelijk dan 1 pakket". Kan het me moeilijk voorstellen, maar het is hun geld, dus het zal wel. <br />
<br />
In een van van deze brieven vind ik:<br />
<br />
<blockquote><br />
    "Om je modem te krijgen moet je ff met de koerier bellen"<br />
</blockquote><br />
<br />
Ok.. prima, dan bellen we even.<br />
<br />
<b>Koerier</b>: "Hallo, u belt voor een modem"<br />
<b>Ik</b>: "Ja inderdaad! Zou je deze toevallig kunnen afleveren op mijn kantoor adres?"<br />
<b>Koerier</b>: "Wat is uw postcode?"<br />
<b>Ik</b>: "Van mijn kantoor of van de plek waar ik dat ding ga aansluiten?"<br />
<b>Koerier</b>: "Wat is uw postcode?"<br />
<b>Ik</b>: "Uhh... XXXX BC?"<br />
<b>Koerier</b>: "Nee de postcode waar de brief naar toe is gestuurd"<br />
<b>Ik</b>: "Oooh! .. XXXX CG!"<br />
<b>Koerier</b>: "Ben u martijn <adres>?"<br />
<b>Ik</b>: "Ja inderdaad! He maar, zou dat ding ook op mijn kantoor adres kunnen worden geleverd?"<br />
<b>Koerier</b>: "In poortugaal?"<br />
<b>Ik</b>: "Nee... rotterdam"<br />
<b>Koerier</b>: "We leveren niet in rotterdam"<br />
<b>Ik</b>: "Oh .. lekker is dat.. maar jullie kunnen hem toch gewoon hier brengen?"<br />
<b>Koerier</b>: "We leveren niet in rotterdam"<br />
....<br />
<br />
Nou je kan begrijpen hoe dit eindigde. Het komt er op neer dat ik de hele dag thuis moet blijven om te wachten op een modem die net zo makkelijk op kantoor (wat overgens vanuit Naaldwijk, dichterbij is) afgeleverd kan worden. Nu moet <u>ik</u> (de klant) vrij nemen, zodat het bedrijf dat mij de goederen leverd, waar ik al voor betaald heb, niet hoeft uit te wijken naar Rotterdam. WEET JE WEL WAT <u>DAT</u> KOST! JE ZOU OOK FF EEN KLEIN BEETJE MOEITE KUNNEN DOEN ZODAT IK, DE KLANT, NIET DOOR HOEPELS MOET SPRINGEN OM TE KRIJGEN WAAR IK (FFS) AL VOOR BETAALD HEB.<br />
<br />
Er staat toch "klantvriendelijke, no nonsense benadering"?. Zouden jullie me uit kunnen leggen in hoeverre dit betrekking heeft op mij? WANT DIT IS NIET ERG <u>FUCKING</u> KLANTVRIENDELIJK (als je mij vraagt)<br />
<br />
Ik zat er nog over na te denken om misschien over te stappen naar Digitale telefoon van caiway, maar ik denk dat hier nog maar even mee wacht.<br />
<br />
 
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://www.madcat.nl/martijn/archives/9-Nosing-and-Tasting.html" rel="alternate" title="Nosing and Tasting" />
        <author>
            <name>Martijn Gorree</name>
            <email>nospam@example.com</email>
        </author>
    
        <published>2006-04-25T18:13:21Z</published>
        <updated>2006-04-25T18:38:41Z</updated>
        <wfw:comment>http://www.madcat.nl/martijn/wfwcomment.php?cid=9</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://www.madcat.nl/martijn/rss.php?version=atom1.0&amp;type=comments&amp;cid=9</wfw:commentRss>
    
    
        <id>http://www.madcat.nl/martijn/archives/9-guid.html</id>
        <title type="html">Nosing and Tasting</title>
        <content type="xhtml" xml:base="http://www.madcat.nl/martijn/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                Thomas and I sure enjoy a good (single malt) whisky now and then. Over time I've built up a nice repository of bottles from which I regularly take my pick. My collection is now about 15 bottles. Which might not be much compared to you "whisky-veterans" but considering the price of whisky in general, I'd say its pretty damn impressive. <br />
<br />
Being such a fan of whisky my brother and I had the briliant idea of making a '<a href="http://www.nosingandtasting.com">nosing and tasting</a>' web site. From which we would review whisky's and report whisky news. As with all good ideas we've run into a few problems.<br />
<br />
The biggest of them all is, and many bloggers/web publishers would surely acknowledge this, time. I for one haven't got the time to catch up on all the whisky news. My brother seems to have the very same problem *gasp*. This brings us to a dilemma; "Were do we get the time to write stuff for the site?".<br />
<br />
A basic answer would be:<br />
<br />
"err .. fuck it, don't have the time? Don't do it".<br />
<br />
Which is, sadly, true. <br />
<br />
BUT! Since we're not ready to give up on our <a href="http://www.nosingandtasting.com">whisky-blog</a>. I therefore put out a request to those which are willing and capable to provide some content. The very least you could contribute is to send us an <a href="mailto:info@nosingandtasting.com">email</a> pointing us in the right direction.<br />
<br />
In time, when I'm done with moving to my new house and when the world stops spinning so fast, I will try to be more involved and provide more useful content.<br />
<br />
Next to that I came to develop a great respect for those who are capable of writing something interesting every day of the week. My hat is off to you. 
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://www.madcat.nl/martijn/archives/8-Aangifte-met-hindernissen..html" rel="alternate" title="Aangifte met hindernissen." />
        <author>
            <name>Martijn Gorree</name>
            <email>nospam@example.com</email>
        </author>
    
        <published>2006-03-20T20:17:07Z</published>
        <updated>2006-06-21T14:44:44Z</updated>
        <wfw:comment>http://www.madcat.nl/martijn/wfwcomment.php?cid=8</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://www.madcat.nl/martijn/rss.php?version=atom1.0&amp;type=comments&amp;cid=8</wfw:commentRss>
    
            <category scheme="http://www.madcat.nl/martijn/categories/5-Usability" label="Usability" term="Usability" />
    
        <id>http://www.madcat.nl/martijn/archives/8-guid.html</id>
        <title type="html">Aangifte met hindernissen.</title>
        <content type="xhtml" xml:base="http://www.madcat.nl/martijn/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                Vandaag dacht ik "laat ik maar is aangifte doen van mijn verloren portomonee". Zoals een goede nerd ben ik gaan zoeken naar de aangifte mogelijkheden via het internet. En jawel hoor! <a href="http://aangifte.politie-rotterdam-rijnmond.nl/aangifte/voortgang/index.asp">Politie Rijnmond</a> heeft zowaar een site waar men aangifte kan doen via het web. <br />
<br />
Mijn dag kon niet meer stuk, gewoon lekker achter je scherm, even wat formpjes invullen en klaar! "HOE MOEILIJK KAN HET ZIJN" hoorde ik mezelf denken. Stom! stom! stom! Zoals iedereen waarschijnlijk al kan vermoeden is de site, zacht gezegt, een typisch geval van jammer.<br />
<br />
Ik begon goed;<br />
<br />
Eerste pagina: <br />
    <blockquote><p>"Met deze site wil Politie Rotterdam-Rijnmond de service verbeteren. U kunt zo sneller en makkelijker aangifte doen. Dat is prettig voor u én voor de politie. Internetaangifte bespaart ons namelijk ook tijd en moeite".</p></blockquote><br />
    <br />
"Nou komt dat even mooi uit" dacht ik. "Ik bespaar zelfs moeite EN tijd". Ik werd helemaal warm van binnen.<br />
<br />
Tweede pagina:<br />
    <blockquote><p>Het is niet mogelijk internetaangifte te doen van: blablabla</p></blockquote><br />
    <br />
Lijstje doorgenomen, "verloren portomonee" staat er niet bij. "Vet!" dacht ik, kan ik mooi aangifte doen via de site. Kan ik zometeen fijn mijn bespaarde tijd en moeite ergens anders voor gebruiken.<br />
<br />
Pagina drie:<br />
    <blockquote><p>Bla bla bla</p></blockquote><br />
    <br />
We weten het nou wel. "BRENG ME DE FORMULIEREN" ging door mijn gedachten. Ik zit klaar om ze er in te stampen. Kan ik daarna mooi aan de slag met mijn bespaarde tijd en moeite.<br />
<br />
Pagina vier:<br />
    <blockquote><p>Gebruik Internet Explorer 4.0 of hoger. Andere browsers kunnen onverwachte problemen veroorzaken</p></blockquote><br />
    <br />
Uh oh. De eerste tekenen van een door "eerste jaars punicken voor beginners en part time web developer" gemaakte site. "Ach, zal zon vaart wel niet lopen" dacht ik. De meeste sites waarbij staat "werkt alleen met IE" werken stiekem toch in Firefox. "HOE ERG KAN HET ZIJN" dacht ik nog.<br />
<br />
Tegen de "waarschuwing" in ben ik op mijn dooie gemak de formulieren met Firefox in gaan vullen. Klik, tikkerdetik, klik, tikker, klik, bijna klaar, klik klik, tikkerdetik, laatste pagina!. "Klik hier om uw shit te versturen". GHAH! Victorious! Mijn trouwe browser heeft zich er dapper doorheen gewerkt. Nog een enkele klik en ik ben klaar!....<br />
<br />
klik...<br />
<br />
HTTP Error 404. Page not found.<br />
<br />
Fuck...<br />
<br />
Daar gaat mijn zuur verdiende tijd en moeite.<br />
<br />
Uiteindelijk heb ik mijn aangifte kunnen doen. Via IE. Bah ... Ik voelde me vies ...<br />
<br />
<a href="http://www.getfirefox.com">Firefox</a> / <a href="http://www.konqueror.org/">Konqueror</a> / <a href="http://www.opera.com">Opera</a> / <a href="http://www.apple.com/safari">Safari</a> gebruikers opgelet. Justitie mag jullie niet. Stelletje hippies! Met jullie nep-browsers en fop-OS-en. BAH! Sleep je Open-Source/OSX reet maar naar het bureau waar je lekker fomuliertjes mag invullen. GA MAAR SCHRIJVEN! MET EEN PEN!<br />
<br />
Niet alleen het feit dat justitie eist dat je een Microsoft powered product moet gebruiken is erg. De formulieren die men in moet vullen getuigen niet van enige kwaliteit. Vooral de usability laat erg te wensen over. Er zit te veel javascript-achtige schmuck in. Alsof de site mijn invoer kinderachtig corrigeerd. "NEE 'PORTOMONEE' MAG JE NIET IVULLEN! FOEI! HET IS 'OVERIGE', SNAP JE DAT DAN NIET" Of: "WAT! MEER DAN 60 CHARS VOOR JE BESCHRIJVING! NIKS NIET! WE GAAN NIET SPECIAAL VOOR JOU MEER BYTES RESERVEREN! WIE DENK JE WEL GVD NIET WIE JE BENT!". Daar zit je dan, met tranen in je ogen "Maar oom agent, ik kon er niets aan doen!"<br />
<br />
De site voelt aan als een stage-opdracht en zo ziet het er ook uit. Ik kan me niet voorstellen dat een commercieel bedrijf dit aflevert. Nou... wacht even, eigenlijk wel. Dit is waarschijnlijk weer zoiets wat voor veel te veel belastings-pegels in elkaar is geprutst. Jammer hoor, erg fucking jammer.<br />
<br />
Mochten er ambtenaren zijn die dit toevallig lezen en denken "pff!". Laat ik ze dan even herinneren aan "<a href="http://webrichtlijnen.overheid.nl/">Richtlijnen voor de toegankelijkheid en duurzaamheid van overheidswebsites</a>". Dus geen gezeik van "dat wist ik niet". Je wist het <b>wel</b>.<br />
<br />
 
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://www.madcat.nl/martijn/archives/5-We-made-a-new-one.-thank-god.html" rel="alternate" title="We made a new one. (thank god)" />
        <author>
            <name>Martijn Gorree</name>
            <email>nospam@example.com</email>
        </author>
    
        <published>2005-10-20T12:55:35Z</published>
        <updated>2005-10-20T12:59:53Z</updated>
        <wfw:comment>http://www.madcat.nl/martijn/wfwcomment.php?cid=5</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://www.madcat.nl/martijn/rss.php?version=atom1.0&amp;type=comments&amp;cid=5</wfw:commentRss>
    
            <category scheme="http://www.madcat.nl/martijn/categories/4-Madcat" label="Madcat" term="Madcat" />
    
        <id>http://www.madcat.nl/martijn/archives/5-guid.html</id>
        <title type="html">We made a new one. (thank god)</title>
        <content type="xhtml" xml:base="http://www.madcat.nl/martijn/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                Since I started working at <a href="http://www.tblox.com">TBlox</a> I always thought that the old website was way too crappy for any professional company. No wait, I can do better. It was so ugly that if any living organism viewed the thing, a small kitten would die. So we, <a href="http://www.madcat.nl">madcat "protectors of kittens worldwide"</a>, took on the incredible job of ridding the world of the hidious beast we call "<a href="http://www.businessmanagementpartners.com/tblox/" target="_blank">the old site</a>".<br />
<br />
Ok. Enough metaphorical bollocks. So we made a site again. Whoopee! I was about damn time too. So for all you interested folk: <a href="http://www.tblox.com" target="_blank">the new and improved TBlox site</a>.<br />
<br />
The site still kinda jabs in your face. But at least its a lot more spiffy then the old one. We have yet to do the 'About' page but so far I'm quite pleased with the result.<br />
<br />
Our goal was to create something 'simple', so that we wouldn't have much trouble with IE. Because we all know that XHTML / CSS and Internet Explorer don't go well together. I'm happy to say; it worked. I could not, however, completely avoid using CSS hacks, so I ended up with a very reasonal amount of two. <br />
<br />
I tried to be as semantic as posible when it came to constructing the HTML and made it a primary goal to make the basterd validate. That, to my complete suprise, actually worked as well.<br />
<br />
The only problem that rests is that I use a cookie to set the language (Who doesn't). Now the problem lies not with the actual cookie but with the way I set it. I chose to use javascript. The problem is that when googlebot shows his magic face, that 'he' will not be able to see past the default language(Dutch), because google can't execute javascript. So, thats still a little thorn in the eye and should be fixed some time.<br />
<br />
Anyway, just an update to show you that I'm not dead. 
            </div>
        </content>
        
    </entry>

</feed>