<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
  <id>http://codeoptimism.net/blog/</id>
  <title>Code Optimism</title>
  <updated>2009-11-11T04:53:23+00:00</updated>
  <link href="http://codeoptimism.net/blog/" />
  
  <subtitle>Some code, plenty of optimism. ;-)</subtitle>
  <author>
    <name>Christopher Galpin</name>
  </author>
  <generator uri="http://dotnetblogengine.net/" version="1.0.0.0">BlogEngine.Net Syndication Generator</generator>
  <blogChannel:blogRoll>http://codeoptimism.net/blog/opml.axd</blogChannel:blogRoll>
  <blogChannel:blink>http://www.dotnetblogengine.net/syndication.axd</blogChannel:blink>
  <dc:creator>Christopher Galpin</dc:creator>
  <dc:description>Some code, plenty of optimism. ;-)</dc:description>
  <dc:language>en-GB</dc:language>
  <dc:title>Code Optimism</dc:title>
  <geo:lat>0.000000</geo:lat>
  <geo:long>0.000000</geo:long>
  <link rel="self" href="http://feeds.feedburner.com/codeoptimism" type="application/atom+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry>
    <id>http://codeoptimism.net/blog/post/2009/11/10/When-messy-is-meticulous-cleaning-clutter-like-Gmail.aspx</id>
    <title>When messy is meticulous: cleaning clutter like Gmail.</title>
    <updated>2009-11-11T04:51:00+00:00</updated>
    <link rel="self" href="http://codeoptimism.net/blog/post.aspx?id=5d5bf8e9-7483-4627-9e8e-29bce619ccf2" />
    <link href="http://feedproxy.google.com/~r/codeoptimism/~3/qoYGpXwmVfg/When-messy-is-meticulous-cleaning-clutter-like-Gmail.aspx" />
    <author>
      <name>Christopher Galpin</name>
    </author>
    <summary type="html">&lt;p&gt;When it comes to cleaning a house, or a room, few are quick to consider the strategy of &lt;em&gt;throwing everything together&lt;/em&gt;, or at least they don't consider it a &lt;strong&gt;strategy&lt;/strong&gt;.
&lt;/p&gt;
&lt;p&gt;That's too bad, because frequently it's &lt;em&gt;exactly&lt;/em&gt; the thing to do. Too often I think, we plod through the task of organization without a &lt;em&gt;realistic&lt;/em&gt; regard for impact on time. Programmers can see things differently. Consider organization as a function of &lt;strong&gt;time spent&lt;/strong&gt; vs. &lt;strong&gt;time saved&lt;/strong&gt;.
&lt;/p&gt;
&lt;p&gt;A hundred labels on a hundred envelopes for files you'll only access a few times is a colossal waste of time, despite the deceptively sly title of "&lt;cite&gt;organizing&lt;/cite&gt;". In precisely the same manner, tossing together and tucking out of sight odds and ends you seldom use is fantastically practical.
&lt;/p&gt;
&lt;p&gt;Go ahead and gather up all of the clutter in your workspace! In your home! At your office, and wherever else you spend your time. Stick it all together haphazardly, in clear containers perhaps. Yes you may need to hunt, but rarely - that's why it's clutter. Furthermore it's together, and your workspace is clear of all but items relevant to your recent goals, enhancing your focus.
&lt;/p&gt;
&lt;p&gt;Often we're at a loss with what to do with our stuff, it's not worthless or we'd throw it away, it's unique or miscellaneous or we'd know where to put it. It could be organized or filed but it's awaiting our input. Throw it together! Sweep it into a box! You need it, you want it, but you haven't gotten to it, you don't want to see it and it's not immediately relevant. Instead of agonizing over organizing, reallocate your time, spend it on searching and not on sorting. Though inefficient in the long run, there will be no long run, as you search for an item to &lt;em&gt;deal&lt;/em&gt; with it.
&lt;/p&gt;
&lt;p&gt;&lt;img src="http://codeoptimism.net/blog/image.axd?picture=2009%2f11%2f107313_matter.jpg" alt="Gmail envelope" title="Gmail envelope" /&gt;
&lt;/p&gt;
&lt;p&gt;Obligatory technology tie-in: Everything has parallels in technology (and everything else), consider GMail's "&lt;cite&gt;don't sort, search&lt;/cite&gt;". User interfaces are again similar. Items of frequent use and relevance are close by, and commands shouldn't be buried in otherwise empty multi-tiered menus in an inconvenient obtuse attempt at organization.
&lt;/p&gt;
&lt;p&gt;The user interface of your life: you, where you are, and the items around you that help you reach your goals - could use metrics of its own. Without mental measurement, are you sure you're building a time saver, or wasting time? &lt;strong&gt;Are you sorting when you should be searching?&lt;/strong&gt;
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/codeoptimism/~4/qoYGpXwmVfg" height="1" width="1"/&gt;</summary>
    <published>2009-11-11T04:51:00+00:00</published>
    <link rel="related" href="http://codeoptimism.net/blog/post/2009/11/10/When-messy-is-meticulous-cleaning-clutter-like-Gmail.aspx#comment" />
    <dc:publisher>Christopher Galpin</dc:publisher>
    <pingback:server>http://codeoptimism.net/blog/pingback.axd</pingback:server>
    <pingback:target>http://codeoptimism.net/blog/post.aspx?id=5d5bf8e9-7483-4627-9e8e-29bce619ccf2</pingback:target>
    <slash:comments>0</slash:comments>
    <trackback:ping>http://codeoptimism.net/blog/trackback.axd?id=5d5bf8e9-7483-4627-9e8e-29bce619ccf2</trackback:ping>
    <wfw:comment>http://codeoptimism.net/blog/post/2009/11/10/When-messy-is-meticulous-cleaning-clutter-like-Gmail.aspx#comment</wfw:comment>
    <wfw:commentRss>http://codeoptimism.net/blog/syndication.axd?post=5d5bf8e9-7483-4627-9e8e-29bce619ccf2</wfw:commentRss>
  <feedburner:origLink>http://codeoptimism.net/blog/post/2009/11/10/When-messy-is-meticulous-cleaning-clutter-like-Gmail.aspx</feedburner:origLink></entry>
  <entry>
    <id>http://codeoptimism.net/blog/post/2009/11/07/A-programmers-ethical-dilemma.aspx</id>
    <title>A programmer's ethical dilemma.</title>
    <updated>2009-11-07T16:18:00+00:00</updated>
    <link rel="self" href="http://codeoptimism.net/blog/post.aspx?id=f1de143e-7e26-4d2e-9495-086a6fbaefbc" />
    <link href="http://feedproxy.google.com/~r/codeoptimism/~3/AkUQxy8hRyQ/A-programmers-ethical-dilemma.aspx" />
    <author>
      <name>Christopher Galpin</name>
    </author>
    <summary type="html">&lt;p&gt;Not everything is black and white, not even when it comes to software programming. Way back around April 24th I asked the following question on Q&amp;A for coders site &lt;a href="http://stackoverflow.com/"&gt;Stack Overflow&lt;/a&gt;:
