<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;C0QGQXc4eip7ImA9WhBaEEk.&quot;"><id>tag:blogger.com,1999:blog-33157069</id><updated>2013-05-20T09:15:20.932Z</updated><category term="flash" /><category term="google+" /><category term="sound and music" /><category term="compilers" /><category term="death" /><category term="sonic field" /><category term="floor" /><category term="nerds search" /><category term="jsr292 jvm java c cobol legcay" /><category term="nuclear fusion. climate change" /><category term="theology" /><category term="privacy" /><category term="mencoder" /><category term="poll" /><category term="Windows" /><category term="teaming" /><category term="algorithms" /><category term="alloca" /><category term="mainframe" /><category term="chrome" /><category term="threading" /><category term="suse" /><category term="software development" /><category term="headphones" /><category term="bytecode" /><category term="redhat" /><category term="nerd talk" /><category term="powershell" /><category term="git" /><category term="data analysis" /><category term="korg" /><category term="dpj" /><category term="The Gimp" /><category term="cocker spaniel" /><category term="monotribe" /><category term="video" /><category term="Inkscape" /><category term="pix" /><category term="closures" /><category term="facebook" /><category term="xerces" /><category term="video processing" /><category term="singing" /><category term="static languages" /><category term="tr1" /><category term="google music" /><category term="java 7" /><category term="java" /><category term="veronica" /><category term="numerical analysis" /><category term="rand" /><category term="c++1" /><category term="autogenology" /><category term="azure" /><category term="Baby Steps" /><category term="peugeot" /><category term="aspergers" /><category term="agpl" /><category term="montribe" /><category term="rave" /><category term="philosophy" /><category term="Stuff" /><category term="MicroSoft" /><category term="synthesiser" /><category term="c" /><category term="dbc" /><category term="pixlr" /><category term="vocoder" /><category term="synthesizer" /><category term="innovation" /><category term="web development and design" /><category term="performance testing" /><category term="dsl" /><category term="face recognition" /><category term="rdo" /><category term="sony s1" /><category term="new and views" /><category term="blogging" /><category term="json" /><category term="svn" /><category term="peer2peer" /><category term="ruby" /><category term="nerd search" /><category term="Micro focus" /><category term="virtualization" /><category term="akg" /><category term="podcast" /><category term="nasa" /><category term="fospl" /><category term="mxl v67g" /><category term="ec2" /><category term="within temptation" /><category term="predicitions" /><category term="perl" /><category term="sony" /><category term="fuzz box" /><category term="unit tests" /><category term="os x" /><category term="Exsead" /><category term="Windows API" /><category term="flock" /><category term="resonant synthesis" /><category term="air rifle" /><category term="vspl" /><category term="cross platform development" /><category term="asd" /><category term="programming language design" /><category term="Tutorials" /><category term="relational database" /><category term="chromemoting" /><category term="visualisation" /><category term="java 8" /><category term="applied mathematics" /><category term="excel" /><category term="ios" /><category term="arvo" /><category term="lambdsa" /><category term="lookup" /><category term="hd" /><category term="generative music" /><category term="canvas" /><category term="invokedynamic" /><category term="map-reduce" /><category term="visual cobol" /><category term="apollo" /><category term="ipc" /><category term="tsunami" /><category term="business theory" /><category term="jit" /><category term="asc" /><category term="hardware" /><category term="synthesis" /><category term="c++11" /><category term="pulseaudio" /><category term="power point" /><category term="advanced sorting" /><category term="behringer" /><category term="internet explorer." /><category term="mico focus" /><category term="lambdas" /><category term="cloud computing" /><category term="fortran" /><category term="chromebook." /><category term="psychological approaches" /><category term="sonic field.synthesizer" /><category term="music" /><category term="xslt" /><category term="julia kotowski" /><category term="Service pack 3" /><category term="real-time" /><category term="internal dsl" /><category term="Google" /><category term="ie" /><category term="jquery" /><category term="news and view" /><category term="tuple" /><category term="energy" /><category term="hidden oxfordshire" /><category term="scrum" /><category term="c++ book" /><category term="frequency modulation" /><category term="sql" /><category term="mobile computing" /><category term="battery life" /><category term="Linux" /><category term="task" /><category term="netbook" /><category term="twitter" /><category term="garbage collection" /><category term="gcc" /><category term="vpn" /><category term="humanity" /><category term="qt" /><category term="jruby" /><category term="social media" /><category term="image processing" /><category term="legcay" /><category term="server express" /><category term="Nerds-Central Service Updates" /><category term="breasts" /><category term="Xen" /><category term="drexcel" /><category term="documentation" /><category term="html5" /><category term="audio processing" /><category term="IE9" /><category term="silk" /><category term="deap diving" /><category term="Chome" /><category term="mvim" /><category term="rdbms" /><category term="cobol" /><category term="open source" /><category term="bayesian" /><category term="tekzilla" /><category term="hadoop" /><category term="Cambridge" /><category term="windows 7" /><category term="c#" /><category term="firefox" /><category term="cisco" /><category term="jni" /><category term="windows xp" /><category term="heirloom computing" /><category term="nc10" /><category term="spring" /><category term="Safari" /><category term="browser trends" /><category term="realtime" /><category term="excelcomputing" /><category term=".net" /><category term="performance" /><category term="eclipse" /><category term="review" /><category term="remote working" /><category term="Jokes" /><category term="vb.net" /><category term="c++ 11" /><category term="criminal justice" /><category term="xml" /><category term="jscript and javascript solutions" /><category term="virtualbox" /><category term="centos" /><category term="business" /><category term="oxfordshire" /><category term="scala" /><category term="x11" /><category term="cassini" /><category term="tips and tricks" /><category term="autism" /><category term="haiku os" /><category term="Ian Manson" /><category term="quant" /><category term="com" /><category term="new and view" /><category term="Open University" /><category term="ford smax" /><category term="climate change" /><category term="teams" /><category term="somme" /><category term="sfpl" /><category term="oracle" /><category term="ie8" /><category term="visual studio" /><category term="stylophone" /><category term="porkis" /><category term="windows 8" /><category term="nerds central" /><category term="android" /><category term="news and views" /><category term="fake" /><category term="dynamic languages" /><category term="chromoting" /><category term="voice reprocessing" /><category term="dr excel" /><category term="managed code" /><category term="Partnering and Off Shoring" /><category term="big process" /><category term="fun" /><category term="release" /><category term="ie 10" /><category term="htop" /><category term="architecture" /><category term="vsthost" /><category term="jython" /><category term="rust" /><category term="fft" /><category term="thorium" /><category term="places to stay" /><category term="capitalism" /><category term="Qubuntu" /><category term="wiki" /><category term="optimisation" /><category term="PS3" /><category term="javascript" /><category term="audacity" /><category term="moon" /><category term="visual studion 2012" /><category term="sythesiser" /><category term="apple" /><category term="tablet" /><category term="SQL Server" /><category term="mastering" /><category term="atomic death queue" /><category term="ambient" /><category term="ipad" /><category term="dubstep" /><category term="window 7" /><category term="chromebook" /><category term="fedora" /><category term="nerds-central" /><category term="youtube" /><category term="Security" /><category term="guitar music" /><category term="cas" /><category term="ring modulator" /><category term="java advent calendar" /><category term="sf310" /><category term="C++" /><category term="disability" /><category term="managed cobol" /><category term="f#" /><category term="ibm" /><category term="agile" /><category term="python" /><category term="jacob" /><category term="monotron" /><category term="sony vegas" /><category term="valve amplifiers" /><category term="jackson" /><category term="Futurology" /><category term="reuze" /><category term="vbscript" /><category term="jsr292" /><category term="wave" /><category term="stl" /><category term="car" /><category term="magik" /><category term="cassandra" /><category term="object orientation" /><category term="office" /><category term="tcl/tk" /><category term="research" /><category term="vi" /><category term="opensuse" /><category term="cygwin" /><category term="php" /><category term="resonance" /><category term="internet explorer" /><category term="vlog" /><category term="tutorial" /><category term="Outsourcing IT" /><category term="star" /><category term="jvm" /><category term="mongodb" /><category term="software success bites" /><category term="blog" /><category term="go" /><category term="reddit" /><category term="samsung" /><category term="every day advice" /><category term="stack" /><category term="garbage collector" /><category term="software architecture" /><category term="economics" /><category term="mac book" /><category term="blogger" /><category term="audio recording" /><category term="jobs" /><category term="chromebook chrome chromeos video" /><category term="clr" /><category term="generics" /><category term="drum machine" /><category term="functional programming" /><category term="unix.jvm. signals" /><category term="pl/i" /><category term="granular synthesis" /><category term="qemu" /><category term="microphone" /><category term="tiobe" /><category term="Rant" /><category term="g++" /><category term="research-asd" /><category term="Macros" /><category term="mercurial" /><category term="knol" /><category term="netty" /><category term="profiling" /><category term="pearl trees" /><category term="Books" /><title>Nerds Central</title><subtitle type="html">Information, News And Views From Dr Alexander J. Turner &amp;amp; Nerds Central Ltd</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://nerds-central.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://nerds-central.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Alexander Turner</name><uri>https://plus.google.com/114304476302249483316</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-5CFwcBYLGnQ/AAAAAAAAAAI/AAAAAAAAIl8/1DV4r17FExM/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>1050</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/blogspot/vvIEq" /><feedburner:info uri="blogspot/vvieq" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:browserFriendly></feedburner:browserFriendly><entry gd:etag="W/&quot;C0QGQXc-fSp7ImA9WhBaEEk.&quot;"><id>tag:blogger.com,1999:blog-33157069.post-5897222663564783035</id><published>2013-05-20T09:15:00.000Z</published><updated>2013-05-20T09:15:20.955Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-05-20T09:15:20.955Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="fun" /><category scheme="http://www.blogger.com/atom/ns#" term="hardware" /><category scheme="http://www.blogger.com/atom/ns#" term="air rifle" /><title>All Hard Drives Go To Hell</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-yc7y0k-F4NU/UZnpJwlh9SI/AAAAAAAAJvA/13nbdKgIeD8/s1600/crunch.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="207" src="http://2.bp.blogspot.com/-yc7y0k-F4NU/UZnpJwlh9SI/AAAAAAAAJvA/13nbdKgIeD8/s320/crunch.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;When I was a kid (13ish I guess) a magnetic tape failed and lost me a day's work - I smashed the tape in anger. Recently a magnetic hard drive did a similar thing to me so I shot it.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Hmm - I am thinking therapy. But in the meantime, here are the results:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://youtu.be/RS_viR4fGxo" target="_blank"&gt;On Youtube - you can see the whole thing&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-HBDow_mEkYE/UZnmqoaq_HI/AAAAAAAAJs4/w4gPrmjiYZo/s1600/S1900014.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="426" src="http://1.bp.blogspot.com/-HBDow_mEkYE/UZnmqoaq_HI/AAAAAAAAJs4/w4gPrmjiYZo/s640/S1900014.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-O3B1E4hU0vc/UZnmqSL_DgI/AAAAAAAAJsw/yYGGTaKiVFk/s1600/S1900016.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="426" src="http://3.bp.blogspot.com/-O3B1E4hU0vc/UZnmqSL_DgI/AAAAAAAAJsw/yYGGTaKiVFk/s640/S1900016.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-MnxC9-UN8OE/UZnmrBiVqCI/AAAAAAAAJtA/Vjo9zVGpuRU/s1600/S1900017.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="426" src="http://3.bp.blogspot.com/-MnxC9-UN8OE/UZnmrBiVqCI/AAAAAAAAJtA/Vjo9zVGpuRU/s640/S1900017.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-wMKPWWQhGc8/UZnmrrN_TQI/AAAAAAAAJtI/1gqsFTiT1bY/s1600/S1900018.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="426" src="http://4.bp.blogspot.com/-wMKPWWQhGc8/UZnmrrN_TQI/AAAAAAAAJtI/1gqsFTiT1bY/s640/S1900018.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-i6lXub_zwxc/UZnmrz561cI/AAAAAAAAJtM/TLIu4lpIMcQ/s1600/S1900019.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="426" src="http://4.bp.blogspot.com/-i6lXub_zwxc/UZnmrz561cI/AAAAAAAAJtM/TLIu4lpIMcQ/s640/S1900019.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-1ZdhmXvuY6U/UZnmsmME9pI/AAAAAAAAJtY/OMGbERfIZbM/s1600/S1900020.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="426" src="http://3.bp.blogspot.com/-1ZdhmXvuY6U/UZnmsmME9pI/AAAAAAAAJtY/OMGbERfIZbM/s640/S1900020.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-8EDqi-RZlGs/UZnmtKClgjI/AAAAAAAAJtg/lmsLLq0rPK8/s1600/S1900021.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="426" src="http://2.bp.blogspot.com/-8EDqi-RZlGs/UZnmtKClgjI/AAAAAAAAJtg/lmsLLq0rPK8/s640/S1900021.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-Y52HPi_4mO0/UZnmtJQMHfI/AAAAAAAAJtk/cJfL3jIAV5c/s1600/S1900022.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="426" src="http://3.bp.blogspot.com/-Y52HPi_4mO0/UZnmtJQMHfI/AAAAAAAAJtk/cJfL3jIAV5c/s640/S1900022.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-Ne-iz82omfY/UZnmucsccGI/AAAAAAAAJtw/qDM3Q_A0458/s1600/S1900023.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="426" src="http://2.bp.blogspot.com/-Ne-iz82omfY/UZnmucsccGI/AAAAAAAAJtw/qDM3Q_A0458/s640/S1900023.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-xdsHtqP48L4/UZnmud9LJnI/AAAAAAAAJt0/JCpOcn7ztjs/s1600/S1900024.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="426" src="http://3.bp.blogspot.com/-xdsHtqP48L4/UZnmud9LJnI/AAAAAAAAJt0/JCpOcn7ztjs/s640/S1900024.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-OogSfV_Na_8/UZnmuzZERxI/AAAAAAAAJuA/iRii9AShEGM/s1600/S1900025.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="426" src="http://4.bp.blogspot.com/-OogSfV_Na_8/UZnmuzZERxI/AAAAAAAAJuA/iRii9AShEGM/s640/S1900025.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-FT5J5rG1KmQ/UZnmvsKeVtI/AAAAAAAAJuE/AaG_5AAVRNY/s1600/S1900027.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="426" src="http://1.bp.blogspot.com/-FT5J5rG1KmQ/UZnmvsKeVtI/AAAAAAAAJuE/AaG_5AAVRNY/s640/S1900027.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-hemwaw7UpHI/UZnmwLrIBwI/AAAAAAAAJuQ/7996TQ_fFoo/s1600/S1900028.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="426" src="http://2.bp.blogspot.com/-hemwaw7UpHI/UZnmwLrIBwI/AAAAAAAAJuQ/7996TQ_fFoo/s640/S1900028.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-Fu8ki49diNE/UZnmyPdV6-I/AAAAAAAAJuw/oQ9Qujo2I2Q/s1600/S1900033.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="426" src="http://1.bp.blogspot.com/-Fu8ki49diNE/UZnmyPdV6-I/AAAAAAAAJuw/oQ9Qujo2I2Q/s640/S1900033.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-9ZjORRNBBt4/UZnmwvDd-tI/AAAAAAAAJuY/jgMsp9gBJxg/s1600/S1900029.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="426" src="http://2.bp.blogspot.com/-9ZjORRNBBt4/UZnmwvDd-tI/AAAAAAAAJuY/jgMsp9gBJxg/s640/S1900029.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-6974622089702062";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
//2007-03-31: nerds-central.blogspot.com
google_ad_channel = "3328078122";
//--&gt;
&lt;/script&gt;
&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" 
 type="text/javascript"&gt;
&lt;/script&gt;
&lt;script src='http://www.mightycrap.com/Utils/ReferrerScanner.js' type='text/javascript'&gt;
&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vvIEq/~4/2nVH1KPpaHk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://nerds-central.blogspot.com/feeds/5897222663564783035/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://nerds-central.blogspot.com/2013/05/all-hard-drives-go-to-hell.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/5897222663564783035?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/5897222663564783035?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vvIEq/~3/2nVH1KPpaHk/all-hard-drives-go-to-hell.html" title="All Hard Drives Go To Hell" /><author><name>Alexander Turner</name><uri>https://plus.google.com/114304476302249483316</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-5CFwcBYLGnQ/AAAAAAAAAAI/AAAAAAAAIl8/1DV4r17FExM/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-yc7y0k-F4NU/UZnpJwlh9SI/AAAAAAAAJvA/13nbdKgIeD8/s72-c/crunch.jpg" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://nerds-central.blogspot.com/2013/05/all-hard-drives-go-to-hell.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU8EQXwyeSp7ImA9WhBbGUw.&quot;"><id>tag:blogger.com,1999:blog-33157069.post-9074372624877610807</id><published>2013-05-18T22:56:00.001Z</published><updated>2013-05-18T22:56:40.291Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-05-18T22:56:40.291Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="audio recording" /><category scheme="http://www.blogger.com/atom/ns#" term="audio processing" /><category scheme="http://www.blogger.com/atom/ns#" term="air rifle" /><title>Air Gun Pellet Ballistics From Just Audio</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-NWuEsBupYVI/UZcelCSYPII/AAAAAAAAJsc/36TM7yf8eVI/s1600/traj.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="252" src="http://4.bp.blogspot.com/-NWuEsBupYVI/UZcelCSYPII/AAAAAAAAJsc/36TM7yf8eVI/s400/traj.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;HandN Copper Point (left) and Dynamic SN2 (right)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;A Chronometer will tell you how fast a pellet is going very soon after it has left the muzzle of your air gun. That is very far from the whole story.&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
A pellet has to push through air. Air gun pellets at 10-20 or so grains do not have a lot of kinetic energy to help push the air aside. We might think that the main reason for the limited range of an air rifle is the velocity of the pellet and hence its time to target. The slower the pellet is, the longer it takes to get to the target and so the more it will drop between the muzzle and the target. But, this is not the only issue, the air resistance and the mass of the pellet both have an effect. Another aspect is the way the pellet flies: does it precess and what is its ballistic&amp;nbsp;coefficient&amp;nbsp;(which effect one another).&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;All that is a bit on the complex side - can we do some simple stuff?&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
This post is not really about going into super complex stuff. It is more about how we can investigate some properties of different pellets with nothing more than a gun, a target and a video recorder.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Here is a video showing what I am talking about:&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;iframe allowfullscreen="" frameborder="0" height="480" src="http://www.youtube.com/embed/TLR7flG1IMQ" width="853"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;
To get the figures I used in this video I computed the final speed of the pellets from the&amp;nbsp;estimated muzzle velocity and average velocity to target. One big guess was the rate of&amp;nbsp;deceleration&amp;nbsp;I took this to be a proportional to the square of the velocity. Another big guess was the muzzle velocity, which I worked out from the mass and the 11 ftlb rating of the gun. What I want to do next is repeat the idea using distances of 5,10,15,20,25 and 30 yards. This will let me use extrapolation to get the muzzle velocity and an accurate model of the rate at which the pellets slows down.&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-6974622089702062";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
//2007-03-31: nerds-central.blogspot.com
google_ad_channel = "3328078122";
//--&gt;
&lt;/script&gt;
&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" 
 type="text/javascript"&gt;
&lt;/script&gt;
&lt;script src='http://www.mightycrap.com/Utils/ReferrerScanner.js' type='text/javascript'&gt;
&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vvIEq/~4/CCooaeFH6cw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://nerds-central.blogspot.com/feeds/9074372624877610807/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://nerds-central.blogspot.com/2013/05/air-gun-pellet-ballistics-from-just.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/9074372624877610807?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/9074372624877610807?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vvIEq/~3/CCooaeFH6cw/air-gun-pellet-ballistics-from-just.html" title="Air Gun Pellet Ballistics From Just Audio" /><author><name>Alexander Turner</name><uri>https://plus.google.com/114304476302249483316</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-5CFwcBYLGnQ/AAAAAAAAAAI/AAAAAAAAIl8/1DV4r17FExM/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-NWuEsBupYVI/UZcelCSYPII/AAAAAAAAJsc/36TM7yf8eVI/s72-c/traj.png" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://nerds-central.blogspot.com/2013/05/air-gun-pellet-ballistics-from-just.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8GQHszeip7ImA9WhBbFU4.&quot;"><id>tag:blogger.com,1999:blog-33157069.post-6839791213056179600</id><published>2013-05-14T12:33:00.002Z</published><updated>2013-05-14T12:33:41.582Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-05-14T12:33:41.582Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="unit tests" /><category scheme="http://www.blogger.com/atom/ns#" term="software development" /><category scheme="http://www.blogger.com/atom/ns#" term="software architecture" /><category scheme="http://www.blogger.com/atom/ns#" term="object orientation" /><category scheme="http://www.blogger.com/atom/ns#" term="C++" /><title>C++ Unit Test Framework Takes Shape</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-FhzmE2LUnKQ/UIVSIJSj7II/AAAAAAAAHxE/p2wWdqEj2F4/s1600/hanger.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;" target="_blank"&gt;&lt;img border="0" height="300" src="http://4.bp.blogspot.com/-FhzmE2LUnKQ/UIVSIJSj7II/AAAAAAAAHxE/p2wWdqEj2F4/s400/hanger.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Unit test frameworks can be a bit like hangers.&lt;br /&gt;
Massive and don't have very much inside.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;My self injecting unit test approach for C++ is working out nicely.&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
I hate complex frameworks which seem to make life simple but actually just add layers of translation and hours of maintenance pain. So, for Task I want a very simple unit test framework. Having just spend 6 months working on legacy C++ with no unit tests (what are called unit tests are actually much higher level - working at the executable level), I want the confidence of each non trivial method having its own unit test.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
I have already discussed the system &lt;a href="http://nerds-central.blogspot.co.uk/2013/05/c-example-order-of-construction-of.html" target="_blank"&gt;here&lt;/a&gt;. Now I would like to show some real unit tests which are testing real&amp;nbsp;functionality!&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;pre&gt;#import "../taskParser.h"
#import "taskAllTests.h"
namespace taskUnitTest
{
  class lexerStage1TestA : taskUnitTest
  {

  public:
    lexerStage1TestA()
    {
      addUnitTest(this);
    }

    virtual const taskUnitTestResult run()
    {
      task::task_parser parser;
      task::t_string toParse=task::make_atom(new std::string("a b  dog\r\nd\tfrog$cat 12"));
      task::t_vector(lexerFistPassToken) tokens = parser.parse(toParse);
      bool ok=tokens-&amp;gt;size()==6;
      ok &amp;amp;= *((*tokens)[0]-&amp;gt;getValue()) =="a";
      ok &amp;amp;= *((*tokens)[1]-&amp;gt;getValue()) =="b";
      ok &amp;amp;= *((*tokens)[2]-&amp;gt;getValue()) =="dog";
      ok &amp;amp;= *((*tokens)[3]-&amp;gt;getValue()) =="d";
      ok &amp;amp;= *((*tokens)[4]-&amp;gt;getValue()) =="frog$cat";
      ok &amp;amp;= *((*tokens)[5]-&amp;gt;getValue()) =="12";
      if(!ok)
      {
        puts("FAIL:");
        for(size_t i=0;i&amp;lt;tokens-&amp;gt;size();++i)
        {
          printf("\t%d '%s'\r\n",(int)i,(*((*tokens)[i]-&amp;gt;getValue())).c_str());
        }
      }
      return taskUnitTestResult(toString(),ok,"Simple white space splitting and character agregation");
    }
    virtual const std::string toString()
    {
      return "Lexer stage 1 simple";
    }
  };

  class lexerStage1TestB : taskUnitTest
  {

  public:
    lexerStage1TestB()
    {
      addUnitTest(this);
    }

    virtual const taskUnitTestResult run()
    {
      task::task_parser parser;
      task::t_string toParse=task::make_atom(new std::string("a!b  dog\r\nd\tfrog&amp;amp;cat 1=2"));
      task::t_vector(lexerFistPassToken) tokens = parser.parse(toParse);
      bool ok=tokens-&amp;gt;size()==5;
      ok &amp;amp;= *((*tokens)[0]-&amp;gt;getValue()) =="a!b";
      ok &amp;amp;= *((*tokens)[1]-&amp;gt;getValue()) =="dog";
      ok &amp;amp;= *((*tokens)[2]-&amp;gt;getValue()) =="d";
      ok &amp;amp;= *((*tokens)[3]-&amp;gt;getValue()) =="frog&amp;amp;cat";
      ok &amp;amp;= *((*tokens)[4]-&amp;gt;getValue()) =="1=2";
      if(!ok)
      {
        puts("FAIL:");
        for(size_t i=0;i&amp;lt;tokens-&amp;gt;size();++i)
        {
          printf("\t%d '%s'\r\n",(int)i,(*((*tokens)[i]-&amp;gt;getValue())).c_str());
        }
      }
      return taskUnitTestResult(toString(),ok,"Simple white space splitting and character agregation for special tokens");
    }
    virtual const std::string toString()
    {
      return "Lexer stage 1 special";
    }
  };

