[{"data":1,"prerenderedAt":116},["ShallowReactive",2],{"i-lucide:menu":3,"i-lucide:arrow-up-right":8,"i-lucide:moon":10,"i-lucide:sun":12,"i-lucide:rss":14,"i-simple-icons:github":16,"i-simple-icons:linkedin":18,"post-\u002F2012\u002Flessons-learned":21,"surround-\u002F2012\u002Flessons-learned":103,"i-lucide:arrow-left":112,"i-lucide:arrow-right":114},{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":7},0,24,false,"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 5h16M4 12h16M4 19h16\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":9},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M7 7h10v10M7 17L17 7\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":11},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":13},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"4\"\u002F>\u003Cpath d=\"M12 2v2m0 16v2M4.93 4.93l1.41 1.41m11.32 11.32l1.41 1.41M2 12h2m16 0h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":15},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M4 11a9 9 0 0 1 9 9M4 4a16 16 0 0 1 16 16\"\u002F>\u003Ccircle cx=\"5\" cy=\"19\" r=\"1\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":17},"\u003Cpath fill=\"currentColor\" d=\"M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":19,"hidden":20},"\u003Cpath fill=\"currentColor\" d=\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037c-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85c3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.06 2.06 0 0 1-2.063-2.065a2.064 2.064 0 1 1 2.063 2.065m1.782 13.019H3.555V9h3.564zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0z\"\u002F>",true,{"id":22,"title":23,"body":24,"category":84,"comments":85,"date":86,"description":87,"excerpt":85,"extension":88,"image":85,"meta":89,"navigation":20,"path":90,"readingTime":91,"seo":92,"stem":93,"subtitle":85,"tags":94,"wordCount":101,"__hash__":102},"posts\u002F2012\u002Flessons-learned.md","Lessons learned",{"type":25,"value":26,"toc":80},"minimark",[27,37],[28,29,30,31,36],"p",{},"With the past two years, there's been an incredible development in my experience and knowledge as a software developer. Still, it's important to look back at ones mistakes and learn from them.\nI still have the complete source code and database of my very first large scale program.  The year was 2007 (I think) when I first discovered the ",[32,33,35],"a",{"href":34},"http:\u002F\u002Fdragon.se7enet.com\u002Fdev.php","Dragon Knight open source MMORPG project",". In no time at all I had the system up and running in localhost and the next summer (or two) went into learning web technologies, programming and CS in general.\nNow, as part of a software testing course assignment, I had the incentive to look back and write down some notes.",[38,39,40,44,47,50,53,56,59,62,65,68,71,74,77],"ul",{},[41,42,43],"li",{},"Don't use PHP closing tags in php-only files",[41,45,46],{},"If you have a single entry point (framework index.php), do a check in the first line of every file that the entry point is used. Kohana does that with a constant defined check that dies on failure.",[41,48,49],{},"DRY: put config into one place",[41,51,52],{},"Use InnoDB relational tables",[41,54,55],{},"Don't mix Models, Views, Controllers in a single file - use arhitecture. It's also DRY!",[41,57,58],{},"I18n mostly everything. You don't have to actually translate it, just make it translatable in the future. In Kohana: use the __() function. For javascript, find a library.",[41,60,61],{},"Keep font sizes and color contrasts readable",[41,63,64],{},"Always let the user visually distinguish where (s)he is in terms of navigation. Breadcrumbs are a good idea. Back links should be present in multi-staged navigation. Logo should link to the index page. The user shouldn't feel lost.",[41,66,67],{},"Main navigation should be visible on all pages (there are justified exceptions)",[41,69,70],{},"Be consistent: an UI element that act the same should always look so, too. Don't make one link blue, the other green, if they behave the same. DO make a link red if it's dangerous, but not simply for fun.",[41,72,73],{},"Avoid opening multiple popup windows, use modal dialogs, tooltips, javascript plugins to present the information. When you do open a popup, make sure it's sized so that the user doesn't have to resize it to see the whole content.",[41,75,76],{},"Don't hardcode system messages via a query string (...&messageID=1) (nor ?message=Please+Try+Again)",[41,78,79],{},"Test against security vulnerabilities! Malicious input (injection, XSS) in particular.",{"title":81,"searchDepth":82,"depth":82,"links":83},"",2,[],"Software Development",null,"2012-03-17","With the past two years, there's been an incredible development in my experience and knowledge as a software developer. Still, it's important to look back at ones mistakes and learn from them.\nI still have the complete source code and database of my very first large scale program.  The year was 2007 (I think) when I first discovered the Dragon Knight open source MMORPG project. In no time at all I had the system up and running in localhost and the next summer (or two) went into learning web technologies, programming and CS in general.\nNow, as part of a software testing course assignment, I had the incentive to look back and write down some notes.","md",{},"\u002F2012\u002Flessons-learned","about 2 minutes",{"title":23,"description":87},"2012\u002Flessons-learned",[95,96,97,98,99,100],"mmorpg","php","project","framework","dragon knight","open source",374,"VDCntbuOow_eJro83YAzzZNC9NrDWyQ9cDmchiAo_TY",[104,108],{"title":105,"path":106,"stem":107,"children":-1},"Scraping for grades","\u002F2012\u002Fscraping-for-grades","2012\u002Fscraping-for-grades",{"title":109,"path":110,"stem":111,"children":-1},"Garage48 2012 Tallinn - impressions","\u002F2012\u002Fgarage48-2012-tallinn-impressions","2012\u002Fgarage48-2012-tallinn-impressions",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":113},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"m12 19l-7-7l7-7m7 7H5\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":115},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 12h14m-7-7l7 7l-7 7\"\u002F>",1790886934221]