&lt;blockquote&gt;&lt;a href="http://stackoverflow.com/questions/784617/can-it-be-morally-defensible-to-release-a-program-which-games-an-mmorpg"&gt;Can it be morally defensible to release a program which games an MMORPG?&lt;/a&gt;
&lt;/blockquote&gt;&lt;/p&gt;
&lt;p&gt;I had written some code for a macro framework to automate actions in an up and coming MMORPG (&lt;a href="http://codeoptimism.net/blog/post/2008/12/31/Gaming-the-game-Cheat-Engine-AutoHotkey-and-Jedi-Academy.aspx"&gt;something I enjoy&lt;/a&gt;), and I wanted to see if the community could contribute any &lt;strong&gt;constructive&lt;/strong&gt; purpose for it, or if it was strictly evil™. Unfortunately I had my question worded &lt;cite&gt;"Is it"&lt;/cite&gt; rather than &lt;cite&gt;"Can it be"&lt;/cite&gt; when 99% of the answers struck, taking several answers quite awry. Still the input on commercialization was thorough, and the overall consensus on releasing a program of this nature? &lt;em&gt;Bad thing&lt;/em&gt;.
&lt;/p&gt;
&lt;p&gt;In fact given the newness of the MMORPG I could only conceive of one scenario that &lt;em&gt;could&lt;/em&gt; be morally defensible: A preemptive strike, a &lt;strong&gt;free, public&lt;/strong&gt; release to preclude a worse one down the road.
&lt;/p&gt;
&lt;p&gt;Of course then you realize that this has all the ethical implication of &lt;em&gt;pulling the trigger yourself&lt;/em&gt;. You may believe with certainty that an uneven playing field is &lt;em&gt;inevitable&lt;/em&gt;, but can that itself justify action?
&lt;/p&gt;
&lt;p&gt;It may be very prudent to operate &lt;em&gt;within&lt;/em&gt; a system of belief to affect change. Gentle nudges, progress at the pace of prevalent perception (I'm a fan of alliteration). Nuclear disarmament before cessation. Fight to end fighting!
&lt;/p&gt;
&lt;p&gt;It's a fairly rational approach, and I wasn't sure if there could be any other, until I encountered this:
&lt;blockquote&gt;"We need to be the change we wish to see in the world." - &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Mahatma_Gandhi"&gt;Mahatma Gandhi&lt;/a&gt;&lt;/em&gt;
&lt;/blockquote&gt;
&lt;/p&gt;
&lt;p&gt;Now there's an interesting concept. Being the change, I would not harm another in any circumstance - and quite obviously if everyone shared this conviction there would be no violence. Yet everyone does not, and more than a few people would reject my idealism, respond with belligerence to my priorities. It's understandable.
&lt;/p&gt;
&lt;p&gt;&lt;img src="http://upload.wikimedia.org/wikipedia/commons/c/c3/Gandhi_Juhu_May1944.jpg" alt="Gandhi" height="50%"/&gt;
&lt;/p&gt;
&lt;p&gt;Still I find this latter approach the most resonant &lt;em&gt;personally&lt;/em&gt;, and observing history, it appears to have great strength. I'm not yet sure what to do with my code, but I chose not to release it preemptively, I chose to &lt;strong&gt;be the change I wished to see in the world&lt;/strong&gt;. What's your approach?
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/codeoptimism/~4/AkUQxy8hRyQ" height="1" width="1"/&gt;</summary>
    <published>2009-11-07T16:18:00+00:00</published>
    <link rel="related" href="http://codeoptimism.net/blog/post/2009/11/07/A-programmers-ethical-dilemma.aspx#comment" />
    <category term="General" />
    <dc:publisher>Christopher Galpin</dc:publisher>
    <dc:description>Not even programmers are free from ethical choices, nor is the intellectual approach always the correct one. Consider Gandhi's advice.</dc:description>
    <pingback:server>http://codeoptimism.net/blog/pingback.axd</pingback:server>
    <pingback:target>http://codeoptimism.net/blog/post.aspx?id=f1de143e-7e26-4d2e-9495-086a6fbaefbc</pingback:target>
    <slash:comments>0</slash:comments>
    <trackback:ping>http://codeoptimism.net/blog/trackback.axd?id=f1de143e-7e26-4d2e-9495-086a6fbaefbc</trackback:ping>
    <wfw:comment>http://codeoptimism.net/blog/post/2009/11/07/A-programmers-ethical-dilemma.aspx#comment</wfw:comment>
    <wfw:commentRss>http://codeoptimism.net/blog/syndication.axd?post=f1de143e-7e26-4d2e-9495-086a6fbaefbc</wfw:commentRss>
  <feedburner:origLink>http://codeoptimism.net/blog/post/2009/11/07/A-programmers-ethical-dilemma.aspx</feedburner:origLink></entry>
  <entry>
    <id>http://codeoptimism.net/blog/post/2009/11/03/Breaking-free-from-sparkle-before-speed-with-Windows-Mobile.aspx</id>
    <title>Breaking free from "sparkle before speed" with Windows Mobile</title>
    <updated>2009-11-03T15:16:00+00:00</updated>
    <link rel="self" href="http://codeoptimism.net/blog/post.aspx?id=74abdded-44db-4279-9086-93b687ce7078" />
    <link href="http://feedproxy.google.com/~r/codeoptimism/~3/O3Gn-HhzG04/Breaking-free-from-sparkle-before-speed-with-Windows-Mobile.aspx" />
    <author>
      <name>Christopher Galpin</name>
    </author>
    <summary type="html">&lt;p&gt;As a Windows user and a programmer it's not a huge surprise that I have a &lt;cite&gt;Windows Mobile&lt;/cite&gt; cellular phone, also AT&amp;T (iPhone) hasn't quite established service in my area yet.
&lt;/p&gt;
&lt;p&gt;It's true that at first blush Windows Mobile offers an inferior experience. A &lt;strong&gt;stylus&lt;/strong&gt;?! You must be joking. Scrollbars and miniature controls. Can you be efficient, have fun, keep up with the pace of life? Not so much.
&lt;/p&gt;
&lt;p&gt;Can you &lt;em&gt;do&lt;/em&gt; stuff though, if you try really hard and take the time? Yeah, and just about &lt;strong&gt;everything&lt;/strong&gt;. So much in fact, why, wait just a minute... you could even fix that horrible interface!
&lt;/p&gt;
&lt;p&gt;I'm not the first one to make &lt;em&gt;that&lt;/em&gt; realization, there is a large and thriving Pocket PC community for both &lt;a href="http://forum.xda-developers.com/"&gt;GSM&lt;/a&gt; and &lt;a href="http://forum.ppcgeeks.com/"&gt;CDMA&lt;/a&gt; hardware.
&lt;/p&gt;
&lt;p&gt;Even among enthusiasts though I'm not &lt;em&gt;quite&lt;/em&gt; sure they understand &lt;em&gt;what they really want&lt;/em&gt;. "I customized this with a focus on speed and aesthetics." Okay, maybe a few more CPU cycles, but the animated transition ("aesthetics") between each of the phone's general functions is really cramping its &lt;em&gt;speed&lt;/em&gt;, or are you not counting that? Well you should be, it relates to how fast you reach your goal doesn't it?
&lt;/p&gt;
&lt;p&gt;I'd much rather have my powerhouse of a phone working &lt;em&gt;instantaneously&lt;/em&gt; than looking pretty. This isn't the old &lt;cite&gt;classic Windows&lt;/cite&gt; vs. &lt;cite&gt;modern Windows&lt;/cite&gt; comparison, because modern versions have the available hardware to run &lt;strong&gt;just as quickly&lt;/strong&gt; while looking beautiful.
&lt;/p&gt;
&lt;p&gt;Do phones have the same luxury? &lt;strong&gt;Absolutely not.&lt;/strong&gt; Yet what keeps occurring? Faster hardware, therefore... faster phone? No! Newer glitzy animations? Yes! It's great that we can have 3D support, but let's play with it when it &lt;em&gt;doesn't&lt;/em&gt; have a noticeable impact upon performance.
&lt;/p&gt;
&lt;p&gt;&lt;img src="http://codeoptimism.net/blog/image.axd?picture=2009%2f11%2fTF3D+email.png" alt="TouchFLO 3D Email tab" /&gt;
&lt;/p&gt;
&lt;p&gt;It reminds me of a conversation I once had with my dad:
&lt;blockquote&gt;"Hey dad, I upgraded your operating system!"&lt;br/&gt;
"Oh really? So it should run faster then?"&lt;br/&gt;
"Well..."
&lt;/blockquote&gt;&lt;/p&gt;
&lt;p&gt;Exactly. Of course this is fine when hardware is upgradeable, but the cell phone is very different, an existing paradigm is being transfered where it does not apply.
&lt;/p&gt;
&lt;p&gt;I hear the argument that it's what your average cell phone toting texting teenager wants, the demands of the market, but I &lt;strong&gt;disagree&lt;/strong&gt;. Give them a phone which responds instantly and ask which they'd truly prefer, I have a suspicion even that demographic would capitulate. (Provided the phone can do interesting things in the first place.)
&lt;/p&gt;
&lt;p&gt;Of course &lt;strong&gt;I&lt;/strong&gt; know what I want, and have the capability to achieve it. I'm right at home with Windows Mobile. It may take me day after day of installation and configuration - a deep flaw - to have a a device both incredibly powerful and highly usable but I get there, and I can enjoy it. A &lt;a href="http://forum.xda-developers.com/showthread.php?t=554240"&gt;couple&lt;/a&gt; &lt;a href="http://ae.inc.ru/aebplus.php"&gt;applications&lt;/a&gt; to achieve &lt;em&gt;nearly full control&lt;/em&gt; of every hard button and strong consideration given to &lt;a href="http://codeoptimism.net/blog/post/2009/10/31/User-interfaces-its-all-about-minimal-user-interaction.aspx"&gt;minimizing required input&lt;/a&gt; and I've got a device which doesn't rival the iPhone, but blows it out of the water. Well except for that awesome capacitive touchscreen, Apple's really got me there.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/codeoptimism/~4/O3Gn-HhzG04" height="1" width="1"/&gt;</summary>
    <published>2009-11-03T15:16:00+00:00</published>
    <link rel="related" href="http://codeoptimism.net/blog/post/2009/11/03/Breaking-free-from-sparkle-before-speed-with-Windows-Mobile.aspx#comment" />
    <category term="General" />
    <dc:publisher>Christopher Galpin</dc:publisher>
    <dc:description>Comments on cell phone interfaces and performance, and Windows Mobile customization.</dc:description>
    <pingback:server>http://codeoptimism.net/blog/pingback.axd</pingback:server>
    <pingback:target>http://codeoptimism.net/blog/post.aspx?id=74abdded-44db-4279-9086-93b687ce7078</pingback:target>
    <slash:comments>0</slash:comments>
    <trackback:ping>http://codeoptimism.net/blog/trackback.axd?id=74abdded-44db-4279-9086-93b687ce7078</trackback:ping>
    <wfw:comment>http://codeoptimism.net/blog/post/2009/11/03/Breaking-free-from-sparkle-before-speed-with-Windows-Mobile.aspx#comment</wfw:comment>
    <wfw:commentRss>http://codeoptimism.net/blog/syndication.axd?post=74abdded-44db-4279-9086-93b687ce7078</wfw:commentRss>
  <feedburner:origLink>http://codeoptimism.net/blog/post/2009/11/03/Breaking-free-from-sparkle-before-speed-with-Windows-Mobile.aspx</feedburner:origLink></entry>
  <entry>
    <id>http://codeoptimism.net/blog/post/2009/10/31/User-interfaces-its-all-about-minimal-user-interaction.aspx</id>
    <title>User interfaces... it's all about minimal user interaction.</title>
    <updated>2009-10-31T06:15:00+00:00</updated>
    <link rel="self" href="http://codeoptimism.net/blog/post.aspx?id=c0fc6d74-1c0a-43eb-8fef-8b54f1df5bdb" />
    <link href="http://feedproxy.google.com/~r/codeoptimism/~3/dxq-JOB1x58/User-interfaces-its-all-about-minimal-user-interaction.aspx" />
    <author>
      <name>Christopher Galpin</name>
    </author>
    <summary type="html">&lt;p&gt;
Designing user interfaces. It's not that hard.&lt;br /&gt;
Okay, it's really hard, but two central ideas strike me:
&lt;/p&gt;

&lt;p&gt;
&lt;ol&gt;
&lt;li&gt;Users like to do things quickly, and if you're quick you can be efficient.
&lt;li&gt;The more clicks or button presses it takes to accomplish what you want, the slower it goes!
&lt;/ol&gt;
&lt;/p&gt;

&lt;p&gt;
Now complexity is its own bane - and it &lt;em&gt;can&lt;/em&gt; be a worse one, but it's all about &lt;strong&gt;balance&lt;/strong&gt;!
&lt;/p&gt;

&lt;p&gt;
Ideally your most used functions should be within one key press / mouse click, lesser ones two, three, and so on, adding organization as you go.
&lt;/p&gt;

&lt;p&gt;
I don't think this is very difficult to understand, which is why cell phone interfaces can be particularly frustrating. 
&lt;/p&gt;

&lt;p&gt;
What phone applications are the most time sensitive? &lt;em&gt;Phone, Camera, MusicID, flashlight&lt;/em&gt;&lt;br /&gt;
&lt;strong&gt;Put them on hard buttons!&lt;/strong&gt;, or at least a hard button that launches a wide menu which makes these options immediately selectable, but remember that when you go from one to two buttons you're &lt;strong&gt;doubling&lt;/strong&gt; the amount of actions required, the most significant a one value increment can be.
&lt;/p&gt;

&lt;p&gt;
Just keeping these points in mind is enough for much lauded user interface innovations to be &lt;strong&gt;obvious&lt;/strong&gt;. Just take a look at &lt;a href="http://en.wikipedia.org/wiki/Windows_7#New_and_changed_features"&gt;new features of Windows 7&lt;/a&gt; and you'll see what I mean. It doesn't take a company like Microsoft to come up with these things.
&lt;/p&gt;

&lt;p&gt;
A while back I made an effort to emphasis the importance of minimal user intervention in relation to &lt;a href="http://codeoptimism.net/blog/post/2007/11/17/General-productivity-enhancements-for-Vista-and-XP-Taskbar.aspx"&gt;Vista and XP's taskbar&lt;/a&gt;, and it's interesting to compare and contrast those supplemental 3rd party tools with the Windows 7 taskbar. 
&lt;/p&gt;

&lt;p&gt;
Though I didn't mention it in that post, I had also written an &lt;a href="http://www.autohotkey.com/"&gt;AutoHotkey&lt;/a&gt; script to accomplish the Apple-esque (and now Windows 7) task of focusing an application's window if one existed, and otherwise launching a new instance of the program.
&lt;pre&gt;
#NoTrayIcon

programPath = %1%
launchState = %2%
winTitle = %3%
excludeText = %4%

if 0 = 1	; left side is always variable
{
	Loop %programPath%
		fileName := A_LoopFileName
	Process Exist, %fileName%
	processId := ErrorLevel

	if (processId)
		winTitle = ahk_pid %processId%
}

SetTitleMatchMode RegEx
WinGet windowUID, ID, %winTitle%,, %excludeText%
if %windowUID%
	WinActivate ahk_id %windowUID%
else
{
	; replace commas with escaped commas
	StringReplace programPath, programPath, `,, ```,, All
	Run %programPath%,, %launchState%
}
&lt;/pre&gt;
&lt;/p&gt;

&lt;p&gt;
Compiled as &lt;a href="http://codeoptimism.net/projects/AutoHotkey/launchOneInstance.exe"&gt;launchOneInstance.exe&lt;/a&gt;&lt;/cite&gt; you would assign your launch/focus shortcut as follows:
&lt;div class="blockcode"&gt;
"C:\path\to\launchOneInstance.exe" "C:\path\to\program.exe" Max "Program Window Title"
&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;cite&gt;Max/Min/Hide&lt;/cite&gt; or simply "" are fine for the launch state parameter. 
&lt;/p&gt;

&lt;p&gt;
Windows 7 is a wonderful experience when it comes to application launching, but cellular phones remain horrible, including Windows Mobile devices. Manufactures and carriers have their own influence, but even Pocket PC (Windows Mobile) &lt;a href="http://forum.xda-developers.com"&gt;user&lt;/a&gt; &lt;a href="http://forum.ppcgeeks.com"&gt;customizations&lt;/a&gt; seem to miss the mark again and again.
&lt;/p&gt;

&lt;p&gt;
Minimal interaction, guys! &lt;strong&gt;&lt;em&gt;Minimal interaction!&lt;/em&gt;&lt;/strong&gt; Why pull up the task manager to check for an app when you can launch/focus it from the start menu in equal or less clicks? Why not launch the start menu from a hard button for easy access even within full screen applications? Add an extra column to that programs list if it fits easily, we don't want no damn scrollbars!
&lt;/p&gt;

&lt;p&gt;
So not only should users not be required to think, but the less they have to do at all, the better. ;)
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/codeoptimism/~4/dxq-JOB1x58" height="1" width="1"/&gt;</summary>
    <published>2009-10-31T06:15:00+00:00</published>
    <link rel="related" href="http://codeoptimism.net/blog/post/2009/10/31/User-interfaces-its-all-about-minimal-user-interaction.aspx#comment" />
    <category term="General" />
    <category term="Projects" />
    <dc:publisher>Christopher Galpin</dc:publisher>
    <dc:description>A quick glance at how minimizing user interaction provides more usable Windows Mobile and XP/Vista/Win7 taskbar interfaces.</dc:description>
    <pingback:server>http://codeoptimism.net/blog/pingback.axd</pingback:server>
    <pingback:target>http://codeoptimism.net/blog/post.aspx?id=c0fc6d74-1c0a-43eb-8fef-8b54f1df5bdb</pingback:target>
    <slash:comments>1</slash:comments>
    <trackback:ping>http://codeoptimism.net/blog/trackback.axd?id=c0fc6d74-1c0a-43eb-8fef-8b54f1df5bdb</trackback:ping>
    <wfw:comment>http://codeoptimism.net/blog/post/2009/10/31/User-interfaces-its-all-about-minimal-user-interaction.aspx#comment</wfw:comment>
    <wfw:commentRss>http://codeoptimism.net/blog/syndication.axd?post=c0fc6d74-1c0a-43eb-8fef-8b54f1df5bdb</wfw:commentRss>
  <feedburner:origLink>http://codeoptimism.net/blog/post/2009/10/31/User-interfaces-its-all-about-minimal-user-interaction.aspx</feedburner:origLink></entry>
  <entry>
    <id>http://codeoptimism.net/blog/post/2009/10/19/Defeating-manual-spam-or-damn-dastardly-conniving-commenters.aspx</id>
    <title>Defeating manual spam, or damn dastardly conniving commenters!</title>
    <updated>2009-10-19T21:17:00+00:00</updated>
    <link rel="self" href="http://codeoptimism.net/blog/post.aspx?id=b60cc1cb-7556-41f1-a17a-23ff26bb3de5" />
    <link href="http://feedproxy.google.com/~r/codeoptimism/~3/pXQYIZ6LoHA/Defeating-manual-spam-or-damn-dastardly-conniving-commenters.aspx" />
    <author>
      <name>Christopher Galpin</name>
    </author>
    <summary type="html">&lt;p&gt;I'm not especially keen on another meta-blog post, but the issue came up in email recently and I've this penchant for expounding at some length on interesting subjects, even in the &lt;a href="http://www.codinghorror.com/blog/archives/001191.html" title="Is Email = Efail?"&gt;least suitable medium&lt;/a&gt;, target audience: one. Fortunately I have a blog.&lt;/p&gt;

&lt;p&gt;Not so fortunately, manually entered spam has been an issue. When you &lt;a href="http://codeoptimism.net/blog/post/2009/01/30/Implementing-a-naive-captcha-in-BlogEngineNET.aspx"&gt;optimize for humans&lt;/a&gt; you regrettably include manual spammers.&lt;/p&gt;

&lt;p&gt;Such spam is surprisingly devious, but here are some common characteristics:
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;C&lt;/strong&gt;omplimentary&lt;/em&gt;: "Wow this is a great post!"
&lt;li&gt;&lt;em&gt;&lt;strong&gt;R&lt;/strong&gt;elative&lt;/em&gt;: "I don't like spam."
&lt;li&gt;&lt;em&gt;&lt;strong&gt;U&lt;/strong&gt;nconstructive&lt;/em&gt;: Adds nothing of value.
&lt;li&gt;&lt;em&gt;&lt;strong&gt;D&lt;/strong&gt;isingenuous&lt;/em&gt;: "I appreciate it because..."
&lt;li&gt;&lt;em&gt;&lt;strong&gt;E&lt;/strong&gt;rroneous&lt;/em&gt;: "...this should keep spam out of my email inbox."
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;See! Manual spam is recognizably &lt;strong&gt;crude&lt;/strong&gt;.
&lt;/p&gt;
&lt;p&gt;&lt;img src="http://codeoptimism.net/images/2009_10_19/ego%20spam.png" alt="ego spam" title="ego spam"/&gt;&lt;/p&gt;
&lt;p&gt;
Of course the payload is the link, and they aren't all &lt;em&gt;blatant&lt;/em&gt; advertisements, but even sites which &lt;em&gt;might&lt;/em&gt; appear legit may advertise themselves unscrupulously. As expected they will lack real content.
&lt;/p&gt;
&lt;p&gt;
Here with BlogEngine.NET the payload is put in the &lt;cite&gt;website&lt;/cite&gt; field and not the body (the &lt;cite&gt;name&lt;/cite&gt; field is the link text). Neither asking for &lt;cite&gt;&lt;strong&gt;your&lt;/strong&gt; name&lt;/cite&gt; nor indicating the website field is ignored by search engines made a difference.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codeoptimism.net/blog/post/2009/05/15/Akismet-support-for-BlogEngineNET.aspx"&gt;&lt;strong&gt;Akismet&lt;/strong&gt;&lt;/a&gt; did however, and thus far I've had zero &lt;a href="http://en.wikipedia.org/wiki/Type_I_and_type_II_errors#Spam_filtering"&gt;false positives&lt;/a&gt;, only false negatives. Some have been crafted so cleverly as to be very close, but after investigating I've concurred. If Akismet marks a unique (but crude) comment as spam I expect the link to be unsatisfactory given that it's the defining constant. 
&lt;/p&gt;
&lt;p&gt;
My recent addition of &lt;a href="http://www.keithratliff.com/post/adding-recaptcha-to-blogenginenet.aspx"&gt;&lt;strong&gt;reCaptcha&lt;/strong&gt;&lt;/a&gt; seems to have made the largest difference. Most likely because there's now some difficulty involved. I actually feel pretty good about this because the duality of distinguishing &lt;a href="http://en.wikipedia.org/wiki/Turing_test"&gt;computers from humans&lt;/a&gt; while simultaneously &lt;a href="http://video.google.com/videoplay?docid=-8246463980976635143#" title="Human Computation"&gt;solving complex problems&lt;/a&gt; that &lt;a href="http://www.youtube.com/watch?v=Aszl5avDtek" title="Human Computation - ReCaptcha"&gt;computers do poorly&lt;/a&gt; absolutely fascinates me. Given that solving my captcha is now no longer a &lt;em&gt;technical&lt;/em&gt; waste of time, I know some readers will begin to &lt;em&gt;feel&lt;/em&gt; that it isn't as well. ;)&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/codeoptimism/~4/pXQYIZ6LoHA" height="1" width="1"/&gt;</summary>
    <published>2009-10-19T21:17:00+00:00</published>
    <link rel="related" href="http://codeoptimism.net/blog/post/2009/10/19/Defeating-manual-spam-or-damn-dastardly-conniving-commenters.aspx#comment" />
    <category term="General" />
    <dc:publisher>Christopher Galpin</dc:publisher>
    <dc:description>Learn to recognize manual spam and leverage tools such as Akismet and reCaptcha. You can be victorious!</dc:description>
    <pingback:server>http://codeoptimism.net/blog/pingback.axd</pingback:server>
    <pingback:target>http://codeoptimism.net/blog/post.aspx?id=b60cc1cb-7556-41f1-a17a-23ff26bb3de5</pingback:target>
    <slash:comments>0</slash:comments>
    <trackback:ping>http://codeoptimism.net/blog/trackback.axd?id=b60cc1cb-7556-41f1-a17a-23ff26bb3de5</trackback:ping>
    <wfw:comment>http://codeoptimism.net/blog/post/2009/10/19/Defeating-manual-spam-or-damn-dastardly-conniving-commenters.aspx#comment</wfw:comment>
    <wfw:commentRss>http://codeoptimism.net/blog/syndication.axd?post=b60cc1cb-7556-41f1-a17a-23ff26bb3de5</wfw:commentRss>
  <feedburner:origLink>http://codeoptimism.net/blog/post/2009/10/19/Defeating-manual-spam-or-damn-dastardly-conniving-commenters.aspx</feedburner:origLink></entry>
  <entry>
    <id>http://codeoptimism.net/blog/post/2009/10/09/When-you-know-youre-coding-in-the-wrong-language.aspx</id>
    <title>When you know you're coding in the wrong language.</title>
    <updated>2009-10-09T23:36:00+00:00</updated>
    <link rel="self" href="http://codeoptimism.net/blog/post.aspx?id=d906a8ca-9132-4eec-94fd-78f77e2efcc6" />
    <link href="http://feedproxy.google.com/~r/codeoptimism/~3/uxgFrOqxfj0/When-you-know-youre-coding-in-the-wrong-language.aspx" />
    <author>
      <name>Christopher Galpin</name>
    </author>
    <summary type="html">&lt;p&gt;
    &lt;a href="http://sphereserver.net/"&gt;SphereServer&lt;/a&gt; is/was a fantastically fun piece
    of emulation software for the old and beloved &lt;a href="http://en.wikipedia.org/wiki/Ultima_Online"&gt;
        Ultima Online&lt;/a&gt; MMORPG, from back in the day before emulation had even a mention
    in their End User License Agreement. I knew it originally as TUS (The Ultimate Server).&lt;/p&gt;