  // Singletons
  static lexerStage1TestA testA;
  static lexerStage1TestB testB;

}
&lt;/pre&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
First thing I am expecting readers to point out is that I do not redirect all output to a logging facade around a login framework-framework management system. Yeh - you're right I don't and I'm not going to!&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;Having said that - I hope it is clear how easy writing a unit test is in this framework (ette):&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Create a class which inherits taskUnitTest.&lt;/li&gt;
&lt;li&gt;Implement run to perform the test.&lt;/li&gt;
&lt;li&gt;A bit of output giving a clue as to why a test fails is never a bad idea.&lt;/li&gt;
&lt;li&gt;Sticking the string FAIL: in there will not hurt as grep is a very handy tool.&lt;/li&gt;
&lt;li&gt;Implement toString as this is part of the API.&lt;/li&gt;
&lt;li&gt;Stick to using the Task memory managed objects t_string and t_vector help.&lt;/li&gt;
&lt;li&gt;Implement the constructor which adds the test to the framework.&lt;/li&gt;
&lt;li&gt;Create the singletons.&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;And remember:&lt;/b&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-Yh5dXwZHMSo/UUxIk0CwguI/AAAAAAAAJTM/vcvk-msJVVM/s1600/Seriously.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://3.bp.blogspot.com/-Yh5dXwZHMSo/UUxIk0CwguI/AAAAAAAAJTM/vcvk-msJVVM/s640/Seriously.png" width="515" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-6974622089702062";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
//2007-03-31: nerds-central.blogspot.com
google_ad_channel = "3328078122";
//--&gt;
&lt;/script&gt;
&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" 
 type="text/javascript"&gt;
&lt;/script&gt;
&lt;script src='http://www.mightycrap.com/Utils/ReferrerScanner.js' type='text/javascript'&gt;
&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vvIEq/~4/tZl6XwCz0Ck" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://nerds-central.blogspot.com/feeds/6839791213056179600/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://nerds-central.blogspot.com/2013/05/c-unit-test-framework-takes-shape.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/6839791213056179600?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/6839791213056179600?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vvIEq/~3/tZl6XwCz0Ck/c-unit-test-framework-takes-shape.html" title="C++ Unit Test Framework Takes Shape" /><author><name>Alexander Turner</name><uri>https://plus.google.com/114304476302249483316</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-5CFwcBYLGnQ/AAAAAAAAAAI/AAAAAAAAIl8/1DV4r17FExM/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-FhzmE2LUnKQ/UIVSIJSj7II/AAAAAAAAHxE/p2wWdqEj2F4/s72-c/hanger.png" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://nerds-central.blogspot.com/2013/05/c-unit-test-framework-takes-shape.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUIHRXk_fCp7ImA9WhBbFUw.&quot;"><id>tag:blogger.com,1999:blog-33157069.post-6462392631617652006</id><published>2013-05-13T10:36:00.000Z</published><updated>2013-05-14T06:38:54.744Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-05-14T06:38:54.744Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="video" /><category scheme="http://www.blogger.com/atom/ns#" term="air rifle" /><title>SN2 (Tin) Pellets - Nerds Central Air Gun Video</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;b&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;We had a whole bunch of fun shooting the Dynamic SN2 .22 tin pellet:&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Rifles:&lt;/b&gt;&lt;br /&gt;
Gamo CFX Royal .22 underlever&lt;br /&gt;
Gamo Camo'Rocket .22 break barrel&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Pellets:&lt;/b&gt;&lt;br /&gt;
Dynamic SN2 .22 :&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;a href="http://www.guns.gb.com/contents/en-uk/d94_Prometheus_airgun_pellets.html#p653" target="_blank"&gt;http://www.guns.gb.com/contents/en-uk/d94_Prometheus_airgun_pellets.html#p653&lt;/a&gt;&lt;br /&gt;
HandA Copper Point .22:&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;a href="http://www.amazon.co.uk/gp/product/B006SYPB8S" target="_blank"&gt;http://www.amazon.co.uk/gp/product/B006SYPB8S&lt;/a&gt;&lt;br /&gt;
RWS Super Dome .22 - Also Mentioned (but not shot):&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;a href="http://www.amazon.co.uk/gp/product/B007ECH9S8" target="_blank"&gt;http://www.amazon.co.uk/gp/product/B007ECH9S8&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Note that the SN2 pellets used here were washed in isopropyl alcohol, dried and the lubricated before shooting.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;The music is Poison 1:&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;a href="http://youtu.be/yJJ0xCklB7U" target="_blank"&gt;http://youtu.be/yJJ0xCklB7U&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen="" frameborder="0" height="480" src="http://www.youtube.com/embed/cyuJQKztYEw" width="853"&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;Be Safe!&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-6974622089702062";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
//2007-03-31: nerds-central.blogspot.com
google_ad_channel = "3328078122";
//--&gt;
&lt;/script&gt;
&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" 
 type="text/javascript"&gt;
&lt;/script&gt;
&lt;script src='http://www.mightycrap.com/Utils/ReferrerScanner.js' type='text/javascript'&gt;
&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vvIEq/~4/H5xa-1NaqbA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://nerds-central.blogspot.com/feeds/6462392631617652006/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://nerds-central.blogspot.com/2013/05/sn2-tim-pellets-nerds-central-air-gun.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/6462392631617652006?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/6462392631617652006?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vvIEq/~3/H5xa-1NaqbA/sn2-tim-pellets-nerds-central-air-gun.html" title="SN2 (Tin) Pellets - Nerds Central Air Gun Video" /><author><name>Alexander Turner</name><uri>https://plus.google.com/114304476302249483316</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-5CFwcBYLGnQ/AAAAAAAAAAI/AAAAAAAAIl8/1DV4r17FExM/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://img.youtube.com/vi/cyuJQKztYEw/default.jpg" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://nerds-central.blogspot.com/2013/05/sn2-tim-pellets-nerds-central-air-gun.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUQDQ3w4cCp7ImA9WhBUGE8.&quot;"><id>tag:blogger.com,1999:blog-33157069.post-2609393412556957383</id><published>2013-05-06T06:56:00.001Z</published><updated>2013-05-06T06:56:12.238Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-05-06T06:56:12.238Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="unit tests" /><category scheme="http://www.blogger.com/atom/ns#" term="tips and tricks" /><category scheme="http://www.blogger.com/atom/ns#" term="C++" /><title>C++ Example: Order Of Construction Of Global State</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-QA-_gdrylf8/UYa5BKj8oCI/AAAAAAAAJk4/6Z9eJ40CLUI/s1600/sunshine.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="207" src="http://2.bp.blogspot.com/-QA-_gdrylf8/UYa5BKj8oCI/AAAAAAAAJk4/6Z9eJ40CLUI/s320/sunshine.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Why an I coding when I could be chilling in&lt;br /&gt;
the sunshine?&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;In C++ we can mess with the global state to ensure some stuff is constructed before main is called - but we need to be very careful.&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
The C++ language and runtime make no guarantees about the order of construction of the global state. This is not a problem in C because no user code actually executes before main (the runtime does construct its self though). In C++ stuff can/does execute user code before main and this can be very useful indeed; however, that which runs before main has to be super careful about the state of construction of its environment.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
I hit this issue just now and thought I should blog about it. I am working on a very simple unit test system for a C++ project. The idea is that unit tests self inject themselves into the unit test system by constructing singleton objects in the global state:&lt;/div&gt;
&lt;br /&gt;
&lt;pre&gt;#import "../taskParser.h"
#import "taskAllTests.h"
namespace taskUnitTest
{
    class testTest : taskUnitTest
    {

    public:
        testTest()
        {
            addUnitTest(this);
        }

        const taskUnitTestResult run()
        {
            return taskUnitTestResult(toString(),true,"Dummy test which should pass!");
        }
        virtual const std::string toString()
        {
            return "Test test";
        }
    };
    static testTest test;
}
&lt;i&gt;&lt;span style="font-size: x-small;"&gt;
&lt;/span&gt;&lt;/i&gt;&lt;/pre&gt;
&lt;div style="text-align: justify;"&gt;
&lt;div style="text-align: center;"&gt;
&lt;i&gt;&lt;span style="font-size: x-small;"&gt;[Note to purists - these singletons are not enforced singletons - just singletons by convention].&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
In the above code the constructor of testTest instance test adds its self to the unit test system. This means the unit test system does not need a list of unit tests to run or some form of runtime test discovery. Unit tests ask to be tested rather than the test framework finding them and testing them. I really like this idea, but it is playing in that dangerous pre-main state.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
The code below is the fixed version. The bug I hit was a very odd one indeed which I will discuss after this code.&lt;/div&gt;
&lt;br /&gt;
&lt;pre&gt;#import "taskAllTests.h"
#import &amp;lt;iostream&amp;gt;
static std::vector&amp;lt;const taskUnitTest::taskUnitTest*&amp;gt;* tests = NULL;

int taskUnitTest::runUnitTests()
{
    int ret=0;
    cout &amp;lt;&amp;lt; "About to run " &amp;lt;&amp;lt; tests-&amp;gt;size() &amp;lt;&amp;lt; " unit tests." &amp;lt;&amp;lt; endl;
    for(
            std::vector&amp;lt;const taskUnitTest::taskUnitTest*&amp;gt;::iterator it=tests-&amp;gt;begin();
            it!=tests-&amp;gt;end();
            ++it
    ){
        taskUnitTestResult result=(const_cast&amp;lt;taskUnitTest*&amp;gt;(*it))-&amp;gt;run();
        cout &amp;lt;&amp;lt; result.toString() &amp;lt;&amp;lt; endl;
        if(!result.getSuccess())ret=1;
    }
    return ret;
}

void taskUnitTest::addUnitTest(const taskUnitTest* test)
{
    if(tests==NULL)
    {
        tests=new std::vector&amp;lt;const taskUnitTest::taskUnitTest*&amp;gt;();
    }
    tests-&amp;gt;push_back(test);
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;So what happened?&lt;/b&gt;&lt;br /&gt;
The original had&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;static std::vector&amp;lt;const taskUnitTest::taskUnitTest*&amp;gt; tests ;
&lt;/pre&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Rather than&lt;/div&gt;
&lt;div&gt;
&lt;pre&gt;static std::vector&amp;lt;const taskUnitTest::taskUnitTest*&amp;gt;* tests = NULL;
&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The code for constructing the vector was not required so the addUnitTest code was something like this:&lt;/div&gt;
&lt;div&gt;
&lt;pre&gt;void taskUnitTest::addUnitTest(const taskUnitTest* test)
&lt;/pre&gt;
&lt;pre&gt;{
    tests.push_back(test);
}
&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
This looks much better doesn't it? However, when adding two unit tests, the vector reset its self&amp;nbsp;between&amp;nbsp;calls to addUnitTest. This meant that only one object was placed in the vector and only the last unit test to add its self was actually run!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
The only explanation I could come up with was global state setup. Now, that is a bit of a worry because it could just be luck that my new code works. There is nothing to guarantee that vector will be set up correctly in time for this code to run. Really, I should hand implement a vector with no global state in it rather than hope the stl will be OK. But for now - on gcc - this seems to work fine.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;b&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;If I have missed something obvious - don't be shy - let me know and call me a plonker!&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;And here is the output of the unit test code running two tests:&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;pre&gt;About to run 2 unit tests.
PASS: Lexer stage 1 (not yet implemented)
PASS: Test test (Dummy test which should pass!)
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-m8nrqQ86fBQ/UYdTvMAgLRI/AAAAAAAAJlI/-TrHJ9I7idk/s1600/tests.png" imageanchor="1" style="margin-left: auto; margin-right: auto;" target="_blank"&gt;&lt;img border="0" height="409" src="http://4.bp.blogspot.com/-m8nrqQ86fBQ/UYdTvMAgLRI/AAAAAAAAJlI/-TrHJ9I7idk/s640/tests.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Eclipse - sometimes I wish it did actually look like this.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-6974622089702062";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
//2007-03-31: nerds-central.blogspot.com
google_ad_channel = "3328078122";
//--&gt;
&lt;/script&gt;
&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" 
 type="text/javascript"&gt;
&lt;/script&gt;
&lt;script src='http://www.mightycrap.com/Utils/ReferrerScanner.js' type='text/javascript'&gt;
&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vvIEq/~4/gJ83VoXwOz4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://nerds-central.blogspot.com/feeds/2609393412556957383/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://nerds-central.blogspot.com/2013/05/c-example-order-of-construction-of.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/2609393412556957383?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/2609393412556957383?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vvIEq/~3/gJ83VoXwOz4/c-example-order-of-construction-of.html" title="C++ Example: Order Of Construction Of Global State" /><author><name>Alexander Turner</name><uri>https://plus.google.com/114304476302249483316</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-5CFwcBYLGnQ/AAAAAAAAAAI/AAAAAAAAIl8/1DV4r17FExM/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-QA-_gdrylf8/UYa5BKj8oCI/AAAAAAAAJk4/6Z9eJ40CLUI/s72-c/sunshine.png" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://nerds-central.blogspot.com/2013/05/c-example-order-of-construction-of.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkYCQn07fyp7ImA9WhBUF0k.&quot;"><id>tag:blogger.com,1999:blog-33157069.post-6736247968905958814</id><published>2013-05-05T08:56:00.000Z</published><updated>2013-05-05T08:56:03.307Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-05-05T08:56:03.307Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="chromebook" /><title>What is the third best selling laptop in the UK?</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-34wPI2LENpQ/UYYTqBEtDeI/AAAAAAAAJko/v9Rv634VpDA/s1600/Screenshot+2013-05-05+at+08.32.40.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/-34wPI2LENpQ/UYYTqBEtDeI/AAAAAAAAJko/v9Rv634VpDA/s320/Screenshot+2013-05-05+at+08.32.40.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;The ARM Chromebook hits the number 3 spot.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;b&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;span id="goog_1137950854"&gt;&lt;/span&gt;&lt;span id="goog_1137950855"&gt;&lt;/span&gt;The ARM powered Chromebook!&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
Yeh, whilst the word (me included) wring our hands over the success of iPhones and the slow death march of Windows, the humble Chromebook is going from strength to strength. Is it going to replace all other PCs? I doubt it, but it might become a very big player in the laptop world eventually; if this is not in the corporate definitely in the home computing world.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
No matter how hard I try, I am not managing to believe the Chromebook will be a world dominant technology. However, I also see it as being very successful. You don't need to take over the world to be a success; maybe we in the IT world have become&amp;nbsp;addicted&amp;nbsp;to&amp;nbsp;hyperbole?&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
I am writing this post on a Chromebook (and old Samsung). This morning I had a Mac Book Pro Retina 15inch and this machine next to my bed. I picked up the Chrombook and used it. "Why?" you may well ask. Here are a few reasons:&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
1) I will not grieve for a decade if I spill coffee on it.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
2) The battery lasts for ever.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
3) It is light weight.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
4) It does exactly what I want.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
5) It boots even faster than the Mac.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
6) It is secure and I can leave it hanging around - the Mac has my accounts on it for goodness sake!&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
So - the Chromebook is, for me, the perfect second machine. My family share it. My daughter loves it because it just works and my younger son uses it when his big machine is on the fritz.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Chromebooks are a really good idea - but I don't think they will take over the world any time soon. I don't think that is the world we are moving into. We are moving into a multi-machine multi-purpose world of smart phones, tablets and Chromebooks.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;b&gt;As a final thought - in our house the Chromebook gets massively more use that the Sony tablet...&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-6974622089702062";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
//2007-03-31: nerds-central.blogspot.com
google_ad_channel = "3328078122";
//--&gt;
&lt;/script&gt;
&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" 
 type="text/javascript"&gt;
