<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SIGTTOU &#187; Code</title>
	<atom:link href="http://sigttou.com/category/code/feed" rel="self" type="application/rss+xml" />
	<link>http://sigttou.com</link>
	<description>Just another background process...</description>
	<lastBuildDate>Wed, 22 Dec 2010 00:12:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>On the fourth day of Christmas my true love gave to me&#8230; four CUDA tips&#8230;</title>
		<link>http://sigttou.com/four-cuda-tips</link>
		<comments>http://sigttou.com/four-cuda-tips#comments</comments>
		<pubDate>Wed, 22 Dec 2010 00:12:06 +0000</pubDate>
		<dc:creator>Bob Somers</dc:creator>
				<category><![CDATA[Adventures in GraphicsLand]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://sigttou.com/?p=282</guid>
		<description><![CDATA[This post is from a blog called Adventures in GraphicsLand that I&#8217;m writing with two fellow CS grad students, Chris Gibson and Ryan Schmitt. Articles about anything related to my graduate work in graphics or my thesis will be posted &#8230; <a href="http://sigttou.com/four-cuda-tips">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><strong><em>This post is from a blog called <a href="http://aigfx.com">Adventures in GraphicsLand</a> that I&#8217;m writing with two fellow CS grad students, Chris Gibson and Ryan Schmitt. Articles about anything related to my graduate work in graphics or my thesis will be posted there and then cross-posted here. Articles about handy tips (like fixing bugs with VirtualBox or software setup on Fedora) will remain here. This post that I wrote for AIGFX, originally appeared <a href="http://www.aigfx.com/2010/12/four-cuda-tips/">here</a>.</em></strong></p>
<p>Learning CUDA has definitely been an interesting experience. As much as they make it sound like it&#8217;s simple to get started (and for the most part, it is), there are lots of little traps that can keep you frustrated for hours&#8230; or days. Here are four tips that stumped me during initial development of Haste (which is <a title="Haste on GitHub" href="https://github.com/cphaste/haste" target="_blank">now on GitHub</a>!) that might be helpful to you.</p>
<h3>Long running kernels on a desktop workstation</h3>
<p>In Linux, X&#8217;s driver watchdog will kill a process that leaves a driver hanging for too long, so to prevent that from happening you can&#8217;t launch a GPU kernel unless it returns within a couple milliseconds. (This happens in Windows, too, but I&#8217;m working mainly in Linux at the moment.) However, you might want to test kernels on your workstation. The way around this is to switch to a text-only terminal before running your CUDA program. On most Linux distributions, you can swap between terminals using Ctrl-Alt-F2 through Ctrl-Alt-F6, where each is a different terminal. If you hit Ctrl-Alt-F1 in Fedora 14, it will take you back to your X session (you&#8217;re still logged in and everything).</p>
<p>So, all you need to do is write code in your graphical desktop, compile, hit Ctrl-Alt-F2 to switch to a text-only terminal, then run your program for testing. When you want to go back to graphical mode to fix bugs, just Ctrl-Alt-F1 back and off you go.</p>
<h3>Slow device info queries</h3>
<p>If you&#8217;re doing doing development on a headless compute box (like our Tesla machine at Cal Poly), you might have noticed that querying device information takes a long time. This is compounded if it&#8217;s a multi-device machine. Our box at Poly has four Tesla GPUs, and Haste startup was frustratingly slow. All we did is query the device list once, then query each device individually using <code>cudaGetDeviceProperties()</code>. It usually take on the order of 30 to 45 seconds at program startup to get all the device information and allocate memory before we were off to the races launching kernels.</p>
<p>The problem is that the NVIDIA drivers normally maintain a lot of state about the GPUs in memory. However, this state is only there if there&#8217;s some resident process keeping it there, like X. If X is not running (or not even installed, like on our headless compute box), that state will need to get reinitialized every time you make a call that requires it. This can be excruciatingly slow, especially on multi-device machines.</p>
<p>The solution? Well, the easiest one is to just install and leave X running, even on a headless machine. Just make sure it&#8217;s not driving a display, or better yet switch it over to a text-only terminal with Ctrl-Alt-F2 to keep X around but not have it interfere with your kernels.</p>
<h3>Printing debug info in device kernels</h3>
<p>I must admit, while debuggers are neat, I tend to like <code>printf()</code> debugging. It&#8217;s not that I don&#8217;t see the value of debuggers; for some problems they&#8217;re really the only way to solve things. Maybe it has something do with the fact that <a title="cuda-gdb goes kaboom" href="http://forums.nvidia.com/index.php?s=91b8cd119e65d54ab921f4415fc4fcfc&amp;showtopic=188223" target="_blank">cuda-gdb inexplicably crashes</a> on every machine and kernel I try to run it on.</p>
<p>With the Fermi architecture, available in cards of compute capability 2.0 and higher, you can actually do <code>printf()</code>&#8216;s directly from your device code now, without having to jump through any strange library hoops. Initially, however, I was never able to get it to work. I couldn&#8217;t find which CUDA header I needed to include to get things off the ground, and even when it seemed to compile it didn&#8217;t print anything.</p>
<p>Well, it sounds silly, but just <code>#include &lt;stdio.h&gt;</code> and away you go. I never tried this initially because I thought that didn&#8217;t make any sense. The C standard library doesn&#8217;t have CUDA device code! The best I can tell, <code>nvcc</code> is rewriting these standard calls from device code behind the scenes.</p>
<h3>The device info&#8217;s maximumThreadsPerBlock lies!</h3>
<p>This one really irks me. If you query a device&#8217;s properties, it reports the maximum number of threads per block in a <code>cudaDeviceProp</code> struct member called, shockingly, <code>maxThreadsPerBlock</code>. The problem is that this is not the actual number of threads you can launch. That depends entirely on your kernel&#8217;s occupancy, which you can figure out using the difficult-to-find <a href="http://developer.download.nvidia.com/compute/cuda/3_2_prod/sdk/docs/CUDA_Occupancy_Calculator.xls" target="_blank">occupancy calculator spreadsheet</a>. You&#8217;ll also want to compile your kernel with the <code>nvcc</code> option <code>--ptxas-options=-v</code> to see the shared memory and register usage for your kernel. You&#8217;ll need it in the spreadsheet.</p>
<p>The occupancy limit doesn&#8217;t bug me so much as the fact that this is not mentioned anywhere in the documentation where <code>maxThreadsPerBlock</code> is mentioned. Once would think that would be a great place to throw up a warning flag, letting developers know that that number is purely speculative, and that they need to do some real benchmarking of their kernel to find the best occupancy and thread launch combination. Essentially, the <code>maxThreadsPerBlock</code> element is entirely superfluous, since it&#8217;s only real use would be in scaling kernel launch sizes by number of device threads available. However, instead we should apparently embed the Excel worksheet in our program and have the device properties chug through the macros to provide any runtime adjustments based on the hardware we&#8217;re running on. (&lt;/sarcasm&gt;) Yeesh.</p>
<p>Hopefully these tips help you out. As I continue to bang my head against the wall and find new tidbits I&#8217;ll be keeping track of them on my <a title="GitHub wiki" href="https://github.com/bobsomers/haste/wiki/Cuda-notes" target="_blank">GitHub wiki page</a>. Happy holidays!</p>
]]></content:encoded>
			<wfw:commentRss>http://sigttou.com/four-cuda-tips/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Compiling Lua with Visual Studio 2010</title>
		<link>http://sigttou.com/lua-visual-studio-2010-2</link>
		<comments>http://sigttou.com/lua-visual-studio-2010-2#comments</comments>
		<pubDate>Tue, 04 May 2010 06:03:15 +0000</pubDate>
		<dc:creator>Bob Somers</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Scripting]]></category>

		<guid isPermaLink="false">http://sigttou.com/?p=193</guid>
		<description><![CDATA[It&#8217;s not often I have to venture into the Microsoftland development environment, but when I do it always seems to take me a while to get used to their visual projects instead of good &#8216;ole Makefiles. I&#8217;ve been using Lua &#8230; <a href="http://sigttou.com/lua-visual-studio-2010-2">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s not often I have to venture into the Microsoftland development environment, but when I do it always seems to take me a while to get used to their visual projects instead of good &#8216;ole Makefiles. I&#8217;ve been using Lua to extend my C and C++ apps a lot recently, so I suddenly found myself needing to include the Lua static library with a Visual Studio 2010 project.</p>
<p>There are already binary distributions out there, but I like to compile things myself, so I whipped up a Visual Studio 2010 project to compile the Lua static library (<code>lua.lib</code>) the command line interpreter (<code>lua.exe</code>) and the script compiler (<code>luac.exe</code>).</p>
<p>First things first. If you just want a zip file with those three binary files (the library is Visual Studio 2010 compatible), look no further:</p>
<ul>
<li><a href="http://sigttou.com/files/lua-5.1.4-bin-vs2010.zip">Lua 5.1.4 binaries compiled with VS 2010</a> (<code>lua</code>, <code>luac</code>, <code>lua.lib</code>, and necessary headers)</li>
</ul>
<p>If you want to build Lua 5.1.4 yourself (like me) just grab the most recent copy of the 5.1.4 source code from the <a href="http://www.lua.org">Lua website</a>. Next, grab these Visual Studio 2010 project files and solution file:</p>
<ul>
<li><a href="http://sigttou.com/files/lua-5.1.4-proj-vs2010.zip">Lua 5.1.4 Visual Studio 2010 projects</a> (to build the binaries yourself)</li>
</ul>
<p>To use the project files, just unzip them into the root directory of your Lua source files (where the <code>README</code>, <code>INSTALL</code>, and <code>COPYRIGHT</code> files are). Then, load up <code>lua-vs2010.sln</code> in Visual Studio 2010. You should see three projects. The first, <code>lualib</code> will build the static library under <code>lib/lua.lib</code>. The second and third, <code>lua</code> and <code>luac</code> will build the Lua interpreter and compiler under <code>bin/lua.exe</code> and <code>bin/luac.exe</code>.</p>
<p>Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://sigttou.com/lua-visual-studio-2010-2/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Include dependencies</title>
		<link>http://sigttou.com/include-dependencies</link>
		<comments>http://sigttou.com/include-dependencies#comments</comments>
		<pubDate>Tue, 22 Dec 2009 06:56:46 +0000</pubDate>
		<dc:creator>Bob Somers</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Code]]></category>

		<guid isPermaLink="false">http://sigttou.com/?p=139</guid>
		<description><![CDATA[Generally when I write software, I try to keep things relatively well organized. Inevitably, however, things are going to get a bit messy, especially if you&#8217;re working on a large, disorganized codebase that you didn&#8217;t write to begin with&#8230; say, &#8230; <a href="http://sigttou.com/include-dependencies">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Generally when I write software, I try to keep things relatively well organized. Inevitably, however, things are going to get a bit messy, especially if you&#8217;re working on a large, disorganized codebase that you didn&#8217;t write to begin with&#8230; say, oh&#8230; something like the <a href="http://developer.valvesoftware.com">Source SDK</a>.</p>
<p>Frequently you have some class which is composed inside another class, but occasionally needs to access the class it&#8217;s composed inside of. Basically, the classes are composed inside each other, though the abstraction really only makes sense in one direction. Confused yet?</p>
<p>In this example, we&#8217;ll use a Refrigerator class which stores inside it an instance of a Cheese class. Why cheese, you ask? Because cheese is delicious. Also, our refrigerator is from the future and can slice and serve cheese just like the built in ice maker and water dispenser. It&#8217;s a pretty sweet fridge.</p>
<p>Now, we were all taught to keep our <code class="syntax cpp">#include</code>s in our header files, not the implementation files, so like good little programmers we construct our classes like so:</p>
<p><strong>refrigerator.h</strong></p>
<pre class="syntax cpp">#include &quot;cheese.h&quot;

class Refrigerator {
private:
    Cheese *pCheese;
    int temp = 35;

public:
    void ServeCheese();
    int GetTemp();
};</pre>
<p><strong>refrigerator.cpp</strong></p>
<pre class="syntax cpp">#include &quot;refrigerator.h&quot;

void Refrigerator::ServeCheese() {
    printf(&quot;Now dispensing %s cheese!\n&quot;, pCheese-&gt;GetFlavor());
}

int Refrigerator::GetTemp() {
    return temp;
}</pre>
<p><strong>cheese.h</strong></p>
<pre class="syntax cpp">class Cheese {
private:
    Refrigerator *pFridge;
public:
    char *GetFlavor();
    void CheckTemp();
    void BeginMolding();
};</pre>
<p><strong>cheese.cpp</strong></p>
<pre class="syntax cpp">#include &quot;cheese.h&quot;

void Cheese::CheckTemp() {
    if (pFridge-&gt;GetTemp() &gt; 45) {
        BeginMolding();
    }
}

char *Cheese::GetFlavor() {
    return &quot;cheddar&quot;;
}
</pre>
<p>I&#8217;ve left out the constructors in this example for brevity, but let&#8217;s assume that they get the pointers set up correctly so that our instance of the Refrigerator class has a correct pointer to an instance of the Cheese class and vice versa.</p>
<p>Now, at this point you may be screaming that this needs to be refactored and reorganized. Yes, it probably does. But there are many instances where you simply can&#8217;t, and in fact the abstraction really only makes sense one way. The fridge has cheese in it, but the cheese certainly doesn&#8217;t have a fridge in it. We just need that pesky reference around so we can check the temperature of the fridge every so often.</p>
<p><em>(Yes, I am aware that the fridge could push it&#8217;s temperature down to all the items in it, ala the <a href="http://en.wikipedia.org/wiki/Observer_pattern">Observer Pattern</a>. Yes I am aware that would be a better solution. But this is a contrived example anyway, so stick with me here.)</em></p>
<p>Now, the code given above doesn&#8217;t compile, because the Cheese class has no idea what the heck this Refrigerator class is, so we either need to include it or forward declare it. If we try to do this:</p>
<p><strong>cheese.h</strong></p>
<pre class="syntax cpp">#include &quot;refrigerator.h&quot;</pre>
<p>our compiler (more specifically, the preprocessor) is going to get very angry at us, depending on which order it decides to compile refrigerator and cheese. The solution, is a forward delcaration:</p>
<p><strong>cheese.h</strong></p>
<pre class="syntax cpp">class Refrigerator;

class Cheese {
    // ...etc...
};</pre>
<p>Basically what this does is tell the compiler, &#8220;Hey! There&#8217;s this class called Refrigerator that I might talk about, so here&#8217;s an empty declaration of it!&#8221;</p>
<p>The problem, though, is that this is rather limiting. Within the Cheese class, we can declare pointers to Refrigerator class, no problem. Pointers are of fixed size, so the compiler doesn&#8217;t much what care what it&#8217;s a pointer <strong><em>to</em></strong>, since it knows how much memory it needs to hold a pointer to it. When we try to access members of the class, though, like properties or methods, it falls apart because as far as the compiler knows, the class is empty. After all, we told it the Refrigerator class didn&#8217;t have anything in it.</p>
<p>So if we can&#8217;t <code class="syntax cpp">#include</code> it and forward declaring it doesn&#8217;t give us what we want, what can we do?</p>
<p>Well, we can do <strong>both</strong>. Kind of.</p>
<p>The solution is to forward declare in your header file, and <code class="syntax cpp">#include</code> in your implementation file. This will avoid the preprocessor headaches of of the chicken and egg <code class="syntax cpp">#include</code>, while allowing us to access the members of forward declared class in the implementation. In other words, here&#8217;s the fix:</p>
<p><strong>cheese.h</strong></p>
<pre class="syntax cpp">class Refrigerator;

class Cheese {
    ...
};</pre>
<p><strong>cheese.cpp</strong></p>
<pre class="syntax cpp">#include &quot;cheese.h&quot;
#include &quot;refrigerator.h&quot;
</pre>
<p>Again, it goes without saying, the better solution is to refactor or rearchitect your code if you can. These kind of hacks can get really out of hand and are usually a good <a href="http://en.wikipedia.org/wiki/Code_smell">code smell</a> that something needs to be fixed at a deeper level. However, if you&#8217;re working on a large codebase that you can&#8217;t change, this can help out a lot.</p>
]]></content:encoded>
			<wfw:commentRss>http://sigttou.com/include-dependencies/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Removing entities in the Source SDK</title>
		<link>http://sigttou.com/removing-entities</link>
		<comments>http://sigttou.com/removing-entities#comments</comments>
		<pubDate>Sat, 24 Oct 2009 23:54:49 +0000</pubDate>
		<dc:creator>Bob Somers</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Gaming]]></category>

		<guid isPermaLink="false">http://sigttou.com/?p=133</guid>
		<description><![CDATA[I haven&#8217;t written for a while, mainly because I&#8217;ve been busy with classes and studying for the GRE for my grad school applications, but here&#8217;s a quick tip for those of you meddling around with the Source SDK. It&#8217;s well &#8230; <a href="http://sigttou.com/removing-entities">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I haven&#8217;t written for a while, mainly because I&#8217;ve been busy with classes and studying for the GRE for my grad school applications, but here&#8217;s a quick tip for those of you meddling around with the Source SDK.</p>
<p>It&#8217;s well documented on how you go about spawning entities, but I couldn&#8217;t find a good place explaining how to <em>remove</em> spawned entities through code.</p>
<p><strong>Don&#8217;t</strong> try meddling with the global entity list (<code class="syntax cpp">gEntList</code>) or calling its <code class="syntax cpp">RemoveEntity()</code> method. It doesn&#8217;t do what you want.</p>
<p><strong>Instead</strong>, used one of the super-handy <code class="syntax cpp">UTIL_*</code> functions. Given a pointer to the entity you want to remove, simply use:</p>
<pre class="syntax cpp">
UTIL_Remove(pEntity);
</pre>
<p>Poof. Entity gone. Remember, entities are created and destroyed on the <strong>server side only.</strong> The server will automatically broadcast any changes to the entity list to its connected clients for you.</p>
]]></content:encoded>
			<wfw:commentRss>http://sigttou.com/removing-entities/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Awesome regex test tool</title>
		<link>http://sigttou.com/regex-test-tool</link>
		<comments>http://sigttou.com/regex-test-tool#comments</comments>
		<pubDate>Sat, 05 Sep 2009 06:27:44 +0000</pubDate>
		<dc:creator>Bob Somers</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://sigttou.com/?p=113</guid>
		<description><![CDATA[So I&#8217;m working with a friend to develop a regex that matches something out of an API response, when we really wish we could quickly prototype a regex. Now, there are plenty of tools to do this, some are even &#8230; <a href="http://sigttou.com/regex-test-tool">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>So I&#8217;m working with a friend to develop a regex that matches something out of an API response, when we really wish we could quickly prototype a regex. Now, there are plenty of tools to do this, some are even freeware, but all them need to be downloaded and installed. I realize it sounds pathetic to say that I was too lazy to download and install a tool, but to be honest I really don&#8217;t need more tiny, rarely-used apps cluttering up my system. There&#8217;s <em>got</em> to be a web-based tool to do this, I thought.</p>
<p>Google did not disappoint. I found this <strong>awesome</strong> web-based regex test tool built on Adobe Flex called <a href="http://gskinner.com/RegExr/">RegExr</a>. If you&#8217;ve got Flash installed, it runs right in your browser.</p>
<p>Not only does it show you what it&#8217;s matching live as you type, what your match groups contain, what each chunk of your regex means, etc., but it&#8217;s also got a phenomenal quick-reference sidebar for all those handy meta-characters. You can even save your favorite regexs and browse other people&#8217;s favorite submissions.</p>
<p>We need more tools like this. I was able to quickly and easily prototype a regex in no time at all, and the app took about 10 seconds to figure out how to use.</p>
<p>Thanks, <a href="http://gskinner.com">gskinner.com</a>! You guys are awesome!</p>
]]></content:encoded>
			<wfw:commentRss>http://sigttou.com/regex-test-tool/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Know your text editor</title>
		<link>http://sigttou.com/know-your-text-editor</link>
		<comments>http://sigttou.com/know-your-text-editor#comments</comments>
		<pubDate>Thu, 23 Jul 2009 02:41:36 +0000</pubDate>
		<dc:creator>Bob Somers</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://sigttou.com/?p=81</guid>
		<description><![CDATA[Let&#8217;s examine why it&#8217;s important as a programmer to really know your text editor, but in a different light that usual. Traditionally programmers are concerned with knowing all the tricks of their editor so that they can make use of &#8230; <a href="http://sigttou.com/know-your-text-editor">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Let&#8217;s examine why it&#8217;s important as a programmer to really know your text editor, but in a different light that usual. Traditionally programmers are concerned with knowing all the tricks of their editor so that they can make use of them. Instead, let&#8217;s look at an example of why you should know what your editor does so it doesn&#8217;t screw you over.</p>
<p>Today at work a coworker received a large volume of joke emails telling them how bad their coding style was, with links to example code telling them to &#8220;learn how to program&#8221;. This was in response to what he thought was a simple 6-line change, but was actually a 22,000-line &#8220;oops&#8221;.</p>
<p>He opened up a file that&#8217;s roughly 25,000 lines (let&#8217;s not get into why it&#8217;s that long&#8230;) to make a simple change. After adding about 6 lines, he saved, quit, and committed the change to the repository. His editor of choice is vim (as is mine).</p>
<p>For those of you unfamiliar with vim, it&#8217;s a text-based editor that has a fairly steep learning curve. It takes years to truly master, but the power it offers you is incredible. In vim you start in command mode, which let you enter vim commands much like you would on a command line. You can switch to insert mode to actually insert text into your document, or other modes for formatting and whatnot.</p>
<p>Well in this case, the programmer accidentally brushed the escape key while he was typing, which brought him out of insert mode and into command mode. What he thought was being typed into a comment in his code was actually being typed into the vim command line. He must have brushed some other keys as well, because here&#8217;s the unfortunate key sequence that he ended up entering:</p>
<pre>:% &lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;</pre>
<p>For those of you not well-versed in vim commands, here&#8217;s an explanation. The colon starts a command, and the % symbol is like a wildcard for the command, applying it to the entire file instead of the current selection. Each <code>&lt;</code> character shifts the current selection one tab stop to the left. Similarly, the <code>&gt;</code> character shifts the current selection one tab stop to the right. It&#8217;s phenomenally handy for quickly adjusting the level that a block of code is indented.</p>
<p>However, what that above command will do is basically crush every level of indention against the left margin, and then apply that to the entire file. What you end up with is having every line of your beautifully indented code smashed down to column 0. No indention. None.</p>
<p>As vim was updating this change to the swap file (remember, there were 25,000 lines) he saved and quit. The file had been updated, but his screen had not, so he had no idea he&#8217;d accidentally just nuked the indention of the entire file.</p>
<p>It was his commit to the repository that threw up the red flag. This was supposed to be a small bug fix. However, the commit email, sent out to the entire mailing list, contained a 22,000 line diff. Woops.</p>
<p>After looking at the changes and chuckling over the fact that the file was completely unreadable now, many people on the coding team sent him joke emails about &#8220;what crappy coding style&#8221; he had, with links to &#8220;learn how to program&#8221;.</p>
<p>Now, naturally this took only about 2 seconds to fix, since the code was under source control. But the point still stands. Not only learn your editor, but watch it with a careful eye when you&#8217;re working with it, lest all those features that are there to increase productivity turn against you.</p>
]]></content:encoded>
			<wfw:commentRss>http://sigttou.com/know-your-text-editor/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ban programmers, not functions</title>
		<link>http://sigttou.com/ban-programmers-not-functions</link>
		<comments>http://sigttou.com/ban-programmers-not-functions#comments</comments>
		<pubDate>Tue, 07 Jul 2009 19:35:16 +0000</pubDate>
		<dc:creator>Bob Somers</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Security]]></category>

		<guid isPermaLink="false">http://sigttou.com/?p=71</guid>
		<description><![CDATA[So my daily travels around the intertubes landed me on a very interesting blog post by Microsoft&#8217;s Security Development Lifecycle team (which they call SDL, not to be confused with the arguably more useful Simple DirectMedia Layer library). The post &#8230; <a href="http://sigttou.com/ban-programmers-not-functions">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>So my daily travels around the intertubes landed me on a very interesting <a href="http://blogs.msdn.com/sdl/archive/2009/05/14/please-join-me-in-welcoming-memcpy-to-the-sdl-rogues-gallery.aspx">blog post by Microsoft&#8217;s Security Development Lifecycle team</a> (which they call SDL, not to be confused with the arguably more useful <a href="http://www.libsdl.org/">Simple DirectMedia Layer</a> library). The post centered around them adding <code class="syntax clang">memcpy()</code> to the banned functions list in favor of their more &#8220;secure&#8221; variant, <code class="syntax clang">memcpy_s()</code>, which takes and checks the size of the destination buffer.</p>
<p>Before I explain why I think this is another example of Microsoft spending their time doing something incredibly useless instead of innovating, let me explain that all these blasted <code>_s</code> functions are one of the reasons I detest the Windows API so much.</p>
<p>I had the unfortunate &#8220;pleasure&#8221; of digging rather deep into the Windows API for a project I was working on this past spring quarter. For those of you who haven&#8217;t ventured into the Windows API, let me say this: It&#8217;s so incredibly confusing that it doesn&#8217;t even look like C anymore.</p>
<p>Almost everything uses custom types, even when there&#8217;s no logical reason to do so. The Linux API does this to some extent, but not nearly as bad as Microsoft.</p>
<p>Secondly, there seems to be no rhyme or reason as to what these types are named. Some are named as <code class="syntax clang">ALL_CAPITALS_TYPE</code>, others <code class="syntax clang">_use_this_strange_underscore_prefix</code>, and some use the standard <code class="syntax clang">type_t</code>. If you start to use almost any standard library C function, you&#8217;ll inevitably be told by the compiler that you&#8217;re doing it wrong, and should use <code class="syntax clang">strcpy_s()</code>, or <code class="syntax clang">_strcpy_s()</code>, or <code class="syntax clang">_s_t_r_c_p_y_s_()</code>. Seriously, their API has got more underscores than Bill Gates has dollar bills.</p>
<p>What this gives you is this strange, alien language that vaguely resembles C, but is so ugly and hideous that you&#8217;re afraid to touch it. Apple has Objective-C. Microsoft has Franken-C.</p>
<p>So let me back up and explain this blog post I mentioned earlier. I&#8217;m a bit behind on this one (I&#8217;ll admit I&#8217;m not often found venturing into the MSDN blogs) but back in May the SDL announced that they were adding <code class="syntax clang">memcpy()</code> to their banned functions list, to join <code class="syntax clang">strcpy()</code>, <code class="syntax clang">strcat()</code>, <code class="syntax clang">strncpy()</code>, <code class="syntax clang">strncat()</code>, <code class="syntax clang">gets()</code>, and others.</p>
<p>They announced it&#8217;s replacement, <code class="syntax clang">memcpy_s()</code> (soon to be replaced by <code class="syntax clang">_memcpy_s()</code> and <code class="syntax clang">_m_e_m_c_p_y_s_()</code> I&#8217;m sure), which takes one additional argument: the size of the destination buffer.</p>
<p>This is aimed make usages of <code class="syntax clang">memcpy()</code> more secure, by only copying up to the size of the destination buffer bytes, even if that&#8217;s less than the length of the bytes you want to copy. You go from using this:</p>
<pre class="syntax clang">memcpy(dst, src, len);</pre>
<p>to using this:</p>
<pre class="syntax clang">memcpy_s(dst, sizeof(dst), src, len);</pre>
<p>This sounds reasonable, except most Windows programmers will just do this:</p>
<pre class="syntax clang">memcpy_s(dst, len, src, len);</pre>
<p>which makes your &#8220;secure&#8221; version useless.</p>
<p>The problem here is not that <code class="syntax clang">memcpy()</code> doesn&#8217;t check the size of the destination buffer, but rather that some programmers are using it without thinking. A 50 caliber sniper rifle is a very powerful tool in the hands of a marksman, but in a cage full of chimpanzees, the results could be disastrous.</p>
<blockquote><p>If nothing else, <code>memcpy_s()</code> makes you think about the size of the target buffer.</p></blockquote>
<p>I suppose, unless you&#8217;re one of the mindless programmers using <code class="syntax clang">memcpy()</code> unsafely before, in which case you&#8217;ll learn the new and improved mindless version <code class="syntax clang">memcpy_s(dst, len, src, len)</code> and continue on your merry way.</p>
<p>My point here is that banning functions that are the common source of security vulnerabilities doesn&#8217;t fix the problem, because the problem isn&#8217;t with the functions. These functions are well documented and we know exactly how they work and what their dangers are. <strong>The problem is with the programmers.</strong></p>
<p>You&#8217;ve got to teach your programmers how to use these functions securely, or at least evaluate when they should ask for someone to review their code. If training isn&#8217;t an option, there&#8217;s a better option than banning these functions.</p>
<p><strong>Ban programmers who use them wrong.</strong> Yes, banish them to the land of C# and other fluffy dynamic languages with garbage collectors and infinite buffers. They&#8217;ll do far less harm there.</p>
<p>The key to doing memory management correctly (which includes using <code class="syntax clang">memcpy()</code>, <code class="syntax clang">strcpy()</code>, etc. in safe ways) is to completely engage your brain when you&#8217;re doing it. <strong>You cannot zone out when writing memory managing code.</strong> Although given the quality of code coming out of Redmond, I would not be surprised if most of the programmers have their brains permanently switched off.</p>
<p>As classic-Microsoft as this blog post was, the best line was last one.</p>
<blockquote><p>I wonder when Larry, Steve and Linus will start banning <code>strcpy()</code> in their products?</p></blockquote>
<p>Words cannot express the hilarity that ensued when I read this line. Maybe, just maybe, the reason they haven&#8217;t found the need to ban them is because <strong>they&#8217;re using them correctly.</strong> Perhaps if Microsoft tried that every once in a while, they would churn out more secure products themselves without having to resort to Franken-C.</p>
]]></content:encoded>
			<wfw:commentRss>http://sigttou.com/ban-programmers-not-functions/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Simulating Monopoly</title>
		<link>http://sigttou.com/simulating-monopoly</link>
		<comments>http://sigttou.com/simulating-monopoly#comments</comments>
		<pubDate>Mon, 22 Jun 2009 03:56:07 +0000</pubDate>
		<dc:creator>Bob Somers</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Simulations]]></category>

		<guid isPermaLink="false">http://sigttou.com/?p=18</guid>
		<description><![CDATA[Last summer I spent a good deal of time playing Monopoly. It was my final summer of marching drum corps and we were taking Amtrak out to the midwest for the last leg of our summer tour. There isn&#8217;t really &#8230; <a href="http://sigttou.com/simulating-monopoly">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Last summer I spent a good deal of time playing Monopoly. It was my final summer of marching <a href="http://www.dci.org">drum corps</a> and we were taking Amtrak out to the midwest for the last leg of our summer tour. There isn&#8217;t really much to do on a train for 3 days except eat, sleep, and sit in the observation car playing Monopoly.</p>
<p>One of the other corps members was absolutely destroying us. He clearly knew what he was doing when it came to fictional property management. He let me in on a little secret, though. <strong>Not all properties are created equal.</strong></p>
<p>What he meant was that certain properties are statisically more likely to be landed on than others. It made sense when he explained it, but I wasn&#8217;t sure just how much of an actual difference it made. When I got home from the summer tour, I sat down and wrote some code to find out.</p>
<p>Thankfully in the game of Monopoly, <strong>a player&#8217;s movement around the board is very much decoupled from their financial transactions.</strong> What I mean by that is that they continue to move around the board in the same way, regardless of which properties they chose to buy, how much they have to pay to other players, or which properties they trade. The only exception is when a player goes bankrupt, and ceases to circle the board.</p>
<p>What this allowed me to do is write a very simple simulation in a few hours without having to worry about realistic AI. The players didn&#8217;t have to make financial transactions at all. They merely had to roll the dice and move according to the rules of Monopoly. I did need to account for the actions of the Chance and Community chest cards, but only when it impacted their position on the board or their future turns.</p>
<p>Certain spaces on the board can also affect the player&#8217;s position and future, so that had to be accounted for as well. For example, landing on Go to Jail will send a player directly to the jail square, and a player <em>in jail</em> has to go through a series of dice rolls or use a Get of Jail Free card to move again.</p>
<div id="attachment_22" class="wp-caption alignnone" style="width: 512px"><img class="size-full wp-image-22" title="Monopoly Board" src="http://sigttou.com/wp-content/uploads/monopoly.png" alt="The game board used in a game of monopoly." width="502" height="508" /><p class="wp-caption-text">The game board used in a game of monopoly.</p></div>
<p>As I was finishing up writing the simulation, I began to suspect that the advice I had received on the train was correct. The claim was that the orange properties (St. James Place, Tennessee Avenue, and New York Avenue) were the most lucrative on the board because players were more likely to land on them. This indeed makes sense, because several Chance cards send you directly to jail and so does the Go to Jail square. Thus, <strong>the most common starting point for a dice roll is Jail.</strong> Since the most common dice roll for 2 six-sided dice will be in the 6-8 range, it only makes sense that those are the most commonly landed-on properties.</p>
<p>Indeed, this is exactly how it plays out. My simulation played 2000 games with 6 players and 1000 turns per game, and dumps the &#8220;landed-on&#8221; percentages out for each space along with a heat map overlayed onto the above Monopoly board. Let&#8217;s take a look at the results.</p>
<div id="attachment_25" class="wp-caption alignnone" style="width: 514px"><img class="size-full wp-image-25" title="Monopoly Simulation Results" src="http://sigttou.com/wp-content/uploads/simulationresults.png" alt="Raw results from the Monopoly simulation." width="504" height="674" /><p class="wp-caption-text">Raw results from the Monopoly simulation.</p></div>
<div id="attachment_27" class="wp-caption alignnone" style="width: 512px"><img class="size-full wp-image-27" title="Monopoly Heatmap" src="http://sigttou.com/wp-content/uploads/heatmap.png" alt="Squares landed on more often are &quot;hotter&quot; (tinted red) and squares landed on less often are &quot;cooler&quot; (tinted blue)." width="502" height="508" /><p class="wp-caption-text">Squares landed on more often are &quot;hotter&quot; (tinted red) and squares landed on less often are &quot;cooler&quot; (tinted blue).</p></div>
<p>The orange property tract is certainly the most lucrative. But when you look at the raw percentages, it&#8217;s a little disappointing. The most landed-on property on the board (Community Chest #2, exactly 7 spaces away from Jail) is <strong>less than 1% more trafficked</strong> than the least landed-on property (Mediterranean Avenue).</p>
<p>Keep in mind though, that&#8217;s when it&#8217;s averaged out over 1000 turns, which is a massively long game of Monopoly. On top of that, those results are averaged over 2000 games. This smooths out the heat map quite a bit.</p>
<p>In a single game of Monopoly, <strong>the percentage swings will be much higher.</strong> The Orange properties could be red hot. They could also be colder than Mediterranean. However, given that in the long run they are hotter than the other spaces, it doesn&#8217;t hurt to try to score the orange properties. More often than not, they will see more action than any other tract on the board.</p>
]]></content:encoded>
			<wfw:commentRss>http://sigttou.com/simulating-monopoly/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

