<?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>the corioblog &#187; geekspeak</title>
	<atom:link href="http://www.coriolinus.net/category/geekspeak/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.coriolinus.net</link>
	<description>read, and be entertained</description>
	<lastBuildDate>Sat, 09 Jul 2011 19:53:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>Today&#8217;s Numbers</title>
		<link>http://www.coriolinus.net/2011/05/22/todays-numbers/</link>
		<comments>http://www.coriolinus.net/2011/05/22/todays-numbers/#comments</comments>
		<pubDate>Sun, 22 May 2011 16:16:19 +0000</pubDate>
		<dc:creator>coriolinus</dc:creator>
				<category><![CDATA[geekspeak]]></category>
		<category><![CDATA[what i learned at work today]]></category>
		<category><![CDATA[5]]></category>
		<category><![CDATA[Fibonacci number]]></category>
		<category><![CDATA[Hewlett-Packard Company]]></category>
		<category><![CDATA[Hospitality/Recreation]]></category>

		<guid isPermaLink="false">http://www.coriolinus.net/?p=3158</guid>
		<description><![CDATA[1: Days of week the PX closes early 2: Days of week the base back gate does not open 3: Weeks between buying a brand new HP laptop and its bricking itself 5: Items in this list which fit the Fibonacci sequence 8: Minutes to cycle between my apartment and the base back gate 10: [...]]]></description>
			<content:encoded><![CDATA[<p>1: Days of week the PX closes early<br />
2: Days of week the base back gate does not open<br />
3: Weeks between buying a brand new HP laptop and its bricking itself<br />
5: Items in this list which fit the Fibonacci sequence<br />
8: Minutes to cycle between my apartment and the base back gate<br />
10: Minutes to cycle around the base perimeter between the back and side gates<br />
16: Minutes to cycle between my apartment and the base main gate</p>
]]></content:encoded>
			<wfw:commentRss>http://www.coriolinus.net/2011/05/22/todays-numbers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>conf.py: One-upping ConfigParser</title>
		<link>http://www.coriolinus.net/2010/11/13/conf-py-one-upping-configparser/</link>
		<comments>http://www.coriolinus.net/2010/11/13/conf-py-one-upping-configparser/#comments</comments>
		<pubDate>Sat, 13 Nov 2010 14:39:13 +0000</pubDate>
		<dc:creator>coriolinus</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[Class]]></category>
		<category><![CDATA[Computer programming]]></category>
		<category><![CDATA[computing]]></category>
		<category><![CDATA[Creative Commons]]></category>
		<category><![CDATA[Human Interest]]></category>
		<category><![CDATA[Main function]]></category>
		<category><![CDATA[Method]]></category>
		<category><![CDATA[Object-oriented programming]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Perl module]]></category>
		<category><![CDATA[programmer]]></category>
		<category><![CDATA[Software design patterns]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[wb]]></category>

		<guid isPermaLink="false">http://www.coriolinus.net/?p=3135</guid>
		<description><![CDATA[There comes a time in every programmer&#8217;s life when they decide that some silly, common library that they use all the time just isn&#8217;t good enough. It takes too many actions, or it feels opaque, or there are obvious features conspicuous in their absence. For me, that time is now, that library is ConfigParser, and [...]]]></description>
			<content:encoded><![CDATA[<p>There comes a time in every programmer&#8217;s life when they decide that some silly, common library that they use all the time just <em>isn&#8217;t good enough</em>. It takes too many actions, or it feels opaque, or there are obvious features conspicuous in their absence. </p>
<p>For me, that time is now, that library is ConfigParser, and the replacement is included below the fold. It&#8217;s called conf, and it means that the only interaction you as a programmer are required to have with your config file is to assign and/or read values to/from it. Assigning and reading look exactly like normal attribute assignment/reading. </p>
<p>Subversion/TRAC string: <a href="https://trac.coriolinus.net/browser/OOconf">https://svn.coriolinus.net/OOconf</a><br />
distutils packaged version: <a href="https://trac.coriolinus.net/browser/OOconf/dist/conf-0.2.0.zip?format=raw">conf-0.2.0</a></p>
<p>As always, I&#8217;m too cheap to pay a thousand dollars for a site certificate, so please ignore any certificate mismatch errors you encounter when viewing the https side of the site. If you don&#8217;t trust me enough to click through, you&#8217;ll still find the current version under the fold.</p>
<p><span id="more-3135"></span></p>
<pre class="brush: python">
import os
import codecs
import json
from ConfigParser import SafeConfigParser

def internal(func):
	def tf(self, *args, **kwargs):
		self.__dict__[&#039;__conf__&#039;].__dict__[&#039;__internal__&#039;] += 1
		try:
			return func(self, *args, **kwargs)
		finally:
			self.__dict__[&#039;__conf__&#039;].__dict__[&#039;__internal__&#039;] -= 1
	return tf

class Section(object):
	def __init__(self, conf, name, fullname=None):
		if fullname is None:
			fullname = name

		self.__dict__[&#039;__conf__&#039;] = conf
		self.__name__ = name
		self.__fullname__ = fullname

		self.__dict__[&#039;subsections&#039;] = set()
		self.__dict__[&#039;attributes&#039;] = set()

		#this lines MUST be the last in __init__
		self.__restrictedvars__ = set((i for i in dir(self) if &#039;__&#039; not in i))

	@internal
	def __setattr__(self, name, value):
		if self.restricted(name):
			if (not self.__conf__.__restrict__) or self.__conf__.__internal__ &gt; 0:
				self.__dict__[name] = value
			else:
				raise AttributeError(&quot;Namespace conflict: %s restricted for Conf use.&quot; % name)
		else:
			self.__conf__.__new_data__ = True
			self.attributes.add(name)
			self.__conf__.__cp__.set(self.__fullname__, name, json.dumps(value))

	@internal
	def __getattr__(self, name):
		if self.restricted(name):
			return self.__dict__[name]
		else:
			return json.loads(self.__conf__.__cp__.get(self.__fullname__, name))

	@internal
	def __delattr__(self, name):
		if self.restricted(name):
			if (not self.__conf__.__restrict__) or self.__conf__.__internal__ &gt; 0:
				del self.__dict__[name]
			else:
				raise AttributeError(&quot;Namespace conflict: %s restricted for Conf use.&quot; % name)
		else:
			self.__conf__.__new_data__ = True
			self.attributes.remove(name)
			self.__conf__.__cp__.remove_option(self.__name__, name)

	@internal
	def restricted(self, name):
		&quot;&quot;&quot;
		This function returns true for all attributes which should be stored locally, not in the
		configuration file proper.
		&quot;&quot;&quot;
		if name.startswith(&#039;__&#039;) or name.endswith(&#039;__&#039;):
			return True
		if name in self.__restrictedvars__:
			return True

		return False

	@internal
	def add_section(self, name):
		fullname = &#039;&#039;.join((self.__fullname__, &#039;.&#039;, name))

		if hasattr(self, name):
			raise ValueError(&quot;Namespace conflict: %s already in use&quot; % fullname)

		if not self.__conf__.__cp__.has_section(fullname):
			self.__conf__.__cp__.add_section(fullname)
		self.subsections.add(name)
		self.__dict__[name] = Section(self.__conf__, name, fullname)
		self.__restrictedvars__.add(name)
		self.__new_data__ = True

	@internal
	def remove_section(self, name):
		fullname = &#039;&#039;.join((self.__fullname__, &#039;.&#039;, name))

		if not hasattr(self, name):
			raise ValueError(&quot;Can&#039;t remove section %s, as it doesn&#039;t exist&quot; % fullname)

		sub = getattr(self, name)
		for subsub in list(sub.subsections):
			sub.remove_section(subsub)

		self.__conf__.__cp__.remove_section(fullname)
		self.subsections.remove(name)
		self.__restrictedvars__.remove(name)
		del self.__dict__[name]
		self.__new_data__ = True

class Conf(Section):
	&quot;&quot;&quot;
	Automatic storage and retrieval of arbitrary values into a config file. 

	Uses type information and automatic reconversions to store a variety of primitive types in a
	perfectly human-readable format. Primitive types are those encodable by the json module.

	Usage:
	&gt;&gt;&gt; from conf import Conf
	&gt;&gt;&gt; conf = Conf() #or Conf(filename, defaultsectionname)
	&gt;&gt;&gt; conf.foo = &#039;hello world&#039;
	&gt;&gt;&gt; conf.bar = 723
	&gt;&gt;&gt; conf.baz = False
	&gt;&gt;&gt; conf.flush()

	[exit, start a new session here]

	&gt;&gt;&gt; conf = Conf()
	&gt;&gt;&gt; conf.foo
	&#039;hello world&#039;
	&gt;&gt;&gt; conf.bar
	723
	&gt;&gt;&gt; conf.baz
	False

	If you want implicit file creation, you need to use a with statement:
	&gt;&gt;&gt; with Conf() as conf:
	...      conf.foo = 2783.1
	...
	&gt;&gt;&gt; del conf
	&gt;&gt;&gt; with Conf() as otherConf:
	...      otherConf.foo
	...
	2783.1
	&quot;&quot;&quot;
	def __init__(self, filename =&#039;.conf&#039;, sectionName=None):
		&quot;&quot;&quot;
		Initialize a new Conf object.
		&quot;&quot;&quot;
		self.__dict__[&#039;__internal__&#039;] = 0
		self.__dict__[&#039;__restrict__&#039;] = False
		#the above is magic; it must come first

		#sanity check
		if sectionName is not None and &#039;.&#039; in sectionName:
			raise ValueError(&quot;Namespace: &#039;.&#039; cannot be part of a section name&quot;)

		#initialize the superclass
		Section.__init__(self, self, sectionName if sectionName is not None else &#039;config&#039;)

		self.__filename__ = filename
		self.__cp__ = SafeConfigParser()

		#load and initialize the configparser
		if os.path.exists(filename):
			with codecs.open(filename, &#039;rb&#039;, &#039;utf8&#039;) as cf:
				self.__cp__.readfp(cf, filename)

		if sectionName is None:
			topLevelSections = [s for s in self.__cp__.sections() if s.count(&#039;.&#039;) == 0]
			if len(topLevelSections) == 1:
				sectionName = topLevelSections[0]
				self.__name__ = sectionName
				self.__fullname__ = sectionName
			else:
				sectionName = &#039;config&#039;

		#create the default section
		if not self.__cp__.has_section(sectionName):
			self.__cp__.add_section(sectionName)

		#load default section attributes
		self.attributes = set(self.__cp__.options(sectionName))

		#load the various sections
		#first, sort them by the number of dots they contain
		secs = [(s.count(&#039;.&#039;), s) for s in self.__cp__.sections() if s != sectionName]
		secs.sort()
		for name in [sec for count, sec in secs]:
			if &#039;.&#039; not in name:
				self.subsections.add(name)
				self.__dict__[name] = Section(self, name)
				self.__dict__[name].attributes = set(self.__cp__.options(name))
				self.__restrictedvars__.add(name)
			else:
				fullname = name
				rest, name = name.rsplit(&#039;.&#039;, 1)
				sec = self
				for part in rest.split(&#039;.&#039;):
					sec = getattr(sec, part)
				sec.subsections.add(name)
				sec.__dict__[name] = Section(self, name, fullname)
				sec.__dict__[name].attributes = set(self.__cp__.options(fullname))
				sec.__restrictedvars__.add(name)

		self.__new_data__ = False

		#this must come last:
		self.__internal__ = 0
		self.__restrict__ = True
		#This is used in combination with the @internal decorator. Each method so decorated
		# increments this variable on entry, and decrements it on exit. They can then check: is
		# __internal__ &gt; 0? If yes, they were called from within this Conf object, and can adjust
		# their behavior accordingly.
		#
		#Note that we initialize it here to 0. When this __init__ exits, it decrements to -1. This
		# is intentional. Since each internal function starts by incrementing it, this means that
		# only if the variable is &gt; 0 was its caller also internal.

	@internal
	def __enter__(self):
		return self

	@internal
	def __exit__(self, exc_type, exc_value, traceback):
		if self.__new_data__:
			self.flush()

	@internal
	def flush(self):
		with codecs.open(self.__filename__, &#039;wb&#039;, &#039;utf8&#039;) as cf:
			self.__cp__.write(cf)
		self.__new_data__ = False

	@internal
	def add_section(self, name):
		&quot;&quot;&quot;
		Create a new section in the conf file. This will become a dotted extension of the conf object.

		For example:
		&gt;&gt;&gt; c = Conf()
		&gt;&gt;&gt; c.foo = &#039;hello world&#039;
		&gt;&gt;&gt; c.add_section(&#039;bar&#039;)
		&gt;&gt;&gt; c.bar.baz = &#039;world says hello&#039;

		The above turns into a config file which looks like this:
		[config]
		foo = hello world

		[bar]
		baz = world says hello
		&quot;&quot;&quot;
		if hasattr(self, name):
			raise ValueError(&quot;Namespace conflict: %s already in use&quot; % name)
		if &#039;.&#039; in name:
			raise ValueError(&quot;Namespace: &#039;.&#039; cannot be part of a section name&quot;)

		if not self.__conf__.__cp__.has_section(name):
			self.__conf__.__cp__.add_section(name)
		self.subsections.add(name)
		self.__dict__[name] = Section(self, name)
		self.__restrictedvars__.add(name)
		self.__new_data__ = True

	@internal
	def remove_section(self, name):
		&quot;&quot;&quot;
		Remove a section and all included data.
		&quot;&quot;&quot;
		if not hasattr(self, name):
			raise ValueError(&quot;Can&#039;t remove section %s, as it doesn&#039;t exist&quot; % name)

		sub = getattr(self, name)
		for subsub in sub.subsections:
			sub.remove_section(subsub)

		self.__cp__.remove_section(name)
		self.subsections.remove(name)
		self.__restrictedvars__.remove(name)
		del self.__dict__[name]
		self.__new_data__ = True
</pre>
<p><a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/3.0/88x31.png" /></a><br /><span xmlns:dct="http://purl.org/dc/terms/" href="http://purl.org/dc/dcmitype/Text" property="dct:title" rel="dct:type">conf.py</span> by <a xmlns:cc="http://creativecommons.org/ns#" href="http://coriolinus.net" property="cc:attributionName" rel="cc:attributionURL">coriolinus</a> is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/">Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License</a>.<br />Permissions beyond the scope of this license may be available at <a xmlns:cc="http://creativecommons.org/ns#" href="http://www.coriolinus.net/contact/" rel="cc:morePermissions">http://www.coriolinus.net/contact/</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.coriolinus.net/2010/11/13/conf-py-one-upping-configparser/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Understanding Humans</title>
		<link>http://www.coriolinus.net/2010/08/08/understanding-humans/</link>
		<comments>http://www.coriolinus.net/2010/08/08/understanding-humans/#comments</comments>
		<pubDate>Sun, 08 Aug 2010 10:54:22 +0000</pubDate>
		<dc:creator>coriolinus</dc:creator>
				<category><![CDATA[brain flotsam]]></category>
		<category><![CDATA[geekspeak]]></category>
		<category><![CDATA[computing]]></category>
		<category><![CDATA[Layer 8]]></category>
		<category><![CDATA[Network architecture]]></category>
		<category><![CDATA[OSI model]]></category>
		<category><![CDATA[OSI protocols]]></category>

		<guid isPermaLink="false">http://www.coriolinus.net/?p=3111</guid>
		<description><![CDATA[The world needs a proper model of human comprehension of natural language. This one is based partly on the OSI Model, partly on standard compiler design. Conceptually, it&#8217;s an interface stack: a set of layers of functionality. Each layer can talk freely within itself, and has a well-defined interface to the layers above and below, [...]]]></description>
			<content:encoded><![CDATA[<p>The world needs a proper model of human comprehension of natural language. This one is based partly on the <a href="https://secure.wikimedia.org/wikipedia/en/wiki/OSI_model">OSI Model</a>, partly on standard compiler design. Conceptually, it&#8217;s an interface stack: a set of layers of functionality. Each layer can talk freely within itself, and has a well-defined interface to the layers above and below, but never calls otherwise.</p>
<ol>
<li><strong>Lexer / Phoneme Analyzer</strong>: This just tokenizes the input stream, whether it be audio or text. These are actually separate branches for the different types of input, but functionally do the same thing. Operates at the character/raw sound level.</li>
<li><strong>Parser</strong>: Checks grammar and syntax of input tokens. Generates all possible interpretations of homonym/homophone possibilities. Operates at the word level. Generates sentences.</li>
<li><strong>Local Contextual Integrator</strong>: Considers local details: formatting of text, source and quality of audio, etc. Gives a small, local &#8220;big picture&#8221; to frame the input in question. Operates at the word level, but by nature considers a variety of external cues.</li>
<li><strong>Literal Semantic Analyzer</strong>: Given the tokens and their context, decides what the literal meaning of a given sentence is. Operates at the sentence level.</li>
<li><strong>Source Knowledge Integrator</strong>: The source of a given communication is important. A message from a family member might be more trusted than a random internet article. A sentence from a very literal, precise person is more likely to mean exactly what it says than one from an excitable teenager. Operates at the sentence level.</li>
<li><strong>Conceptual Accumulator</strong>: Collects a bunch of related sentences into a paragraph-level concept. Decides what sentences are related and how they fit together.</li>
<li><strong>General Semantic Analyzer</strong>: Decides what the author probably meant in a particular paragraph. Resolves logical contradictions and paradox. Operates at the paragraph/concept level.</li>
<li><strong>General Contextual Integrator</strong>: Integrates a concept with a worldview. This is the level which decides if someone is lying, wrong, or otherwise speaking falsehoods. Operates at the concept level, though by nature includes a wide variety and broad scope of external information.</li>
<li><strong>Cognition</strong>: normal thought about ideas. Operates at the conceptual level. Can modify the rules of lower levels, for example when learning a new language or updating the current model of the current language.</li>
</ol>
<p>Humans accomplish layers 1-5 automatically and unconsciously. Layers 6-8 are like breathing: generally subconscious, but can be consciously overridden. Layer 9 is when we start getting into id, ego, superego stuff: possibly subconscious but generally sentient behavior. Computers right now are quite good at steps 1 and 2 using artificial languages, and rubbish at them for natural languages. Layers 3 and above may exist as research projects, but are above the current state of the art.</p>
<p>When I go back to school, there is a high probability that this is the stuff I will focus on, trying to push the state of the art in computer thought up, level by level. It is fascinating!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.coriolinus.net/2010/08/08/understanding-humans/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hacker&#8217;s Delight</title>
		<link>http://www.coriolinus.net/2010/07/06/hackers-delight/</link>
		<comments>http://www.coriolinus.net/2010/07/06/hackers-delight/#comments</comments>
		<pubDate>Tue, 06 Jul 2010 18:17:03 +0000</pubDate>
		<dc:creator>coriolinus</dc:creator>
				<category><![CDATA[bibliophile]]></category>
		<category><![CDATA[geekspeak]]></category>

		<guid isPermaLink="false">http://www.coriolinus.net/?p=3101</guid>
		<description><![CDATA[x + y = (x XOR y) + (x &#038; y)]]></description>
			<content:encoded><![CDATA[<p>x + y = (x XOR y) + (x &#038; y)<<1</p>
<p>It's longhand addition: the sum with carries ignored, plus the carries. Why not just use a normal adder? This equation still has an addition operation. However, this reduces the probability of a carry operation by about half (assuming binary numbers with each bit independently equally likely to be either 0 or 1).</p>
<p>It's not useful, but it's cool. This whole book is 300 pages of such tricks, few of which I expect ever to use, but all of which trigger little explosions of happiness when I figure out how they work. If you've ever considered bit-twiddling without immediately assuming it's a euphemism, you'll like this book.</p>
<p><a href="http://www.amazon.com/gp/product/0201914654?ie=UTF8&#038;tag=corioblog-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=0201914654">Hacker&#8217;s Delight, Henry S. Warren, Jr. (Amazon)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.coriolinus.net/2010/07/06/hackers-delight/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Thought Experiment</title>
		<link>http://www.coriolinus.net/2010/06/23/thought-experiment/</link>
		<comments>http://www.coriolinus.net/2010/06/23/thought-experiment/#comments</comments>
		<pubDate>Wed, 23 Jun 2010 23:47:55 +0000</pubDate>
		<dc:creator>coriolinus</dc:creator>
				<category><![CDATA[geekspeak]]></category>

		<guid isPermaLink="false">http://www.coriolinus.net/?p=3094</guid>
		<description><![CDATA[Assume superstring theory is correct, and the universe is 11-dimensional. 7 of those are so tiny and curled in on themselves that in human terms they are entirely extraneous; still, they exist. You invent the world&#8217;s tiniest (and most sideways) centrifuge, and accelerate someone to near lightspeed along one of these dimensions. Does this brave [...]]]></description>
			<content:encoded><![CDATA[<p>Assume superstring theory is correct, and the universe is 11-dimensional. 7 of those are so tiny and curled in on themselves that in human terms they are entirely extraneous; still, they exist.</p>
<p>You invent the world&#8217;s tiniest (and most sideways) centrifuge, and accelerate someone to near lightspeed along one of these dimensions. Does this brave experimentee experience relativistic weirdness?</p>
<p>My prediction: yes, but not in the traditional sense. The necessary caveat here is that I do not have the necessary math to back any of this up; this is just intuition based on my understanding of physics.</p>
<p>Let&#8217;s list the traditional effects of near-lightspeed travel. There&#8217;s an increase in mass, compression along the direction of travel, a reduction of rate of perceived time. These effects can only be perceived by an observer whose velocity relative to the experimentee is large. </p>
<p>The salient feature of the seven bonus dimensions is that they are very, very tiny and extremely tightly curled: any motion along any of them will quickly return an object to the starting point. (This is both why the experiment features a centrifuge instead of a traditional accelerator and why they play a negligible role in human-scale life.) Also, they are orthogonal to each other and to the traditional four dimensions of everyday life. </p>
<p>The centrifuge&#8217;s overall effect, then, will be to vibrate the experimentee; whether it&#8217;s a sine wave or a sawtooth depends on details of the wrapping that I don&#8217;t know, but that ultimately don&#8217;t matter. Either way, vibration can be averaged out to a single position. </p>
<p>We wouldn&#8217;t notice the spatial compression: that only applies in the direction of travel, and in this case that direction is orthogonal to any direction humans can sense. However, we would notice the other two effects: time dilation and mass increase. Even though the experimentee is at rest in the primary three dimensions and is effectively only vibrating in the fourth, that vibration is still at near-lightspeed. I can&#8217;t come up with any reason why those effects should be masked.</p>
<p>Holy crap. I think I just simultaneously invented both stasis fields and gravity generators.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.coriolinus.net/2010/06/23/thought-experiment/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>i got the twitter</title>
		<link>http://www.coriolinus.net/2010/05/12/i-got-the-twitter/</link>
		<comments>http://www.coriolinus.net/2010/05/12/i-got-the-twitter/#comments</comments>
		<pubDate>Wed, 12 May 2010 15:37:06 +0000</pubDate>
		<dc:creator>coriolinus</dc:creator>
				<category><![CDATA[geekspeak]]></category>

		<guid isPermaLink="false">http://www.coriolinus.net/?p=3061</guid>
		<description><![CDATA[@coriolinus It sounds like a disease, doesn&#8217;t it?]]></description>
			<content:encoded><![CDATA[<p>@<a href="http://twitter.com/coriolinus">coriolinus</a></p>
<p>It sounds like a disease, doesn&#8217;t it?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.coriolinus.net/2010/05/12/i-got-the-twitter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>keeping up</title>
		<link>http://www.coriolinus.net/2010/04/13/keeping-up/</link>
		<comments>http://www.coriolinus.net/2010/04/13/keeping-up/#comments</comments>
		<pubDate>Tue, 13 Apr 2010 09:34:47 +0000</pubDate>
		<dc:creator>coriolinus</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[army]]></category>
		<category><![CDATA[civilian contractor]]></category>
		<category><![CDATA[computing]]></category>
		<category><![CDATA[Cross-platform software]]></category>
		<category><![CDATA[Data management]]></category>
		<category><![CDATA[Database management systems]]></category>
		<category><![CDATA[Databases]]></category>
		<category><![CDATA[IBM software]]></category>
		<category><![CDATA[Microsoft SQL Server]]></category>
		<category><![CDATA[MSSQL query designer]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://www.coriolinus.net/?p=3053</guid>
		<description><![CDATA[Today I got to code to solve a problem. The Army&#8217;s bit of code which moved flight records from the maintenance database into the pilot records database broke, and I got to write a replacement. It&#8217;s trivial code, really: take a fairly complex SQL join generated by MSSQL, and write its results to an XML [...]]]></description>
			<content:encoded><![CDATA[<p>Today I got to code to solve a problem. The Army&#8217;s bit of code which moved flight records from the maintenance database into the pilot records database broke, and I got to write a replacement. It&#8217;s trivial code, really: take a fairly complex SQL join generated by MSSQL, and write its results to an XML file using a particular schema. Still, I got really, stupidly excited about this. </p>
<p>I also learned some things:</p>
<ol>
<li>I am very, very out of practice. More than four hours into the exercise, I was still debugging. The bugs were things like MSSQL Optional Feature Not Implemented, not actual logic errors, but still. That&#8217;s too long given the complexity of the task.</li>
<li>I have a lot of fun coding. In a basically unprecedented move, I was delaying leaving work until the guy whose office I was borrowing made me leave so he could lock up. Especially given that I&#8217;d had an 11 hour day at that point, this is a significant development.</li>
<li>For all that I rag on MS products, the MSSQL query designer really does take a lot of work out of the process of writing complex queries.</li>
</ol>
<p>Actually, 90 minutes into the exercise, a civilian contractor came by and worked magic and solved the problem for which I was writing code in the first place. I kept working, using the excuse that my version will be more featureful than the Army&#8217;s, and that by having the source to it the Army will benefit. The real reason is much simpler: I&#8217;m having way too much fun to just give this project up. I am perpetually at the 50% mark and working rapidly towards completion; I&#8217;m not going to let this just escape me. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.coriolinus.net/2010/04/13/keeping-up/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Happier Video</title>
		<link>http://www.coriolinus.net/2010/04/07/a-happier-video/</link>
		<comments>http://www.coriolinus.net/2010/04/07/a-happier-video/#comments</comments>
		<pubDate>Wed, 07 Apr 2010 08:25:42 +0000</pubDate>
		<dc:creator>coriolinus</dc:creator>
				<category><![CDATA[geekspeak]]></category>
		<category><![CDATA[misc.link]]></category>

		<guid isPermaLink="false">http://www.coriolinus.net/?p=3048</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p><object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/E3keLeMwfHY&#038;rel=0&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;hl=en_US&#038;feature=player_embedded&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowScriptAccess" value="always"></param><embed src="http://www.youtube.com/v/E3keLeMwfHY&#038;rel=0&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;hl=en_US&#038;feature=player_embedded&#038;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="640" height="385"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://www.coriolinus.net/2010/04/07/a-happier-video/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pictures from Last Night</title>
		<link>http://www.coriolinus.net/2010/03/28/pictures-from-last-night/</link>
		<comments>http://www.coriolinus.net/2010/03/28/pictures-from-last-night/#comments</comments>
		<pubDate>Sun, 28 Mar 2010 13:16:07 +0000</pubDate>
		<dc:creator>coriolinus</dc:creator>
				<category><![CDATA[life things]]></category>
		<category><![CDATA[photos]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[B-boy]]></category>
		<category><![CDATA[Breakdance]]></category>
		<category><![CDATA[Flickr]]></category>
		<category><![CDATA[Hip hop dance]]></category>
		<category><![CDATA[Hospitality/Recreation]]></category>
		<category><![CDATA[Nerd]]></category>
		<category><![CDATA[Slang]]></category>
		<category><![CDATA[Sociology]]></category>
		<category><![CDATA[World Wide Web]]></category>

		<guid isPermaLink="false">http://www.coriolinus.net/?p=3022</guid>
		<description><![CDATA[It was an interesting night: I was at a B-Boying (breakdancing for those not down with the slang) competition. As a second date, it was quite fun; as an event to photograph, it was a challenge; as a skill, it was intimidating. More images here, at the flickr set. Statistics, because I am a nerd: [...]]]></description>
			<content:encoded><![CDATA[<p>It was an interesting night: I was at a B-Boying (breakdancing for those not down with the slang) competition. As a second date, it was quite fun; as an event to photograph, it was a challenge; as a skill, it was intimidating. </p>
<p><a href="http://www.flickr.com/photos/coriolinus/sets/72157623594736397/detail/" title="horizontal kick by coriolinus, on Flickr"><img src="http://farm3.static.flickr.com/2778/4469898744_efea62dca0_b.jpg" width="1024" height="666" alt="horizontal kick" /></a></p>
<p>More images <a href="http://www.flickr.com/photos/coriolinus/sets/72157623594736397/detail/">here</a>, at the flickr set.</p>
<hr align="center" width="50%" />
<em>Statistics, because I am a nerd:</em><br />
Photos taken: 178<br />
Photos discarded as terrible: 80<br />
Good photos: 7<br />
Programs written to get rid of the raws left over after discarding the terrible photos: <a href="https://trac.coriolinus.net/browser/rawremove/rawremove.py">1</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.coriolinus.net/2010/03/28/pictures-from-last-night/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>EA Tech Support is Useless</title>
		<link>http://www.coriolinus.net/2010/03/26/ea-tech-support-is-useless/</link>
		<comments>http://www.coriolinus.net/2010/03/26/ea-tech-support-is-useless/#comments</comments>
		<pubDate>Sat, 27 Mar 2010 02:23:07 +0000</pubDate>
		<dc:creator>coriolinus</dc:creator>
				<category><![CDATA[geekspeak]]></category>
		<category><![CDATA[Bad Company 2]]></category>
		<category><![CDATA[hardware/software combinations]]></category>
		<category><![CDATA[Technology/Internet]]></category>

		<guid isPermaLink="false">http://www.coriolinus.net/?p=3020</guid>
		<description><![CDATA[Transcript of chat log: KIETH: Hi, my name is KIETH. How may I help you? [06:05:08 PM] coriolinus: hello keith [06:06:14 PM] KIETH: hello, [06:07:05 PM] coriolinus: I&#8217;ve got Bad Company 2 installed via Steam [06:06:35 PM] coriolinus: I played it a bit a few weeks ago, put it down, and tried it again today [...]]]></description>
			<content:encoded><![CDATA[<p>Transcript of chat log:<br />
<blockquote>KIETH: Hi, my name is KIETH. How may I help you? [06:05:08 PM]<br />
coriolinus: hello keith [06:06:14 PM]<br />
KIETH: hello, [06:07:05 PM]<br />
coriolinus: I&#8217;ve got Bad Company 2 installed via Steam [06:06:35 PM]<br />
coriolinus: I played it a bit a few weeks ago, put it down, and tried it again today [06:06:48 PM]<br />
KIETH: Okay. [06:07:55 PM]<br />
coriolinus: The problem was that after loading the game, pressing the &#8220;Resume&#8221; button, and loading the maps, it dumped me back down to the desktop with no error at all [06:07:18 PM]<br />
KIETH: Carry on. [06:08:02 PM]<br />
coriolinus: it happened when I was logged into the servers and when I wasn&#8217;t [06:07:37 PM]<br />
coriolinus: All I&#8217;m trying to do is continue playing where I left off, but this game keeps crashing seemingly immediately as it finishes loading the level [06:08:10 PM]<br />
KIETH: Please provide me the dxdiag of your PC. [06:09:21 PM]</p>
<p>[cut for length]</p>
<p>KIETH: Okay. [06:10:37 PM]<br />
KIETH: Sorry. [06:12:31 PM]<br />
KIETH: The game is not tested on windows 7, 64 bit. [06:12:57 PM]<br />
KIETH: Please run the game on compatibility mode. [06:13:14 PM]<br />
coriolinus: i see [06:12:41 PM]<br />
KIETH: Is there anything else I can do for you ? [06:13:37 PM]<br />
coriolinus: when does EA expect to extend compatibility testing to modern hardware/software combinations? [06:13:15 PM]<br />
KIETH: No. [06:14:33 PM]<br />
&#8216;coriolinus&#8217; disconnected (&#8216;Concluded by End-user&#8217;). [06:14:59 PM]</p></blockquote>
<p>In other news, don&#8217;t bother buying Bad Company 2.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.coriolinus.net/2010/03/26/ea-tech-support-is-useless/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