&lt;/script&gt;
&lt;script src='http://www.mightycrap.com/Utils/ReferrerScanner.js' type='text/javascript'&gt;
&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vvIEq/~4/QxHEaguzbPw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://nerds-central.blogspot.com/feeds/6736247968905958814/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://nerds-central.blogspot.com/2013/05/what-is-third-best-selling-laptop-in-uk.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/6736247968905958814?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/6736247968905958814?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vvIEq/~3/QxHEaguzbPw/what-is-third-best-selling-laptop-in-uk.html" title="What is the third best selling laptop in the UK?" /><author><name>Alexander Turner</name><uri>https://plus.google.com/114304476302249483316</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-5CFwcBYLGnQ/AAAAAAAAAAI/AAAAAAAAIl8/1DV4r17FExM/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-34wPI2LENpQ/UYYTqBEtDeI/AAAAAAAAJko/v9Rv634VpDA/s72-c/Screenshot+2013-05-05+at+08.32.40.png" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://nerds-central.blogspot.com/2013/05/what-is-third-best-selling-laptop-in-uk.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0QHQ3o4fyp7ImA9WhBUFkQ.&quot;"><id>tag:blogger.com,1999:blog-33157069.post-4591282618935446181</id><published>2013-05-04T18:07:00.000Z</published><updated>2013-05-04T18:15:32.437Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-05-04T18:15:32.437Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="new and views" /><category scheme="http://www.blogger.com/atom/ns#" term="windows 8" /><category scheme="http://www.blogger.com/atom/ns#" term="MicroSoft" /><title>The Only Thing Which Saved Windows 7 Was Windows XP 64 - Now the Game Is Up</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div style="text-align: justify;"&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-JKXEFGPTnwo/UYS6yKKdyLI/AAAAAAAAJjU/FHEHwW1C11c/s1600/Market-Share.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="202" src="http://4.bp.blogspot.com/-JKXEFGPTnwo/UYS6yKKdyLI/AAAAAAAAJjU/FHEHwW1C11c/s400/Market-Share.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;From&amp;nbsp;http://www.netmarketshare.com/&lt;br /&gt;
Market share from browser use April 2013&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;b&gt;&lt;span style="font-family: Trebuchet MS, sans-serif;"&gt;Seriously, Windows is dead-man-walking. Yes, it will hang around for decades, but the platform has well and truly hit the bumpers.&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Let us look at some cold hard facts about capitalist consumerism, the thing which provides the wealth which Microsoft runs on.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;1)&lt;/b&gt; Software has a near zero cost of manufacture. This makes all software a commodity.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;2)&lt;/b&gt; We pay for software to amortize the cost of development and maybe to cover the cost of support.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;3)&lt;/b&gt; We do not get support from Microsoft in the OS cost (usually) and so we are just paying for the cost of development.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;4)&lt;/b&gt; If new development adds nothing we need - then there is no point in paying for it.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Thus, the only thing which drives Windows development is the creation of new stuff which we need. Just as I pointed out in my discussion on the &lt;a href="http://nerds-central.blogspot.co.uk/2013/04/the-real-reason-pc-sales-are-declining.html" target="_blank"&gt;slowing PC market &lt;/a&gt;- that is not happening any more. Actually, it has not happened since Windows XP other than one important thing.&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;b&gt;If Windows XP 64 had been any good, Windows 7 would have been&amp;nbsp;unnecessary.&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
There were a bunch of nice updates and kernel changes which went into 7 which made it worth while. If XP had a new schedular and better x64 support, then even Windows 7 would never have been required. Windows 8 brings nothing what so ever to the table. How could it? There is nothing to bring; Windows 7 does everything anyone wants to do with modern PC hardware. Touch is all very well - but people are not that bothered about it on a PC and Windows for tablet is POINTLESS - the market is dominated by much more mature players and Windows brings nothing unique - just Tiles-R-Us colours and a the comfort that it will crash and ask you to reboot for updates on a regular basis - just the way everyone loves on the PC.&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;b&gt;Linux has the same problem, developers strive to provide "better" GUIs when actually the new ones are not as good as KDE3 this is why xfce is becoming ever more popular;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;why fix that which is not broken?&lt;/b&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
This is scary stuff. A powerhouse driving the software industry forward has started to fail. Windows replacement does not just drive MS profits, it drives the whole industry forward. Companies spend hundreds (maybe thousands) of millions of dollars, pounds or what ever on porting their software to the new version of Windows. Windows 8 is a PITA for this, there a lot of breaking changes which are subtle but make the cost of porting to it high. So, maybe people will not bother? Maybe the Windows 8 experience for more specialist software will be a sparse experience for some time as many high value software systems remain unsupported, or poorly supported on Windows 8.&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;b&gt;Bottom line - there is zero doubt that the&amp;nbsp;corporate&amp;nbsp;world is not moving over to Windows 8 any time soon. Maybe it never will?&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
The graph above is from Net Applications. For the sake of fairness below is the table of desktop OS market share figures from &lt;a href="http://en.wikipedia.org/wiki/Usage_share_of_operating_systems" target="_blank"&gt;Wikipedia&lt;/a&gt; for the same period:&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;table class="wikitable" style="background-color: #f9f9f9; border-collapse: collapse; border: 1px solid rgb(170, 170, 170); color: black; font-family: sans-serif; font-size: 12.800000190734863px; line-height: 19.200000762939453px; margin: 1em 0px; text-align: center; width: 926.4000244140625px;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;th rowspan="2" style="background-color: #f2f2f2; border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;Source&lt;/th&gt;&lt;th rowspan="2" style="background-color: #f2f2f2; border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;Date&lt;/th&gt;&lt;th colspan="5" style="background-color: #f2f2f2; border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Microsoft_Windows" style="background-image: none; background-position: initial initial; background-repeat: initial initial; color: #0b0080; text-decoration: none;" title="Microsoft Windows"&gt;Microsoft Windows&lt;/a&gt;&lt;/th&gt;&lt;th colspan="2" style="background-color: #f2f2f2; border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Apple_Inc." style="background-image: none; background-position: initial initial; background-repeat: initial initial; color: #0b0080; text-decoration: none;" title="Apple Inc."&gt;Apple&lt;/a&gt;&lt;/th&gt;&lt;th colspan="2" style="background-color: #f2f2f2; border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Linux_kernel" style="background-image: none; background-position: initial initial; background-repeat: initial initial; color: #0b0080; text-decoration: none;" title="Linux kernel"&gt;Linux kernel&lt;/a&gt;&amp;nbsp;based&lt;/th&gt;&lt;th rowspan="2" style="background-color: #f2f2f2; border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;Other&lt;sup class="reference" id="cite_ref-14" style="font-weight: normal; line-height: 1em;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Usage_share_of_operating_systems#cite_note-14" style="background-image: none; background-position: initial initial; background-repeat: initial initial; color: #0b0080; text-decoration: none; white-space: nowrap;"&gt;[a]&lt;/a&gt;&lt;/sup&gt;&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th style="background-color: #f2f2f2; border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Windows_8" style="background-image: none; background-position: initial initial; background-repeat: initial initial; color: #0b0080; text-decoration: none;" title="Windows 8"&gt;8&lt;/a&gt;&lt;/th&gt;&lt;th style="background-color: #f2f2f2; border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Windows_7" style="background-image: none; background-position: initial initial; background-repeat: initial initial; color: #0b0080; text-decoration: none;" title="Windows 7"&gt;7&lt;/a&gt;&lt;/th&gt;&lt;th style="background-color: #f2f2f2; border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Windows_Vista" style="background-image: none; background-position: initial initial; background-repeat: initial initial; color: #0b0080; text-decoration: none;" title="Windows Vista"&gt;Vista&lt;/a&gt;&lt;/th&gt;&lt;th style="background-color: #f2f2f2; border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Windows_XP" style="background-image: none; background-position: initial initial; background-repeat: initial initial; color: #0b0080; text-decoration: none;" title="Windows XP"&gt;XP&lt;/a&gt;&lt;/th&gt;&lt;th style="background-color: #f2f2f2; border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;Other versions&lt;/th&gt;&lt;th style="background-color: #f2f2f2; border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;a href="http://en.wikipedia.org/wiki/OS_X" style="background-image: none; background-position: initial initial; background-repeat: initial initial; color: #0b0080; text-decoration: none;" title="OS X"&gt;OS X&lt;/a&gt;&lt;/th&gt;&lt;th style="background-color: #f2f2f2; border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;a href="http://en.wikipedia.org/wiki/IOS" style="background-image: none; background-position: initial initial; background-repeat: initial initial; color: #0b0080; text-decoration: none;" title="IOS"&gt;iOS&lt;/a&gt;&lt;/th&gt;&lt;th style="background-color: #f2f2f2; border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;a href="http://en.wikipedia.org/wiki/GNU" style="background-image: none; background-position: initial initial; background-repeat: initial initial; color: #0b0080; text-decoration: none;" title="GNU"&gt;GNU&lt;/a&gt;/&lt;a href="http://en.wikipedia.org/wiki/Linux" style="background-image: none; background-position: initial initial; background-repeat: initial initial; color: #0b0080; text-decoration: none;" title="Linux"&gt;Linux&lt;/a&gt;&lt;/th&gt;&lt;th style="background-color: #f2f2f2; border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Android_(operating_system)" style="background-image: none; background-position: initial initial; background-repeat: initial initial; color: #0b0080; text-decoration: none;" title="Android (operating system)"&gt;Android&lt;/a&gt;&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em; text-align: left;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Net_Applications" style="background-image: none; background-position: initial initial; background-repeat: initial initial; color: #0b0080; text-decoration: none;" title="Net Applications"&gt;Net Market Share&lt;/a&gt;&lt;sup class="reference" id="cite_ref-15" style="line-height: 1em;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Usage_share_of_operating_systems#cite_note-15" style="background-image: none; background-position: initial initial; background-repeat: initial initial; color: #0b0080; text-decoration: none; white-space: nowrap;"&gt;[14]&lt;/a&gt;&lt;/sup&gt;&lt;sup class="reference" id="cite_ref-16" style="line-height: 1em;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Usage_share_of_operating_systems#cite_note-16" style="background-image: none; background-position: initial initial; background-repeat: initial initial; color: #0b0080; text-decoration: none; white-space: nowrap;"&gt;[15]&lt;/a&gt;&lt;/sup&gt;&lt;sup class="reference" id="cite_ref-17" style="line-height: 1em;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Usage_share_of_operating_systems#cite_note-17" style="background-image: none; background-position: initial initial; background-repeat: initial initial; color: #0b0080; text-decoration: none; white-space: nowrap;"&gt;[16]&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;Apr-13&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;span title="+0.58"&gt;&lt;img alt="+0.58" height="11" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/17px-Increase2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png 2x" style="border: none; vertical-align: middle;" width="11" /&gt;&lt;/span&gt;3.29%&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;span title="+0.23%"&gt;&lt;img alt="+0.23%" height="11" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/17px-Increase2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png 2x" style="border: none; vertical-align: middle;" width="11" /&gt;&lt;/span&gt;38.50%&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;span title="-0.18%"&gt;&lt;img alt="-0.18%" height="11" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/22px-Decrease2.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/17px-Decrease2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/22px-Decrease2.svg.png 2x" style="border: none; vertical-align: middle;" width="11" /&gt;&lt;/span&gt;4.09%&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;span title="-0.16%"&gt;&lt;img alt="-0.16%" height="11" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/22px-Decrease2.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/17px-Decrease2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/22px-Decrease2.svg.png 2x" style="border: none; vertical-align: middle;" width="11" /&gt;&lt;/span&gt;32.98%&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;span title="-0.31%"&gt;&lt;img alt="-0.31%" height="11" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/22px-Decrease2.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/17px-Decrease2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/22px-Decrease2.svg.png 2x" style="border: none; vertical-align: middle;" width="11" /&gt;&lt;/span&gt;0.15%&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;span title="+0.1%"&gt;&lt;img alt="+0.1%" height="11" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/17px-Increase2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png 2x" style="border: none; vertical-align: middle;" width="11" /&gt;&lt;/span&gt;6.04%&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;span title="-0.66%"&gt;&lt;img alt="-0.66%" height="11" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/22px-Decrease2.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/17px-Decrease2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/22px-Decrease2.svg.png 2x" style="border: none; vertical-align: middle;" width="11" /&gt;&lt;/span&gt;8.21%&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;span title="+0.04%"&gt;&lt;img alt="+0.04%" height="11" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/17px-Increase2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png 2x" style="border: none; vertical-align: middle;" width="11" /&gt;&lt;/span&gt;1.04%&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;span title="+0.03%"&gt;&lt;img alt="+0.03%" height="11" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/17px-Increase2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png 2x" style="border: none; vertical-align: middle;" width="11" /&gt;&lt;/span&gt;3.62%&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;span title="+0.38%"&gt;&lt;img alt="+0.38%" height="11" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/17px-Increase2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png 2x" style="border: none; vertical-align: middle;" width="11" /&gt;&lt;/span&gt;2.08%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em; text-align: left;"&gt;&lt;a href="http://en.wikipedia.org/wiki/StatCounter" style="background-image: none; background-position: initial initial; background-repeat: initial initial; color: #0b0080; text-decoration: none;" title="StatCounter"&gt;StatCounter&lt;/a&gt;&amp;nbsp;Global Stats&lt;sup class="reference" id="cite_ref-18" style="line-height: 1em;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Usage_share_of_operating_systems#cite_note-18" style="background-image: none; background-position: initial initial; background-repeat: initial initial; color: #0b0080; text-decoration: none; white-space: nowrap;"&gt;[17]&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;Mar-13&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;span title="+0.74"&gt;&lt;img alt="+0.74" height="11" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/17px-Increase2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png 2x" style="border: none; vertical-align: middle;" width="11" /&gt;&lt;/span&gt;3.90%&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;span title="+0.15%"&gt;&lt;img alt="+0.15%" height="11" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/17px-Increase2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png 2x" style="border: none; vertical-align: middle;" width="11" /&gt;&lt;/span&gt;52.61%&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;span title="-0.24%"&gt;&lt;img alt="-0.24%" height="11" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/22px-Decrease2.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/17px-Decrease2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/22px-Decrease2.svg.png 2x" style="border: none; vertical-align: middle;" width="11" /&gt;&lt;/span&gt;6.13%&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;span title="-0.49%"&gt;&lt;img alt="-0.49%" height="11" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/22px-Decrease2.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/17px-Decrease2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/22px-Decrease2.svg.png 2x" style="border: none; vertical-align: middle;" width="11" /&gt;&lt;/span&gt;23.38%&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;span title="+0.01%"&gt;&lt;img alt="+0.01%" height="11" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/17px-Increase2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png 2x" style="border: none; vertical-align: middle;" width="11" /&gt;&lt;/span&gt;0.25%&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;span title="-0.25%"&gt;&lt;img alt="-0.25%" height="11" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/22px-Decrease2.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/17px-Decrease2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/22px-Decrease2.svg.png 2x" style="border: none; vertical-align: middle;" width="11" /&gt;&lt;/span&gt;7.29%&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;span title="+0.07%"&gt;&lt;img alt="+0.07%" height="11" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/17px-Increase2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png 2x" style="border: none; vertical-align: middle;" width="11" /&gt;&lt;/span&gt;4.03%&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;span title="+0.02"&gt;&lt;img alt="+0.02" height="11" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/17px-Increase2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png 2x" style="border: none; vertical-align: middle;" width="11" /&gt;&lt;/span&gt;1.00%&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;span title="-0.02%"&gt;&lt;img alt="-0.02%" height="11" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/22px-Decrease2.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/17px-Decrease2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/22px-Decrease2.svg.png 2x" style="border: none; vertical-align: middle;" width="11" /&gt;&lt;/span&gt;1.12%&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;span title="+0.06%"&gt;&lt;img alt="+0.06%" height="11" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/17px-Increase2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png 2x" style="border: none; vertical-align: middle;" width="11" /&gt;&lt;/span&gt;0.34%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em; text-align: left;"&gt;W3Counter&lt;sup class="reference" id="cite_ref-19" style="line-height: 1em;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Usage_share_of_operating_systems#cite_note-19" style="background-image: none; background-position: initial initial; background-repeat: initial initial; color: #0b0080; text-decoration: none; white-space: nowrap;"&gt;[18]&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;Apr-13&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;span title="+0.76%"&gt;&lt;img alt="+0.76%" height="11" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/17px-Increase2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png 2x" style="border: none; vertical-align: middle;" width="11" /&gt;&lt;/span&gt;4.17%&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;span title="0.63%"&gt;&lt;img alt="0.63%" height="11" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/17px-Increase2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png 2x" style="border: none; vertical-align: middle;" width="11" /&gt;&lt;/span&gt;43.72%&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;span title="-0.46%"&gt;&lt;img alt="-0.46%" height="11" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/22px-Decrease2.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/17px-Decrease2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/22px-Decrease2.svg.png 2x" style="border: none; vertical-align: middle;" width="11" /&gt;&lt;/span&gt;4.55%&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;span title="-0.39%"&gt;&lt;img alt="-0.39%" height="11" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/22px-Decrease2.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/17px-Decrease2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/22px-Decrease2.svg.png 2x" style="border: none; vertical-align: middle;" width="11" /&gt;&lt;/span&gt;21.28%&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;span title="Increase"&gt;&lt;img alt="Increase" height="11" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/17px-Increase2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png 2x" style="border: none; vertical-align: middle;" width="11" /&gt;&lt;/span&gt;&amp;nbsp;0.34%&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;span title="-0.04%"&gt;&lt;img alt="-0.04%" height="11" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/22px-Decrease2.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/17px-Decrease2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/22px-Decrease2.svg.png 2x" style="border: none; vertical-align: middle;" width="11" /&gt;&lt;/span&gt;8.21%&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;span title="-1.18%"&gt;&lt;img alt="-1.18%" height="11" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/22px-Decrease2.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/17px-Decrease2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/22px-Decrease2.svg.png 2x" style="border: none; vertical-align: middle;" width="11" /&gt;&lt;/span&gt;9.28%&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;span title="+0.23%"&gt;&lt;img alt="+0.23%" height="11" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/17px-Increase2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png 2x" style="border: none; vertical-align: middle;" width="11" /&gt;&lt;/span&gt;2.28%&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;span title="+0.16%"&gt;&lt;img alt="+0.16%" height="11" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/17px-Increase2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png 2x" style="border: none; vertical-align: middle;" width="11" /&gt;&lt;/span&gt;4.48%&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;span title="-0.59%"&gt;&lt;img alt="-0.59%" height="11" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/22px-Decrease2.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/17px-Decrease2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/22px-Decrease2.svg.png 2x" style="border: none; vertical-align: middle;" width="11" /&gt;&lt;/span&gt;1.07%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em; text-align: left;"&gt;&lt;a class="mw-redirect" href="http://en.wikipedia.org/wiki/Wikimedia" style="background-image: none; background-position: initial initial; background-repeat: initial initial; color: #0b0080; text-decoration: none;" title="Wikimedia"&gt;Wikimedia&lt;/a&gt;&lt;sup class="reference" id="cite_ref-wikimedia-stats_20-0" style="line-height: 1em;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Usage_share_of_operating_systems#cite_note-wikimedia-stats-20" style="background-image: none; background-position: initial initial; background-repeat: initial initial; color: #0b0080; text-decoration: none; white-space: nowrap;"&gt;[19]&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;Mar-13&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;span title="+0.37"&gt;&lt;img alt="+0.37" height="11" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/17px-Increase2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png 2x" style="border: none; vertical-align: middle;" width="11" /&gt;&lt;/span&gt;2.6%&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;span title="-0.6%"&gt;&lt;img alt="-0.6%" height="11" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/22px-Decrease2.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/17px-Decrease2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/22px-Decrease2.svg.png 2x" style="border: none; vertical-align: middle;" width="11" /&gt;&lt;/span&gt;34.12%&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;span title="-0.24%"&gt;&lt;img alt="-0.24%" height="11" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/22px-Decrease2.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/17px-Decrease2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/22px-Decrease2.svg.png 2x" style="border: none; vertical-align: middle;" width="11" /&gt;&lt;/span&gt;4.06%&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;span title="+0.03%"&gt;&lt;img alt="+0.03%" height="11" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/17px-Increase2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png 2x" style="border: none; vertical-align: middle;" width="11" /&gt;&lt;/span&gt;14.31%&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;span title="-0.23%"&gt;&lt;img alt="-0.23%" height="11" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/22px-Decrease2.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/17px-Decrease2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/22px-Decrease2.svg.png 2x" style="border: none; vertical-align: middle;" width="11" /&gt;&lt;/span&gt;0.56%&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;span title="-0.27%"&gt;&lt;img alt="-0.27%" height="11" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/22px-Decrease2.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/17px-Decrease2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/22px-Decrease2.svg.png 2x" style="border: none; vertical-align: middle;" width="11" /&gt;&lt;/span&gt;6.71%&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;span title="+1.44%"&gt;&lt;img alt="+1.44%" height="11" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/17px-Increase2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png 2x" style="border: none; vertical-align: middle;" width="11" /&gt;&lt;/span&gt;25.19%&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;span title="+0.04%"&gt;&lt;img alt="+0.04%" height="11" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/17px-Increase2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png 2x" style="border: none; vertical-align: middle;" width="11" /&gt;&lt;/span&gt;1.46%&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;span title="+0.16%"&gt;&lt;img alt="+0.16%" height="11" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/17px-Increase2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png 2x" style="border: none; vertical-align: middle;" width="11" /&gt;&lt;/span&gt;6.19%&lt;/td&gt;&lt;td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;"&gt;&lt;span title="-0.01%"&gt;&lt;img alt="-0.01%" height="11" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/22px-Decrease2.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/17px-Decrease2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Decrease2.svg/22px-Decrease2.svg.png 2x" style="border: none; vertical-align: middle;" width="11" /&gt;&lt;/span&gt;0.60%&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;div style="text-align: center;"&gt;
&lt;b&gt;As we can see, Windows 8 has not taking off. It is a flop. However, I am suggesting that it might not be Windows 8 that is the problem. The problem for Microsoft is that the market simply does not need, want or care about a new OS.&lt;/b&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-6974622089702062";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
//2007-03-31: nerds-central.blogspot.com
google_ad_channel = "3328078122";
//--&gt;
&lt;/script&gt;
&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" 
 type="text/javascript"&gt;
&lt;/script&gt;
&lt;script src='http://www.mightycrap.com/Utils/ReferrerScanner.js' type='text/javascript'&gt;
&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vvIEq/~4/IKjTgdrVgw8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://nerds-central.blogspot.com/feeds/4591282618935446181/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://nerds-central.blogspot.com/2013/05/the-only-thing-which-saved-windows-7.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/4591282618935446181?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/4591282618935446181?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vvIEq/~3/IKjTgdrVgw8/the-only-thing-which-saved-windows-7.html" title="The Only Thing Which Saved Windows 7 Was Windows XP 64 - Now the Game Is Up" /><author><name>Alexander Turner</name><uri>https://plus.google.com/114304476302249483316</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-5CFwcBYLGnQ/AAAAAAAAAAI/AAAAAAAAIl8/1DV4r17FExM/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-JKXEFGPTnwo/UYS6yKKdyLI/AAAAAAAAJjU/FHEHwW1C11c/s72-c/Market-Share.png" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://nerds-central.blogspot.com/2013/05/the-only-thing-which-saved-windows-7.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUQNR3w-fSp7ImA9WhBUE0U.&quot;"><id>tag:blogger.com,1999:blog-33157069.post-6992569049258739819</id><published>2013-05-01T05:49:00.002Z</published><updated>2013-05-01T05:49:56.255Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-05-01T05:49:56.255Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="closures" /><category scheme="http://www.blogger.com/atom/ns#" term="tips and tricks" /><category scheme="http://www.blogger.com/atom/ns#" term="task" /><category scheme="http://www.blogger.com/atom/ns#" term="C++" /><title>Love Of A Dog - Or Maybe C++?</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-K9TLoCzcabM/UX-aSJISxsI/AAAAAAAAJhg/25JB6QhsMvo/s1600/LoveOfADog-50pcnt.gif" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-K9TLoCzcabM/UX-aSJISxsI/AAAAAAAAJhg/25JB6QhsMvo/s320/LoveOfADog-50pcnt.gif" width="310" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;My son and Hector having a cuddle - what could&lt;br /&gt;
be better!&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Maybe there is one thing greater than the love of a dog - my love for clean C++.&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
Nope - dogs win - but C++ can be such a beautiful language. It gets dirty really quickly, but if you have the time to work with it and you know what you want - it is a thing of beauty.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
This evening I got chance to do a bit more work on the parser for &lt;a href="http://nerds-central.blogspot.co.uk/2013/04/task-ultra-simple-c-implements-closure.html" target="_blank"&gt;Task - my super simple C++ based interpretor&lt;/a&gt; which uses nothing but closures to form the language. I am going for a hand written parser for speed and clarity because the whole idea is that the language is so simple a grammer based parser would be massive overkill.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
So here is my evening's work. It is in header form for now though I expect I'll refactor out some of the guts to definitions at some later date. A brief description of some of the key points follows the code:&lt;/div&gt;
&lt;br /&gt;
&lt;pre style="clear: both;"&gt;/*
 * task-parser.h
 *
 *  Created on: Apr 8, 2013
 *      Author: alexanderturner
 */

#ifndef TASK_PARSER_H_
#define TASK_PARSER_H_
#include "task-memory.h"
namespace task
{
    class token
    {
        const size_t line;
        const size_t character;
        const t_string file;
        const t_string value;
    public:
        token(size_t lineIn,size_t characterIn,const t_string fileIn,const t_string valueIn) :
        line(lineIn),
        character(characterIn),
        file(fileIn),
        value(valueIn){};

        size_t getLine()          {return line;      }
        size_t getCharacter()     {return character; }
        const t_string getFile()  {return file;      }
        const t_string getValue() {return value;     }
        string toString()
        {
            //TODO not exception safe
            char* number=new char[32];
            string ret="File: '";
            ret+=*file;
            ret+="' Line: ";
            sprintf(number,"%zd",line);
            ret+=number;
            ret+=" Column: ";
            sprintf(number,"%zd",character);
            ret+=number;
            ret+=" Value: '";
            ret+=*value;
            ret+="'";
            delete number;
            return ret;
        }
    };

    class task_parser
    {
        const bool isWhiteSpace(const char what)
        {
            switch(what)
            {
            case '\t':
            case ' ':
            case '\r':
            case '\n':
                return true;
            default:
                return false;
            }
        }

        const bool isNewLine(const char what)
        {
            switch(what)
            {
            case '\n':
                return true;
            default:
                return false;
            }
        }

    public:
        t_vector(token) parse(t_string src)
        {
            return parse(src,make_atom(new string("unknown")));
        }

        t_vector(token) parse(t_string src,t_string file)
        {
            t_vector(token) result=make_vector&amp;lt;token&amp;gt;();
            size_t line=0;
            size_t character=0;
            size_t index=0;
            // Remove all leading white space
            for(;index&amp;lt;src-&amp;gt;size();++index)
            {
                const char c=(*src)[index];
                if(isWhiteSpace(c))
                {
                    if(isNewLine(c))
                    {
                        ++line;
                        character=0;
                    }else{
                        ++character;
                    }
                }else{
                    break;
                }
            }
            bool wasWhiteSpace=false;
            t_string thisToken=make_atom(new string(""));
            for(;index&amp;lt;src-&amp;gt;size();++index)
            {
                const char c=(*src)[index];
                if(isWhiteSpace(c))
                {
                    if(!wasWhiteSpace)
                    {
                        result-&amp;gt;push_back(make_atom(new token(line,character,file,thisToken)));
                        thisToken=make_atom(new string(""));
                    }
                    if(isNewLine(c))
                    {
                        ++line;
                        character=0;
                    }else{
                        ++character;
                    }
                    wasWhiteSpace=true;
                }else{
                    wasWhiteSpace=false;
                    (*thisToken)+=c;
                    ++character;
                    wasWhiteSpace=false;
                }
            }
            return result;
        }
};

}
#endif /* TASK_PARSER_H_ */

...

There are now two defines in the task_memory header:

#define t_string         task_atom&amp;lt;string&amp;gt;::type
#define t_vector(type__) task::task_vector&amp;lt;type__&amp;gt;::type

&lt;/pre&gt;
&lt;b&gt;Here are some thoughts on the design:&lt;/b&gt;&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;Lots of const.&lt;/li&gt;
&lt;li&gt;Use classes with accessors not structs with direct field access.&lt;/li&gt;
&lt;li&gt;I choose what is white space or not rather than using a standard function.&lt;/li&gt;
&lt;li&gt;Open, clear form using next line brace layout.&lt;/li&gt;
&lt;li&gt;Heavy use of shared_ptr which is largely hidden using templates, helper functions and a couple of #defines.&lt;/li&gt;
&lt;li&gt;I don't use vector iterators that much because index access of vectors is very fast and looks cleaner without all that type flab.&lt;/li&gt;
&lt;li&gt;size_t - no int, int32_t and all that dangerous stuff - if it is a size - use size_t!&lt;/li&gt;
&lt;li&gt;Not given enough thought to exception safety yet - should at the least be using auto_ptr not raw pointers were new and delete where shared_ptr is not being used.&lt;/li&gt;
&lt;li&gt;Build&amp;nbsp;functionality&amp;nbsp;up in stages.&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="text-align: justify;"&gt;
On that last point, let me explain further. The parser here only breaks the source into high level tokens - it is actually a lexer. However, it is not even the full lexer in that the tokens it produces will be lexically analysed further and made into more differentiated smaller tokens before there is a full semantic analysis.&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;The coding approach:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;Lots of small methods.&lt;/li&gt;
&lt;li&gt;Each method does one simple thing which is easy to test.&lt;/li&gt;
&lt;li&gt;Unit tests at the method level.&lt;/li&gt;
&lt;li&gt;Build functionality up in iterations.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
This approach makes managing multiple projects at once much easier and builds testability into the code base. In my case, I have come across this more in agile Java development, but I am seeing huge benefits for it in agile C++ development as well. The guts of a large method which does many different things are the natural hiding place of a nasty bug!&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Next Step:&lt;/b&gt;&lt;br /&gt;
Go write some unit tests. This is an exemplar project so I intend to do it right!&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-6974622089702062";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
//2007-03-31: nerds-central.blogspot.com
google_ad_channel = "3328078122";
//--&gt;
&lt;/script&gt;
&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" 
 type="text/javascript"&gt;
