<?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</title>
	<atom:link href="http://www.coriolinus.net/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>Trypanophobia</title>
		<link>http://www.coriolinus.net/2011/03/07/trypanophobia/</link>
		<comments>http://www.coriolinus.net/2011/03/07/trypanophobia/#comments</comments>
		<pubDate>Mon, 07 Mar 2011 15:28:00 +0000</pubDate>
		<dc:creator>coriolinus</dc:creator>
				<category><![CDATA[being organic sucks]]></category>

		<guid isPermaLink="false">http://www.coriolinus.net/?p=3153</guid>
		<description><![CDATA[One of the annoying parts of adulthood is that when things are necessary that I really don&#8217;t want to do, such as for example getting my biennial mandatory blood workup, I don&#8217;t have the option to tantrum or otherwise express that fact to the people around me. There was a great freedom as a child [...]]]></description>
			<content:encoded><![CDATA[<p>One of the annoying parts of adulthood is that when things are necessary that I really don&#8217;t want to do, such as for example getting my biennial mandatory blood workup, I don&#8217;t have the option to tantrum or otherwise express that fact to the people around me. There was a great freedom as a child to make it obvious when I was unhappy, to spread that unhappiness around and make sure everyone in my vicinity shared it. Such conduct can&#8217;t be considered anymore, for obvious reasons. Still, it was at least a release. These days, there&#8217;s nothing to do but bite the bullet with as much dignity and humor as I can muster, and that is not nearly so satisfying.</p>
<p>The fact is that I just don&#8217;t like needles. In itself, that isn&#8217;t so bad; it&#8217;s no great feat to go to the clinic, joke with the medics, stare at anything else until they&#8217;re done. It&#8217;s not like there&#8217;s any real pain involved. The real problem is afterward: pretty much as soon as they tell me I can go now, I&#8217;m in no shape to do so. </p>
<p>The symptoms are predictable: they happen reliably every time I have blood drawn. Nausea. Cold sweats. Paleness. Greying of vision coupled with graininess, as though my eyes have just cranked up into their Boost ISO ratings while slamming closed the pupils. When I was young, I passed out more than once after blood withdrawals, but I&#8217;m not allowed to anymore: military pilots aren&#8217;t allowed to faint. That would be an entry in my medical history that I really don&#8217;t want; it might threaten my ability to fly. So I don&#8217;t pass out anymore. </p>
<p>Instead, I sit for a minute until it seems prudent to stand, then retch into a toilet for a little while. Then I go sit down for another ten or fifteen minutes, waiting quietly to regain my equipoise. Only then can I go about my day. </p>
<p>This whole process is inconvenient and irrational and annoying, even more so for the fact that it&#8217;s automatic and unavoidable. I&#8217;d really like to be able to face blood drawings with the unconcern of a machine having an oil sample taken: through a convenient access port, with none of these autonomic responses incapacitating me regardless of my desires in the matter. Unfortunately, that skill continues to elude me. </p>
<p>At least it will be two years at least before I have to go through any of this again. And even despite this, today was a good day.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.coriolinus.net/2011/03/07/trypanophobia/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Peaceful Resolution</title>
		<link>http://www.coriolinus.net/2011/01/23/peaceful-resolution/</link>
		<comments>http://www.coriolinus.net/2011/01/23/peaceful-resolution/#comments</comments>
		<pubDate>Sun, 23 Jan 2011 05:49:06 +0000</pubDate>
		<dc:creator>coriolinus</dc:creator>
				<category><![CDATA[i will tell you a story now]]></category>

		<guid isPermaLink="false">http://www.coriolinus.net/?p=3150</guid>
		<description><![CDATA[The alarm clock never actually registered as a sound, at first. Through some somnolent semi-synaesthesia, it was a persistent pulsing of pressure, unignorable and inexorable in dragging him to awareness, but not sound. It only ever registered as noise after he was most of the way awake, clearing his eyes, sitting up. Only then did [...]]]></description>
			<content:encoded><![CDATA[<p>The  alarm clock never actually registered as a sound, at first. Through  some somnolent semi-synaesthesia, it was a persistent pulsing of  pressure, unignorable and inexorable in dragging him to awareness, but  not sound. It only ever registered as noise after he was most of the way  awake, clearing his eyes, sitting up. Only then did its sawtooth waves  truly begin to grate and prompt him to slap it into silence.</p>
<p>Aaron Brown was not a morning person.</p>
<p>This  wasn&#8217;t atypical, though. Very little about him was. In sleepy sequence  he did all the normal things: showered, shaved, suited up, downed a bit  of coffee, went to work. Traffic was light this morning, which was a  relief.</p>
<p>Another  of Aaron&#8217;s traits was that he was a quiet sort of person. From the  moment the alarm died until greeting the receptionist at the firm, the  only noises he heard were the incidental noises of moving about his  condo in the well-established routine. It&#8217;s not that he was particularly  trying for stealth; he just saw no reason to make any unnecessary  noise. If he moved without any particular grace, it was with at least  the smoothness of a well-rehearsed morning routine; very little noise  indeed turned out to be necessary. Even his Prius was far too polite to  bother anyone with the excitement of burning fossil fuels, most of the  time.</p>
<p>The  receptionist was quite otherwise: a cheerful young woman named Sally.  Cheerful wasn&#8217;t quite the right word; the right one would have most of  the denotations of &#8216;perky&#8217; without the connotations of &#8216;annoying.&#8217; She  was bright in personality, if not in intelligence, and her friendly  greeting typically spiked through his sensitized hearing in a way quite  comparable to the alarm.</p>
<p>Today  proved to be an exception: her desk was empty. This was an anomaly, but  not one which particularly troubled Aaron. His only interaction with  her was through the brief trivialities of greeting and parting as he  walked past her twice each day. There was surely some perfectly  reasonable reason why nobody was there today. As he summoned the  elevator, his mind wandered to other things.</p>
<p>Upstairs,  in the office, Milo Hammerschmidt was frantic. Milo Hammerschmidt was  Aaron&#8217;s boss. Milo Hammerschmidt used to play football. Milo  Hammerschmidt was now 60 pounds overweight. As he heard the rumble of  the approaching elevator, Milo Hammerschmidt slammed down the telephone  on yet another endless ringtone and prayed. When the doors dinged and  began to open, he leapt from his desk with joy and paced directly over.</p>
<p>&#8220;Aaron!  Thank god you&#8217;re here; I&#8217;ve had a devil of a time getting anybody in  this morning! Nobody&#8217;s answering their phones; it&#8217;s as though they&#8217;ve  all vanished off the face of the earth. Listen, I need you to hold down  the fort here for a while; I&#8217;m going to go start knocking on peoples&#8217;  doors. We just can&#8217;t function if nobody shows up!&#8221;</p>
<p>Aaron  was an actuary. His job wasn&#8217;t to sell insurance, or to investigate  claims, or to answer calls: all of those jobs required assertive people,  loud people. People people. They wouldn&#8217;t have been a good fit.</p>
<p>Aaron&#8217;s  job was to investigate data, and determine probabilities. Conditional  probabilities, chained probabilities, and expected values were his bread  and butter. Black swans and white noise were his seasonings. Aaron  could tell you about the difference between correlation and causation,  the statistical tools to determine which was which, and the perfectly  good reason why it didn&#8217;t matter to the company which one it was as far  as setting rates went. When he ran out of data, Aaron was a man who  could commission a study to collect more data.</p>
<p>Aaron was not a powerful man, but he had enough power to suit his desires.</p>
<p>He  was happy enough in his job. Shortly after noon, he looked up from his  work and realized that while he was engrossed some people had come into  the office. They were a small fraction of the normal office population,  and were mostly standing around the coffee machine, chatting quietly.  This almost never happened. Milo didn&#8217;t tolerate it. The coffee maker  was set up directly across from his office door for precisely this  reason. Milo, Aaron presumed, was probably still out trying to round up  the rest of the staff.</p>
<p>Aaron  liked to eat at a particular cafe near the office. It wasn&#8217;t heavily  patronized in the best of times, but the food was good and cheap and  surprisingly healthy; if it weren&#8217;t for that last fact it could have  been called a greasy spoon. As he walked in, and the bells hanging from  the door handle jingled their greetings, he saw that the place was  empty. It could be that the staff were all busy in the back. That wasn&#8217;t  entirely implausible. A bit of his subconscious was ticking away,  though, working out what the probabilities actually were, given the  available information. The numbers it was coming up with were startling.  They couldn&#8217;t be right. In the meantime, while waiting for the waitress  to take his order, he sat and watched the television.</p>
<p>It  was showing the news, or at least it seemed to be. A young-looking  reporter was interviewing a wild-eyed man in clerical clothes.<br />
&#8220;The Rapture has come and gone. We are the remainders! We are, all of us, the damned.&#8221;<br />
&#8220;Surely  there&#8217;s some other explanation for the disappearances. After all, the  Rapture was only supposed to take 144000 people; the most current  estimates are that over five billion have already vanished. How do you  explain the fact that so many more people were saved?&#8221;<br />
&#8220;Can  you question God&#8217;s grace to that extent? He promised to save that many,  but through His divine munificence He&#8217;s saved the majority of the  people of the world!&#8221;<br />
&#8220;Why would he have left us behind, though? What made us different?&#8221;<br />
&#8220;I  cannot say. I&#8217;ve been searching my soul to discover why I am among the  wicked to endure the Tribulation, but I cannot answer for the ineffable  will of the Lord.&#8221;</p>
<p>The text ticker at the bottom of the screen was showing similarly apocalyptic messages:<br />
IS THE END OF THE WORLD NIGH? VOTE ONLINE OR BY TEXTING &#8220;YES&#8221; OR &#8220;NO&#8221; TO 57668<br />
NUCLEAR DETONATIONS DETECTED IN KOREA, PAKISTAN<br />
5 BILLION PEOPLE AND COUNTING VANISH WITHIN HOURS. EXPERTS MYSTIFIED<br />
US MILITARY ORDERED TO DEFCON 2: &#8220;WE ARE PREPARED TO REACT TO ANY THREAT&#8221; SAYS SECDEF<br />
POPE IS AMONG THE MISSING<br />
COULD THIS BE TERRORISM?<br />
NO EVIDENCE YET OF DEAD RISING<br />
BRITISH RECLUSE WINS 258 TRILLION EURO FROM BOOKIE FOR PREDICTION</p>
<p>After  some twenty minutes of fascinated horror at the messages, Aaron ducked  behind the counter and made himself a sandwich. He left a $20 bill on  the counter without making change. It was hard to feel like it mattered.</p>
<p>Walking  back to the office was somewhat surreal. There were people on the  streets, but nearly no traffic. Occasionally a window smashed in the  distance, but more people were simply walking into stores and taking  what they wanted quietly. When he arrived back, he discovered he was the  only person at work. He puttered for a little while, proving that using  standard models the probability of current events was on the order of  1*10^(-340). Then, in the single most rebellious act of his life, he  walked out of the office.</p>
<p>The  streets were jammed with idling, empty vehicles. He walked, randomly at  first, then decided to go to the park. By the time he got there, the  sun was glaring blindingly golden off the glass facades of the  surrounding skyscrapers. He leaned on the railing of a pedestrian bridge  and looked out at it all. The trees shone verdant in the setting  sunlight; the sky was a rich azure; the buildings rose haughty in the  distance. The only noise was the wind through the leaves and the  chittering of the small animals who lived nearby. He leaned on the  railing, and became aware of a pressure in his head: the same periodic  pounding which in a normal context meant that there was a signal there  which his brain was refusing to interpret correctly just yet because it  wasn&#8217;t yet aware enough to handle its reality. As its intensity  increased, he lay back, perfectly relaxed, on a nearby park bench. He  fell quietly into a painless sleep.</p>
<p>The  scene was still but for the rise and fall of his chest. Shortly  thereafter, that motion gently ceased as well. His constituent mass  dissolved silently into dust, drifting lightly into the air. Only  minutes after he sat down, all trace of him was gone.</p>
<p>Orbiting  high above, in a craft no human ever detected, in a language no human  would ever hear or translate, a being spoke. &#8220;It&#8217;s just hit 100%,  Captain. There is no intelligent life on the planet.&#8221;<br />
&#8220;Good job. What are the final violence statistics we&#8217;re going to have to report to the Ethics Committee?&#8221;<br />
&#8220;Fourteen  nuclear detonations in the eastern half of the major continent, though  we&#8217;ve got solid evidence showing that those were aboriginal weapons. A  few thousand deaths from depiloted aircraft and vehicles hitting  bystanders. All told, we achieved a better than 99% peaceful resolution  rate.&#8221;<br />
&#8220;That&#8217;s excellent work, men. Stand down. Nonessential personnel are not required to report for the next three shifts.&#8221;</p>
<p>The  captain paused, the eyes of its crew on it. &#8220;You&#8217;ve all performed above  the standard for this, the most technically tricky part of this  mission. Still, the hardest work is yet to come:&#8221;</p>
<p>&#8220;Colonization.&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.coriolinus.net/2011/01/23/peaceful-resolution/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FW: Wikileaks data on Gov&#8217;t Computers &amp; Personal Owned</title>
		<link>http://www.coriolinus.net/2010/12/09/fw-wikileaks-data-on-govt-computers-personal-owned/</link>
		<comments>http://www.coriolinus.net/2010/12/09/fw-wikileaks-data-on-govt-computers-personal-owned/#comments</comments>
		<pubDate>Thu, 09 Dec 2010 10:09:09 +0000</pubDate>
		<dc:creator>coriolinus</dc:creator>
				<category><![CDATA[army]]></category>
		<category><![CDATA[what i learned at work today]]></category>
		<category><![CDATA[AV]]></category>
		<category><![CDATA[Caching]]></category>
		<category><![CDATA[Classified information]]></category>
		<category><![CDATA[Computer network security]]></category>
		<category><![CDATA[Computer security]]></category>
		<category><![CDATA[Department of Defense]]></category>
		<category><![CDATA[Employee-owned information systems]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Information assurance]]></category>
		<category><![CDATA[Information security]]></category>
		<category><![CDATA[Information sensitivity]]></category>
		<category><![CDATA[National security]]></category>
		<category><![CDATA[officer]]></category>
		<category><![CDATA[Oregon]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[storage media]]></category>
		<category><![CDATA[Technology/Internet]]></category>
		<category><![CDATA[Wikileaks]]></category>

		<guid isPermaLink="false">http://www.coriolinus.net/?p=3148</guid>
		<description><![CDATA[Received the following email regarding the official Army policy on Wikileaks, at least for my unit: From: [redacted] Sent: Wednesday, December 08, 2010 4:03 PM To: 2-2 AVN Staff; 2-2 ASLT COs; 2-2 ASLT 1SGs Subject: FW: Wikileaks data on Gov&#8217;t Computers &#38; Personal Owned Computers (UNCLASSIFIED) Importance: High ALCON, Below is the guidance for [...]]]></description>
			<content:encoded><![CDATA[<p>Received the following email regarding the official Army policy on Wikileaks, at least for my unit:</p>
<blockquote><p>From: [redacted]<br />
Sent: Wednesday, December 08, 2010 4:03 PM<br />
To: 2-2 AVN Staff; 2-2 ASLT COs; 2-2 ASLT 1SGs<br />
Subject: FW: Wikileaks data on Gov&#8217;t Computers &amp; Personal Owned<br />
Computers (UNCLASSIFIED)<br />
Importance: High</p>
<p>ALCON,</p>
<p>Below is the guidance for viewing material on Wikileaks&#8217; website.  To<br />
summarize the below, the Wikileaks website is not to be viewed on a<br />
Government computer, the information is still considered to be<br />
classified and any computer found containing classified information<br />
(i.e. information from Wikileaks) will confiscated and subsequently<br />
wiped.</p>
<p>If there are any questions please contact the S2 office.</p>
<p>v/r</p>
<p>[redacted]<br />
CPT, MI<br />
2-2 AASLT BN S2</p>
<p>&#8212;&#8211;Original Message&#8212;&#8211;<br />
From: [redacted]<br />
Sent: Wednesday, December 08, 2010 11:05 AM<br />
To: [redacted]<br />
Subject: Wikileaks data on Gov&#8217;t Computers &amp; Personal Owned Computers<br />
(UNCLASSIFIED)<br />
Importance: High</p>
<p>BLUF: Do not view released or published classified data found on the<br />
internet (Open Source) on unclassified Government systems OR on personal<br />
owed systems. (See caveats)</p>
<p>Department of the Army policies regarding the issue can be found in AR<br />
380-5 Information Security and AR 25-2 Information Assurance. All of the<br />
information is still considered classified. Although now that it can be<br />
found via open source, DOD still considers it as classified until<br />
further notice and should not be viewed or process on a designated<br />
unclassified government computer. Should a unclassified computer be<br />
found containing classified information, it will need to be isolated and<br />
wiped to remove the information.</p>
<p>As for viewing the information via personal computer, I have not seen<br />
any official message traffic preventing military personnel from viewing<br />
the information; however should a personal laptop be found with<br />
classified information on it, it will be confiscated with the potential<br />
for a 15-6 investigation based on the information on an unapproved<br />
system and improper storage.</p>
<p>AR 380-5, Chapter 10-2 a.</p>
<p>and</p>
<p>AR 25-2</p>
<p>4-31. Employee-owned information systems a. Prohibit the use of<br />
employee-owned information systems (EOISs) for classified or sensitive<br />
information.</p>
<p>AR 25-2 Chapter 3-3</p>
<p>c. General users. Use of Government IS and access to Government networks<br />
is a revocable privilege, not a right.</p>
<p>Users are the foundation of the DiD strategy and their actions affect<br />
the most vulnerable portion of the AEI. Users must have a favorable<br />
background investigation or hold a security clearance and access<br />
approvals commensurate with the level of information processed or<br />
available on the system. Users will-</p>
<p>(1) Comply with the command&#8217;s AUP for Government owned ISs and sign an<br />
AUP prior to or upon account activation.</p>
<p>(2) Complete initial and/or annual IA training as defined in the IA<br />
training BBP (<a href="https://informationassurance.us.army.mil/" target="_blank">https://informationassurance.us.army.mil</a><br />
&lt;<a href="https://informationassurance.us.army.mil/" target="_blank">https://informationassurance.us.army.mil/</a>&gt; ).</p>
<p>(3) Mark and safeguard files, output products, and storage media per the<br />
classification level and disseminate them only to individuals authorized<br />
to receive them with a valid need to know.</p>
<p>(4) Protect ISs and IS peripherals located in their respective areas in<br />
accordance with physical security and data protection requirements.</p>
<p>(5) Practice safe network and Internet operating principles and take no<br />
actions that threaten the integrity of the system or network.</p>
<p>(6) Obtain prior approval for the use of any media (for example, USB,<br />
CD-ROM, floppy disk) from the SA/ IAM.</p>
<p>(7) Scan all files, attachments, and media with an approved and<br />
installed AV product before opening a file or attachment or introducing<br />
media into the IS.</p>
<p>(8) Report all known or suspected spam, chain letters, and violations of<br />
acceptable use to the SA, IAM, or IASO.</p>
<p>(9) Immediately stop using an infected IS; and report suspicious,<br />
erratic, or anomalous IS operations, and missing or added files,<br />
services, or programs to the SA/IASO in accordance with local policy.</p>
<p>(10) Not disclose their individual account password or pass-phrase<br />
authenticators.</p>
<p>(11) Invoke password-protected screen locks on your workstation after<br />
not more than 15 minutes of non-use or inactivity.</p>
<p>(12) Logoff ISs at the end of each workday.</p>
<p>(13) Access only that data, control information, software, hardware, and<br />
firmware for which the user is authorized access.</p>
<p>(14) Access only that data that they are authorized or have a need to<br />
know.</p>
<p>Should someone have additional information regarding this issue please<br />
send to me so I can review and disseminate.</p>
<p>V/r,</p>
<p>CPT [redacted]<br />
BDE S2, 2 CAB, 2 ID</p></blockquote>
<p>I&#8217;ve redacted the names in the emails; what matters is that they came from the BDE and BN S2. For those of you not in the Army, the S2 is the information security office; the bit of each unit in charge of classification, and the officer who signs as S2 is the person in charge of information security for that unit.</p>
<p>The policy they lay out here actually seems pretty sane to me: even though they&#8217;re threatening confiscation and erasure of personal computers discovered to have classified data on them, it&#8217;s not like they&#8217;re proposing to audit everyone&#8217;s individual PC; they&#8217;re just reiterating already extant policy. As it stands, on your own time and internet you&#8217;re perfectly free to look at this; just turn on porn mode and prevent your browser from caching anything!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.coriolinus.net/2010/12/09/fw-wikileaks-data-on-govt-computers-personal-owned/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Heuristics Korean Drivers Should Learn</title>
		<link>http://www.coriolinus.net/2010/11/26/heuristics-korean-drivers-should-learn/</link>
		<comments>http://www.coriolinus.net/2010/11/26/heuristics-korean-drivers-should-learn/#comments</comments>
		<pubDate>Fri, 26 Nov 2010 11:42:59 +0000</pubDate>
		<dc:creator>coriolinus</dc:creator>
				<category><![CDATA[korea]]></category>
		<category><![CDATA[Driving]]></category>
		<category><![CDATA[Environment]]></category>
		<category><![CDATA[Korea]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Tourism]]></category>
		<category><![CDATA[Traffic]]></category>
		<category><![CDATA[Traffic law]]></category>
		<category><![CDATA[Travel]]></category>

		<guid isPermaLink="false">http://www.coriolinus.net/?p=3145</guid>
		<description><![CDATA[Pass, don&#8217;t pace Don&#8217;t use more than one lane at a time Don&#8217;t pass someone in the same lane as you Tend to the right lane when moving slowly Tend to the left lane when moving quickly It&#8217;s rude to swoop in front of a line of cars waiting for an exit If not waiting [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li>Pass, don&#8217;t pace</li>
<li>Don&#8217;t use more than one lane at a time</li>
<li>Don&#8217;t pass someone in the same lane as you</li>
<li>Tend to the right lane when moving slowly</li>
<li>Tend to the left lane when moving quickly</li>
<li>It&#8217;s rude to swoop in front of a line of cars waiting for an exit</li>
<li>If not waiting for an exit and your lane is slow and other lanes are fast, merge out to equalize the speeds</li>
<li>If there&#8217;s space ahead of you and you&#8217;re going less than the speed limit, accelerate</li>
<li>Use the turn signals when merging</li>
</ul>
<p>Of course, it&#8217;s only the fact that none of these rules are followed that makes driving like an aggressive maniac an efficient way to beat traffic: most places in the world, it just slows down everyone else without speeding you up appreciably. Still, I suspect that driving would be much less frustrating if a tad less fun if there were a situation other than anarchy on the roads here.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.coriolinus.net/2010/11/26/heuristics-korean-drivers-should-learn/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>The Sound of Cannon</title>
		<link>http://www.coriolinus.net/2010/11/10/the-sound-of-cannon/</link>
		<comments>http://www.coriolinus.net/2010/11/10/the-sound-of-cannon/#comments</comments>
		<pubDate>Wed, 10 Nov 2010 08:54:46 +0000</pubDate>
		<dc:creator>coriolinus</dc:creator>
				<category><![CDATA[army]]></category>
		<category><![CDATA[what i learned at work today]]></category>

		<guid isPermaLink="false">http://www.coriolinus.net/?p=3133</guid>
		<description><![CDATA[Those of you who follow me on twitter know that I recently described tank fire as making a crumping sound. Recently I had the opportunity to learn otherwise. Tank fire sounds like a bass drum the size of a stadium. It is louder than thunder. A kilometer away from the firing, it rattled the walls [...]]]></description>
			<content:encoded><![CDATA[<p>Those of you who follow me on twitter know that I recently described tank fire as making a crumping sound. Recently I had the opportunity to learn otherwise.</p>
<p>Tank fire sounds like a bass drum the size of a stadium. It is louder than thunder. A kilometer away from the firing, it rattled the walls of a building strongly enough that I felt the pressure wave passing while inside. It is the boom of the hammer of the gods pounding out a new mountain range.</p>
<p>Tank fire is loud enough that I could hear it inside a Black Hawk in flight, at least 3k away, over the noise of the engines and through the two layers of ear protection that are mandatory for flight crew.</p>
<p>None of this is exaggeration. I was deeply impressed by the sound of cannon.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.coriolinus.net/2010/11/10/the-sound-of-cannon/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Unfinished Story Fragment</title>
		<link>http://www.coriolinus.net/2010/11/06/unfinished-story-fragment/</link>
		<comments>http://www.coriolinus.net/2010/11/06/unfinished-story-fragment/#comments</comments>
		<pubDate>Sat, 06 Nov 2010 12:11:26 +0000</pubDate>
		<dc:creator>coriolinus</dc:creator>
				<category><![CDATA[random things]]></category>
		<category><![CDATA[writing]]></category>
		<category><![CDATA[Abara Adaba]]></category>
		<category><![CDATA[Entertainment]]></category>
		<category><![CDATA[Fiction]]></category>
		<category><![CDATA[Games]]></category>
		<category><![CDATA[Magic]]></category>
		<category><![CDATA[Magic of Dungeons & Dragons]]></category>
		<category><![CDATA[manager]]></category>
		<category><![CDATA[researcher]]></category>
		<category><![CDATA[United Kingdom]]></category>
		<category><![CDATA[Wizard]]></category>

		<guid isPermaLink="false">http://www.coriolinus.net/?p=3131</guid>
		<description><![CDATA[Once upon a time magic wasn&#8217;t very useful. Most people could touch it, bend it in at least a small way, but as a practical force it was too complicated, too arcane for most. The most successful magicians, the ones with towers of their own and actual incomes from the use of magic, were mildly [...]]]></description>
			<content:encoded><![CDATA[<p>Once upon a time magic wasn&#8217;t very useful. Most people could touch it, bend it in at least a small way, but as a practical force it was too complicated, too arcane for most. The most successful magicians, the ones with towers of their own and actual incomes from the use of magic, were mildly autistic types with the superhuman will and precision which to perform spells beyond cantrips without getting something wrong.</p>
<p>The will generated the power to accomplish the work of the spell. Magic, after all, is little more than human will imposed upon the world, forcing the world to change. The precision was required to actually perform the spell, which in casting looked something like an impressionistic dance: precise, twitchy movements accompanied by precise, arpeggaited nonsense syllables. None of it was actaully nonsense though: one twitch misplaced, one word mispronounced, and the whole spell was wrong. When dealing with the kind of spell the casting of which allowed a wizard to afford a tower, even the most trivial error was often fatal.</p>
<p>Incidentally, most people are familiar with Merlin, the last of the great casters of the old style. He was a genius, to be sure, and was instrumental in uniting Britain. However, in the popular imagination, his prowess has eclipsed his actual accomplishments. Few people remember that the lowest 12 stories of his tower were occupied by his support staff, who did most of the work of actually inventing the grand spells that he cast. He was the performer, and an exceptional one; he was the manager, and talented at it. They were just the writers, but without them he would have been a gun without bullets. All his most famous sorceries were ghostwritten.</p>
<p>The Djinni of Arabia, the faculty of the research university of al-Djinn, had been advancing the world&#8217;s understanding of magic for centuries. In an inversion of European norms, the faculty themselves were the researchers and writers; they used slaves to cast the spells they wrote. They&#8217;d discovered compulsion spells as early as the 9th century AD, but it took another four centuries before anyone figured out how to make them useful: on their face, they were more complicated and more trouble to cast than simply paying someone to do whatever work would have been compelled.</p>
<p>The key to the revolution wasn&#8217;t immediately obvious: an efficiency improvement which allowed anyone who could cast a cantrip to at least begin a compulsion. Even then, the meticulous precision with which the actions to be performed had to be described couldn&#8217;t make compulsion cost-efficient for industrial purposes. Upon this discovery Abara Adaba, the researcher in charge of the project, lost his grant and turned to other projects.</p>
<p>Two years later, he made history by casting on himself a compulsion to read a given magical text, memorize it, then perform it exactly as written. The resulting spell&#8211;one which endowed an ordinary carpet with flight&#8211;had been until that moment tremendously expensive: it generally killed dozens of slaves attempting to cast it before one managed to get it right. Adaba rode his magic carpet straight into the history texts as the innovator who introduced the Industrial Age.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.coriolinus.net/2010/11/06/unfinished-story-fragment/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Refreshing the Creativity Well</title>
		<link>http://www.coriolinus.net/2010/10/28/refreshing-the-creativity-well/</link>
		<comments>http://www.coriolinus.net/2010/10/28/refreshing-the-creativity-well/#comments</comments>
		<pubDate>Thu, 28 Oct 2010 19:57:32 +0000</pubDate>
		<dc:creator>coriolinus</dc:creator>
				<category><![CDATA[brain flotsam]]></category>
		<category><![CDATA[Cognition]]></category>
		<category><![CDATA[Creativity]]></category>
		<category><![CDATA[energy]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[mental energy]]></category>
		<category><![CDATA[Positive psychology]]></category>
		<category><![CDATA[Psychology]]></category>
		<category><![CDATA[United States]]></category>

		<guid isPermaLink="false">http://www.coriolinus.net/?p=3128</guid>
		<description><![CDATA[Vacations are wonderful times. It&#8217;s not just that I get to hang out with my wonderful friends and family. It&#8217;s not just that together, we head out and explore new and cool parts of cities and partake of fascinating events and activities. In addition to these, I get all the time in the world to [...]]]></description>
			<content:encoded><![CDATA[<p>Vacations are wonderful times. It&#8217;s not just that I get to hang out with my wonderful friends and family. It&#8217;s not just that together, we head out and explore new and cool parts of cities and partake of fascinating events and activities. In addition to these, I get all the time in the world to spend without expending a jot of brainpower on work.</p>
<p>That turns out to be surprisingly important. The routine while working settles down fairly quickly until even given the time and opportunity to head out and entertain myself, I simply don&#8217;t have the energy or will to do so. Living the drab life isn&#8217;t awful in any traditional sense&#8211;I still exercise, eat, sleep, work; strictly speaking I&#8217;m pretty high up in the hierarchy of needs&#8211;but it makes me feel more than usual like a machine. Without creativity, without the mental energy to exercise that creativity, I&#8217;m more or less going through the motions of life.</p>
<p>Vacations are the only time I know of in which I can refresh that well of creativity and start feeling human again. I could tell that it was working about halfway through when I started cleaning and cooking for the friends with whom I was staying. I&#8217;ve made, or had a major hand in the making of, cuisines from three continents (including General Tso&#8217;s Chicken, from scratch!), a bunch of writing, three or four toy programs (including a full implementation of Pong!), and a yet-to-be-launched website for a friend while out here. None of this, strictly, was required. All of it was a wonderful exercise in proving that I am in fact more than a machine which takes in money and churns out work. </p>
<p>The vacation is nearly over: I fly back tomorrow. I&#8217;ll have spent a ton of money and nearly all my accumulated leave in exchange for these 30 days in the US. </p>
<p>It was worth every bit.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.coriolinus.net/2010/10/28/refreshing-the-creativity-well/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Visibility</title>
		<link>http://www.coriolinus.net/2010/10/17/visibility/</link>
		<comments>http://www.coriolinus.net/2010/10/17/visibility/#comments</comments>
		<pubDate>Sun, 17 Oct 2010 14:39:06 +0000</pubDate>
		<dc:creator>coriolinus</dc:creator>
				<category><![CDATA[brain flotsam]]></category>
		<category><![CDATA[Environment]]></category>
		<category><![CDATA[Haze]]></category>
		<category><![CDATA[Korea]]></category>
		<category><![CDATA[New England]]></category>
		<category><![CDATA[Visibility]]></category>

		<guid isPermaLink="false">http://www.coriolinus.net/?p=3126</guid>
		<description><![CDATA[One consequence of flight school was learning the pilot&#8217;s two measures of weather: ceiling and visibility. Ceiling is the lowest level above which there are too many clouds to dodge. Visibility is the distance you can see through whatever atmospheric haze is present. In Korea, you could accurately simulate a day&#8217;s visibility as a function [...]]]></description>
			<content:encoded><![CDATA[<p>One consequence of flight school was learning the pilot&#8217;s two measures of weather: ceiling and visibility. Ceiling is the lowest level above which there are too many clouds to dodge. Visibility is the distance you can see through whatever atmospheric haze is present.</p>
<p>In Korea, you could accurately simulate a day&#8217;s visibility as a function of randint(0, 8), expressed in nautical miles. 2 is the minimum to fly a low-risk mission; 3 is required to be comfortable; 7 or more is considered unlimited visibility. That&#8217;s not really true, though: even on a day when the weather shop&#8217;s reporting unlimited vis, you can tell that visual acuity fades sharply toward the horizon. Unlimited visibility in Korea really just means that you can usually distinguish the horizon, as opposed to the region where the ground fades into the sky. </p>
<p>I never really thought about it, because Korea does get occasional days where visibility is truly unlimited. They are rare and perfect days of intense beauty. Since coming back to New England, though, I&#8217;ve had almost three weeks so far of such days uninterrupted. </p>
<p>The weather here is a treasure. It&#8217;d be a pity to leave it unremarked.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.coriolinus.net/2010/10/17/visibility/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 0.479 seconds -->
<!-- Cached page served by WP-Cache -->