&lt;p&gt;
    TUS was actually some of my &lt;strong&gt;&lt;em&gt;first, ever&lt;/em&gt;&lt;/strong&gt; programming, and
    SphereServer was my stomping ground for a &lt;em&gt;long&lt;/em&gt; time, where in the early
    days I was extremely active. I've been out of that loop for some time now, but Sphere
    doesn't exactly have a tight &lt;a href="http://prerelease.sphere.torfo.org/index.php"&gt;
        release schedule&lt;/a&gt; and in all likelihood these experiences still apply - or
    they may not, I would be interested in hearing. For now I will speak from back a
    few years.&lt;/p&gt;
&lt;p&gt;
    SphereServer's scripting language is &lt;em&gt;interpreted&lt;/em&gt;, which in this case meant
    slow. Now I hear the argument, "Well so what? It was fast enough." And my response
    is, actually, &lt;strong&gt;no, it was &lt;em&gt;too&lt;/em&gt; slow&lt;/strong&gt; (and may still be).&lt;/p&gt;
&lt;p&gt;
    Now if all you were interested in was tweaking loot tables, adjusting skill gain,
    invisibility cloaks and &lt;a href="http://en.wikipedia.org/wiki/Vorpal_sword"&gt;vorpal swords&lt;/a&gt;,
    then you didn't have much of a problem. If on the other hand you were creating complex
    housing, support, communication, battle and magic systems - like I was ("&lt;a href="http://www.sphereserver.net/index.php?showuser=5408"&gt;Swindler&lt;/a&gt;")
    - then more than likely you were using the wrong language in the wrong software.&lt;/p&gt;
&lt;p&gt;
    In a contemporary programming language you're afforded the benefit of coding for
    readability, because many optimizations are micro-optimizations and simply &lt;a href="http://www.codinghorror.com/blog/archives/000185.html"&gt;
        don't matter&lt;/a&gt;. Not so with Sphere's interpreted language. Wanted to use one
    variable for exactly one purpose (new variables for new purposes)? Slow. Test a
    few different things in one conditional statement to avoid excessive nesting? &lt;strong&gt;
        Slow&lt;/strong&gt;, Sphere doesn't use &lt;a href="http://en.wikipedia.org/wiki/Short-circuit_evaluation"&gt;
            short-circuit evaluation&lt;/a&gt;. Nest like crazy for performance over readability?
    You still might not have had it! Parsing the additional lines was slow again. How about
    making good use of functions anywhere you could make a useful abstraction? &lt;strong&gt;Slow!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
    Unfortunately the text parsing of the script itself was a problem. Every line or
    character added for readability or maintainability detracted from performance, and
    not in a theoretical way, but a large and &lt;em&gt;measurable&lt;/em&gt; way. There was a constant
    battle waged as balance was sought between readability (which will yield performance
    over time) and immediate performance.&lt;/p&gt;
&lt;p&gt;
    The loser was quite evident though, that would be us:
    &lt;pre&gt;
[FUNCTION contents]
IF &amp;lt;RESCOUNT&amp;gt;
	VAR.COUNT &amp;lt;RESCOUNT&amp;gt;
	contents_r &amp;lt;ARGS&amp;gt;
ENDIF

[FUNCTION contents_r]
IF &amp;lt;VAR.COUNT&amp;gt; &amp;gt;= 200
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 1&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 2&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 3&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 4&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 5&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 6&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 7&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 8&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 9&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 10&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 11&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 12&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 13&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 14&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 15&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 16&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 17&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 18&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 19&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 20&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 21&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 22&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 23&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 24&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 25&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 26&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 27&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 28&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 29&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 30&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 31&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 32&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 33&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 34&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 35&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 36&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 37&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 38&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 39&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 40&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 41&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 42&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 43&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 44&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 45&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 46&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 47&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 48&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 49&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 50&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 51&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 52&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 53&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 54&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 55&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 56&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 57&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 58&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 59&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 60&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 61&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 62&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 63&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 64&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 65&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 66&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 67&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 68&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 69&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 70&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 71&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 72&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 73&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 74&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 75&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 76&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 77&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 78&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 79&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 80&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 81&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 82&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 83&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 84&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 85&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 86&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 87&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 88&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 89&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 90&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 91&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 92&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 93&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 94&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 95&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 96&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 97&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 98&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 99&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 100&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 101&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 102&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 103&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 104&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 105&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 106&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 107&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 108&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 109&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 110&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 111&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 112&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 113&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 114&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 115&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 116&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 117&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 118&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 119&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 120&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 121&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 122&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 123&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 124&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 125&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 126&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 127&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 128&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 129&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 130&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 131&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 132&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 133&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 134&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 135&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 136&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 137&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 138&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 139&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 140&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 141&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 142&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 143&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 144&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 145&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 146&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 147&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 148&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 149&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 150&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 151&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 152&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 153&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 154&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 155&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 156&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 157&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 158&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 159&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 160&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 161&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 162&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 163&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 164&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 165&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 166&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 167&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 168&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 169&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 170&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 171&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 172&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 173&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 174&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 175&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 176&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 177&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 178&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 179&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 180&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 181&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 182&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 183&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 184&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 185&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 186&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 187&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 188&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 189&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 190&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 191&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 192&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 193&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 194&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 195&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 196&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 197&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 198&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 199&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 200&amp;gt;.&amp;lt;ARGS&amp;gt;
	VAR.COUNT &amp;lt;VAR.COUNT&amp;gt; +- 200
ELIF &amp;lt;VAR.COUNT&amp;gt; &amp;gt;= 100
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 1&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 2&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 3&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 4&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 5&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 6&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 7&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 8&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 9&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 10&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 11&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 12&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 13&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 14&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 15&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 16&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 17&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 18&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 19&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 20&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 21&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 22&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 23&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 24&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 25&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 26&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 27&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 28&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 29&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 30&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 31&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 32&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 33&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 34&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 35&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 36&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 37&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 38&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 39&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 40&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 41&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 42&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 43&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 44&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 45&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 46&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 47&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 48&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 49&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 50&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 51&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 52&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 53&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 54&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 55&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 56&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 57&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 58&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 59&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 60&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 61&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 62&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 63&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 64&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 65&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 66&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 67&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 68&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 69&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 70&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 71&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 72&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 73&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 74&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 75&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 76&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 77&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 78&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 79&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 80&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 81&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 82&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 83&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 84&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 85&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 86&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 87&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 88&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 89&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 90&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 91&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 92&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 93&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 94&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 95&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 96&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 97&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 98&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 99&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 100&amp;gt;.&amp;lt;ARGS&amp;gt;
	VAR.COUNT &amp;lt;VAR.COUNT&amp;gt; +- 100
ELIF &amp;lt;VAR.COUNT&amp;gt; &amp;gt;= 50
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 1&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 2&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 3&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 4&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 5&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 6&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 7&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 8&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 9&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 10&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 11&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 12&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 13&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 14&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 15&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 16&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 17&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 18&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 19&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 20&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 21&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 22&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 23&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 24&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 25&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 26&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 27&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 28&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 29&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 30&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 31&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 32&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 33&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 34&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 35&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 36&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 37&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 38&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 39&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 40&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 41&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 42&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 43&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 44&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 45&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 46&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 47&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 48&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 49&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 50&amp;gt;.&amp;lt;ARGS&amp;gt;
	VAR.COUNT &amp;lt;VAR.COUNT&amp;gt; +- 50
ELIF &amp;lt;VAR.COUNT&amp;gt; &amp;gt;= 25
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 1&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 2&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 3&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 4&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 5&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 6&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 7&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 8&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 9&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 10&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 11&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 12&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 13&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 14&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 15&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 16&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 17&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 18&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 19&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 20&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 21&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 22&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 23&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 24&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 25&amp;gt;.&amp;lt;ARGS&amp;gt;
	VAR.COUNT &amp;lt;VAR.COUNT&amp;gt; +- 25
ELIF &amp;lt;VAR.COUNT&amp;gt; &amp;gt;= 12
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 1&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 2&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 3&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 4&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 5&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 6&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 7&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 8&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 9&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 10&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 11&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 12&amp;gt;.&amp;lt;ARGS&amp;gt;
	VAR.COUNT &amp;lt;VAR.COUNT&amp;gt; +- 12
ELIF &amp;lt;VAR.COUNT&amp;gt; &amp;gt;= 6
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 1&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 2&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 3&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 4&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 5&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 6&amp;gt;.&amp;lt;ARGS&amp;gt;
	VAR.COUNT &amp;lt;VAR.COUNT&amp;gt; +- 6
ELIF &amp;lt;VAR.COUNT&amp;gt; &amp;gt;= 3
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 1&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 2&amp;gt;.&amp;lt;ARGS&amp;gt;
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 3&amp;gt;.&amp;lt;ARGS&amp;gt;
	VAR.COUNT &amp;lt;VAR.COUNT&amp;gt; +- 3
ELIF &amp;lt;VAR.COUNT&amp;gt; &amp;gt;= 1
        TRY FINDCONT.&amp;lt;EVAL &amp;lt;VAR.COUNT&amp;gt; - 1&amp;gt;.&amp;lt;ARGS&amp;gt;
	VAR.COUNT &amp;lt;VAR.COUNT&amp;gt; +- 1
ELSE
	VAR.COUNT
	RETURN 1
ENDIF
contents_r &amp;lt;ARGS&amp;gt;
RETURN 0
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;
    Why did we stick with it for so long? Well aside from an acceptable level of relative
    &lt;a href="http://www.uox3.org/history/timeline.shtml"&gt;completeness&lt;/a&gt;, its particular
    infrastructure meant &lt;strong&gt;code could be adjusted in almost real-time&lt;/strong&gt;,
    a feature I reveled in as superior to competitive offerings from the likes of &lt;a href="http://en.wikipedia.org/wiki/RunUO"&gt;
        RunUO&lt;/a&gt; (which actually came much later). Of course this was a blessing and
    an absolute curse, I think we countered the &lt;em&gt;not so uncommon&lt;/em&gt; effects of corrupted state
    with the careful application of &lt;a href="http://www.youtube.com/watch?v=6wS5xOZ7Rq8"&gt;
        not giving a fuck&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
    One of my close fellow enthusiasts (&lt;a href="http://www.sphereserver.net/index.php?showuser=5065"&gt;"Shadowlord"&lt;/a&gt;)
    even went so far as to create his own language, &lt;a href="http://www.sphereserver.net/index.php?showtopic=9794"&gt;
        PySphere&lt;/a&gt;, over Sphere's to abstract away some of the crazy. I liken this
    to JavaScript compression. While the resultant Sphere interpreted script is highly
    obfuscated, it's very fast. I thought he was nuts at first, and stuck to my hand
    optimization, but looking back I think it was me. (Well in truth we were both crazy
    to author such complexity.)&lt;/p&gt;
&lt;p&gt;
    I eventually caught on, and so can you. If you're doing anything of &lt;em&gt;substance&lt;/em&gt;
    in SphereServer, a budding programmer yourself, I ask:&lt;/p&gt;
&lt;h1&gt;
    Is Sphere fast enough for your code to be as readable as it should be?&lt;/h1&gt;
&lt;p&gt;
    If you aren't sure, give &lt;a href="http://cc2e.com/"&gt;Code Complete&lt;/a&gt; a read, then
    try scripting and ask yourself again. You may not know what readable code looks
    like. ;)&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/codeoptimism/~4/uxgFrOqxfj0" height="1" width="1"/&gt;</summary>
    <published>2009-10-09T23:36:00+00:00</published>
    <link rel="related" href="http://codeoptimism.net/blog/post/2009/10/09/When-you-know-youre-coding-in-the-wrong-language.aspx#comment" />
    <category term="General" />
    <dc:publisher>Christopher Galpin</dc:publisher>
    <dc:description>The difficulty of readable code in a slow interpreted language i.e. SphereServer an Ultima Online server emulator.</dc:description>
    <pingback:server>http://codeoptimism.net/blog/pingback.axd</pingback:server>
    <pingback:target>http://codeoptimism.net/blog/post.aspx?id=d906a8ca-9132-4eec-94fd-78f77e2efcc6</pingback:target>
    <slash:comments>0</slash:comments>
    <trackback:ping>http://codeoptimism.net/blog/trackback.axd?id=d906a8ca-9132-4eec-94fd-78f77e2efcc6</trackback:ping>
    <wfw:comment>http://codeoptimism.net/blog/post/2009/10/09/When-you-know-youre-coding-in-the-wrong-language.aspx#comment</wfw:comment>
    <wfw:commentRss>http://codeoptimism.net/blog/syndication.axd?post=d906a8ca-9132-4eec-94fd-78f77e2efcc6</wfw:commentRss>
  <feedburner:origLink>http://codeoptimism.net/blog/post/2009/10/09/When-you-know-youre-coding-in-the-wrong-language.aspx</feedburner:origLink></entry>
  <entry>
    <id>http://codeoptimism.net/blog/post/2009/10/02/Curse-you-focus-stealing!-What-did-I-just-authorize.aspx</id>
    <title>Curse you focus stealing! What did I just authorize?</title>
    <updated>2009-10-03T03:08:00+00:00</updated>
    <link rel="self" href="http://codeoptimism.net/blog/post.aspx?id=a735686a-81e5-47e0-96c9-1be5c3d180bf" />
    <link href="http://feedproxy.google.com/~r/codeoptimism/~3/dSQVWEmW8CM/Curse-you-focus-stealing!-What-did-I-just-authorize.aspx" />
    <author>
      <name>Christopher Galpin</name>
    </author>
    <summary type="html">&lt;p&gt;
    Window focus stealing has been around for a long time, there's a &lt;a href="http://en.wikipedia.org/wiki/Focus_stealing"&gt;
        Wikipedia&lt;/a&gt; article on it, it's been asked a few times on &lt;a href="http://superuser.com/search?q=stealing+focus"&gt;
            SuperUser&lt;/a&gt; and there's apparently a &lt;code&gt;ForegroundLockTimeout&lt;/code&gt;
    registry value that may assist. But it probably doesn't.&lt;/p&gt;
&lt;p&gt;
    The fact is that some applications don't respect system settings, and steal focus
    anyway.&lt;/p&gt;
&lt;p&gt;
    You can probably write code to take your focus back, possibly even fast enough to
    avoid the thieving app from receiving dangerous input.&lt;/p&gt;