&lt;/script&gt;
&lt;script src='http://www.mightycrap.com/Utils/ReferrerScanner.js' type='text/javascript'&gt;
&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vvIEq/~4/Vj2KW8IDGx8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://nerds-central.blogspot.com/feeds/6992569049258739819/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://nerds-central.blogspot.com/2013/05/love-of-dog-or-maybe-c.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/6992569049258739819?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/6992569049258739819?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vvIEq/~3/Vj2KW8IDGx8/love-of-dog-or-maybe-c.html" title="Love Of A Dog - Or Maybe C++?" /><author><name>Alexander Turner</name><uri>https://plus.google.com/114304476302249483316</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-5CFwcBYLGnQ/AAAAAAAAAAI/AAAAAAAAIl8/1DV4r17FExM/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-K9TLoCzcabM/UX-aSJISxsI/AAAAAAAAJhg/25JB6QhsMvo/s72-c/LoveOfADog-50pcnt.gif" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://nerds-central.blogspot.com/2013/05/love-of-dog-or-maybe-c.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkUCSXY9eSp7ImA9WhBUEkk.&quot;"><id>tag:blogger.com,1999:blog-33157069.post-6204769390131872223</id><published>2013-04-29T12:57:00.002Z</published><updated>2013-04-29T12:57:48.861Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-04-29T12:57:48.861Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="remote working" /><category scheme="http://www.blogger.com/atom/ns#" term="tips and tricks" /><title>Easy Encryption: Passing Sensitive Files Via Dropbox Or Google Drive</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-IQV6jw0KJ20/UX5RXOP6o3I/AAAAAAAAJgQ/MhzSLOUIYp4/s1600/dogies.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="285" src="http://2.bp.blogspot.com/-IQV6jw0KJ20/UX5RXOP6o3I/AAAAAAAAJgQ/MhzSLOUIYp4/s400/dogies.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Hmm - nope, cannot think of a good excuse for this dogy picture&lt;br /&gt;
but they are cute!&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Google Drive and its&amp;nbsp;competitors&amp;nbsp;are super good for sharing files, but security is an issue. Free, easy crypto to the rescue.&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;i&gt;Cryptography has legal issues - I am not going into those - you must make sure you do not break any laws.&lt;/i&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
On Linux and OSX I recommend using the command line tool &lt;a href="http://en.wikipedia.org/wiki/OpenSSL" target="_blank"&gt;openssl&lt;/a&gt;. After I have discussed this, I will describe the brilliant &lt;a href="http://www.7-zip.org/" target="_blank"&gt;7-Zip&lt;/a&gt; tool which is ideal for Windows.&lt;/div&gt;
&lt;span style="font-family: inherit;"&gt;&lt;br class="Apple-interchange-newline" /&gt;&lt;b&gt;To Package:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;tar -cvzf myFile.tgz myDirectory&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: inherit;"&gt;&lt;b&gt;To Unpackage&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;tar -xvzf myFile.tgz&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;b&gt;To Encrypt:&lt;/b&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;openssl aes-128-cbc -e -pass pass:S0mEPA55W0rd -in myFile.xyz -out myFile.xyz-enc&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: inherit;"&gt;&lt;b&gt;To Decrypt:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;openssl aes-128-cbc -d -pass pass:S0mEPA55W0rd -in myFile.xyz-enc -out myFile.xyz&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-family: inherit;"&gt;The chances are that you knew about making an archive with tar, but I threw it in anyway! However, a few minutes looking at the openssl command line might help.&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-family: inherit;"&gt;The first argument is the command openssl is going to perform. In my example I am telling it to do some encryption or decryption using the &lt;a href="http://en.http//en.wikipedia.org/wiki/Advanced_Encryption_Standard.org/wiki/Block_cipher_mode_of_operation#Cipher-block_chaining_.28CBC.29" target="_blank"&gt;aes&lt;/a&gt; cryptography algorithm with a key size of 128 bits using &lt;a href="http://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Cipher-block_chaining_.28CBC.29" target="_blank"&gt;cypher-block-chaining&lt;/a&gt;. This means that we are using a standard and well respected form of encryption with a reasonable width key and we are linking one encrypted block to the next so that parallel attack is inhibited.&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-family: inherit;"&gt;From then on it is pretty obvious what the arguments do. Using -in and -out as different files is wise. If you miss the pass:xxxxx command after the -pass argument, openssl asks to have the password typed-in which is more secure because you do not end up with the password in the command history buffer.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Windows And 7Zip:&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-CKT_m8xNlbE/UX5sVT1u95I/AAAAAAAAJgs/eWB4p3Ixjts/s1600/7Zip-1.tiff" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="441" src="http://2.bp.blogspot.com/-CKT_m8xNlbE/UX5sVT1u95I/AAAAAAAAJgs/eWB4p3Ixjts/s640/7Zip-1.tiff" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;In Windows Explorer, right click and select 7-Zip&amp;gt;Add to archive.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-tw5bEylvCOY/UX5sUX7xGeI/AAAAAAAAJgk/BPsraYGWvqU/s1600/7zip-2.tiff" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="560" src="http://4.bp.blogspot.com/-tw5bEylvCOY/UX5sUX7xGeI/AAAAAAAAJgk/BPsraYGWvqU/s640/7zip-2.tiff" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;If you are not sure if the other user(s) has 7-Zip you can create a self extracting archive.&lt;br /&gt;Here I am encrypting at 256 bits AES - just 'cause I can.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;A note on key length.&lt;/b&gt; 128 is near impossible to crack for any normal organisation. If you expect GCHQ or the NSA to not crack it - you are in over your head. No level of encryption is any good unless the whole system - end to end - is solid. If your system is solid enough to justify 256 bit AES then you already know everything here!&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Sharing between *nix and Windows:&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div style="text-align: justify;"&gt;
Not sure! Any good suggestions? I have used command line 7-Zip on Linux before but that was a very long time ago.&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-6974622089702062";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
//2007-03-31: nerds-central.blogspot.com
google_ad_channel = "3328078122";
//--&gt;
&lt;/script&gt;
&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" 
 type="text/javascript"&gt;
&lt;/script&gt;
&lt;script src='http://www.mightycrap.com/Utils/ReferrerScanner.js' type='text/javascript'&gt;
&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vvIEq/~4/cGfCYDzXuoY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://nerds-central.blogspot.com/feeds/6204769390131872223/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://nerds-central.blogspot.com/2013/04/easy-encryption-passing-sensitive-files.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/6204769390131872223?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/6204769390131872223?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vvIEq/~3/cGfCYDzXuoY/easy-encryption-passing-sensitive-files.html" title="Easy Encryption: Passing Sensitive Files Via Dropbox Or Google Drive" /><author><name>Alexander Turner</name><uri>https://plus.google.com/114304476302249483316</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-5CFwcBYLGnQ/AAAAAAAAAAI/AAAAAAAAIl8/1DV4r17FExM/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-IQV6jw0KJ20/UX5RXOP6o3I/AAAAAAAAJgQ/MhzSLOUIYp4/s72-c/dogies.png" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://nerds-central.blogspot.com/2013/04/easy-encryption-passing-sensitive-files.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0MDQ30zcCp7ImA9WhBUEEQ.&quot;"><id>tag:blogger.com,1999:blog-33157069.post-8863688225688368900</id><published>2013-04-27T19:37:00.001Z</published><updated>2013-04-27T19:37:52.388Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-04-27T19:37:52.388Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="algorithms" /><category scheme="http://www.blogger.com/atom/ns#" term="threading" /><title>Ultra Fast Locking - Rebirth of the spin lock</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-_0obGXnKXQU/UTY9Om2V8qI/AAAAAAAAJKI/oBERLEMPaGM/s1600/Lucy+Rascal.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="300" src="http://4.bp.blogspot.com/-_0obGXnKXQU/UTY9Om2V8qI/AAAAAAAAJKI/oBERLEMPaGM/s400/Lucy+Rascal.jpg" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;b&gt;&lt;span style="font-size: small;"&gt;Little, cute and agile - a balanced approach to locking.&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
Copyright Dr Alexander J Turner all rights reserved.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;Locks (monitors or what ever) are becoming an ever more&amp;nbsp;important&amp;nbsp;aspect of software engineering. Yet, we tend to know so little about them.&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
With the invention of critical sections and/or the futex, a lot of programmers have stopped considering locks as a key part of development. This is a shame because futex approaches only offer a benefit for uncontended locking. Uncontended locking being, well, no locking at all. In other words, a futex is a good solution to needing a lock but not actually using it most of the time.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Let use thing about an example of what I am getting at.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
1) Get a lock.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
2) Read from a map.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
3) Release the lock.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Consider that two threads try to perform step 1 at once. Thread A gets the lock and the only effect of this is an atomic value set. Thread B reads the lock value and so we get a cache flush if A and B are on different cores. So far nothing too expensive has happened. The problem now is 'what should thread B do?' The futex/critical-section answer is go to sleep. This means relinquishing its quanta to the kernel which is a context switch at the very least.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
A context switch on modern operating systems is generally considered to take thousands of cycles. There is no way reading from and std::map can take thousands of cycles unless the map is HUGE. If the map is HUGE then an unordered map should be used. Then that will not take thousands of cycles unless the keys are HUGE. Basically, a map that takes thousands of cycles to read is simply broken.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
This means that the moment our lock if contended, our solution is wasting masses (and masses) of clock cycles context switching.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;But it is worse!&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Remember that Thread B lost its quantum. Sometimes we don't mind. If our application is not time sensitive this does not matter. However, what if it is real time or time sensitive? An example of a highly time sensitive program is a profiler. If the profiler code looses its quantum early then the resulting timing numbers for the profiled code will be useless. In the real world, loosing quanta causes a lot of trouble and should be avoided. A thread should go to sleep when its quanta run out, not but deliberately relinquishing them. Early quantum&amp;nbsp;relinquishing&amp;nbsp;also puts strain on the kernel schedular which is an other scaling issue with multi-core machines.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;Lock Free And Light Locking:&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Lock free algorithms can really help. By lock free, I mean that the algorithm does not use any locks which can loose a quantum. Building a lock free map is quite straight forward as long as it never needs to be re-balanced. The solution is, on mutation, to simply create a new map which shares all the same nodes other than those from the root to the point of mutation. Then, the root access to the map can be updated atomically so that all readers only see the original or the new map and never a mixture of the two. This means that the only point of contention is the atomic update of the root node.&amp;nbsp;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Is this really lock free? Yes it is in terms of the algorithm never resulting in a context switch or loss of a the current schedular quantum. However, in another sense it is not lock free. Let us consider that two threads are mutating the map at the same time. In this scenario we will consider three threads: A, B and C where A is reading only but B and C are mutating the map.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Broken:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;A is reading the map. A gets the root node and follows it. No problem.&lt;/li&gt;
&lt;li&gt;Whilst A is reading the map B mutates the map. No problem because B is creating a new root node and not interfering with A in any way.&lt;/li&gt;
&lt;li&gt;At the same time C is mutating the map. C also creates a new root node which is a different root node to B's new node. C is unaware of B.&lt;/li&gt;
&lt;li&gt;We can now forget A.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;B atomically changes the root node pointer to its new root node.&lt;/li&gt;
&lt;li&gt;C atomically changes the root node pointer to its new root node - and in so doing erases B's changes.&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;b&gt;Fixed:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;A is reading the map. A gets the root node and follows it. No problem.&lt;/li&gt;
&lt;li&gt;Whilst A is reading the map B mutates the map. No problem because B is creating a new root node and not interfering with A in any way.&lt;/li&gt;
&lt;li&gt;At the same time C is mutating the map. C also creates a new root node which is a different root node to B's new node. Again, C is unaware of B at this stage.&lt;/li&gt;
&lt;li&gt;We can now forget A.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;B uses compare and swap to change the root node pointer to its new root node. B compares the root node pointer with its value when B started creating a new root node and as they match its new pointer is swapped in (see &lt;a href="http://a%20is%20reading%20the%20map.%20a%20gets%20the%20root%20node%20and%20follows%20it.%20no%20problem%20whilst%20a%20is%20reading%20the%20map%20b%20mutates%20the%20map.%20no%20problem%20because%20b%20is%20creating%20a%20new%20root%20node%20and%20not%20interfering%20with%20a%20in%20any%20way.%20at%20the%20same%20time%20c%20is%20mutating%20the%20map.%20c%20also%20creates%20a%20new%20root%20node%20which%20is%20a%20different%20root%20node%20to%20b%27s%20new%20node.%20we%20can%20now%20forget%20a.%20%20b%20atomically%20changes%20the%20root%20node%20pointer%20to%20its%20new%20root%20node.%20c%20atomically%20changes%20the%20root%20node%20pointer%20to%20its%20new%20root%20node%20-%20and%20in%20so%20doing%20erases%20b%27s%20changes./" target="_blank"&gt;compare and swap&lt;/a&gt;&amp;nbsp;- &lt;i&gt;cas&lt;/i&gt;).&lt;/li&gt;
&lt;li&gt;C uses compare and swap to change the root node but the cas operation fails because B changed the root node pointer.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;C starts again.&lt;/li&gt;
&lt;li&gt;C keeps doing this till it manages to get a matching cas.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;This is actually a write spin lock:&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
C is spinning, recreating new root nodes and the chain of nodes to the mutated node until its cas operation is successful. Could we create a simple read/write spin lock to achieve the same thing?&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Why are spin locks bad:&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
It is commonly thought that spin locks are bad. Once upon a time they were. They don't really make all that much sense on single core machines. On multi-core (or multi-socket) machines spin locks make a lot of sense for locking very short operations (like reading and writing from/to maps). &amp;nbsp;Further, we can see that 'lock free' algorithms can easily start to behave like spin locks so why not give up the prejudice and just use a spin lock?&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Read/Write locks:&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
A simple spin lock will strictly serialise access to a piece of code. Alternatively, a read/write lock has the following behaviour.&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;If unlocked, a reader or a writer can acquire the lock.&lt;/li&gt;
&lt;li&gt;If read locked, another reader can share the lock but a writer is locked out.&lt;/li&gt;
&lt;li&gt;If write locked, everything else is locked out.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
This is perfect for a map because we do not stop multiple threads accessing the map for read. I am not suggesting it is a better solution than a well crafted lock free algorithm, but is sure is a good quick and dirty alternative.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Note: because we are using cas, a well constructed caching architecture will not require a cache flush as&amp;nbsp;multiple readers acquire simultaneous locks.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;How:&lt;/b&gt;&lt;br /&gt;
We have a memory location which can take 3 values - 0,1 and 2.&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;0 means unlocked&lt;/li&gt;
&lt;li&gt;1 means read locked&lt;/li&gt;
&lt;li&gt;2 means write locked.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;b&gt;Lock semantics:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;To get a read lock, cas is performed with the set value of 1 and a compare value of 0. If the return value is 1 or 0 then the lock is acquired, otherwise try again. In other words, if it is read locked, do nothing; if it is unlocked, read lock it; if it is write locked, spin.&lt;/li&gt;
&lt;li&gt;To get a write lock, cas is performed with a compare value of 0. If 0 is returned then the lock is returned, otherwise try again. In other words, if it is locked at all, spin.&lt;/li&gt;
&lt;li&gt;To release either lock, set to 0.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;b&gt;Problems:&lt;/b&gt;&lt;br /&gt;
This is only a reasonable approach if the time spinning is very short. This is a technique for protecting short operations. It also makes no attempt at all to be fair. Some form of queueing system might help with this - but that is beyond the scope of this post.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-6974622089702062";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
//2007-03-31: nerds-central.blogspot.com
google_ad_channel = "3328078122";
//--&gt;
&lt;/script&gt;
&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" 
 type="text/javascript"&gt;
&lt;/script&gt;
&lt;script src='http://www.mightycrap.com/Utils/ReferrerScanner.js' type='text/javascript'&gt;
&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vvIEq/~4/-7Qw1CVdv0M" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://nerds-central.blogspot.com/feeds/8863688225688368900/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://nerds-central.blogspot.com/2013/04/ultra-fast-locking-rebirth-of-spin-lock.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/8863688225688368900?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/8863688225688368900?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vvIEq/~3/-7Qw1CVdv0M/ultra-fast-locking-rebirth-of-spin-lock.html" title="Ultra Fast Locking - Rebirth of the spin lock" /><author><name>Alexander Turner</name><uri>https://plus.google.com/114304476302249483316</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-5CFwcBYLGnQ/AAAAAAAAAAI/AAAAAAAAIl8/1DV4r17FExM/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-_0obGXnKXQU/UTY9Om2V8qI/AAAAAAAAJKI/oBERLEMPaGM/s72-c/Lucy+Rascal.jpg" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://nerds-central.blogspot.com/2013/04/ultra-fast-locking-rebirth-of-spin-lock.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0UERXczeSp7ImA9WhBVFEg.&quot;"><id>tag:blogger.com,1999:blog-33157069.post-2131420520727958888</id><published>2013-04-20T09:38:00.001Z</published><updated>2013-04-20T09:46:44.981Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-04-20T09:46:44.981Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="Security" /><category scheme="http://www.blogger.com/atom/ns#" term="jvm" /><title>STOP THE JAVA SECURITY NONSENSE!</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-u0cxLosyy_0/UXJWvj7ZBKI/AAAAAAAAJdE/OWJGN_b8dbY/s1600/silly.gif" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;" target="_blank"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/-u0cxLosyy_0/UXJWvj7ZBKI/AAAAAAAAJdE/OWJGN_b8dbY/s320/silly.gif" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;If you want to look silly - stick to pulling faces&lt;br /&gt;
and don't talk&amp;nbsp;nonsense&amp;nbsp;about Java.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;What a load of tosh. It is major scary to find out how&amp;nbsp;miss-understood&amp;nbsp;software is even by self proclaimed&amp;nbsp;professionals.&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;u&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;Some terminology:&lt;/span&gt;&lt;/u&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;b&gt;Java&lt;/b&gt;, is a programming language which is compiled to byte code.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;b&gt;Byte code&lt;/b&gt;, a low level programming language used by the JVM.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;b&gt;JVM&lt;/b&gt; the software which runs programs which are compiled to or written in byte code.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;b&gt;Browser&lt;/b&gt; a piece of software for accessing stuff of the web using standard protocols (HTTP and HTML).&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;b&gt;HTTP&lt;/b&gt; a web protocol for transmitting data.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;b&gt;HTML&lt;/b&gt; a web protocol for defining how to display stuff in browsers.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;b&gt;Browser plugin&lt;/b&gt;, a piece of software which offers extended features to a browser beyond what can be done by HTML.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;b&gt;HTML5&lt;/b&gt; a very powerful, recent and still evolving version of HTML.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;You cannot install or uninstall Java from a browser&lt;/b&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
Sadly JVM plugins are called Java plugins. But they are not. A browser plugin which is often referred to as 'Java' is actually the JVM. Code written in any pure byte-code generating&amp;nbsp;language&amp;nbsp;(Scala for example), or just hand written in byte-code by a human, can run in a JVM plugin.&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Nearly all uses for the JVM are stand alone - not in plugins&lt;/b&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
Interestingly, you do not need to install the JVM. It is just a program which can be downloaded and run (technically a shared library and launcher application). Its use in plugins is starting to be a legacy. HTML5 can replace a lot of what JVM plugins do. I can see a world where JVM browser plugins are a pure thing of the past. You do need to install a JVM plugin, but not stand alone JVM. Programs you have running might have the JVM as part of them and you would never know.&lt;/div&gt;
&lt;br /&gt;
&lt;i&gt;Real world example&lt;/i&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
I am planning a training course in Java/JVM performance analysis. As part of this I will be providing people with remote desktop access to a single machine. I could have chosen JVM as the &amp;nbsp;way to deliver this to browsers but HTML5 proved to be a better choice!&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
Many very powerful programs run on the JVM. These tend to be high end systems. Stuff like the Eclipse developer environment, databases and cloud data mining systems. All these use the JVM and most of the software for them is written in Java. Next time you book an airline ticket or go to your bank's website you will almost&amp;nbsp;certainly&amp;nbsp;be interfacing with huge Java/JVM based systems. You will also probably be interfacing with COBOL/Mainframe based systems which are talking to the Java/JVM systems - but that is another story.&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;b&gt;&lt;span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"&gt;If the JVM plugin for browsers dies out, it will have almost no impact on the use of Java. Oracle are not interested in the JVM plugin to any great extent. All the money in Java/JVM is on high end stand alone software not trivial plugins.&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-24Iy4KkAPPI/UXJjQUGWELI/AAAAAAAAJd0/9EFCTK_0xeY/s1600/Java-Popular.tiff" imageanchor="1" style="margin-left: auto; margin-right: auto;" target="_blank"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/-24Iy4KkAPPI/UXJjQUGWELI/AAAAAAAAJd0/9EFCTK_0xeY/s400/Java-Popular.tiff" width="378" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;According to the &lt;a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html" target="_blank"&gt;TIOBE programming language&amp;nbsp;survey&lt;/a&gt;&lt;br /&gt;April 2013, Java is the world's second most&amp;nbsp;popular programming&lt;br /&gt;&amp;nbsp;languageand is in place to retake the top&lt;br /&gt;spot any time now.&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;b&gt;Java/JVM applications are no more or less secure than any other application&lt;/b&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
Once you download an application and run it you have given up any chance of security. You have to be sure the program is from a reputable supplier and will not do bad things. In Windows, most programs are written in C++. This language makes even less attempt to make security assertions than Java; neither make any serious attempt to maintain security when an application is running on your computer. If someone states Java is insecure, they are talking very dangerous nonsense because they are implying something else &lt;b&gt;&lt;i&gt;is&lt;/i&gt;&lt;/b&gt; secure.&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;b&gt;&lt;span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"&gt;You cannot, must not, ever, under any circumstances think that a downloaded application can be secure because of the technology it is written in. This thinking can only be applied to browser plugins and they are a thing of the past.&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Flash is another plugin that you might well be using for watching Youtube videos. One day that will die away too. The 'Java' plugin stuff is really a debate about plugins in general, they are always going to represent a security hole.&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Why JVM plugins are insecure&lt;/b&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
There is a specific problem with JVM plugins. The JVM offers too much power to the plugin and then tries to restrict the ability of software running in that plugin to use the power. This is in contrast to Flash which is just limited end-of-story. The flash model is a much better model for plugins.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;hr /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;What should you do?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;b&gt;Don't,&amp;nbsp;&lt;/b&gt;get all silly and remove every trace of Java and the JVM from your computer. That will make no difference to anything other than stop some stuff working.&lt;br /&gt;
&lt;b&gt;Do&lt;/b&gt;, feel free to disable or remove JVM plugins from your browsers.&lt;br /&gt;
&lt;b&gt;Do&lt;/b&gt;, if you have to have a JVM plugin for a work email system (for example) or some other application like that, install two browsers (say Chrome and Firefox) and have Java in one and not in the other. Only go to safe sites (like your work site) with the browser which has the JVM in it.&lt;br /&gt;
&lt;b&gt;Don't&lt;/b&gt;, listen to idiots who have no idea what they are talking about.&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-6974622089702062";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
//2007-03-31: nerds-central.blogspot.com
google_ad_channel = "3328078122";
//--&gt;
&lt;/script&gt;
&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" 
 type="text/javascript"&gt;
&lt;/script&gt;
&lt;script src='http://www.mightycrap.com/Utils/ReferrerScanner.js' type='text/javascript'&gt;
&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vvIEq/~4/7OhXYqurFC8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://nerds-central.blogspot.com/feeds/2131420520727958888/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://nerds-central.blogspot.com/2013/04/stop-java-nonsense.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/2131420520727958888?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/2131420520727958888?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vvIEq/~3/7OhXYqurFC8/stop-java-nonsense.html" title="STOP THE JAVA SECURITY NONSENSE!" /><author><name>Alexander Turner</name><uri>https://plus.google.com/114304476302249483316</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-5CFwcBYLGnQ/AAAAAAAAAAI/AAAAAAAAIl8/1DV4r17FExM/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-u0cxLosyy_0/UXJWvj7ZBKI/AAAAAAAAJdE/OWJGN_b8dbY/s72-c/silly.gif" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://nerds-central.blogspot.com/2013/04/stop-java-nonsense.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEYCRXY-eCp7ImA9WhBVEk0.&quot;"><id>tag:blogger.com,1999:blog-33157069.post-628719471080320411</id><published>2013-04-17T12:36:00.000Z</published><updated>2013-04-17T12:36:04.850Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-04-17T12:36:04.850Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="news and views" /><title>The Real Reason PC Sales Are Declining</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-eQ17_yMpADI/ULjZd9CYFQI/AAAAAAAAIQ4/z07SjtSM-Kw/s1600/light.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="275" src="http://4.bp.blogspot.com/-eQ17_yMpADI/ULjZd9CYFQI/AAAAAAAAIQ4/z07SjtSM-Kw/s400/light.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;Shining some light on the declining PC market.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: xx-small;"&gt;&lt;i&gt;Copyright Dr Alexander J Turner all rights reserved.&lt;/i&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Doh! It is so obvious yet so hard to see if you're stuck in last decade's mind set.&lt;/span&gt;&lt;/h3&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;PCs traditionally sold due to:&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;b&gt;1)&lt;/b&gt; People buying for the first time.&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;b&gt;2)&lt;/b&gt; New hardware being the only way to make things go faster.&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;b&gt;3)&lt;/b&gt; New features which significantly enhance the range of things a computer could do.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;b&gt;All these have hit the buffers:&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;b&gt;1) &lt;/b&gt;Everyone has a PC who can afford one and/or has an interest in one.&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;b&gt;2)&lt;/b&gt; Browsers are getting faster and faster due to software enhancements and processing mostly all being done in the cloud.&amp;nbsp;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;b&gt;*&lt;/b&gt; &amp;nbsp;A 3 year old netbook can do more now than when it was new.&amp;nbsp;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;b&gt;*&lt;/b&gt; 90% of most user's experience is either their computer being a thin client to a cloud, an intra-net web-application or using MS Office to write a document which a turn-of-the-century PC could easily manage.&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;b&gt;3)&lt;/b&gt; Touch screens are the big new feature but they do not add to what the computer can do. Look back a few years and the killer application for a PC was being about being able to play surround sound, or video at 1080p or be high resolution colour etc. There is nothing you can actually do with a touch screen that you cannot do with a non-touch PC - touch screens are user interface not&amp;nbsp;functionality.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;Conclusion:&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
The technology of a modern PC is good enough to service the limited physical realities of its users. A modern PC can render video at a higher resolution than we can see and sound at a higher quality than we can hear. We can type faster on a keyboard than a touch screen and touch-pads&amp;nbsp;are so good we can navigate in any way we want with the machine. &amp;nbsp;A good PC from 2 years ago has no significant&amp;nbsp;disadvantage&amp;nbsp;over a good PC now in the functionality it provides so why buy a replacement?&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;b&gt;We drive cars with the same control layout they had 80 years ago; sooner or later a design is simply good enough. That happened a few years ago with the PC.&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;The Future:&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
There is no slowing of the progress of IT. We are at most only half way through the IT revolution. Its biggest effects are yet to come. Indeed, I predict that if humanity is going to survive the next 200 years in anything like a&amp;nbsp;civilised&amp;nbsp;way, it will be because of the effects of the IT revolution. However, the days of the ever growing PC market are well and truly over.&lt;/div&gt;
&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-6974622089702062";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
//2007-03-31: nerds-central.blogspot.com
google_ad_channel = "3328078122";
//--&gt;
&lt;/script&gt;
&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" 
 type="text/javascript"&gt;
