<?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>Standard Thoughts</title>
	<atom:link href="http://www.partofthething.com/thoughts/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.partofthething.com/thoughts</link>
	<description>Residual things that the internet should hear</description>
	<lastBuildDate>Fri, 06 Apr 2012 06:40:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>people crave community...through conflict?</title>
		<link>http://www.partofthething.com/thoughts/?p=594</link>
		<comments>http://www.partofthething.com/thoughts/?p=594#comments</comments>
		<pubDate>Fri, 06 Apr 2012 06:40:18 +0000</pubDate>
		<dc:creator>ntouran</dc:creator>
				<category><![CDATA[random rant]]></category>

		<guid isPermaLink="false">http://www.partofthething.com/thoughts/?p=594</guid>
		<description><![CDATA[The USA is divided in many ways. There are strongly-held dichotomies in all arenas, from politics to sports. People identify with liberals, conservatives, city people, country people, whites, blacks, red sox fans, yankees fans, geeks, jocks, the rich, the poor, &#8230; <a href="http://www.partofthething.com/thoughts/?p=594">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>The USA is divided in many ways. There are strongly-held dichotomies in all arenas, from politics to sports. People identify with liberals, conservatives, city people, country people, whites, blacks, red sox fans, yankees fans, geeks, jocks, the rich, the poor, kids, adults, skinny people, fat people, fashionistas,  involved people, apathetic people, 420-friendly people, 420-unfriendly people, singles, couples, etc. And many of these identity distinctions are somewhat surprisingly dear to those who hold them, often associated with instantaneous judgment of any opposing groups. Liberal city people don't respectfully disagree with their opposition, they truly think that they are pure idiots! Particular religious people don't turn the other cheek, they declare war on contraception! And it's most obvious of all in sports. "Those a**holes on the other team are so evil and horrible that I just can't stand it!" I actually know people who pack extra cans of gas when they drive through Ohio so as to not "support their economy" for this reason. (Don't even mention the ref when he makes a call against my team! Complete imbecile!)</p>
<p>Within these groups, confirmation bias runs rampant. People surround themselves with like-minded peers, further pushing productive discourse into a neglected and forgotten corner. "You're either with us, or you're against us! And there's no in-between," we say.</p>
<p>I was having a typical conversation at work, discussing life after the next apocalyptic event. It occurred to me as we discussed our plans that the first few days after rule of law falls would be the scariest. People rioting through the streets, looking everything in sight, killing on a whim to get a pretzel or something; every man for himself. During this time, I plan to just hunker down with some PB&amp;J and wait out the craziness. But after a few days, somewhat structured neighborhood alliances would form, enabling me to have a bit of trust in those around me. Instead of every man for himself, it's now us vs. them. And in that situation, I'm feeling much safer. I can cooperate with people again and defend against the neighboring block when they decide to invade again, and so on. Hooray.</p>
<p>Snapping out of this dark fantasy, and thinking instead about our less dire identity complexes, I came up with the following hypothesis.</p>
<p>Humans need safety to survive, by definition. Community groups have historically offered a bit of safety against the roving hoards. As old structures (such as neighborhoods, small towns, and churches) decrease in dominance in the modern US, there is an equal and opposite force diminishing community. Naturally, we have a subconscious urge to regain some community, so we do it the old way, but in lieu of "real" danger, we fabricate enemies through fairly trivial mechanisms (think sports) and in doing so, recreate the good old feeling of being part of "us" where they, those bastards, are part of "them."</p>
<p>If this is the case, then the natural antidote to cure our fabricated identity wars is to bring community back. Things like Facebook show how much we want it, but they are still pretty empty in terms of how well they satisfy our instinctual quest for safety. Everybody knows there's something ridiculous about how pigeon-holed we have made ourselves, but we're all in a kind of daze as to figuring out what to do with our ceaseless and unproductive arguing.</p>
<p>Others have argued similar points, but not quite for this reason. A book review I read in New Scientist <a href="http://www.amazon.com/Religion-Atheists-Non-believers-Guide-Uses/dp/0307379108/ref=sr_1_1?ie=UTF8&amp;qid=1316619547&amp;sr=8-1" target="_blank">of this book</a> explained that this author claims that secular society needs religious institutions to be happy. There may be some truth to that, but trying to promote these ideas coming from an atheist group is just fanning the flames. It'd be nice to get some easy community going that is inclusive to both religious people and secular people. Maybe after cookies-and-punch hour we could all get together on Sunday afternoons and have community members give little talks about things they're good at, or a news story they've been following closely. There could be like 10 rooms, and you can go from one to the other depending on your interests. The mechanics could host a "learn to change your own tire day." If we could somehow institutionalize these kinds of gatherings, thereby giving people a little community, I think the ridiculous arguing would slow down, and we might feel better about ourselves.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.partofthething.com/thoughts/?feed=rss2&#038;p=594</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>how to fix: ctrl-c closes ipython within console2</title>
		<link>http://www.partofthething.com/thoughts/?p=575</link>
		<comments>http://www.partofthething.com/thoughts/?p=575#comments</comments>
		<pubDate>Thu, 22 Mar 2012 17:33:38 +0000</pubDate>
		<dc:creator>ntouran</dc:creator>
				<category><![CDATA[computers]]></category>

		<guid isPermaLink="false">http://www.partofthething.com/thoughts/?p=575</guid>
		<description><![CDATA[Just FYI, I was having a problem with ipython 0.12 running within Console, where pressing Ctrl-C to cancel an operation in a Python would actually just close the whole ipython window! It was horrible, since before I reinstalled everything it &#8230; <a href="http://www.partofthething.com/thoughts/?p=575">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Just FYI, I was having a problem with ipython 0.12 running within Console, where pressing Ctrl-C to cancel an operation in a Python would actually just close the whole ipython window! It was horrible, since before I reinstalled everything it wouldn't do that. Anyway, there's an <a href="http://mail.scipy.org/pipermail/ipython-dev/2010-November/006957.html" target="_blank">email chain talking about this here</a>, but it's irrelevant to this particular problem, since I'm using mainline (non-dev repo) versions and don't know what an ETS is.</p>
<p>Thankfully, there's a very simple solution (assuming you made my same mistake). Rather than setting the console tab to C:\python27\scripts\ipython.exe, instead set it to C:\python27\python.exe C:\python27\scripts\ipython-script.py and Ctrl+C will give a KeyboardInterrupt and leave you in ipython, just like the good old days!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.partofthething.com/thoughts/?feed=rss2&#038;p=575</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Building a python extension with Trilinos 10.10 on 64-bit Windows 7</title>
		<link>http://www.partofthething.com/thoughts/?p=567</link>
		<comments>http://www.partofthething.com/thoughts/?p=567#comments</comments>
		<pubDate>Fri, 16 Mar 2012 00:34:12 +0000</pubDate>
		<dc:creator>ntouran</dc:creator>
				<category><![CDATA[computers]]></category>
		<category><![CDATA[nuclear]]></category>

		<guid isPermaLink="false">http://www.partofthething.com/thoughts/?p=567</guid>
		<description><![CDATA[Continuing the journey, the folks at work upgraded me to 64-bit Windows 7 and the Trilinos folks updated to 10.10. Needless to say, I had to rebuild. I can't definitively say which of these steps is necessary but I can &#8230; <a href="http://www.partofthething.com/thoughts/?p=567">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Continuing <a href="http://www.partofthething.com/thoughts/?p=529">the journey</a>, the folks at work upgraded me to 64-bit Windows 7 and the Trilinos folks updated to 10.10. Needless to say, I had to rebuild. I can't definitively say which of these steps is necessary but I can tell you that if you follow them, you can compile a C++ python extension that uses many aspects of Trilinos on this system. And not just a few packages from Trilinos either. In fact, I'm currently using all of the following:</p>
<ul id="internal-source-marker_0.37905297409735406">
<li>Epetra</li>
<li>AztecOO</li>
<li>Anasazi</li>
<li>Teuchos</li>
<li>epetraext</li>
<li>Amesos</li>
</ul>
<p>To do this, first run the trilinos cmake system without shared libraries. Then build. This builds things like epetra.lib. Now, go back and turn on shared libraries and build again, this time with shared libraries turned on. This builds the dlls, which I believe are required to build a python extension. If one of the ones you needs fails, just go in to Visual Studio 2008 and open up the Trilinos solution. Right click the project. Change from a static library to a dynamic librray. Change Use of MFC to "Use MFC if a Shared DLL." Change Use of ATL to "Dynamic Link to ATL." The rebuild the package. The DLL should be created.</p>
<div id="attachment_568" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.partofthething.com/thoughts/wp-content/uploads/2012/03/buildTrilinos.png"><img class="size-medium wp-image-568 " title="buildTrilinos" src="http://www.partofthething.com/thoughts/wp-content/uploads/2012/03/buildTrilinos-300x209.png" alt="Build trilinos shared library" width="300" height="209" /></a><p class="wp-caption-text">VS 2008 options to build shared libraries</p></div>
<p style="text-align: left;">Once all the static and shared libraries are built, I didn't even mess with environmental variables (being a grad student and all) so I just copied them all into the build directory of my Python extension. On import, it worked just fine. Amazing!</p>
<p style="text-align: left;">I have yet to try linking to MSMPI and running large reactor problems on Microsoft HPC but that will be coming someday.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.partofthething.com/thoughts/?feed=rss2&#038;p=567</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>US nuclear scientist considers assassination of Iranian utterly despicable</title>
		<link>http://www.partofthething.com/thoughts/?p=558</link>
		<comments>http://www.partofthething.com/thoughts/?p=558#comments</comments>
		<pubDate>Sat, 14 Jan 2012 04:31:58 +0000</pubDate>
		<dc:creator>ntouran</dc:creator>
				<category><![CDATA[nuclear]]></category>
		<category><![CDATA[random rant]]></category>

		<guid isPermaLink="false">http://www.partofthething.com/thoughts/?p=558</guid>
		<description><![CDATA[It's unclear who assassinated Iranian  nuclear scientist Mostafa Roshan by driving by his car on a motorcycle, placing a magnetized explosive designed to damage the inside of the car but not the outside, and then speeding off through the packed &#8230; <a href="http://www.partofthething.com/thoughts/?p=558">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>It's unclear who assassinated Iranian  nuclear scientist Mostafa Roshan by driving by his car on a motorcycle, placing a magnetized explosive designed to damage the inside of the car but not the outside, and then speeding off through the packed traffic by lane-splitting. Some Iranians have their opinions:</p>
<blockquote><p>Thousands of mourners chanted “Death to Israel” and “Death to America” on Friday during the funeral of a slain nuclear expert whom Iranian officials accuse the two nations of killing in a bomb blast this week as part of a secret operation to stop Iran’s nuclear program.</p>
<p>-<a href="http://www.washingtonpost.com/world/middle-east/mourners-for-slain-iran-nuclear-expert-chant-against-us-israel-amid-calls-for-retaliation/2012/01/13/gIQA62kjwP_story.html" target="_blank"> The Washington Post</a></p></blockquote>
<p>Even some western experts have claimed that it <em>must</em> be Israel:</p>
<blockquote><p>"If you look at the choice of target, it really could only be Israel,'' says Robert Baer, a former CIA agent in the Middle East.</p>
<div>- <a href="http://www.smh.com.au/world/who-is-killing-irans-nuclear-experts-20120113-1pzgn.html" target="_blank">The Sydney Morning Herald</a></div>
</blockquote>
<p>On the other hand,<a href="http://www.smh.com.au/world/who-is-killing-irans-nuclear-experts-20120113-1pzgn.html" target="_blank"> some suspect </a>that certain factions of the Iranian state could have done it due to their suspicious of disloyalty and involvement with western institutions. And in that case, the following message is basically irrelevant.</p>
<p>Perspective: I'm a run-of-the-mill US nuclear scientist working on advanced nuclear reactors to help mankind get energy to improve quality of life.</p>
<p>If Israel and/or other western-like states did this, shame on them. Covertly killing scientists is nothing but counter-productive towards any imaginable goal. The enraged Iranians will likely place a more pressing national priority on developing nuclear weapons, and make it even more secret. In this case, you're not scaring people from going into the industry, but instead you're inspiring them to become national heroes. You're not causing meaningful set-backs in terms of Iranian expertise, the industrial knowledge to manufacture weapons is somewhat well-known. All you're doing is justifying their quest for nuclear weapons (who would risk losing a major city for one botched assassination attempt?) and making them more angry with the oppressively powerful west.</p>
<p>Countries with nuclear weapons are acting like overgrown bullies on the playground who got held back a few grades. When some less powerful country tries to pick up a stick, the bully smashes it out of his hands and says: only bullies can have sticks. The non-proliferation treaty was meant to prevent the spread of nuclear weapons AND to reduce the nuclear capabilities of the nuclear states to minimal levels. The latter has not happened (as is thoroughly detailed in <a href="http://www.amazon.com/Age-Deception-Nuclear-Diplomacy-Treacherous/dp/0805093508" target="_blank">this wonderful book</a>). I fully understand and support non-proliferation, and accordingly I would like to see more reasonable attempts at stopping the spread. Until we live in a world where all nations can be comfortable in their sovereignty, the non-nuclear states will try to get nuclear weapons. The posturing we're seeing now, and this and other similar assassinations will only lead to more people trying to get nuclear weapons, in any possible aftermath. These are the most horribly destructive weapons known to man, and indirectly promoting their spread by bickering about minutia and/or invading countries for minor reasons is an extreme disservice to mankind. You're nourishing seeds that will last for generations telling people that they aren't safe until they have nuclear weapons.</p>
<p><iframe src="http://www.youtube.com/embed/e6qbSHKzcmI" frameborder="0" width="420" height="315"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://www.partofthething.com/thoughts/?feed=rss2&#038;p=558</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>old schwinn exercise bike fun</title>
		<link>http://www.partofthething.com/thoughts/?p=552</link>
		<comments>http://www.partofthething.com/thoughts/?p=552#comments</comments>
		<pubDate>Mon, 09 Jan 2012 18:09:37 +0000</pubDate>
		<dc:creator>ntouran</dc:creator>
				<category><![CDATA[seattle]]></category>

		<guid isPermaLink="false">http://www.partofthething.com/thoughts/?p=552</guid>
		<description><![CDATA[At Smashputt 2012 last night, there was a random old Schwinn exercise bike like my mom use to have. I made Kylie and Caroline ride it like my sister and I used to: one person on each pedal! Here's a &#8230; <a href="http://www.partofthething.com/thoughts/?p=552">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>At Smashputt 2012 last night, there was a random old Schwinn exercise bike like my mom use to have. I made Kylie and Caroline ride it like my sister and I used to: one person on each pedal!</p>
<div id="attachment_554" class="wp-caption aligncenter" style="width: 458px"><img class=" wp-image-554" title="Bike at smashputt" src="http://www.partofthething.com/thoughts/wp-content/uploads/2012/01/IMG_20120108_223051-768x1024.jpg" alt="" width="448" height="597" /><p class="wp-caption-text">Awesome bike. It even had the dinger!</p></div>
<p>Here's a really dark video that kind of shows how much fun it was</p>
<p><iframe src="http://www.youtube.com/embed/Le6wRn5uHTc" frameborder="0" width="420" height="315"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://www.partofthething.com/thoughts/?feed=rss2&#038;p=552</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>favorite programming language jokes</title>
		<link>http://www.partofthething.com/thoughts/?p=543</link>
		<comments>http://www.partofthething.com/thoughts/?p=543#comments</comments>
		<pubDate>Thu, 15 Dec 2011 21:08:04 +0000</pubDate>
		<dc:creator>ntouran</dc:creator>
				<category><![CDATA[computers]]></category>

		<guid isPermaLink="false">http://www.partofthething.com/thoughts/?p=543</guid>
		<description><![CDATA[These started coming up at work and people kept chiming in new ones. Here's a list. Sorry in advance for the offensive one. What's a pirate's favorite programming language? What's a miner's favorite programming language? What's a hispanic's favorite programming &#8230; <a href="http://www.partofthething.com/thoughts/?p=543">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>These started coming up at work and people kept chiming in new ones. Here's a list. Sorry in advance for the offensive one.</p>
<ul>
<li>What's a pirate's favorite programming language?</li>
<li>What's a miner's favorite programming language?</li>
<li>What's a hispanic's favorite programming language?</li>
<li>What's a diver's favorite programming language?</li>
<li>What's a mongoose's favorite programming language?</li>
<li>What's a Seattleite's favorite programming language?</li>
<li>What's the army's favorite scripting language?</li>
<li>What's the little mermaid's favorite scripting language?</li>
<li>What's Beethoven's favorite programming language?</li>
<li>What's a Frenchman's favorite programming language?</li>
</ul>
<p>Hilarious. Answers below.</p>
<p><span id="more-543"></span></p>
<ul>
<li>What's a pirate's favorite programming language?<br />
R</li>
<li>What's a miner's favorite programming language?<br />
Ruby</li>
<li>What's a hispanic's favorite programming language?<br />
C</li>
<li>What's a diver's favorite programming language?<br />
Perl</li>
<li>What's a mongoose's favorite programming language?<br />
Python</li>
<li>What's a Seattleite's favorite programming language?<br />
Java</li>
<li>What's the army's favorite scripting language?<br />
bash</li>
<li>What's the little mermaid's favorite scripting language?<br />
C-shell</li>
<li>What's Beethoven's favorite programming language?<br />
C#</li>
<li>What's a Frenchman's favorite programming language?<br />
Pascal</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.partofthething.com/thoughts/?feed=rss2&#038;p=543</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>building a python extension with trilinos on linux and windows</title>
		<link>http://www.partofthething.com/thoughts/?p=529</link>
		<comments>http://www.partofthething.com/thoughts/?p=529#comments</comments>
		<pubDate>Fri, 09 Dec 2011 07:15:50 +0000</pubDate>
		<dc:creator>ntouran</dc:creator>
				<category><![CDATA[computers]]></category>
		<category><![CDATA[nuclear]]></category>
		<category><![CDATA[neutronics]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[trilinos]]></category>

		<guid isPermaLink="false">http://www.partofthething.com/thoughts/?p=529</guid>
		<description><![CDATA[Continuing my python extension project, I've now successfully built a toy python 2.7 extension in C++ that uses the Epetra package from Trilinos 10.8. I've built it on Ubuntu 11.10 (with gcc) and on Windows XP (with Visual Studio 2008) &#8230; <a href="http://www.partofthething.com/thoughts/?p=529">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Continuing my <a title="my experience compiling against Trilinos on Ubuntu" href="http://www.partofthething.com/thoughts/?p=525">python extension project,</a> I've now successfully built a toy python 2.7 extension in C++ that uses the Epetra package from Trilinos 10.8. I've built it on Ubuntu 11.10 (with gcc) and on Windows XP (with Visual Studio 2008) using distutils. It's a bit of a hack, but it works and is a path forward for me.</p>
<p>I started with Linux, because I figured it would be easier. I learned a few things along the way. First, you have to have built Trilinos with shared libraries enabled. This is required for how Python handles things, I guess, and is made clear under the heading "Shared Libraries"<a href="http://trilinos.sandia.gov/release_notes-10.8.html"> in this file</a>. The PyTrilinos package (which is effectively a professional set of python-trilinos extensions, btw. I needed a custom one!) needs them as well. So run your cmake-gui and check the shared libraries button. Besides the libepetra.a in the build folder, you'll now also find a libepetra.so. In Windows, you'll get &gt;500 errors if you compile all of trilinos with shared libraries, but Epetra at least worked.<br />
<span id="more-529"></span><br />
Next I needed an example Python extension file to work with. I just took my skeletal Python-C API test code and combined it with one of the<a href="http://code.google.com/p/trilinos/wiki/EpetraPowerMethod"> simple Epetra examples from the Trilinos Wiki</a>.</p>
<p>In my setup.py file for distutils, I studied the Makefile.export.Epetra to figure out which directories and libraries were needed. I then translated it over to the distutils format and got the resulting file.</p>
<pre class="brush: python; title: ; notranslate">
from distutils.core import setup, Extension

module1 = Extension('cdifnt', sources = ['src/powerIterationExample.cpp'],
  include_dirs=['/home/user/Desktop/trilinos-10.8.3/packages/epetra/src',
                '/home/user/Desktop/trilinos-10.8.3/build',
                '/home/user/Desktop/trilinos-10.8.3/build/packages/epetra/src'],
  library_dirs=['/home/user/Desktop/trilinos-10.8.3/build/packages/epetra/src'],
                    libraries=['lapack', 'blas','epetra'])

setup (name = 'Diffusion for Neutron Transport',
        version = '1.0',
        description = 'This does diffusion and burnup.',
        ext_modules = [module1]
        )
</pre>
<p>Then just compile with the standard</p>
<pre>python setup.py build</pre>
<p>In the build directory (./build/lib.linux-x86_64-2.7 or something), there will now be a shared library *.so file that was built. To get it to work properly, you'll have to tell the code where the Trilinos libraries are. On Linux, this is done by setting the LD_LIBRARY_PATH environmental variable. You can do it the easy way and just copy the libepetra.so to the build directory and execute:</p>
<pre>export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.</pre>
<p>This will add the current working directory to the path. There are better, more permanent ways of doing this.</p>
<h2>Windows Specific:</h2>
<p>To get it working under windows, first try building with shared libraries. In this case, you'll now find .lib and .dll files for each successful package (including Epetra) in their build/src/Resource/...etc... folders. In this case, I just changed all the paths in the setup.py file to point to the corresponding locations on the Windows machine. In this case, I used raw strings such as r'C:\Programs\trilinos\' to get it right. I have MinGW installed but I wanted it to compile with MSVC so I used the command</p>
<pre>python setup.py build --compiler=msvc</pre>
<p>Then, I copied the libepetra.dll file into the extension build directory and went to import it and bam! It worked. Values matched Linux values.</p>
<pre>In [1]: import cdifnt

In [2]: cdifnt.buildMesh(1,2,3,4)
(1, 1, 1)
&lt;nil&gt;
Epetra in Trilinos 10.8.3

Epetra::Comm::Processor 0 of 1 total processors.
Iter = 0  Lambda = 1.73973  Residual of A*q - lambda*q = 1.32293
Iter = 100  Lambda = 3.98831  Residual of A*q - lambda*q = 0.0152304
Iter = 200  Lambda = 3.9955  Residual of A*q - lambda*q = 0.00873993
Total Mflop/s for first solve = 281.802
Increasing magnitude of first diagonal term, solving again
Iter = 0  Lambda = 1.93001  Residual of A*q - lambda*q = 1.57278
Iter = 100  Lambda = 20.0556  Residual of A*q - lambda*q = 1.69407e-21
Total Mflop/s for second solve = 324.116</pre>
<p>Boom. Easy. Although it took like, all day.</p>
<h2>Errors I encountered along the way:</h2>
<pre>relocation R_X86_64_32S against `vtable for Epetra_SerialComm' can
not be used when making a shared object; recompile with -fPIC
/home/user/Desktop/trilinos-10.8.3/build/packages/epetra/src/
libepetra.a: could not read symbols: Bad value</pre>
<p>This means that you haven't compiled with shared libraries. Go back through the trilinos build process and select the option about shared libraries and rebuild.</p>
<pre>ImportError: ./cdifnt.so: undefined symbol:
_ZNK17Epetra_SerialComm7ScanSumEPdS0_i</pre>
<p>This means that while your module compiled fine, it did not link properly. Check your setup.py and make sure all the required libraries are available. The error you get will help figure out which one is missing. For instance, in this case, libepetra.so was not found.</p>
<pre>Exception TypeError: 'bad argument type for built-in operation' in
&lt;module 'threading' from 'C:\Python27\lib\threading.pyc'&gt; ignored</pre>
<p>This error would come after my program (not the one listed below but a more involved one) had finished executing. I narrowed it down by commenting out various parts of the code until it stopped coming. The culprit was using a PyFloat_AsDouble() call on a Python object that was actually an Int. Solution: Use PyInt_AsDouble().</p>
<p>Here's all the code of my mini toy python extension package, based on the Trilinos example:</p>
<pre class="brush: python; title: ; notranslate">
#include
#include
#include
#include
#include &quot;Python.h&quot;
#include &quot;Epetra_CrsMatrix.h&quot;
#include &quot;Epetra_MultiVector.h&quot;
#include &quot;Epetra_Time.h&quot;
#include &quot;Epetra_Vector.h&quot;
//#include &quot;Epetra_BlockMap.h&quot;
#include &quot;Epetra_Map.h&quot;

#include &quot;Epetra_Version.h&quot;
#include &quot;Epetra_SerialComm.h&quot;

//
// Compute the eigenvalue of maximum magnitude of the given matrix A,
// using the power method.
//
// Input arguments:
//
// A: The matrix to which to apply the power method.  It's not const
//   because this method sets its flop counter.
// niters: Number of iterations of the power method.
// tolerance: Iterate until the (absolute) residual is strictly less
//   than tolerance.
// verbose: Whether or not to print status output to stdout during
//   iterations.
//
// Output argument:
//
// lambda: The eigenvalue of maximum magnitude of the matrix A.
//
// Return value: An integer error code.  Zero if no error occured,
//   else nonzero.
//
int
powerMethod (double &amp; lambda,
             Epetra_CrsMatrix&amp; A,
             const int niters,
             const double tolerance,
             const bool verbose);

int
runPow (void)
{
  // These &quot;using&quot; statements make the code a bit more concise.
  using std::cout;
  using std::endl;

  int ierr = 0, i;

  // If Trilinos was built with MPI, initialize MPI, otherwise
  // initialize the serial &quot;communicator&quot; that stands in for MPI.

  Epetra_SerialComm Comm;

  const int MyPID = Comm.MyPID();
  const int NumProc = Comm.NumProc();
  // We only allow (MPI) Process 0 to write to stdout.
  const bool verbose = (MyPID == 0);
  const int NumGlobalElements = 100;

  if (verbose)
    cout &lt;&lt; Epetra_Version() &lt;&lt; endl &lt;&lt; endl;

  // Asking the Epetra_Comm to print itself is a good test for whether
  // you are running in an MPI environment.  However, it will print
  // something on all MPI processes, so you should remove it for a
  // large-scale parallel run.
  cout &lt;&lt; Comm &lt;&lt; endl;

  if (NumGlobalElements &lt; NumProc)
    {
      if (verbose)
        cout &lt;&lt; &quot;numGlobalBlocks = &quot; &lt;&lt; NumGlobalElements
             &lt;&lt; &quot; cannot be &lt; number of processors = &quot; &lt;&lt; NumProc &lt;&lt; endl;
      std::exit (EXIT_FAILURE);
    }

  // Construct a Map that puts approximately the same number of rows
  // of the matrix A on each processor.
  Epetra_Map Map (NumGlobalElements, 0, Comm);

  // Get update list and number of local equations from newly created Map.
  int NumMyElements = Map.NumMyElements();

  std::vector MyGlobalElements(NumMyElements);
  Map.MyGlobalElements(&amp;MyGlobalElements[0]);

  // NumNz[i] is the number of nonzero elements in row i of the sparse
  // matrix on this MPI process.  Epetra_CrsMatrix uses this to figure
  // out how much space to allocate.
  std::vector NumNz (NumMyElements);

  // We are building a tridiagonal matrix where each row contains the
  // nonzero elements (-1 2 -1).  Thus, we need 2 off-diagonal terms,
  // except for the first and last row of the matrix.
  for (int i = 0; i &lt; NumMyElements; ++i)
    if (MyGlobalElements[i] == 0 || MyGlobalElements[i] == NumGlobalElements-1)
      NumNz[i] = 2; // First or last row
    else
      NumNz[i] = 3; // Not the (first or last row)

  // Create the Epetra_CrsMatrix.
  Epetra_CrsMatrix A (Copy, Map, &amp;NumNz[0]);

  //
  // Add rows to the sparse matrix one at a time.
  //
  std::vector Values(2);
  Values[0] = -1.0; Values[1] = -1.0;
  std::vector Indices(2);
  const double two = 2.0;
  int NumEntries;

  for (int i = 0; i &lt; NumMyElements; ++i)
    {
      if (MyGlobalElements[i] == 0)
        { // The first row of the matrix.
          Indices[0] = 1;
          NumEntries = 1;
        }
      else if (MyGlobalElements[i] == NumGlobalElements - 1)
        { // The last row of the matrix.
          Indices[0] = NumGlobalElements-2;
          NumEntries = 1;
        }
      else
        { // Any row of the matrix other than the first or last.
          Indices[0] = MyGlobalElements[i]-1;
          Indices[1] = MyGlobalElements[i]+1;
          NumEntries = 2;
        }
      ierr = A.InsertGlobalValues(MyGlobalElements[i], NumEntries, &amp;Values[0], &amp;Indices[0]);
      assert (ierr==0);
      // Insert the diagonal entry.
      ierr = A.InsertGlobalValues(MyGlobalElements[i], 1, &amp;two, &amp;MyGlobalElements[i]);
      assert(ierr==0);
    }

  // Finish up.  We can call FillComplete() with no arguments, because
  // the matrix is square.
  ierr = A.FillComplete ();
  assert (ierr==0);

  // Parameters for the power method.
  const int niters = NumGlobalElements*10;
  const double tolerance = 1.0e-2;

  //
  // Run the power method.  Keep track of the flop count and the total
  // elapsed time.
  //
  Epetra_Flops counter;
  A.SetFlopCounter(counter);
  Epetra_Time timer(Comm);
  double lambda = 0.0;
  ierr += powerMethod (lambda, A, niters, tolerance, verbose);
  double elapsedTime = timer.ElapsedTime ();
  double totalFlops =counter.Flops ();
  // Mflop/s: Million floating-point arithmetic operations per second.
  double Mflop_per_s = totalFlops / elapsedTime / 1000000.0;

  if (verbose)
    cout &lt;&lt; endl &lt;&lt; endl &lt;&lt; &quot;Total Mflop/s for first solve = &quot;
         &lt;&lt; Mflop_per_s &lt;&lt; endl&lt;&lt; endl;

  // Increase the first (0,0) diagonal entry of the matrix.
  if (verbose)
    cout &lt;&lt; endl &lt;&lt; &quot;Increasing magnitude of first diagonal term, solving again&quot;
         &lt;&lt; endl &lt;&lt; endl &lt;&lt; endl;

  if (A.MyGlobalRow (0)) {
    int numvals = A.NumGlobalEntries (0);
    std::vector Rowvals (numvals);
    std::vector Rowinds (numvals);
    A.ExtractGlobalRowCopy (0, numvals, numvals, &amp;Rowvals[0], &amp;Rowinds[0]); // Get A(0,0)
    for (int i = 0; i &lt; numvals; ++i)
      if (Rowinds[i] == 0)
        Rowvals[i] *= 10.0;

    A.ReplaceGlobalValues (0, numvals, &amp;Rowvals[0], &amp;Rowinds[0]);
  }

  //
  // Run the power method again.  Keep track of the flop count and the
  // total elapsed time.
  //
  lambda = 0.0;
  timer.ResetStartTime();
  counter.ResetFlops();
  ierr += powerMethod (lambda, A, niters, tolerance, verbose);
  elapsedTime = timer.ElapsedTime();
  totalFlops = counter.Flops();
  Mflop_per_s = totalFlops / elapsedTime / 1000000.0;

  if (verbose)
    cout &lt;&lt; endl &lt;&lt; endl &lt;&lt; &quot;Total Mflop/s for second solve = &quot;
         &lt;&lt; Mflop_per_s &lt;&lt; endl &lt;&lt; endl;

#ifdef EPETRA_MPI
  MPI_Finalize() ;
#endif

  return ierr;
}

int
powerMethod (double &amp; lambda,
             Epetra_CrsMatrix&amp; A,
             const int niters,
             const double tolerance,
             const bool verbose)
{
  // In the power iteration, z = A*q.  Thus, q must be in the domain
  // of A, and z must be in the range of A.  The residual vector is of
  // course in the range of A.
  Epetra_Vector q (A.OperatorDomainMap ());
  Epetra_Vector z (A.OperatorRangeMap ());
  Epetra_Vector resid (A.OperatorRangeMap ());

  Epetra_Flops* counter = A.GetFlopCounter();
  if (counter != 0) {
    q.SetFlopCounter(A);
    z.SetFlopCounter(A);
    resid.SetFlopCounter(A);
  }

  // Initialize the starting vector z with random data.
  z.Random();

  double normz, residual;
  int ierr = 1;
  for (int iter = 0; iter &lt; niters; ++iter)
    {
      z.Norm2 (&amp;normz);        // normz  := ||z||_2
      q.Scale (1.0/normz, z);  // q      := z / normz
      A.Multiply(false, q, z); // z      := A * q
      q.Dot(z, &amp;lambda);       // lambda := dot (q, z)

      // Compute the residual vector and display status output every
      // 100 iterations, or if we have reached the maximum number of
      // iterations.
      if (iter % 100 == 0 || iter + 1 == niters)
        {
          resid.Update (1.0, z, -lambda, q, 0.0); // resid := A*q - lambda*q
          resid.Norm2 (&amp;residual);                // residual := ||resid||_2
          if (verbose)
            cout &lt;&lt; &quot;Iter = &quot; &lt;&lt; iter &lt;&lt; &quot;  Lambda = &quot; &lt;&lt; lambda
                 &lt;&lt; &quot;  Residual of A*q - lambda*q = &quot; &lt;&lt; residual &lt;&lt; endl;
        }
      if (residual &lt; tolerance) { // We've converged!
        ierr = 0;
        break;
      }
    }
  return ierr;
}

static PyObject * buildMesh(PyObject *difntInterface, PyObject *args)
{
	PyObject *lookupTable;
	int *iMax;
	int *jMax;
	int *kMax;
	PyObject *key;
	PyObject *block = Py_None;

	if (!PyArg_ParseTuple(args, &quot;Oiii&quot;, &amp;lookupTable,&amp;iMax,&amp;jMax,&amp;kMax))
	        return NULL;

	// Demonstrate that the lookupTable is accessible.
	key = Py_BuildValue(&quot;iii&quot;, 1, 1, 1);
	//Py_INCREF(key);
	PyObject_Print(key,stdout,Py_PRINT_RAW);
	printf(&quot;\n&quot;);
	block = PyDict_GetItem(lookupTable,key);
	//Py_INCREF(block);
	PyObject_Print(block,stdout,Py_PRINT_RAW);
	printf(&quot;\n&quot;);

	runPow();

	Py_RETURN_NONE;
}

static PyMethodDef DifntSolverMethods[] =
{
     {&quot;buildMesh&quot;, buildMesh, METH_VARARGS, &quot;Builds a mesh.&quot;},
     {NULL, NULL, 0, NULL}
};

PyMODINIT_FUNC

initcdifnt(void)
{
     (void) Py_InitModule(&quot;cdifnt&quot;, DifntSolverMethods);
}
</pre>
<p>Hope this helps someone!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.partofthething.com/thoughts/?feed=rss2&#038;p=529</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>my experience compiling against Trilinos on Ubuntu</title>
		<link>http://www.partofthething.com/thoughts/?p=525</link>
		<comments>http://www.partofthething.com/thoughts/?p=525#comments</comments>
		<pubDate>Thu, 08 Dec 2011 05:59:06 +0000</pubDate>
		<dc:creator>ntouran</dc:creator>
				<category><![CDATA[computers]]></category>

		<guid isPermaLink="false">http://www.partofthething.com/thoughts/?p=525</guid>
		<description><![CDATA[I'm just embarking on a historic journey to learn a bit about the Trilinos math library.  To get started, I've gone through the hands-on tutorial a bit and after a few tries, I've gotten something compiled. Trilinos 10.4 is available &#8230; <a href="http://www.partofthething.com/thoughts/?p=525">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I'm just embarking on a historic journey to learn a bit about the <a href="http://trilinos.sandia.gov/index.html" target="_blank">Trilinos math library.</a>  To get started, I've gone through the <a href="http://code.google.com/p/trilinos/wiki/TrilinosHandsOnTutorial" target="_blank">hands-on tutorial</a> a bit and after a few tries, I've gotten something compiled.</p>
<p>Trilinos 10.4 is available in the repositories for Ubuntu (11.10 confirmed). But Trilinos 10.8 is out now, so I had to build my own. Their instructions with CMAKE were quite good and the build process didn't have too many hiccups. I found that the cmake gui is the way to go. Make sure you enable Didasko (the tutorial) in the cmake gui. When you do this, a few more Didasko options show up so you have to go enable those too.<br />
<span id="more-525"></span><br />
What, in retrospect, should have been obvious from the documentation, the way to build your own programs against Trilinos is to use the<a href="http://trilinos.sandia.gov/Export_Makefile.txt" target="_blank"> Makefile.export files</a>. Once built, there will be a Makefile.export.[PackageName] for each packages in the /build/packages directories. That file has all the variables needed to tell your custom Makefile how to include Trilinos. So, you take your makefile and just say "include Makefile.export.Epetra" for example. I used the makefile at the bottom of the previous link as a skeleton for my first sample program. One problem I ran into with the skeleton is that it includes the Makefile.export.Trilinos and my build of Trilinos was in a long-named folder and has all the packages enabled, so I kept getting</p>
<p><code>c++: error trying to exec '/usr/lib/gcc/x86_64-linux-gnu/4.6.1/collect2': execv: Argument list too long</code></p>
<p>This is because the argument list generated in my Trilinos makefile was literally 133469 characters long, and according to</p>
<p><code>xargs --show-limits</code></p>
<p>my limit is 131072. Too bad. I haven't found out how to increase this limit other than <a href="http://www.linuxjournal.com/article/6060?page=0,0" target="_blank">recompiling the kernel,</a> which I'm not about to do. Solution? Forget about the full Makefile and just add the packages I'm using. In this sample case, I'm compiling the first example from Didasko, ex1.cpp.</p>
<p>Another error I had was</p>
<p><code>ex1.cpp:35:32: fatal error: Didasko_ConfigDefs.h: No such file or directory</code></p>
<p>To get around that, I edited ex1.cpp and removed the outer #ifdef loop that provided the error message. This included removing calls to Didasko_ConfigDefs.h.</p>
<p>Final trick: In the skeletal Makefile, all the variables are defined as Trilinos_CXX, etc. When you include a specific package's makefile, you have to change them to Epetra_CXX, etc. So I did a find/replace Trilinos-&gt;Epetra and hit make. Check it out:</p>
<pre>user@computer:~/Desktop/trilinos-10.8.3/build/Testing/Temporary$ make
Found Epetra!  Here are the details:
 Epetra_VERSION =
 Epetra_PACKAGE_LIST = Epetra
 Epetra_LIBRARIES = -lepetra
 Epetra_INCLUDE_DIRS = -I~/Desktop/trilinos-10.8.3/build -I~/Desktop/trilinos-10.8.3/build/packages/epetra/src -I~/Desktop/trilinos-10.8.3/packages/epetra/src
 Epetra_LIBRARY_DIRS = -L~/Desktop/trilinos-10.8.3/build/packages/epetra/src
 Epetra_TPL_LIST = LAPACK BLAS
 Epetra_TPL_INCLUDE_DIRS =
 Epetra_TPL_LIBRARIES = /usr/lib/liblapack.so /usr/lib/libblas.so
 Epetra_TPL_LIBRARY_DIRS =
 Epetra_BUILD_SHARED_LIBS = OFF
 End of Epetra details
/usr/bin/c++   ex1.o  -o ex1  -I~/Desktop/trilinos-10.8.3/build -I~/Desktop/trilinos-10.8.3/build/packages/epetra/src -I~/Desktop/trilinos-10.8.3/packages/epetra/src   -DMYAPP_EPETRA -L~/Desktop/trilinos-10.8.3/build/packages/epetra/src  -lepetra /usr/lib/liblapack.so /usr/lib/libblas.so</pre>
<p>Compiled! Sweet. More on this as it progresses.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.partofthething.com/thoughts/?feed=rss2&#038;p=525</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Speed of python dict access methods (direct vs. get)</title>
		<link>http://www.partofthething.com/thoughts/?p=513</link>
		<comments>http://www.partofthething.com/thoughts/?p=513#comments</comments>
		<pubDate>Wed, 07 Dec 2011 18:20:33 +0000</pubDate>
		<dc:creator>ntouran</dc:creator>
				<category><![CDATA[computers]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://www.partofthething.com/thoughts/?p=513</guid>
		<description><![CDATA[In Python, a data from a dictionary can be retrieved using either direct key access (e.g. daysIn['January']=31) or through the get method (e.g. daysIn.get('January',31). In the first method, if a key does not exist, there will be a KeyError exception &#8230; <a href="http://www.partofthething.com/thoughts/?p=513">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>In <a title="Python" href="http://www.python.org" target="_blank">Python</a>, a data from a dictionary can be retrieved using either direct key access (e.g. daysIn['January']=31) or through the get method (e.g. daysIn.get('January',31). In the first method, if a key does not exist, there will be a KeyError exception raised. In the get method, if no key exists, the optional default value (31) will be returned with no error. This is well-documented <a href="http://docs.python.org/library/stdtypes.html#dict" target="_blank">here</a>.</p>
<p>I've been interested in accessing very large dictionaries very quickly for a nuclear reactor simulation code I'm writing for my thesis. For a large core (3000+ regions, 6 mesh points/region, 33 groups), the scatter matrices easily make dictionaries with 16 million entries or so. Since scatter matrices are fairly sparse, I've saved memory by only entering non-zero values. Then, looping back through, I just used get. It was slow though. I wondered whether saving the non-zero keys and accessing the dictionary directly would be much faster. So I ran a test with various amounts of data density. Low density means there are more zero entries.</p>
<div id="attachment_516" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.partofthething.com/thoughts/wp-content/uploads/2011/12/dictTimingResults.png"><img class="size-medium wp-image-516 " title="Dictionary Timing Results" src="http://www.partofthething.com/thoughts/wp-content/uploads/2011/12/dictTimingResults-300x225.png" alt="Dictionary Timing Results get vs. direct" width="300" height="225" /></a><p class="wp-caption-text">Dictionary access timing results for various amounts of data sparsity</p></div>
<p>In conclusion, directly accessing remembered keys converges to not quite twice as fast for full dictionaries. Good to know.<br />
<span id="more-513"></span><br />
More info on speed in Python<a href="http://wiki.python.org/moin/PythonSpeed/PerformanceTips" target="_blank"> here.</a></p>
<p>the code:</p>
<pre class="brush: python; title: ; notranslate">
import random
import time
import pylab

build=[]
get=[]
direct=[]

# build a big dict
densities=[1,2,10,20,30,40]
for density in densities:
    data={}
    keys=[]
    t0=time.time()
    for block in xrange(3000):
        for i in xrange(33):
            for j in xrange(33):
                key = (block,i,j)
                if not (block+j+i)%density:
                    # sparse data.
                    pass
                else:
                    data[key] = block+i+j
                    keys.append(key)

    # try it out with gets
    t1=time.time()
    for block in range(3000):
        for i in xrange(33):
            for j in xrange(33):
                val = data.get((block,i,j),0.0)
    t2=time.time()

    # try it with keys
    for key in keys:
        val = data[key]

    t3=time.time()

    print '{0:17s} {1:10.3f}'.format('Building the data',t1-t0)
    print '{0:17s} {1:10.3f}'.format('Gets',t2-t1)
    print '{0:17s} {1:10.3f}'.format('Directs',t3-t2)

    build.append(t1-t0)
    get.append(t2-t1)
    direct.append(t3-t2)

pylab.figure()
pylab.plot(densities,get,label='dict.get(key,0.0)')
pylab.plot(densities,direct,label='dict[key]')
pylab.grid()
pylab.legend(loc='lower right')
pylab.title('Speed of dictionary methods')
pylab.xlabel('Data density')
pylab.ylabel('Time (s)')
pylab.savefig('dictTimingResults.png')
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.partofthething.com/thoughts/?feed=rss2&#038;p=513</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How about a nice game of chess?</title>
		<link>http://www.partofthething.com/thoughts/?p=506</link>
		<comments>http://www.partofthething.com/thoughts/?p=506#comments</comments>
		<pubDate>Mon, 20 Jun 2011 15:15:23 +0000</pubDate>
		<dc:creator>ntouran</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.partofthething.com/thoughts/?p=506</guid>
		<description><![CDATA[Here's a random one. I've had this talking electronic chess board since 1994. It's called the Sharper Image Design Talking Chess Companion. Model SM 470. It's awesome and wonderful and I can't find any commentary on it on the internet. &#8230; <a href="http://www.partofthething.com/thoughts/?p=506">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Here's a random one. I've had this talking electronic chess board since 1994. It's called the Sharper Image Design Talking Chess Companion. Model SM 470. It's awesome and wonderful and I can't find any commentary on it on the internet. Therefore, this. I've taken the attached video showing Chester in all his glory, and with all of his loving phrases. Such as:</p>
<blockquote><p>Hi! I'm Chester. How about a nice game of chess?</p>
<p>Sure you're playing better but your taking more time than me.</p>
<p>Now I've got you!</p>
<p>How about a draw?</p></blockquote>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/ClXD_cu1e6g?hl=en&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/ClXD_cu1e6g?hl=en&#038;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p>
<p>Many good times hanging out with old Chester. They did a great job putting in tonality into his commentary. It's really like playing with another person. I only wish the random number generator had him do other openings more often. I've never really used the tournament openings mode, but I'm kind of curious. I wish I still had the manual. Anyway, the best part is that I know that my 4th-grade self is better at chess than my current self because I used to be able to easily beat Chester on a higher level than I can now.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.partofthething.com/thoughts/?feed=rss2&#038;p=506</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