&lt;p&gt;
    &lt;a href="http://www.autohotkey.com/"&gt;AutoHotkey&lt;/a&gt;, is, &lt;a href="http://codeoptimism.net/blog/post/2008/12/31/Gaming-the-game-Cheat-Engine-AutoHotkey-and-Jedi-Academy.aspx"&gt;
        once again&lt;/a&gt;, ideally suited, and this problem is certainly under discussion
    on their &lt;a href="http://www.autohotkey.com/forum/search.php"&gt;forum&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
    So I stole the code from &lt;a href="http://www.autohotkey.com/forum/topic19168-30.html"&gt;
        here&lt;/a&gt; (thanks &lt;a href="http://www.autohotkey.com/forum/author-SKAN.html"&gt;SKAN&lt;/a&gt;
    and &lt;a href="http://www.autohotkey.com/forum/author-r0lZ.html"&gt;r0lZ&lt;/a&gt;) and a tiny
    bit from &lt;a href="http://www.autohotkey.com/forum/topic18062.html"&gt;here&lt;/a&gt; (thanks
    &lt;a href="http://www.autohotkey.com/forum/author-Chris.html"&gt;Chris&lt;/a&gt;), and we've
    a means not to stop focus stealing (sorry, haven't given that a go yet) but at least
    to record a history of focused windows so we can see exactly what process / window
    it was that stole focus and intercepted our keystroke. What the hell did we just
    authorize? Well, we can know.&lt;/p&gt;
&lt;p&gt;
    Install AutoHotkey, then &lt;strong&gt;&lt;a href="http://codeoptimism.net/projects/AutoHotkey/windowHistory.ahk"&gt;download
        the script&lt;/a&gt;&lt;/strong&gt;. Execute it and you've now a history of windows that
    have come into focus. Drop a shortcut to&lt;/p&gt;
&lt;div class="blockcode"&gt;
    "C:\path\to\AutoHotkey.exe" "C:\path\to\windowHistory.ahk"&lt;/div&gt;
&lt;p&gt;
    into your start menu startup folder to always have it running. Now find and double
    click the new AHK icon in the notification area to open the script window, from
    the &lt;cite&gt;View&lt;/cite&gt; menu select &lt;cite&gt;Variables and their contents&lt;/cite&gt;. At
    the bottom you will see the variable &lt;code&gt;winNum&lt;/code&gt;, which is the most recent
    recorded window index.&lt;/p&gt;
&lt;p&gt;
    &lt;img title="window history" src="http://codeoptimism.net/images/2009_10_03/2009-10-03_0321.png" alt="window history" /&gt;&lt;/p&gt;
&lt;p&gt;
    The last 30 windows and their processes are listed here, saved to these variables
    in a loop. Go to the one matching the &lt;code&gt;winNum&lt;/code&gt; value for the latest and
    count backward to see the windows in focus prior (after zero you jump back to twenty-nine).
    The number after process names is the PID or &lt;a href="http://en.wikipedia.org/wiki/Process_identifier"&gt;
        process identifier&lt;/a&gt;, you can match this to an exact process in task manager
    (you may need to turn on the PID column from the view menu).&lt;/p&gt;
&lt;p&gt;
    This is crude and not much more than a copy paste job, but it demonstrates that
    &lt;strong&gt;we don't have to live with these frustrations, we can take action&lt;/strong&gt;.
    ;)&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/codeoptimism/~4/dSQVWEmW8CM" height="1" width="1"/&gt;</summary>
    <published>2009-10-03T03:08:00+00:00</published>
    <link rel="related" href="http://codeoptimism.net/blog/post/2009/10/02/Curse-you-focus-stealing!-What-did-I-just-authorize.aspx#comment" />
    <category term="Projects" />
    <dc:publisher>Christopher Galpin</dc:publisher>
    <dc:description>An AutoHotkey script that records window/process focus history.</dc:description>
    <pingback:server>http://codeoptimism.net/blog/pingback.axd</pingback:server>
    <pingback:target>http://codeoptimism.net/blog/post.aspx?id=a735686a-81e5-47e0-96c9-1be5c3d180bf</pingback:target>
    <slash:comments>0</slash:comments>
    <trackback:ping>http://codeoptimism.net/blog/trackback.axd?id=a735686a-81e5-47e0-96c9-1be5c3d180bf</trackback:ping>
    <wfw:comment>http://codeoptimism.net/blog/post/2009/10/02/Curse-you-focus-stealing!-What-did-I-just-authorize.aspx#comment</wfw:comment>
    <wfw:commentRss>http://codeoptimism.net/blog/syndication.axd?post=a735686a-81e5-47e0-96c9-1be5c3d180bf</wfw:commentRss>
  <feedburner:origLink>http://codeoptimism.net/blog/post/2009/10/02/Curse-you-focus-stealing!-What-did-I-just-authorize.aspx</feedburner:origLink></entry>
  <entry>
    <id>http://codeoptimism.net/blog/post/2009/05/28/Reducing-redundancy-in-IRC.aspx</id>
    <title>Reducing redundancy in (m)IRC</title>
    <updated>2009-05-28T18:53:00+00:00</updated>
    <link rel="self" href="http://codeoptimism.net/blog/post.aspx?id=f81ca98b-5292-4721-a82f-556dc97ab546" />
    <link href="http://feedproxy.google.com/~r/codeoptimism/~3/UaJMSys37V4/Reducing-redundancy-in-IRC.aspx" />
    <author>
      <name>Christopher Galpin</name>
    </author>
    <summary type="html">&lt;p&gt;The old but popular &lt;a href="http://en.wikipedia.org/wiki/IRC"&gt;IRC&lt;/a&gt; client &lt;a href="http://www.mirc.com/"&gt;mIRC&lt;/a&gt; is richly featured but it has a style problem, so it gets teased, and really the &lt;a href="http://www.codinghorror.com/blog/archives/000371.html"&gt;user interface &lt;em&gt;is&lt;/em&gt; the application&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img title="before image" src="http://codeoptimism.net/projects/mIRC/before.png" alt="before image" /&gt;&lt;/p&gt;
&lt;p&gt;XChat's &lt;a href="http://www.xchat.org/screenshots/"&gt;alignment of user text&lt;/a&gt; inspired me to add the same feature to mIRC.&lt;/p&gt;
&lt;p&gt;Then I realized &lt;strong&gt;there was no need to repeat timestamps and nicknames when nothing had changed&lt;/strong&gt;, and my script became something more, something wonderful.&lt;/p&gt;
&lt;p&gt;&lt;img title="after image" src="http://codeoptimism.net/projects/mIRC/after2.png" alt="after image" /&gt;&lt;/p&gt;
&lt;p&gt;After this success I had to take it a step further.&lt;/p&gt;
&lt;h3&gt;When is it ever relevant to view join/parts in IRC?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;When the user has recently spoken.&lt;/li&gt;
&lt;li&gt;When they flood indicating the onset and end of a &lt;a href="http://en.wikipedia.org/wiki/Netsplit"&gt;netsplit&lt;/a&gt; during which parties are cut off from each other.&lt;/li&gt;
&lt;li&gt;When you're a participant and would appreciate a rough estimate of the visibility of your text, considering it could have been scrolled off-screen by join/parts visible to other users.&lt;/li&gt;
&lt;li&gt;When a join/part flood is occurring and it's a bit too rocky for conversation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Essentially when it's relevant to the conversation.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;These are in fact the circumstances in which the script makes them visible. It begins in &lt;em&gt;read&lt;/em&gt; mode with clutter minimized, only reporting departures of users whose text is most recently in your buffer. If you become active in the conversation the mode changes, and the dialogue is intelligently interspersed with brief updates of join/part line counts. Floods and netsplits are always reported, and tersely.&lt;/p&gt;
&lt;p&gt;&lt;img title="netsplit" src="http://codeoptimism.net/projects/mIRC/netsplit.png" alt="netsplit" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img title="line counts" src="http://codeoptimism.net/projects/mIRC/line counts.png" alt="line counts" /&gt;&lt;/p&gt;
&lt;h3&gt;Other features:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Text is aligned, and the alignment point is easily moved.&lt;/li&gt;
&lt;li&gt;Simple and customizable. The timestamp and nickname are checked independently for repetition, and look to your settings for how to format them in either of these cases. These screenshots are one very specific (and currently default) example.&lt;/li&gt;
&lt;li&gt;Nicknames at the beginning of text are highlighted (formatted however you specify). There's room for improvement but it works pretty well.&lt;/li&gt;
&lt;li&gt;UTF-8 Unicode support.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 style="text-align: center;"&gt;&lt;a href="http://bitbucket.org/chrisgalpin/succinct/downloads/"&gt;Download&lt;/a&gt; | &lt;a href="http://bitbucket.org/chrisgalpin/succinct/changesets/"&gt;Changelog&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Installing the script is as simple as extracting the &lt;cite&gt;.mrc&lt;/cite&gt; files from the &lt;cite&gt;zip&lt;/cite&gt; somewhere, and loading the primary one into mIRC:&lt;/p&gt;
&lt;p class="blockcode"&gt;/load -rs C:\path\to\script\succinct.mrc&lt;/p&gt;
&lt;p&gt;After which you will be greeted by lovely test output similar to this:&lt;/p&gt;
&lt;p&gt;&lt;img title="test output" src="http://codeoptimism.net/projects/mIRC/test output.png" alt="test output" /&gt;&lt;/p&gt;
&lt;p&gt;If you've similar results, other than the color theme and the highlight line which merely &lt;em&gt;allows&lt;/em&gt; highlighting and states your primary IRC nick, then everything should be running smoothly.&lt;/p&gt;
&lt;p&gt;Formatting and a few settings can be adjusted from mIRC's &lt;cite&gt;Variables&lt;/cite&gt; dialog, take a look at the top of &lt;cite&gt;succinct.mrc&lt;/cite&gt; for details.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/codeoptimism/~4/UaJMSys37V4" height="1" width="1"/&gt;</summary>
    <published>2009-05-28T18:53:00+00:00</published>
    <link rel="related" href="http://codeoptimism.net/blog/post/2009/05/28/Reducing-redundancy-in-IRC.aspx#comment" />
    <category term="Projects" />
    <dc:publisher>Christopher Galpin</dc:publisher>
    <dc:description>Eliminating superfluous information in (m)IRC for usability.</dc:description>
    <pingback:server>http://codeoptimism.net/blog/pingback.axd</pingback:server>
    <pingback:target>http://codeoptimism.net/blog/post.aspx?id=f81ca98b-5292-4721-a82f-556dc97ab546</pingback:target>
    <slash:comments>2</slash:comments>
    <trackback:ping>http://codeoptimism.net/blog/trackback.axd?id=f81ca98b-5292-4721-a82f-556dc97ab546</trackback:ping>
    <wfw:comment>http://codeoptimism.net/blog/post/2009/05/28/Reducing-redundancy-in-IRC.aspx#comment</wfw:comment>
    <wfw:commentRss>http://codeoptimism.net/blog/syndication.axd?post=f81ca98b-5292-4721-a82f-556dc97ab546</wfw:commentRss>
  <feedburner:origLink>http://codeoptimism.net/blog/post/2009/05/28/Reducing-redundancy-in-IRC.aspx</feedburner:origLink></entry>
  <entry>
    <id>http://codeoptimism.net/blog/post/2009/05/15/Akismet-support-for-BlogEngineNET.aspx</id>
    <title>Akismet support for BlogEngine.NET 1.5</title>
    <updated>2009-05-15T23:47:00+00:00</updated>
    <link rel="self" href="http://codeoptimism.net/blog/post.aspx?id=8171566f-666f-42c3-903b-39c0d6c7ecac" />
    <link href="http://feedproxy.google.com/~r/codeoptimism/~3/7-A7IHFCneM/Akismet-support-for-BlogEngineNET.aspx" />
    <author>
      <name>Christopher Galpin</name>
    </author>
    <summary type="html">&lt;div class="update"&gt;
&lt;p&gt;&lt;span class="updateDate"&gt;10-04-09&lt;/span&gt; Not sure why I didn't notice before, but the &lt;a href="http://rtur.net/blog/post/2009/02/16/Commentor-e28093-new-version.aspx"&gt;Commentor&lt;/a&gt; extension has been around for some time! It solves what I still needed, a place to manage all of the comments from a centralized location. The code below still adds spam management to individual comments and they &lt;em&gt;may&lt;/em&gt; work together rather without incident.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Since I &lt;a href="http://codeoptimism.net/blog/post/2009/01/30/Implementing-a-naive-captcha-in-BlogEngineNET.aspx"&gt;previously mentioned&lt;/a&gt; comment spam I've experimentally bolstered the defenses of this blog in my update to &lt;a href="http://madskristensen.net/post/BlogEngineNET-15-final-release.aspx"&gt;BlogEngine.NET 1.5&lt;/a&gt;, and... received the same spam. It's manually entered, and highly deceptive, frequently a &lt;q&gt;thanks, &lt;em&gt;X&lt;/em&gt; helped me with &lt;em&gt;Y&lt;/em&gt;&lt;/q&gt; or just ever so subtly off-topic, often only the spam URL giving it away. At least this has absolved naive captcha of blame (still a little randomization in field names for &lt;a href="http://nedbatchelder.com/text/stopbots.html"&gt;playback bots&lt;/a&gt; might be a good idea).&lt;/p&gt;

&lt;p class="emphasis"&gt;So, BlogEngine.NET community, let's do something about the manual spam problem and integrate &lt;a href="http://akismet.com/"&gt;Akismet&lt;/a&gt; with a spam moderation queue like the WordPress plugin.&lt;/p&gt;

&lt;p&gt;I've personally tackled it in my usual lazy better-things-to-do hackish fashion and converted BlogEngine's entire moderation queue into a spam queue (essentially moderation enabled but non-flagged spam is immediately approved). Who wants to have to moderate everything anyway?&lt;/p&gt;

&lt;p&gt;The actual Akismet comment checking is accomplished with &lt;a href="http://joel.net/me/weblog.aspx"&gt;Joel Thom&lt;/a&gt;'s ASP.NET API you &lt;em&gt;may&lt;/em&gt; need to &lt;a href="http://akismetapi.codeplex.com/"&gt;download&lt;/a&gt;.

&lt;/p&gt;&lt;p&gt;Following that, here are the relevant &lt;a href="http://www.scootersoftware.com/"&gt;BC&lt;/a&gt; &lt;strong&gt;comparison reports&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://codeoptimism.net/projects/BlogEngine.NET%20Akismet/BlogEngine.NET Core 1.5 Akismet.html"&gt;BlogEngine.Core 1.5 with Akismet&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://codeoptimism.net/projects/BlogEngine.NET%20Akismet/BlogEngine.NET%20Web%201.5%20Akismet.html"&gt;BlogEngine.Web 1.5 with Akismet&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://codeoptimism.net/projects/BlogEngine.NET%20Akismet/Joel.Net.Akismet.1.0.1%20BlogEngine.NET.html"&gt;Joel.Net.Akismet.1.0.1 for BlogEngine.NET&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Don't expect perfection, in particular my error handling is probably unduly sparse. I'm sure I'll notice it when it breaks painfully.&lt;/p&gt;

&lt;p&gt;You will need a &lt;a href="http://en.wordpress.com/api-keys/"&gt;WordPress API key&lt;/a&gt; to work Akismet in the first place. Get one and specify it with your blog URL at the top of &lt;cite&gt;BlogEngine.Web\User controls\CommentView.ascx.cs&lt;/cite&gt;.&lt;/p&gt;

&lt;p&gt;Further you'll have to compile the changes to &lt;cite&gt;Core&lt;/cite&gt;, update the dll in &lt;cite&gt;Web&lt;/cite&gt;'s &lt;cite&gt;bin&lt;/cite&gt;, add a reference to &lt;cite&gt;Core&lt;/cite&gt; in &lt;cite&gt;Joel.Net.Akismet&lt;/cite&gt;, compile, copy dll assembly, and reference that from &lt;cite&gt;Web&lt;/cite&gt; as well, but you already knew that because you're a programmer and the &lt;code&gt;using&lt;/code&gt; references give it away anyway. Right? ;)&lt;/p&gt;