&lt;/script&gt;
&lt;script src='http://www.mightycrap.com/Utils/ReferrerScanner.js' type='text/javascript'&gt;
&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vvIEq/~4/mcSNwwRTbko" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://nerds-central.blogspot.com/feeds/628719471080320411/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://nerds-central.blogspot.com/2013/04/the-real-reason-pc-sales-are-declining.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/628719471080320411?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/628719471080320411?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vvIEq/~3/mcSNwwRTbko/the-real-reason-pc-sales-are-declining.html" title="The Real Reason PC Sales Are Declining" /><author><name>Alexander Turner</name><uri>https://plus.google.com/114304476302249483316</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-5CFwcBYLGnQ/AAAAAAAAAAI/AAAAAAAAIl8/1DV4r17FExM/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-eQ17_yMpADI/ULjZd9CYFQI/AAAAAAAAIQ4/z07SjtSM-Kw/s72-c/light.png" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://nerds-central.blogspot.com/2013/04/the-real-reason-pc-sales-are-declining.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkYCR3o_cCp7ImA9WhBVEU0.&quot;"><id>tag:blogger.com,1999:blog-33157069.post-3301556503580352566</id><published>2013-04-16T10:29:00.002Z</published><updated>2013-04-16T10:29:26.448Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-04-16T10:29:26.448Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="image processing" /><category scheme="http://www.blogger.com/atom/ns#" term="The Gimp" /><category scheme="http://www.blogger.com/atom/ns#" term="breasts" /><title>Making Breasts Look Bigger Using The GIMP</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-p2cHJkW0TXM/UWxOpqZCQ1I/AAAAAAAAJaE/1IJRKIW3ik8/s1600/egypt-after.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;" target="_blank"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/-p2cHJkW0TXM/UWxOpqZCQ1I/AAAAAAAAJaE/1IJRKIW3ik8/s400/egypt-after.png" width="266" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Has this image been edited?&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 style="text-align: justify;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;The GIMP is free and very powerful. Do not trust any image use see, even on flicker or facebook. Anyone can make themselves look bigger, better, thinner or whatever. In the 21st century, photographs always lie!&lt;/span&gt;&lt;/h3&gt;
&lt;div style="text-align: justify;"&gt;
&lt;i&gt;The images on this page are derived from &lt;a href="http://www.flickr.com/photos/34128007@N04/8417628657/" target="_blank"&gt;this work&lt;/a&gt; which is provided under a creative commons license for commercial and&amp;nbsp;derivative&amp;nbsp;work with attribution. Thanks 'prayitno'.&lt;/i&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
Is the image top-right edited? When I asked this question to my 16 year old daughter, after some moments thought, she concluded that it was not. I then asked my 21 year old son; he said that it probably was because most images are, and I was asking the question (he is studying&amp;nbsp;philosophy&amp;nbsp;- can you tell?). However, he could not actually tell by looking at it that it was edited.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
I have no doubt that a lot of people who are experienced with photo editing will see what I have done instantly - but that is not the point!&lt;/div&gt;
&lt;br /&gt;
&lt;hr style="clear: both;" /&gt;
&lt;br /&gt;
Below is a before and after comparison of the image:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-9yK5_AMZPUI/UWxSOXUi9OI/AAAAAAAAJac/QdnFYe0GME8/s1600/egypt-both.png" imageanchor="1" style="margin-left: auto; margin-right: auto;" target="_blank"&gt;&lt;img border="0" height="474" src="http://1.bp.blogspot.com/-9yK5_AMZPUI/UWxSOXUi9OI/AAAAAAAAJac/QdnFYe0GME8/s640/egypt-both.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;Left before editing, right after enlarging the breasts and narrowing the waste.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: justify;"&gt;
&lt;/div&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-uWpOQrd5M_4/UW0e9JMYZqI/AAAAAAAAJb8/TWC-GwNuhF8/s1600/egypt-alternative.gif" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;" target="_blank"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-uWpOQrd5M_4/UW0e9JMYZqI/AAAAAAAAJb8/TWC-GwNuhF8/s320/egypt-alternative.gif" width="213" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Breasts here one second - gone&lt;br /&gt;
the next.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div style="text-align: justify;"&gt;
To really drive home the magnitude of the editing done - which two savvy young people did not spot - here is an animated gif:&lt;/div&gt;
&lt;br /&gt;
In a moment I will give a detailed description of what I did to perform this edit. However, let me finish this section by making a few points:&lt;br /&gt;
&lt;br /&gt;
&lt;ol style="text-align: left;"&gt;
&lt;li&gt;I am a computer programmer not a professional image editor.&lt;/li&gt;
&lt;li&gt;This edit took me 10 minutes one evening sat on a sofa.&lt;/li&gt;
&lt;li&gt;The GIMP is free and on every major computer platform.&lt;/li&gt;
&lt;li&gt;Even with my level of skill, had I taken more time, the effect would be even harder to spot.&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br class="Apple-interchange-newline" /&gt;&lt;/div&gt;
&lt;hr style="clear: both; text-align: left;" /&gt;
&lt;div style="text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-dGxW0fhyZvE/UWxTN743hzI/AAAAAAAAJa8/5uHKSvO_mII/s1600/boob-1.png" imageanchor="1" style="margin-left: auto; margin-right: auto; text-align: center;" target="_blank"&gt;&lt;img border="0" height="230" src="http://2.bp.blogspot.com/-dGxW0fhyZvE/UWxTN743hzI/AAAAAAAAJa8/5uHKSvO_mII/s320/boob-1.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Pick one side or the other to start with, it is easier to&lt;br /&gt;get one right and make the other match than try to do&lt;br /&gt;two at once.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-OPUr9YbSXrY/UWxTLDcm0AI/AAAAAAAAJas/twWQ3Darzkw/s1600/boob-2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;" target="_blank"&gt;&lt;img border="0" height="222" src="http://1.bp.blogspot.com/-OPUr9YbSXrY/UWxTLDcm0AI/AAAAAAAAJas/twWQ3Darzkw/s320/boob-2.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Select Filters/Distorts/IWarp the default setting is&lt;br /&gt;as shown above - this is not what you want.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-TLA7gdaMFP0/UWxTN6Jr3uI/AAAAAAAAJbA/KzhQ0coTpaw/s1600/boob-4.png" imageanchor="1" style="margin-left: auto; margin-right: auto;" target="_blank"&gt;&lt;img border="0" height="222" src="http://3.bp.blogspot.com/-TLA7gdaMFP0/UWxTN6Jr3uI/AAAAAAAAJbA/KzhQ0coTpaw/s320/boob-4.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Set to grow and make the radius bigger. The radius&lt;br /&gt;will depend on your image size. But start with&lt;br /&gt;something about 1/3 the radius of the area you &lt;br /&gt;want to enlarge. Then start clicking to warp starting at where you&lt;br /&gt;think the nipple should be and work out. This mimics the way&lt;br /&gt;breasts actually grow and so will give you the best chance of&lt;br /&gt;imitating nature.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-8JNQObSn114/UWxTOgNuIGI/AAAAAAAAJbI/ShDUCd1rU40/s1600/boob-5.png" imageanchor="1" style="margin-left: auto; margin-right: auto;" target="_blank"&gt;&lt;img border="0" height="222" src="http://4.bp.blogspot.com/-8JNQObSn114/UWxTOgNuIGI/AAAAAAAAJbI/ShDUCd1rU40/s320/boob-5.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;The smaller radius is good but can start to distort the image&lt;br /&gt;a bit too much, some work with a larger radius will help this.&lt;br /&gt;Make sure not to over do clicking in any one place.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div style="text-align: justify;"&gt;
At this point a note on anatomy. In a bra, a breast is usually compressed and forced up and back. This makes larger breasts force the side of the bra out under the arm and in towards the cleavage. The tissue above the breast is also forced up. You need to be careful to replicate these effects to make the image look natural. The sides are especially important as humans are very sensitive to silhouette.&lt;/div&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-vgOgfsVZZ9k/UWxTS6covOI/AAAAAAAAJbk/a-wJqaO5M2w/s1600/boob-6.png" imageanchor="1" style="margin-left: auto; margin-right: auto; text-align: center;" target="_blank"&gt;&lt;img border="0" height="230" src="http://4.bp.blogspot.com/-vgOgfsVZZ9k/UWxTS6covOI/AAAAAAAAJbk/a-wJqaO5M2w/s320/boob-6.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Now we need to make the other side match.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-bYnlaXCtO20/UWxTPpcSwjI/AAAAAAAAJbU/h_m5La8VBBI/s1600/boob-7.png" imageanchor="1" style="margin-left: auto; margin-right: auto;" target="_blank"&gt;&lt;img border="0" height="210" src="http://3.bp.blogspot.com/-bYnlaXCtO20/UWxTPpcSwjI/AAAAAAAAJbU/h_m5La8VBBI/s320/boob-7.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;This is tricky but very important. You need to imagine the original&lt;br /&gt;in 3D so that the offset angles match. In this case the subject is&lt;br /&gt;facing very slightly to the viewer's right. This means that as the left&lt;br /&gt;breast (on the right) is enlarged it will bulge out more to the viewer's&lt;br /&gt;right than the left one did to the viewers left.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-cuqUo8UXv3A/UWxTS_CQGyI/AAAAAAAAJbc/xL3tT14X628/s1600/boob-9.png" imageanchor="1" style="margin-left: auto; margin-right: auto;" target="_blank"&gt;&lt;img border="0" height="226" src="http://2.bp.blogspot.com/-cuqUo8UXv3A/UWxTS_CQGyI/AAAAAAAAJbc/xL3tT14X628/s320/boob-9.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;By enlarging the left breast a compression of the left arm can happen.&lt;br /&gt;Some small radius grow distortion in the middle of the arm&lt;br /&gt;helps compensate. If you are lucky, it might even look&lt;br /&gt;like the breast is pushing against the arm making the image look&lt;br /&gt;more real and the breast look firm.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-IJy_JeDhjfQ/UWxTUGlKFVI/AAAAAAAAJbs/aQg-qtj35NY/s1600/boob-8.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;" target="_blank"&gt;&lt;img border="0" height="230" src="http://4.bp.blogspot.com/-IJy_JeDhjfQ/UWxTUGlKFVI/AAAAAAAAJbs/aQg-qtj35NY/s320/boob-8.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;After some tweaking, we now have a fairly balanced&lt;br /&gt;pair of breasts, but the image looks wrong because we do not&lt;br /&gt;expect to see such large rounded breasts without more waist.&lt;br /&gt;This is not a comment on the human form but more the&lt;br /&gt;expectation that modern media place upon us.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-5iP-VXc4hfk/UWxTJG2C_XI/AAAAAAAAJak/DhZyGsf4C3s/s1600/boob-10.png" imageanchor="1" style="margin-left: auto; margin-right: auto; text-align: center;" target="_blank"&gt;&lt;img border="0" height="226" src="http://4.bp.blogspot.com/-5iP-VXc4hfk/UWxTJG2C_XI/AAAAAAAAJak/DhZyGsf4C3s/s320/boob-10.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Here I have used a shrink with radius 55 and moved around a&lt;br /&gt;bit shrinking the sides of the waste. A couple of clicks right on&lt;br /&gt;the belly button pulls the abdomen in to match the narrower&lt;br /&gt;waste. The hips then look wider and more rounded.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-p2cHJkW0TXM/UWxOpqZCQ1I/AAAAAAAAJaE/1IJRKIW3ik8/s1600/egypt-after.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;" target="_blank"&gt;&lt;img border="0" height="640" src="http://1.bp.blogspot.com/-p2cHJkW0TXM/UWxOpqZCQ1I/AAAAAAAAJaE/1IJRKIW3ik8/s640/egypt-after.png" width="427" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="font-size: 12.727272033691406px; text-align: center;"&gt;&lt;b style="font-size: medium;"&gt;Never trust an image!&lt;/b&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div style="text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-6974622089702062";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
//2007-03-31: nerds-central.blogspot.com
google_ad_channel = "3328078122";
//--&gt;
&lt;/script&gt;
&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" 
 type="text/javascript"&gt;
&lt;/script&gt;
&lt;script src='http://www.mightycrap.com/Utils/ReferrerScanner.js' type='text/javascript'&gt;
&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vvIEq/~4/X54G0JMA46s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://nerds-central.blogspot.com/feeds/3301556503580352566/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://nerds-central.blogspot.com/2013/04/making-breasts-look-bigger-using-gimp.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/3301556503580352566?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/3301556503580352566?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vvIEq/~3/X54G0JMA46s/making-breasts-look-bigger-using-gimp.html" title="Making Breasts Look Bigger Using The GIMP" /><author><name>Alexander Turner</name><uri>https://plus.google.com/114304476302249483316</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-5CFwcBYLGnQ/AAAAAAAAAAI/AAAAAAAAIl8/1DV4r17FExM/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-p2cHJkW0TXM/UWxOpqZCQ1I/AAAAAAAAJaE/1IJRKIW3ik8/s72-c/egypt-after.png" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://nerds-central.blogspot.com/2013/04/making-breasts-look-bigger-using-gimp.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkUESH89fip7ImA9WhBWGU4.&quot;"><id>tag:blogger.com,1999:blog-33157069.post-5273779133770260707</id><published>2013-04-12T11:06:00.000Z</published><updated>2013-04-14T09:03:29.166Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-04-14T09:03:29.166Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="rave" /><title>Neat Code == Bad Code</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-Yh5dXwZHMSo/UUxIk0CwguI/AAAAAAAAJTM/vcvk-msJVVM/s1600/Seriously.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-Yh5dXwZHMSo/UUxIk0CwguI/AAAAAAAAJTM/vcvk-msJVVM/s320/Seriously.png" width="256" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;h2 style="text-align: justify;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Some people believe perfect code layout is utterly essential to good coding practice. I completely disagree.&lt;/span&gt;&lt;/h2&gt;
&lt;div style="text-align: justify;"&gt;
Good code layout is a very good idea. Code should be easy to read and indentation should be used to clearly identify functional and/or semantic blocks. However, placing more emphasis on neatness than these&amp;nbsp;guidelines suggest is like drinking 20 espressos - it makes matters worse not better.&lt;/div&gt;
&lt;br /&gt;
&lt;h3 style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Why this rave?&lt;/span&gt;&lt;/h3&gt;
I saw the following piece of barf worthy code in the source for the JDK - yes really:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="s4"&gt;public&lt;/span&gt; &lt;span class="s4"&gt;final&lt;/span&gt; &lt;span class="s4"&gt;void&lt;/span&gt; writeInt(&lt;span class="s4"&gt;int&lt;/span&gt; v) &lt;span class="s4"&gt;throws&lt;/span&gt; IOException {&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="s5"&gt;out&lt;/span&gt;.write((v &amp;gt;&amp;gt;&amp;gt; 24) &amp;amp; 0xFF);&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="s5"&gt;out&lt;/span&gt;.write((v &amp;gt;&amp;gt;&amp;gt; 16) &amp;amp; 0xFF);&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="s5"&gt;out&lt;/span&gt;.write((v &amp;gt;&amp;gt;&amp;gt;&amp;nbsp; 8) &amp;amp; 0xFF);&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="s5"&gt;out&lt;/span&gt;.write((v &amp;gt;&amp;gt;&amp;gt;&amp;nbsp; 0) &amp;amp; 0xFF);&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; incCount(4);&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
1) Unsigned shift 24 bits to the right on a 32 bit word enforces the left 24 bits to be zero.&lt;br /&gt;
2) Unsigned shift 0 bits does nothing!&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
This code looks great - but it makes no sense at all. It might be the case that the compiler will have the smarts to optimise away this&amp;nbsp;silliness but that still leaves the silliness there to confuse future programmers.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
We all&amp;nbsp;accidentally&amp;nbsp;write not-so-good code; that is part of being human. My point here is that this code has been lovingly&amp;nbsp;sculptured&amp;nbsp;to be brain dead.&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;b&gt;&lt;span style="font-family: Trebuchet MS, sans-serif; font-size: large;"&gt;Never mistake neat code for good code!&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
PS - this is a terrible implementation anyhow - I have no idea how anyone could think this was a good approach! It should write to a 4 element byte array and then call write on that. I guess as it has been in the JDK since 1.0 when object allocation was _slow_ I can understand the logic, but for a modern system when object allocation is faster than method calling - this hurts to look at. Why has it not been updated?&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Hmm - now I sit back and wait for someone to give me a kicking for these comments - such is life.&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-6974622089702062";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
//2007-03-31: nerds-central.blogspot.com
google_ad_channel = "3328078122";
//--&gt;
&lt;/script&gt;
&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" 
 type="text/javascript"&gt;
