{"id":115,"date":"2012-11-01T09:44:49","date_gmt":"2012-11-01T16:44:49","guid":{"rendered":"http:\/\/martinecker.com\/martincodes\/?p=115"},"modified":"2012-11-01T09:44:49","modified_gmt":"2012-11-01T16:44:49","slug":"cool-link-stash-october-2012","status":"publish","type":"post","link":"http:\/\/martinecker.com\/martincodes\/cool-link-stash-october-2012\/","title":{"rendered":"Cool Link Stash, October 2012"},"content":{"rendered":"<h4>JavaScript & Web Development<\/h4>\n<p><a href=\"http:\/\/killdream.github.com\/blog\/2011\/10\/understanding-javascript-oop\/\" target=\"_blank\">Understanding JavaScript OOP<\/a> is a great article on, well, understanding how OOP works in JavaScript. It's interesting because it's very different from how OOP is implemented in languages like C++, C#, or Java. JavaScript implements prototypical OOP similarly to Self.<\/p>\n<p><a href=\"http:\/\/www.pixeljet.net\/index.html\" target=\"_blank\">pixleJET<\/a> is a nifty online, in-browser development environment for HTML, CSS, and JavaScript.<\/p>\n<p><a href=\"http:\/\/brendaneich.github.com\/Strange-Loop-2012\" target=\"_blank\">The State of JavaScript<\/a> is a good presentation on current developments in JavaScript, in particular with regards to ECMAScript 6.<\/p>\n<p>Since I've been recently dabbling with the MVVM pattern in WPF, I was looking for ways to do MVVM in the web browser with JavaScript as well. There are quite a few libraries out there, but one that struck me as quite nice is <a href=\"http:\/\/knockoutjs.com\/\" target=\"_blank\">Knockout<\/a>. The project's site has really good online tutorials where you develop small websites using Knockout directly in the browser, kind of like how pixelJET works.<\/p>\n<p>If Knockout.js is not your thing, there are plenty of other libraries that help implement any kind of MV* pattern you can imagine. A good way to choose between them is to read <a href=\"http:\/\/coding.smashingmagazine.com\/2012\/07\/27\/journey-through-the-javascript-mvc-jungle\/\" target=\"_blank\">Journey Through the JavaScript MVC Jungle<\/a>. The article references <a href=\"http:\/\/todomvc.com\/\" target=\"_blank\">TodoMVC<\/a>, which is a small todo web application implemented in a large number of MV* libraries.<\/p>\n<p><\/p>\n<h4>C++<\/h4>\n<p><a href=\"http:\/\/cppreference.com\/\" target=\"_blank\">cppreference.com<\/a> is a great site that is a reference of the all variants of standard C\/C++ and their respective standard libraries, in particular C++98, C++03, C++11, C89, C99, and C11.<\/p>\n<p>Scott Myers has a good article on rvalue references and how they can be something else in certain cases where the type gets deduced, as is the case in templates or when using the <strong>auto<\/strong> keyword. He proposes the term universal references for these cases. Read <a href=\"http:\/\/accu.org\/var\/uploads\/journals\/Overload111.pdf\" target=\"_blank\">his interesting article in Overload 111<\/a>.<br \/>\nHe gave a presentation on the same topic and a <a href=\"http:\/\/channel9.msdn.com\/Shows\/Going+Deep\/Cpp-and-Beyond-2012-Scott-Meyers-Universal-References-in-Cpp11\" target=\"_blank\">video of it is available here<\/a>.<\/p>\n<p>There has been some interesting discussion on various C++ blogs lately on how to best pass parameters to functions in C++11 that is worth following. Here are the relevant links in order:<\/p>\n<ul>\n<li><a href=\"http:\/\/codesynthesis.com\/~boris\/blog\/2012\/06\/19\/efficient-argument-passing-cxx11-part1\/\" target=\"_blank\">Boris Kolpackov - Efficient argument passing in C++11<\/a><\/li>\n<li><a href=\"http:\/\/www.slideshare.net\/SumantTambe\/c11-idioms-silicon-valley-code-camp-2012\" target=\"_blank\">Sumant Tambe - C++11 Idioms<\/a><\/li>\n<li><a href=\"http:\/\/scottmeyers.blogspot.com\/2012\/10\/parameter-types-in-constructors.html\" target=\"_blank\">Scott Meyers - Parameter Types in Constructors<\/a><\/li>\n<\/ul>\n<p>While I appreciate these discussions as a programming language nerd, it definitely shows that C++11 makes C++ a much more complicated language in many regards, especially if you want to use all of its features to maximum effect. Even in these early days of C++11 usage, we already notice some loopholes or missing pieces with the latest language features, such as rvalue references and perfect forwarding. I'm glad I don't have to teach C++11. That sounds like a nightmare.<\/p>\n<p>Christian Plesner Hansen posted an <a href=\"http:\/\/blog.quenta.org\/2012\/09\/0x5f3759df.html\" target=\"_blank\">excellent article explaining in-depth how the inverse square root hack works<\/a>. That hack was made famous by its use in the Quake C code base. He not only shows how and why the hack works but also demonstrates how it can be modified to work for 64-bit floating point types (or really any arbitrary number of bits) and how it can be extended to not just work for the inverse square root (i.e. a power of -0.5) but for any power between -1 and 1.<\/p>\n<p><\/p>\n<h4>Graphics<\/h4>\n<p>The Journal of Computer Graphics Techniques posted a new article on compressing the frame buffer called <a href=\"http:\/\/graphics.cs.williams.edu\/jcgt\/published\/0001\/01\/02\/\" target=\"_blank\">The Compact YCoCg Frame Buffer<\/a>. The idea is to basically reduce the frame buffer storage requirements by converting fragments into the YCoCg color space (which is a luminance\/chrominance color space) and then store the chrominance channels at a lower resolution since the human eye isn't as sensitive to chrominance variations as it is to luminance variations. There is also a WebGL demo and a video on the paper's web site.<\/p>\n<p>Simon Yeung posted a <a href=\"http:\/\/www.altdevblogaday.com\/2012\/10\/12\/angle-based-ssao\/\" target=\"_blank\">nice article on his implementation of angle-based SSAO<\/a> over at <a href=\"http:\/\/www.altdevblogaday.com\/\" target=\"_blank\">#AltDevBlogADay<\/a>. You can find <a href=\"http:\/\/simonstechblog.blogspot.com\/2012\/10\/angle-based-ssao.html\" target=\"_blank\">the same article on his personal blog<\/a>.<\/p>\n<p>Ben Weston posted a nice blog article dealing with <a href=\"http:\/\/prettyprocs.wordpress.com\/2012\/10\/20\/fast-perlin-noise\/\" target=\"_blank\">optimizing Perlin noise evaluation by using 3D texture hardware<\/a>. As opposed to doing multiple texture lookups that get lerped, this technique uses a single 3D texture lookup and uses hardware trilinear filtering to effectively get the same result as if multiple lookups had been done.<\/p>\n<p><a href=\"http:\/\/meshlab.sourceforge.net\/\" target=\"_blank\">MeshLab<\/a> is a nice, open source tool for doing various mesh simplification and cleanup tasks. It builds on the <a href=\"http:\/\/vcg.sourceforge.net\" target=\"_blank\">VCG Library<\/a> and is available for Windows, Linux, Mac, and even phones.<\/p>\n<p>John Chapman posted a great tutorial on <a href=\"http:\/\/www.john-chapman.net\/content.php?id=18\" target=\"_blank\">pseudo lens flares<\/a> last month that I missed.<\/p>\n<p>I was looking for some more info on Poisson disk sampling recently and I stumbled upon <a href=\"http:\/\/devmag.org.za\/2009\/05\/03\/poisson-disk-sampling\/\" target=\"_blank\">an old article from 2008 on the topic<\/a> that is really good.<\/p>\n<p><\/p>\n<h4>Unity<\/h4>\n<p>Tim Cooper posted a must-read article on <a href=\"http:\/\/blogs.unity3d.com\/2012\/10\/25\/unity-serialization\/\" target=\"_blank\">serialization in Unity<\/a>. I really wish this was part of the docs because I had to find out all of this the hard way, and some of it is not immediately obvious.<\/p>\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>JavaScript &#038; Web Development Understanding JavaScript OOP is a great article on, well, understanding how OOP works in JavaScript. It's interesting because it's very different from how OOP is implemented in languages like C++, C#, or Java. JavaScript implements prototypical &hellip; <a href=\"http:\/\/martinecker.com\/martincodes\/cool-link-stash-october-2012\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_mi_skip_tracking":false,"footnotes":""},"categories":[9],"tags":[13],"class_list":["post-115","post","type-post","status-publish","format-standard","hentry","category-cool-link-stash","tag-links"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v19.12 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Cool Link Stash, October 2012 - Martin Codes<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/martinecker.com\/martincodes\/cool-link-stash-october-2012\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Cool Link Stash, October 2012 - Martin Codes\" \/>\n<meta property=\"og:description\" content=\"JavaScript &amp; Web Development Understanding JavaScript OOP is a great article on, well, understanding how OOP works in JavaScript. It&#039;s interesting because it&#039;s very different from how OOP is implemented in languages like C++, C#, or Java. JavaScript implements prototypical &hellip; Continue reading &rarr;\" \/>\n<meta property=\"og:url\" content=\"http:\/\/martinecker.com\/martincodes\/cool-link-stash-october-2012\/\" \/>\n<meta property=\"og:site_name\" content=\"Martin Codes\" \/>\n<meta property=\"article:published_time\" content=\"2012-11-01T16:44:49+00:00\" \/>\n<meta name=\"author\" content=\"Martin Ecker\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Martin Ecker\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"http:\/\/martinecker.com\/martincodes\/cool-link-stash-october-2012\/\",\"url\":\"http:\/\/martinecker.com\/martincodes\/cool-link-stash-october-2012\/\",\"name\":\"Cool Link Stash, October 2012 - Martin Codes\",\"isPartOf\":{\"@id\":\"http:\/\/martinecker.com\/martincodes\/#website\"},\"datePublished\":\"2012-11-01T16:44:49+00:00\",\"dateModified\":\"2012-11-01T16:44:49+00:00\",\"author\":{\"@id\":\"http:\/\/martinecker.com\/martincodes\/#\/schema\/person\/2ad254c988c5aaef13e54a1cadde5816\"},\"breadcrumb\":{\"@id\":\"http:\/\/martinecker.com\/martincodes\/cool-link-stash-october-2012\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/martinecker.com\/martincodes\/cool-link-stash-october-2012\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/martinecker.com\/martincodes\/cool-link-stash-october-2012\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"http:\/\/martinecker.com\/martincodes\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Cool Link Stash, October 2012\"}]},{\"@type\":\"WebSite\",\"@id\":\"http:\/\/martinecker.com\/martincodes\/#website\",\"url\":\"http:\/\/martinecker.com\/martincodes\/\",\"name\":\"Martin Codes\",\"description\":\"Ramblings from a video game\/graphics programmer on anything coding- or graphics-related\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\/\/martinecker.com\/martincodes\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"http:\/\/martinecker.com\/martincodes\/#\/schema\/person\/2ad254c988c5aaef13e54a1cadde5816\",\"name\":\"Martin Ecker\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"http:\/\/martinecker.com\/martincodes\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/7dfd53e699c35d22210a3c63e4b3e2cfae66f49029b0cde5f3c9d86847471d7a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/7dfd53e699c35d22210a3c63e4b3e2cfae66f49029b0cde5f3c9d86847471d7a?s=96&d=mm&r=g\",\"caption\":\"Martin Ecker\"},\"url\":\"http:\/\/martinecker.com\/martincodes\/author\/admin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Cool Link Stash, October 2012 - Martin Codes","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/martinecker.com\/martincodes\/cool-link-stash-october-2012\/","og_locale":"en_US","og_type":"article","og_title":"Cool Link Stash, October 2012 - Martin Codes","og_description":"JavaScript & Web Development Understanding JavaScript OOP is a great article on, well, understanding how OOP works in JavaScript. It's interesting because it's very different from how OOP is implemented in languages like C++, C#, or Java. JavaScript implements prototypical &hellip; Continue reading &rarr;","og_url":"http:\/\/martinecker.com\/martincodes\/cool-link-stash-october-2012\/","og_site_name":"Martin Codes","article_published_time":"2012-11-01T16:44:49+00:00","author":"Martin Ecker","twitter_misc":{"Written by":"Martin Ecker","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"http:\/\/martinecker.com\/martincodes\/cool-link-stash-october-2012\/","url":"http:\/\/martinecker.com\/martincodes\/cool-link-stash-october-2012\/","name":"Cool Link Stash, October 2012 - Martin Codes","isPartOf":{"@id":"http:\/\/martinecker.com\/martincodes\/#website"},"datePublished":"2012-11-01T16:44:49+00:00","dateModified":"2012-11-01T16:44:49+00:00","author":{"@id":"http:\/\/martinecker.com\/martincodes\/#\/schema\/person\/2ad254c988c5aaef13e54a1cadde5816"},"breadcrumb":{"@id":"http:\/\/martinecker.com\/martincodes\/cool-link-stash-october-2012\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["http:\/\/martinecker.com\/martincodes\/cool-link-stash-october-2012\/"]}]},{"@type":"BreadcrumbList","@id":"http:\/\/martinecker.com\/martincodes\/cool-link-stash-october-2012\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"http:\/\/martinecker.com\/martincodes\/"},{"@type":"ListItem","position":2,"name":"Cool Link Stash, October 2012"}]},{"@type":"WebSite","@id":"http:\/\/martinecker.com\/martincodes\/#website","url":"http:\/\/martinecker.com\/martincodes\/","name":"Martin Codes","description":"Ramblings from a video game\/graphics programmer on anything coding- or graphics-related","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/martinecker.com\/martincodes\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Person","@id":"http:\/\/martinecker.com\/martincodes\/#\/schema\/person\/2ad254c988c5aaef13e54a1cadde5816","name":"Martin Ecker","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"http:\/\/martinecker.com\/martincodes\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/7dfd53e699c35d22210a3c63e4b3e2cfae66f49029b0cde5f3c9d86847471d7a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/7dfd53e699c35d22210a3c63e4b3e2cfae66f49029b0cde5f3c9d86847471d7a?s=96&d=mm&r=g","caption":"Martin Ecker"},"url":"http:\/\/martinecker.com\/martincodes\/author\/admin\/"}]}},"_links":{"self":[{"href":"http:\/\/martinecker.com\/martincodes\/wp-json\/wp\/v2\/posts\/115","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/martinecker.com\/martincodes\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/martinecker.com\/martincodes\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/martinecker.com\/martincodes\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/martinecker.com\/martincodes\/wp-json\/wp\/v2\/comments?post=115"}],"version-history":[{"count":43,"href":"http:\/\/martinecker.com\/martincodes\/wp-json\/wp\/v2\/posts\/115\/revisions"}],"predecessor-version":[{"id":158,"href":"http:\/\/martinecker.com\/martincodes\/wp-json\/wp\/v2\/posts\/115\/revisions\/158"}],"wp:attachment":[{"href":"http:\/\/martinecker.com\/martincodes\/wp-json\/wp\/v2\/media?parent=115"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/martinecker.com\/martincodes\/wp-json\/wp\/v2\/categories?post=115"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/martinecker.com\/martincodes\/wp-json\/wp\/v2\/tags?post=115"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}