<?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>kris.kalish.net</title>
	<atom:link href="http://kris.kalish.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://kris.kalish.net</link>
	<description>Musings in Geekery</description>
	<lastBuildDate>Wed, 02 Jun 2010 19:59:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Broken Download Links Fixed</title>
		<link>http://kris.kalish.net/2010/06/broken-download-links-fixed/</link>
		<comments>http://kris.kalish.net/2010/06/broken-download-links-fixed/#comments</comments>
		<pubDate>Wed, 02 Jun 2010 19:59:08 +0000</pubDate>
		<dc:creator>kris</dc:creator>
				<category><![CDATA[Fixes]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://kris.kalish.net/?p=257</guid>
		<description><![CDATA[I had an issue where all of the download links on the site were broke. I have no idea how long this has been an issue because it all worked fine when I first set the website up. First, I discovered that WordPress had put any of the files I &#8220;recently&#8221; uploaded in the wrong [...]]]></description>
			<content:encoded><![CDATA[<p>I had an issue where all of the download links on the site were broke. I have no idea how long this has been an issue because it all worked fine when I first set the website up.</p>
<p> First, I discovered that WordPress had put any of the files I &#8220;recently&#8221; uploaded in the wrong place.  By default, WordPress is supposed to look in the path INSTALL_DIR/wp-content/uploads for uploaded content.  However, I looked at the source code to find that you can override this behavior with a setting in the database. Somehow, that had happened to me. I deleted the record from the database and tried again.</p>
<p>I was still getting 404 when I moved the files to the right location! What was strange was that these were WordPress 404 errors, not Apache. I deleted my &#8220;.htaccess&#8221; file and refreshed the page after clearing my browser cache.  Direct links to the files worked, but obviously the rest of the site was broken.</p>
<p>To fix the .htaccess file I restored what I had, ran &#8220;chmod 666 .htaccess&#8221;, then went into the WP admin -> Settings -> Permalink Settings and changed the permalink setting, hit apply, then changed it back and hit apply again.  This (presumably) forced WP to rebuild my .htaccess file.</p>
<p>All is now well again.</p>
]]></content:encoded>
			<wfw:commentRss>http://kris.kalish.net/2010/06/broken-download-links-fixed/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Timing Parallel Algorithms in C++</title>
		<link>http://kris.kalish.net/2010/04/timing-parallel-algorithms-in-c/</link>
		<comments>http://kris.kalish.net/2010/04/timing-parallel-algorithms-in-c/#comments</comments>
		<pubDate>Tue, 06 Apr 2010 03:49:33 +0000</pubDate>
		<dc:creator>kris</dc:creator>
				<category><![CDATA[Little Projects]]></category>
		<category><![CDATA[c++]]></category>

		<guid isPermaLink="false">http://kris.kalish.net/?p=220</guid>
		<description><![CDATA[It seems to be that it has become common knowledge that if you want to time something in c++, you use clock(). Typically you construct something that looks like: #include&#60;ctime&#62; #include&#60;iostream&#62; using namespace std; int main() { clock_t startTime, endTime; startTime = clock(); // Do some computationally expensive thing endTime = clock(); cout &#60;&#60; "It [...]]]></description>
			<content:encoded><![CDATA[<p>It seems to be that it has become common knowledge that if you want to time something in c++, you use clock().  Typically you construct something that looks like:</p>
<pre>
<code>
#include&lt;ctime&gt;
#include&lt;iostream&gt;

using namespace std;

int main()
{
      clock_t startTime, endTime;
      startTime = clock();
      // Do some computationally expensive thing
      endTime = clock();
      cout &lt;&lt; "It took " &lt;&lt; (endTime - startTime) / (CLOCKS_PER_SEC / 1000) &lt;&lt; "ms." &lt;&lt; endl;
}
</code>
</pre>
<p>
I&#8217;m sure most seasoned C++ developers have written something like this at one point or another.  Unfortunately, this breaks down when timing a multithreaded algorithm.  The clock() method is constructed in such a way that it always returns the amount of CPU time elapsed, not the real time elapsed.  Perhaps this is common knowledge to some, but the reference documentation on sites like cplusplus.com simply state: &#8220;Returns the number of clock ticks elapsed since the program was launched.&#8221;  This is incredibly ambiguous to me, because I could think of clock ticks as either the 2.6 billions ticks per second my CPU is receiving, or the number of ticks from the built in clock that have elapsed.
</p>
<p>
Regardless, that was tangential.  To get reasonably accurate <i>actual</i> time that has elapsed, you need to employ gettimeofday(), which populates a struct with the current time in seconds since the epoch (plus a microsecond component).
</p>
<pre>
<code>
#include&lt;sys/time.h&gt;
#include&lt;iostream&gt;

using namespace std;

int main()
{
      struct timeval startTime, endTime;
      long totalTime;

      // The second parameter is the timezone, but it's ignored in the newer linux kernels
      gettimeofday(&#038;startTime, NULL);
      // Do some computationally expensive thing
      gettimeofday(&#038;endTime, NULL);

      // We need to combine the two components of timeval into one value.
      totalTime =  (endTime.tv_sec - startTime.tv_sec) * 1000000L;
      totalTime += (endTime.tv_usec - endTime.tv_usec);

      cout &lt;&lt; "It took " &lt;&lt; (totalTime / 1000L) &lt;&lt; "ms." &lt;&lt; endl;
}
</code>
</pre>
<p>
And there you have it! I&#8217;d be interested to see if this method is any more accurate on a real time linux kernel.</p>
]]></content:encoded>
			<wfw:commentRss>http://kris.kalish.net/2010/04/timing-parallel-algorithms-in-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tracking Memory Leaks in C++</title>
		<link>http://kris.kalish.net/2010/04/tracking-memory-leaks-in-c/</link>
		<comments>http://kris.kalish.net/2010/04/tracking-memory-leaks-in-c/#comments</comments>
		<pubDate>Fri, 02 Apr 2010 03:32:30 +0000</pubDate>
		<dc:creator>kris</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[c++]]></category>

		<guid isPermaLink="false">http://kris.kalish.net/?p=216</guid>
		<description><![CDATA[This may be common knowledge for a lot of you, but Valgrind is a dynamic code analysis too that discovers memory leaks for you. It can&#8217;t tell you why memory is leaking but it can tell you exactly where the memory was allocated. It actually does a fantastic job! I just removed half a dozen [...]]]></description>
			<content:encoded><![CDATA[<p>
This may be common knowledge for a lot of you, but <a href="http://valgrind.org">Valgrind</a> is a dynamic code analysis too that discovers memory leaks for you.  It can&#8217;t tell you why memory is leaking but it can tell you exactly where the memory was allocated.
</p>
<p>
It actually does a fantastic job!  I just removed half a dozen memory leaks from my thesis project in about 35 minutes with no prior experience. If you compile with debug flags it tells you line numbers and everything.
</p>
<p>
<a href="http://valgrind.org/docs/manual/quick-start.html#quick-start.prepare">Valgrind Quick Start</a></p>
]]></content:encoded>
			<wfw:commentRss>http://kris.kalish.net/2010/04/tracking-memory-leaks-in-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Getting Started with tinySTM (Ubuntu 9.04)</title>
		<link>http://kris.kalish.net/2009/09/getting-started-with-tinystm-ubuntu-9-04/</link>
		<comments>http://kris.kalish.net/2009/09/getting-started-with-tinystm-ubuntu-9-04/#comments</comments>
		<pubDate>Wed, 23 Sep 2009 21:11:47 +0000</pubDate>
		<dc:creator>kris</dc:creator>
				<category><![CDATA[Little Projects]]></category>
		<category><![CDATA[boost]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[tinystm]]></category>

		<guid isPermaLink="false">http://kris.kalish.net/?p=115</guid>
		<description><![CDATA[This post is a quick guide to go from nothing to writing small tinySTM based applications. For those that don&#8217;t know, tinySTM is a library for writing applications that use transactional memory for synchronization in lieu of traditional locks an semaphores. So this begs two questions now. What is synchronization and what is transactional memory? [...]]]></description>
			<content:encoded><![CDATA[<p>
This post is a quick guide to go from nothing to writing small tinySTM based applications. For those that don&#8217;t know, tinySTM is a library for writing applications that use transactional memory for synchronization in lieu of traditional locks an semaphores.  So this begs two questions now. What is <i>synchronization</i> and what is <i>transactional memory</i>?
</p>
<p>
Loosely speaking, <i>synchronization</i> is a term used to refer to any method to prevent processes or threads from trampling on one another.  What do I mean trampling? There&#8217;s things like <i>memory consistency errors</i> which is a term for when threads have an inconsistent view of the same data.  For example, if two threads check the value of an integer and see different values.  This is typically caused when the integer is cached on the CPU.  One core will load a cached version of the variable and the other thread (running on a different core) will go to RAM to read the value. And so different values are seen!  Synchronization prevents problems like these.
</p>
<p>
<i>Transactional Memory</i> (TM) is a style of synchronization that was inspired heavily by databases.  In a database requests are encapsulated as transactions. Databases ensure integrity through transactions. This is accomplished by rolling-back any changes that were made in a partially completed transaction.  This means that failed transactions won&#8217;t break your database.  The same is true of memory.
</p>
<p>
With a little back story, we&#8217;re ready to start </p>
<p><code>wget http://tinystm.org/sites/tinystm.org/files/tinySTM/tinySTM-0.9.9.tgz<br />
tar -xvf tinySTM-0.9.9.tgz<br />
cd tinySTM-0.9.9<br />
sudo apt-get install libatomic-ops-dev<br />
export LIBAO_HOME=/usr/include/atomic_ops<br />
make<br />
</code></p>
<p>
Runing <code class="inline">make</code> compiles tinySTM and puts a static library file at <code class="inline">~/tinySTM-0.9.9/lib/libstm.a</code>.  Anything we write to use tinySTM will need to link to this lib file.
</p>
<p>
Let&#8217;s make sure that everything is working by compiling and running the example code that came with tinySTM.
</p>
<p><code>cd test<br />
make<br />
cd bank<br />
# To run these demos with multiple threads we use the "-n" option<br />
./bank -n 3<br />
</code></p>
<p>
If everything is working correctly you should get some pretty lengthy output that looks similar to this:
</p>
<p><code>kris@cosmos:~/tinySTM-0.9.9/test/bank$ ./bank -n 3<br />
Nb accounts    : 1024<br />
Duration       : 10000<br />
Nb threads     : 3<br />
Read-all rate  : 20<br />
Read threads   : 0<br />
Seed           : 0<br />
Write-all rate : 0<br />
Write threads  : 0<br />
Type sizes     : int=4/long=8/ptr=8/word=8<br />
Initializing STM<br />
STM flags      : -O3 -DNDEBUG -Wall -Wno-unused-function -Wno-unused-label -fno-strict-aliasing -D_REENTRANT -I/usr/include/atomic_ops/include -I./include -I./src -DTLS -DDESIGN=2 -DCM=0 -DINTERNAL_STATS -DROLLOVER_CLOCK -DCLOCK_IN_CACHE_LINE -UNO_DUPLICATES_IN_RW_SETS -UWAIT_YIELD -UUSE_BLOOM_FILTER -DEPOCH_GC -UCONFLICT_TRACKING -UREAD_LOCKED_DATA -ULOCK_IDX_SWAP -UDEBUG -UDEBUG2<br />
Creating thread 0<br />
Creating thread 1<br />
Creating thread 2<br />
STARTING...<br />
STOPPING...<br />
Thread 0<br />
  #transfer   : 1969727<br />
  #read-all   : 492137<br />
  #write-all  : 0<br />
  #aborts     : 522377<br />
    #lock-r   : 167012<br />
    #lock-w   : 387<br />
    #val-r    : 354978<br />
    #val-w    : 0<br />
    #val-c    : 0<br />
    #inv-mem  : 0<br />
    #realloc  : 0<br />
    #r-over   : 0<br />
  #lr-ok      : 0<br />
  #lr-failed  : 0<br />
  Max retries : 35784<br />
Thread 1<br />
  #transfer   : 3517300<br />
  #read-all   : 879229<br />
  #write-all  : 0<br />
  #aborts     : 986623<br />
    #lock-r   : 288231<br />
    #lock-w   : 691<br />
    #val-r    : 697695<br />
    #val-w    : 6<br />
    #val-c    : 0<br />
    #inv-mem  : 0<br />
    #realloc  : 0<br />
    #r-over   : 0<br />
  #lr-ok      : 0<br />
  #lr-failed  : 0<br />
  Max retries : 45082<br />
Thread 2<br />
  #transfer   : 1947009<br />
  #read-all   : 486864<br />
  #write-all  : 0<br />
  #aborts     : 580381<br />
    #lock-r   : 228081<br />
    #lock-w   : 328<br />
    #val-r    : 351970<br />
    #val-w    : 2<br />
    #val-c    : 0<br />
    #inv-mem  : 0<br />
    #realloc  : 0<br />
    #r-over   : 0<br />
  #lr-ok      : 0<br />
  #lr-failed  : 0<br />
  Max retries : 57503<br />
Bank total    : 0 (expected: 0)<br />
Duration      : 10000 (ms)<br />
#txs          : 9292266 (929226.600000 / s)<br />
#read txs     : 1858230 (185823.000000 / s)<br />
#write txs    : 0 (0.000000 / s)<br />
#update txs   : 7434036 (743403.600000 / s)<br />
#aborts       : 2089381 (208938.100000 / s)<br />
  #lock-r     : 683324 (68332.400000 / s)<br />
  #lock-w     : 1406 (140.600000 / s)<br />
  #val-r      : 1404643 (140464.300000 / s)<br />
  #val-w      : 8 (0.800000 / s)<br />
  #val-c      : 0 (0.000000 / s)<br />
  #inv-mem    : 0 (0.000000 / s)<br />
  #realloc    : 0 (0.000000 / s)<br />
  #r-over     : 0 (0.000000 / s)<br />
#lr-ok        : 0 (0.000000 / s)<br />
#lr-failed    : 0 (0.000000 / s)<br />
Max retries   : 57503<br />
</code></p>
<p>
It&#8217;s really no fun to run someone else&#8217;s code, so lets build something simple from the ground up. I&#8217;ll be using the Boost Thread library for threading instead of pthreads (which is what the tinySTM examples use).
</p>
<p>
I&#8217;m going to write a very contrived example, where I&#8217;ll have a Counter class and a MyRunnable class.  The Counter class will be extremely simple. In fact, it will basically just be a wrapper around an integer.  The only method of interest it will provide will be <code class="inline">increment()</code>, which will increment the integer some amount each time it is called.  The other class, MyRunnable is basically just an encapsulation of a Boost thread, you can think of it as class the implements Runnable in Java.
</p>
<p>
The program will start a bunch of threads via Boost, which results in the the <code class="inline">run()</code> method of each MyRunnable object getting executed from a different thread of execution.  The MyRunnables will try to call <code class="inline">increment()</code> on the same Counter object.  If everything is done right, each call should be accounted for in the end.
</p>
<p>
I will synchronize the <code class="inline">increment()</code> method by enclosing its body in a transaction.  That means that if another thread modifies any of the memory touched in the body of increment, the transaction will be canceled and rolled back to the original state.
</p>
<p>
Don&#8217;t forget to copy all of the tinySTM .h files (stm.h, mod_mem.h, etc) and the library file (libstm.a) into your current working directory. With all of that in mind, here&#8217;s the example:
</p>
<pre>
<code>//File: samplestm.cpp
//Author: Kristopher Kalish
#include &lt;iostream&gt;
#include &lt;boost/thread.hpp&gt;
#include &lt;atomic_ops.h&gt;
#include "stm.h"

// These following macros are from the tinySTM examples, and they truly
// are useful.
/*
 * Useful macros to work with transactions. Note that, to use nested
 * transactions, one should check the environment returned by
 * stm_get_env() and only call sigsetjmp() if it is not null.
 */
#define RO                              1
#define RW                              0
#define START(id, ro)                   { sigjmp_buf *_e = stm_get_env(); stm_tx_attr_t _a = {id, ro}; sigsetjmp(*_e, 0); stm_start(_e, &#038;_a)
#define LOAD(addr)                      stm_load((stm_word_t *)addr)
#define STORE(addr, value)              stm_store((stm_word_t *)addr, (stm_word_t)value)
#define COMMIT                          stm_commit(); }

using namespace std;

static const int INCREMENT = 5;
static const int NUM_RUNS  = 100000;

class Counter
{
public:
	Counter()
	{
		value = 0;
	}

	/**
	 * Increment the counter by five by looping. A loop was picked to
	 * make calls to increment() take more cpu time.
	 */
	void increment()
	{
		START(0, RW);

		for(int i = 0; i &lt; INCREMENT; i++)
		{
			int tmp = (int) LOAD(&#038;this-&gt;value);
			tmp = tmp + 1;

			STORE(&#038;this-&gt;value, tmp);
		}

		COMMIT;
	}

	int getValue()
	{
		return value;
	}

private:
	int value;

};

class MyRunnable
{
public:

	MyRunnable(int id, boost::barrier* bar, Counter* count)
	{
		this-&gt;id    = id;
		this-&gt;bar   = bar;
		this-&gt;count = count;
	}

	void run()
	{
		for(int i = 0; i &lt; NUM_RUNS; i++)
		{
			count-&gt;increment();
		}

		// all done, wait at the barrier
		bar-&gt;wait();
	}

	// The entry point for a thread
	void operator()()
	{
		// We must call stm_init_thread() at the beginning of each
		// thread's line of execution before using the tinySTM library
		stm_init_thread();

		run();

		// Call this at the end of each thread's execution to have
		// tinySTM clean up.
		stm_exit_thread();
	}

private:
	int             id;
	boost::barrier* bar;
	Counter*        count;

};

int main()
{
	int            numThreads = 4;
	boost::barrier my_barrier(numThreads);
	Counter        count;

	cout &lt;&lt; "Intializing tinySTM." &lt;&lt; endl;
	stm_init();

	cout &lt;&lt; "Counter is starting with value: " &lt;&lt; count.getValue() &lt;&lt; endl;
	cout &lt;&lt; "Starting " &lt;&lt; numThreads &lt;&lt; " counting threads..." &lt;&lt; endl;

	// Need to make at least one thread
	assert(numThreads &gt;= 1);

	// Make the first thread
	boost::thread thread1(MyRunnable(0, &#038;my_barrier, &#038;count));

	// Then make the remaining threads
	for(int i = 1; i &lt; numThreads; i++)
		boost::thread thread(MyRunnable(i, &#038;my_barrier, &#038;count));

	// thread1 will terminate when all threads have reached the barrier
	thread1.join(); // Wait for thread1 to terminate 

	cout &lt;&lt; "Counter is ended with value: " &lt;&lt; count.getValue() &lt;&lt; endl;
	cout &lt;&lt; "Counter should be: " &lt;&lt; NUM_RUNS * numThreads * INCREMENT &lt;&lt; endl;

	// Let tinySTM clean up after itself
	stm_exit();

	return 0;
}
</code>
</pre>
<p>
Then to compile and run, we will need to link against the tinySTM library and Boost library:
</p>
<p><code>g++ samplestm.cpp -lboost_thread-mt libstm.a -o sample<br />
./sample<br />
</code></p>
<p>
Example output:
</p>
<pre>
<code>Intializing tinySTM.
Counter is starting with value: 0
Starting 4 counting threads...
Counter is ended with value: 2000000
Counter should be: 2000000
</code>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://kris.kalish.net/2009/09/getting-started-with-tinystm-ubuntu-9-04/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Corrections</title>
		<link>http://kris.kalish.net/2009/09/corrections/</link>
		<comments>http://kris.kalish.net/2009/09/corrections/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 20:59:58 +0000</pubDate>
		<dc:creator>kris</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://kris.kalish.net/?p=144</guid>
		<description><![CDATA[I fixed some problems with the post about Boost threads. The example program worked correctly for the most part, but only by accident. I had incorrectly assumed that the join() method started the thread. This is not the case. It&#8217;s a method that blocks until the thread is done. The correct solution would be to [...]]]></description>
			<content:encoded><![CDATA[<p>
I fixed some problems with the post about Boost threads. The example program worked correctly for the most part, but only by accident.  I had incorrectly assumed that the join() method started the thread.  This is not the case.  It&#8217;s a method that blocks until the thread is done.
</p>
<p>
The correct solution would be to make a &#8220;barrier&#8221; which has one method, wait().  When a barrier is constructed, it is initalized with a counter. Each thread calls wait() when it&#8217;s done, decrementing the counter.  When the counter reaches zero, all calls to wait() return. The example in the previous post about Boost threads now uses a barrier.</p>
]]></content:encoded>
			<wfw:commentRss>http://kris.kalish.net/2009/09/corrections/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Getting Started with Boost Threads</title>
		<link>http://kris.kalish.net/2009/09/getting-started-with-boost-threads/</link>
		<comments>http://kris.kalish.net/2009/09/getting-started-with-boost-threads/#comments</comments>
		<pubDate>Tue, 08 Sep 2009 22:43:11 +0000</pubDate>
		<dc:creator>kris</dc:creator>
				<category><![CDATA[Little Projects]]></category>
		<category><![CDATA[boost]]></category>
		<category><![CDATA[c++]]></category>

		<guid isPermaLink="false">http://kris.kalish.net/?p=130</guid>
		<description><![CDATA[Boost is collection of open source C++ libraries. They are released under the &#8220;Boost License&#8221; so they can be incorporated into open-source and closed-source projects. Anyway, one of the libraries in the collection that is of particular interest to me is the threading library. It&#8217;s cross-platform, so I should be able to run my code [...]]]></description>
			<content:encoded><![CDATA[<p>
Boost is collection of open source C++ libraries. They are released under the &#8220;Boost License&#8221; so they can be incorporated into open-source and closed-source projects.  Anyway, one of the libraries in the collection that is of particular interest to me is the threading library.  It&#8217;s cross-platform, so I should be able to run my code on any platform. It also uses proper C++ templating, so it&#8217;s clean as well.
</p>
<p>
This post is targeted to readers who already have some experience writing multi-threaded applications (in Java for example).  This post tell you only what you need to go from nothing to compiling a simple Boost-based program that uses locks.
</p>
<p>
The first thing we have to do is get Boost. The threading library was last changed in version 1.36, so anything 1.36 and later will do.  You can do a manual install by following the instructions in the <a href="http://www.boost.org/doc/libs/1_39_0/more/getting_started/index.html">Getting Started Guide</a>. However, I use Ubuntu 9.04 which packages the Boost library, and I&#8217;m a huge advocate of using your distro&#8217;s package management system so I&#8217;ll be using that.
</p>
<p>
To get Boost in Ubuntu, run the following:
</p>
<p><code>sudo apt-get install libboost1.37-dev<br />
echo "That was easy!"</code></p>
<p>
So now all that&#8217;s left is make a simple, multi-threaded application.
</p>
<pre>
<code>// File: sample.cpp
#include &lt;iostream&gt;
#include &lt;boost/thread.hpp&gt;

using namespace std;

class MyRunnable
{
public:

	MyRunnable(int id, boost::mutex* mutex, boost::barrier* bar)
	{
		this-&gt;id    = id;
		this-&gt;mutex = mutex;
		this-&gt;bar   = bar;
	}

	// The entry point for a thread
	void operator()()
	{
		for(int i = 0; i &lt; 10; ++i)
		{
			boost::mutex::scoped_lock  lock(*mutex);
                       cout &lt;&lt; "id: " &lt;&lt; this-&gt;id &lt;&lt; ", " &lt;&lt; i &lt;&lt; endl;
		}

		// all done, wait at the barrier.
                // wait() returns when everyone has met at the barrier
		bar-&gt;wait();
	}

private:
	int id;
	boost::mutex* mutex;
	boost::barrier* bar;

};

int main()
{
	boost::mutex io_mutex;
        // this barrier will wait for two invocations of wait()
	boost::barrier my_barrier(2); 

	cout &lt;&lt; "Starting two counting threads..." &lt;&lt; endl;
	// the boost::mutex cannot be copied (for obvious reasons)
	// so we must pass the pointer to the mutex.
	boost::thread thread1(MyRunnable(1, &#038;io_mutex, &#038;my_barrier));
	boost::thread thread2(MyRunnable(2, &#038;io_mutex, &#038;my_barrier));

	thread1.join(); // wait for thread1 to finish

	// Note how the program doesn't return until all threads are dead
	return 0;

}
</code>
</pre>
<p>
Then compile and run!:
</p>
<p><code>g++ sample.cpp -lboost_thread-mt<br />
./a.out</code></p>
<p>
The output will of course vary a lot each time you run it, but it should look something like this:
</p>
<p><code>id: Starting two counting threads...<br />
1, 0<br />
id: 1, 1<br />
id: 1, 2<br />
id: 1, 3<br />
id: 1, 4<br />
id: 1, 5<br />
id: 1, 6<br />
id: 1, 7<br />
id: 1, 8<br />
id: 1, 9<br />
id: 2, 0<br />
id: 2, 1<br />
id: 2, 2<br />
id: 2, 3<br />
id: 2, 4<br />
id: 2, 5<br />
id: 2, 6<br />
id: 2, 7<br />
id: 2, 8<br />
id: 2, 9<br />
</code></p>
<p>
Notice how the output of the two threads we created is interleaved with the output of the main thread of execution.  This is one of the dangers of threading!</p>
]]></content:encoded>
			<wfw:commentRss>http://kris.kalish.net/2009/09/getting-started-with-boost-threads/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Limiting Bandwidth in Linux</title>
		<link>http://kris.kalish.net/2009/07/limiting-bandwidth-in-linux/</link>
		<comments>http://kris.kalish.net/2009/07/limiting-bandwidth-in-linux/#comments</comments>
		<pubDate>Sun, 12 Jul 2009 07:47:13 +0000</pubDate>
		<dc:creator>kris</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://kris.kalish.net/?p=126</guid>
		<description><![CDATA[Ever wanted to limit the bandwidth of a single command in Linux? It&#8217;s easy with trickle. You use it to launch the program that you want to restrict and it will provide a modified (restricted) version of sockets. No configuration&#8230; nothing. Here&#8217;s how to install and use it to limit the bandwidth given to Firefox [...]]]></description>
			<content:encoded><![CDATA[<p>
Ever wanted to limit the bandwidth of a single command in Linux? It&#8217;s easy with <a href="http://monkey.org/~marius/pages/?page=trickle">trickle</a>.  You use it to launch the program that you want to restrict and it will provide a modified (restricted) version of sockets.  No configuration&#8230; nothing.
</p>
<p>
Here&#8217;s how to install and use it to limit the bandwidth given to Firefox to 300 KB/sec on Ubuntu:
</p>
<p><code>sudo apt-get install trickle<br />
trickle -d 300 firefox<br />
</code></p>
<p>
Ridiculously easy right?</p>
]]></content:encoded>
			<wfw:commentRss>http://kris.kalish.net/2009/07/limiting-bandwidth-in-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sweet Bicycle Gear (LightLane)</title>
		<link>http://kris.kalish.net/2009/07/sweet-bicycle-gear-lightlane/</link>
		<comments>http://kris.kalish.net/2009/07/sweet-bicycle-gear-lightlane/#comments</comments>
		<pubDate>Sun, 12 Jul 2009 04:11:08 +0000</pubDate>
		<dc:creator>kris</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://kris.kalish.net/?p=121</guid>
		<description><![CDATA[So, I ride a bicycle a lot and nothing feels quite as uncertain as riding in the dark with a dinky flashing light on your back as your only protection. This little guy (which is still just a prototype) draws lines on either side of you forming a &#8220;bike lane&#8221; around you. I guess the [...]]]></description>
			<content:encoded><![CDATA[<p>
So, I ride a bicycle a lot and nothing feels quite as uncertain as riding in the dark with a dinky flashing light on your back as your only protection.  This <a href="http://www.lightlanebike.com">little guy</a> (which is still just a prototype) draws lines on either side of you forming a &#8220;bike lane&#8221; around you.  I guess the idea is that if there&#8217;s a line to be seen then drivers will obey it.
</p>
<p>
Here is the <a href="http://www.lightlanebike.com">LightLane Website</a>. <br/><br />
The video on the site is broken so you can view it here:  <a href="http://www.youtube.com/watch?v=WOU563OvpUY">http://www.youtube.com/watch?v=WOU563OvpUY</a>
</p>
<p>
Unfortunately, it isn&#8217;t for purchase yet.</p>
]]></content:encoded>
			<wfw:commentRss>http://kris.kalish.net/2009/07/sweet-bicycle-gear-lightlane/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Stop Bruteforce Attacks on sshd and Get Emailed About Them</title>
		<link>http://kris.kalish.net/2009/07/stop-bruteforce-attacks-on-sshd-and-get-emailed-about-them/</link>
		<comments>http://kris.kalish.net/2009/07/stop-bruteforce-attacks-on-sshd-and-get-emailed-about-them/#comments</comments>
		<pubDate>Thu, 02 Jul 2009 19:15:13 +0000</pubDate>
		<dc:creator>kris</dc:creator>
				<category><![CDATA[Little Projects]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://kris.kalish.net/?p=107</guid>
		<description><![CDATA[So now that I have a server on a static IP address, I decided it was time to lockdown sshd a little. I thought there was a simple option I could change in /etc/ssh/sshd_config to block repeated attempts. A few minutes of googling turned up nothing though. I did stumble upon a nifty application called [...]]]></description>
			<content:encoded><![CDATA[<p>
So now that I have a server on a static IP address, I decided it was time to lockdown sshd a little.  I thought there was a simple option I could change in <i>/etc/ssh/sshd_config</i> to block repeated attempts. A few minutes of googling turned up nothing though. I did stumble upon a nifty application called DenyHosts. It basically watches your log files for repeated and failed attempts to login via ssh, and then after reaching a threshold, adds that IP to the hosts.deny file. Banning the user from any interaction with your server.
</p>
<p>
The whole things is pretty customizable. For instance, you can even set it up to email you about banned users or suspicious logins! Here&#8217;s a quickstart guide for Ubuntu:
</p>
<p>
We will use postfix, a very slim SMTP server to send mail.<br />
<code>sudo apt-get install deny-hosts<br />
sudo apt-get install postfix</code>
</p>
<p>
Now some configuration:<br />
<code>sudo vi /etc/denyhosts.conf<br />
# Change the line "ADMIN_EMAIL = root@localhost" to<br />
# ADMIN_EMAIL = your@emailaddres<br />
sudo /etc/init.d/denyhosts restart</code>
</p>
<p>
And now you&#8217;re done! It&#8217;s ridiculously easy to get going, it&#8217;s tweaking it to your liking that takes time.  The default settings are pretty harsh, so you may want to lax them a bit. For instance, it considers 10 bad logins for an existant over the course of 5 days to be a ban-worthy offense and bans are never forgotten. The configuration file, <i>/etc/denyhosts.config</i>, is well documented so it&#8217;s a good place to start.</p>
]]></content:encoded>
			<wfw:commentRss>http://kris.kalish.net/2009/07/stop-bruteforce-attacks-on-sshd-and-get-emailed-about-them/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>wSIS &#8211; Wall Spatial Information System</title>
		<link>http://kris.kalish.net/2009/05/wsis-wall-spatial-information-system/</link>
		<comments>http://kris.kalish.net/2009/05/wsis-wall-spatial-information-system/#comments</comments>
		<pubDate>Fri, 29 May 2009 19:50:35 +0000</pubDate>
		<dc:creator>kris</dc:creator>
				<category><![CDATA[wSIS]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://colossal.ath.cx/?p=82</guid>
		<description><![CDATA[During this past summer I was lucky enough to have the chance of working with one of my professors to build a &#34;simple GIS-like application.&#34; In a nutshell, a GIS (Geographic Information System) is a broad term that encompasses systems capable of storing, visualizing, and analyzing spatial data. Typically, we see them used for maps, [...]]]></description>
			<content:encoded><![CDATA[<p>  During this past summer I was lucky enough to have the chance of working with one of my professors to build a &quot;simple GIS-like application.&quot; In a nutshell, a GIS (Geographic Information System) is a broad term that encompasses systems capable of storing, visualizing, and analyzing spatial data. Typically, we see them used for maps, as the word &quot;geographic&quot; in GIS implies, but there&#8217;s no reason to believe that they couldn&#8217;t be useful for analyzing other spatial things. Things like how bacteria move around on a petri dish for instance. </p>
<p>  I picked the name (wSIS) for several reasons. The &quot;wall&quot; portion of the name refers to the fact that it is supposed to run on the <a href="http://ivs.cs.jmu.edu/">video wall</a> at <a href="http://www.jmu.edu/">JMU</a>. This has not come to being yet.  The remainder of the name, SIS, was chosen for two reasons. First to correct the misnomer that geographic information systems are somehow intrinsically &quot;geographic.&quot; As far as I can tell they are spatial analysis systems. Second, I didn&#8217;t want to hint to the users that my application was somehow a full-blown GIS (it was developed in 3 months by an inexperienced sophomore!).   </p>
<p> To make the project more than plain application development, I researched and experimented with multi-threading. wSIS stores all of the feature data in a quadtree. This has become the basis for my honors thesis, so I&#8217;ll have to write more about it later. For what it&#8217;s worth, tests I ran showed a 40-50% speed up in quadtree creation. </p>
<p>Screenshots are <a href="?page_id=83">available here</a>.</p>
<p>
<em>Features:</em></p>
<ul>
<li>Written in Java 6</li>
<li>Reads ESRI Shapefiles (.shp)</li>
<li>Reads attribute files (.csv)</li>
<li>Draws features based on attributes (choropleth)</li>
<li>Ability to chose between several map projections</li>
<li>Simple analysis (add up the population along a road)</li>
<li>Analysis plugins written in Python</li>
<li>Saves map details (theme/zoom/projection/data) in custom XML schema</li>
<li>Reads these XML files</li>
<li>Supports printing maps</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://kris.kalish.net/2009/05/wsis-wall-spatial-information-system/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