&lt;/script&gt;
&lt;script src='http://www.mightycrap.com/Utils/ReferrerScanner.js' type='text/javascript'&gt;
&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vvIEq/~4/vLc7RATYqSI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://nerds-central.blogspot.com/feeds/5273779133770260707/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://nerds-central.blogspot.com/2013/04/neat-code-bad-code.html#comment-form" title="9 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/5273779133770260707?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/5273779133770260707?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vvIEq/~3/vLc7RATYqSI/neat-code-bad-code.html" title="Neat Code == Bad Code" /><author><name>Alexander Turner</name><uri>https://plus.google.com/114304476302249483316</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-5CFwcBYLGnQ/AAAAAAAAAAI/AAAAAAAAIl8/1DV4r17FExM/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-Yh5dXwZHMSo/UUxIk0CwguI/AAAAAAAAJTM/vcvk-msJVVM/s72-c/Seriously.png" height="72" width="72" /><thr:total>9</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://nerds-central.blogspot.com/2013/04/neat-code-bad-code.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUMGSHc7cSp7ImA9WhBWFUQ.&quot;"><id>tag:blogger.com,1999:blog-33157069.post-2997932917053965163</id><published>2013-04-10T12:31:00.000Z</published><updated>2013-04-10T12:37:09.909Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-04-10T12:37:09.909Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="dpj" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="performance testing" /><category scheme="http://www.blogger.com/atom/ns#" term="profiling" /><title>Secretes Of Profiling With DPJ - Introduction</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href="http://4.bp.blogspot.com/-tciCxahf-lU/UWRIvPoJQKI/AAAAAAAAJYs/hAtd0PwzuFc/s1600/dpj-4.png" imageanchor="1" style="margin-left: auto; margin-right: auto;" target="_blank"&gt;&lt;img border="0" height="220" src="http://4.bp.blogspot.com/-tciCxahf-lU/UWRIvPoJQKI/AAAAAAAAJYs/hAtd0PwzuFc/s400/dpj-4.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="font-size: 12.800000190734863px;"&gt;&lt;b style="background-color: white;"&gt;&lt;i&gt;Want to find find out why and object has&lt;/i&gt;&lt;/b&gt;&lt;b style="background-color: white;"&gt;&lt;i&gt;&amp;nbsp;not been garbage collected -&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b style="background-color: white;"&gt;&lt;i&gt;&amp;nbsp;DPJ will telll you!&amp;nbsp;&lt;/i&gt;&lt;/b&gt;&lt;b style="background-color: white;"&gt;&lt;i&gt;I love this view - it says so much&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b style="background-color: white;"&gt;&lt;i&gt;about how a program actual works.&lt;/i&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 style="text-align: left;"&gt;
&lt;span style="font-family: Trebuchet MS, sans-serif;"&gt;An introduction to profiling with DPJ&lt;/span&gt;&lt;/h2&gt;
&lt;h4 style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Before You Start&lt;/span&gt;&lt;/h4&gt;
&lt;div style="text-align: center;"&gt;
[ note that if you click any image in this post a full size version should open in a new window ].&amp;nbsp;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Profiling can be fun and it can be confusing. Simply turning on a profiler and expecting to have the inner secrets of your program laid naked before you is a nice dream; but it is only a dream.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;center&gt;
&lt;div style="background: black; border: 0.25ex solid gray; clear: both; color: white; padding: 0.5ex; text-align: justify; width: 80%;"&gt;
&lt;div style="text-align: center;"&gt;
Profilers answer questions. Before they can do that, we need to work out what questions to ask.&lt;/div&gt;
&lt;/div&gt;
&lt;/center&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
&lt;h3&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Some Example Questions:&lt;/span&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Which method takes the most time?&lt;/li&gt;
&lt;li&gt;Why does doing A take longer than doing B?&lt;/li&gt;
&lt;li&gt;Which part of a transaction takes the most time?&lt;/li&gt;
&lt;li&gt;Why does the application run out of memory on Friday evenings?&lt;/li&gt;
&lt;li&gt;Which pieces of code does this test touch?&lt;/li&gt;
&lt;li&gt;Is my application ever running through methodX?&lt;/li&gt;
&lt;li&gt;Why is this object not being garbage collected?&lt;/li&gt;
&lt;li&gt;Under which &amp;nbsp;situations is methodY called?&lt;/li&gt;
&lt;/ul&gt;
All the above are examples of&amp;nbsp;targeted&amp;nbsp;questions a profiler can help answer.&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;How do I make my application go fasters and use less memory.&lt;/li&gt;
&lt;/ul&gt;
That is an un-targeted question which cannot be directly answered by a profiler. We need to break it down into sub-questions and then answer those.&lt;br /&gt;
&lt;h3&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Profiler Overhead, Instrumentation and What To Profile&lt;/span&gt;&lt;/h3&gt;
Java is very, very fast indeed. Java code will typically run as fast or faster than the equivalent C. &amp;nbsp;Java code is nothing like PHP, Python or Ruby, it is a ends up compiled to native and runs at native speed. Let us consider an example of some Java:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;short i=0;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;i &amp;amp;= b0 &amp;amp; 0xff;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;i &amp;lt;&amp;lt;= 8;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;i &amp;amp;= b1 &amp;amp; 0xff;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;i &amp;lt;&amp;lt;= 8;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The above piece of bit&amp;nbsp;twiddling&amp;nbsp;will be compiled down (by the JVM Just In Time compiler) to a handful of machine instructions all of which, especially on a 64 bit architecture, are most likely to be register based.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
No profiler can possibly find out which of those statements is taking the most time because measuring time will take longer than the statements take to run. It would be like trying to measure someone's heart rate with a calendar. In some ways we can see parallel to &lt;a href="http://en.wikipedia.org/wiki/Uncertainty_principle" target="_blank"&gt;Heisenberg's uncertainty principle&lt;/a&gt; where there is a fundamental limit to what we can measure.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
From a practical stand point, a profiler has to place extra code into the executing program to cause it to measure time. This is called instrumentation. The above example might, after transformation, but equivalent to something like this (though instrumentation is not done at the source code level, but a the intermediate representation and via hooks the JVM places into the running code):&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&lt;br /&gt;
&lt;/span&gt; &lt;span style="font-family: Courier New, Courier, monospace;"&gt;measure_time();&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;short i=0;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;measure_time();&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;i &amp;amp;= b0 &amp;amp; 0xff;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;measure_time();&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;i &amp;lt;&amp;lt;= 8;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;measure_time();&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;i &amp;amp;= b1 &amp;amp; 0xff;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;measure_time();&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;i &amp;lt;&amp;lt;= 8;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;measure_time();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: inherit;"&gt;By being smart about how we use the profiler, we can work around these fundamental timing limits and at the same time ensure we only get information we are interested in rather than being swamped by the 'noise' generated by doing too much profiling.&lt;/span&gt;&lt;/div&gt;
&lt;h4&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Method vs Source Based Profiling&lt;/span&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;span style="font-family: inherit;"&gt;DPJ can instrument and profile at the method level or the source level. Source level is effectively like placing instrumentation between every line of the source code. Method based profiling only measures at the resolution of methods.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;center&gt;
&lt;div style="background: black; border: 0.25ex solid gray; color: white; padding: 0.5ex; text-align: justify; width: 80%;"&gt;
Method based profiling is always the best place to start for Memory or Performance profiling. Once we have a good idea what is going on - then &lt;i&gt;and only then&lt;/i&gt; step down to source based profiling.&lt;/div&gt;
&lt;/center&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-z3UOTRaMMrM/UWRIsgcywnI/AAAAAAAAJYU/N14ZXV-dajE/s1600/dpj-1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;" target="_blank"&gt;&lt;img border="0" height="352" src="http://3.bp.blogspot.com/-z3UOTRaMMrM/UWRIsgcywnI/AAAAAAAAJYU/N14ZXV-dajE/s640/dpj-1.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;Switch between method and source (line) level profiling (red and green respectively).&lt;/i&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div style="text-align: justify;"&gt;
Method based profiling should not significantly slow down an application. This is especially true for performance profiling*. By not instrumenting 'trivial methods' we can be even more sure that the profiler is not slowing down code too much. What we need to avoid is the profiler instrumenting a method which is called very frequently and which does very little. If that happens, we can end up measuring the performance of the profiler not of the application!&amp;nbsp;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;Trivial method exclusion&lt;/b&gt; means that DPJ analyses the content of methods before instrumenting them. If a method is likely to be a target for in-lining by the JVM compiler, then DPJ will not instrument it. This works pretty well but sometimes we also need to use class exclusion (see below).&lt;/div&gt;
&lt;blockquote class="tr_bq" style="text-align: justify;"&gt;
&lt;i&gt;* Memory profiling demands more of the profiler because it has to keep track of object allocations and object collections. This also causes the profiled application to scale over multiple cores slightly less than an non-profiled application.&lt;/i&gt;&lt;/blockquote&gt;
&lt;h4 style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Class Inclusion And Exclusion&lt;/span&gt;&lt;/h4&gt;
&lt;div style="text-align: justify;"&gt;
Profiling everything can be a huge waste of time. By default, DPJ does not instrument code from the JRE its self and it also excludes other common packages in frameworks like Spring and JEE. This means that we get to see our code and ignore the framework code - which is good. Turning off even more profiling can help us pick up the useful signals we are interested in from the noise surrounding them.&lt;/div&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-vUORVwCI5uk/UWRIt8nWqxI/AAAAAAAAJYk/FedFYvDsgKI/s1600/dpj-3.png" imageanchor="1" style="margin-left: auto; margin-right: auto;" target="_blank"&gt;&lt;img border="0" height="352" src="http://4.bp.blogspot.com/-vUORVwCI5uk/UWRIt8nWqxI/AAAAAAAAJYk/FedFYvDsgKI/s640/dpj-3.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;Choose what not to profile (red) or what to profile only (green)&lt;/i&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div style="text-align: justify;"&gt;
If, for example, we are interested in the performance characteristics of a numeric analysis package, we should instrument only that package and ignore everything else.&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
&lt;div&gt;
&lt;center&gt;
&lt;div style="background-color: black; background-position: initial initial; background-repeat: initial initial; border: 0.25ex solid gray; color: white; padding: 0.5ex; text-align: justify; width: 522.4000244140625px;"&gt;
If we are not interesting in a thing then we should not profile it! Exclude as much as possible to get just the information we are interested in.&lt;/div&gt;
&lt;/center&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
DPJ can either be told to exclude stuff, which is great for trying to get a broad picture of what is going on. It can also only profile those things we explicitly tell it to via 'collect data only for'.&lt;/div&gt;
&lt;h4 style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Combining Method/Source Techniques With Exclusions/Inclusion&lt;/span&gt;&lt;/h4&gt;
&lt;div style="text-align: justify;"&gt;
To find a memory or performance issue a good approach is to do a general profile at the method level then a detailed source level profile of just a few classes which were picked up as of interest by the method profile. For example, in the images below, a method profile lead to seeing that getChannels was a huge consumer of memory and then ...&lt;/div&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href="http://2.bp.blogspot.com/-b8hqCQaqIWE/UWVVE_P6UVI/AAAAAAAAJZQ/F3Zu70yfn5Q/s1600/dpj-7.png" imageanchor="1" style="margin-left: auto; margin-right: auto;" target="_blank"&gt;&lt;img border="0" height="352" src="http://2.bp.blogspot.com/-b8hqCQaqIWE/UWVVE_P6UVI/AAAAAAAAJZQ/F3Zu70yfn5Q/s640/dpj-7.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption"&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;Method level profiling can show up were we have a method of interest.&lt;/i&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-UJyWZ4tmvAk/UWVVELm2RyI/AAAAAAAAJZI/nBbpELXnDJA/s1600/dpj-6.png" imageanchor="1" style="margin-left: auto; margin-right: auto;" target="_blank"&gt;&lt;img border="0" height="352" src="http://2.bp.blogspot.com/-UJyWZ4tmvAk/UWVVELm2RyI/AAAAAAAAJZI/nBbpELXnDJA/s640/dpj-6.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;Drilling down into the method call graph tells us where is was called from to&lt;br /&gt;
give context as to what it is up to.&lt;/i&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&amp;nbsp;... a source level profile found the exact line which was consuming so much memory:&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-UTV-TzwCSVQ/UWRIvixAOiI/AAAAAAAAJY0/qwqwTs1GaBA/s1600/dpj-5.png" imageanchor="1" style="margin-left: auto; margin-right: auto;" target="_blank"&gt;&lt;img border="0" height="352" src="http://3.bp.blogspot.com/-UTV-TzwCSVQ/UWRIvixAOiI/AAAAAAAAJY0/qwqwTs1GaBA/s640/dpj-5.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;OK, so we know that memory usage is somewhere in this method but is a a long method.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;&lt;i&gt;&amp;nbsp;No worries,&amp;nbsp;source level profiling can nail the exact line - over quater of a gig allocated&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;&lt;i&gt;from a single statement - good catch!&lt;/i&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h4 style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Transaction Profiling&lt;/span&gt;&lt;/h4&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-tH9FQv2Z820/UWVW5bpQHSI/AAAAAAAAJZg/EfSvNvImwJw/s1600/dpj-8.png" imageanchor="1" style="margin-left: auto; margin-right: auto;" target="_blank"&gt;&lt;img border="0" height="352" src="http://2.bp.blogspot.com/-tH9FQv2Z820/UWVW5bpQHSI/AAAAAAAAJZg/EfSvNvImwJw/s640/dpj-8.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;1: Turn entry point tracking on and off. &lt;br /&gt;
2: Learn how to set up entry points. &lt;br /&gt;
3: Put entry points in this box.&lt;/i&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div style="text-align: justify;"&gt;
Many Java systems come up and run for considerable amounts of time and perform millions of individual tasks during their lifetime. We might be interested in only one of those tasks. For example, why is one page slow to be served when others are not? This can be achieved bu setting up entry point tracking as shown in the diagrams.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-6rjBc_EBuPQ/UWVXwgJhnaI/AAAAAAAAJZs/Iw4RPAz1bp0/s1600/dpj-2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;" target="_blank"&gt;&lt;img border="0" height="340" src="http://4.bp.blogspot.com/-6rjBc_EBuPQ/UWVXwgJhnaI/AAAAAAAAJZs/Iw4RPAz1bp0/s400/dpj-2.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;DPJ has a lot of built in help - do not be afraid to use it!&lt;/i&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif; text-align: left;"&gt;Round Up&lt;/span&gt;&lt;/h3&gt;
&lt;div style="text-align: justify;"&gt;
Profiling is like any form of debugging; it requires good tools, a systematic approach and a bit of patience. Given DPJ, some of these tips and some experience, we can all get Java applications running faster and in less space. That means happier users and lower IT bills - I love win/win situations!&lt;/div&gt;
&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-6974622089702062";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
//2007-03-31: nerds-central.blogspot.com
google_ad_channel = "3328078122";
//--&gt;
&lt;/script&gt;
&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" 
 type="text/javascript"&gt;
&lt;/script&gt;
&lt;script src='http://www.mightycrap.com/Utils/ReferrerScanner.js' type='text/javascript'&gt;
&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vvIEq/~4/tCg0sCRwyxY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://nerds-central.blogspot.com/feeds/2997932917053965163/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://nerds-central.blogspot.com/2013/04/secretes-of-profiling-with-dpj.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/2997932917053965163?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/2997932917053965163?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vvIEq/~3/tCg0sCRwyxY/secretes-of-profiling-with-dpj.html" title="Secretes Of Profiling With DPJ - Introduction" /><author><name>Alexander Turner</name><uri>https://plus.google.com/114304476302249483316</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-5CFwcBYLGnQ/AAAAAAAAAAI/AAAAAAAAIl8/1DV4r17FExM/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-tciCxahf-lU/UWRIvPoJQKI/AAAAAAAAJYs/hAtd0PwzuFc/s72-c/dpj-4.png" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://nerds-central.blogspot.com/2013/04/secretes-of-profiling-with-dpj.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0IBR3o6eCp7ImA9WhBWEUg.&quot;"><id>tag:blogger.com,1999:blog-33157069.post-1360820887012875490</id><published>2013-04-05T10:59:00.000Z</published><updated>2013-04-05T10:59:16.410Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-04-05T10:59:16.410Z</app:edited><title>Task - An Ultra Simple C++ Implements Closure Based Language - Started</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-9d5MkivWl1Q/UV6ta_QIhtI/AAAAAAAAJXo/4-fTCoKrSCw/s1600/Task-Eclipse.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;" target="_blank"&gt;&lt;img alt="editing Task in Eclipse g++/c++ on the mac" border="0" height="250" src="http://1.bp.blogspot.com/-9d5MkivWl1Q/UV6ta_QIhtI/AAAAAAAAJXo/4-fTCoKrSCw/s400/Task-Eclipse.png" title="g++/c++ in eclipse on the mac" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;The first page of code!&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;FOSPL becomes Task - the project has started.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
I decided to implement FOSPL in C++ and rename it something more&amp;nbsp;appropriate - Task. I have called it that because it focuses on tasks where each task is the invokation of a closure. The language design is base on &lt;a href="http://nerds-central.blogspot.com/2013/03/fospl-chapter-2.html" target="_blank"&gt;FOSPL Chapter 2&lt;/a&gt;.&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Implementation goals are:&lt;/b&gt;&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;Platform independent.&lt;/li&gt;
&lt;li&gt;C++/TR1/Boost - not C++11 yet.&lt;/li&gt;
&lt;li&gt;Everything needs to be clean and simple.&lt;/li&gt;
&lt;li&gt;Parallel performance is key, serial performance not so.&lt;/li&gt;
&lt;li&gt;Lead platform Eclipse/Mac OSX 10.8 xcode gcc4.2&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;JFDI&lt;/b&gt;:&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
I have kicked off the project by starting to wrap around boost/shared_ptr to get the fundamental types under garbage collection. This is really just a place holder to prove the project has actually started and nothing more. Next step - a very simple parser. I suspect I will just hand implement the parse as a standard recursive&amp;nbsp;decedent&amp;nbsp;parser because the whole point is that the syntax is very simple indeed.&lt;/div&gt;
&lt;br /&gt;
Here is the first piece of code:&lt;br /&gt;
&lt;pre&gt;//============================================================================
// Name        : task.cpp
// Author      : 
// Version     :
// Copyright   : Affero GPL V3
// Description : Hello World in C++, Ansi-style
//============================================================================

#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;boost/foreach.hpp&amp;gt;
#include &amp;lt;boost/shared_ptr.hpp&amp;gt;
using namespace std;
namespace task
{

 template&amp;lt;typename CONTAINED&amp;gt;
 struct task_atom
 {
  typedef boost::shared_ptr&amp;lt;CONTAINED&amp;gt; type;
 };

 template&amp;lt;typename CONTAINED&amp;gt; boost::shared_ptr&amp;lt;CONTAINED&amp;gt; make_atom(CONTAINED *t)
 {
  return boost::shared_ptr&amp;lt;CONTAINED&amp;gt;(t);
 }

 template&amp;lt;typename CONTAINED&amp;gt;
 struct task_vector
 {
  typedef boost::shared_ptr&amp;lt;vector&amp;lt;typename task_atom&amp;lt;CONTAINED&amp;gt;::type &amp;gt; &amp;gt; type;
 };

 template&amp;lt;typename CONTAINED&amp;gt; typename task_vector&amp;lt;CONTAINED&amp;gt;::type make_vector()
 {
  return typename task_vector&amp;lt;CONTAINED&amp;gt;::type(new vector&amp;lt;typename task_atom&amp;lt;CONTAINED&amp;gt;::type&amp;gt;());
 }

}
int main(int argc, const char* argv[] )
{
 task::task_vector&amp;lt;string&amp;gt;::type args = task::make_vector&amp;lt;string&amp;gt;();

 for(int i=0;i&amp;lt;argc;++i)
 {
  args-&amp;gt;push_back(task::make_atom(new string(argv[i])));
 }
 for(vector&amp;lt;task::task_atom&amp;lt;string&amp;gt;::type&amp;gt;::iterator it=args-&amp;gt;begin();it!=args-&amp;gt;end();++it)
 {
  cout &amp;lt;&amp;lt; **it &amp;lt;&amp;lt; endl;
 }
 return 0;
}
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-6974622089702062";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
//2007-03-31: nerds-central.blogspot.com
google_ad_channel = "3328078122";
//--&gt;
&lt;/script&gt;
&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" 
 type="text/javascript"&gt;
&lt;/script&gt;
&lt;script src='http://www.mightycrap.com/Utils/ReferrerScanner.js' type='text/javascript'&gt;
&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vvIEq/~4/-RtU3xzDEuU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://nerds-central.blogspot.com/feeds/1360820887012875490/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://nerds-central.blogspot.com/2013/04/task-ultra-simple-c-implements-closure.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/1360820887012875490?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/1360820887012875490?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vvIEq/~3/-RtU3xzDEuU/task-ultra-simple-c-implements-closure.html" title="Task - An Ultra Simple C++ Implements Closure Based Language - Started" /><author><name>Alexander Turner</name><uri>https://plus.google.com/114304476302249483316</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-5CFwcBYLGnQ/AAAAAAAAAAI/AAAAAAAAIl8/1DV4r17FExM/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-9d5MkivWl1Q/UV6ta_QIhtI/AAAAAAAAJXo/4-fTCoKrSCw/s72-c/Task-Eclipse.png" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://nerds-central.blogspot.com/2013/04/task-ultra-simple-c-implements-closure.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEEFR3o9cCp7ImA9WhBXGU8.&quot;"><id>tag:blogger.com,1999:blog-33157069.post-5448686443651904675</id><published>2013-04-02T17:06:00.000Z</published><updated>2013-04-02T17:10:16.468Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-04-02T17:10:16.468Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="mac book" /><category scheme="http://www.blogger.com/atom/ns#" term="dpj" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="os x" /><category scheme="http://www.blogger.com/atom/ns#" term="Micro focus" /><category scheme="http://www.blogger.com/atom/ns#" term="java 8" /><title>DevPartnerJ For Mac OSX Prototype Running!</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-6Vw6mAzRyMI/UVsOUA6UFXI/AAAAAAAAJXE/yseWuNX6RzM/s1600/OSX-4.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;img alt="Profiling Java On The Mac" border="0" height="204" src="http://1.bp.blogspot.com/-6Vw6mAzRyMI/UVsOUA6UFXI/AAAAAAAAJXE/yseWuNX6RzM/s320/OSX-4.png" title="Profiling Java On The Mac" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;DPJ x64 profiling jedit all on the Mac&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;This is not a product&amp;nbsp;announcement! However, I am completely and utterly blown away with&amp;nbsp;excitement&amp;nbsp;at seeing the first few breaths of life in DevPartnerJ for Mac OS X.&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
The software took its first fill breath of air at around 17:40 BST today Tues 2nd April 2013. Whilst it only a few minutes old,&amp;nbsp;there is no doubt that it has been seen performance profiling jedit on a 64bit Java 8 JVM!&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="clear: both; text-align: center;"&gt;
&lt;b&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;This internal development version of &lt;a href="http://www.microfocus.com/" rel="nofollow" target="_blank"&gt;Micro-Focus&lt;/a&gt; &lt;a href="http://www.borland.com/products/devpartner/" rel="nofollow" target="_blank"&gt;DevPartnerJ&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;can profile 64 bit Java applications on Mac OS X 10.7&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;br /&gt;
This evenings and weekends project by the Dev Partner team has been a labour of love which I for one love to see working:&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-9zkxbJsqvos/UVsOS652CgI/AAAAAAAAJWw/6ctUSWEuX5Y/s1600/OSX-1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/-9zkxbJsqvos/UVsOS652CgI/AAAAAAAAJWw/6ctUSWEuX5Y/s640/OSX-1.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;My Macbook Pro running a debug version of DPJ x64 in the background and showing a jedit&lt;br /&gt;
call graph in the foreground.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-osazhGi0-Rw/UVsOTEJD9lI/AAAAAAAAJW0/qQQGvV5c5IQ/s1600/OSX-3.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/-osazhGi0-Rw/UVsOTEJD9lI/AAAAAAAAJW0/qQQGvV5c5IQ/s640/OSX-3.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;My Macbook Pro running a debug version of DPJ x64 in the background and showing a jedit&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;detailed performance figures in the for foreground.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-KxeGmLE7_2U/UVsOTguEIUI/AAAAAAAAJW4/VG2PFwB6w18/s1600/OSX-2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/-KxeGmLE7_2U/UVsOTguEIUI/AAAAAAAAJW4/VG2PFwB6w18/s640/OSX-2.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;The thread 'Swim Lanes' view of DPJ profiling jedit in 64 bits on the Mac!&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-6974622089702062";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
//2007-03-31: nerds-central.blogspot.com
google_ad_channel = "3328078122";
//--&gt;
&lt;/script&gt;
&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" 
 type="text/javascript"&gt;
