<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Josh Reuben</title>
        <link>http://geekswithblogs.net/JoshReuben/Default.aspx</link>
        <description> </description>
        <language>en-US</language>
        <copyright>JoshReuben</copyright>
        <managingEditor>jreuben1@hotmail.com</managingEditor>
        <generator>Subtext Version 0.0.0.0</generator>
        <image>
            <title>Josh Reuben</title>
            <url>http://geekswithblogs.net/images/RSS2Image.gif</url>
            <link>http://geekswithblogs.net/JoshReuben/Default.aspx</link>
            <width>77</width>
            <height>60</height>
        </image>
        <item>
            <title>C++ Unit Testing with GoogleTest</title>
            <link>http://geekswithblogs.net/JoshReuben/archive/2013/01/28/c-unit-testing-with-googletest.aspx</link>
            <description>&lt;p&gt;Originally posted on: &lt;a href='http://geekswithblogs.net/JoshReuben/archive/2013/01/28/c-unit-testing-with-googletest.aspx'&gt;http://geekswithblogs.net/JoshReuben/archive/2013/01/28/c-unit-testing-with-googletest.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Unit testing is critical for quality code – they help you:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;find problems early&lt;/li&gt;    &lt;li&gt;facilitate change by avoiding breakage of other functionality&lt;/li&gt;    &lt;li&gt;simplify integration via a bottom up approach&lt;/li&gt;    &lt;li&gt;document the code&lt;/li&gt;    &lt;li&gt;maintain good design – testable code is good code: single intent, clear retval etc&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Google has created a unit testing framework for C++ :&lt;/p&gt;  &lt;p&gt;&lt;a title="http://code.google.com/p/googletest/" href="http://code.google.com/p/googletest/"&gt;http://code.google.com/p/googletest/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;I downloaded Google Test from &lt;a href="http://code.google.com/p/googletest/downloads/list"&gt;http://code.google.com/p/googletest/downloads/list&lt;/a&gt; and built the solution under the &lt;b&gt;msvc&lt;/b&gt; folder (Im using &lt;strong&gt;Visual C++&lt;/strong&gt; today). I see that there is a lib file created here called &lt;b&gt;gtest-1.6.0\msvc\gtest\Debug\gtestd.lib&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;I then created a new VC++ Win32 Console App and set the following project properties:&lt;/p&gt;  &lt;p&gt;&lt;b&gt;VC++ Directories &amp;gt; Include Directories – &lt;/b&gt;added path to&lt;b&gt; ..\ gtest-1.6.0\include&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;VC++ Directories &amp;gt; Library Directories – &lt;/b&gt;added path to&lt;b&gt; ..\ gtest-1.6.0\msvc\gtest\Debug&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Linker &amp;gt; Input &amp;gt; Additional Dependencies&lt;/b&gt;  - added &lt;b&gt;gtestd.lib&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;All swell ?&lt;/p&gt;  &lt;p&gt;I thought so, until I compiled &amp;amp; got the dreaded LNK2005: &lt;a title="http://msdn.microsoft.com/en-us/library/72zdcz6f(v=vs.80).aspx" href="http://msdn.microsoft.com/en-us/library/72zdcz6f(v=vs.80).aspx"&gt;http://msdn.microsoft.com/en-us/library/72zdcz6f(v=vs.80).aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;WTF – linker errors ?&lt;/p&gt;  &lt;p&gt;To quote Cousin Eddie from National Lampoon’s Vacation:    &lt;/p&gt;&lt;div id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:184aee8b-4051-4f88-852e-c35110843ac9" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"&gt;&lt;div id="e3310cc3-495f-4ace-97b0-eb9ba798651c" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=BmUx0L6k_0U" target="_new"&gt;&lt;img src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/C-Unit-Testing-with-GoogleTest_A85A/video7ac2da250359.jpg" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('e3310cc3-495f-4ace-97b0-eb9ba798651c'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;448\&amp;quot; height=\&amp;quot;252\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/BmUx0L6k_0U?hl=en&amp;amp;hd=1\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/BmUx0L6k_0U?hl=en&amp;amp;hd=1\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;448\&amp;quot; height=\&amp;quot;252\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;p&gt;'Everytime Catherine would turn in the microwave I'd piss my pants and forget my name' - C++ often makes me feel like an idiot !&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Thank God for Pavel &lt;a title="http://blogs.microsoft.co.il/blogs/pavely/" href="http://blogs.microsoft.co.il/blogs/pavely/"&gt;http://blogs.microsoft.co.il/blogs/pavely/&lt;/a&gt; , who pointed out to me that I need to change the C runtime library from &lt;strong&gt;DLL multithreaded debug&lt;/strong&gt; to &lt;strong&gt;multithreaded debug&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/C-Unit-Testing-with-GoogleTest_A85A/clip_image0025.gif" rel="lightbox"&gt;&lt;img title="clip_image002[5]" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image002[5]" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/C-Unit-Testing-with-GoogleTest_A85A/clip_image0025_thumb.gif" width="657" height="468" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;I could now build.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;I added an include to access the Google Test macros:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;#include "gtest/gtest.h"&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;I then created a canonical testable function:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;int Factorial(int x, int result = 1) {&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;if (x == 1) return result; &lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;else return Factorial(x - 1, x * result);&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;I used the &lt;strong&gt;TEST&lt;/strong&gt; macro to construct a named test – it leveraged the &lt;strong&gt;EXPECT_EQ&lt;/strong&gt; &amp;amp; &lt;strong&gt;EXPECT_GT&lt;/strong&gt; macros to test for equality and greater than respectably.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;TEST(FactorialTest, Negative) {&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;        EXPECT_EQ(1, Factorial(-1));&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;        EXPECT_GT(Factorial(-10), 0);&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;in my main function, I initialized google test &amp;amp; used &lt;strong&gt;RUN_ALL_TESTS&lt;/strong&gt; macro to … run all tests.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;int _tmain(int argc, _TCHAR* argv[])&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;        testing::InitGoogleTest(&amp;amp;argc,argv);&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;        RUN_ALL_TESTS();&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;        int x;   &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;        std::cin &amp;gt;&amp;gt; x;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;        return 0;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;I debugged my code - It breaks into the test:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/C-Unit-Testing-with-GoogleTest_A85A/clip_image002_2.jpg" rel="lightbox"&gt;&lt;img title="clip_image002" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image002" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/C-Unit-Testing-with-GoogleTest_A85A/clip_image002_thumb.jpg" width="652" height="336" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;And I get the following test results displayed:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/C-Unit-Testing-with-GoogleTest_A85A/clip_image004_2.jpg" rel="lightbox"&gt;&lt;img title="clip_image004" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image004" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/C-Unit-Testing-with-GoogleTest_A85A/clip_image004_thumb.jpg" width="654" height="264" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;So I am up &amp;amp; running with C++ Google Test !&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Further things to try:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Visual Studio Addin: &lt;a title="http://googletestaddin.codeplex.com/" href="http://googletestaddin.codeplex.com/"&gt;http://googletestaddin.codeplex.com/&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;TypeMock Isolator mocking framework: &lt;a title="http://www.typemock.com/isolatorpp-product-page" href="http://www.typemock.com/isolatorpp-product-page"&gt;http://www.typemock.com/isolatorpp-product-page&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;All fun &amp;amp; games !&lt;/p&gt; &lt;img src="http://geekswithblogs.net/JoshReuben/aggbug/151953.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>JoshReuben</dc:creator>
            <guid>http://geekswithblogs.net/JoshReuben/archive/2013/01/28/c-unit-testing-with-googletest.aspx</guid>
            <pubDate>Mon, 28 Jan 2013 10:24:12 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/JoshReuben/comments/151953.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/JoshReuben/archive/2013/01/28/c-unit-testing-with-googletest.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/JoshReuben/comments/commentRss/151953.aspx</wfw:commentRss>
        </item>
        <item>
            <title>3D Programming Concepts</title>
            <link>http://geekswithblogs.net/JoshReuben/archive/2013/01/12/3d-programming-concepts.aspx</link>
            <description>&lt;p&gt;Originally posted on: &lt;a href='http://geekswithblogs.net/JoshReuben/archive/2013/01/12/3d-programming-concepts.aspx'&gt;http://geekswithblogs.net/JoshReuben/archive/2013/01/12/3d-programming-concepts.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;2 years ago I built &amp;amp; presented a course on XNA 4: &lt;a title="http://www.e4d.co.il/Events/ExpertDays2011/Courses/Details/29" href="http://www.e4d.co.il/Events/ExpertDays2011/Courses/Details/29"&gt;http://www.e4d.co.il/Events/ExpertDays2011/Courses/Details/29&lt;/a&gt;&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;XNA may be dead &amp;amp; buried, but the 3D programming concepts are tech-stack-agnostic – They apply equally well to DirectX. I’ve extracted this subsection into a set of slides:&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;&lt;iframe style="border-top: medium none; border-right: medium none; border-bottom: medium none; border-left: medium none" height="470" marginheight="0" src="http://www.slideshare.net/joshuareuben9/slideshelf" frameborder="0" width="615" marginwidth="0" scrolling="no" mozallowfullscreen="mozallowfullscreen" webkitallowfullscreen="webkitallowfullscreen" allowfullscreen="allowfullscreen"&gt;&lt;/iframe&gt;&lt;/p&gt;  &lt;p&gt;enjoy !&lt;/p&gt; &lt;img src="http://geekswithblogs.net/JoshReuben/aggbug/151798.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>JoshReuben</dc:creator>
            <guid>http://geekswithblogs.net/JoshReuben/archive/2013/01/12/3d-programming-concepts.aspx</guid>
            <pubDate>Sat, 12 Jan 2013 02:44:34 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/JoshReuben/comments/151798.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/JoshReuben/archive/2013/01/12/3d-programming-concepts.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/JoshReuben/comments/commentRss/151798.aspx</wfw:commentRss>
        </item>
        <item>
            <title>I didnt know how to do that in C++ !</title>
            <category>C++</category>
            <link>http://geekswithblogs.net/JoshReuben/archive/2013/01/10/i-didnt-know-how-to-do-that-in-c.aspx</link>
            <description>&lt;p&gt;Originally posted on: &lt;a href='http://geekswithblogs.net/JoshReuben/archive/2013/01/10/i-didnt-know-how-to-do-that-in-c.aspx'&gt;http://geekswithblogs.net/JoshReuben/archive/2013/01/10/i-didnt-know-how-to-do-that-in-c.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I've been reading through the C++ Cookbook (an oldie but a goodie – I assume that 99% of C++ out there is not modern C++, and modern C++ does not mean you don’t need to be able to grok templates, pointers etc – you may need to port something, or use a 3&lt;sup&gt;rd&lt;/sup&gt; party lib)&lt;/p&gt;  &lt;p&gt;Anyway, reading through stream manipulators, from my understanding this is how you pass a generic 'delegate' into a constructor &amp;amp; invoke it:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;template&amp;lt;typename T, typename C&amp;gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;class ManipInfra {&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;public:&lt;/strong&gt;&lt;strong&gt;    &lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;ManipInfra (basic_ostream&amp;lt;C&amp;gt;&amp;amp; &lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;&lt;font style="background-color: #ffff00"&gt;(*pFun) (&lt;/font&gt;basic_ostream&amp;lt;C&amp;gt;&amp;amp;, T), T val&lt;/strong&gt;&lt;font style="background-color: #ffff00"&gt;&lt;strong&gt;)&lt;/strong&gt; // pass in&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;: &lt;font style="background-color: #ffff00"&gt;manipFun_(pFun)&lt;/font&gt;&lt;/strong&gt; // init list – init func pointer var&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;, val_(val) {}&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;void operator( )(basic_ostream&amp;lt;C&amp;gt;&amp;amp; os) const&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;    manipFun_(os, val_);&lt;/strong&gt; &lt;font style="background-color: #ffff00"&gt;// Invoke the generic function pointer with the stream and value&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;}&lt;/strong&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;private:&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;T val_;&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;basic_ostream&amp;lt;C&amp;gt;&amp;amp; &lt;font style="background-color: #ffff00"&gt;(*manipFun_) &lt;/font&gt;(basic_ostream&amp;lt;C&amp;gt;&amp;amp;, T);&lt;/strong&gt; &lt;font style="background-color: #ffff00"&gt;// a function pointer – a delegate !&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;};&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Note: C++ 11 has&lt;strong&gt; function&amp;lt;T&amp;gt;&lt;/strong&gt; which provides the same functionality – courtesy of my esteemed colleague Tomer Shamam &lt;a title="http://blogs.microsoft.co.il/blogs/tomershamam/" href="http://blogs.microsoft.co.il/blogs/tomershamam/"&gt;http://blogs.microsoft.co.il/blogs/tomershamam/&lt;/a&gt; :&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;class YourClass&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;public:&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;YourClass(std:&lt;font style="background-color: #ffff00"&gt;function&lt;/font&gt;&amp;lt;return_type (param_type param)&amp;gt; func)        &lt;br /&gt;{              &lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;    ...&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;    &lt;font style="background-color: #ffff00"&gt;func(param)&lt;/font&gt;;        &lt;br /&gt;}&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;};&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;YourClass y([](param_type param){ ...});&lt;/strong&gt;&lt;/p&gt; &lt;img src="http://geekswithblogs.net/JoshReuben/aggbug/151776.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>JoshReuben</dc:creator>
            <guid>http://geekswithblogs.net/JoshReuben/archive/2013/01/10/i-didnt-know-how-to-do-that-in-c.aspx</guid>
            <pubDate>Thu, 10 Jan 2013 04:31:44 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/JoshReuben/comments/151776.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/JoshReuben/archive/2013/01/10/i-didnt-know-how-to-do-that-in-c.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/JoshReuben/comments/commentRss/151776.aspx</wfw:commentRss>
        </item>
        <item>
            <title>2012: Study Plan Year in Review</title>
            <link>http://geekswithblogs.net/JoshReuben/archive/2012/12/30/2012-study-plan-year-in-review.aspx</link>
            <description>&lt;p&gt;Originally posted on: &lt;a href='http://geekswithblogs.net/JoshReuben/archive/2012/12/30/2012-study-plan-year-in-review.aspx'&gt;http://geekswithblogs.net/JoshReuben/archive/2012/12/30/2012-study-plan-year-in-review.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;  &lt;p&gt;Over the past year I went into study overdrive: I learned A LOT about &lt;b&gt;C++, Maths, Algorithms, Finance &lt;/b&gt;&amp;amp;&lt;b&gt; JavaScript.&lt;/b&gt; It was a great year in terms of knowledge acquisition.&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;pro amore scientiam !&lt;/i&gt;&lt;/p&gt;  &lt;h2&gt;C++&lt;/h2&gt;  &lt;p&gt;C / C++ is the language for performant algo dev. It also has a higher barrier of entry than C#. While C# is elegant, it is targeted towards LOB apps and it is very easy to pick up à a proliferation of decent NET code monkeys is a career race to the bottom. It is a wise time to move back to C++. Note: I am about to revise this all again !&lt;/p&gt;  &lt;p&gt;· C# to C++ guide – a good refresher&lt;/p&gt;  &lt;p&gt;· Revise Kinnect API&lt;/p&gt;  &lt;p&gt;· WMF from Pavels course - I worked with this API for 2 months this year – non-trivial !&lt;/p&gt;  &lt;p&gt;· ConcRT &amp;amp; PPL – I went through everything on msdn + Alon's course materials. Unlike TPL you can control priority. The agent paradigm is quite similar to Axum, TPL DataFlow.&lt;/p&gt;  &lt;p&gt;· AMP – see my post here: &lt;a href="http://geekswithblogs.net/JoshReuben/archive/2011/12/04/c-amp.aspx"&gt;http://geekswithblogs.net/JoshReuben/archive/2011/12/04/c-amp.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· Book: C++ AMP &lt;a href="http://amzn.to/WWxC2J"&gt;http://amzn.to/WWxC2J&lt;/a&gt; – a great book with much practical advice.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image001_2.png" rel="lightbox"&gt;&lt;img title="clip_image001" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image001" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image001_thumb.png" width="210" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· Win32, strings, pragmas, intrinsics, lbs vs dlls, project settings, etc etc etc&lt;/p&gt;  &lt;p&gt;· COM, ATL – be prepared for a lot of dead code out there !&lt;/p&gt;  &lt;p&gt;· STL / TR1 – I wrote a set of exercises for a course on this&lt;/p&gt;  &lt;p&gt;· Book: Windows via C/C++ &lt;a href="http://amzn.to/WWxO1S"&gt;http://amzn.to/WWxO1S&lt;/a&gt; - essentially thread management – I never realized how insecure Windows was until I read this !&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image002_2.png" rel="lightbox"&gt;&lt;img title="clip_image002" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image002" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image002_thumb.png" width="205" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· WRL &amp;amp; C++/CX - just in case pigs fly !&lt;/p&gt;  &lt;p&gt;· C++ 11 – some amazing changes to the standard.&lt;/p&gt;  &lt;h2&gt;3D&lt;/h2&gt;  &lt;p&gt;3D is an interesting &amp;amp; non-trivial problem domain. I hope to do further work in this area.&lt;/p&gt;  &lt;p&gt;· SIGGRAPH – &lt;a href="http://www.siggraph.org/asia2011/hong-kong"&gt;http://www.siggraph.org/asia2011/hong-kong&lt;/a&gt; I attended this conference 1 year ago – an eye opening trip into the future! I participated in intense courses on OpenGL &amp;amp; OpenCL.&lt;/p&gt;  &lt;p&gt;· &lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image003_2.png" rel="lightbox"&gt;&lt;img title="clip_image003" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image003" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image003_thumb.png" width="244" height="71" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· Book: Mathematics for Computer Graphics &lt;a href="http://amzn.to/WWxwZ2"&gt;http://amzn.to/WWxwZ2&lt;/a&gt; - I used this to build an XNA course (before it died)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image004_2.png" rel="lightbox"&gt;&lt;img title="clip_image004" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image004" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image004_thumb.png" width="176" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· Book: DirectX &lt;a href="http://amzn.to/WWxj81"&gt;http://amzn.to/WWxj81&lt;/a&gt; - see my summary here: &lt;a href="http://geekswithblogs.net/JoshReuben/archive/2012/03/14/d3d-11-programming-in-a-nutshell.aspx"&gt;http://geekswithblogs.net/JoshReuben/archive/2012/03/14/d3d-11-programming-in-a-nutshell.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image005_2.png" rel="lightbox"&gt;&lt;img title="clip_image005" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image005" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image005_thumb.png" width="203" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· Direct3D tooling – I'll blog on this sooner or later&lt;/p&gt;  &lt;p&gt;· RasterTek DirectX tutorials – &lt;a title="http://www.rastertek.com/tutindex.html" href="http://www.rastertek.com/tutindex.html"&gt;http://www.rastertek.com/tutindex.html&lt;/a&gt; - the only way to learn DX !&lt;/p&gt;  &lt;p&gt;· Book: Unity3D &lt;a href="http://amzn.to/WWxbph"&gt;http://amzn.to/WWxbph&lt;/a&gt; - I built the island, shot coconuts at the hut door, and started a particle fire !&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image006_2.png" rel="lightbox"&gt;&lt;img title="clip_image006" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image006" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image006_thumb.png" width="204" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;Trading Systems Infrastructure&lt;/h2&gt;  &lt;p&gt;· I did a fair few consults for trading firms – they have unique high performant scalable infrastructure requirements – leave your NET hat at the door ! see my blog post here: &lt;a href="http://geekswithblogs.net/JoshReuben/archive/2012/03/26/low-latency-high-performant-financial-app-infrastructures.aspx"&gt;http://geekswithblogs.net/JoshReuben/archive/2012/03/26/low-latency-high-performant-financial-app-infrastructures.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· Onyx FIX - &lt;a href="http://www.onixs.biz/"&gt;http://www.onixs.biz/&lt;/a&gt; – a low latency API for messaging with the FIX (financial information exchange) protocol. Critical for trading systems. &lt;/p&gt;  &lt;p&gt;· LMAX – I blogged about this trading API here: &lt;a href="http://geekswithblogs.net/JoshReuben/archive/2011/07/08/lmax-.net-api-walkthrough.aspx"&gt;http://geekswithblogs.net/JoshReuben/archive/2011/07/08/lmax-.net-api-walkthrough.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· Book: Big Data Glossary &lt;a href="http://amzn.to/UpRaJs"&gt;http://amzn.to/UpRaJs&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image007_2.png" rel="lightbox"&gt;&lt;img title="clip_image007" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image007" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image007_thumb.png" width="193" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· NOSQL – did an investigative comparison&lt;/p&gt;  &lt;p&gt;· LMAX Disruptor – amazing ring buffer architectural paradigm: &lt;a href="http://lmax-exchange.github.com/disruptor/"&gt;http://lmax-exchange.github.com/disruptor/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· Redis - &lt;a href="http://redis.io/"&gt;http://redis.io/&lt;/a&gt; - an incredibly fast distributed in memory cache&lt;/p&gt;  &lt;h2&gt;Maths, Computation &amp;amp; Cognition&lt;/h2&gt;  &lt;p&gt;Going through life, I feel it is a core personal goal to understand as much as possible about the nature of reality.&lt;/p&gt;  &lt;p&gt;· Book: Physics &lt;a href="http://amzn.to/WWA610"&gt;http://amzn.to/WWA610&lt;/a&gt; - a great coffee table book detailing the greatest 500 discoveries in physics&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image008_2.png" rel="lightbox"&gt;&lt;img title="clip_image008" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image008" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image008_thumb.png" width="220" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· Schuams Computer Architecture &lt;a href="http://amzn.to/UpNXte"&gt;http://amzn.to/UpNXte&lt;/a&gt; - an in depth drill down into registers, microcode &amp;amp; memory hierarchies. Very worthwhile read. Hadn't looked at this since my first degree 20 years ago !&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image009_2.png" rel="lightbox"&gt;&lt;img title="clip_image009" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image009" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image009_thumb.png" width="187" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· Book: Schaums Vector Analysis &lt;a href="http://amzn.to/UpO9IV"&gt;http://amzn.to/UpO9IV&lt;/a&gt; - nice refresher on linear algebra + some interesting stuff on Stokes Theorem &amp;amp; intro to Tensors&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image010_2.png" rel="lightbox"&gt;&lt;img title="clip_image010" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image010" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image010_thumb.png" width="190" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· Book: Schaums Mathematica &lt;a href="http://amzn.to/UpPAHm"&gt;http://amzn.to/UpPAHm&lt;/a&gt; - while this has very little penetration in the Israeli market, it is an amazingly powerful symbolic mathematical programming language environment. I will delve deeper. See my blogpost here: &lt;a href="http://geekswithblogs.net/JoshReuben/archive/2012/07/04/mathematica-programming-languagendashan-introduction.aspx"&gt;http://geekswithblogs.net/JoshReuben/archive/2012/07/04/mathematica-programming-languagendashan-introduction.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image011_2.png" rel="lightbox"&gt;&lt;img title="clip_image011" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image011" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image011_thumb.png" width="183" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· Book: Excel Scientific Computing &lt;a href="http://amzn.to/UpPGyG"&gt;http://amzn.to/UpPGyG&lt;/a&gt; - everything you need to know about programming excel&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image012_2.png" rel="lightbox"&gt;&lt;img title="clip_image012" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image012" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image012_thumb.png" width="191" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· Book: Language instinct - &lt;a href="http://amzn.to/UpPPCm"&gt;http://amzn.to/UpPPCm&lt;/a&gt; - amazing coverage on how language works – will serve me well if I ever head into NLP&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image013_2.png" rel="lightbox"&gt;&lt;img title="clip_image013" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image013" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image013_thumb.png" width="173" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· Numerical analysis videos - &lt;a href="http://numericalmethods.eng.usf.edu/videos/"&gt;http://numericalmethods.eng.usf.edu/videos/&lt;/a&gt; - an awesome resource. &lt;/p&gt;  &lt;p&gt;· Book: Short Intro to Reality - &lt;a href="http://amzn.to/UpQ5Bf"&gt;http://amzn.to/UpQ5Bf&lt;/a&gt; - philosophical questions regarding the simulated universe hypothesis – stop thinking like an ant, &amp;amp; read this.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image014_2.png" rel="lightbox"&gt;&lt;img title="clip_image014" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image014" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image014_thumb.png" width="167" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· Book: Short Intro to Sociology - &lt;a href="http://amzn.to/UpQbsO"&gt;http://amzn.to/UpQbsO&lt;/a&gt; - a bit wishy washy, but a good analysis of how &amp;amp; why aspects of cultures are socially constructed&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image015_2.png" rel="lightbox"&gt;&lt;img title="clip_image015" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image015" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image015_thumb.png" width="165" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· Book: short intro to Game Theory &lt;a href="http://amzn.to/UpQQub"&gt;http://amzn.to/UpQQub&lt;/a&gt; - will serve me well if I ever head into constructing a probabilistic reasoning system for decision support.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image016_2.png" rel="lightbox"&gt;&lt;img title="clip_image016" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image016" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image016_thumb.png" width="170" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· Book: Short intro to Nothing &lt;a href="http://amzn.to/UpQP9s"&gt;http://amzn.to/UpQP9s&lt;/a&gt; - Is the Higgs Field the new ether ? &lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image017_2.png" rel="lightbox"&gt;&lt;img title="clip_image017" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image017" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image017_thumb.png" width="167" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· Book: History of Modern Computing &lt;a href="http://amzn.to/UpQV0V"&gt;http://amzn.to/UpQV0V&lt;/a&gt; - gives you perspective into how fast paradigms can shift&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image018_2.png" rel="lightbox"&gt;&lt;img title="clip_image018" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image018" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image018_thumb.png" width="182" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· Book: The Quest for AI &lt;a href="http://amzn.to/UpRIPi"&gt;http://amzn.to/UpRIPi&lt;/a&gt; - a good refresher after reading Norvig &amp;amp; Russell&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image019_2.png" rel="lightbox"&gt;&lt;img title="clip_image019" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image019" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image019_thumb.png" width="176" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· Book: C# numerical computing &lt;a href="http://amzn.to/UpT9xm"&gt;http://amzn.to/UpT9xm&lt;/a&gt; - a nice overview via a toy language&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image020_2.png" rel="lightbox"&gt;&lt;img title="clip_image020" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image020" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image020_thumb.png" width="200" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· Book: millennium problems &lt;a href="http://amzn.to/UpTccv"&gt;http://amzn.to/UpTccv&lt;/a&gt; - it is quite amazing to grasp the current limits of our understanding&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image021_2.png" rel="lightbox"&gt;&lt;img title="clip_image021" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image021" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image021_thumb.png" width="173" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· Extreme Optimization Library – the strongest C# maths library - &lt;a href="http://www.extremeoptimization.com/"&gt;http://www.extremeoptimization.com/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· Book: C# ANNs + Encog &lt;a href="http://amzn.to/UpTikt"&gt;http://amzn.to/UpTikt&lt;/a&gt; - see my blogpost here: &lt;a href="http://geekswithblogs.net/JoshReuben/archive/2011/02/04/c-neural-networks-with-encog.aspx"&gt;http://geekswithblogs.net/JoshReuben/archive/2011/02/04/c-neural-networks-with-encog.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image022_2.png" rel="lightbox"&gt;&lt;img title="clip_image022" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image022" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image022_thumb.png" width="213" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;Finance &amp;amp; Economics&lt;/h2&gt;  &lt;p&gt;The world is rapidly changing – we don’t live in a bubble – its worthwhile to understand the patterns in the undercurrents.&lt;/p&gt;  &lt;p&gt;· Book: How the west was lost &lt;a href="http://amzn.to/UpTro1"&gt;http://amzn.to/UpTro1&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image023_2.png" rel="lightbox"&gt;&lt;img title="clip_image023" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image023" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image023_thumb.png" width="176" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· Book: Cartoon Guide to Macroeconomics &lt;a href="http://amzn.to/UpTDUj"&gt;http://amzn.to/UpTDUj&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image024_2.png" rel="lightbox"&gt;&lt;img title="clip_image024" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image024" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image024_thumb.png" width="186" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· Book: After America &lt;a href="http://amzn.to/UpTxMd"&gt;http://amzn.to/UpTxMd&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image025_2.png" rel="lightbox"&gt;&lt;img title="clip_image025" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image025" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image025_thumb.png" width="176" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· Book: Crash Course &lt;a href="http://amzn.to/UpTQql"&gt;http://amzn.to/UpTQql&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image026_2.png" rel="lightbox"&gt;&lt;img title="clip_image026" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image026" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image026_thumb.png" width="179" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· Peak Oil &lt;a href="http://amzn.to/UpU3K6"&gt;http://amzn.to/UpU3K6&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image027_2.png" rel="lightbox"&gt;&lt;img title="clip_image027" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image027" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image027_thumb.png" width="179" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;JavaScript&lt;/h2&gt;  &lt;p&gt;I've got a fair few years experience as a web dev – its important to keep abreast of the current Cambrian explosion of JavaScript platforms. JavasScript is pervasive.&lt;/p&gt;  &lt;p&gt;· WebGL- a GPU accelerated javascript library for 3D that loads shaders via the canvas 3D context – see my blogpost here: &lt;a href="http://geekswithblogs.net/JoshReuben/archive/2012/07/26/an-introduction-to-webgl.aspx"&gt;http://geekswithblogs.net/JoshReuben/archive/2012/07/26/an-introduction-to-webgl.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· Book: Javascript pocket guide &lt;a href="http://amzn.to/UpUp3v"&gt;http://amzn.to/UpUp3v&lt;/a&gt; - a good refresher&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image028_2.png" rel="lightbox"&gt;&lt;img title="clip_image028" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image028" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image028_thumb.png" width="164" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· JS WebWorkers – true parallelization on the client&lt;/p&gt;  &lt;p&gt;· Book: HTML 5 &amp;amp; CSS 3 &lt;a href="http://amzn.to/UpUO67"&gt;http://amzn.to/UpUO67&lt;/a&gt; - good overview of whats new&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image029_2.png" rel="lightbox"&gt;&lt;img title="clip_image029" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image029" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image029_thumb.png" width="224" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· KnockoutJS – a descent MVVM framework with binding support&lt;/p&gt;  &lt;p&gt;· EmberJS – the strongest client side platform – feature rich&lt;/p&gt;  &lt;p&gt;· Book: Javascript Design Patterns – good to revise 2 things in one ! &lt;a href="http://addyosmani.com/resources/essentialjsdesignpatterns/book/"&gt;http://addyosmani.com/resources/essentialjsdesignpatterns/book/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· Javascript for C# devs &lt;a href="http://blog.boyet.com/blog/javascriptlessons/"&gt;http://blog.boyet.com/blog/javascriptlessons/&lt;/a&gt; - a great blog series&lt;/p&gt;  &lt;p&gt;· Book: JQuery Pocket Guide &lt;a href="http://amzn.to/UpUVP8"&gt;http://amzn.to/UpUVP8&lt;/a&gt; - another good refresher&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image030_2.png" rel="lightbox"&gt;&lt;img title="clip_image030" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image030" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image030_thumb.png" width="163" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· QUnit – client side unit testing&lt;/p&gt;  &lt;p&gt;· JQueryUI &lt;/p&gt;  &lt;p&gt;· HTML5 Boilerplate &lt;/p&gt;  &lt;p&gt;· Book: ImpactJS HTML5 game programming &lt;a href="http://amzn.to/UpV9Wc"&gt;http://amzn.to/UpV9Wc&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image031_2.png" rel="lightbox"&gt;&lt;img title="clip_image031" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image031" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image031_thumb.png" width="204" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· SocketIO , Pusher – WebSockets APIs&lt;/p&gt;  &lt;p&gt;· REST API design – consulted on this for a trading client.&lt;/p&gt;  &lt;p&gt;· FireBug – amazing debugging capabilities – a must know.&lt;/p&gt;  &lt;p&gt;· WebStorm – a great IDE for webdev without the VS bloat&lt;/p&gt;  &lt;p&gt;· JSLint / JSHint - code quality tools&lt;/p&gt;  &lt;p&gt;· NodeJS – beginners guide &lt;a href="http://amzn.to/UpViZR"&gt;http://amzn.to/UpViZR&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image032_2.png" rel="lightbox"&gt;&lt;img title="clip_image032" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image032" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/f6472f19be2f_27A/clip_image032_thumb.png" width="183" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· NodeJS baby steps &amp;amp; toddler steps - &lt;a href="http://elegantcode.com/category/node-js/"&gt;http://elegantcode.com/category/node-js/&lt;/a&gt; - a great blog series&lt;/p&gt;  &lt;p&gt;· JS RiverTrail – JavaScript GPGPU – see my blogpost here: &lt;a href="http://geekswithblogs.net/JoshReuben/archive/2012/11/29/rivertrail---javascript-gppgu-data-parallelism.aspx"&gt;http://geekswithblogs.net/JoshReuben/archive/2012/11/29/rivertrail---javascript-gppgu-data-parallelism.aspx&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;Conclusion: Groundwork laid for 2013&lt;/h2&gt;  &lt;p&gt; It was definitely a great year in terms of knowledge acquisition.&lt;/p&gt;  &lt;p&gt;It is true that I need to &lt;b&gt;consolidate&lt;/b&gt; – that’s exactly what I am doing now !&lt;/p&gt;  &lt;p&gt;Now, this may all seem freaky to your standard LOB dev tradesman drone, who micro-specializes in XAML &amp;amp; WCF.&lt;/p&gt;  &lt;p&gt;I have indeed absorbed a lot of disparate information, and I definitely need to &lt;b&gt;revise &amp;amp; get practical hands-on&lt;/b&gt;; however once something is conceptualized, it is yours to rapidly refresh on demand forever. Besides, I have made detailed summaries on various topics.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;The whole is greater than the sum of the parts&lt;/b&gt; – a worthwhile goal in life is to be a renaissance man: &lt;a href="http://en.wikipedia.org/wiki/Polymath"&gt;http://en.wikipedia.org/wiki/Polymath&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I am not just a jack-of-all-trades – I can quickly drill down &amp;amp; become an expert in many topics.&lt;/p&gt;  &lt;p&gt;Maths &amp;amp; C++ have opened up many new worlds for me – which I can now dive into in 2013.&lt;/p&gt;  &lt;p&gt;Anyone who thinks I have spread myself too thin is just under-estimating me – &lt;b&gt;don’t tell me what I cannot do !&lt;/b&gt;&lt;/p&gt; &lt;img src="http://geekswithblogs.net/JoshReuben/aggbug/151674.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>JoshReuben</dc:creator>
            <guid>http://geekswithblogs.net/JoshReuben/archive/2012/12/30/2012-study-plan-year-in-review.aspx</guid>
            <pubDate>Sat, 29 Dec 2012 22:24:24 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/JoshReuben/comments/151674.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/JoshReuben/archive/2012/12/30/2012-study-plan-year-in-review.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/JoshReuben/comments/commentRss/151674.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Big Data&amp;ndash;Where to Start</title>
            <link>http://geekswithblogs.net/JoshReuben/archive/2012/12/25/big-datandashwhere-to-start.aspx</link>
            <description>&lt;p&gt;Originally posted on: &lt;a href='http://geekswithblogs.net/JoshReuben/archive/2012/12/25/big-datandashwhere-to-start.aspx'&gt;http://geekswithblogs.net/JoshReuben/archive/2012/12/25/big-datandashwhere-to-start.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I recently read the &lt;b&gt;Big Data Glossary&lt;/b&gt; - &lt;a href="http://www.amazon.com/Big-Data-Glossary-Pete-Warden/dp/1449314597"&gt;http://www.amazon.com/Big-Data-Glossary-Pete-Warden/dp/1449314597&lt;/a&gt;&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/Big-Data_A1AC/big_data_glossary_2.jpg" rel="lightbox"&gt;&lt;img title="big_data_glossary" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="big_data_glossary" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/Big-Data_A1AC/big_data_glossary_thumb.jpg" width="187" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Big Data is essentially a MapReduce stack for scatter-gather-aggregate scaleout of compute jobs.&lt;/p&gt;  &lt;p&gt;The core tools are:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;b&gt;Apache Hadoop&lt;/b&gt; – a MapReduce scale-out infrastructure &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Hive&lt;/b&gt; – SQL language for Hadoop&lt;/li&gt;    &lt;li&gt;&lt;b&gt;Pig&lt;/b&gt; – procedural language for Hadoop&lt;/li&gt;    &lt;li&gt;&lt;b&gt;Cascading&lt;/b&gt; – orchestration of jobs on Hadoop&lt;/li&gt;    &lt;li&gt;&lt;b&gt;Datameer&lt;/b&gt; – BI on Hadoop&lt;/li&gt;    &lt;li&gt;&lt;b&gt;Mahout&lt;/b&gt; – distributed machine learning library on Hadoop&lt;/li&gt;    &lt;li&gt;&lt;b&gt;ZooKeeper&lt;/b&gt; – work coordinator / monitor&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;On top of these are various tools &amp;amp; extensions, as well as ports (e.g. &lt;b&gt;HDInsight&lt;/b&gt; )&lt;/p&gt;  &lt;p&gt;You also need to be aware of elastic cloud platforms to run on, and the various NoSQL DBs tend to be leveraged in this space as well.&lt;/p&gt;  &lt;p&gt;Additionally, MapReduce is just an infrastructure pattern for distributed processing of algorithms – you will not get much usage out of it without knowledge of the appropriate algorithms to leverage on the nodes in your compute grid – the whole point of Big Data.&lt;/p&gt; &lt;img src="http://geekswithblogs.net/JoshReuben/aggbug/151634.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>JoshReuben</dc:creator>
            <guid>http://geekswithblogs.net/JoshReuben/archive/2012/12/25/big-datandashwhere-to-start.aspx</guid>
            <pubDate>Tue, 25 Dec 2012 09:39:03 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/JoshReuben/comments/151634.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/JoshReuben/archive/2012/12/25/big-datandashwhere-to-start.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/JoshReuben/comments/commentRss/151634.aspx</wfw:commentRss>
        </item>
        <item>
            <title>A Taxonomy of Numerical Methods v1</title>
            <category>Numerical Computing</category>
            <link>http://geekswithblogs.net/JoshReuben/archive/2012/12/09/a-taxonomy-of-numerical-methods-v1.aspx</link>
            <description>&lt;p&gt;Originally posted on: &lt;a href='http://geekswithblogs.net/JoshReuben/archive/2012/12/09/a-taxonomy-of-numerical-methods-v1.aspx'&gt;http://geekswithblogs.net/JoshReuben/archive/2012/12/09/a-taxonomy-of-numerical-methods-v1.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Numerical Analysis – When, What, (but not how)&lt;/p&gt;  &lt;p&gt;Once you understand the Math &amp;amp; know C++, Numerical Methods are basically blocks of iterative &amp;amp; conditional math code. I found the real trick was seeing the forest for the trees – knowing which method to use for which situation. Its pretty easy to get lost in the details – so I’ve tried to organize these methods in a way that I can quickly look this up. &lt;/p&gt;  &lt;p&gt;I’ve included links to detailed explanations and to C++ code examples.&lt;/p&gt;  &lt;p&gt;I’ve tried to classify Numerical methods in the following broad categories:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Solving Systems of Linear Equations&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Solving Non-Linear Equations Iteratively&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Interpolation&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Curve Fitting&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Optimization&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Numerical Differentiation &amp;amp; Integration&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Solving ODEs&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Boundary Problems&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Solving EigenValue problems&lt;/strong&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Enjoy – I did !&lt;/p&gt;  &lt;h2&gt;Solving Systems of Linear Equations&lt;/h2&gt;  &lt;h4&gt;Overview&lt;/h4&gt;  &lt;p&gt;Solve sets of algebraic equations with x unknowns&lt;/p&gt;  &lt;p&gt;The set is commonly in matrix form&lt;/p&gt;  &lt;h4&gt;Gauss-Jordan Elimination&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Gauss%E2%80%93Jordan_elimination"&gt;http://en.wikipedia.org/wiki/Gauss%E2%80%93Jordan_elimination&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;C++: &lt;a href="http://www.codekeep.net/snippets/623f1923-e03c-4636-8c92-c9dc7aa0d3c0.aspx"&gt;http://www.codekeep.net/snippets/623f1923-e03c-4636-8c92-c9dc7aa0d3c0.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Produces solution of the equations &amp;amp; the coefficient matrix&lt;/p&gt;  &lt;p&gt;Efficient, stable&lt;/p&gt;  &lt;p&gt;2 steps:&lt;/p&gt;  &lt;p&gt;· &lt;b&gt;Forward Elimination&lt;/b&gt; – matrix decomposition: reduce set to &lt;b&gt;triangular form&lt;/b&gt; (0s below the diagonal) or &lt;b&gt;row echelon form&lt;/b&gt;. If degenerate, then there is no solution&lt;/p&gt;  &lt;p&gt;· &lt;b&gt;Backward Elimination&lt;/b&gt; –write the original matrix as the product of ints inverse matrix &amp;amp; its reduced row-echelon matrix à reduce set to &lt;b&gt;row canonical form&lt;/b&gt; &amp;amp; use back-substitution to find the solution to the set &lt;/p&gt;  &lt;p&gt;Elementary ops for matrix decomposition:&lt;/p&gt;  &lt;p&gt;· Row multiplication&lt;/p&gt;  &lt;p&gt;· Row switching&lt;/p&gt;  &lt;p&gt;· Add multiples of rows to other rows&lt;/p&gt;  &lt;p&gt;Use &lt;b&gt;pivoting&lt;/b&gt; to ensure rows are ordered for achieving triangular form&lt;/p&gt;  &lt;h4&gt;LU Decomposition&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/LU_decomposition"&gt;http://en.wikipedia.org/wiki/LU_decomposition&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;C++: &lt;a href="http://ganeshtiwaridotcomdotnp.blogspot.co.il/2009/12/c-c-code-lu-decomposition-for-solving.html"&gt;http://ganeshtiwaridotcomdotnp.blogspot.co.il/2009/12/c-c-code-lu-decomposition-for-solving.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_2.png" rel="lightbox"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_thumb.png" width="244" height="86" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Represent the matrix as a product of lower &amp;amp; upper triangular matrices&lt;/p&gt;  &lt;p&gt;A modified version of GJ Elimination&lt;/p&gt;  &lt;p&gt;Advantage – can easily apply forward &amp;amp; backward elimination to solve triangular matrices&lt;/p&gt;  &lt;p&gt;Techniques:&lt;/p&gt;  &lt;p&gt;· &lt;b&gt;Doolittle Method&lt;/b&gt; – sets the L matrix diagonal to unity&lt;/p&gt;  &lt;p&gt;· &lt;b&gt;Crout Method&lt;/b&gt; - sets the U matrix diagonal to unity&lt;/p&gt;  &lt;p&gt;Note: both the L &amp;amp; U matrices share the same unity diagonal &amp;amp; can be stored compactly in the same matrix&lt;/p&gt;  &lt;h4&gt;Gauss-Seidel Iteration &lt;/h4&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Gauss%E2%80%93Seidel_method"&gt;http://en.wikipedia.org/wiki/Gauss%E2%80%93Seidel_method&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;C++: &lt;a href="http://www.nr.com/forum/showthread.php?t=722"&gt;http://www.nr.com/forum/showthread.php?t=722&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Transform the linear set of equations into a single equation &amp;amp; then use numerical integration (as integration formulas have Sums, it is implemented iteratively).&lt;/p&gt;  &lt;p&gt;an optimization of Gauss-Jacobi: 1.5 times faster, requires 0.25 iterations to achieve the same tolerance&lt;/p&gt;  &lt;h2&gt;Solving Non-Linear Equations Iteratively&lt;/h2&gt;  &lt;p&gt;find roots of polynomials – there may be 0, 1 or n solutions for an n order polynomial&lt;/p&gt;  &lt;p&gt;use iterative techniques&lt;/p&gt;  &lt;h4&gt;Iterative methods&lt;/h4&gt;  &lt;p&gt;· used when there are no known analytical techniques&lt;/p&gt;  &lt;p&gt;· Requires set functions to be continuous &amp;amp; differentiable&lt;/p&gt;  &lt;p&gt;· Requires an initial seed value – choice is critical to convergence à conduct multiple runs with different starting points &amp;amp; then select best result&lt;/p&gt;  &lt;p&gt;· Systematic - iterate until diminishing returns, tolerance or max iteration conditions are met&lt;/p&gt;  &lt;p&gt;· bracketing techniques will always yield convergent solutions, non-bracketing methods may fail to converge&lt;/p&gt;  &lt;h4&gt;Incremental method &lt;/h4&gt;  &lt;p&gt;if a nonlinear function has opposite signs at 2 ends of a small interval x1 &amp;amp; x2, then there is likely to be a solution in their interval – solutions are detected by evaluating a function over interval steps, for a change in sign, adjusting the step size dynamically.&lt;/p&gt;  &lt;p&gt;Limitations – can miss closely spaced solutions in large intervals, cannot detect degenerate (coinciding) solutions, limited to functions that cross the x-axis, gives false positives for singularities&lt;/p&gt;  &lt;h4&gt;Fixed point method&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Fixed-point_iteration"&gt;http://en.wikipedia.org/wiki/Fixed-point_iteration&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;C++: &lt;a href="http://books.google.co.il/books?id=weYj75E_t6MC&amp;amp;pg=PA79&amp;amp;lpg=PA79&amp;amp;dq=fixed+point+method++c%2B%2B&amp;amp;source=bl&amp;amp;ots=LQ-5P_taoC&amp;amp;sig=lENUUIYBK53tZtTwNfHLy5PEWDk&amp;amp;hl=en&amp;amp;sa=X&amp;amp;ei=wezDUPW1J5DptQaMsIHQCw&amp;amp;redir_esc=y#v=onepage&amp;amp;q=fixed%20point%20method%20%20c%2B%2B&amp;amp;f=false"&gt;http://books.google.co.il/books?id=weYj75E_t6MC&amp;amp;pg=PA79&amp;amp;lpg=PA79&amp;amp;dq=fixed+point+method++c%2B%2B&amp;amp;source=bl&amp;amp;ots=LQ-5P_taoC&amp;amp;sig=lENUUIYBK53tZtTwNfHLy5PEWDk&amp;amp;hl=en&amp;amp;sa=X&amp;amp;ei=wezDUPW1J5DptQaMsIHQCw&amp;amp;redir_esc=y#v=onepage&amp;amp;q=fixed%20point%20method%20%20c%2B%2B&amp;amp;f=false&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_4.png" rel="lightbox"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_thumb_1.png" width="217" height="243" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Algebraically rearrange a solution to isolate a variable then apply &lt;b&gt;incremental method&lt;/b&gt;&lt;/p&gt;  &lt;h4&gt;Bisection method&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Bisection_method"&gt;http://en.wikipedia.org/wiki/Bisection_method&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;C++: &lt;a href="http://numericalcomputing.wordpress.com/category/algorithms/"&gt;http://numericalcomputing.wordpress.com/category/algorithms/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_6.png" rel="lightbox"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_thumb_2.png" width="182" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Bracketed - Select an initial interval, keep bisecting it ad midpoint into sub-intervals and then apply &lt;b&gt;incremental method &lt;/b&gt;on smaller &amp;amp; smaller intervals – zoom in&lt;/p&gt;  &lt;p&gt;Adv: unaffected by function gradient à reliable&lt;/p&gt;  &lt;p&gt;Disadv: slow convergence&lt;/p&gt;  &lt;h4&gt;False Position Method&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/False_position_method"&gt;http://en.wikipedia.org/wiki/False_position_method&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;C++: &lt;a href="http://www.dreamincode.net/forums/topic/126100-bisection-and-false-position-methods/"&gt;http://www.dreamincode.net/forums/topic/126100-bisection-and-false-position-methods/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Bracketed - Select an initial interval , &amp;amp; use the relative value of function at interval end points to select next sub-intervals (estimate how far between the end points the solution might be &amp;amp; subdivide based on this)&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;h4&gt;Newton-Raphson method&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Newton's_method"&gt;http://en.wikipedia.org/wiki/Newton's_method&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;C++: &lt;a href="http://www-users.cselabs.umn.edu/classes/Summer-2012/csci1113/index.php?page=./newt3"&gt;http://www-users.cselabs.umn.edu/classes/Summer-2012/csci1113/index.php?page=./newt3&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_8.png" rel="lightbox"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_thumb_3.png" width="361" height="223" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Also known as Newton's method&lt;/p&gt;  &lt;p&gt;Convenient, efficient&lt;/p&gt;  &lt;p&gt;Not bracketed – only a single initial guess is required to start iteration – requires an analytical expression for the first derivative of the function as input.&lt;/p&gt;  &lt;p&gt;Evaluates the function &amp;amp; its derivative at each step. &lt;/p&gt;  &lt;p&gt;Can be extended to the &lt;b&gt;Newton MutiRoot method&lt;/b&gt; for solving multiple roots&lt;/p&gt;  &lt;p&gt;Can be easily applied to an of n-coupled set of non-linear equations – conduct a Taylor Series expansion of a function, dropping terms of order n, rewrite as a Jacobian matrix of PDs &amp;amp; convert to simultaneous linear equations !!!&lt;/p&gt;  &lt;h4&gt;Secant Method&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Secant_method"&gt;http://en.wikipedia.org/wiki/Secant_method&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;C++: &lt;a href="http://forum.vcoderz.com/showthread.php?p=205230"&gt;http://forum.vcoderz.com/showthread.php?p=205230&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_10.png" rel="lightbox"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_thumb_4.png" width="219" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Unlike N-R, can estimate first derivative from an initial interval (does not require root to be bracketed) instead of inputting it&lt;/p&gt;  &lt;p&gt;Since derivative is approximated, may converge slower. Is fast in practice as it does not have to evaluate the derivative at each step.&lt;/p&gt;  &lt;p&gt;Similar implementation to False Positive method&lt;/p&gt;  &lt;h4&gt;Birge-Vieta Method&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://mat.iitm.ac.in/home/sryedida/public_html/caimna/transcendental/polynomial%20methods/bv%20method.html"&gt;http://mat.iitm.ac.in/home/sryedida/public_html/caimna/transcendental/polynomial%20methods/bv%20method.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;C++: &lt;a href="http://books.google.co.il/books?id=cL1boM2uyQwC&amp;amp;pg=SA3-PA51&amp;amp;lpg=SA3-PA51&amp;amp;dq=Birge-Vieta+Method+c%2B%2B&amp;amp;source=bl&amp;amp;ots=QZmnDTK3rC&amp;amp;sig=BPNcHHbpR_DKVoZXrLi4nVXD-gg&amp;amp;hl=en&amp;amp;sa=X&amp;amp;ei=R-_DUK2iNIjzsgbE5ID4Dg&amp;amp;redir_esc=y#v=onepage&amp;amp;q=Birge-Vieta%20Method%20c%2B%2B&amp;amp;f=false"&gt;http://books.google.co.il/books?id=cL1boM2uyQwC&amp;amp;pg=SA3-PA51&amp;amp;lpg=SA3-PA51&amp;amp;dq=Birge-Vieta+Method+c%2B%2B&amp;amp;source=bl&amp;amp;ots=QZmnDTK3rC&amp;amp;sig=BPNcHHbpR_DKVoZXrLi4nVXD-gg&amp;amp;hl=en&amp;amp;sa=X&amp;amp;ei=R-_DUK2iNIjzsgbE5ID4Dg&amp;amp;redir_esc=y#v=onepage&amp;amp;q=Birge-Vieta%20Method%20c%2B%2B&amp;amp;f=false&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;combines &lt;b&gt;Horner's method&lt;/b&gt; of polynomial evaluation (transforming into lesser degree polynomials that are more computationally efficient to process) with &lt;b&gt;Newton-Raphson&lt;/b&gt; to provide a computational speed-up&lt;/p&gt;  &lt;h2&gt;Interpolation&lt;/h2&gt;  &lt;h4&gt;Overview&lt;/h4&gt;  &lt;p&gt;Construct new data points for as close as possible fit within range of a discrete set of known points (that were obtained via sampling, experimentation) &lt;/p&gt;  &lt;p&gt;Use Taylor Series Expansion of a function f(x) around a specific value for x&lt;/p&gt;  &lt;h4&gt;Linear Interpolation&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Linear_interpolation"&gt;http://en.wikipedia.org/wiki/Linear_interpolation&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;C++: &lt;a href="http://www.hamaluik.com/?p=289"&gt;http://www.hamaluik.com/?p=289&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_20.png" rel="lightbox"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_thumb_9.png" width="244" height="238" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Straight line between 2 points à concatenate interpolants between each pair of data points &lt;/p&gt;  &lt;h4&gt;Bilinear Interpolation&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Bilinear_interpolation"&gt;http://en.wikipedia.org/wiki/Bilinear_interpolation&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;C++: &lt;a href="http://supercomputingblog.com/graphics/coding-bilinear-interpolation/2/"&gt;http://supercomputingblog.com/graphics/coding-bilinear-interpolation/2/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_12.png" rel="lightbox"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_thumb_5.png" width="305" height="357" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Extension of the linear function for interpolating functions of 2 variables – perform linear interpolation first in 1 direction, then in another.&lt;/p&gt;  &lt;p&gt;Used in image processing – e.g. texture mapping filter. Uses 4 vertices to interpolate a value within a unit cell.&lt;/p&gt;  &lt;h4&gt;Lagrange Interpolation &lt;/h4&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Lagrange_polynomial"&gt;http://en.wikipedia.org/wiki/Lagrange_polynomial&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;C++: &lt;a href="http://www.codecogs.com/code/maths/approximation/interpolation/lagrange.php"&gt;http://www.codecogs.com/code/maths/approximation/interpolation/lagrange.php&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_14.png" rel="lightbox"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_thumb_6.png" width="218" height="374" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;For polynomials &lt;/p&gt;  &lt;p&gt;Requires recomputation for all terms for each distinct x value – can only be applied for small number of nodes&lt;/p&gt;  &lt;p&gt;Numerically unstable&lt;/p&gt;  &lt;h4&gt;Barycentric Interpolation&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://epubs.siam.org/doi/pdf/10.1137/S0036144502417715"&gt;http://epubs.siam.org/doi/pdf/10.1137/S0036144502417715&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;C++: &lt;a href="http://www.gamedev.net/topic/621445-barycentric-coordinates-c-code-check/"&gt;http://www.gamedev.net/topic/621445-barycentric-coordinates-c-code-check/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_16.png" rel="lightbox"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_thumb_7.png" width="255" height="406" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Rearrange the terms in the equation of the Legrange interpolation by defining weight functions that are independent of the interpolated value of x&lt;/p&gt;  &lt;h4&gt;Newton Divided Difference Interpolation&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Newton_polynomial"&gt;http://en.wikipedia.org/wiki/Newton_polynomial&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;C++: &lt;a href="http://jee-appy.blogspot.co.il/2011/12/newton-divided-difference-interpolation.html"&gt;http://jee-appy.blogspot.co.il/2011/12/newton-divided-difference-interpolation.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Hermite Divided Differences:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_22.png" rel="lightbox"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_thumb_10.png" width="244" height="131" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Interpolation polynomial approximation for a given set of data points in the NR form - divided differences are used to approximately calculate the various differences.&lt;/p&gt;  &lt;p&gt;For a given set of 3 data points , fit a quadratic interpolant through the data&lt;/p&gt;  &lt;p&gt;Bracketed functions allow Newton divided differences to be calculated recursively&lt;/p&gt;  &lt;p&gt;Difference table &lt;/p&gt;  &lt;h4&gt;Cubic Spline Interpolation&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Spline_interpolation"&gt;http://en.wikipedia.org/wiki/Spline_interpolation&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;C++: &lt;a href="https://www.marcusbannerman.co.uk/index.php/home/latestarticles/42-articles/96-cubic-spline-class.html"&gt;https://www.marcusbannerman.co.uk/index.php/home/latestarticles/42-articles/96-cubic-spline-class.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_24.png" rel="lightbox"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_thumb_11.png" width="244" height="200" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Spline is a piecewise polynomial&lt;/p&gt;  &lt;p&gt;Provides smoothness – for interpolations with significantly varying data&lt;/p&gt;  &lt;p&gt;Use weighted coefficients to bend the function to be smooth &amp;amp; its 1&lt;sup&gt;st&lt;/sup&gt; &amp;amp; 2&lt;sup&gt;nd&lt;/sup&gt; derivatives are continuous through the edge points in the interval&lt;/p&gt;  &lt;h2&gt;Curve Fitting&lt;/h2&gt;  &lt;p&gt;A generalization of interpolating whereby given data points may contain noise à the curve does not necessarily pass through all the points&lt;/p&gt;  &lt;h4&gt;Least Squares Fit&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Least_squares"&gt;http://en.wikipedia.org/wiki/Least_squares&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;C++: &lt;a href="http://www.ccas.ru/mmes/educat/lab04k/02/least-squares.c"&gt;http://www.ccas.ru/mmes/educat/lab04k/02/least-squares.c&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_26.png" rel="lightbox"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_thumb_12.png" width="244" height="127" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Residual – difference between observed value &amp;amp; expected value&lt;/p&gt;  &lt;p&gt;Model function is often chosen as a linear combination of the specified functions &lt;/p&gt;  &lt;p&gt;Determines:&lt;/p&gt;  &lt;p&gt;A) The model instance in which the sum of squared residuals has the least value&lt;/p&gt;  &lt;p&gt;B) param values for which model best fits data&lt;/p&gt;  &lt;h4&gt;Straight Line Fit&lt;/h4&gt;  &lt;p&gt;Linear correlation between independent variable and dependent variable&lt;/p&gt;  &lt;h4&gt;Linear Regression &lt;/h4&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Linear_regression"&gt;http://en.wikipedia.org/wiki/Linear_regression&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;C++: &lt;a href="http://www.oocities.org/david_swaim/cpp/linregc.htm"&gt;http://www.oocities.org/david_swaim/cpp/linregc.htm&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_28.png" rel="lightbox"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_thumb_13.png" width="244" height="159" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Special case of statistically exact extrapolation&lt;/p&gt;  &lt;p&gt;Leverage least squares&lt;/p&gt;  &lt;p&gt;Given a basis function, the sum of the residuals is determined and the corresponding gradient equation is expressed as a set of normal linear equations in matrix form that can be solved (e.g. using LU Decomposition)&lt;/p&gt;  &lt;p&gt;Can be weighted - Drop the assumption that all errors have the same significance –-&amp;gt; confidence of accuracy is different for each data point. Fit the function closer to points with higher weights&lt;/p&gt;  &lt;p&gt;Polynomial Fit - use a polynomial basis function&lt;/p&gt;  &lt;h4&gt;Moving Average&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Moving_average"&gt;http://en.wikipedia.org/wiki/Moving_average&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;C++: &lt;a href="http://www.codeproject.com/Articles/17860/A-Simple-Moving-Average-Algorithm"&gt;http://www.codeproject.com/Articles/17860/A-Simple-Moving-Average-Algorithm&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_30.png" rel="lightbox"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_thumb_14.png" width="244" height="164" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Used for smoothing (cancel fluctuations to highlight longer-term trends &amp;amp; cycles), time series data analysis, signal processing filters&lt;/p&gt;  &lt;p&gt;Replace each data point with average of neighbors. &lt;/p&gt;  &lt;p&gt;Can be simple (SMA), weighted (WMA), exponential (EMA). Lags behind latest data points – extra weight can be given to more recent data points. Weights can decrease arithmetically or exponentially according to distance from point.&lt;/p&gt;  &lt;p&gt;Parameters: smoothing factor, period, weight basis&lt;/p&gt;  &lt;h2&gt;Optimization&lt;/h2&gt;  &lt;h4&gt;Overview&lt;/h4&gt;  &lt;p&gt;Given function with multiple variables, find Min (or max by minimizing –f(x))&lt;/p&gt;  &lt;p&gt;Iterative approach&lt;/p&gt;  &lt;p&gt;Efficient, but not necessarily reliable&lt;/p&gt;  &lt;p&gt;Conditions: noisy data, constraints, non-linear models&lt;/p&gt;  &lt;p&gt;Detection via sign of first derivative - Derivative of saddle points will be 0&lt;/p&gt;  &lt;p&gt;Local minima&lt;/p&gt;  &lt;h4&gt;Bisection method&lt;/h4&gt;  &lt;p&gt;Similar method for finding a root for a non-linear equation&lt;/p&gt;  &lt;p&gt;Start with an interval that contains a minimum&lt;/p&gt;  &lt;h4&gt;Golden Search method&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Golden_section_search"&gt;http://en.wikipedia.org/wiki/Golden_section_search&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;C++: &lt;a href="http://www.codecogs.com/code/maths/optimization/golden.php"&gt;http://www.codecogs.com/code/maths/optimization/golden.php&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_32.png" rel="lightbox"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_thumb_15.png" width="230" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Bisect intervals according to golden ratio 0.618..&lt;/p&gt;  &lt;p&gt;Achieves reduction by evaluating a single function instead of 2&lt;/p&gt;  &lt;h4&gt;Newton-Raphson Method&lt;/h4&gt;  &lt;h4&gt;Brent method&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Brent's_method"&gt;http://en.wikipedia.org/wiki/Brent's_method&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;C++: &lt;a href="http://people.sc.fsu.edu/~jburkardt/cpp_src/brent/brent.cpp"&gt;http://people.sc.fsu.edu/~jburkardt/cpp_src/brent/brent.cpp&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Based on quadratic or parabolic interpolation – if the function is smooth &amp;amp; parabolic near to the minimum, then a parabola fitted through any 3 points should approximate the minima – fails when the 3 points are collinear , in which case the denominator is 0&lt;/p&gt;  &lt;h4&gt;Simplex Method&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Simplex_algorithm"&gt;http://en.wikipedia.org/wiki/Simplex_algorithm&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;C++: &lt;a href="http://www.codeguru.com/cpp/article.php/c17505/Simplex-Optimization-Algorithm-and-Implemetation-in-C-Programming.htm"&gt;http://www.codeguru.com/cpp/article.php/c17505/Simplex-Optimization-Algorithm-and-Implemetation-in-C-Programming.htm&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_34.png" rel="lightbox"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_thumb_16.png" width="208" height="226" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Find the global minima of any multi-variable function&lt;/p&gt;  &lt;p&gt;Direct search – no derivatives required&lt;/p&gt;  &lt;p&gt;At each step it maintains a non-degenerative simplex – a convex hull of n+1 vertices.&lt;/p&gt;  &lt;p&gt;Obtains the minimum for a function with n variables by evaluating the function at n-1 points, iteratively replacing the point of worst result with the point of best result, shrinking the multidimensional simplex around the best point.&lt;/p&gt;  &lt;p&gt;Point replacement involves expanding &amp;amp; contracting the simplex near the worst value point to determine a better replacement point&lt;/p&gt;  &lt;p&gt;Oscillation can be avoided by choosing the 2&lt;sup&gt;nd&lt;/sup&gt; worst result&lt;/p&gt;  &lt;p&gt;Restart if it gets stuck&lt;/p&gt;  &lt;p&gt;Parameters: contraction &amp;amp; expansion factors&lt;/p&gt;  &lt;h4&gt;Simulated Annealing&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Simulated_annealing"&gt;http://en.wikipedia.org/wiki/Simulated_annealing&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;C++: &lt;a href="http://code.google.com/p/cppsimulatedannealing/"&gt;http://code.google.com/p/cppsimulatedannealing/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_36.png" rel="lightbox"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_thumb_17.png" width="244" height="137" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Analogy to heating &amp;amp; cooling metal to strengthen its structure&lt;/p&gt;  &lt;p&gt;Stochastic method – apply random permutation search for global minima - Avoid entrapment in local minima via hill climbing &lt;/p&gt;  &lt;p&gt;Heating schedule - Annealing schedule params: temperature, iterations at each temp, temperature delta&lt;/p&gt;  &lt;p&gt;Cooling schedule – can be linear, step-wise or exponential&lt;/p&gt;  &lt;h4&gt;Differential Evolution&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Differential_evolution"&gt;http://en.wikipedia.org/wiki/Differential_evolution&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;C++: &lt;a href="http://www.amichel.com/de/doc/html/"&gt;http://www.amichel.com/de/doc/html/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;More advanced stochastic methods analogous to biological processes: Genetic algorithms, evolution strategies&lt;/p&gt;  &lt;p&gt;Parallel direct search method against multiple discrete or continuous variables&lt;/p&gt;  &lt;p&gt;Initial population of variable vectors chosen randomly – if weighted difference vector of 2 vectors yields a lower objective function value then it replaces the comparison vector &lt;/p&gt;  &lt;p&gt;Many params: #parents, #variables, step size, crossover constant etc&lt;/p&gt;  &lt;p&gt;Convergence is slow – many more function evaluations than simulated annealing&lt;/p&gt;  &lt;h2&gt;Numerical Differentiation&lt;/h2&gt;  &lt;h4&gt;Overview&lt;/h4&gt;  &lt;p&gt;2 approaches to finite difference methods: &lt;/p&gt;  &lt;p&gt;· A) approximate function via polynomial interpolation then differentiate&lt;/p&gt;  &lt;p&gt;· B) Taylor series approximation – additionally provides error estimate&lt;/p&gt;  &lt;h4&gt;Finite Difference methods&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Finite_difference_method"&gt;http://en.wikipedia.org/wiki/Finite_difference_method&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;C++: &lt;a href="http://www.wpi.edu/Pubs/ETD/Available/etd-051807-164436/unrestricted/EAMPADU.pdf"&gt;http://www.wpi.edu/Pubs/ETD/Available/etd-051807-164436/unrestricted/EAMPADU.pdf&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_38.png" rel="lightbox"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_thumb_18.png" width="184" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Find differences between high order derivative values - Approximate differential equations by finite differences at evenly spaced data points&lt;/p&gt;  &lt;p&gt;Based on forward &amp;amp; backward Taylor series expansion of f(x) about x plus or minus multiples of delta h. &lt;/p&gt;  &lt;p&gt;Forward / backward difference - the sums of the series contains even derivatives and the difference of the series contains odd derivatives – coupled equations that can be solved. &lt;/p&gt;  &lt;p&gt;Provide an approximation of the derivative within a O(h^2) accuracy&lt;/p&gt;  &lt;p&gt;There is also central difference &amp;amp; extended central difference which has a O(h^4) accuracy&lt;/p&gt;  &lt;h4&gt;Richardson Extrapolation&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Richardson_extrapolation"&gt;http://en.wikipedia.org/wiki/Richardson_extrapolation&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;C++: &lt;a href="http://mathscoding.blogspot.co.il/2012/02/introduction-richardson-extrapolation.html"&gt;http://mathscoding.blogspot.co.il/2012/02/introduction-richardson-extrapolation.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;A sequence acceleration method applied to finite differences&lt;/p&gt;  &lt;p&gt;Fast convergence, high accuracy O(h^4) &lt;/p&gt;  &lt;h4&gt;Derivatives via Interpolation&lt;/h4&gt;  &lt;p&gt;Cannot apply Finite Difference method to discrete data points at uneven intervals – so need to approximate the derivative of f(x) using the derivative of the interpolant via 3 point Lagrange Interpolation&lt;/p&gt;  &lt;p&gt;Note: the higher the order of the derivative, the lower the approximation precision&lt;/p&gt;  &lt;h2&gt;Numerical Integration&lt;/h2&gt;  &lt;p&gt;Estimate finite &amp;amp; infinite integrals of functions&lt;/p&gt;  &lt;p&gt;More accurate procedure than numerical differentiation&lt;/p&gt;  &lt;p&gt;Use when it is not possible to obtain an integral of a function analytically or when the function is not given, only the data points are&lt;/p&gt;  &lt;h4&gt;Newton Cotes Methods&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Newton%E2%80%93Cotes_formulas"&gt;http://en.wikipedia.org/wiki/Newton%E2%80%93Cotes_formulas&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;C++: &lt;a href="http://www.siafoo.net/snippet/324"&gt;http://www.siafoo.net/snippet/324&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_40.png" rel="lightbox"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_thumb_19.png" width="193" height="147" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;For equally spaced data points&lt;/p&gt;  &lt;p&gt;Computationally easy – based on local interpolation of n rectangular strip areas that is piecewise fitted to a polynomial to get the sum total area&lt;/p&gt;  &lt;p&gt;Evaluate the integrand at n+1 evenly spaced points – approximate definite integral by Sum&lt;/p&gt;  &lt;p&gt;Weights are derived from Lagrange Basis polynomials&lt;/p&gt;  &lt;p&gt;Leverage Trapezoidal Rule for default 2nd formulas, Simpson 1/3 Rule for substituting 3 point formulas, Simpson 3/8 Rule for 4 point formulas. For 4 point formulas use Bodes Rule. Higher orders obtain more accurate results&lt;/p&gt;  &lt;p&gt;Trapezoidal Rule uses simple area, Simpsons Rule replaces the integrand f(x) with a quadratic polynomial p(x) that uses the same values as f(x) for its end points, but adds a midpoint&lt;/p&gt;  &lt;h4&gt;Romberg Integration&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Romberg's_method"&gt;http://en.wikipedia.org/wiki/Romberg's_method&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;C++: &lt;a href="http://code.google.com/p/romberg-integration/downloads/detail?name=romberg.cpp&amp;amp;can=2&amp;amp;q"&gt;http://code.google.com/p/romberg-integration/downloads/detail?name=romberg.cpp&amp;amp;can=2&amp;amp;q&lt;/a&gt;=&lt;/p&gt;  &lt;p&gt;Combines trapezoidal rule with Richardson Extrapolation&lt;/p&gt;  &lt;p&gt;Evaluates the integrand at equally spaced points&lt;/p&gt;  &lt;p&gt;The integrand must have continuous derivatives&lt;/p&gt;  &lt;p&gt;Each R(n,m) extrapolation uses a higher order integrand polynomial replacement rule (zeroth starts with trapezoidal) à a lower triangular matrix set of equation coefficients where the bottom right term has the most accurate approximation. The process continues until the difference between 2 successive diagonal terms becomes sufficiently small. &lt;/p&gt;  &lt;h4&gt;Gaussian Quadrature&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Gaussian_quadrature"&gt;http://en.wikipedia.org/wiki/Gaussian_quadrature&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;C++: &lt;a href="http://www.alglib.net/integration/gaussianquadratures.php"&gt;http://www.alglib.net/integration/gaussianquadratures.php&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Data points are chosen to yield best possible accuracy – requires fewer evaluations&lt;/p&gt;  &lt;p&gt;Ability to handle singularities, functions that are difficult to evaluate &lt;/p&gt;  &lt;p&gt;The integrand can include a weighting function determined by a set of orthogonal polynomials.&lt;/p&gt;  &lt;p&gt;Points &amp;amp; weights are selected so that the integrand yields the exact integral if f(x) is a polynomial of degree &amp;lt;= 2n+1 &lt;/p&gt;  &lt;p&gt;Techniques (basically different weighting functions):&lt;/p&gt;  &lt;p&gt;· &lt;b&gt;Gauss-Legendre Integration &lt;/b&gt;&lt;b&gt;w(x)=1&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;· &lt;b&gt;Gauss-Laguerre Integration w(x)=e^-x&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;· &lt;b&gt;Gauss-Hermite Integration w(x)=e^-x^2&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;· &lt;b&gt;Gauss-Chebyshev Integration w(x)= 1 / Sqrt(1-x^2)&lt;/b&gt;&lt;/p&gt;  &lt;h2&gt;Solving ODEs&lt;/h2&gt;  &lt;p&gt;Use when high order differential equations cannot be solved analytically&lt;/p&gt;  &lt;p&gt;Evaluated under boundary conditions&lt;/p&gt;  &lt;p&gt;RK for systems – a high order differential equation can always be transformed into a coupled first order system of equations&lt;/p&gt;  &lt;h4&gt;Euler method&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Euler_method"&gt;http://en.wikipedia.org/wiki/Euler_method&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;C++: &lt;a href="http://rosettacode.org/wiki/Euler_method"&gt;http://rosettacode.org/wiki/Euler_method&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_42.png" rel="lightbox"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_thumb_20.png" width="192" height="197" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;First order Runge–Kutta method. &lt;/p&gt;  &lt;p&gt;Simple recursive method – given an initial value, calculate derivative deltas.&lt;/p&gt;  &lt;p&gt;Unstable &amp;amp; not very accurate (O(h) error) – not used in practice&lt;/p&gt;  &lt;p&gt;A first-order method - the local error (truncation error per step) is proportional to the square of the step size, and the global error (error at a given time) is proportional to the step size &lt;/p&gt;  &lt;p&gt;In evolving solution between data points xn &amp;amp; xn+1, only evaluates derivatives at beginning of interval xn à asymmetric at boundaries&lt;/p&gt;  &lt;h4&gt;Higher order Runge Kutta&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Runge%E2%80%93Kutta_methods"&gt;http://en.wikipedia.org/wiki/Runge%E2%80%93Kutta_methods&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;C++: &lt;a href="http://www.dreamincode.net/code/snippet1441.htm"&gt;http://www.dreamincode.net/code/snippet1441.htm&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_44.png" rel="lightbox"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_thumb_21.png" width="244" height="130" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;2&lt;sup&gt;nd&lt;/sup&gt; &amp;amp; 4&lt;sup&gt;th&lt;/sup&gt; order RK - Introduces parameterized midpoints for more symmetric solutions à accuracy at higher computational cost&lt;/p&gt;  &lt;p&gt;Adaptive RK – &lt;b&gt;RK-Fehlberg&lt;/b&gt; – estimate the truncation at each integration step &amp;amp; automatically adjust the step size to keep error within prescribed limits. At each step 2 approximations are compared – if in disagreement to a specific accuracy, the step size is reduced&lt;/p&gt;  &lt;h2&gt;Boundary Value Problems&lt;/h2&gt;  &lt;p&gt;Where solution of differential equations are located at 2 different values of the independent variable x à more difficult, because cannot just start at point of initial value – there may not be enough starting conditions available at the end points to produce a unique solution&lt;/p&gt;  &lt;p&gt;An n-order equation will require n boundary conditions – need to determine the missing n-1 conditions which cause the given conditions at the other boundary to be satisfied&lt;/p&gt;  &lt;h4&gt;Shooting Method&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Shooting_method"&gt;http://en.wikipedia.org/wiki/Shooting_method&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;C++: &lt;a href="http://ganeshtiwaridotcomdotnp.blogspot.co.il/2009/12/c-c-code-shooting-method-for-solving.html"&gt;http://ganeshtiwaridotcomdotnp.blogspot.co.il/2009/12/c-c-code-shooting-method-for-solving.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_46.png" rel="lightbox"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_thumb_22.png" width="244" height="203" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Iteratively guess the missing values for one end &amp;amp; integrate, then inspect the discrepancy with the boundary values of the other end to adjust the estimate&lt;/p&gt;  &lt;p&gt;Given the starting boundary values u1 &amp;amp; u2 which contain the root u, solve u given the &lt;b&gt;false position method&lt;/b&gt; (solving the differential equation as an initial value problem via 4&lt;sup&gt;th&lt;/sup&gt; order RK), then use u to solve the differential equations.&lt;/p&gt;  &lt;h4&gt;Finite Difference Method&lt;/h4&gt;  &lt;p&gt;For linear &amp;amp; non-linear systems&lt;/p&gt;  &lt;p&gt;Higher order derivatives require more computational steps – some combinations for boundary conditions may not work though&lt;/p&gt;  &lt;p&gt;Improve the accuracy by increasing the number of mesh points&lt;/p&gt;  &lt;h2&gt;Solving EigenValue Problems&lt;/h2&gt;  &lt;p&gt;An eigenvalue can substitute a matrix when doing matrix multiplication à convert matrix multiplication into a polynomial EigenValue &lt;/p&gt;  &lt;p&gt;For a given set of equations in matrix form, determine what are the solution eigenvalue &amp;amp; eigenvectors&lt;/p&gt;  &lt;p&gt;Similar Matrices - have same eigenvalues. Use orthogonal similarity transforms to reduce a matrix to diagonal form from which eigenvalue(s) &amp;amp; eigenvectors can be computed iteratively&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_48.png" rel="lightbox"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/A-Taxonomy-of-Numerical-Methods-v1_4820/image_thumb_23.png" width="233" height="223" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h4&gt;Jacobi method&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Jacobi_method"&gt;http://en.wikipedia.org/wiki/Jacobi_method&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;C++: &lt;a href="http://people.sc.fsu.edu/~jburkardt/classes/acs2_2008/openmp/jacobi/jacobi.html"&gt;http://people.sc.fsu.edu/~jburkardt/classes/acs2_2008/openmp/jacobi/jacobi.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Robust but Computationally intense – use for small matrices &amp;lt; 10x10&lt;/p&gt;  &lt;h4&gt;Power Iteration&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Power_iteration"&gt;http://en.wikipedia.org/wiki/Power_iteration&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;For any given real symmetric matrix, generate the largest single eigenvalue &amp;amp; its eigenvectors&lt;/p&gt;  &lt;p&gt;Simplest method – does not compute matrix decomposition à suitable for large, sparse matrices&lt;/p&gt;  &lt;h4&gt;Inverse Iteration&lt;/h4&gt;  &lt;p&gt;Variation of power iteration method – generates the smallest eigenvalue from the inverse matrix&lt;/p&gt;  &lt;h4&gt;Rayleigh Method&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Rayleigh's_method_of_dimensional_analysis"&gt;http://en.wikipedia.org/wiki/Rayleigh's_method_of_dimensional_analysis&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Variation of power iteration method &lt;/p&gt;  &lt;h4&gt;Rayleigh Quotient Method&lt;/h4&gt;  &lt;p&gt;Variation of inverse iteration method &lt;/p&gt;  &lt;h4&gt;Matrix Tri-diagonalization Method&lt;/h4&gt;  &lt;p&gt;Use &lt;b&gt;householder algorithm&lt;/b&gt; to reduce an NxN symmetric matrix to a tridiagonal real symmetric matrix vua N-2 orthogonal transforms&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;h2&gt;Whats Next&lt;/h2&gt;  &lt;p&gt;Outside of Numerical Methods there are lots of different types of algorithms that I’ve learned over the decades: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Data Mining&lt;/strong&gt; – (I covered this briefly in a previous post: &lt;a title="http://geekswithblogs.net/JoshReuben/archive/2007/12/31/ssas-dm-algorithms.aspx" href="http://geekswithblogs.net/JoshReuben/archive/2007/12/31/ssas-dm-algorithms.aspx"&gt;http://geekswithblogs.net/JoshReuben/archive/2007/12/31/ssas-dm-algorithms.aspx&lt;/a&gt; ) &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Search &amp;amp; Sort&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Routing&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Problem Solving&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Logical Theorem Proving&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Planning&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Probabilistic Reasoning&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Machine Learning&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Solvers&lt;/strong&gt; (eg MIP) &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Bioinformatics&lt;/strong&gt; (Sequence Alignment, Protein Folding) &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Quant Finance&lt;/strong&gt; (I read Wilmott’s books – interesting) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Sooner or later, I’ll cover the above topics as well. &lt;/p&gt; &lt;img src="http://geekswithblogs.net/JoshReuben/aggbug/151472.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>JoshReuben</dc:creator>
            <guid>http://geekswithblogs.net/JoshReuben/archive/2012/12/09/a-taxonomy-of-numerical-methods-v1.aspx</guid>
            <pubDate>Sun, 09 Dec 2012 03:28:04 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/JoshReuben/comments/151472.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/JoshReuben/archive/2012/12/09/a-taxonomy-of-numerical-methods-v1.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/JoshReuben/comments/commentRss/151472.aspx</wfw:commentRss>
        </item>
        <item>
            <title>C++ Numerical Recipes &amp;ndash; A New Adventure!</title>
            <link>http://geekswithblogs.net/JoshReuben/archive/2012/11/29/c-numerical-recipes-ndash-a-new-adventure.aspx</link>
            <description>&lt;p&gt;Originally posted on: &lt;a href='http://geekswithblogs.net/JoshReuben/archive/2012/11/29/c-numerical-recipes-ndash-a-new-adventure.aspx'&gt;http://geekswithblogs.net/JoshReuben/archive/2012/11/29/c-numerical-recipes-ndash-a-new-adventure.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I am about to embark on a great journey – over the next 6 weeks I plan to read through &lt;strong&gt;C++ Numerical Recipes 3&lt;sup&gt;rd&lt;/sup&gt; edition &lt;/strong&gt;&lt;a href="http://amzn.to/YtdpkS"&gt;http://amzn.to/YtdpkS&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/9807c59418ff_D78E/clip_image001_2.png" rel="lightbox"&gt;&lt;img title="clip_image001" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image001" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/9807c59418ff_D78E/clip_image001_thumb.png" width="244" height="208" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I'll be reading this with an eye to C++ AMP, thinking about implementing the suitable subset (non-recursive, additive, commutative) to run on the GPU.&lt;/p&gt;  &lt;p&gt;APIs supporting HPC, GPGPU or MapReduce are all useful – providing you have the ability to choose the correct algorithm to leverage on them. &lt;/p&gt;  &lt;p&gt;I really think this is the most fascinating area of programming – a lot more exciting than LOB CRUD !!!&lt;/p&gt;  &lt;p&gt;When you think about it , everything is a function – we categorize &amp;amp; we extrapolate.&lt;/p&gt;  &lt;p&gt;As abstractions get higher &amp;amp; less leaky, sooner or later information systems programming will become a non-programmer task – you will be using WYSIWYG designers to build:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;GUIs&lt;/li&gt;    &lt;li&gt;MVVM&lt;/li&gt;    &lt;li&gt;service mapping &amp;amp; virtualization&lt;/li&gt;    &lt;li&gt;workflows&lt;/li&gt;    &lt;li&gt;ORM&lt;/li&gt;    &lt;li&gt;Entity relations In the data source&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;SharePoint / LightSwitch are not there yet, but every iteration gets closer.&lt;/p&gt;  &lt;p&gt;For information workers, managed code is a race to the bottom.&lt;/p&gt;  &lt;p&gt;As MS futures are a bit shaky right now, the provider agnostic nature &amp;amp; higher barriers of entry of both C++ &amp;amp; Numerical Analysis seem like a rational choice to me.&lt;/p&gt;  &lt;p&gt;Its also fascinating – stepping outside the box.&lt;/p&gt;  &lt;p&gt;This is not the first time I've delved into numerical analysis.&lt;/p&gt;  &lt;p&gt;6 months ago I read &lt;strong&gt;Numerical methods with Applications&lt;/strong&gt;, which can be found for free online: &lt;a href="http://nm.mathforcollege.com/"&gt;http://nm.mathforcollege.com/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/9807c59418ff_D78E/clip_image003_2.jpg" rel="lightbox"&gt;&lt;img title="clip_image003" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image003" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/9807c59418ff_D78E/clip_image003_thumb.jpg" width="244" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;2 years ago I learned the .NET &lt;strong&gt;Extreme Optimization&lt;/strong&gt; library &lt;a href="http://www.extremeoptimization.com"&gt;www.extremeoptimization.com&lt;/a&gt; – not bad&lt;/p&gt;  &lt;p&gt;2.5 years ago I read Schaums N&lt;strong&gt;umerical Analysis&lt;/strong&gt; book &lt;a href="http://amzn.to/V5yuLI"&gt;http://amzn.to/V5yuLI&lt;/a&gt; - not an easy read, as topics jump back &amp;amp; forth across chapters:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/9807c59418ff_D78E/clip_image005_2.jpg" rel="lightbox"&gt;&lt;img title="clip_image005" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image005" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/9807c59418ff_D78E/clip_image005_thumb.jpg" width="176" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;3 years ago I read &lt;strong&gt;Practical Numerical Methods with C# &lt;/strong&gt;&lt;a href="http://amzn.to/V5yCL9"&gt;http://amzn.to/V5yCL9&lt;/a&gt; (which is a toy learning language for this kind of stuff)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/9807c59418ff_D78E/clip_image007_2.jpg" rel="lightbox"&gt;&lt;img title="clip_image007" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image007" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/9807c59418ff_D78E/clip_image007_thumb.jpg" width="244" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I also read through &lt;strong&gt;AI a Modern Approach 3&lt;sup&gt;rd&lt;/sup&gt; edition&lt;/strong&gt; END to END &lt;a href="http://amzn.to/V5yQSp"&gt;http://amzn.to/V5yQSp&lt;/a&gt; - this took me a few years but was the most rewarding experience.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/9807c59418ff_D78E/clip_image009_2.jpg" rel="lightbox"&gt;&lt;img title="clip_image009" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image009" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/9807c59418ff_D78E/clip_image009_thumb.jpg" width="205" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I'll post progress updates – see you on the other side !&lt;/p&gt; &lt;img src="http://geekswithblogs.net/JoshReuben/aggbug/151393.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>JoshReuben</dc:creator>
            <guid>http://geekswithblogs.net/JoshReuben/archive/2012/11/29/c-numerical-recipes-ndash-a-new-adventure.aspx</guid>
            <pubDate>Thu, 29 Nov 2012 13:21:04 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/JoshReuben/comments/151393.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/JoshReuben/archive/2012/11/29/c-numerical-recipes-ndash-a-new-adventure.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/JoshReuben/comments/commentRss/151393.aspx</wfw:commentRss>
        </item>
        <item>
            <title>RiverTrail - JavaScript GPGPU Data Parallelism</title>
            <category>Parallelism</category>
            <link>http://geekswithblogs.net/JoshReuben/archive/2012/11/29/rivertrail---javascript-gppgu-data-parallelism.aspx</link>
            <description>&lt;p&gt;Originally posted on: &lt;a href='http://geekswithblogs.net/JoshReuben/archive/2012/11/29/rivertrail---javascript-gppgu-data-parallelism.aspx'&gt;http://geekswithblogs.net/JoshReuben/archive/2012/11/29/rivertrail---javascript-gppgu-data-parallelism.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;  &lt;h1&gt;Where is WebCL ?&lt;/h1&gt;  &lt;p&gt;The Khronos WebCL working group is working on a JavaScript binding to the OpenCL standard so that HTML 5 compliant browsers can host GPGPU web apps – e.g. for image processing or physics for WebGL games - &lt;a href="http://www.khronos.org/webcl/"&gt;http://www.khronos.org/webcl/&lt;/a&gt; . While Nokia &amp;amp; Samsung have some protype WebCL APIs, Intel has one-upped them with a higher level of abstraction: RiverTrail.&lt;/p&gt;  &lt;h1&gt;Intro to RiverTrail&lt;/h1&gt;  &lt;p&gt;Intel Labs JavaScript RiverTrail provides GPU accelerated SIMD data-parallelism in web applications via a familiar JavaScript programming paradigm. It extends JavaScript with simple deterministic data-parallel constructs that are translated at runtime into a low-level hardware abstraction layer. With its high-level JS API, programmers do not have to learn a new language or explicitly manage threads, orchestrate shared data synchronization or scheduling. It has been proposed as a draft specification to ECMA a &lt;a href="http://wiki.ecmascript.org/doku.php?id=strawman:data_parallelism"&gt;(known as ECMA strawman)&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;RiverTrail runs in all popular browsers (except I.E. of course). &lt;/p&gt;  &lt;p&gt;To get started, download a prebuilt version &lt;a href="https://github.com/downloads/RiverTrail/RiverTrail/rivertrail-0.17.xpi"&gt;https://github.com/downloads/RiverTrail/RiverTrail/rivertrail-0.17.xpi&lt;/a&gt; , install &lt;u&gt;Intel's OpenCL SDK&lt;/u&gt; &lt;a href="http://www.intel.com/go/opencl"&gt;http://www.intel.com/go/opencl&lt;/a&gt; and try out the interactive River Trail shell &lt;a href="http://rivertrail.github.com/interactive"&gt;http://rivertrail.github.com/interactive&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;For a video overview, see  &lt;a href="http://www.youtube.com/watch?v=jueg6zB5XaM"&gt;http://www.youtube.com/watch?v=jueg6zB5XaM&lt;/a&gt; .&lt;/p&gt;  &lt;h1&gt;ParallelArray&lt;/h1&gt;  &lt;p&gt;the &lt;b&gt;ParallelArray&lt;/b&gt;&lt;i&gt; &lt;/i&gt;type is the central component of this API &amp;amp; is a JS object that contains ordered collections of scalars – i.e. multidimensional uniform arrays. A &lt;b&gt;shape&lt;/b&gt; property describes the dimensionality and size– e.g. a 2D RGBA image will have shape [height, width, 4]. &lt;i&gt;&lt;/i&gt;ParallelArrays are immutable &amp;amp; fluent – they are manipulated by invoking methods on them which produce new ParallelArray objects. ParallelArray supports several constructors over arrays, functions &amp;amp; even the canvas.&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;// Create an empty Parallel Array&lt;/p&gt;  &lt;p&gt;&lt;b&gt;var &lt;/b&gt;&lt;b&gt;pa = &lt;/b&gt;&lt;b&gt;new &lt;/b&gt;&lt;b&gt;ParallelArray();&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;// pa0 = &amp;lt;&amp;gt;&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;// Create a ParallelArray out of a nested JS array.&lt;/p&gt;  &lt;p&gt;// Note that the inner arrays are also ParallelArrays&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;var pa = new ParallelArray([ [0,1], [2,3], [4,5] ]);&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;// pa1 = &amp;lt;&amp;lt;0,1&amp;gt;, &amp;lt;2,3&amp;gt;, &amp;lt;4.5&amp;gt;&amp;gt;&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;// Create a two-dimensional ParallelArray with shape [3, 2] using the comprehension constructor&lt;/p&gt;  &lt;p&gt;&lt;b&gt;var &lt;/b&gt;&lt;b&gt;pa = &lt;/b&gt;&lt;b&gt;new &lt;/b&gt;&lt;b&gt;ParallelArray([3, 2],&lt;/b&gt;&lt;b&gt; function&lt;/b&gt;&lt;b&gt;(iv){&lt;/b&gt;&lt;b&gt;return &lt;/b&gt;&lt;b&gt;iv[0] * iv[1];});&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;// pa7 = &amp;lt;&amp;lt;0,0&amp;gt;, &amp;lt;0,1&amp;gt;, &amp;lt;0,2&amp;gt;&amp;gt;&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;// Create a ParallelArray from canvas.  This creates a PA with shape [w, h, 4],&lt;/p&gt;  &lt;p&gt;&lt;b&gt;var &lt;/b&gt;&lt;b&gt;pa = &lt;/b&gt;&lt;b&gt;new &lt;/b&gt;&lt;b&gt;ParallelArray(canvas);&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;// pa8 = CanvasPixelArray&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;ParallelArray exposes fluent API functions that take an elemental JS function for data manipulation: &lt;a href="https://github.com/RiverTrail/RiverTrail/wiki/map"&gt;map&lt;/a&gt;, &lt;a href="https://github.com/RiverTrail/RiverTrail/wiki/combine"&gt;combine&lt;/a&gt;, &lt;a href="https://github.com/RiverTrail/RiverTrail/wiki/scan"&gt;scan&lt;/a&gt;, &lt;a href="https://github.com/RiverTrail/RiverTrail/wiki/filter"&gt;filter&lt;/a&gt;, and &lt;a href="https://github.com/RiverTrail/RiverTrail/wiki/scatter"&gt;scatter&lt;/a&gt; that return a new ParallelArray. Other functions are scalar - &lt;a href="https://github.com/RiverTrail/RiverTrail/wiki/reduce"&gt;reduce&lt;/a&gt;  returns a scalar value &amp;amp; &lt;a href="https://github.com/RiverTrail/RiverTrail/wiki/get"&gt;get&lt;/a&gt; returns the value located at a given index.&lt;/p&gt;  &lt;p&gt;The onus is on the developer to ensure that the elemental function does not defeat data parallelization optimization (avoid global var manipulation, recursion).&lt;/p&gt;  &lt;p&gt;For &lt;b&gt;reduce&lt;/b&gt; &amp;amp; &lt;b&gt;scan&lt;/b&gt;, order is not guaranteed - the onus is on the dev to provide an elemental function that is commutative and associative so that scan will be deterministic – E.g. Sum is associative, but Avg is not.&lt;/p&gt;  &lt;h1&gt;map&lt;/h1&gt;  &lt;p&gt;Applies a provided elemental function to each element of the source array and stores the result in the corresponding position in the result array. The &lt;i&gt;map &lt;/i&gt;method is shape preserving &amp;amp; &lt;i&gt;index free &lt;/i&gt;- can not inspect neighboring values.&lt;/p&gt;  &lt;p&gt;   &lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt; // Adding one to each element.  &lt;p&gt;&lt;strong&gt;var source = new ParallelArray([1,2,3,4,5]);&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;var plusOne = source.map(function inc(v) { &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;    return v+1; });&lt;/strong&gt; //&amp;lt;2,3,4,5,6&amp;gt;&lt;/p&gt;  &lt;h1&gt;combine&lt;/h1&gt;  &lt;p&gt;Combine is similar to &lt;a href="https://github.com/RiverTrail/RiverTrail/wiki/map"&gt;map&lt;/a&gt;, except an index is provided. This allows elemental functions to access elements from the source array relative to the one at the current index position. While the &lt;i&gt;map &lt;/i&gt;method operates on the outermost dimension only, &lt;i&gt;combine&lt;/i&gt;, can choose how deep to traverse - it provides a depth argument to specify the number of dimensions it iterates over. The elemental function of &lt;i&gt;combine &lt;/i&gt;accesses the source array &amp;amp; the current index within it - element is computed by calling the &lt;b&gt;&lt;i&gt;get&lt;/i&gt;&lt;/b&gt;&lt;i&gt; &lt;/i&gt;method of the source &lt;b&gt;ParallelArray&lt;/b&gt; object with index i as argument. It&lt;i&gt; &lt;/i&gt;requires more code but is more expressive. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;var source = new ParallelArray([1,2,3,4,5]);&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;var plusOne = source.combine(function inc(i) { return this.get(i)+1; });&lt;/strong&gt;&lt;/p&gt;  &lt;h1&gt;reduce&lt;/h1&gt;  &lt;p&gt;reduces the elements from an array to a single scalar result – e.g. Sum. &lt;i&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;// Calculate the sum of the elements&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;var source = new ParallelArray([1,2,3,4,5]);&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;var sum = source.reduce(function plus(a,b) { return a+b; });&lt;/strong&gt;&lt;/p&gt;  &lt;h1&gt;scan&lt;/h1&gt;  &lt;p&gt;Like &lt;b&gt;reduce&lt;/b&gt;, but stores the intermediate results – return a ParallelArray whose ith elements is the results of using the elemental function to reduce the elements between 0 and I in the original ParallelArray.&lt;/p&gt;  &lt;p&gt;// do a partial sum&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;var source = new ParallelArray([1,2,3,4,5]);&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;var psum = source.scan(function plus(a,b) { return a+b; });&lt;/strong&gt; //&amp;lt;1, 3, 6, 10, 15&amp;gt;&lt;/p&gt;  &lt;h1&gt;scatter&lt;/h1&gt;  &lt;p&gt;a reordering function - specify for a certain source index where it should be stored in the result array.&lt;/p&gt;  &lt;p&gt;An optional conflict function can prevent an exception if two source values are assigned the same position of the result:&lt;/p&gt;  &lt;p&gt;&lt;code&gt;&lt;strong&gt;var source = new ParallelArray([1,2,3,4,5]);&lt;/strong&gt;&lt;/code&gt;&lt;/p&gt;  &lt;p&gt;&lt;code&gt;&lt;strong&gt;var reorder = source.scatter([4,0,3,1,2]);&lt;/strong&gt; &lt;/code&gt;&lt;code&gt;// &amp;lt;2, 4, 5, 3, 1&amp;gt;&lt;/code&gt;&lt;/p&gt;  &lt;p&gt;&lt;code&gt;// if there is a conflict use the max. use 33 as a default value.&lt;/code&gt;&lt;/p&gt;  &lt;p&gt;&lt;code&gt;&lt;strong&gt;var reorder = source.scatter([4,0,3,4,2], 33, function max(a, b) {return a&amp;gt;b?a:b; });&lt;/strong&gt; &lt;/code&gt;&lt;code&gt;//&amp;lt;2, 33, 5, 3, 4&amp;gt;&lt;/code&gt;&lt;/p&gt;  &lt;h1&gt;filter&lt;/h1&gt;  &lt;p&gt;// filter out values that are not even&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;var source = new ParallelArray([1,2,3,4,5]);&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;var even = source.filter(function even(iv) { return (this.get(iv) % 2) == 0; });&lt;/strong&gt; // &amp;lt;2,4&amp;gt;&lt;/p&gt;  &lt;h1&gt;Flatten&lt;/h1&gt;  &lt;p&gt;used to collapse the outer dimensions of an array into a single dimension.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;pa = new ParallelArray([ [1,2], [3,4] ]);&lt;/strong&gt; // &amp;lt;&amp;lt;1,2&amp;gt;,&amp;lt;3,4&amp;gt;&amp;gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;pa.flatten();&lt;/strong&gt; // &amp;lt;1,2,3,4&amp;gt;&lt;/p&gt;  &lt;h1&gt;Partition&lt;/h1&gt;  &lt;p&gt;used to restore the original shape of the array. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;var pa = new ParallelArray([1,2,3,4]);&lt;/strong&gt; // &amp;lt;1,2,3,4&amp;gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;pa.partition(2);&lt;/strong&gt; // &amp;lt;&amp;lt;1,2&amp;gt;,&amp;lt;3,4&amp;gt;&amp;gt;&lt;/p&gt;  &lt;h1&gt;Get&lt;/h1&gt;  &lt;p&gt;return value found at the indices or undefined if no such value exists.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;var pa = new ParallelArray([0,1,2,3,4], [10,11,12,13,14], [20,21,22,23,24])&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;pa.get([1,1]);&lt;/strong&gt; // 11 &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;pa.get([1]);&lt;/strong&gt; // &amp;lt;10,11,12,13,14&amp;gt;&lt;/p&gt; &lt;img src="http://geekswithblogs.net/JoshReuben/aggbug/151389.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>JoshReuben</dc:creator>
            <guid>http://geekswithblogs.net/JoshReuben/archive/2012/11/29/rivertrail---javascript-gppgu-data-parallelism.aspx</guid>
            <pubDate>Thu, 29 Nov 2012 07:02:51 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/JoshReuben/comments/151389.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/JoshReuben/archive/2012/11/29/rivertrail---javascript-gppgu-data-parallelism.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/JoshReuben/comments/commentRss/151389.aspx</wfw:commentRss>
        </item>
        <item>
            <title>ASPNET WebAPI REST Guidance</title>
            <link>http://geekswithblogs.net/JoshReuben/archive/2012/10/28/aspnet-webapi-rest-guidance.aspx</link>
            <description>&lt;p&gt;Originally posted on: &lt;a href='http://geekswithblogs.net/JoshReuben/archive/2012/10/28/aspnet-webapi-rest-guidance.aspx'&gt;http://geekswithblogs.net/JoshReuben/archive/2012/10/28/aspnet-webapi-rest-guidance.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;ASP.NET Web API is an ideal platform for building RESTful applications on the .NET Framework. While I may be more partial to NodeJS these days, there is no denying that WebAPI is a well engineered framework.&lt;/p&gt;  &lt;p&gt;What follows is my investigation of how to leverage WebAPI to construct a RESTful frontend API.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;h2&gt;The Advantages of REST Methodology over SOAP&lt;/h2&gt;  &lt;ul&gt;   &lt;li&gt;Simpler API for CRUD ops&lt;/li&gt;    &lt;li&gt;Standardize Development methodology - consistent and intuitive&lt;/li&gt;    &lt;li&gt;Standards based à client interop&lt;/li&gt;    &lt;li&gt;Wide industry adoption, Ease of use à easy to add new devs&lt;/li&gt;    &lt;li&gt;Avoid service method signature blowout&lt;/li&gt;    &lt;li&gt;Smaller payloads than SOAP&lt;/li&gt;    &lt;li&gt;Stateless à no session data means multi-tenant scalability&lt;/li&gt;    &lt;li&gt;Cache-ability&lt;/li&gt;    &lt;li&gt;Testability &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt; &lt;/p&gt;  &lt;h2&gt;&lt;a name="_Toc339209821"&gt;General RESTful API Design Overview&lt;/a&gt;&lt;/h2&gt;  &lt;p&gt;· utilize HTTP Protocol - Usage of HTTP methods for CRUD, standard HTTP response codes, common HTTP headers and Mime Types &lt;/p&gt;  &lt;p&gt;· Resources are mapped to URLs, actions are mapped to verbs and the rest goes in the headers.&lt;/p&gt;  &lt;p&gt;· keep the API semantic, resource-centric – A RESTful, resource-oriented service exposes a URI for every piece of data the client might want to operate on. A REST-RPC Hybrid exposes a URI for every operation the client might perform: one URI to fetch a piece of data, a different URI to delete that same data. utilize Uri to specify CRUD op, version, language, output format:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;http://api.MyApp.com/{ver}/{lang}/{resource_type}/{resource_id}.{output_format}?{key&amp;amp;filters}&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;· entity CRUD operations are matched to HTTP methods:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;· Create - &lt;b&gt;POST&lt;/b&gt; / &lt;b&gt;PUT&lt;/b&gt; &lt;/li&gt;    &lt;li&gt;· Read – &lt;b&gt;GET&lt;/b&gt; - cacheable &lt;/li&gt;    &lt;li&gt;· Update – &lt;b&gt;PUT&lt;/b&gt; &lt;/li&gt;    &lt;li&gt;· Delete - &lt;b&gt;DELETE&lt;/b&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;· Use Uris to represent a hierarchies - Resources in RESTful URLs are often chained &lt;/p&gt;  &lt;p&gt;· Statelessness allows for idempotency – apply an op multiple times without changing the result. &lt;b&gt;POST&lt;/b&gt; is non-idempotent, the rest are idempotent (if &lt;b&gt;DELETE&lt;/b&gt; flags records instead of deleting them).&lt;/p&gt;  &lt;p&gt;· Cache indication - Leverage HTTP headers to label cacheable content and indicate the permitted duration of cache&lt;/p&gt;  &lt;p&gt;&lt;a name="put-vs-post"&gt;· &lt;b&gt;PUT&lt;/b&gt;&lt;/a&gt; vs &lt;b&gt;POST&lt;/b&gt; - The client uses &lt;b&gt;PUT&lt;/b&gt; when it determines which URI (Id key) the new resource should have. The client uses &lt;b&gt;POST&lt;/b&gt; when the server determines they key. &lt;b&gt;PUT&lt;/b&gt; takes a second param – the id. &lt;b&gt;POST&lt;/b&gt; creates a new resource. The server assigns the URI for the new object and returns this URI as part of the response message. Note: The &lt;b&gt;PUT&lt;/b&gt; method replaces the entire entity. That is, the client is expected to send a complete representation of the updated product. If you want to support partial updates, the &lt;b&gt;PATCH&lt;/b&gt; method is preferred&lt;/p&gt;  &lt;p&gt;DELETE deletes a resource at a specified URI – typically takes an id param&lt;/p&gt;  &lt;p&gt;· Leverage Common HTTP Response Codes in response headers&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;b&gt;200&lt;/b&gt; OK: Success &lt;/li&gt;    &lt;li&gt;&lt;b&gt;201&lt;/b&gt; Created - Used on POST request when creating a new resource. &lt;/li&gt;    &lt;li&gt;&lt;b&gt;304&lt;/b&gt; Not Modified: no new data to return. &lt;/li&gt;    &lt;li&gt;&lt;b&gt;400&lt;/b&gt; Bad Request: Invalid Request. &lt;/li&gt;    &lt;li&gt;&lt;b&gt;401&lt;/b&gt; Unauthorized: Authentication. &lt;/li&gt;    &lt;li&gt;&lt;b&gt;403&lt;/b&gt; Forbidden: Authorization &lt;/li&gt;    &lt;li&gt;&lt;b&gt;404&lt;/b&gt; Not Found – entity does not exist. &lt;/li&gt;    &lt;li&gt;&lt;b&gt;406&lt;/b&gt; Not Acceptable – bad params. &lt;/li&gt;    &lt;li&gt;&lt;b&gt;409 Conflict&lt;/b&gt; - For POST / PUT requests if the resource already exists. &lt;/li&gt;    &lt;li&gt;&lt;b&gt;500&lt;/b&gt; Internal Server Error &lt;/li&gt;    &lt;li&gt;&lt;b&gt;503&lt;/b&gt; Service Unavailable &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;· Leverage uncommon HTTP Verbs to reduce payload sizes&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;b&gt;HEAD - &lt;/b&gt;retrieves just the resource meta-information. &lt;/li&gt;    &lt;li&gt;&lt;b&gt;OPTIONS &lt;/b&gt;returns the actions supported for the specified resource. &lt;/li&gt;    &lt;li&gt;&lt;b&gt;PATCH - &lt;/b&gt;partial modification of a resource. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;· When using &lt;b&gt;PUT, POST &lt;/b&gt;or&lt;b&gt; PATCH&lt;/b&gt;, send the data as a document in the body of the request. Don't use query parameters to alter state. &lt;/p&gt;  &lt;p&gt;· Utilize Headers for content negotiation, caching, authorization, throttling&lt;/p&gt;  &lt;p&gt;o Content Negotiation – choose representation (e.g. JSON or XML and version), language &amp;amp; compression. Signal via &lt;b&gt;RequestHeader.Accept&lt;/b&gt; &amp;amp; &lt;b&gt;ResponseHeader.Content-Type&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;code&gt;Accept: &lt;/code&gt;application/json&lt;code&gt;;version=1.0&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;code&gt;&lt;strong&gt;Accept-Language: en-US&lt;/strong&gt;&lt;/code&gt;&lt;/p&gt;  &lt;p&gt;&lt;code&gt;&lt;strong&gt;Accept-Charset: UTF-8&lt;/strong&gt;&lt;/code&gt;&lt;/p&gt;  &lt;p&gt;&lt;code&gt;&lt;strong&gt;Accept-Encoding: gzip&lt;/strong&gt;&lt;/code&gt;&lt;/p&gt;  &lt;p&gt;o Caching - ResponseHeader: &lt;strong&gt;Expires&lt;/strong&gt; (absolute expiry time) &lt;strong&gt;or&lt;/strong&gt;&lt;strong&gt; Cache-Control&lt;/strong&gt; (relative expiry time) &lt;/p&gt;  &lt;p&gt;o Authorization - basic HTTP authentication uses the RequestHeader.&lt;b&gt;Authorization&lt;/b&gt; to specify a base64 encoded string "&lt;em&gt;username&lt;/em&gt;:&lt;em&gt;password&lt;/em&gt;". can be used in combination with SSL/TLS (HTTPS) and leverage &lt;a href="http://oauth.net/2/"&gt;OAuth2&lt;/a&gt; 3&lt;sup&gt;rd&lt;/sup&gt; party token-claims authorization.&lt;/p&gt;  &lt;p&gt;&lt;code&gt;Authorization: Basic sQJlaTp5ZWFslylnaNZ=&lt;/code&gt;&lt;/p&gt;  &lt;p&gt;o Rate Limiting - Not currently part of HTTP so specify non-standard headers prefixed with &lt;em&gt;&lt;b&gt;X-&lt;/b&gt;&lt;/em&gt; in the ResponseHeader.&lt;/p&gt;  &lt;p&gt;&lt;code&gt;X-RateLimit-Limit: 10000&lt;/code&gt;&lt;/p&gt;  &lt;p&gt;&lt;code&gt;X-RateLimit-Remaining: 9990&lt;/code&gt;&lt;/p&gt;  &lt;p&gt;· HATEOAS Methodology - Hypermedia As The Engine Of Application State – leverage API as a state machine where resources are states and the transitions between states are links between resources and are included in their representation (hypermedia) – get API metadata signatures from the response &lt;b&gt;Link&lt;/b&gt; header - in a truly REST based architecture any URL, except the initial URL, can be changed, &lt;strong&gt;even to other servers&lt;/strong&gt;&lt;b&gt;,&lt;/b&gt; without worrying about the client.&lt;/p&gt;  &lt;p&gt;&lt;a name="overview"&gt;· error responses - &lt;/a&gt;Do not just send back a 200 OK with every response. Response should consist of HTTP error &lt;b&gt;status&lt;/b&gt; code (JQuery has automated support for this), A human readable &lt;b&gt;message&lt;/b&gt; , A &lt;em&gt;&lt;b&gt;Link&lt;/b&gt;&lt;/em&gt; to a meaningful state transition , &amp;amp; the original &lt;b&gt;data&lt;/b&gt; payload that was problematic.&lt;/p&gt;  &lt;p&gt;· the URIs will typically map to a server-side controller and a method name specified by the type of request method. Stuff all your calls into just four methods is not as crazy as it sounds. &lt;/p&gt;  &lt;p&gt;· &lt;i&gt;Scoping - Path variables look like you’re traversing a hierarchy, and query variables look like you’re passing arguments into an algorithm&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;a name="mapping-uris"&gt;· Mapping URIs to Controllers&lt;/a&gt; - have one controller for each resource is not a rule – can consolidate - route requests to the appropriate controller and action method&lt;/p&gt;  &lt;p&gt;&lt;a name="consistent-uris"&gt;· Keep URls Consistent - &lt;/a&gt;Sometimes it’s tempting to just shorten our URIs. not recommend this as this can cause confusion&lt;/p&gt;  &lt;p&gt;&lt;a name="join-naming"&gt;· Join Naming – for m-m entity relations there may be multiple hierarchy traversal paths &lt;/a&gt;&lt;a name="versioning"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· Routing – useful level of indirection for versioning, server backend mocking in development&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;h1&gt;&lt;a name="_Toc339209822"&gt;ASPNET WebAPI Considerations&lt;/a&gt;&lt;/h1&gt;  &lt;p&gt;ASPNET WebAPI implements a lot (but not all) RESTful API design considerations as part of its infrastructure and via its coding convention.&lt;/p&gt;  &lt;h2&gt;&lt;a name="_Toc339209823"&gt;Overview&lt;/a&gt;&lt;/h2&gt;  &lt;p&gt;When developing an API there are basically three main steps:&lt;/p&gt;  &lt;p&gt;1. Plan out your URIs&lt;/p&gt;  &lt;p&gt;2. Setup return values and response codes for your URIs&lt;/p&gt;  &lt;p&gt;3. Implement a framework for your API.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;h2&gt;&lt;a name="_Toc339209825"&gt;Design&lt;/a&gt;&lt;/h2&gt;  &lt;p&gt;· Leverage Models MVC folder&lt;/p&gt;  &lt;p&gt;· Repositories – support IoC for tests, abstraction&lt;/p&gt;  &lt;p&gt;· Create DTO classes – a level of indirection decouples &amp;amp; allows swap out&lt;/p&gt;  &lt;p&gt;· Self links can be generated using the &lt;b&gt;UrlHelper&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;· Use &lt;b&gt;IQueryable&lt;/b&gt; to support projections across the wire&lt;/p&gt;  &lt;p&gt;· Models can support restful navigation properties – &lt;b&gt;ICollection&amp;lt;T&amp;gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;· async mechanism for long running ops - return a response with a ticket – the client can then poll or be pushed the final result later.&lt;/p&gt;  &lt;p&gt;· Design for testability - Test using &lt;b&gt;HttpClient , JQuery (&lt;/b&gt; $.getJSON , $.each) &lt;b&gt;, fiddler, browser debug&lt;/b&gt;. Leverage &lt;b&gt;IDependencyResolver&lt;/b&gt; – IoC wrapper for mocking&lt;/p&gt;  &lt;p&gt;· Easy debugging - IE &lt;b&gt;F12&lt;/b&gt; developer tools:&lt;b&gt; Network&lt;/b&gt; tab, &lt;b&gt;Request Headers&lt;/b&gt; tab&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;h2&gt;&lt;a name="_Toc339209826"&gt;Routing&lt;/a&gt;&lt;/h2&gt;  &lt;p&gt;· HTTP request method is matched to the method name. (This rule applies only to &lt;b&gt;GET, POST, PUT&lt;/b&gt;, and &lt;b&gt;DELETE&lt;/b&gt; requests.)&lt;/p&gt;  &lt;p&gt;· &lt;b&gt;&lt;i&gt;{id},&lt;/i&gt;&lt;/b&gt; if present, is matched to a method parameter named &lt;i&gt;id&lt;/i&gt;.&lt;/p&gt;  &lt;p&gt;· Query parameters are matched to parameter names when possible&lt;/p&gt;  &lt;p&gt;· Done in config via &lt;b&gt;Routes.MapHttpRoute&lt;/b&gt; – similar to MVC routing&lt;/p&gt;  &lt;p&gt;· Can alternatively:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;o decorate controller action methods with &lt;b&gt;HttpDelete&lt;/b&gt;, &lt;b&gt;HttpGet&lt;/b&gt;, &lt;b&gt;HttpHead&lt;/b&gt;,&lt;b&gt;HttpOptions&lt;/b&gt;, &lt;b&gt;HttpPatch&lt;/b&gt;, &lt;b&gt;HttpPost&lt;/b&gt;, or &lt;b&gt;HttpPut&lt;/b&gt;., + the &lt;b&gt;ActionAttribute&lt;/b&gt; &lt;/li&gt;    &lt;li&gt;o use &lt;b&gt;AcceptVerbsAttribute&lt;/b&gt; to support other HTTP verbs: e.g. PATCH, HEAD &lt;/li&gt;    &lt;li&gt;o use &lt;b&gt;NonActionAttribute&lt;/b&gt; to prevent a method from getting invoked as an action &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;· route table Uris can support placeholders (via curly braces{}) – these can support default values and constraints, and optional values&lt;/p&gt;  &lt;p&gt;· The framework selects the first route in the route table that matches the URI.&lt;/p&gt;  &lt;h2&gt;&lt;a name="_Toc339209827"&gt;Response customization&lt;/a&gt;&lt;/h2&gt;  &lt;p&gt;· &lt;b&gt;Response code:&lt;/b&gt; By default, the Web API framework sets the response status code to &lt;b&gt;200 (OK).&lt;/b&gt; But according to the HTTP/1.1 protocol, when a POST request results in the creation of a resource, the server should reply with status &lt;b&gt;201 (Created).&lt;/b&gt; Non Get methods should return &lt;b&gt;HttpResponseMessage&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;· &lt;b&gt;Location:&lt;/b&gt; When the server creates a resource, it should include the URI of the new resource in the Location header of the response.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;public &lt;font style="background-color: #ffff00"&gt;HttpResponseMessage&lt;/font&gt; PostProduct(Product item)&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;{      &lt;br /&gt;    item = repository.Add(item);&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;    var response = Request.&lt;font style="background-color: #ffff00"&gt;CreateResponse&lt;/font&gt;&amp;lt;Product&amp;gt;(&lt;font style="background-color: #ffff00"&gt;HttpStatusCode&lt;/font&gt;.Created, item);&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;    string uri = Url.Link("DefaultApi", new { id = item.Id });&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;    response.Headers.Location = new Uri(uri);&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;    return response;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/p&gt;  &lt;h2&gt;&lt;a name="_Toc339209828"&gt;Validation&lt;/a&gt;&lt;/h2&gt;  &lt;p&gt;· Decorate Models / DTOs with &lt;b&gt;System.ComponentModel.DataAnnotations&lt;/b&gt; properties &lt;b&gt;RequiredAttribute&lt;/b&gt;, &lt;b&gt;RangeAttribute&lt;/b&gt;. &lt;/p&gt;  &lt;p&gt;· Check payloads using &lt;b&gt;ModelState&lt;/b&gt;&lt;b&gt;.&lt;/b&gt;&lt;b&gt;IsValid&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;· &lt;u&gt;Under posting&lt;/u&gt; – leave out values in JSON payload à JSON formatter assigns a default value. Use with &lt;b&gt;RequiredAttribute&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;· &lt;u&gt;Over-posting&lt;/u&gt; - if model has RO properties à use DTO instead of model&lt;/p&gt;  &lt;p&gt;· Can hook into pipeline by deriving from &lt;b&gt;ActionFilterAttribute&lt;/b&gt; &amp;amp; overriding &lt;b&gt;OnActionExecuting&lt;/b&gt;&lt;/p&gt;  &lt;h2&gt;&lt;a name="_Toc339209829"&gt;Config&lt;/a&gt;&lt;/h2&gt;  &lt;p&gt;· Done in&lt;b&gt; App_Start&lt;/b&gt; folder &amp;gt; &lt;b&gt;WebApiConfig.cs&lt;/b&gt; – static Register method: &lt;b&gt;HttpConfiguration&lt;/b&gt; param: The &lt;b&gt;HttpConfiguration&lt;/b&gt; object contains the following members.     &lt;/p&gt;&lt;table border="1" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="top" width="25%"&gt;           &lt;p&gt;&lt;b&gt;Member&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="74%"&gt;           &lt;p&gt;&lt;b&gt;Description&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="25%"&gt;           &lt;p&gt;&lt;b&gt;DependencyResolver&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="74%"&gt;           &lt;p&gt;Enables dependency injection for controllers. &lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="25%"&gt;           &lt;p&gt;&lt;b&gt;Filters&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="74%"&gt;           &lt;p&gt;Action filters – e.g. exception filters.&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="25%"&gt;           &lt;p&gt;&lt;b&gt;Formatters&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="74%"&gt;           &lt;p&gt;&lt;a href="http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters"&gt;Media-type formatters&lt;/a&gt;. by default contains &lt;b&gt;JsonFormatter, XmlFormatter&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="25%"&gt;           &lt;p&gt;&lt;b&gt;IncludeErrorDetailPolicy&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="74%"&gt;           &lt;p&gt;Specifies whether the server should include error details, such as exception messages and stack traces, in HTTP response messages.&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="25%"&gt;           &lt;p&gt;&lt;b&gt;Initializer&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="74%"&gt;           &lt;p&gt;A function that performs final initialization of the &lt;b&gt;HttpConfiguration&lt;/b&gt;.&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="25%"&gt;           &lt;p&gt;&lt;b&gt;MessageHandlers&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="74%"&gt;           &lt;p&gt;&lt;a href="http://www.asp.net/web-api/overview/working-with-http/http-message-handlers"&gt;HTTP message handlers&lt;/a&gt; - plug into pipeline&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="25%"&gt;           &lt;p&gt;&lt;b&gt;ParameterBindingRules&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="74%"&gt;           &lt;p&gt;A collection of rules for binding parameters on controller actions.&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="25%"&gt;           &lt;p&gt;&lt;b&gt;Properties&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="74%"&gt;           &lt;p&gt;A generic property bag.&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="25%"&gt;           &lt;p&gt;&lt;b&gt;Routes&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="74%"&gt;           &lt;p&gt;The collection of routes.&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="25%"&gt;           &lt;p&gt;&lt;b&gt;Services&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="74%"&gt;           &lt;p&gt;The collection of services.&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt;   &lt;p&gt;· Configure &lt;b&gt;JsonFormatter&lt;/b&gt; for circular references to support links: &lt;b&gt;PreserveReferencesHandling.Objects&lt;/b&gt;&lt;/p&gt;  &lt;h2&gt;&lt;a name="_Toc339209830"&gt;Documentation generation&lt;/a&gt;&lt;/h2&gt;  &lt;p&gt;· create a help page for a web API, by using the &lt;b&gt;ApiExplorer&lt;/b&gt; class.&lt;/p&gt;  &lt;p&gt;· The &lt;b&gt;ApiExplorer&lt;/b&gt; class provides descriptive information about the APIs exposed by a web API as an &lt;b&gt;ApiDescription&lt;/b&gt; collection&lt;/p&gt;  &lt;p&gt;· create the help page as an MVC view&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;public ILookup&amp;lt;string, &lt;font style="background-color: #ffff00"&gt;ApiDescription&lt;/font&gt;&amp;gt; GetApis()       &lt;br /&gt;        {       &lt;br /&gt;            return _explorer.ApiDescriptions.ToLookup(       &lt;br /&gt;                api =&amp;gt; api.ActionDescriptor.ControllerDescriptor.ControllerName);&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;· provide documentation for your APIs by implementing the &lt;b&gt;IDocumentationProvider&lt;/b&gt; interface. Documentation strings can come from any source that you like – e.g. extract XML comments or define custom attributes to apply to the controller&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;[ApiDoc("Gets a product by ID.")]      &lt;br /&gt;[ApiParameterDoc("id", "The ID of the product.")]       &lt;br /&gt;public HttpResponseMessage Get(int id)&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;· &lt;b&gt;GlobalConfiguration.Configuration.Services&lt;/b&gt; – add the documentation Provider&lt;/p&gt;  &lt;p&gt;· To hide an API from the &lt;b&gt;ApiExplorer&lt;/b&gt;, add the &lt;b&gt;ApiExplorerSettingsAttribute&lt;/b&gt;&lt;/p&gt;  &lt;h2&gt;&lt;a name="_Toc339209831"&gt;Plugging into the Message Handler pipeline&lt;/a&gt;&lt;/h2&gt;  &lt;p&gt;· Plug into request / response pipeline – derive from &lt;b&gt;DelegatingHandler&lt;/b&gt; and override the&lt;b&gt;SendAsync&lt;/b&gt; method – e.g. for logging error codes, adding a custom response header&lt;/p&gt;  &lt;p&gt;· Can be applied globally or to a specific route&lt;/p&gt;  &lt;h2&gt;&lt;a name="_Toc339209832"&gt;Exception Handling&lt;/a&gt;&lt;/h2&gt;  &lt;p&gt;· Throw &lt;b&gt;HttpResponseException&lt;/b&gt; on method failures – specify &lt;b&gt;HttpStatusCode&lt;/b&gt; enum value – examine this enum, as its values map well to typical op problems&lt;/p&gt;  &lt;p&gt;· Exception filters – derive from &lt;b&gt;ExceptionFilterAttribute&lt;/b&gt; &amp;amp; override &lt;b&gt;OnException&lt;/b&gt;. Apply on Controller or action methods, or add to global &lt;b&gt;HttpConfiguration.Filters&lt;/b&gt; collection&lt;/p&gt;  &lt;p&gt;· &lt;b&gt;HttpError&lt;/b&gt; object provides a consistent way to return error information in the &lt;b&gt;HttpResponseException&lt;/b&gt; response body.&lt;/p&gt;  &lt;p&gt;· For model validation, you can pass the model state to &lt;b&gt;CreateErrorResponse&lt;/b&gt;, to include the validation errors in the response&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;public HttpResponseMessage PostProduct(Product item)      &lt;br /&gt;{       &lt;br /&gt;    if (!ModelState.&lt;font style="background-color: #ffff00"&gt;IsValid&lt;/font&gt;)       &lt;br /&gt;    {       &lt;br /&gt;        return Request.&lt;font style="background-color: #ffff00"&gt;CreateErrorResponse&lt;/font&gt;(HttpStatusCode.BadRequest, ModelState);&lt;/strong&gt;&lt;/p&gt;  &lt;h2&gt;&lt;a name="_Toc339209833"&gt;Cookie Management&lt;/a&gt;&lt;/h2&gt;  &lt;p&gt;· &lt;b&gt;Cookie&lt;/b&gt; header in request and &lt;b&gt;Set-Cookie&lt;/b&gt; headers in a response - Collection of &lt;b&gt;CookieState&lt;/b&gt; objects&lt;/p&gt;  &lt;p&gt;· Specify &lt;b&gt;Expiry, max-age&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;resp.Headers.AddCookies(new CookieHeaderValue[] { cookie });&lt;/p&gt;  &lt;h2&gt;&lt;a name="_Toc339209834"&gt;Internet Media Types, formatters and serialization&lt;/a&gt;&lt;/h2&gt;  &lt;p&gt;· Defaults to &lt;b&gt;application/json&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;· Request &lt;b&gt;Accept&lt;/b&gt; header and response &lt;b&gt;Content-Type&lt;/b&gt; header&lt;/p&gt;  &lt;p&gt;· determines how Web API serializes and deserializes the HTTP message body. There is built-in support for XML, JSON, and form-urlencoded data&lt;/p&gt;  &lt;p&gt;· customizable formatters can be inserted into the pipeline&lt;/p&gt;  &lt;p&gt;· POCO serialization is opt out via &lt;b&gt;JsonIgnoreAttribute&lt;/b&gt;, or use &lt;b&gt;DataMemberAttribute&lt;/b&gt; for optin&lt;/p&gt;  &lt;p&gt;· JSON serializer leverages NewtonSoft Json.NET&lt;/p&gt;  &lt;p&gt;· loosely structured JSON objects are serialzed as &lt;b&gt;JObject&lt;/b&gt; which derives from &lt;b&gt;Dynamic&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;· to handle circular references in json:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;json.SerializerSettings.&lt;font style="background-color: #ffff00"&gt;PreserveReferencesHandling&lt;/font&gt; =    PreserveReferencesHandling.All à {"$ref":"1"}.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;· To preserve object references in XML&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;[DataContract(IsReference=true)]&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;· Content negotiation&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;b&gt;Accept:&lt;/b&gt; Which media types are acceptable for the response, such as “application/json,” “application/xml,” or a custom media type such as "application/vnd.example+xml" &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Accept-Charset:&lt;/b&gt; Which character sets are acceptable, such as UTF-8 or ISO 8859-1. &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Accept-Encoding:&lt;/b&gt; Which content encodings are acceptable, such as gzip. &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Accept-Language:&lt;/b&gt; The preferred natural language, such as “en-us”. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;o Web API uses the Accept and Accept-Charset headers. (At this time, there is no built-in support for &lt;b&gt;Accept-Encoding &lt;/b&gt;or&lt;b&gt; Accept-Language&lt;/b&gt;.)&lt;/p&gt;  &lt;p&gt;· Controller methods can take JSON representations of DTOs as params – auto-deserialization&lt;/p&gt;  &lt;p&gt;· Typical JQuery GET request:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;function find() {&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;    var id = $('#prodId').val();&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;    $.&lt;font style="background-color: #ffff00"&gt;getJSON&lt;/font&gt;("api/products/" + id,&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;        function (data) {&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;            var str = data.Name + ': $' + data.Price;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;            $('#product').text(str);&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;        })&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;    .&lt;font style="background-color: #ffff00"&gt;fail&lt;/font&gt;(&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;        function (jqXHR, textStatus, err) {&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;            $('#product').text('Error: ' + err); &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;        });&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;}&lt;/strong&gt;            &lt;/p&gt;  &lt;p&gt;· Typical GET response:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;HTTP/1.1 200 OK&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Server: ASP.NET Development Server/10.0.0.0&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Date: Mon, 18 Jun 2012 04:30:33 GMT&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;X-AspNet-Version: 4.0.30319&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font style="background-color: #ffff00"&gt;Cache-Control&lt;/font&gt;: no-cache&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Pragma: no-cache&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Expires: -1&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font style="background-color: #ffff00"&gt;Content-Type&lt;/font&gt;: application/json; charset=utf-8&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Content-Length: 175&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Connection: Close&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;[{"Id":1,"Name":"TomatoSoup","Price":1.39,"ActualCost":0.99},{"Id":2,"Name":"Hammer", "Price":16.99,"ActualCost":10.00},{"Id":3,"Name":"Yo yo","Price":6.99,"ActualCost": 2.05}]&lt;/strong&gt;&lt;/p&gt;  &lt;h2&gt;True &lt;a name="_Toc339209835"&gt;OData support&lt;/a&gt;&lt;/h2&gt;  &lt;p&gt;· Leverage Query Options &lt;b&gt;$filter, $orderby, $top &lt;/b&gt;and&lt;b&gt; $skip&lt;/b&gt; to shape the results of controller actions annotated with the &lt;b&gt;[Queryable]&lt;/b&gt;attribute. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;[&lt;font style="background-color: #ffff00"&gt;Queryable&lt;/font&gt;]  &lt;br /&gt;public &lt;font style="background-color: #ffff00"&gt;IQueryable&lt;/font&gt;&amp;lt;Supplier&amp;gt; GetSuppliers()&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;· Query:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;~/Suppliers?&lt;font style="background-color: #ffff00"&gt;$filter=Name eq ‘Microsoft’&lt;/font&gt;&lt;/strong&gt;&lt;font style="background-color: #ffff00"&gt; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;· Applies the following selection filter on the server:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;GetSuppliers().&lt;font style="background-color: #ffff00"&gt;Where&lt;/font&gt;(s =&amp;gt; s.Name == “Microsoft”)&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;· Will pass the result to the formatter.&lt;/p&gt;  &lt;p&gt;· true support for the OData format is still limited - no support for creates, updates, deletes, $metadata and code generation etc&lt;/p&gt;  &lt;p&gt;· vnext: ability to configure how &lt;b&gt;EditLinks, SelfLinks &lt;/b&gt;and&lt;b&gt; Ids&lt;/b&gt; are generated &lt;/p&gt;  &lt;h2&gt;Self Hosting&lt;/h2&gt;  &lt;p&gt;no dependency on ASPNET or IIS:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;using (var server = new &lt;font style="background-color: #ffff00"&gt;HttpSelfHostServer&lt;/font&gt;(config))&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;{      &lt;br /&gt;    server.OpenAsync().Wait();&lt;/strong&gt;&lt;/p&gt;  &lt;h2&gt;&lt;a name="_Toc339209836"&gt;Tracing&lt;/a&gt;&lt;/h2&gt;  &lt;p&gt;· tracability tools, metrics – e.g. send to nagios&lt;/p&gt;  &lt;p&gt;· use your choice of tracing/logging library, whether that is ETW,&lt;a href="http://nlog-project.org/"&gt;NLog&lt;/a&gt;, &lt;a href="http://logging.apache.org/log4net/"&gt;log4net&lt;/a&gt;, or simply &lt;b&gt;System.Diagnostics.Trace&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;· To collect traces, implement the &lt;b&gt;ITraceWriter&lt;/b&gt; interface&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;public class SimpleTracer : &lt;font style="background-color: #ffff00"&gt;ITraceWriter&lt;/font&gt;       &lt;br /&gt;{       &lt;br /&gt;    public &lt;font style="background-color: #ffff00"&gt;void Trace&lt;/font&gt;(HttpRequestMessage request, string category, TraceLevel level,       &lt;br /&gt;        Action&amp;lt;TraceRecord&amp;gt; traceAction)       &lt;br /&gt;    {       &lt;br /&gt;        TraceRecord rec = new TraceRecord(request, category, level);       &lt;br /&gt;        traceAction(rec);       &lt;br /&gt;        WriteTrace(rec);&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;· register the service with config&lt;/p&gt;  &lt;p&gt;· programmatically trace – has helper extension methods:&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Configuration.Services.GetTraceWriter().Info(&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;· Performance tracing - pipeline writes traces at the beginning and end of an operation&lt;b&gt; - TraceRecord&lt;/b&gt; class includes a&lt;b&gt;TimeStamp&lt;/b&gt; property, &lt;b&gt;Kind&lt;/b&gt; property set to &lt;b&gt;TraceKind.Begin / End&lt;/b&gt;&lt;/p&gt;  &lt;h2&gt;&lt;a name="_Toc339209837"&gt;Security&lt;/a&gt;&lt;/h2&gt;  &lt;p&gt;· &lt;b&gt;Roles&lt;/b&gt; class methods: &lt;b&gt;RoleExists&lt;/b&gt;&lt;b&gt;, AddUserToRole&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;· &lt;b&gt;WebSecurity&lt;/b&gt; class methods: &lt;b&gt;UserExists, &lt;/b&gt;&lt;b&gt;.&lt;/b&gt;&lt;b&gt;CreateUserAndAccount&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;· &lt;b&gt;Request.IsAuthenticated&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;· Leverage &lt;b&gt;HTTP 401&lt;/b&gt; (Unauthorized) response&lt;/p&gt;  &lt;p&gt;· &lt;b&gt;[&lt;/b&gt;&lt;b&gt;Authorize&lt;/b&gt;&lt;b&gt;Attribute(&lt;/b&gt;&lt;b&gt;Roles&lt;/b&gt;&lt;b&gt;=&lt;/b&gt;&lt;b&gt;"Administrator"&lt;/b&gt;&lt;b&gt;)]&lt;/b&gt; – can be applied to Controller or its action methods&lt;/p&gt;  &lt;p&gt;· See section in WebApi document on "&lt;b&gt;Claim-based-security for ASP.NET Web APIs using DotNetOpenAuth"&lt;/b&gt; – adapt this to STS.--&amp;gt; Web API Host exposes secured Web APIs which can only be accessed by presenting a valid token issued by the trusted issuer. &lt;a href="http://zamd.net/2012/05/04/claim-based-security-for-asp-net-web-apis-using-dotnetopenauth/"&gt;http://zamd.net/2012/05/04/claim-based-security-for-asp-net-web-apis-using-dotnetopenauth/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· Use MVC membership provider infrastructure and add a &lt;b&gt;DelegatingHandler&lt;/b&gt; child class to the WebAPI pipeline - &lt;a href="http://stackoverflow.com/questions/11535075/asp-net-mvc-4-web-api-authentication-with-membership-provider"&gt;http://stackoverflow.com/questions/11535075/asp-net-mvc-4-web-api-authentication-with-membership-provider&lt;/a&gt; - this will perform the login actions&lt;/p&gt;  &lt;p&gt;· Then use &lt;b&gt;AuthorizeAttribute&lt;/b&gt; on controllers and methods for role mapping- &lt;a href="http://sixgun.wordpress.com/2012/02/29/asp-net-web-api-basic-authentication/"&gt;http://sixgun.wordpress.com/2012/02/29/asp-net-web-api-basic-authentication/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· Alternate option here is to rely on MVC App : &lt;a href="http://forums.asp.net/t/1831767.aspx/1"&gt;http://forums.asp.net/t/1831767.aspx/1&lt;/a&gt;&lt;/p&gt; &lt;img src="http://geekswithblogs.net/JoshReuben/aggbug/151093.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>JoshReuben</dc:creator>
            <guid>http://geekswithblogs.net/JoshReuben/archive/2012/10/28/aspnet-webapi-rest-guidance.aspx</guid>
            <pubDate>Sun, 28 Oct 2012 16:22:14 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/JoshReuben/comments/151093.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/JoshReuben/archive/2012/10/28/aspnet-webapi-rest-guidance.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/JoshReuben/comments/commentRss/151093.aspx</wfw:commentRss>
        </item>
        <item>
            <title>HPC Server Dynamic Job Scheduling: when jobs spawn jobs</title>
            <category>Parallelism</category>
            <link>http://geekswithblogs.net/JoshReuben/archive/2012/10/10/hpc-server-dynamic-job-scheduling-when-jobs-spawn-jobs.aspx</link>
            <description>&lt;p&gt;Originally posted on: &lt;a href='http://geekswithblogs.net/JoshReuben/archive/2012/10/10/hpc-server-dynamic-job-scheduling-when-jobs-spawn-jobs.aspx'&gt;http://geekswithblogs.net/JoshReuben/archive/2012/10/10/hpc-server-dynamic-job-scheduling-when-jobs-spawn-jobs.aspx&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;HPC Job Types&lt;/h2&gt;  &lt;p&gt;HPC has 3 types of jobs &lt;a href="http://technet.microsoft.com/en-us/library/cc972750(v=ws.10).aspx"&gt;http://technet.microsoft.com/en-us/library/cc972750(v=ws.10).aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· &lt;b&gt;Task Flow&lt;/b&gt; – vanilla sequence&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/34b65cd17146_CEE9/clip_image002_2.jpg" rel="lightbox"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/34b65cd17146_CEE9/clip_image002_thumb.jpg" width="221" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· &lt;b&gt;Parametric Sweep&lt;/b&gt; – concurrently run multiple instances of the same program, each with a different work unit input&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/34b65cd17146_CEE9/clip_image004_2.jpg" rel="lightbox"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/34b65cd17146_CEE9/clip_image004_thumb.jpg" width="244" height="180" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· &lt;b&gt;MPI&lt;/b&gt; – message passing between master &amp;amp; slave tasks&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/34b65cd17146_CEE9/clip_image006_2.jpg" rel="lightbox"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image006" border="0" alt="clip_image006" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/34b65cd17146_CEE9/clip_image006_thumb.jpg" width="233" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;u&gt;But when you try go outside the box &lt;/u&gt;– job tasks that spawn jobs, blocking the parent task – you run the risk of resource starvation, deadlocks, and recursive, non-converging or exponential blow-up. &lt;/p&gt;  &lt;p&gt;The solution to this is to write some performance monitoring and job scheduling code. You can do this in 2 ways:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;manually control scheduling - allocate/ de-allocate resources, change job priorities, pause &amp;amp; resume tasks , restrict long running tasks to specific compute clusters&lt;/li&gt;    &lt;li&gt;Semi-automatically - set threshold params for scheduling.&lt;/li&gt; &lt;/ol&gt;  &lt;h2&gt;How – Control Job Scheduling&lt;/h2&gt;  &lt;p&gt;In order to manage the tasks and resources that are associated with a job, you will need to access the &lt;b&gt;ISchedulerJob&lt;/b&gt; interface - &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.hpc.scheduler.ischedulerjob_members(v=vs.85).aspx"&gt;http://msdn.microsoft.com/en-us/library/microsoft.hpc.scheduler.ischedulerjob_members(v=vs.85).aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;This really allows you to control how a job is run – you can access &amp;amp; tweak the following features:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;max / min resource values&lt;/li&gt;    &lt;li&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/34b65cd17146_CEE9/clip_image007_6.gif" rel="lightbox"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image007" border="0" alt="clip_image007" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/34b65cd17146_CEE9/clip_image007_thumb.gif" width="2" height="2" /&gt;&lt;/a&gt;whether job resources can grow / shrink, and whether jobs can be pre-empted, whether the job is exclusive per node&lt;/li&gt;    &lt;li&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/34b65cd17146_CEE9/clip_image0071.gif" rel="lightbox"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image007[1]" border="0" alt="clip_image007[1]" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/34b65cd17146_CEE9/clip_image0071_thumb.gif" width="2" height="2" /&gt;&lt;/a&gt;the creator process id &amp;amp; the job pool&lt;/li&gt;    &lt;li&gt;timestamp of job creation &amp;amp; completion&lt;/li&gt;    &lt;li&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/34b65cd17146_CEE9/clip_image0072.gif" rel="lightbox"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image007[2]" border="0" alt="clip_image007[2]" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/34b65cd17146_CEE9/clip_image0072_thumb.gif" width="2" height="2" /&gt;&lt;/a&gt;job priority, hold time &amp;amp; run time limit&lt;/li&gt;    &lt;li&gt;Re-queue count&lt;/li&gt;    &lt;li&gt;Job progress&lt;/li&gt;    &lt;li&gt;Max/ min Number of cores, nodes, sockets, RAM&lt;/li&gt;    &lt;li&gt;Dynamic task list – can add / cancel jobs on the fly&lt;/li&gt;    &lt;li&gt;Job counters&lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;When – poll perf counters&lt;/h2&gt;  &lt;p&gt;Tweaking the job scheduler should be done on the basis of resource utilization according to PerfMon counters – HPC exposes 2 Perf objects: &lt;b&gt;Compute Clusters, Compute Nodes&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc720058(v=ws.10).aspx"&gt;http://technet.microsoft.com/en-us/library/cc720058(v=ws.10).aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;You can monitor running jobs according to dynamic thresholds – use your own discretion:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Percentage processor time&lt;/li&gt;    &lt;li&gt;Number of running jobs&lt;/li&gt;    &lt;li&gt;Number of running tasks&lt;/li&gt;    &lt;li&gt;Total number of processors&lt;/li&gt;    &lt;li&gt;Number of processors in use&lt;/li&gt;    &lt;li&gt;Number of processors idle&lt;/li&gt;    &lt;li&gt;Number of serial tasks&lt;/li&gt;    &lt;li&gt;Number of parallel tasks&lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;Design Your algorithms correctly&lt;/h2&gt;  &lt;p&gt;Finally , don’t assume you have unlimited compute resources in your cluster – design your algorithms with the following factors in mind: &lt;/p&gt;  &lt;p&gt;· &lt;strong&gt;Branching factor&lt;/strong&gt; - &lt;a href="http://en.wikipedia.org/wiki/Branching_factor"&gt;http://en.wikipedia.org/wiki/Branching_factor&lt;/a&gt; - dynamically optimize the number of children per node&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/34b65cd17146_CEE9/clip_image009_2.png" rel="lightbox"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image009" border="0" alt="clip_image009" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/34b65cd17146_CEE9/clip_image009_thumb.png" width="244" height="119" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· &lt;strong&gt;cutoffs&lt;/strong&gt; to prevent explosions - &lt;a href="http://en.wikipedia.org/wiki/Limit_of_a_sequence"&gt;http://en.wikipedia.org/wiki/Limit_of_a_sequence&lt;/a&gt; - not all functions converge after n attempts. You also need a threshold of good enough, diminishing returns&lt;/p&gt;  &lt;p&gt;· &lt;strong&gt;heuristic shortcuts&lt;/strong&gt; - &lt;a href="http://en.wikipedia.org/wiki/Heuristic"&gt;http://en.wikipedia.org/wiki/Heuristic&lt;/a&gt; - sometimes an exhaustive search is impractical and short cuts are suitable&lt;/p&gt;  &lt;p&gt;· &lt;strong&gt;Pruning&lt;/strong&gt; &lt;a href="http://en.wikipedia.org/wiki/Pruning_(algorithm)"&gt;http://en.wikipedia.org/wiki/Pruning_(algorithm)&lt;/a&gt; – remove / de-prioritize unnecessary tree branches&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/34b65cd17146_CEE9/clip_image011_2.png" rel="lightbox"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image011" border="0" alt="clip_image011" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/34b65cd17146_CEE9/clip_image011_thumb.png" width="244" height="126" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· &lt;strong&gt;avoid local minima / maxima&lt;/strong&gt; - &lt;a href="http://en.wikipedia.org/wiki/Local_minima"&gt;http://en.wikipedia.org/wiki/Local_minima&lt;/a&gt; - sometimes an algorithm cant converge because it gets stuck in a local saddle – try simulated annealing, hill climbing or genetic algorithms to get out of these ruts&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/34b65cd17146_CEE9/clip_image013_2.png" rel="lightbox"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image013" border="0" alt="clip_image013" src="http://gwb.blob.core.windows.net/joshreuben/Windows-Live-Writer/34b65cd17146_CEE9/clip_image013_thumb.png" width="244" height="196" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;watch out for &lt;strong&gt;rounding errors&lt;/strong&gt; – &lt;a href="http://en.wikipedia.org/wiki/Round-off_error"&gt;http://en.wikipedia.org/wiki/Round-off_error&lt;/a&gt; - multiple iterations can in parallel can quickly amplify &amp;amp; blow up your algo ! Use an epsilon, avoid floating point errors,  truncations, approximations&lt;/p&gt;  &lt;p&gt;Happy Coding !&lt;/p&gt; &lt;img src="http://geekswithblogs.net/JoshReuben/aggbug/150946.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>JoshReuben</dc:creator>
            <guid>http://geekswithblogs.net/JoshReuben/archive/2012/10/10/hpc-server-dynamic-job-scheduling-when-jobs-spawn-jobs.aspx</guid>
            <pubDate>Wed, 10 Oct 2012 12:34:14 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/JoshReuben/comments/150946.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/JoshReuben/archive/2012/10/10/hpc-server-dynamic-job-scheduling-when-jobs-spawn-jobs.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/JoshReuben/comments/commentRss/150946.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>