&lt;p&gt;Or you could use &lt;strong&gt;&lt;a href="http://codeoptimism.net/projects/BlogEngine.NET%20Akismet/BlogEngine.NET%201.5%20Akismet.zip"&gt;this tidy package&lt;/a&gt;&lt;/strong&gt; I've provided, keeping in mind to only replace files/assemblies you haven't modified from the stock download, and &lt;a href="http://stackoverflow.com/questions/12625/best-diff-tool"&gt;merge&lt;/a&gt; the rest. (If you've no interest in source code you may ignore the &lt;cite&gt;BlogEngine.Core&lt;/cite&gt; and &lt;cite&gt;Joel.Net.Akismet.1.0.1&lt;/cite&gt; folders, the compiled assemblies are already in &lt;cite&gt;BlogEngine.Web&lt;/cite&gt;.)&lt;/p&gt;

&lt;p&gt;You must also &lt;strong&gt;Enable comment moderation&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;Additional Details&lt;/h2&gt;

&lt;p&gt;
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Commenters are notified if their comment requires moderation immediately (the JavaScript now provides, very hackishly, an &lt;q&gt;isModerated&lt;/q&gt; case).
&lt;/li&gt;&lt;li&gt;Moderated comments have a new administrative &lt;strong&gt;&lt;cite&gt;Ham&lt;/cite&gt;&lt;/strong&gt; link for submitting false positives back to Akismet (this also approves the comment).
&lt;/li&gt;&lt;li&gt;Approved (visible) comments have a new administrative &lt;strong&gt;&lt;cite&gt;Spam&lt;/cite&gt;&lt;/strong&gt; link for submitting false negatives back to Akismet (this also deletes the comment).
&lt;/li&gt;&lt;li&gt;These links have been added to the corresponding admin comment notification emails as well.
&lt;/li&gt;&lt;li&gt;Comment moderation has been toggled on in &lt;cite&gt;settings.xml&lt;/cite&gt; (for XML data source blogs).
&lt;/li&gt;&lt;li&gt;The Joel.Net.Akismet API has been modified to take the &lt;code&gt;HttpRequest&lt;/code&gt; and &lt;code&gt;BlogEngine.Core.Post&lt;/code&gt; directly.
&lt;/li&gt;&lt;li&gt;Only &lt;cite&gt;labels.resx&lt;/cite&gt; has been updated, this package is &lt;strong&gt;not localized&lt;/strong&gt; (and could be a little cleaner for that), I'm but one English speaking man.
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Please improve upon this, make it an extension (I don't think it can be 100%), or otherwise more directly incorporate it into an official version. I mostly just have time to &lt;em&gt;blog about it&lt;/em&gt;. :)&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/codeoptimism/~4/7-A7IHFCneM" height="1" width="1"/&gt;</summary>
    <published>2009-05-15T23:47:00+00:00</published>
    <link rel="related" href="http://codeoptimism.net/blog/post/2009/05/15/Akismet-support-for-BlogEngineNET.aspx#comment" />
    <category term="Projects" />
    <dc:publisher>Christopher Galpin</dc:publisher>
    <dc:description>How to hack in Akismet support for BlogEngine.NET 1.5 with a spam moderation queue.</dc:description>
    <pingback:server>http://codeoptimism.net/blog/pingback.axd</pingback:server>
    <pingback:target>http://codeoptimism.net/blog/post.aspx?id=8171566f-666f-42c3-903b-39c0d6c7ecac</pingback:target>
    <slash:comments>3</slash:comments>
    <trackback:ping>http://codeoptimism.net/blog/trackback.axd?id=8171566f-666f-42c3-903b-39c0d6c7ecac</trackback:ping>
    <wfw:comment>http://codeoptimism.net/blog/post/2009/05/15/Akismet-support-for-BlogEngineNET.aspx#comment</wfw:comment>
    <wfw:commentRss>http://codeoptimism.net/blog/syndication.axd?post=8171566f-666f-42c3-903b-39c0d6c7ecac</wfw:commentRss>
  <feedburner:origLink>http://codeoptimism.net/blog/post/2009/05/15/Akismet-support-for-BlogEngineNET.aspx</feedburner:origLink></entry>
  <entry>
    <id>http://codeoptimism.net/blog/post/2009/01/30/Implementing-a-naive-captcha-in-BlogEngineNET.aspx</id>
    <title>Implementing a naive captcha in BlogEngine.NET</title>
    <updated>2009-01-30T07:53:00+00:00</updated>
    <link rel="self" href="http://codeoptimism.net/blog/post.aspx?id=21f3ad91-a8f4-4a2c-9d0b-1d7380ddf9c3" />
    <link href="http://feedproxy.google.com/~r/codeoptimism/~3/3KupykL2Seo/Implementing-a-naive-captcha-in-BlogEngineNET.aspx" />
    <author>
      <name>Christopher Galpin</name>
    </author>
    <summary type="html">&lt;div class="update"&gt;&lt;p&gt;&lt;span class="updateDate"&gt;10-04-09&lt;/span&gt; Keith Ratliff went to the very involved work of converting BlogEngine's comment submission process from JavaScript-centric to postback and standard ASP.NET validation, thereby enabling a more or less drag and drop &lt;a href="http://www.keithratliff.com/post/adding-recaptcha-to-blogenginenet.aspx"&gt;installation of reCAPTCHA&lt;/a&gt;. Hooray Keith! Fantastic work.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;A couple years ago Mad Kristensen &lt;a href="http://blog.madskristensen.dk/post/Simple-method-to-avoid-comment-spam.aspx"&gt;implemented an invisible captcha&lt;/a&gt; into BlogEngine.NET, but as my blog has attested to, this is not enough.&lt;/p&gt;
&lt;p&gt;Instead of inconveniencing readers with a captcha, you can use your own clever validation trick. The more unique it is, the less likely it will be automatically discovered and circumvented. When it is, you need a new trick.&lt;/p&gt;
&lt;p&gt;A naive captcha is basically a captcha that's always the same image, and works off of the principle that you're site isn't important enough for spammers to manually specify (how cheerful!), but if it's &lt;a href="http://www.codinghorror.com/blog/archives/001067.html"&gt;good enough for Coding Horror&lt;/a&gt; it's good enough for me.&lt;/p&gt;
&lt;p&gt;Of course being an image itself resists the automated discovery of this particular trick, and if it is discovered, manually or otherwise, it's easy to change the image (it need not even be of text).&lt;/p&gt;
&lt;p&gt;Implementing my own naive captcha here has been quite effective so far. My &lt;a href="http://www.codethinked.com/post/2008/07/08/Akismet-Extension-Updated-for-BlogEnginenet-14.aspx"&gt;next step&lt;/a&gt; &lt;em&gt;may be&lt;/em&gt; &lt;a href="http://akismet.com/"&gt;Akismet&lt;/a&gt; for manually entered spam.&lt;/p&gt;
&lt;h2&gt;Implement your own&lt;/h2&gt;
&lt;p&gt;The patched (against vanilla BlogEngine.NET 1.4.5) files are available &lt;a rel="enclosure" href="http://codeoptimism.net/projects/naive%20captcha/BlogEngine.Web%201.4.5%20naive%20captcha.zip"&gt;here&lt;/a&gt;. For making the change to your existing and customized blog, take a look at &lt;a href="http://codeoptimism.net/projects/naive%20captcha/patch%20report.html"&gt;this comparison&lt;/a&gt; courtesy of &lt;a href="http://www.scootersoftware.com/"&gt;Beyond Compare 3&lt;/a&gt;, or view the compact version below, this post needed some color.&lt;/p&gt;
&lt;p&gt;You'll want to change the paths and formatting in &lt;cite&gt;CommentView.ascx&lt;/cite&gt; to suit your liking, also the word "chicken".&lt;/p&gt;
&lt;p&gt;Oh, and don't forget that &lt;em&gt;my code sucks&lt;/em&gt;, sometimes intentionally even, because I'm lazy. Someone please be my guest and make this a properly coded BlogEngine.NET extension. Furthermore my first attempt was with the strictly-server-side &lt;code&gt;RegularExpressionValidator&lt;/code&gt; control you see commented out below, which I couldn't get to work, so I used existing mechanisms instead.&lt;/p&gt;
&lt;p&gt;Modified (mostly new, really) code is in red. New code is in blue. The rest is context.&lt;/p&gt;&lt;iframe height="400" width="87%" src="http://codeoptimism.net/projects/naive%20captcha/patch%20report%20inline.html"&gt;&lt;/iframe&gt;&lt;img src="http://feeds.feedburner.com/~r/codeoptimism/~4/3KupykL2Seo" height="1" width="1"/&gt;</summary>
    <published>2009-01-30T07:53:00+00:00</published>
    <link rel="related" href="http://codeoptimism.net/blog/post/2009/01/30/Implementing-a-naive-captcha-in-BlogEngineNET.aspx#comment" />
    <category term="Projects" />
    <dc:publisher>Christopher Galpin</dc:publisher>
    <dc:description>Instructions for implementing a naive captcha in BlogEngine.NET to combat spam.</dc:description>
    <pingback:server>http://codeoptimism.net/blog/pingback.axd</pingback:server>
    <pingback:target>http://codeoptimism.net/blog/post.aspx?id=21f3ad91-a8f4-4a2c-9d0b-1d7380ddf9c3</pingback:target>
    <slash:comments>1</slash:comments>
    <trackback:ping>http://codeoptimism.net/blog/trackback.axd?id=21f3ad91-a8f4-4a2c-9d0b-1d7380ddf9c3</trackback:ping>
    <wfw:comment>http://codeoptimism.net/blog/post/2009/01/30/Implementing-a-naive-captcha-in-BlogEngineNET.aspx#comment</wfw:comment>
    <wfw:commentRss>http://codeoptimism.net/blog/syndication.axd?post=21f3ad91-a8f4-4a2c-9d0b-1d7380ddf9c3</wfw:commentRss>
  <feedburner:origLink>http://codeoptimism.net/blog/post/2009/01/30/Implementing-a-naive-captcha-in-BlogEngineNET.aspx</feedburner:origLink></entry>
  <entry>
    <id>http://codeoptimism.net/blog/post/2008/12/31/Gaming-the-game-Cheat-Engine-AutoHotkey-and-Jedi-Academy.aspx</id>
    <title>Gaming the game: Cheat Engine, AutoHotkey, and Jedi Academy</title>
    <updated>2008-12-31T10:23:00+00:00</updated>
    <link rel="self" href="http://codeoptimism.net/blog/post.aspx?id=3cea684b-89b1-4f4f-9b29-339f13b32844" />
    <link href="http://feedproxy.google.com/~r/codeoptimism/~3/GDIPXNKZHyU/Gaming-the-game-Cheat-Engine-AutoHotkey-and-Jedi-Academy.aspx" />
    <author>
      <name>Christopher Galpin</name>
    </author>
    <summary type="html">&lt;p&gt;Pretending to be a Jedi can be a lot of fun; it makes you feel awesome. But what's even more fun is writing code to actually &lt;em&gt;be&lt;/em&gt; more awesome. And that, my friend, is the most awesome thing of all.&lt;/p&gt;&lt;p&gt;Which brings us to &lt;a href="http://en.wikipedia.org/wiki/Star_Wars_Jedi_Knight:_Jedi_Academy"&gt;Jedi Academy&lt;/a&gt;. If you fall, you need to get up. If you're &lt;a href="http://www.youtube.com/watch?v=3MaJy7LH5js"&gt;force choked&lt;/a&gt;, you must retaliate or be strangled to death. It's predictable, it's repetitious, and you could be a whole lot more awesome at it. Why press a combination of buttons to execute a special move when you could use only one, with complete reliability? It's like what a programmable controller did for my &lt;a href="http://en.wikipedia.org/wiki/Mortal_Kombat_Trilogy"&gt;Mortal Kombat&lt;/a&gt; prowess, with an even faster reaction time.&lt;/p&gt;&lt;img src="http://codeoptimism.net/images/12_02_2008/programmable%20controller.jpg" alt="programmable controller" title="programmable controller"/&gt;&lt;p&gt;This type of botting (gamer augmentation?) is a bit more like &lt;a href="http://en.wikipedia.org/wiki/WOWGlider"&gt;WOWGlider&lt;/a&gt; than an &lt;a href="http://en.wikipedia.org/wiki/Aimbot"&gt;aimbot&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/Cheating_(video_games)#Trainers"&gt;trainer&lt;/a&gt;, but they're all fairly similar. It's essentially interaction with the game's memory that makes this type of coding difficult, but with the right tools and some good examples you can be on your way.&lt;/p&gt;&lt;h3&gt;Cheat Engine&lt;/h3&gt;&lt;p&gt;The most important tool in your arsenal is the memory scanner (and more), &lt;a href="http://www.cheatengine.org/aboutce.php"&gt;Cheat Engine&lt;/a&gt;. Knowing the circumstances of your character, opponents, and environment means reading the game's memory, and with CE you can find the appropriate memory addresses for things such as health, position, and action/animation.&lt;/p&gt;&lt;p&gt;I tested a &lt;em&gt;lot&lt;/em&gt; of memory scanners, and CE was easily the most powerful and useful, capable of many advanced features. To get your foot in the door using CE try the built-in tutorial, which is also explained &lt;a href="http://forum.cheatengine.org/viewtopic.php?t=26540"&gt;on the forum&lt;/a&gt;. Becoming truly proficient with CE is hard work, you'll need to reason about data types and arrays of structures representing &lt;a href='http://www.google.com/codesearch/p?hl=en#uSMp1wvJMPU/duelers-ja-code/JKA_mp(SDK)/codemp/game/q_shared.h&amp;amp;q="typedef struct entityState_s" jedi&amp;amp;l=2680'&gt;characters and items&lt;/a&gt;, learn to master pointer scanning and pointer integrity testing, and certainly remember to save your work. You might need to break out &lt;a href="http://www.hexworkshop.com/"&gt;Hex Workshop&lt;/a&gt; to compare memory dumps: "Ah, this value is the same for each &lt;a href="http://starwars.wikia.com/wiki/Tauntaun"&gt;tauntaun&lt;/a&gt;, and a different value is the same for each health pack, must be entity type!".&lt;/p&gt;&lt;h3&gt;AutoHotkey&lt;/h3&gt;&lt;p&gt;Of course you'll need a language/program to code in. I chose &lt;a href="http://www.autohotkey.com/"&gt;AutoHotkey&lt;/a&gt; because it's designed for sending mouse and keyboard commands (as well as manipulating windows, controls, and plenty of other things) and I'm familiar with it. Some further information:&lt;/p&gt;&lt;ul&gt;																																																																											&lt;li&gt;it's very lightweight (&lt;2mB)&lt;/li&gt;																																																																			&lt;li&gt;it's phenomenally well documented (in fact, the best I've seen!)&lt;/li&gt;																																																																			&lt;li&gt;scripts aren't natively compiled, but should be as fast as you'll need							&lt;/li&gt;																																																																			&lt;li&gt;scripts can be bundled with AutoHotkey to make stand-alone executables (.exe)&lt;/li&gt;																																																												&lt;li&gt;Dll support, such as the standard Windows API, via &lt;em&gt;DllCall&lt;/em&gt;&lt;/li&gt;																																																												&lt;li&gt;Graphical user interface (GUI) support&lt;/li&gt;																																																												&lt;li&gt;Large &lt;a href="http://www.autohotkey.com/forum/"&gt;community&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Now AutoHotkey doesn't have built-in memory management functions, but that's why I &lt;a href="http://code.google.com/p/jedi-academy-ahk/source/browse/trunk/memory%20management.ahk"&gt;wrote my own&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Jedi Academy&lt;/h3&gt;&lt;p&gt;&lt;img title="Jedi kickin' ass" alt="Jedi kickin' ass" src="http://codeoptimism.net/images/12_02_2008/Jedi%20Academy.jpg"/&gt;&lt;/p&gt;&lt;h4&gt;Here's a list of some fun things my script can currently do:&lt;/h4&gt;&lt;ul&gt;																																										&lt;li&gt;Allow you to execute a special move (lunge attack, flip attack, and cartwheel) with one keypress, while retaining your character's movement. (This was trickier than you'd think, and it's really cool.)&lt;/li&gt;																						&lt;li&gt;Allow you to hold down a button for mindtrick, and have your Jedi confuse whomever you look at, without wasting force if they're already tricked. (This is really fun and makes &lt;em&gt;specifically&lt;/em&gt; mind trick level 1 quite powerful.) The already-tricked routine needs some work though, see code.&lt;/li&gt;																						&lt;li&gt;Automatically kill whomever you look at if you so desire.&lt;/li&gt;																						&lt;li&gt;Automatically retaliate with force pull if choked.&lt;/li&gt;																						&lt;li&gt;Automatically jump up if knocked down.&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;Some additional ideas I was only able to rough out:&lt;/h4&gt;&lt;ul&gt;																																											&lt;li&gt;Instantly kill an enemy with a force choke smash into the ground.&lt;/li&gt;																		&lt;li&gt;Perform a sideways cartwheel attack but actually fly forward, not left or right.&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;It's also fairly easy to add code to:&lt;/h4&gt;&lt;ul&gt;																																											&lt;li&gt;Make dynamic doors disappear by changing their item type, and walking on through!&lt;/li&gt;																						&lt;li&gt;Change item types so health packs give you grenades, etc.&lt;/li&gt;																						&lt;li&gt;Move certain level elements by changing their coordinates. (Unfortunately only works on already animating things, like the rather wickedly deadly vent fan at the intro of the prisoner rescue mission. I'm sure it's possible to make it work on any entity somehow.)&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;Some crazy ideas I hope someone attempts:&lt;/h4&gt;&lt;ul&gt;																																											&lt;li&gt;Perform a flip attack but spin around to actually continue facing forward.																		&lt;/li&gt;																		&lt;li&gt;Determine the most deadly attacks in the Jedi's arsenal by recording average duration of animation sequences vs. damage inflicted.&lt;/li&gt;																						&lt;li&gt;Automatically scan for certain nearby items, turn to face, perform an action. For example, automatically force pulling nearby health packs and grenades, without interrupting the player.&lt;/li&gt;																						&lt;li&gt;Automatically saber throw accurately into groups of enemies (okay, this one is another level up in complexity).&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Let's have it!&lt;/h2&gt;&lt;p&gt;&lt;a href="http://code.google.com/p/jedi-academy-ahk/source/browse/trunk/Jedi%20Academy.ahk"&gt;View and download the code here&lt;/a&gt; ("View raw file", File-&gt;Save As), it's licensed under the &lt;a href="http://www.gnu.org/licenses/gpl.html"&gt;GPL&lt;/a&gt;. To get it to work you'll also need to download my &lt;a href="http://code.google.com/p/jedi-academy-ahk/source/browse/trunk/memory%20management.ahk"&gt;memory management script&lt;/a&gt; into the same folder, and &lt;a href="http://www.autohotkey.com/download/"&gt;install AutoHotkey&lt;/a&gt;. Then edit some configuration values at the top of the main script, and run it. After that your Jedi Academy game should be "enhanced". :)&lt;/p&gt;&lt;p&gt;Everything here is pretty much aimed at a programmer audience, and writing this script was just a hobby of mine I finished ages ago that I thought was worth sharing, so I'm not sure if/how it will work for others, but if you're having trouble leave me a comment and I may be able to help. It's designed for singleplayer, and changing things requires programming knowledge.&lt;/p&gt;&lt;p&gt;If you do anything really cool with it let me know, maybe record a video I can put up, or we'll get your code committed. I'm pretty much washing my hands clean of this now that it's public, I have newer projects to work on. :)&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/codeoptimism/~4/GDIPXNKZHyU" height="1" width="1"/&gt;</summary>
    <published>2008-12-31T10:23:00+00:00</published>
    <link rel="related" href="http://codeoptimism.net/blog/post/2008/12/31/Gaming-the-game-Cheat-Engine-AutoHotkey-and-Jedi-Academy.aspx#comment" />
    <category term="Projects" />
    <dc:publisher>Christopher Galpin</dc:publisher>
    <dc:description>Enhance Jedi Academy with this game-memory modifying code, and learn to write your own!</dc:description>
    <pingback:server>http://codeoptimism.net/blog/pingback.axd</pingback:server>
    <pingback:target>http://codeoptimism.net/blog/post.aspx?id=3cea684b-89b1-4f4f-9b29-339f13b32844</pingback:target>
    <slash:comments>0</slash:comments>
    <trackback:ping>http://codeoptimism.net/blog/trackback.axd?id=3cea684b-89b1-4f4f-9b29-339f13b32844</trackback:ping>
    <wfw:comment>http://codeoptimism.net/blog/post/2008/12/31/Gaming-the-game-Cheat-Engine-AutoHotkey-and-Jedi-Academy.aspx#comment</wfw:comment>
    <wfw:commentRss>http://codeoptimism.net/blog/syndication.axd?post=3cea684b-89b1-4f4f-9b29-339f13b32844</wfw:commentRss>
  <feedburner:origLink>http://codeoptimism.net/blog/post/2008/12/31/Gaming-the-game-Cheat-Engine-AutoHotkey-and-Jedi-Academy.aspx</feedburner:origLink></entry>
  <entry>
    <id>http://codeoptimism.net/blog/post/2008/07/19/group-sort-tabs-firefox-extension.aspx</id>
    <title>Group/Sort Tabs Firefox extension</title>
    <updated>2008-07-19T23:17:00+00:00</updated>
    <link rel="self" href="http://codeoptimism.net/blog/post.aspx?id=b2440123-a4f0-4d3f-80f7-dc98d4fc18e8" />
    <link href="http://feedproxy.google.com/~r/codeoptimism/~3/cNjvdtdm05o/group-sort-tabs-firefox-extension.aspx" />
    <author>
      <name>Christopher Galpin</name>
    </author>
    <summary type="html">&lt;p&gt;This extension adds group and sort support to tabs in &lt;a href="http://www.mozilla.com/en-US/firefox/"&gt;Firefox&lt;/a&gt;.&lt;/p&gt;
&lt;div class="update"&gt;
&lt;p&gt;&lt;span class="updateDate"&gt;8-07-08&lt;/span&gt; In addition to having been approved by Mozilla (hooray!), this project has a new &lt;a href="http://groupsorttabs.uservoice.com/"&gt;support/discussion/feature page&lt;/a&gt; on UserVoice! Please drop by and leave me a suggestion, the site is very easy to use, and no registration required.&lt;/p&gt;
&lt;p&gt;The source code and changes are still available on &lt;a href="http://code.google.com/p/sort-tabs-by-firefox/"&gt;Google Code&lt;/a&gt;. &lt;span class="updateEnd"&gt;/&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The earlier FF2 version of this extension is "&lt;a href="http://codeoptimism.net/blog/post/2007/08/sorttabsby-firefox-extension.aspx"&gt;Sort Tabs By ...&lt;/a&gt;".&lt;/p&gt;
&lt;/div&gt;

&lt;div style="text-align: center;"&gt;
&lt;img title='screenshot: "Group/Sort Tabs" and ChromaTabs' src="http://codeoptimism.net/projects/GroupSortTabs/GroupSortTabs.png" alt='screenshot: "Group/Sort Tabs" and ChromaTabs'/&gt;
&lt;h1&gt;&lt;a title="Download" href="http://addons.mozilla.org/en-US/firefox/addon/5627"&gt;Download&lt;/a&gt; | &lt;a title="Download" href="http://groupsorttabs.uservoice.com/"&gt;Support&lt;/a&gt;&lt;/h1&gt;
&lt;/div&gt;
 
&lt;h4&gt;Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Optionally group your tabs by hostname. (More to come.)&lt;/li&gt;
&lt;li&gt;Sort your tabs by last opened date, hostname, or last browsed date.&lt;/li&gt;
&lt;li&gt;Intelligently handles the opening/restoration of multiple tabs at once, only sorting when the URL of all opened tabs is known.&lt;/li&gt;
&lt;li&gt;Sorts tabs immediately upon navigating to a different URL, prior to full page load.&lt;/li&gt;
&lt;li&gt;Tabs can be manually moved into other groups.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Requirements&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.mozilla.com/en-US/firefox/"&gt;Firefox 3.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Known Limitations&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;The entire host before the first / is matched when comparing host names, so sites with different subdomains (like addons.mozilla.org and developer.mozilla.org) will not be grouped together. This can be undesirable with certain URLs (such as img161.imageshack.us and img299.imageshack.us).&lt;/li&gt;
&lt;li&gt;You can only manually move a tab into another group if you drop it somewhere in the middle of the group (no edges). I'd like an easy and intuitive method of grouping/ungrouping tabs for the future.&lt;/li&gt;
&lt;li&gt;Manually rearranging tabs out of the sort order is not a feature of this version. I've worked toward supporting it, but decided to release without it. Also, I may be overestimating its importance.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Recommendations&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Using &lt;a href="http://addons.mozilla.org/en-US/firefox/addon/8004"&gt;ChromaTabs&lt;/a&gt; or &lt;a href="http://addons.mozilla.org/en-US/firefox/addon/1368"&gt;ColorfulTabs&lt;/a&gt; configured to color code your tabs by URL.&lt;/li&gt;
&lt;li&gt;Similarly the 'close similar tabs' or 'close other tabs from this host' features of &lt;a href="http://addons.mozilla.org/en-US/firefox/addon/1122"&gt;Tab Mix Plus&lt;/a&gt; and &lt;a href="http://addons.mozilla.org/en-US/firefox/addon/1849"&gt;Closy&lt;/a&gt; may be useful.&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/codeoptimism/~4/cNjvdtdm05o" height="1" width="1"/&gt;</summary>
    <published>2008-07-19T23:17:00+00:00</published>
    <link rel="related" href="http://codeoptimism.net/blog/post/2008/07/19/group-sort-tabs-firefox-extension.aspx#comment" />
    <category term="Projects" />
    <dc:publisher>Christopher Galpin</dc:publisher>
    <dc:description>This extension adds group and sort support to tabs in Firefox.</dc:description>
    <pingback:server>http://codeoptimism.net/blog/pingback.axd</pingback:server>
    <pingback:target>http://codeoptimism.net/blog/post.aspx?id=b2440123-a4f0-4d3f-80f7-dc98d4fc18e8</pingback:target>
    <slash:comments>11</slash:comments>
    <trackback:ping>http://codeoptimism.net/blog/trackback.axd?id=b2440123-a4f0-4d3f-80f7-dc98d4fc18e8</trackback:ping>
    <wfw:comment>http://codeoptimism.net/blog/post/2008/07/19/group-sort-tabs-firefox-extension.aspx#comment</wfw:comment>
    <wfw:commentRss>http://codeoptimism.net/blog/syndication.axd?post=b2440123-a4f0-4d3f-80f7-dc98d4fc18e8</wfw:commentRss>
  <feedburner:origLink>http://codeoptimism.net/blog/post/2008/07/19/group-sort-tabs-firefox-extension.aspx</feedburner:origLink></entry>
  <entry>
    <id>http://codeoptimism.net/blog/post/2008/05/01/The-Elder-Scrolls-IV-Oblivion-Leveling-Assistant-for-optimal-stat-gain.aspx</id>
    <title>The Elder Scrolls IV: Oblivion Leveling Assistant for optimal stat gain.</title>
    <updated>2008-05-01T20:03:00+00:00</updated>
    <link rel="self" href="http://codeoptimism.net/blog/post.aspx?id=6e3a5502-7513-464b-acd5-4f69658ea5f3" />
    <link href="http://feedproxy.google.com/~r/codeoptimism/~3/gEZXe6NM6CU/The-Elder-Scrolls-IV-Oblivion-Leveling-Assistant-for-optimal-stat-gain.aspx" />
    <author>
      <name>Christopher Galpin</name>
    </author>
    <summary type="html">&lt;p&gt;I've been playing &lt;a href="http://en.wikipedia.org/wiki/The_Elder_Scrolls_IV:_Oblivion"&gt;Oblivion&lt;/a&gt; recently, and it's been fun, but I was slightly irritated with the leveling system, so I fixed it.&lt;/p&gt;&lt;h4&gt;Here's an overview of how &lt;a href="http://en.wikipedia.org/wiki/Experience_points#Power-leveling"&gt;(power?)&lt;/a&gt; leveling works in Oblivion:&lt;/h4&gt;&lt;p&gt;You select 7 "major skills" and the rest become "minor". Skills advance as you use them. Major skills are no different from minor except for an initial bonus and every 10 major skillpoints gained is a new level, at which point you must sleep in a bed to level up and continue gaining skillpoints. Leveling up has you select three of your stats to increase by respective bonuses, but here's the catch: the bonus depends on your advancement in the three skills related to the stat.&lt;/p&gt;&lt;p&gt;This leads to a sort of reversal of priorities. Your "major skills" are more of the opposite, as you postpone them, and thus leveling, to achieve the necessary gains in "minor" skills to maximize the stat bonus when you do finally level. Selecting your least naturally used skills as major skills is in fact to your advantage. A bit strange, but not a dampener on the fun - you can, after all, go all out in the 14 other skills without fear of accidentally leveling and botching your stat bonuses.&lt;/p&gt;&lt;p&gt;There &lt;em&gt;is&lt;/em&gt; quite an annoyance with this approach though. Once you reach the maximum +5 bonus in a stat, skillgain in that area is no longer worth your time until you level up (you'd only be advancing a skill, instead of a skill and a stat) - and aside from gratuitous number keeping, there's no way to see exactly how close you are aside from leveling up, noting the advancement screen, and then restoring to an earlier saved game. Something which becomes extremely tedious considering you must advance to just prior to leveling, save, travel to a bed, use a skill to reach the level point, sleep, level up, pick 3 stats and confirm so you can get to open the main menu, and then restore to your saved game. &lt;/p&gt;&lt;h4&gt;An annoyance until now anyways! Enter: Oblivion Leveling Assistant.&lt;/h4&gt;&lt;p&gt;Utilizing the ever helpful and entertaining &lt;a href="http://www.cheatengine.org/aboutce.php"&gt;Cheat Engine&lt;/a&gt;, I put together a little &lt;a href="http://www.autohotkey.com/"&gt;AutoHotkey&lt;/a&gt; program which displays the current points you have towards a stat since your last level. It takes 2 skillpoints for a +1 stat bonus, and +5 is the maximum, so all you need to do is focus on reaching a value of 10 (or more, but don't waste too many) in the three stats you would like to apply the bonuses to before you gain that last major skillpoint, and that's it. Be sure to put those 10 required major skillpoints towards the stats you'll be selecting as well, or you'll be doing extra work!&lt;/p&gt;&lt;img style="float: left;" src="http://codeoptimism.net/projects/The%20Elder%20Scrolls%20IV%20Oblivion/2008-05-01_1153.png" alt="The Elder Scrolls IV: Oblivion Leveling Assistant" title="The Elder Scrolls IV: Oblivion Leveling Assistant"/&gt;
&lt;div style="float: right; width: 296px;"&gt;&lt;img src="http://codeoptimism.net/projects/The%20Elder%20Scrolls%20IV%20Oblivion/2008-05-01_1153_001.png" alt="The Elder Scrolls IV: Oblivion Leveling Assistant Compact Mode" title="The Elder Scrolls IV: Oblivion Leveling Assistant Compact Mode"/&gt;&lt;/div&gt;
&lt;div class="cvalignO ccol" style="height: 304px;"&gt;&lt;div class="cvalignM"&gt;&lt;p style="line-height: 210%;" class="cvalignI"&gt;Download&lt;br/&gt;&lt;strong&gt;&lt;a rel="enclosure" href="http://codeoptimism.net/projects/The%20Elder%20Scrolls%20IV%20Oblivion/Oblivion%20Leveling%20Assistant.exe"&gt;Oblivion Leveling Assistant (exe)&lt;/a&gt;&lt;/strong&gt;&lt;br/&gt;or&lt;br/&gt;&lt;a href="http://codeoptimism.net/projects/The%20Elder%20Scrolls%20IV%20Oblivion/Oblivion%20Leveling%20Assistant%20AHK%20Scripts.zip"&gt;Oblivion Leveling Assistant AHK Scripts (zip)&lt;/a&gt;&lt;br/&gt;(scripts require &lt;a href="http://www.autohotkey.com/"&gt;AutoHotkey&lt;/a&gt;,&lt;br/&gt;and are &lt;a href="http://www.autohotkey.com/docs/Scripts.htm#ahk2exe"&gt;equal in performance&lt;/a&gt;)&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p style="clear: both;"&gt;This was a tricky update, so if clarification is needed ask me in the comments.&lt;/p&gt;&lt;p&gt;&lt;span class="updateDate"&gt;5-08-08&lt;/span&gt; There's also at &lt;a href="http://www.fuzionmedia.com/oblivion/afleveling.html"&gt;least&lt;/a&gt; a &lt;a href="http://www.irisgames.com/KCAS/KCAS%20Manual.html"&gt;few&lt;/a&gt; &lt;a href="http://www.bethsoft.com/bgsforums/index.php?showtopic=771879"&gt;mods&lt;/a&gt; for Oblivion which overhaul the system to something more acceptable, these might be a lot more useful so you should check them out. (Especially if you play fullscreen and/or use a single display.) Take a look at &lt;a href="http://www.uesp.net/wiki/Oblivion:Must_Have_Mods#Game_Balance_.26_Leveling_Changes"&gt;other&lt;/a&gt; &lt;a href="http://planetelderscrolls.gamespy.com/fms/TopRated.php?content=oblivionmods&amp;amp;sort=Downloads&amp;amp;dir=DESC&amp;amp;w=&amp;amp;p=1"&gt;mods&lt;/a&gt; as well, there's sure to be some you'll consider essential.&lt;/p&gt;&lt;p&gt;I also only just discovered the &lt;a href="http://www.uesp.net/wiki/Main_Page"&gt;UESPWiki&lt;/a&gt; and its wealth of Oblivion and Elder Scrolls information (including much more in-depth &lt;a href="http://www.uesp.net/wiki/Oblivion:Leveling"&gt;leveling guides&lt;/a&gt;), so hopefully I've learned &lt;a href="http://www.gamefaqs.com/computer/doswin/game/924363.html"&gt;GameFAQs&lt;/a&gt; is no longer the one-stop-shop in this new wiki world. &lt;span class="updateEnd"&gt;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/codeoptimism/~4/gEZXe6NM6CU" height="1" width="1"/&gt;</summary>
    <published>2008-05-01T20:03:00+00:00</published>
    <link rel="related" href="http://codeoptimism.net/blog/post/2008/05/01/The-Elder-Scrolls-IV-Oblivion-Leveling-Assistant-for-optimal-stat-gain.aspx#comment" />
    <category term="Projects" />
    <dc:publisher>Christopher Galpin</dc:publisher>
    <dc:description>Focus on optimal stat gain while leveling in The Elder Scrolls IV: Oblivion with this tool.</dc:description>
    <pingback:server>http://codeoptimism.net/blog/pingback.axd</pingback:server>
    <pingback:target>http://codeoptimism.net/blog/post.aspx?id=6e3a5502-7513-464b-acd5-4f69658ea5f3</pingback:target>
    <slash:comments>2</slash:comments>
    <trackback:ping>http://codeoptimism.net/blog/trackback.axd?id=6e3a5502-7513-464b-acd5-4f69658ea5f3</trackback:ping>
    <wfw:comment>http://codeoptimism.net/blog/post/2008/05/01/The-Elder-Scrolls-IV-Oblivion-Leveling-Assistant-for-optimal-stat-gain.aspx#comment</wfw:comment>
    <wfw:commentRss>http://codeoptimism.net/blog/syndication.axd?post=6e3a5502-7513-464b-acd5-4f69658ea5f3</wfw:commentRss>
  <feedburner:origLink>http://codeoptimism.net/blog/post/2008/05/01/The-Elder-Scrolls-IV-Oblivion-Leveling-Assistant-for-optimal-stat-gain.aspx</feedburner:origLink></entry>
  <entry>
    <id>http://codeoptimism.net/blog/post/2007/11/17/General-productivity-enhancements-for-Vista-and-XP-Taskbar.aspx</id>
    <title>General productivity enhancements for Vista (and XP): Taskbar</title>
    <updated>2007-11-18T05:51:00+00:00</updated>
    <link rel="self" href="http://codeoptimism.net/blog/post.aspx?id=8d4a3c99-62e0-4bd0-93dc-b07cdee61c87" />
    <link href="http://feedproxy.google.com/~r/codeoptimism/~3/IdCb4PakOgA/General-productivity-enhancements-for-Vista-and-XP-Taskbar.aspx" />
    <author>
      <name>Christopher Galpin</name>
    </author>
    <summary type="html">&lt;p&gt;This is the first installment of my own personal list of general productivity enhancements for XP/Vista, many of which involve small, resource friendly 3rd-party tools.  My general criteria for OS supplementation tools is as follows: They should be simplistic, small, and speedy.  It's not much use if it doesn't feel as if it's a part of the operating system itself.&lt;/p&gt;
&lt;p&gt;
Unfortunately problems and incompatibilities can arise, and there will be a section at the end to address these.
&lt;/p&gt;
&lt;h2&gt;The Taskbar&lt;/h2&gt;

&lt;p&gt;
If you're like me you would prefer to have all of your &lt;a href="http://blogs.msdn.com/oldnewthing/archive/2003/09/10/54831.aspx"&gt;notification area&lt;/a&gt; icons visible.  However you may find yourself with less than sufficient room on the taskbar for the tasks themselves.  This is especially true if you have a rather wide &lt;a href="http://en.wikipedia.org/wiki/Quick_launch#Microsoft_Windows"&gt;quick launch&lt;/a&gt; area - which can be very valuable, as you'll see in a moment.  Some attempt to alleviate this issue by expanding their taskbar to two separate rows, but the additional bulk at the edge of your screen isn't very pleasing, nor will your pointer movement be &lt;a href="http://www.asktog.com/basics/firstPrinciples.html#fittsLaw"&gt;as precise&lt;/a&gt; now that you've introduced a soft edge instead of the single hard edge of your monitor.
&lt;/p&gt;
&lt;p&gt;
Likewise XP/Vista's &lt;a href="http://codeoptimism.net/images/11_14_2007/11_06_2007%2009_56%20AM.png"&gt;similar task grouping&lt;/a&gt; feature has always struck me as a rather primitive and ineffective solution since you lose quick access to all of your tasks.
&lt;/p&gt;
&lt;p&gt;
A very neat way of opening up space on your taskbar is to move minimized windows to an auto-hidden dock using &lt;a href="http://rocketdock.com/"&gt;RocketDock&lt;/a&gt;: a minimally intrusive, adequately configurable, speedy little Apple-esque application dock.
&lt;/p&gt;
&lt;h3&gt;Configuring &lt;a href="http://rocketdock.com/"&gt;RocketDock&lt;/a&gt; version 1.3.5 as a Minimized Window Dock &lt;/h3&gt;
&lt;p&gt;
&lt;img src="http://codeoptimism.net/images/11_17_2007/2008-02-16_1710.png" alt="RocketDock in action as a minimized window dock." title="RocketDock in action as a minimized window dock."/&gt; 
&lt;/p&gt;
&lt;p&gt;
Although RocketDock is primarily an application launcher, it can be configured to only display minimized windows, as well as be out of your way.  Windows minimized to the dock are not displayed on the main taskbar.
&lt;/p&gt;
&lt;p&gt;
I went to the trouble of exporting my RocketDock registry settings and comparing them to the defaults.  What remains is a &lt;a href="http://en.wikipedia.org/wiki/Windows_Registry"&gt;Windows Registry&lt;/a&gt; file of only the relevant settings for the particular transformation you see pictured above.  I have annotated each of the settings in the file, and you may download it here: &lt;a href="http://codeoptimism.net/projects/RocketDock/RocketDock%20v1.3.5%20minimized%20window%20configuration.reg" rel="enclosure"&gt;RocketDock v1.3.5 minimized window configuration.reg (3.07 kb)&lt;/a&gt;.
&lt;/p&gt;
&lt;p class="important"&gt;
I strongly advise that registry files from every source be previewed in a text-editor before being imported to the registry, due to the awesome and unchecked power that registry modifications can have on your system.  Previewing the above file you should be able to note that the only registry key affected is RocketDock's current user settings at &lt;code&gt;HKEY_CURRENT_USER\Software\RocketDock&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Be advised&lt;/strong&gt;: Holding the &lt;em&gt;Ctrl&lt;/em&gt; key when minimizing a window is designed to bypass minimizing to the dock.  Holding &lt;em&gt;Ctrl+Alt+Shift&lt;/em&gt;
will toggle whether or not to minimize that window to the dock normally
(these are stored in the registry as the process and window class names
I believe). 
&lt;/p&gt;
&lt;p class="update"&gt;
&lt;span class="updateDate"&gt;2-16-08&lt;/span&gt; On Windows Vista systems RocketDock utilizes &lt;a href="http://en.wikipedia.org/wiki/Desktop_Window_Manager"&gt;Desktop Window Manager&lt;/a&gt;
(DWM)'s public API for reliable live window thumbnails. However, rather
unfortunately, in this mode the application's icon is no longer
overlayed on the thumbnail. If you can stomach semi-frequent &lt;a href="http://tracker.punklabs.com/index.php?cmd=view&amp;amp;id=8"&gt;inaccurate thumbnails&lt;/a&gt;, then adjust RocketDock.exe's properties and &lt;a href="http://help.unc.edu/?id=6037"&gt;enable Windows XP compatibility&lt;/a&gt;
for the old (and in my opinion, more useful) behavior seen in the
updated screenshot. Or, as I will be doing, you could register with RocketDock's bugtracker and gently persuade PolyVector to &lt;a href="http://tracker.punklabs.com/index.php?cmd=view&amp;amp;id=156"&gt;add the icon overlay&lt;/a&gt; to Vista DWM thumbnails as well.
&lt;/p&gt;
&lt;h3&gt;Your taskbar is on the wrong edge&lt;/h3&gt;
&lt;p&gt;
&lt;img src="http://codeoptimism.net/images/11_17_2007/11_16_2007%2003_02%20PM.png" alt="Taskbar at top of screen, near application menus." title="Taskbar at top of screen, near application menus."/&gt;
&lt;/p&gt;
&lt;p&gt;
This may be a subject of contention, and you should of course use whatever you prefer, but in my opinion the taskbar is on the wrong side of the screen.  It should be on the top, not the bottom.  Although perhaps jaded from all of the separate versions of Windows happily placing the taskbar at the bottom, I had a moment of clarity in which I questioned the traditional, and I moved beyond.  Why is the top edge the better edge?  The reason is fairly simple: that's where everything else is.  Application menus and buttons have a long history of residence near the top, as well as address bars.  I find it preferable that my eyes and pointer need no longer unnecessarily traverse back and forth between edges.
&lt;/p&gt;
&lt;p&gt;
Now it's true that this will place a buffer between the top edge and &lt;em&gt;maximized &lt;/em&gt;windows - potentially slowing down the time it takes to target the titlebar (for double-click restoring) or the window buttons, but I find those too slow anyways, and &lt;em&gt;don't use them&lt;/em&gt; (subject of a future post).  (Also, maximized windows aren't &lt;a href="http://www.codinghorror.com/blog/archives/000928.html"&gt;quite as useful&lt;/a&gt; as they once were.)&lt;br/&gt;
&lt;/p&gt;
&lt;h3&gt;Use a persistent stand-alone OS toolbar for mouse application launching&lt;/h3&gt;
&lt;p&gt;
&lt;img src="http://codeoptimism.net/images/11_17_2007/11_16_2007%2002_54%20PM.png" alt="A persistent stand-alone OS toolbar." title="A persistent stand-alone OS toolbar."/&gt;
&lt;/p&gt;
&lt;p&gt;
The Quick Launch toolbar is underrated.  What appears to be a small space for launching a few specific applications in an unorganized manner need not be any of these things.  It is rather apparent that the quickest application launching possible with the mouse alone would require the least input and thought from the user.  The start menu is not in the least suitable, requiring far too much scrolling, clicking, and searching for company branded folders, all with the same generic folder icon.  Quick Launch is always immediatly present and visible (unless you use autohide) and it's a one click solution.  Once we've learned to associate an icon with its respective purpose they are much faster to process and far more compact than text.
&lt;/p&gt;
&lt;p&gt;
Unlock your taskkbar if it's locked (context menu).  On XP you could simply grab the Quick Launch toolbar by its border and drag it anywhere you would like - leaving it as a floating toolbar, docking it against an edge, or adding it to an existing toolbar.  On Vista you can't drag around toolbars like this - but you can drag the &lt;em&gt;folder itself&lt;/em&gt; to an edge to create a toolbar, and then as in XP, add additional folders to this toolbar with &lt;em&gt;Toolbars&lt;/em&gt; in the context menu.
&lt;/p&gt;
&lt;p&gt;
So to give Quick Launch its own stand-alone toolbar in Vista it may be fastest to right click the current Quick Launch toolbar, select &lt;em&gt;Open Folder&lt;/em&gt;, navigate up to its parent, and then go ahead and drag "Quick Launch" to an absolute edge of your desktop.  Be careful not to drop the folder on your desktop itself.  Note that there is no cursor change or other indication for this, which is a bit bizarre. 
&lt;/p&gt;
&lt;p&gt;
On my &lt;a href="http://www.woot.com/Blog/BlogEntry.aspx?BlogEntryId=2377"&gt;22" widescreen&lt;/a&gt; monitor at 1680 x 1050 resolution I can fit a maximum of about 70 icons across the bottom (the natural place for the toolbar, since my taskbar is at the top).  
&lt;/p&gt;
&lt;p&gt;
"Now wait a minute Chris.  70?  You said &lt;em&gt;organized&lt;/em&gt;."
&lt;/p&gt;
&lt;p&gt;
70 &lt;em&gt;maximum&lt;/em&gt;.  Use as many program shortcuts as you find agreeable, and would like to launch in a single click.  For &lt;em&gt;everything&lt;/em&gt; else there's a two click solution: 
&lt;/p&gt;
&lt;h3&gt;Never navigate your start menu again: Quick Launch pop up menus&lt;/h3&gt;
&lt;p&gt;
&lt;img src="http://codeoptimism.net/images/11_17_2007/11_15_2007%2008_20%20PM.png" alt="My menuApp configuration as an example." title="My menuApp configuration as an example."/&gt;
&lt;span style="display: block;" class="caption"&gt;You can view a little video of my &lt;a href="http://blip.tv/file/484191"&gt;full configuration&lt;/a&gt; for organizational ideas.&lt;/span&gt;
&lt;/p&gt; 

&lt;p&gt;
I know of &lt;em&gt;two&lt;/em&gt; beautiful universal pop-up menu applications.  &lt;a href="http://www.digitallis.co.uk/pc/ShortPopUp/index.html"&gt;ShortPopUp&lt;/a&gt; and &lt;a href="http://www.desktopapps.co.uk/menuApp.html"&gt;menuApp&lt;/a&gt;.  They both operate the same: they show a pop-up menu of the contents of the folder in which they are run.  Therefore creating a shortcut to either of these programs and specifying a folder full of shortcuts (or files) as the folder to "Start in" yields a fantastic menu for your toolbar.  There are essential differences between the two.
&lt;/p&gt;
&lt;div class="lcol2"&gt;
&lt;h4&gt;&lt;a href="http://www.desktopapps.co.uk/menuApp.html"&gt;menuApp&lt;/a&gt; v1.04
&lt;/h4&gt;
&lt;p&gt;
&lt;strong&gt;Pros&lt;/strong&gt;: &lt;em&gt;very&lt;/em&gt; fast with a background server and cache (but server crashes under Vista)
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;still&lt;/em&gt; faster than ShortPopUp under Vista with server disabled
&lt;/p&gt;
&lt;p&gt;
easily use separate configurations in one ini file 
&lt;/p&gt;
&lt;p&gt;
very little configuration, would "just work" if not for the Vista problem
&lt;/p&gt;
&lt;p&gt;
support for special folders, like a task list
&lt;/p&gt;
&lt;p&gt;
never displays shortcut arrow overlay on menu items
&lt;/p&gt;
&lt;p&gt;
sorting always works
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Cons&lt;/strong&gt;: context menu problems for menu items (untested on XP): &lt;em&gt;Properties&lt;/em&gt; doesn't work, &lt;em&gt;Delete&lt;/em&gt; doesn't give a confirmation, etc.
&lt;/p&gt;
&lt;p&gt; non-shortcut file extension text is always visible ".txt" etc. (if bothersome you can always create shortcuts to work around this in small instances)  &lt;/p&gt;
&lt;/div&gt;
&lt;div class="rcol2"&gt;
&lt;h4&gt;&lt;a href="http://www.digitallis.co.uk/pc/ShortPopUp/index.html"&gt;
ShortPopUp&lt;/a&gt; v4.1
&lt;/h4&gt;
&lt;p&gt;
&lt;strong&gt;Pros&lt;/strong&gt;: &lt;em&gt;highly&lt;/em&gt; configurable: display, sorting, etc.
&lt;/p&gt;
&lt;p&gt;
easily use separate ini configurations 
&lt;/p&gt;
&lt;p&gt;
invalid shortcuts display disabled
&lt;/p&gt;
&lt;p&gt;
can access &lt;em&gt;Properties&lt;/em&gt;, etc. of menu items through context menu
&lt;/p&gt;
&lt;p&gt;
easily hide any or all file extension suffixes
&lt;/p&gt;
&lt;p&gt;
little bits of humor in the documentation (&lt;em&gt;okay, this doesn't count&lt;/em&gt;) 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Cons&lt;/strong&gt;: context menu problems for menu items (untested on XP): they can't be escaped/dismissed without a selection, and selections click through to the underlying menu
&lt;/p&gt;
&lt;p&gt;
can't hide every shortcut arrow overlay
&lt;/p&gt;
&lt;p&gt;
slower than MenuApp
&lt;/p&gt;
&lt;p&gt;
requires configuration (default is very bare bones, no icons, etc.)
&lt;/p&gt;
&lt;p&gt;
sorting seems to fail in several cases, I have yet to understand why, different sorting configurations don't seem to fix it
&lt;/p&gt;

&lt;/div&gt;
&lt;p style="clear: both;"&gt;
When I made my decision between the two some time ago, I believe I chose ShortPopUp, configured to be &lt;a href="http://codeoptimism.net/projects/menuApp%20%26%20ShortPopUp/Programs.ini"&gt;quite similar&lt;/a&gt; to menuApp, because it was more stable.  I seem to recall that menuApp would not work at all in some common cases unless I used Vista's compatibility mode - but this slowed it down.  However, while compiling this list I deleted menuApp's configuration file and allowed it to be recreated (there was at least one peculiar entry in there), and I also have Windows Aero enabled (having it disabled has given me compatibility problems before).  I compared each of my menus with each program, and menuApp's speed is just too appreciated; it is my tool of choice. 
&lt;/p&gt;
&lt;h3&gt;
Middle click close and rearrange tasks with &lt;a href="http://www.freewebs.com/nerdcave/taskbarshuffle.htm"&gt;Taskbar Shuffle&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;
&lt;img src="http://codeoptimism.net/images/11_17_2007/11_16_2007%2005_31%20PM.png" alt="Repositioning my 'Downloads' folder task with Taskbar Shuffle." title="Repositioning my 'Downloads' folder task with Taskbar Shuffle."/&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.freewebs.com/nerdcave/taskbarshuffle.htm"&gt;
Taskbar Shuffle&lt;/a&gt; is a fantastic lightweight tool which enables you to rearrange tasks with drag and drop, and most importantly, &lt;strong&gt;middle click close&lt;/strong&gt;.  (If you don't already use the middle mouse button to open and close tabs in your web browser, you may want to start.)  Taskbar Shuffle also provides the means to rearrange notification area icons via holding down &lt;em&gt;Ctrl&lt;/em&gt;.
&lt;/p&gt;
&lt;h2&gt;A small issue or two, which may or may not apply to you &lt;/h2&gt;
&lt;p&gt;
Unfortunately there are some minor problems with these recommendations.
&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;&lt;p&gt;&lt;strong&gt;Upper edge taskbar&lt;/strong&gt;: Many programs attempt to be helpful by positioning themselves at the very top of your screen in an unintelligent manner.  If your taskkbar is at the top edge then these windows will be obscured and you'll have to resort to using the keyboard to reposition them (or temporarily repositioning the taskbar).  Right click their task in the taskbar, select &lt;em&gt;Move&lt;/em&gt;, and press a directional arrow key on your keyboard.  The window will now be attached to your mouse and free to reposition.  (As &lt;em&gt;Alt+Spacebar&lt;/em&gt; opens the same menu for the focused window, I tend to use &lt;em&gt;Alt+Spacebar+M+directional arrow&lt;/em&gt;.)&lt;/p&gt;
&lt;p&gt;I'm sure this can in fact be automatically worked around with an &lt;a href="http://www.autohotkey.com/"&gt;AutoHotkey&lt;/a&gt; script for instance.  Since I have a bit of a love affair with AutoHotkey I don't find this too inconvenient of a solution, and will likely whip up a script when I have time.&lt;/p&gt;&lt;/li&gt;
	&lt;li&gt;&lt;p&gt;&lt;strong&gt;RocketDock and UltraMon&lt;/strong&gt;: Unfortunately the &lt;em&gt;extremely&lt;/em&gt; helpful &lt;em&gt;Move window to next monitor&lt;/em&gt; hotkey feature of UltraMon (which isn't discussed in this entry) has a very annoying issue with RocketDock, where windows, while technically moved, are minimized to the dock.  Neither program is really to blame for this problem.&lt;/p&gt;
&lt;p&gt;I indeed crafted an AutoHotkey script to fix this, but then realized a much simpler solution was to include &lt;em&gt;Ctrl&lt;/em&gt; (but not &lt;em&gt;Ctrl+Alt+Shift&lt;/em&gt;, see above) in the hotkey, since minimizing a window with Ctrl bypasses RocketDock.  So that's an easy fix.  However, since this means Ctrl must be held down until the window is minimized, you can't make a mouse binding (or some other automation) which rapidly sends the hotkey and expect it to work.  Since I use a mouse binding I may be resurrecting an extremely simplified AutoHotkey script which merely waits for the minimization before releasing Ctrl.&lt;/p&gt;
&lt;p class="update"&gt;&lt;span class="updateDate"&gt;3-25-08&lt;/span&gt; Fix available &lt;a href="http://codeoptimism.net/projects/AutoHotkey/UltraMonRocketDock_MoveWindowMonitorFix.ahk" rel="enclosure"&gt;here&lt;/a&gt;.  Requires &lt;a href="http://www.autohotkey.com/"&gt;AutoHotkey&lt;/a&gt;.  Modify the opening lines for your (true) hotkey and UltraMon's, respectfully.  It even refocuses window controls beyond UltraMon's ability.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;img src="http://feeds.feedburner.com/~r/codeoptimism/~4/IdCb4PakOgA" height="1" width="1"/&gt;</summary>
    <published>2007-11-18T05:51:00+00:00</published>
    <link rel="related" href="http://codeoptimism.net/blog/post/2007/11/17/General-productivity-enhancements-for-Vista-and-XP-Taskbar.aspx#comment" />
    <category term="General" />
    <dc:publisher>Christopher Galpin</dc:publisher>
    <dc:description>How a minimized windows dock, a persistent stand-alone Quick Launch toolbar with pop-up menus, and Taskbar Shuffle will improve your Windows experience by beginning with the taskbar.</dc:description>
    <pingback:server>http://codeoptimism.net/blog/pingback.axd</pingback:server>
    <pingback:target>http://codeoptimism.net/blog/post.aspx?id=8d4a3c99-62e0-4bd0-93dc-b07cdee61c87</pingback:target>
    <slash:comments>9</slash:comments>
    <trackback:ping>http://codeoptimism.net/blog/trackback.axd?id=8d4a3c99-62e0-4bd0-93dc-b07cdee61c87</trackback:ping>
    <wfw:comment>http://codeoptimism.net/blog/post/2007/11/17/General-productivity-enhancements-for-Vista-and-XP-Taskbar.aspx#comment</wfw:comment>
    <wfw:commentRss>http://codeoptimism.net/blog/syndication.axd?post=8d4a3c99-62e0-4bd0-93dc-b07cdee61c87</wfw:commentRss>
  <feedburner:origLink>http://codeoptimism.net/blog/post/2007/11/17/General-productivity-enhancements-for-Vista-and-XP-Taskbar.aspx</feedburner:origLink></entry>
  <entry>
    <id>http://codeoptimism.net/blog/post/2007/10/08/20071008.aspx</id>
    <title>Investigating Vista's broken file type indexing dialog à la Mark Russinovich</title>
    <updated>2007-10-08T16:56:00+00:00</updated>
    <link rel="self" href="http://codeoptimism.net/blog/post.aspx?id=2ccf870b-aa45-4e0f-a4e2-e9154f4020f1" />
    <link href="http://feedproxy.google.com/~r/codeoptimism/~3/ApYfj2ZtTRY/20071008.aspx" />
    <author>
      <name>Christopher Galpin</name>
    </author>
    <summary type="html">&lt;p&gt;
So the Thursday before last I set out to configure Vista's file indexing to only index file extensions of type &lt;cite&gt;lnk&lt;/cite&gt; and &lt;cite&gt;exe&lt;/cite&gt;, as I already had it configured to only index the locations on my computer which contained program shortcuts, but I wanted to extend these locations to include a folder of standalone executables and launch them from my start menu as well.
&lt;/p&gt;
&lt;p&gt;
 But lo, I encountered this:
&lt;/p&gt;
&lt;img title="truncated Vista File Indexing Advanced Options dialog" alt="truncated Vista File Indexing Advanced Options dialog" src="http://codeoptimism.net/images/10_08_2007/09_27_2007%2008_59%20PM.png"/&gt;
&lt;p&gt;Just where exactly did all of my file types go?  You can see from the screenshot that the list stopped at &lt;cite&gt;.ado&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;
Well, like any good Windows troubleshooter, I turned to Sysinternal's essential &lt;a href="http://www.microsoft.com/technet/sysinternals/utilities/processmonitor.mspx"&gt;Process Monitor&lt;/a&gt;.  I re-opened the file type dialog, this time with monitoring enabled, and performed a search for the last file type on the list, &lt;cite&gt;.ado&lt;/cite&gt;.
&lt;/p&gt;
&lt;img title="Process Monitor log with .ado and .adobebridge highlighted; .adobebridge 'Access Denied'" alt="Process Monitor log with .ado and .adobebridge highlighted; .adobebridge 'Access Denied'" src="http://codeoptimism.net/images/10_08_2007/09_27_2007%2009_03%20PM.png"/&gt;
&lt;p&gt;As you can see from the lines I highlighted in the screenshot above, Vista was failing to read the next file extension in the list, &lt;cite&gt;.adobebridge&lt;/cite&gt;, and presenting an &lt;em&gt;Access Denied&lt;/em&gt; error.&lt;/p&gt;
&lt;p&gt;
Using Process Monitor's oh so useful &lt;em&gt;Jump To...&lt;/em&gt; context menu feature, I jumped straight to the registry key having difficulty, and sure enough:
&lt;/p&gt;
&lt;img title="Error Opening Key: .adobebridge cannot be opened.  An error is preventing this key from being opened.  Details: Access is denied." alt="Error Opening Key: .adobebridge cannot be opened.  An error is preventing this key from being opened.  Details: Access is denied." src="http://codeoptimism.net/images/10_08_2007/09_27_2007%2009_07%20PM.png"/&gt;
&lt;p&gt;How interesting.  Using the key's context menu to view and modify its permissions presented me with this amusing (but accurate, I suppose) little message box before presenting the actual Permissions dialog.&lt;/p&gt;
&lt;img src="http://codeoptimism.net/images/10_08_2007/09_30_2007%2006_06%20AM.png" alt="Windows Security: You do not have permission to view the current permission settings for .ado, but you can make permission changes." title="Windows Security: You do not have permission to view the current permission settings for .ado, but you can make permission changes."/&gt;
&lt;p&gt;
Using the &lt;em&gt;Ownership&lt;/em&gt; tab under &lt;em&gt;Advanced&lt;/em&gt; to take ownership of the key allowed me to see the permission settings:
&lt;/p&gt;
&lt;img title="Permissions for .adobebridge: No groups or users have permission to access this object.  However, the owner of this object can assign permissions." alt="Permissions for .adobebridge: No groups or users have permission to access this object.  However, the owner of this object can assign permissions." src="http://codeoptimism.net/images/10_08_2007/09_27_2007%2009_11%20PM.png"/&gt;
&lt;p&gt;As you can see, there are no permissions set at all.  Adding the &lt;em&gt;Users&lt;/em&gt; group and granting them &lt;em&gt;Read&lt;/em&gt; privileges was enough to fix the dialog, but it takes write privileges to be able to actually toggle indexing on and off for the file type, so I made sure to add the &lt;em&gt;Administrators&lt;/em&gt; group and grant them &lt;em&gt;Full Control&lt;/em&gt;.  (&lt;a href="http://en.wikipedia.org/wiki/User_Account_Control"&gt;UAC&lt;/a&gt; prompts you to allow the &lt;em&gt;Advanced&lt;/em&gt; settings dialog to be launched with administrative rights when you first enter it, as denoted by the icon on the button: &lt;img src="http://codeoptimism.net/images/10_08_2007/10_08_2007%2010_14%20PM.png" alt="'Advanced' button with UAC shield" title="'Advanced' button with UAC shield"/&gt;)  As it turned out that there were a dozen or so other keys the dialog choked on which required the same modification.  They didn't all have blank permissions, but none of them had read access for my account.
&lt;/p&gt;
&lt;p&gt;
I'm not sure what's broken here, perhaps the software or installers which added these file extensions did so improperly, or maybe it was intentional and they didn't realize the entire file type indexing dialog would break when it was denied access.  Either way I would gander that the dialog behavior is most certainly a bug.
&lt;/p&gt;
&lt;p&gt;
Unfortunately I'm not an expert when it comes to Windows &lt;em&gt;Permissions&lt;/em&gt; setting, as I've never interacted with them on more than a casual basis, and I've done very little in the way of inheriting and propogating permissions, so I'm curious about the most appropriate and efficient solution to a scenario like this.   &lt;em&gt;Include inheritable permissions from this object's parent&lt;/em&gt; was enabled for the registry keys with the problem, and other working keys claimed to be inheriting permissions from their parent, but I looked at the permissions on &lt;code&gt;HKEY_CLASSES_ROOT&lt;/code&gt; and there appeared to be none to propogate.  So perhaps that is not their parent?  Any revealing information would be welcome.
&lt;/p&gt;
&lt;p&gt;
(Note: &lt;a href="http://en.wikipedia.org/wiki/Mark_Russinovich"&gt;Mark Russinovich&lt;/a&gt; of Sysinternals does an &lt;a href="http://blogs.technet.com/markrussinovich/default.aspx"&gt;ever enlightening job&lt;/a&gt; of educating us on Windows internals, making copious use of &lt;a href="http://www.microsoft.com/technet/sysinternals/utilities/processmonitor.mspx"&gt;Process Monitor&lt;/a&gt; in the process.)
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/codeoptimism/~4/ApYfj2ZtTRY" height="1" width="1"/&gt;</summary>
    <published>2007-10-08T16:56:00+00:00</published>
    <link rel="related" href="http://codeoptimism.net/blog/post/2007/10/08/20071008.aspx#comment" />
    <category term="General" />
    <dc:publisher>Christopher Galpin</dc:publisher>
    <dc:description>Cause and solution for Vista's file indexing file type dialog only displaying a partial list of file extensions.</dc:description>
    <pingback:server>http://codeoptimism.net/blog/pingback.axd</pingback:server>
    <pingback:target>http://codeoptimism.net/blog/post.aspx?id=2ccf870b-aa45-4e0f-a4e2-e9154f4020f1</pingback:target>
    <slash:comments>5</slash:comments>
    <trackback:ping>http://codeoptimism.net/blog/trackback.axd?id=2ccf870b-aa45-4e0f-a4e2-e9154f4020f1</trackback:ping>
    <wfw:comment>http://codeoptimism.net/blog/post/2007/10/08/20071008.aspx#comment</wfw:comment>
    <wfw:commentRss>http://codeoptimism.net/blog/syndication.axd?post=2ccf870b-aa45-4e0f-a4e2-e9154f4020f1</wfw:commentRss>
  <feedburner:origLink>http://codeoptimism.net/blog/post/2007/10/08/20071008.aspx</feedburner:origLink></entry>
</feed>