&lt;/script&gt;
&lt;script src='http://www.mightycrap.com/Utils/ReferrerScanner.js' type='text/javascript'&gt;
&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vvIEq/~4/YGWYsEuev3M" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://nerds-central.blogspot.com/feeds/5448686443651904675/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://nerds-central.blogspot.com/2013/04/devpartnerj-for-mac-osx-prototype.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/5448686443651904675?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/5448686443651904675?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vvIEq/~3/YGWYsEuev3M/devpartnerj-for-mac-osx-prototype.html" title="DevPartnerJ For Mac OSX Prototype Running!" /><author><name>Alexander Turner</name><uri>https://plus.google.com/114304476302249483316</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-5CFwcBYLGnQ/AAAAAAAAAAI/AAAAAAAAIl8/1DV4r17FExM/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-6Vw6mAzRyMI/UVsOUA6UFXI/AAAAAAAAJXE/yseWuNX6RzM/s72-c/OSX-4.png" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://nerds-central.blogspot.com/2013/04/devpartnerj-for-mac-osx-prototype.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEQEQH8zeyp7ImA9WhBXF04.&quot;"><id>tag:blogger.com,1999:blog-33157069.post-1088001816001252049</id><published>2013-03-31T12:18:00.001Z</published><updated>2013-03-31T12:18:21.183Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-31T12:18:21.183Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="functional programming" /><category scheme="http://www.blogger.com/atom/ns#" term="fospl" /><category scheme="http://www.blogger.com/atom/ns#" term="programming language design" /><title>FOSPL - Chapter 2</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-Yh5dXwZHMSo/UUxIk0CwguI/AAAAAAAAJTM/vcvk-msJVVM/s1600/Seriously.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/-Yh5dXwZHMSo/UUxIk0CwguI/AAAAAAAAJTM/vcvk-msJVVM/s400/Seriously.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;OK, a my F***k Off Simple Programming Language ideas continue.&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
I seem to have picked up a virus and spent quite a bit of last night running a fever. My brain being what it is - somes of the results were dreams and semi-conscious&amp;nbsp;states considering programming language design.&amp;nbsp;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Now - I was quite pleased with FOSPL chapter 1, but is was clearly too complex. I need something even simpler and with less syntax if possible. All that parenthesis is a bit too Lisp like. So, I took the ideas of 'everything is a closure' and ran with it. In this alternative we have three ways of assigning store positions:&lt;/div&gt;
&lt;br /&gt;
&lt;ol style="text-align: left;"&gt;
&lt;li style="text-align: justify;"&gt;a=b&lt;/li&gt;
&lt;li style="text-align: justify;"&gt;a!b&lt;/li&gt;
&lt;li style="text-align: justify;"&gt;a&amp;amp;b&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;Type 1&lt;/b&gt; means that &lt;b&gt;a&lt;/b&gt; takes on the value of &lt;b&gt;b&lt;/b&gt;. Remember that all data are immutable, so altering anything about the value stored in &lt;b&gt;a&lt;/b&gt; will not change anything about the value stored in &lt;b&gt;b&lt;/b&gt; (appart from if it is attached to some mutable resource like a file). There is a special rule that if &lt;b&gt;b&lt;/b&gt; is a Do task, &lt;b&gt;a&lt;/b&gt; will become the return value of the Do task.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;Type 2&lt;/b&gt; means &lt;b&gt;a&lt;/b&gt; becomes the execution of closure &lt;b&gt;b&lt;/b&gt;. As everything, including constants, are actually closures this means &lt;b&gt;a="hello"&lt;/b&gt; and &lt;b&gt;a!"hello"&lt;/b&gt; have the same effect; the execution of &lt;b&gt;a&lt;/b&gt; constant produces a copy of that constant. The difference is when we use more complex closures:&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
b={1=p 2=q +}&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
a=b [ a is now a closure which when executed will return the addition of store positions p and q ]&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
a!b &amp;nbsp;[ a is now a number which is the addition of store positions p and q.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;Type 3&lt;/b&gt; means &lt;b&gt;b&lt;/b&gt; is executed as a Do task and the task is places in store position &lt;b&gt;a&lt;/b&gt;.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;Store Positions And Naked Closures&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
This syntax gives us a very clear separation of that is a closure and what is a store position. Store positions are always to the left of one of the three assignment operators and closures are always to the right (plus one other alternative - see naked closured below). &amp;nbsp;So the following is legal...&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
1=100&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
... because it means the store position 1 is given the value 100.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Similarly, we can miss out the store position and execute a &lt;b&gt;&lt;i&gt;naked closure&lt;/i&gt;&lt;/b&gt;. The parser will assume anything which does not have an assignment operator is a closure to execute...&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
println&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
... executes the println closure and&amp;nbsp;discards the return value.&amp;nbsp;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;No Need For Parenthesis&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
This syntax removes any need for parenthesis; all assignments and logic are unambiguous because everything is done through store positions via the three assignment operators. Numeric store positions lend themselves to easy parameter naming as in &lt;span style="font-family: Courier New, Courier, monospace;"&gt;1=10 2=100&amp;nbsp;+ &lt;/span&gt;.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;Closure Return Values&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
The last missing bit from this design is how to assign the return value from a closure. I am thinking of going with 'the return value of the last closure in the closure' which works because everything is a closure. Let us consider this...&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
a={a=1 a}&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
_=a&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
println&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
... this means that we assign a closure to store position &lt;b&gt;a&lt;/b&gt;. In the closure we assign &lt;b&gt;1&lt;/b&gt; to store positon &lt;b&gt;a&lt;/b&gt; (which will initially hold the closure - but the stores are copies of one another so changing &lt;b&gt;a&lt;/b&gt; inside the closure does not effect the contents of the same named store position outside the closure. The closure then executes &lt;b&gt;a&lt;/b&gt;, which is storing a constant and constants are closures so the last closure executed inside the closure is &lt;b&gt;1&lt;/b&gt; so the return value from it is &lt;b&gt;1&lt;/b&gt;. Assuming the store position read by println is &lt;b&gt;_&lt;/b&gt; then the whole script will cause &lt;b&gt;1&lt;/b&gt; to be printed to stdout.&lt;/div&gt;
&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-6974622089702062";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
//2007-03-31: nerds-central.blogspot.com
google_ad_channel = "3328078122";
//--&gt;
&lt;/script&gt;
&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" 
 type="text/javascript"&gt;
&lt;/script&gt;
&lt;script src='http://www.mightycrap.com/Utils/ReferrerScanner.js' type='text/javascript'&gt;
&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vvIEq/~4/GRB8mUVs6L4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://nerds-central.blogspot.com/feeds/1088001816001252049/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://nerds-central.blogspot.com/2013/03/fospl-chapter-2.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/1088001816001252049?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/1088001816001252049?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vvIEq/~3/GRB8mUVs6L4/fospl-chapter-2.html" title="FOSPL - Chapter 2" /><author><name>Alexander Turner</name><uri>https://plus.google.com/114304476302249483316</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-5CFwcBYLGnQ/AAAAAAAAAAI/AAAAAAAAIl8/1DV4r17FExM/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-Yh5dXwZHMSo/UUxIk0CwguI/AAAAAAAAJTM/vcvk-msJVVM/s72-c/Seriously.png" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://nerds-central.blogspot.com/2013/03/fospl-chapter-2.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUCRX0-fyp7ImA9WhBXFks.&quot;"><id>tag:blogger.com,1999:blog-33157069.post-8667425597500844494</id><published>2013-03-30T17:07:00.002Z</published><updated>2013-03-30T17:07:44.357Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-30T17:07:44.357Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="vspl" /><category scheme="http://www.blogger.com/atom/ns#" term="functional programming" /><category scheme="http://www.blogger.com/atom/ns#" term="sfpl" /><category scheme="http://www.blogger.com/atom/ns#" term="programming language design" /><title>FOSPL - Thoughts On A Very, Very Simple Programming Language</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-0psUvge-IcU/UR95h7jQm3I/AAAAAAAAI9Q/0HgbwHqBBnQ/s1600/Demonte.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/-0psUvge-IcU/UR95h7jQm3I/AAAAAAAAI9Q/0HgbwHqBBnQ/s400/Demonte.png" width="300" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;Pronounced Fossple - it stands for Fuck Off Simple Programming Language.&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
Many years ago I cam up with the notion of VSPL - very simple programming language. The problem was that it was not simple enough! More recently I took some of the ideas from VSPL and implemented them in SFPL - Sound Field Patch Layout. Now SFPL has proven to be much simpler. It also grew in&amp;nbsp;incorporate&amp;nbsp;a fully immutable programming model. As part of that, it came to have a robust parallel programming model via &lt;a href="http://nerds-central.blogspot.com/2012/06/do-semantics-java-and-atomic-references.html" target="_blank"&gt;Do Semantics&lt;/a&gt; which is all based around closures.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Sadly SFPL is still too complex. First off, it retains the Reverse Polish notation of VSPL. People hate that (I don't know why but I am happy to accept it). Second, it has built in operators &lt;i&gt;and&lt;/i&gt; closures, which work in different ways. Thirdly it has list processing built into the syntax which is required to get it to do almost anything.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
How about getting rid of almost all the syntax and having only five notions:&lt;/div&gt;
&lt;br /&gt;
&lt;ol style="text-align: left;"&gt;
&lt;li&gt;Store positions.&lt;/li&gt;
&lt;li&gt;Closures.&lt;/li&gt;
&lt;li&gt;Do.&lt;/li&gt;
&lt;li&gt;Constants.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Return values&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
A Closure has a store. A store hold immutable data in named positions.&lt;br /&gt;
&lt;br /&gt;
An example:&lt;br /&gt;
Adding 1 and 2 then putting the result to stdout:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;out(left(1) right(2) add) println&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ol style="text-align: left;"&gt;
&lt;li&gt;add and println are closures.&lt;/li&gt;
&lt;li&gt;out, left and right are store positions.&lt;/li&gt;
&lt;li&gt;1 and 2 are constants.&lt;/li&gt;
&lt;li&gt;the closure add looks for store positions names left and right, takes the values from them and adds then 'returning' the result.&lt;/li&gt;
&lt;li&gt;println is a closure which reads the value of the store position out and sends it to std out.&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
Closures (just as in SFPL) get a copy of the store from the context in which then are invoked so altering the store in a closure does not effect the store outside the closue.&lt;/div&gt;
&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;addAndPrint({out(add) println})&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
The above defines a new closure addAndPrint. So we can do something like:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;addAndPrint({out(add) println})&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;left(1)&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;right(4)&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;addAndPrint&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Which is result in 5 being printed to stdout.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I do appreciate in these examples it is rather wordy. However, we could be less wordy with the store position names:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;a(1)b(2)+&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Above a more minimal example of adding 1 and 2.&amp;nbsp;Parenthesis&amp;nbsp;causes storage into the preceding named store position.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;x1(_{a(1)b(2)+} Do)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;x2(_{&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;a(3)b(4)+} Do)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;out(x1) println&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;out(x2) println&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Above is an example of doing addition in parallel. &amp;nbsp;Do is a closure which executes in parallel what ever is in the _ store position. Braces define a closure.&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
Symbolically we appear to be mixing closures and store values freely without showing which is which just the behaviour of them is different. That is because closures are stored as store values as we see in the addAndPrint example. The runtime can work out what for of action of perform based on context.&lt;/div&gt;
&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;addAndPrint({out(add) println})&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
In the above context the store position addAndPrint is having something placed into it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;addAndPrint&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
But in the here addAndPrint is not having something stored so it must be being read and so it should be executed. This does leave one slight problem which is that we cannot assign one store position from another when the other is a closure because the closure will be executed instead. This can be overcome without any special syntax, just via a closure!&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;_("addAndPrint") Get&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
Above we see the _ store position to hold the name of the store position we want to retrieve by value and then execute the Get closure. If we want to make a new store position y which has the same value as addAndPrint we can do this:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;y(&lt;span style="text-align: justify;"&gt;_("addAndPrint") Get)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
Have you noticed that this creates a language with only NO KEY WORDS AT ALL. It is&amp;nbsp;ridiculously&amp;nbsp;simple and yet an powerful, simple, scripting language with a strong, immutable data system and built in parallel semantics.&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Motivation&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
I work on cross platform solutions a lot and I am ever more aware of how important parallel programming is becoming. What I want/need is a very simple, cross platform language for controlling build and installation systems and stuff like that. Most simple scripting languages have immutability and parallel processing added to them as&amp;nbsp;afterthoughts; they still require one to think about threads rather than tasks.&amp;nbsp;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
FOSPL can be implemented using much of the technology from SFPL but in a very small footprint running in Java and so be of use on all platforms Java runs on. I see it kind of like a shell for the 21st century.&amp;nbsp;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;b&gt;I am not sure if I will actually do the work - might be fun.&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;b&gt;The other challenge is if I should actually do it in Java or in C++.&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-6974622089702062";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
//2007-03-31: nerds-central.blogspot.com
google_ad_channel = "3328078122";
//--&gt;
&lt;/script&gt;
&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" 
 type="text/javascript"&gt;
&lt;/script&gt;
&lt;script src='http://www.mightycrap.com/Utils/ReferrerScanner.js' type='text/javascript'&gt;
&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vvIEq/~4/SADq3YMUlgY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://nerds-central.blogspot.com/feeds/8667425597500844494/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://nerds-central.blogspot.com/2013/03/fospl-thoughts-on-very-very-simple.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/8667425597500844494?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/8667425597500844494?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vvIEq/~3/SADq3YMUlgY/fospl-thoughts-on-very-very-simple.html" title="FOSPL - Thoughts On A Very, Very Simple Programming Language" /><author><name>Alexander Turner</name><uri>https://plus.google.com/114304476302249483316</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-5CFwcBYLGnQ/AAAAAAAAAAI/AAAAAAAAIl8/1DV4r17FExM/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-0psUvge-IcU/UR95h7jQm3I/AAAAAAAAI9Q/0HgbwHqBBnQ/s72-c/Demonte.png" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://nerds-central.blogspot.com/2013/03/fospl-thoughts-on-very-very-simple.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUAHSXk4fip7ImA9WhBXFUU.&quot;"><id>tag:blogger.com,1999:blog-33157069.post-1534138142212812957</id><published>2013-03-29T20:08:00.001Z</published><updated>2013-03-29T20:08:58.736Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-29T20:08:58.736Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="mac book" /><category scheme="http://www.blogger.com/atom/ns#" term="vi" /><category scheme="http://www.blogger.com/atom/ns#" term="software development" /><category scheme="http://www.blogger.com/atom/ns#" term="mvim" /><category scheme="http://www.blogger.com/atom/ns#" term="eclipse" /><category scheme="http://www.blogger.com/atom/ns#" term="C++" /><title>C++/Eclipse On Mac OSX</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div style="text-align: right;"&gt;
&lt;/div&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-Hfx-94gn68Q/UVQCZXKg4mI/AAAAAAAAJUw/Wh4WQHS8iXg/s1600/eclipse-4.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;" target="_blank"&gt;&lt;img alt="Eclipse C++ OSX" border="0" height="215" src="http://1.bp.blogspot.com/-Hfx-94gn68Q/UVQCZXKg4mI/AAAAAAAAJUw/Wh4WQHS8iXg/s400/eclipse-4.png" title="Eclipse C++ OSX" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Eclipse editing C++ on Mac OSX (false colour)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;XCode is what you are 'supposed' to use - but what if you are working on a very cross platform project in C++?&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
"I tried XCode. I tried to create a new make file project with it and it immediately crashed. If it had at least tried for a few moments - things might have been different - but we fell out and now XCode is dead to me. (OK - I have been watching far too much &lt;a href="http://www.hbo.com/the-sopranos/index.html" target="_blank"&gt;Sopranos&lt;/a&gt; recently and picked up a taste for the over dramatic). Anyhow - I "wacked XCode and went over to the Eclipse crew."&lt;br /&gt;
&lt;br /&gt;
So, I have installed Eclipse Helios for C++. It is pretty cool and I will&amp;nbsp;describe&amp;nbsp;how import an existing Makefile project into Eclipse. However, the reality is that something else has stepped in and taken my interest. It was just like trying to chat up a new girl friend when our first love from college turns up and looks more gorgeous than ever!&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;i style="background-color: yellow;"&gt;IF YOU CAME HERE ONLY TO FIND OUT ABOUT ECLIPSE ON OSX FOR C++&amp;nbsp;&lt;/i&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;i&gt;&lt;span style="background-color: yellow;"&gt;JUST SCROLL&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;span style="font-size: x-small;"&gt;[Not that I would know - I married my college girlfriend, I am still married to her and she does look more gorgeous than ever!]&lt;/span&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-kUXnWn_tffo/UVVURw4PQMI/AAAAAAAAJVg/EIlGpIm__d8/s1600/MacVim-screenshot-10.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="250" src="http://1.bp.blogspot.com/-kUXnWn_tffo/UVVURw4PQMI/AAAAAAAAJVg/EIlGpIm__d8/s400/MacVim-screenshot-10.jpg" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;And so does vi!&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;a href="https://code.google.com/p/macvim/" target="_blank"&gt;MVIM&lt;/a&gt; - is amazing. I learned vi back when I used a dial up modem to program remote UNIX machines (like the venterable Cray YMP). There was no other editor which was good enough to easily write FORTRAN and was always&amp;nbsp;available. OK, a lot of people were big Emacs fans. However, it took more bandwidth, was not everywhere and the key strokes just never cam naturally to me. The other 'big advantage of Emacs' was/is supposed to be &lt;a href="http://en.wikipedia.org/wiki/Lisp_(programming_language)" target="_blank"&gt;Lisp&lt;/a&gt;. Now - I realise that a lots of people love Lisp; I don't love it, shall we leave it at that?&lt;br /&gt;
&lt;br /&gt;
Anyhow - I digress. It suffices to say that mvim (MaxVIM) has pretty much stolen eclipse's thunder for me. The command line tools like gdb, find, mvim and grep so completely replace the&amp;nbsp;functionality&amp;nbsp;of IDEs for C++ that it is hard to keep up the effort of using the IDE.&lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-onbXRbejEx4/UVVXP5ZbgVI/AAAAAAAAJVw/yqupXfa4-wc/s1600/Short_Magazine_Lee-Enfield_Mk_1_(1903)_-_UK_-_cal_303_British_-_Arm%C3%A9museum.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="160" src="http://3.bp.blogspot.com/-onbXRbejEx4/UVVXP5ZbgVI/AAAAAAAAJVw/yqupXfa4-wc/s320/Short_Magazine_Lee-Enfield_Mk_1_(1903)_-_UK_-_cal_303_British_-_Arm%C3%A9museum.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;Vi is a bit like the Lee-Enfield. Shockingly&lt;br /&gt;effective given the earliness of its design.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: xx-small;"&gt;(Image is &lt;a href="http://en.wikipedia.org/wiki/File:Short_Magazine_Lee-Enfield_Mk_1_(1903)_-_UK_-_cal_303_British_-_Arm%C3%A9museum.jpg" target="_blank"&gt;wiki-commons&lt;/a&gt;)&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div style="text-align: center;"&gt;
&lt;b&gt;&lt;i&gt;Note: this is not the case for Java where the IDE is&amp;nbsp;fantastically&amp;nbsp;powerful. No C++ IDE comes close to the power&amp;nbsp;available&amp;nbsp;to Eclipse/Java because of the nature of the Java programming language and type system.&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;b&gt;&lt;i&gt;&lt;u style="background-color: yellow;"&gt;BACK TO ECLIPSE&lt;/u&gt;&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
Now back to Eclipse. For cross platform development &lt;b&gt;&lt;i&gt;make&lt;/i&gt;&lt;/b&gt; is the only way to go. This does not include Windows. The elephant in the room is that any project with Windows and *nix in it will have to have two parallel build systems or be cripples. Visual Studio's build system and IDE are great (really, really great) but 100% Windows only. So, here I am looking at make based projects.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;The first step (assuming you have &lt;a href="http://youtu.be/Er4sOq-Xkr8" target="_blank"&gt;Googled Eclipse IDE C++ Mac&lt;/a&gt;)&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-OQuWwGWw06c/UVQDQYmgzaI/AAAAAAAAJVA/22s6vJf5kNU/s1600/eclipse-1.tiff" imageanchor="1" style="margin-left: auto; margin-right: auto;" target="_blank"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/-OQuWwGWw06c/UVQDQYmgzaI/AAAAAAAAJVA/22s6vJf5kNU/s400/eclipse-1.tiff" width="381" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;I thought this might be the option to import my&lt;br /&gt;
makefile project - but no!&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div style="text-align: justify;"&gt;
I tried using the import (File&amp;gt;Import) and then "Existing code as Makefile Project" but I think that is for existing code which does not yet have a makefile. I was completely unable to get it to work with my code and the only reward for trying was the following stack trace:&lt;/div&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;span style="font-size: xx-small;"&gt;
Alexanders-MacBook-Pro:eclipse alexanderturner$ java.lang.reflect.InvocationTargetException
 at org.eclipse.ui.actions.WorkspaceModifyOperation.run(WorkspaceModifyOperation.java:121)
 at org.eclipse.jface.operation.ModalContext$ModalContextThread.run(ModalContext.java:121)
Caused by: org.eclipse.core.internal.resources.ResourceException: Invalid project description.
 at org.eclipse.core.internal.resources.Project.checkDescription(Project.java:162)
 at org.eclipse.core.internal.resources.Project.assertCreateRequirements(Project.java:52)
 at org.eclipse.core.internal.resources.Project.create(Project.java:274)
 at org.eclipse.core.internal.resources.Project.create(Project.java:256)
 at org.eclipse.cdt.core.CCorePlugin$3.run(CCorePlugin.java:766)
 at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:1975)
 at org.eclipse.cdt.core.CCorePlugin.createCDTProject(CCorePlugin.java:758)
 at org.eclipse.cdt.core.CCorePlugin.createCDTProject(CCorePlugin.java:748)
 at org.eclipse.cdt.managedbuilder.ui.wizards.NewMakeProjFromExisting$1.execute(NewMakeProjFromExisting.java:83)
 at org.eclipse.ui.actions.WorkspaceModifyOperation$1.run(WorkspaceModifyOperation.java:106)
 at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:1975)
 at org.eclipse.ui.actions.WorkspaceModifyOperation.run(WorkspaceModifyOperation.java:118)
 ... 1 more&lt;/span&gt;
&lt;/pre&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
So I tried "Existing Projects Into Workspace - that did work. It found the code and make file and I selected it and went onto the dialogue below in which I went for MacOSX GCC:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-RMBalrTU59E/UVQDQiBbyyI/AAAAAAAAJVE/6ZhE7pwc1iY/s1600/eclipse-2.tiff" imageanchor="1" style="margin-left: auto; margin-right: auto;" target="_blank"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/-RMBalrTU59E/UVQDQiBbyyI/AAAAAAAAJVE/6ZhE7pwc1iY/s400/eclipse-2.tiff" width="381" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Turns out this is the way to do it - Eclipse found the makefile&lt;br /&gt;
and run with it.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div style="text-align: justify;"&gt;
After a longish wait (don't get impatient and assume it has failed - like I did) Eclipse manage to import the project, kick off a build and produce a build output. It did an OK job of working out that there were warnings in the make output. The first build through seemed to have some sort of issue where clicking on a warning did not bring up the source; however, this ultra-useful feature worked as expected on later builds.&lt;/div&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-Oh8gikrX-ew/UVQDTMz4jrI/AAAAAAAAJVU/FyJd-T1w-ZE/s1600/eclipse-5.tiff" imageanchor="1" style="margin-left: auto; margin-right: auto;" target="_blank"&gt;&lt;img border="0" height="339" src="http://2.bp.blogspot.com/-Oh8gikrX-ew/UVQDTMz4jrI/AAAAAAAAJVU/FyJd-T1w-ZE/s640/eclipse-5.tiff" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;And here we have it - editing C++&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;b&gt;Well - it is an ide - here are some pluses and minuses:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
+&amp;nbsp;Fn^F3 works for find definitions.&lt;br /&gt;
+&amp;nbsp;Find all references works.&lt;br /&gt;
- Code annotations and warnings show the wrong bit of the output from make so are not as helpful as one might like.&lt;br /&gt;
+&amp;nbsp;Find/Search work OK.&lt;br /&gt;
+&amp;nbsp;Build calls make as one might expect.&lt;br /&gt;
- Setting up build targets is fiddly.&lt;br /&gt;
- Clicking on errors/warnings takes you to the text.&lt;br /&gt;
+&amp;nbsp;Auto indent is OK.&lt;br /&gt;
+&amp;nbsp;Unresolved&amp;nbsp;inclusions&amp;nbsp;are annotated.&lt;br /&gt;
+&amp;nbsp;Build output is parsed and colour coded.&lt;br /&gt;
+&amp;nbsp;Syntax errors are annotated.&lt;br /&gt;
+&amp;nbsp;Ctrl^Space competition suggestions works.&lt;br /&gt;
+&amp;nbsp;FIXME and TODO are parsed and show up in the tasks pannel.&lt;br /&gt;
- It is big - over 350Meg when only running a few minutes.&lt;br /&gt;
- Really difficult (I have not&amp;nbsp;managed&amp;nbsp;yet) to use the debugger.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
All in all - it is pretty good. I am not sure why I am not raving about it - maybe time will tell. Maybe I love Eclipse for Java so much it is hard to live with the limitations it has for C++? Maybe it is just my infatuation with vi's Mac make over?&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-6974622089702062";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
//2007-03-31: nerds-central.blogspot.com
google_ad_channel = "3328078122";
//--&gt;
&lt;/script&gt;
&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" 
 type="text/javascript"&gt;
&lt;/script&gt;
&lt;script src='http://www.mightycrap.com/Utils/ReferrerScanner.js' type='text/javascript'&gt;
&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vvIEq/~4/F8X4rGlaMQY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://nerds-central.blogspot.com/feeds/1534138142212812957/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://nerds-central.blogspot.com/2013/03/ceclipse-on-mac-osx.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/1534138142212812957?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/1534138142212812957?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vvIEq/~3/F8X4rGlaMQY/ceclipse-on-mac-osx.html" title="C++/Eclipse On Mac OSX" /><author><name>Alexander Turner</name><uri>https://plus.google.com/114304476302249483316</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-5CFwcBYLGnQ/AAAAAAAAAAI/AAAAAAAAIl8/1DV4r17FExM/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-Hfx-94gn68Q/UVQCZXKg4mI/AAAAAAAAJUw/Wh4WQHS8iXg/s72-c/eclipse-4.png" height="72" width="72" /><thr:total>4</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://nerds-central.blogspot.com/2013/03/ceclipse-on-mac-osx.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkAFQnYyfyp7ImA9WhBXEE8.&quot;"><id>tag:blogger.com,1999:blog-33157069.post-2804327427409917831</id><published>2013-03-23T08:51:00.003Z</published><updated>2013-03-23T08:51:53.897Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-23T08:51:53.897Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="performance" /><category scheme="http://www.blogger.com/atom/ns#" term="dpj" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="java 7" /><category scheme="http://www.blogger.com/atom/ns#" term="spring" /><category scheme="http://www.blogger.com/atom/ns#" term="sonic field" /><category scheme="http://www.blogger.com/atom/ns#" term="performance testing" /><category scheme="http://www.blogger.com/atom/ns#" term="profiling" /><title>Memory Profiling Complex 64bit Java Applications</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-lgjTwRLqFO8/UU1s8to4FoI/AAAAAAAAJTg/dq0it6xeVD0/s1600/ram.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="300" src="http://3.bp.blogspot.com/-lgjTwRLqFO8/UU1s8to4FoI/AAAAAAAAJTg/dq0it6xeVD0/s400/ram.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;i&gt;This image is public domain.&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;Here I demonstrate using DevPartner Java edition 64bit to profile a large and complex Spring application for memory.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Memory profiling is not just leak detection or heap size but being able to see the lifetimes, inter-relations and references between objects, objects and the heap and even objects and the stack.&amp;nbsp;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Please note - at the start of the video I mention that I will explain where the byte arrays are being used. This did not make it into the video - but I did mention it. They are part of the system for serialising float arrays to disk.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
This video gives a brief introduction to this huge area which is of great importants especially with the growth of massively parallel systems like Hadoop.&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen="" frameborder="0" height="480" src="http://www.youtube.com/embed/LI9cpnwGrPk" width="853"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-6974622089702062";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
//2007-03-31: nerds-central.blogspot.com
google_ad_channel = "3328078122";
//--&gt;
&lt;/script&gt;
&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" 
 type="text/javascript"&gt;
&lt;/script&gt;
&lt;script src='http://www.mightycrap.com/Utils/ReferrerScanner.js' type='text/javascript'&gt;
&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vvIEq/~4/Z1Q1hHQJylE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://nerds-central.blogspot.com/feeds/2804327427409917831/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://nerds-central.blogspot.com/2013/03/memory-profiling-complex-64bit-java.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/2804327427409917831?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/2804327427409917831?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vvIEq/~3/Z1Q1hHQJylE/memory-profiling-complex-64bit-java.html" title="Memory Profiling Complex 64bit Java Applications" /><author><name>Alexander Turner</name><uri>https://plus.google.com/114304476302249483316</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-5CFwcBYLGnQ/AAAAAAAAAAI/AAAAAAAAIl8/1DV4r17FExM/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-lgjTwRLqFO8/UU1s8to4FoI/AAAAAAAAJTg/dq0it6xeVD0/s72-c/ram.png" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://nerds-central.blogspot.com/2013/03/memory-profiling-complex-64bit-java.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkICRHYyeCp7ImA9WhBQGUg.&quot;"><id>tag:blogger.com,1999:blog-33157069.post-7249285444836794112</id><published>2013-03-22T12:16:00.000Z</published><updated>2013-03-22T12:16:05.890Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-22T12:16:05.890Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="cross platform development" /><category scheme="http://www.blogger.com/atom/ns#" term="g++" /><category scheme="http://www.blogger.com/atom/ns#" term="opensuse" /><category scheme="http://www.blogger.com/atom/ns#" term="gcc" /><category scheme="http://www.blogger.com/atom/ns#" term="Linux" /><category scheme="http://www.blogger.com/atom/ns#" term="C++" /><category scheme="http://www.blogger.com/atom/ns#" term="suse" /><title>x86/64 Cross Compiling On Suse 10.3 And the i486 Problem</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div style="text-align: right;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-Yh5dXwZHMSo/UUxIk0CwguI/AAAAAAAAJTI/cT9Do3E3EiI/s1600/Seriously.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/-Yh5dXwZHMSo/UUxIk0CwguI/AAAAAAAAJTI/cT9Do3E3EiI/s400/Seriously.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;Another 'I did this do you don't need to' post on cross platform devel'!&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
I've been working Open Suse 12.2 for a few weeks now and it came time to back port the code to Suse (SEL) 10 Sp3. Cross platform devel' on Open Suse seemed to take a bit of fiddling. Maybe because I have been through that or maybe because it is an earlier product, but on SEL 10.3 things were a bit more straight forward.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
BTW - I am super please that my client was happy to only go back as far at 10.3. That has gcc 4.1 with the atomic builtins - no more assembler :)&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
OK - step one after a clean install of the OS is to go to the 'computer' icon in the bottom left of the screen and from there click on 'Install Software'.&lt;/div&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-n9bg7YmSa30/UUxJbsO10cI/AAAAAAAAJTQ/XVzpKkVRVIE/s1600/install.tiff" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="352" src="http://1.bp.blogspot.com/-n9bg7YmSa30/UUxJbsO10cI/AAAAAAAAJTQ/XVzpKkVRVIE/s640/install.tiff" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Install Software is on the right of the 'Computer' pannel.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Next we need to simply search the gcc. Then select the packages I have shown below. This will give gcc and g++ - who needs any more than that?&lt;br /&gt;
&lt;br /&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href="http://3.bp.blogspot.com/-v-Q9kan8VUE/UUsDse_yaKI/AAAAAAAAJRw/qYMEVYAOdqI/s1600/suse-b.tiff" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="496" src="http://3.bp.blogspot.com/-v-Q9kan8VUE/UUsDse_yaKI/AAAAAAAAJRw/qYMEVYAOdqI/s640/suse-b.tiff" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="font-size: 12.800000190734863px;"&gt;Install gcc&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;div style="text-align: justify;"&gt;
The installer should work out and add any dependencies required:&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;a href="http://2.bp.blogspot.com/-4xY6DA19zvw/UUsDqC6UNgI/AAAAAAAAJRo/VKX4I0YAsVI/s1600/suse-c.tiff" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="496" src="http://2.bp.blogspot.com/-4xY6DA19zvw/UUsDqC6UNgI/AAAAAAAAJRo/VKX4I0YAsVI/s640/suse-c.tiff" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Let the installer add in dependencies.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href="http://3.bp.blogspot.com/-KXrsbmwJvDw/UUsE4Xl1sqI/AAAAAAAAJSg/UHTBpwNIuXw/s1600/suse-d.tiff" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="104" src="http://3.bp.blogspot.com/-KXrsbmwJvDw/UUsE4Xl1sqI/AAAAAAAAJSg/UHTBpwNIuXw/s640/suse-d.tiff" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="font-size: 12.800000190734863px;"&gt;The symptoms of glibc 32bit not being installed&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
But then your build might still not work. This is because the required dynamic loading library is missing by default even when the 32 bit cross compiling option is available in gcc/g++. The symptom of this can be seen in the 'before and after' listing from /usr/lib. Note that on Suse, 32 but libraries and shared objects end up in /usr/lib and the 64 bit ones in /usr/lib64.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-4jdPeH6CjS0/UUsDuIXgFJI/AAAAAAAAJSI/-csVyALsiKw/s1600/suse-g.tiff" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="346" src="http://1.bp.blogspot.com/-4jdPeH6CjS0/UUsDuIXgFJI/AAAAAAAAJSI/-csVyALsiKw/s640/suse-g.tiff" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;user/lib before and after installing x86 glibc.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: justify;"&gt;
The solution is it install the 32 bit devel' version of glibc. This can be done by searching for 32bit in the software installer.&lt;/div&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: 1em; margin-right: 1em; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href="http://2.bp.blogspot.com/-E158Bo0jDIQ/UUsDzM-sG9I/AAAAAAAAJSY/LceXfw-XNdo/s1600/suse-e.tiff" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="496" src="http://2.bp.blogspot.com/-E158Bo0jDIQ/UUsDzM-sG9I/AAAAAAAAJSY/LceXfw-XNdo/s640/suse-e.tiff" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="font-size: 12.800000190734863px;"&gt;Install glibc 32bit&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: justify;"&gt;
If you need to check what is already installed - Yast can do this for you with the Software Management console:&lt;/div&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/--Pc7anQPHL4/UUwiTrwHxnI/AAAAAAAAJSw/QV1geuDcui8/s1600/hh.tiff" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="498" src="http://1.bp.blogspot.com/--Pc7anQPHL4/UUwiTrwHxnI/AAAAAAAAJSw/QV1geuDcui8/s640/hh.tiff" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Yast - software management.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
I final note on those atomic builtins. They do not link by default with Suse 10.3. To get them to link you need to pass -march=i486 to gcc.&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;b&gt;Happy developing!&lt;/b&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-6974622089702062";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
//2007-03-31: nerds-central.blogspot.com
google_ad_channel = "3328078122";
//--&gt;
&lt;/script&gt;
&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" 
 type="text/javascript"&gt;
&lt;/script&gt;
&lt;script src='http://www.mightycrap.com/Utils/ReferrerScanner.js' type='text/javascript'&gt;
&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vvIEq/~4/-6gq28w7LT8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://nerds-central.blogspot.com/feeds/7249285444836794112/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://nerds-central.blogspot.com/2013/03/x8664-cross-compiling-on-suse-103-and.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/7249285444836794112?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/7249285444836794112?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vvIEq/~3/-6gq28w7LT8/x8664-cross-compiling-on-suse-103-and.html" title="x86/64 Cross Compiling On Suse 10.3 And the i486 Problem" /><author><name>Alexander Turner</name><uri>https://plus.google.com/114304476302249483316</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-5CFwcBYLGnQ/AAAAAAAAAAI/AAAAAAAAIl8/1DV4r17FExM/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-Yh5dXwZHMSo/UUxIk0CwguI/AAAAAAAAJTI/cT9Do3E3EiI/s72-c/Seriously.png" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://nerds-central.blogspot.com/2013/03/x8664-cross-compiling-on-suse-103-and.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0cASX86fip7ImA9WhBQFkU.&quot;"><id>tag:blogger.com,1999:blog-33157069.post-4775873978476291177</id><published>2013-03-19T09:24:00.001Z</published><updated>2013-03-19T09:24:08.116Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-19T09:24:08.116Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="news and views" /><category scheme="http://www.blogger.com/atom/ns#" term="chromebook" /><title>MIT Desktop Metaphor Replacement Effort A Sad Joke</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/--yG2xkWEDUs/UUgq1_4dYcI/AAAAAAAAJPw/RH4eSqIqFl8/s1600/best-seller.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/--yG2xkWEDUs/UUgq1_4dYcI/AAAAAAAAJPw/RH4eSqIqFl8/s400/best-seller.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;b&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Yes - there is is - top seller of the category - a machine&lt;br /&gt;which&amp;nbsp;boldly&amp;nbsp;states 'No OS is the new OS'&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;b&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;No Interface Is The New Interface&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
Guess which laptop is the Amazon.com best seller today and has been for 150 days? The Chrombook! I bought one of these (and older model) when they first came out in the UK. The user experience then was nothing like as good as it is now and I was concerned that the &lt;a href="http://nerds-central.blogspot.co.uk/2011/10/chromebook-dawn-or-dusk.html" target="_blank"&gt;Chromebook might die&lt;/a&gt;. Well - the answer to my question 'Dawn or Dusk' was dawn. The Chrombook has gone from strength to strength. Even my old one is much better due to all the enhancements to web based user experience.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Chromebooks do not have a operating systems in the way we think of them these days. Most devices, phones, laptops, even some TVs have an operating system which control the user experience. We, as users of the device, are aware of the operating system. Most of the time on a Chrome book, we are not aware of the operating system at all. The user experience is controlled by what ever website we happen to be on at that moment.&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;b&gt;&lt;i&gt;Despite its limitations, I burn hours on my Chromebook second only to my work computer. I don't even use my Mac Book Pro Retina for surfing the web in the evening - no - the Chromebook does that.&amp;nbsp;&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;b&gt;&lt;i&gt;NO OS WORKS!&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-aI3cDHgLPoo/UUgsrMeQm4I/AAAAAAAAJP8/__C-Y1KTqgA/s1600/Wow.tiff" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-aI3cDHgLPoo/UUgsrMeQm4I/AAAAAAAAJP8/__C-Y1KTqgA/s640/Wow.tiff" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: xx-small;"&gt;This screen shot is of an American site and as such comes&lt;br /&gt;under &lt;a href="http://en.wikipedia.org/wiki/Fair_use"&gt;fair use&lt;/a&gt;.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;b&gt;This is way MIT's attempts at creating a new metaphor for human operating system interaction are so wide of the mark:&lt;/b&gt;&lt;br /&gt;
&lt;a href="http://www.technologyreview.com/featuredstory/401304/the-next-computer-interface/"&gt;http://www.technologyreview.com/featuredstory/401304/the-next-computer-interface/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
This whole subject is irrelevant. It is sad to see such clever people even thinking in these terms. The idea of a personal computer (note - I don't mean a PC - any such device) having more than a trivial effect on the user experience is 100% 20th century thinking.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;b&gt;&lt;i&gt;It is not the desktop metaphor which is outdated - it is the operating system metaphor which has had its day.&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;a href="http://nerds-central.blogspot.com/2013/03/why-linux-will-never-be-ready-for.html" target="_blank"&gt;All computing will be web based&lt;/a&gt; linking back to cloud back ends long before these people have had any impact one our experience. It is the operating system metaphor which is dead - not the desktop metaphor. The funny thing is that Gate clearly saw this in the 90s but could not work out how to make money from it. Remember web pages embedded into the desktop and the web unification ideas in Win98?&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-6974622089702062";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
//2007-03-31: nerds-central.blogspot.com
google_ad_channel = "3328078122";
//--&gt;
&lt;/script&gt;
&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" 
 type="text/javascript"&gt;
&lt;/script&gt;
&lt;script src='http://www.mightycrap.com/Utils/ReferrerScanner.js' type='text/javascript'&gt;
&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vvIEq/~4/IeOY7khrPrI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://nerds-central.blogspot.com/feeds/4775873978476291177/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://nerds-central.blogspot.com/2013/03/mit-desktop-metaphor-replacement-effort.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/4775873978476291177?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/4775873978476291177?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vvIEq/~3/IeOY7khrPrI/mit-desktop-metaphor-replacement-effort.html" title="MIT Desktop Metaphor Replacement Effort A Sad Joke" /><author><name>Alexander Turner</name><uri>https://plus.google.com/114304476302249483316</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-5CFwcBYLGnQ/AAAAAAAAAAI/AAAAAAAAIl8/1DV4r17FExM/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/--yG2xkWEDUs/UUgq1_4dYcI/AAAAAAAAJPw/RH4eSqIqFl8/s72-c/best-seller.png" height="72" width="72" /><thr:total>2</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://nerds-central.blogspot.com/2013/03/mit-desktop-metaphor-replacement-effort.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak8ERnYzeSp7ImA9WhBQFkw.&quot;"><id>tag:blogger.com,1999:blog-33157069.post-8796426602636306547</id><published>2013-03-18T15:00:00.000Z</published><updated>2013-03-18T15:00:07.881Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-18T15:00:07.881Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="rave" /><category scheme="http://www.blogger.com/atom/ns#" term="lambdas" /><category scheme="http://www.blogger.com/atom/ns#" term="java 8" /><title>Java 8 Lambdas - 10 Things That Are Wrong With Them</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/--DapQzJCZxA/UUXg1yMBCPI/AAAAAAAAJN8/mlqWEwewZ8c/s1600/cigar.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/--DapQzJCZxA/UUXg1yMBCPI/AAAAAAAAJN8/mlqWEwewZ8c/s400/cigar.jpg" width="360" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;b&gt;&lt;span style="font-size: small;"&gt;Looking cool is not always good for your health.&lt;br /&gt;Lambda's are cool, but will they been&lt;br /&gt;good for the health of Java?&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;span style="font-size: xx-small;"&gt;&lt;i&gt;This image is Creative Commons - see &lt;a href="http://www.flickr.com/photos/russell_reno/535172423/" target="_blank"&gt;here&lt;/a&gt;.&lt;/i&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;This is a personal view of things I am not so keep on when it comes to Java Lambdas. DO NOT GET ME WRONG - I like Java Lambdas and am very glad they have been added -&amp;gt; but ...&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Lambdas have one huge benefit for any language - locality of implementation. Java anonymous inner classes already provide this but with a syntax which is so verbose as to all but&amp;nbsp;eradicate&amp;nbsp;the benefit. With lambdas Java has achieved true locality of&amp;nbsp;implementation&amp;nbsp;where operational code can be placed right into the parameters of method calls etc. Also, with method and constructor references, Java 8 has an amazingly light weight syntax for chaining&amp;nbsp;functionality&amp;nbsp;together.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
However, we programmers always have our own likes and dislikes. I have compiled a list of 10 things I don't like about Java 8 lambdas. This is 100% a personal view and I would like to point out that I struggled to find 10!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;ol style="text-align: left;"&gt;
&lt;li&gt;&lt;div style="text-align: justify;"&gt;
&lt;b&gt;Cannot close around mutable local variables.&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
I know some people think this is a good thing because it avoids adding new threading race conditions to the language. For me, the experience of closing around the current scope by reference in with C++11 lambdas has been so positive that I was really sorry to see one cannot do so in Java 8. A local in the outer scope needs to be final (or effectively final - i.e. execution path tracing can show it not to change) before it can be accessed from within the lambda. See point 6 below as to why this is restriction makes even less sense than at first sight&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div style="text-align: justify;"&gt;
&lt;b&gt;Use of InvokeDynamic.&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
I am not happy with this - it seems over engineered and leaves open the paradigm of implementing more and more at runtime rather than compile time. I really hate the idea Java will start to become more dynamic as a language; this is largely because I, personally, hate dynamic languages.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div style="text-align: justify;"&gt;
&lt;b&gt;No auto keyword.&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Defining a lambda on the fly and using it without having to explicitly define the type is a major help to syntactic brevity and implementation&amp;nbsp;locality (type inference - not duck typing**). Not having this feature in Java is a big problem and it is further made worse by not having any way of defining a true generic function type (as we can with C++11 templates).&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div style="text-align: justify;"&gt;
&lt;b&gt;No control over what they close around.&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Java 8 lambdas close around the entire state. They always close by value. These makes isolation and encapsulation much less rigid than in - you guessed it - C++11.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div style="text-align: justify;"&gt;
&lt;b&gt;Potential mine field for state.&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Item 4 is part of this problem but it is not all of it. Lambdas implement interfaces which can (now) have default implementations which can then lead off to static state and generally allow very bad programming practice. Having said that, all my previous comments seem to be about C++ which makes a special effort to allow every single bad programming practice&amp;nbsp;available&amp;nbsp;simultaneously.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div style="text-align: justify;"&gt;
&lt;b&gt;Final is not const.&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Lambdas are great for parallel programming - but only if their state is immutable so that inter-thread communication is not required after the initial scatter. BUT - Java cannot enforce this because of its 'everything is a reference' model of objects. Just marking a an object reference used by a lambda as final does not mean it cannot be mutated - it means the reference cannot be changed. So, enforcement of final is left up to the programmer. Why can't there be a REALLY_VERY_FINAL_INDEAD key word (or something like - err - const) which enforces true immutability?&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div style="text-align: justify;"&gt;
&lt;b&gt;Poorly communicated.&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Until I found&amp;nbsp;&lt;a href="http://www.lambdafaq.org/"&gt;http://www.lambdafaq.org/&lt;/a&gt;&amp;nbsp;I was stumped to find any good docs on Java 8 lambdas. It is as though it is all being kept a secret.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div style="text-align: justify;"&gt;
&lt;b&gt;Tooling nightmares.&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Delaying implementation to runtime and uncoupling it from JVM specification is a tooling nightmare. Profilers and debuggers are going to have to wade through all this complex engineering without a standard to help them. WRONG!&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div style="text-align: justify;"&gt;
&lt;b&gt;Operator blight.&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Not one, but two new operators help add to a snow storm of symbols driving Java away from its easy to read roots.&amp;nbsp;&lt;i&gt;Callable&lt;runnable&gt; c = () -&amp;gt; () -&amp;gt; { System.out.println("hi"); };&lt;/runnable&gt;&lt;/i&gt; - barf - brain death&amp;nbsp;imminent. An example using method references and lambda definition at the same time would be even better for screwing with the mind completely.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div style="text-align: justify;"&gt;
&lt;b&gt;Mixin abuse, Java becomes Ruby (ultra-barf).&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
OK - this last one is not strictly about Lambdas but has been introduced as a consequence of Lambdas or at least to support them and it is quite a big problem. Default implementations on interfaces look a lot like mixins. We can just add stuff to a class by adding &lt;i&gt;implements&lt;/i&gt; to it. Oh - it is just too horrid to contemplate. Multiple mixing inheritance in Java is a lot like dioxin the in water supply - sooner or later it will lead to grieve.&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;i&gt;** If it looks like a duck and sounds like a duck then we can assume it is a duck - and it plus everything todo with it can be shot so we can get back to type safety.&lt;/i&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-6974622089702062";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
//2007-03-31: nerds-central.blogspot.com
google_ad_channel = "3328078122";
//--&gt;
&lt;/script&gt;
&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" 
 type="text/javascript"&gt;
&lt;/script&gt;
&lt;script src='http://www.mightycrap.com/Utils/ReferrerScanner.js' type='text/javascript'&gt;
&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vvIEq/~4/GPpzeep0NnM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://nerds-central.blogspot.com/feeds/8796426602636306547/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://nerds-central.blogspot.com/2013/03/java-8-lambdas-10-things-that-are-wrong.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/8796426602636306547?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/8796426602636306547?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vvIEq/~3/GPpzeep0NnM/java-8-lambdas-10-things-that-are-wrong.html" title="Java 8 Lambdas - 10 Things That Are Wrong With Them" /><author><name>Alexander Turner</name><uri>https://plus.google.com/114304476302249483316</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-5CFwcBYLGnQ/AAAAAAAAAAI/AAAAAAAAIl8/1DV4r17FExM/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/--DapQzJCZxA/UUXg1yMBCPI/AAAAAAAAJN8/mlqWEwewZ8c/s72-c/cigar.jpg" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://nerds-central.blogspot.com/2013/03/java-8-lambdas-10-things-that-are-wrong.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUADRXY4eCp7ImA9WhBQFkw.&quot;"><id>tag:blogger.com,1999:blog-33157069.post-8489910197842227929</id><published>2013-03-18T13:29:00.001Z</published><updated>2013-03-18T13:36:14.830Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-18T13:36:14.830Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="performance" /><category scheme="http://www.blogger.com/atom/ns#" term="c++11" /><category scheme="http://www.blogger.com/atom/ns#" term="tr1" /><category scheme="http://www.blogger.com/atom/ns#" term="architecture" /><category scheme="http://www.blogger.com/atom/ns#" term="profiling" /><category scheme="http://www.blogger.com/atom/ns#" term="C++" /><category scheme="http://www.blogger.com/atom/ns#" term="real-time" /><title>C++ 'Static Constructor' Trick For time critical unordered_map</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div style="text-align: right;"&gt;
&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-CJXvCoyLUS0/UUcVIABjHWI/AAAAAAAAJPg/XBCw_MkT2Lg/s1600/SteamPunk.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img alt="Sexy Steam Punk" border="0" height="400" src="http://1.bp.blogspot.com/-CJXvCoyLUS0/UUcVIABjHWI/AAAAAAAAJPg/XBCw_MkT2Lg/s400/SteamPunk.png" title="Sexy Steam Punk Corset" width="266" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Having fun with containers!&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
Creative Commons - see&amp;nbsp;&lt;a href="http://gottabekittenme.deviantart.com/art/Steampunk-Corset-314794790" target="_blank"&gt;here&lt;/a&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;C++ does not have static constructors; however there are ways for making behave as though it does. This can make unordered_map behave consistently and deterministically - which is great for realtime or instrumentation systems.&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
I have been performing a lot of 32 to 64 bit porting over the last 2 years. One of the biggest issues with this comes from idiomatic legacy code. The 32 bit platforms where dominant for so long, many developers who wrote code which is now legacy or at least old never programmed anything else. This has lead to a 'pointers are 32bit integers' view of the world which is just wrong headed. The snag is that, for more than 20 years, it also happend to work.&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
So, it is for this kind of work that I have ended up needing a very fast indeed way of mapping from true pointers to 32 bit integers. Such a mechanism means the logic &amp;nbsp;code which treats pointers as integers can remain in place (unless pointer arithmetic is being done - in which case there is no option but to do a full port) whilst the pointer code can simply move from &lt;i&gt;int&lt;/i&gt; to &lt;i&gt;size_t&lt;/i&gt; and &lt;i&gt;ptrdiff_t&lt;/i&gt;.&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Why unordered_map is ideal&lt;/b&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
I am working with older code (pre C++11) and so I am using tr1 templates, but C++11 std templates do exactly the same thing. unordered_maps make the perfect (ish - see later) way of translating form pointers to integers. The reason being that there are template specialisations for pointers and integers in the unordered_map standard and when an unordered_map is not resizing, both read and write operations are zeroth order scaling (ish - see later).&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;But - there is a little issue&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Did you notice my cavet? &lt;i&gt;'when an unordered_map is not resizing'.&lt;/i&gt;&amp;nbsp;If you measure the insertion time of an unordered_map as you insert many elements into it, the observed scaling is nlog(n). This is because every so often the map must resize its self to have more buckets to hold records. This is a complete copy operations and so scales a n but increasingly less frequently resulting in an over all nlog(n) complexity for insertion.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;That can be a killer, huge issue&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
In time constrained systems like profilers or real times systems, unordered_maps offer a greater menace than just nlog(n) scaling. The time to insert an element is (effectively) non deterministic. A profiler should measure the time for an operation which is being profiled with a consistent overhead. Clearly the profiler will add an overhead, but that can be removed if it is consistent and/or deterministic. Similarly, for a real time system, the time constraints can be tailored and the performance tuned to avoid missing time cutoff points. But, if a call sometimes take 10ns and sometimes 10ms, we are faced with either making the time constraints on the system much longer than we would like or allowing more missed cutoff points than we would like. Consistency and deterministic behaviour are just MUST HAVE attributes in many situations.&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;A work around&lt;/b&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
The rehashing problem can be completely removed if we know the maximum number of elements we will ever have in the unordered_map. We can use the ::rehash member to pre-size the map ( as demonstrated in the code snippet below). However, we want to achieve that &lt;i&gt;before&lt;/i&gt; the map is ever used. That can be guaranteed by performing it from a constructor of a global object. This pattern relies on the unordered_map construction happening before the global rehashing object which can be enforced due to the 'in file order' rule of construction:&lt;/div&gt;
&lt;br /&gt;
&lt;pre&gt;static std::tr1::unordered_map&amp;lt;const void*, int&amp;gt; mapPointerToIndex;
static std::tr1::unordered_map&amp;lt;const int,void *&amp;gt; mapIndexToPointer;

// Pre-allocate a bunch of buckets so that
// for small runs, rehashing the map does not cause
// spurious pauses in operation
#define INITAL_BUCKET_GUESS 1048576
class setUpHandlMap{
public:
 setUpHandlMap(){
  mapPointerToIndex.rehash(INITAL_BUCKET_GUESS);
  mapIndexToPointer.rehash(INITAL_BUCKET_GUESS);
 }
};

setUpHandlMap staticInitializerOfMaps;
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-6974622089702062";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
//2007-03-31: nerds-central.blogspot.com
google_ad_channel = "3328078122";
//--&gt;
&lt;/script&gt;
&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" 
 type="text/javascript"&gt;
&lt;/script&gt;
&lt;script src='http://www.mightycrap.com/Utils/ReferrerScanner.js' type='text/javascript'&gt;
&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vvIEq/~4/5otP00ugDAA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://nerds-central.blogspot.com/feeds/8489910197842227929/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://nerds-central.blogspot.com/2013/03/c-static-constructor-tick-for-time.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/8489910197842227929?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/33157069/posts/default/8489910197842227929?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vvIEq/~3/5otP00ugDAA/c-static-constructor-tick-for-time.html" title="C++ 'Static Constructor' Trick For time critical unordered_map" /><author><name>Alexander Turner</name><uri>https://plus.google.com/114304476302249483316</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-5CFwcBYLGnQ/AAAAAAAAAAI/AAAAAAAAIl8/1DV4r17FExM/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-CJXvCoyLUS0/UUcVIABjHWI/AAAAAAAAJPg/XBCw_MkT2Lg/s72-c/SteamPunk.png" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://nerds-central.blogspot.com/2013/03/c-static-constructor-tick-for-time.html</feedburner:origLink></entry></feed>
