<?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:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xml:lang="en-us">
  <title>Peter Seale's weblog - SharePoint | PowerShell | Awesomeness</title>
  <link rel="alternate" type="text/html" href="http://www.pseale.com/blog/" />
  
  <logo>http://www.pseale.com/favicon.ico</logo>
  <icon>favicon.ico</icon>
  <updated>2009-10-28T00:01:27.4456038-07:00</updated>
  <author>
    <name>Peter Seale</name>
  </author>
  <subtitle />
  <id>http://www.pseale.com/blog/</id>
  <generator uri="http://dasblog.info/" version="2.2.8279.16125">DasBlog</generator>
  <link rel="self" href="http://feeds.feedburner.com/pseale" type="application/atom+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry>
    <title>SharePoint 2007 Posts: Recap</title>
    <link rel="alternate" type="text/html" href="http://www.pseale.com/blog/SharePoint2007PostsRecap.aspx" />
    <id>http://www.pseale.com/blog/PermaLink,guid,ad67f0be-08e4-4ef0-8283-4f12a1cb8d1a.aspx</id>
    <published>2009-10-28T00:01:27.4456038-07:00</published>
    <updated>2009-10-28T00:01:27.4456038-07:00</updated>
    <category term="SharePoint" label="SharePoint" scheme="http://www.pseale.com/blog/CategoryView,category,SharePoint.aspx" />
    <content type="html">&lt;p&gt;
I think now's a good time to close out the SharePoint tag on this blog, marking the
end of SharePoint 2007-focused content. I'm creating this post as a sort of table
of contents for my SharePoint content. I'll attempt to group posts into themes and
then editorialize. Some of my earlier posts I'll even recant! Here goes.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Things I think anyone (SharePoint community or otherwise) would find interesting
or useful&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/ThinkingCreatively.aspx"&gt;Thinking Creatively&lt;/a&gt; -
what I consider possibly my best SharePoint-related post, because it contains transferable
concepts. The idea is that we as developers must go beyond our traditional code monkey
role and do some critical thinking while specifying/designing solutions to problems.
This is illustrated with an excellent story told during an Agile conference session.
Also I recommend the linked Agile Toolkit podcast episode that inspired my post.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/TheSharePointPythonConnection.aspx"&gt;The SharePoint-Python
connection&lt;/a&gt; - if anyone ever tells you "SharePoint was written in Python", I apologize.
Anyway, misquoting aside, this is a fun little bit of history.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/SharePointFarmsAndMySite.aspx"&gt;Golden Rule of
Troubleshooting&lt;/a&gt; - I misdiagnosed an error, posted the erroneous diagnosis to my
blog, and to save face hurriedly changed the contents of this post to be about troubleshooting.
The golden rule of troubleshooting, for those of you too lazy to click through: &lt;strong&gt;beware
the invisible proxy&lt;/strong&gt;! It takes many forms! It strikes silently! Everyone will
think you're crazy when you tell them network gremlins are eating your incoming packets,
but leaving your outgoing packets alone!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;Hilarity&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/WelcomeToSharePoint.aspx"&gt;Welcome to SharePoint&lt;/a&gt; -
a real-life nightmare scenario I encountered while troubleshooting a SharePoint 2003
"desktop issue." It turns out, the 15 pages of IE settings + Active Directory group
policy + various Office ActiveX controls + virus scanners + IE version mix + network
security appliances + Kerberos + firewalls + IE Zone settings + DNS/DHCP issues +
AD replication issues + expired password issues + routing errors + spammy IE toolbars&amp;hellip;any
and all of these things, if out of whack, show the same "username/password" dialog.
The post was a joke, but after troubleshooting every flavor of this problem, it gets
to you a little. Anyway, welcome!&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/WhatsWrongWithThisPicture.aspx"&gt;What's wrong with
this picture?&lt;/a&gt; - mildly amusing scenario involving disaster recovery documentation.
Trust me, this is as hilarious as disaster recovery documentation is going to get.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/STSADMEXESpotTheTypo.aspx"&gt;STSADM: Spot the typo&lt;/a&gt; -
a lament for the endash. This is as much hilarity as you'll find on the topic of Word
AutoCorrect.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;Frustration&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/AngryAtCAML.aspx"&gt;Angry at CAML&lt;/a&gt; - I remember
writing this post after a three days of wrestling with GetListItems, most of which
was wasted learning idiosyncrasies. I then deleted most of the unhelpful angry comments,
so what remains is the milder parts. This was my first "surprised by how difficult
it is compared to how easy everyone makes it sound" experience. Visit for a link to
the &lt;a href="http://www.dba-oracle.com/redneck.htm"&gt;greatest Oracle DBA ever&lt;/a&gt;.
Or visit for my graphical representation of the MSDN Rage Meter.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/ImLikeAngryAtNumbers.aspx"&gt;I'm like, angry at
numbers&lt;/a&gt; - in burnout mode, and ranting. If there's anything to take away from
this, it's a) keep a sense of perspective (i.e. this stuff isn't important), and b)
don't invest time in new Microsoft frameworks as a rule.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/DisposingSharePointObjectsSurvivalMode.aspx"&gt;Disposing
SharePoint Objects: Survival Mode&lt;/a&gt; - this was a tipping point wherein I realized
that no one does SharePoint development properly, even most of the MVPs. Keith eventually
discovered and wrote down all of the disposal rules, and from there someone at Microsoft
released SPDisposeCheck (which I believe covers most scenarios). Anyway, the subject
of disposing is now a moot point&amp;#8212;the more interesting bit is that, as of two
full years after RTM, we had incorrect guidance as to how to dispose ~2MB objects
on web servers typically running a maximum ~1000MB in the worker process. Sort of
an eye-opener.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/BeyondTechnicalChallenges.aspx"&gt;Beyond technical
challenges&lt;/a&gt; - rant, wherein I close the SharePoint 2007 portion of my blog (oops&amp;#8212;the
ban lasted a full month anyway, until I couldn't hold out). There are some takeaways
here, notably that everyone's struggling with SharePoint, including the MVPs and "experts."
I make the statement that every person working with SharePoint should look beyond
their immediate technical challenge and ask, is SharePoint the right solution? Also,
I challenge the assumption that SharePoint is a good developer platform.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;SharePoint as an app dev platform&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
[also referenced in the "useful" section above] &lt;a href="http://www.pseale.com/blog/ThinkingCreatively.aspx"&gt;Thinking
Creatively&lt;/a&gt; - what I consider possibly my best SharePoint-related post, because
it contains transferable concepts. The idea is that we as developers must go beyond
our traditional code monkey role and do some critical thinking while specifying/designing
solutions to problems. This is illustrated with an excellent story told during an
Agile conference session. Also I recommend the linked Agile Toolkit podcast episode
that inspired my post.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/ArgueWithYourCustomer.aspx"&gt;Argue with your customer&lt;/a&gt; -
I think I posted this after failing to convince my customer to go with less SharePoint
customization and more out-of-the-box features. I still get a lot of pushback when
I try to prevent SharePoint customizations. If there's something to take away from
this, especially as a non-SharePoint developer, it's that not all features cost the
same, and not all customizations cost the same. Making the relative costs clear to
your customer should (&lt;em&gt;should!&lt;/em&gt;) encourage them to avoid the more costly customizations.
I'm always shocked at how someone will tell you "no, we need it to work exactly as
I've told you!" and then turn around settle for a vendor product that does about half
of what they want, but costs more.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/80ThenStop.aspx"&gt;80%, then stop&lt;/a&gt; - wherein
I tell a story about my experience with the Pareto principle as it applies to SharePoint
solutions. Also: you don't have to write your apps in SharePoint! If it doesn't save
time, and you don't know of any benefit you'll gain from using SharePoint, then why
are you attempting to use it?&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/EstimatingSharePointTasksCryForHelp.aspx"&gt;Estimating
SharePoint tasks: cry for help&lt;/a&gt; - scary realization that I'm still unable to estimate
how long something's going to take, primarily because I'm constantly blazing new (new
to me?) trails in the SharePoint API, making bad assumptions about its behavior, triggering
bugs, and running into unexpected limitations. Any of these things can cause multi-day
delays. It does get better if you're writing a second or third app that deals with
the same part of the API.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;Framework limitations or errors&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/SharePoint2007HowManyIsTooManyItems.aspx"&gt;How
many is too many [SharePoint list] items?&lt;/a&gt; - the SharePoint whitepaper announcing
the 2000 (now 3000) item limit per container was something of a blow. To say it clearly:
this limitation prevents you from using OOB lists for anything with real traffic.
There are over 3000 days in 10 years, so at 1 item added a day, you're running into
the recommended limit. Since then I've seen some crazy errors with large lists, mostly
revolving around OutOfMemory errors, crawl errors, using PRIME-derived features on
the lists, exporting to Excel, breaking the Grid-view, and so on. So the list size
limitation is real, if not a "hard limit."&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/SharePointWorkflowNuttinessVolume1.aspx"&gt;SharePoint
Workflow Nuttiness, Volume 1&lt;/a&gt; - My initial foray into SharePoint Workflow development
ended in pain, where I had to scrap an entire approach because Workflow doesn't support
state machines with replicator activites. Then I read Ayende's JFHCI series and it
poisoned me forever against WF. I wonder now what problem Workflow attempts to solve,
and why don't we just use a pure code solution instead? Note that Ayende wrote a book
on DSLs (Workflow is a form of a DSL), so don't just pretend he's some crank with
a blog*. Final note: this is one of my top 3 most visited posts, so apparently lots
of people have run into the specific issue.&lt;br&gt;
&lt;strong&gt;&lt;font size="1"&gt;*I'm aware that by definition, I'm a crank with a blog&lt;/font&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/Ken332DaysLaterTodayIsYourLuckyDay.aspx"&gt;Illegitimate
ErrorWebParts&lt;/a&gt; - a crazy solution to a crazy problem&amp;#8212;here I use the "crank
the chainsaw a few times" metaphor to describe loading a SPLimitedWebPartManager.
Really, this is bad.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/DingoesStoleMyBabies.aspx"&gt;Dingoes stole my babies!&lt;/a&gt; -
wherein I discuss a problem with moving wiki content via the PRIME API.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/SharePointAwesomenessUserProfiles.aspx"&gt;SharePoint
awesomeness: User Profiles&lt;/a&gt; - wherein I discuss a potential benefit of functioning
User Profiles. Unfortunately this post was premature, because the scenario I envisioned/laid
out in the post wasn't possible out-of-the-box. Oops! Another framework limitation.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/ChangingThePDFIconInSharePoint.aspx"&gt;SharePointPdfIcon
project&lt;/a&gt; - wherein I announce my (failed) CodePlex project. It works great for
single-server farms, incidentally. I just can't be bothered to spend the time to write
all the timer job junk to make it work on multi-server farms when even this souped-up
solution won't work when someone adds a new server to the farm after activating the
Feature&amp;hellip;this is one of those cases where using the SharePoint deployment framework
causes more pain than deploying changes the "vanilla" way. Ugh.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;PowerShell + SharePoint&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/LutzReflectorAndSharePointFindTheDLLs.aspx"&gt;Find
the DLLs&lt;/a&gt; - After determining that Lutz' (now RedGate) Reflector is a core tool
for SharePoint development, the next step was acquiring the DLLs from wherever they
lay. Enter gratuitous use of PowerShell to solve the problem.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/PowerShellIsMagicPartOneOfInfinity.aspx"&gt;PowerShell
is Magic: Part 1&lt;/a&gt; - wherein I demonstrate PowerShell calling STSADM but also calculating
on the fly. PowerShell is really, really useful.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/PowerShellIsMagicPartTwoOfInfinity.aspx"&gt;PowerShell
is Magic: Part 2&lt;/a&gt; - wherein I describe (poorly) how the PowerShell REPL is powerful.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/SharePointPlusPowerShellWorkingWithWikis.aspx"&gt;SP
+ PS: Working with wikis&lt;/a&gt; - wherein I give a pretty weak (but like the movies say,
based on true events) example of how I use PowerShell to solve problems.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/WhyPowerShellReadability.aspx"&gt;Why PowerShell:
Readability&lt;/a&gt; - wherein I take another shot at explaining how PowerShell launches
processes (console apps)&amp;hellip;and get the explanation wrong. I should probably post
an update or something. Also, PowerShell can be made to be readable (though like Perl
can be made to be abomination).&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/PowerShellPlusSharePointCornucopia.aspx"&gt;PS +
SP: Cornucopia&lt;/a&gt; - wherein I list all the real-world uses I've found for PowerShell
working with SharePoint. PowerShell is uniquely useful for SharePoint, because SharePoint
has a) an incomplete admin UI, b) huge object model that's loaded into the GAC, c)
incomplete MSDN documentation, necessitating experimentation, and d) so much XML!
Probably other reasons, but those are the big ones. &lt;strong&gt;Also, Visual Studio post-build
tasks are the devil.&lt;/strong&gt; I'm now ashamed of me of a year ago. Shame on you, 2008-me.&lt;/li&gt;
&lt;li&gt;
Useful PowerShell functions I've written. I've looked at others' PowerShell functions
and I think it's a lot simpler to do away with logging, comments, object disposal,
and attempts to improve performance. All things are appropriate in context, but for
me, these are mostly throwaway ad-hoc scripts, and are thus simple and focused.&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://poshcode.org/1251"&gt;Write-ListDetails&lt;/a&gt; - particularly, discovering
(and recording useful information about) large lists&amp;#8212;and remember, this is PowerShell,
so you can pull ANY data you want, no matter how complex the criteria or where the
data originates.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://poshcode.org/1304"&gt;Run-Query&lt;/a&gt; - think of this as a REPL for your
SharePoint Enterprise Search SQL queries. Returns pretty objects, not a DataTable.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://poshcode.org/1264"&gt;Get-CrawlHealth&lt;/a&gt; - I used this to prototype
the functionality I wanted, then built it into a _layouts page. The script works though
(with the exception of the $contentSource.CrawlCompleted property, which is inaccurate
and worthless)&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://poshcode.org/925"&gt;Update-SearchScopes&lt;/a&gt; - on demand! You can't do
this via the UI.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://poshcode.org/1306"&gt;Get-UserProfile and Get-UserProfileData&lt;/a&gt; - the
first function retrieves the UserProfile object, the second function maps the (nigh-impenetrable)
property collection to real properties. Useful for bulk data export and for examining
your user profile data in a meaningful way. 
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;Informational (knowledge, not concepts)&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/BriefestIntroductionToGetListItemsUsingCAMLAndListsasmx.aspx"&gt;Briefest
introduction to GetListItems using CAML and lists.asmx&lt;/a&gt; - by now there are much
better (and more accurate) guides to GetListItems. What may be amusing to you is the
comments I leave on each line of code&amp;#8212;wherein I document how uncertain I am
of what each element does. The MSDN documentation has improved since 2007. As a small
bonus, I'll note that this runs against WSSv2, not SharePoint 2007.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/DontDeleteTheDefaultAppPool.aspx"&gt;Don't delete
the default app pool&lt;/a&gt; - nitty-gritty details on IIS configuration. Note to anyone
who has rolled out a SharePoint farm: congratulations, you're now qualified to roll
out any ASP.NET app! Personally I'm pumped this knowledge transfers.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/FirefoxSupportsAutoNTLMLogins.aspx"&gt;Firefox supports
auto-NTLM logins&lt;/a&gt; - most of you aren't aware that you can use Firefox and visit
your SharePoint sites, and not be so aggravated by login boxes&amp;#8212;Firefox supports
automatic NTLM authentication in a manner similar to IE! Follow the directions to
enable it.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/CiscoNLBHealthCheckSetupInSharePoint.aspx"&gt;Cisco
NLB setup in SharePoint&lt;/a&gt; - because I'm still the only resource for this in the
entire world. Ridiculous.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/SharePointSearchFasterThanYouThink.aspx"&gt;SharePoint
search - faster than you think&lt;/a&gt; - wherein I complain about how slow IE is and how
it is to blame for many of SharePoint's "performance issues." Honestly, it's true&amp;#8212;try
loading SharePoint pages in Firefox, they're way faster. Also it helps if the page
doesn't load 1MB of JavaScript and another 1MB of inline style text.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/SharePointTimerJobs.aspx"&gt;SharePoint Timer Jobs&lt;/a&gt; -
here I attempt to shift from unhelpful ranting, to a post designed to help others
avoid pain. I'm happy to say this is one of the top 3 posts, and hopefully it's helping
people. Specifically, I mention that Timer Job updates require the manual reset of
each Timer service on each server, and provide a script to quickly reschedule a timer
job. Small footnote: I would rewrite the PowerShell script today such that it was
a single function that takes arguments instead of requiring customization of the script.
Functions are self-contained, and can easily be pasted into a PowerShell window (e.g.
a PS window running remotely on a server!) without accidentally executing anything.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.sharepointdevwiki.com/display/public/People+Search"&gt;Project retrospective
on my People Search project&lt;/a&gt; - raw stream of consciousness, in bullet-point form.
I didn't want to spend much time prettying it up, but reading the list of limitations,
recommended customizations and preferred AD setup can save you weeks (and pain!) on
your People Search project.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;Cruft&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/SharePointSearchFindBuriedContent.aspx"&gt;My SharePoint
search page&lt;/a&gt; - to be clear, this is a static HTML page I made with search boxes
to to search Google, search USENET, search the Technet forums, and search Google Reader.
It's mostly broken now, and eventually I'll take it down. I used it A LOT while doing
farm architecture-y type work, and used it heavily when troubleshooting in the early
days. Now that I'm more development-focused, I've found I don't use it. Ever. Takeaway
for everybody: Technet forums search covers more than Google does. If you're desperate
enough, search both Google and the Technet forums (called MSDN Social now?).&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/SharePointSearchPageHottestOfTheHot.aspx"&gt;SharePoint
search page - hottest of the hot!&lt;/a&gt; - wherein I add hotkey support to my (now-defunct)
search page.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;Op-ed (opinion pieces with almost no useful, actionable content&amp;#8212;sorry)&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/DearMSFTPleaseTalkToYourOfficeDivision.aspx"&gt;Dear
MSFT, please talk to your Office division&lt;/a&gt; - op-ed, Sorry. Summary is, please don't
obfuscate all your DLLs. Side note: InfoPath is pain.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/OneLanguageAYear.aspx"&gt;One Language A Year&lt;/a&gt; -
wherein I dedicate a year to learn C#&amp;#8212;that is, &lt;em&gt;actually&lt;/em&gt; learn C#. I'll
dig into Scala/Clojure/Haskell/Ruby/Python/Lisp/Scheme/Erlang/JavaScript/Io/Factor/OMeta/Smalltalk
some other day. Also, I outright deny the claim that you should learn one language
a year. It's cheap to give advice. It's not as cheap to &lt;em&gt;follow advice&lt;/em&gt;. I
have a new rule on following advice: does the person giving the advice actually do
what they say? I got similarly disgruntled when "Uncle Bob" said something to the
effect that you should dedicate 40 hours to work and 20 hours to learning. That's
just crazy talk.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/SharePointWikisAreAwesomeISwear.aspx"&gt;SharePoint
wikis are awesome, I swear&lt;/a&gt; - another of my top 3 visited SharePoint pages. I now
apologize for defending SharePoint 2007 wikis. Afternote: I wish this wasn't such
a popular page. Of all things, a wiki op-ed piece is one of my top pages, ugh.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/SharePointNotUnitTesting.aspx"&gt;SharePoint: not
unit testing&lt;/a&gt; - I've waffled a bit on this one. My current stance is that I'd really
like to do continuous, automated functional testing (i.e. drive a browser window with
code) to give me confidence my SharePoint solution actually works. True unit testing
wouldn't cover enough space to give me confidence in my project, and most of my SharePoint
projects are tiny, such that the "designing your API via design-by-example TDD" argument
for TDD doesn't apply. Also, read this post for a short anecdotal survey on what kind
of problems I run into when developing SharePoint solutions.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/StrongOpinionSayNoToMAKECABEXE.aspx"&gt;Say no to
makecab.exe&lt;/a&gt; - Here I rant against using makecab. I think I had just read yet another
MSDN article that made casual use of MAKECAB.EXE and pretended like it was a good
idea. Also I apparently just read the CodingHorror post on "Strong opinions, loosely
held" which I now think is a terrible formula for my blog posts. At least I include
a somewhat-useful PowerShell snippet that bypasses makecab, that's something.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/SurvivingYourFirstSharePointProjectPartOne.aspx"&gt;Surviving
your first SharePoint project: Part 1&lt;/a&gt; - wherein I sloppily argue that WSPBuilder
is superior to STSDEV, VSeWSS, and makecab. It's true though, and &lt;em&gt;somebody's&lt;/em&gt; got
to counteract all these MSDN articles and books that pretend WSPBuilder doesn't exist&amp;hellip;&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/DoesThisDescribeYou.aspx"&gt;Does this describe you?&lt;/a&gt; -
short, unhelpful post that quotes Niklaus Virth and laments SharePoint's accidental
complexity.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;SharePoint 2010/SharePoint 14 predictions&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/SharePoint14EverythingWeKnow.aspx"&gt;SharePoint
14: Everything we know&lt;/a&gt; - it turns out from what I've heard from SPC09, this was
dead-on accurate. They kept PowerPivot silent through the NDA period. Interestingly,
SPC09 was silent on "Bulldog", the MDM product Microsoft purchased. Also I apparently
missed out on the TownSquare bits, which they publicly discussed, and which evolved
into the Facebook-like features.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/PreparingYourselfForSharePoint14.aspx"&gt;Preparing
yourself for SharePoint 14&lt;/a&gt; - I'm proud of my track record here, because I nailed
pretty much everything. Written a full year ago.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;"Other" category&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/YetAnotherSharePointVMRIP.aspx"&gt;Yet another SharePoint
VM: RIP&lt;/a&gt; - there was a period of time where I was Doing Something Wrong with my
VMs. I now blame either/any of: a) saving state/restoring from saved state in Virtual
Server and Virtual PC, b) running my external USB hard drive off of laptop battery
power, c) lots of plugging and unplugging of said USB hard drive. I haven't had a
problem in a long while now. Takeaway: back up your VM every so often "offsite", just
in case.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/ASPNETMVCFrameworkIsAMAGICFLYINGCARPET.aspx"&gt;ASP.NET
MVC is a MAGIC FLYING CARPET&lt;/a&gt; - wow, it's been two full years since the announcement!
Anyway, here I mention how SharePoint development feels like alchemy sometimes, and
separately, how the SharePoint developer community doesn't seem to value the things
I like about ASP.NET MVC. Posting this had the side effect of sending lots of poor
souls to my blog from google searching on "how to create an ASP.NET MVC app inside
SharePoint."&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/SUGDCSummerConf2008Recap.aspx"&gt;SUGDC Conference
2008: Recap&lt;/a&gt; - wherein I give a similarly-huge recap of each session I attended.
Also: layoffs drive big SharePoint adoption! So, get with the layoffs!&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pseale.com/blog/SharePointPlusASPNETMVC.aspx"&gt;SharePoint + ASP.NET
MVC&lt;/a&gt; - wherein I troll for people searching for these keywords.&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Website Background Services Are Hot</title>
    <link rel="alternate" type="text/html" href="http://www.pseale.com/blog/WebsiteBackgroundServicesAreHot.aspx" />
    <id>http://www.pseale.com/blog/PermaLink,guid,4c339717-c8ae-4e4c-a69d-f8fa5b454b6f.aspx</id>
    <published>2009-10-26T20:59:44.98917-07:00</published>
    <updated>2009-10-26T20:59:44.98917-07:00</updated>
    <category term=".NET" label=".NET" scheme="http://www.pseale.com/blog/CategoryView,category,NET.aspx" />
    <category term="ASP.NET MVC" label="ASP.NET MVC" scheme="http://www.pseale.com/blog/CategoryView,category,ASPNETMVC.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
This is a two-parter. The first part is to say, hey, look at this sweet hack I've
discovered in the <a href="http://oxite.codeplex.com/SourceControl/changeset/view/45053#438025">Oxite
source</a>*! The second part is to ask, hey, is this a good idea?<br /><font size="1">* </font><a href="http://erikporter.com/Blog/Oxite20090215-Released"><font size="1">the
refactored Oxite source, that is</font></a></p>
        <h3>Background services
</h3>
        <p>
First, let's give a little detail here—<em>background services</em> are long-running
tasks that Oxite needs to run periodically. These are things like sending emails and
sending trackbacks—necessary, certainly. But, they shouldn't be running while
some chump stares at his Netscape window waiting for the site to finish sending 1000
spam trackbacks. He should be able to post to his blog, receive an immediate response
indicating the post is now available, and the trackback spamming can commence later.
Background services are the things you can put off, the things that don't have to
finish before sending a response to your website patrons.
</p>
        <p>
These background services are called by many names—I've heard cron jobs, timer
jobs, background jobs, jobs, "the heartbeat," services, and tasks.  In Oxite
they're called background services.
</p>
        <h3>Look at this sweet hack!
</h3>
        <p>
The full source is below, but I'll attempt a walkthrough of the solution here. First,
to explain the problem: we must <strong>achieve the impossible—</strong>we must
somehow emulate a continuously-running Windows service inside an IIS worker process.
This means we must periodically trigger jobs to run, but we can't monopolize valuable
worker threads. And we <em>certainly </em>can't delay responses to send 30000 spam
trackbacks. We've got to run, but we can't run anywhere in the ASP.NET page/request
lifecycle! <em>It's a conundrum.</em></p>
        <p>
What the Oxite team has done to achieve the impossible is, plainly, to cheat—they
use a System.Threading.Timer.
</p>
        <p>
How they manage the impossible is a lot like juggling—<em><strong>magic juggling</strong></em>.
Enter stage left: Oxite, the juggler. Oxite takes a background task and throws it
in the air. He takes hold of the next background task (let's start calling these things
bowling pins) and throws <em>it </em>into the air, and moves on down the line. Before
anyone knows what's happened, Oxite has gathered up all the bowling pins, thrown them
all into the air, and made his getaway. <em>Unlike</em> most jugglers, Oxite makes
no attempt to catch bowling pins once thrown! And this is why it's magic.
</p>
        <blockquote>
          <p>
Let's try to break this back down into code. When Start() first executes [line 28],
the Timer object <strong>sets a callback</strong> without halting progress [line 43].
This is the juggler throwing a pin in the air.
</p>
        </blockquote>
        <p>
The callback method is eventually invoked. A thread is spun up* and runs the designated <strong>timerCallback()</strong> function
[line 56]—and, let's make this clear—timerCallback() doesn't block the
original Oxite web request; it lives in a new thread. And this new thread does its
first dose of work, as shown on line 68 (<strong>SPOILER ALERT:</strong> it calls
Run()).  We're not interested in what Run() does exactly—for today it must
remain a spooky mystery, go look it up yourself.<br /><strong><font size="1">* <font color="#ff0000">precisely how</font> the thread is
spun up is in fact, real magic, or might as well be to my superstitious caveman brain</font></strong></p>
        <p>
Ok. Here's where the "magic" part of magic juggling comes in. Because any dunce can
throw bowling pins, and any dunce can catch them, and any dunce, with practice, can
juggle. The magic here is inside the timerCallback() method, where the Timer once
again sets a callback. Each time a background service awakens, it does its work and,
before going back to sleep, sets up the next callback with another call to timer.Change()
[line 75]. That is to say, each time the bowling pin makes as if to land, it spins
back upward into the air!
</p>
        <p>
So there you have it. Oxite takes a bunch of bowling pins, throws them all into the
air, and leaves. As the pins drop down to the ground, the "mystical Timer callback
juggling force" propels them back into the air.
</p>
        <p>
And we're running background threads in the web process. Sweet.
</p>
        <h3>Now the question is: is this a good idea?
</h3>
        <p>
Now you understand how background tasks work in Oxite—or can now juggle. I get
confused sometimes. In any case, congratulations!
</p>
        <p>
Assuming I'm not misrepresenting anything, this is how background tasks work in Oxite.
So, now for the question. <strong>Is this a reasonably acceptable way to set up background
tasks for a site?</strong> I've discussed it some on twitter, but is there anything
particularly nasty I've missed? Will it kill the process? Will it hang all 25 threads?
Or some large portion of them?
</p>
        <p>
I'm curious to hear if anyone has taken this approach, and what their experiences
were.
</p>
        <h3>Full source
</h3>
        <p>
From <a title="http://oxite.codeplex.com/SourceControl/changeset/view/45053#438025" href="http://oxite.codeplex.com/SourceControl/changeset/view/45053#438025">http://oxite.codeplex.com/SourceControl/changeset/view/45053#438025</a>:
</p>
        <div style="font-family: consolas; background: #303030; color: #e0e0e0; font-size: 12pt">
          <p style="margin: 0px">
            <span style="color: #adadad">    1</span> <span style="color: #7cfc00">// 
————————————————</span></p>
          <p style="margin: 0px">
            <span style="color: #adadad">    2</span> <span style="color: #7cfc00">// 
Copyright (c) Microsoft Corporation. All rights reserved.</span></p>
          <p style="margin: 0px">
            <span style="color: #adadad">    3</span> <span style="color: #7cfc00">// 
This source code is made available under the terms of the Microsoft Public License
(Ms-PL)</span></p>
          <p style="margin: 0px">
            <span style="color: #adadad">    4</span> <span style="color: #7cfc00">// 
http://www.codeplex.com/oxite/license</span></p>
          <p style="margin: 0px">
            <span style="color: #adadad">    5</span> <span style="color: #7cfc00">// 
————————————————-</span></p>
          <p style="margin: 0px">
            <span style="color: #adadad">    6</span> <span style="color: #40c4ff">using</span><span style="color: #eddac0">System</span>;
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">    7</span> <span style="color: #40c4ff">using</span><span style="color: #eddac0">System</span><span style="color: silver">.</span><span style="color: #eddac0">Threading</span>;
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">    8</span> <span style="color: #40c4ff">using</span><span style="color: #eddac0">Microsoft</span><span style="color: silver">.</span><span style="color: #eddac0">Practices</span><span style="color: silver">.</span><span style="color: #eddac0">Unity</span>;
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">    9</span> <span style="color: #40c4ff">using</span><span style="color: #eddac0">Oxite</span><span style="color: silver">.</span><span style="color: #eddac0">Services</span>;
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   10</span> 
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   11</span> <span style="color: #40c4ff">namespace</span><span style="color: #eddac0">Oxite</span><span style="color: silver">.</span><span style="color: #eddac0">Infrastructure</span></p>
          <p style="margin: 0px">
            <span style="color: #adadad">   12</span> {
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   13</span>     <span style="color: #40c4ff">public</span><span style="color: #40c4ff">class</span><span style="color: aqua">BackgroundServiceExecutor</span></p>
          <p style="margin: 0px">
            <span style="color: #adadad">   14</span>     {
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   15</span>         <span style="color: #40c4ff">private</span><span style="color: #40c4ff">readonly</span><span style="color: aqua">Timer</span><span style="color: #eddac0">timer</span>;
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   16</span>         <span style="color: #40c4ff">private</span><span style="color: #40c4ff">readonly</span><span style="color: #eddac0">IUnityContainer</span><span style="color: #eddac0">container</span>;
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   17</span>         <span style="color: #40c4ff">private</span><span style="color: #40c4ff">readonly</span><span style="color: aqua">Guid</span><span style="color: #eddac0">pluginID</span>;
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   18</span>         <span style="color: #40c4ff">private</span><span style="color: #40c4ff">readonly</span><span style="color: aqua">Type</span><span style="color: #eddac0">type</span>;
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   19</span> 
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   20</span>         <span style="color: #40c4ff">public</span><span style="color: #eddac0">BackgroundServiceExecutor</span>(<span style="color: #eddac0">IUnityContainer</span><span style="color: #eddac0">container</span>, <span style="color: aqua">Guid</span><span style="color: #eddac0">pluginID</span>, <span style="color: aqua">Type</span><span style="color: #eddac0">type</span>)
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   21</span>        
{
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   22</span>             <span style="color: #40c4ff">this</span><span style="color: silver">.</span><span style="color: #eddac0">timer</span><span style="color: silver">=</span><span style="color: #40c4ff">new</span><span style="color: aqua">Timer</span>(<span style="color: #eddac0">timerCallback</span>);
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   23</span>             <span style="color: #40c4ff">this</span><span style="color: silver">.</span><span style="color: #eddac0">container</span><span style="color: silver">=</span><span style="color: #eddac0">container</span>;
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   24</span>             <span style="color: #40c4ff">this</span><span style="color: silver">.</span><span style="color: #eddac0">pluginID</span><span style="color: silver">=</span><span style="color: #eddac0">pluginID</span>;
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   25</span>             <span style="color: #40c4ff">this</span><span style="color: silver">.</span><span style="color: #eddac0">type</span><span style="color: silver">=</span><span style="color: #eddac0">type</span>;
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   26</span>        
}
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   27</span> 
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   28</span>         <span style="color: #40c4ff">public</span><span style="color: #40c4ff">void</span><span style="color: #eddac0">Start</span>()
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   29</span>        
{
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   30</span>             <span style="color: aqua">IBackgroundService</span><span style="color: #eddac0">backgroundService</span><span style="color: silver">=</span> (<span style="color: aqua">IBackgroundService</span>)<span style="color: #eddac0">container</span><span style="color: silver">.</span><span style="color: #eddac0">Resolve</span>(<span style="color: #eddac0">type</span>);
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   31</span>             <span style="color: aqua">IPlugin</span><span style="color: #eddac0">plugin</span><span style="color: silver">=</span><span style="color: #eddac0">getPlugin</span>();
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   32</span>             <span style="color: aqua">TimeSpan</span><span style="color: #eddac0">interval</span><span style="color: silver">=</span><span style="color: #eddac0">getInterval</span>(<span style="color: #eddac0">plugin</span>);
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   33</span> 
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   34</span>             <span style="color: #40c4ff">if</span> (<span style="color: #eddac0">interval</span><span style="color: silver">.</span><span style="color: #eddac0">TotalSeconds</span><span style="color: silver">&gt;</span><span style="color: #ff80ff">10</span>)
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   35</span>            
{
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   36</span> <span style="color: #cb97ff">#if</span> DEBUG
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   37</span>                 <span style="color: #40c4ff">if</span> (<span style="color: #eddac0">plugin</span><span style="color: silver">.</span><span style="color: #eddac0">Enabled</span>)
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   38</span>                
{
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   39</span>                     <span style="color: #eddac0">backgroundService</span><span style="color: silver">.</span><span style="color: #eddac0">Run</span>(<span style="color: #eddac0">plugin</span><span style="color: silver">.</span><span style="color: #eddac0">Settings</span>);
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   40</span>                
}
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   41</span> <span style="color: #cb97ff">#endif</span></p>
          <p style="margin: 0px">
            <span style="color: #adadad">   42</span> 
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   43</span>                 <span style="color: #eddac0">timer</span><span style="color: silver">.</span><span style="color: #eddac0">Change</span>(<span style="color: #eddac0">interval</span>, <span style="color: #40c4ff">new</span><span style="color: aqua">TimeSpan</span>(<span style="color: #ff80ff">0</span>, <span style="color: #ff80ff">0</span>, <span style="color: #ff80ff">0</span>, <span style="color: #ff80ff">0</span>, <span style="color: silver">-</span><span style="color: #ff80ff">1</span>));
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   44</span>            
}
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   45</span>        
}
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   46</span> 
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   47</span>         <span style="color: #40c4ff">public</span><span style="color: #40c4ff">void</span><span style="color: #eddac0">Stop</span>()
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   48</span>        
{
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   49</span>             <span style="color: #40c4ff">lock</span> (<span style="color: #eddac0">timer</span>)
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   50</span>            
{
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   51</span>                 <span style="color: #eddac0">timer</span><span style="color: silver">.</span><span style="color: #eddac0">Change</span>(<span style="color: aqua">Timeout</span><span style="color: silver">.</span><span style="color: #eddac0">Infinite</span>, <span style="color: aqua">Timeout</span><span style="color: silver">.</span><span style="color: #eddac0">Infinite</span>);
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   52</span>                 <span style="color: #eddac0">timer</span><span style="color: silver">.</span><span style="color: #eddac0">Dispose</span>();
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   53</span>            
}
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   54</span>        
}
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   55</span> 
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   56</span>         <span style="color: #40c4ff">private</span><span style="color: #40c4ff">void</span><span style="color: #eddac0">timerCallback</span>(<span style="color: #40c4ff">object</span><span style="color: #eddac0">state</span>)
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   57</span>        
{
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   58</span>             <span style="color: #40c4ff">lock</span> (<span style="color: #eddac0">timer</span>)
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   59</span>            
{
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   60</span>                 <span style="color: aqua">IBackgroundService</span><span style="color: #eddac0">backgroundService</span><span style="color: silver">=</span> (<span style="color: aqua">IBackgroundService</span>)<span style="color: #eddac0">container</span><span style="color: silver">.</span><span style="color: #eddac0">Resolve</span>(<span style="color: #eddac0">type</span>);
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   61</span>                 <span style="color: aqua">IPlugin</span><span style="color: #eddac0">plugin</span><span style="color: silver">=</span><span style="color: #eddac0">getPlugin</span>();
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   62</span>                 <span style="color: aqua">TimeSpan</span><span style="color: #eddac0">interval</span><span style="color: silver">=</span><span style="color: #eddac0">getInterval</span>(<span style="color: #eddac0">plugin</span>);
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   63</span> 
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   64</span>                 <span style="color: #40c4ff">if</span> (<span style="color: #eddac0">plugin</span><span style="color: silver">.</span><span style="color: #eddac0">Enabled</span>)
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   65</span>                
{
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   66</span>                     <span style="color: #40c4ff">try</span></p>
          <p style="margin: 0px">
            <span style="color: #adadad">   67</span>                    
{
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   68</span>                         <span style="color: #eddac0">backgroundService</span><span style="color: silver">.</span><span style="color: #eddac0">Run</span>(<span style="color: #eddac0">plugin</span><span style="color: silver">.</span><span style="color: #eddac0">Settings</span>);
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   69</span>                    
}
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   70</span>                     <span style="color: #40c4ff">catch</span></p>
          <p style="margin: 0px">
            <span style="color: #adadad">   71</span>                    
{
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   72</span>                    
}
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   73</span>                
}
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   74</span> 
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   75</span>                 <span style="color: #eddac0">timer</span><span style="color: silver">.</span><span style="color: #eddac0">Change</span>(<span style="color: #eddac0">interval</span>, <span style="color: #40c4ff">new</span><span style="color: aqua">TimeSpan</span>(<span style="color: #ff80ff">0</span>, <span style="color: #ff80ff">0</span>, <span style="color: #ff80ff">0</span>, <span style="color: #ff80ff">0</span>, <span style="color: silver">-</span><span style="color: #ff80ff">1</span>));
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   76</span>            
}
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   77</span> 
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   78</span>             <span style="color: #7cfc00">//TODO:
(erikpo) Once background services have a cancel state and timeout interval, check
their state and cancel if appropriate</span></p>
          <p style="margin: 0px">
            <span style="color: #adadad">   79</span>        
}
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   80</span> 
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   81</span>         <span style="color: #40c4ff">private</span><span style="color: aqua">IPlugin</span><span style="color: #eddac0">getPlugin</span>()
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   82</span>        
{
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   83</span>             <span style="color: aqua">IPluginService</span><span style="color: #eddac0">pluginService</span><span style="color: silver">=</span><span style="color: #eddac0">container</span><span style="color: silver">.</span><span style="color: #eddac0">Resolve</span><span style="color: silver">&lt;</span><span style="color: aqua">IPluginService</span><span style="color: silver">&gt;</span>();
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   84</span>             <span style="color: aqua">IPlugin</span><span style="color: #eddac0">plugin</span><span style="color: silver">=</span><span style="color: #eddac0">pluginService</span><span style="color: silver">.</span><span style="color: #eddac0">GetPlugin</span>(<span style="color: #eddac0">pluginID</span>);
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   85</span> 
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   86</span>             <span style="color: #40c4ff">return</span><span style="color: #eddac0">plugin</span>;
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   87</span>        
}
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   88</span> 
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   89</span>         <span style="color: #40c4ff">private</span><span style="color: aqua">TimeSpan</span><span style="color: #eddac0">getInterval</span>(<span style="color: aqua">IPlugin</span><span style="color: #eddac0">plugin</span>)
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   90</span>        
{
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   91</span>             <span style="color: #40c4ff">return</span><span style="color: aqua">TimeSpan</span><span style="color: silver">.</span><span style="color: #eddac0">FromTicks</span>(<span style="color: #40c4ff">long</span><span style="color: silver">.</span><span style="color: #eddac0">Parse</span>(<span style="color: #eddac0">plugin</span><span style="color: silver">.</span><span style="color: #eddac0">Settings</span>[<span style="color: #ff80ff">"Interval"</span>]));
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   92</span>        
}
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   93</span>     }
</p>
          <p style="margin: 0px">
            <span style="color: #adadad">   94</span> }
</p>
        </div>
      </div>
    </content>
  </entry>
  <entry>
    <title>Empty Shell First!</title>
    <link rel="alternate" type="text/html" href="http://www.pseale.com/blog/EmptyShellFirst.aspx" />
    <id>http://www.pseale.com/blog/PermaLink,guid,87bec3e2-a7b3-43a1-aed2-fbbe851eb8ac.aspx</id>
    <published>2009-09-08T05:32:24-07:00</published>
    <updated>2009-09-01T22:33:08.0453409-07:00</updated>
    <category term=".NET" label=".NET" scheme="http://www.pseale.com/blog/CategoryView,category,NET.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
I'm not going to get into specifics; instead I'm just going to say that my project,
today, is painful to deploy. And not only is deployment painful, it's error-prone.
And I don't mean "error" in the hypothetical, higher-percentage-than-that-other-hypothetical-percentage
sense of the word; the sanitary, almost clinical sense. I mean, oops, there went four
hours troubleshooting when I deployed the wrong DLL, preventable kind of error.
</p>
        <p>
So it hurts.
</p>
        <p>
There's lots of pain in the world of software development, but it doesn't have to
be this bad. All I need to do is, in the beginning, set aside some time to deploy
an empty shell of a project. When I say empty shell I mean, almost literally, a Hello
World type of application. If this Hello World application involves seven databases,
twenty seven service accounts, a network load balancer and forty web.config files,
so be it. If the deployment requires granting of security permissions to these twenty
seven service accounts, so be it. Sure, it's going to seem useless, and the tangible
payoff will be minimal. Painful? Error-prone? Bring it on. Bring it on at the <em>beginning</em>. 
</p>
        <p>
And please, for your own sake, one-click automate the deployment! If nothing else,
automate the happy path, which is orders of magnitude easier than building a fault-tolerant
deployment. Worst case, your automated deployment fails and you're back to manually
deploying. In other words, <strong>if you're deploying manually, then you're already
living out the worst-case scenario</strong>.
</p>
        <p>
And by you, I mean me, today. Again, not hypothetical.
</p>
        <h3>Happy path/sad path by example: copying a folder
</h3>
        <p>
Happy path: 
</p>
        <ol>
          <li>
Copy a folder and contents to a destination directory. 
</li>
          <li>
You're done! Congratulations!</li>
        </ol>
        <p>
Sad path:
</p>
        <ul>
          <li>
Does the source file exist?</li>
          <li>
Is the source file unlocked for read?</li>
          <li>
Does the destination folder exist?</li>
          <ul>
            <li>
Or its parent folder?</li>
            <ul>
              <li>
Or its parent?</li>
              <ul>
                <li>
Or the parent drive?</li>
                <li>
Or parent network share?</li>
                <ul>
                  <li>
Or maybe you need to connect to the network share with a different service account?</li>
                  <ul>
                    <li>
So this means you need to explicitly drop all current connections.</li>
                  </ul>
                </ul>
              </ul>
            </ul>
          </ul>
          <li>
Can we drop (delete) the existing destination folder?</li>
          <ul>
            <li>
Is the folder locked?</li>
            <ul>
              <li>
Is this because we have an Explorer window open to the folder (<strong>sooooooooooo</strong> common
for me)</li>
            </ul>
          </ul>
          <li>
Are we overwriting a file?</li>
          <ul>
            <li>
Do we have permissions?</li>
            <li>
Is the file locked?</li>
          </ul>
          <li>
What if some of the file copy operations succeed, but not others?</li>
          <ul>
            <li>
Do we have a perfect backout strategy?</li>
            <ul>
              <li>
Can we restore the original folder in its entirety?</li>
              <li>
If not, can we restore each individually changed item in its entirety?</li>
              <ul>
                <li>
Are we running in a transaction?</li>
                <ul>
                  <li>
Are all our options atomic?</li>
                  <ul>
                    <li>
Do we implement a transaction log of sorts? How do we know without a shadow of a doubt
our operations succeeded?</li>
                  </ul>
                </ul>
              </ul>
            </ul>
          </ul>
          <li>
Did the virus scanner interfere when copying an .EXE?</li>
          <ul>
            <li>
On your machine?</li>
            <li>
On the remote machine?</li>
            <li>
On an invisible HTTP proxy on the network?</li>
          </ul>
          <li>
Is the remove file share something crazy like WebDAV, where only some operations are
supported?</li>
          <ul>
            <li>
Are you sure you're running the WebClient service required to make this WebDAV/explorer
integration work?</li>
          </ul>
          <li>
Are the file+pathnames reaching the maximum allowable limit, and are you copying to
a deeper subdirectory which would cause "too long filename" errors to occur?</li>
        </ul>
        <p>
IT as a career makes me paranoid—this is a ridiculous checklist for just copying
a file. But I've experienced all of these things. Yes, it's ridiculous, and yes, it's
real.
</p>
      </div>
    </content>
  </entry>
  <entry>
    <title>PowerShell REPL, by Example</title>
    <link rel="alternate" type="text/html" href="http://www.pseale.com/blog/PowerShellREPLByExample.aspx" />
    <id>http://www.pseale.com/blog/PermaLink,guid,d9118fb1-50e6-41f6-b1f9-c137619e03c4.aspx</id>
    <published>2009-08-24T15:08:21.8705729-07:00</published>
    <updated>2009-08-24T15:08:21.8705729-07:00</updated>
    <category term="PowerShell" label="PowerShell" scheme="http://www.pseale.com/blog/CategoryView,category,PowerShell.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
The PowerShell REPL is awesome.
</p>
        <p>
PowerShell is by no means the only REPL. There's the immediate window in Visual Studio,
the Snippet Compiler, LINQPad, the Interactive C# shell from Mono, and a REPL environment
for most every other scripting language on the planet. Some of the TDD guys refer
to "exploratory tests" that they write to learn about a third-party API. On the Regex
front, there are scads of web-based and Windows-based tools to help you build and
test regular expressions as fast as you can hit the "Run" button. I'll even accept
writing a console application as a weak form of a REPL, though I wouldn't encourage
it. All these things serve the same goal: give me instantaneous feedback. For those
of you already familiar with the REPL, we're good, we're in the know.
</p>
        <p>
But if you're the person who never uses a REPL, allow me to show you, using an example
from just 3 minutes ago, how powerful they are.
</p>
        <h3>My burning question
</h3>
        <p>
All this began with a burning question: what happens in string.Format() if I place
the parameters out of order? What happens if I use a parameter twice?
</p>
        <h3>The question, answered within 1 minute using the PowerShell REPL
</h3>
        <p>
          <img border="0" src="http://www.pseale.com/blog/content/binary/PS-REPL.png" />
        </p>
        <h3>Conclusion stated in words
</h3>
        <p>
I answered a specific question about .NET's string.Format() library function in less
time than it would have taken to search and peruse the search results. Sandboxes such
as these reduce the friction and enable me to run a series of experiments as quickly
as I can think of them. Good REPLs (like PowerShell) allow me to a) quickly get feedback
on my input commands, b) format and parse the resulting objects into a meaningful
answer. Bad feedback loops (things that aren't REPLs) require overhead to even run,
deliver feedback in over an hour or even as late as the next day or the next week,
and deliver meaningless answers (think huge log files). I'm just here to make sure
you're all aware: <strong>you have a choice</strong>: you can choose a REPL, or you
can choose awfulness. Your call.
</p>
        <h3>Oh yeah, what's a REPL?
</h3>
        <p>
          <a href="http://en.wikipedia.org/wiki/Read-eval-print_loop">Read-eval-print loop</a>
        </p>
      </div>
    </content>
  </entry>
  <entry>
    <title>Linkblog, The Sequel</title>
    <link rel="alternate" type="text/html" href="http://www.pseale.com/blog/LinkblogTheSequel.aspx" />
    <id>http://www.pseale.com/blog/PermaLink,guid,0e4f539e-b371-4fa0-ac9f-d2818f02ff19.aspx</id>
    <published>2009-08-21T23:55:47.4891918-07:00</published>
    <updated>2009-08-22T14:09:20.7810391-07:00</updated>
    <category term=".NET" label=".NET" scheme="http://www.pseale.com/blog/CategoryView,category,NET.aspx" />
    <content type="html">&lt;p&gt;
Hello! I'm Peter and I'm here to present another sweet, sweet linkblog post. In my &lt;a href="http://www.pseale.com/blog/FirstIrregularlyScheduledLinkblog.aspx"&gt;first
link-heavy post&lt;/a&gt;, I pulled any links I could remember, from the previous week,
year, or decade, a 'best of' of sorts. So don't expect great things from this sophomore
effort.
&lt;/p&gt;
&lt;p&gt;
To give the standard introduction: I've pulled anything tangentially related to software
development in the .NET space into this linkpost, salted each link with commentary,
and grouped into sections. I'm not an authority on most of the articles I link to,
so when commenting on them will try to restrain myself.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Random topics&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reminder&lt;/strong&gt;: &lt;a href="http://virtualaltnet.com/"&gt;Virtual ALT.NET&lt;/a&gt; livemeetings
- it's as easy as 1) typing snipr.com/virtualaltnet into your browser, and 2) entering
the LiveMeeting. If you want to participate (encouraged), get a cheap mic/headset
of some kind. There are three weekly meetings: Australian Monday night, Wednesday
night US, and the Central-time Brown Bag meeting on Thursday. I'm definitely a fan.
Also, don't forget: &lt;a href="http://virtualaltnet.com/Recordings"&gt;VAN records their
sessions&lt;/a&gt;. Between this, NDC, and the various Ruby conference videos I've found,
I'm never looking for something to watch. 
&lt;li&gt;
&lt;a href="http://sharepoint.microsoft.com/sharepoint/worldwide/us/southeast/Connections%20BUSINESS%20INTELLIGENCE/Designing%20Effective%20Dashboards%20-%20Mariner.pptx"&gt;Designing
Effective Dashboards [PPTX]&lt;/a&gt; - while I hate buzzwords as much as the next guy,
and for that matter, while I hate browsing PowerPoint presentations, this has managed
to overcome both its enterprisey roots and its PPTX medium! It's a PowerPoint presentation
about Business Intelligence, which means I should be falling asleep just writing about
it, and yet, here I am! Trust me, it's worth browsing. For a teaser, here's a self-explanatory
slide:&lt;br&gt;
&lt;a href="http://sharepoint.microsoft.com/sharepoint/worldwide/us/southeast/Connections%20BUSINESS%20INTELLIGENCE/Designing%20Effective%20Dashboards%20-%20Mariner.pptx"&gt;&lt;img border="0" alt="PowerPoints about Business Intelligence should by all means put me to sleep. I am as surprised as you are" src="http://www.pseale.com/blog/content/binary/WindowsLiveWriter/LinkblogTheSequel_14522/image_ebc3f7ad-58ba-40ce-8bd2-34835b70f6e5.png" width="638" height="480"&gt;&lt;/a&gt;
&lt;br&gt;
&lt;br&gt;
Business Intelligence is neat-o! Wait, did I say that?&lt;br&gt;
&lt;br&gt;
&lt;li&gt;
The circle of no life:&lt;br&gt;
&lt;a href="http://recoveringlazyholic.blogspot.com/2009/05/1-minute-photoshop-unemployment.html"&gt;&lt;img border="0" alt="circle-of-no-life" src="http://www.pseale.com/blog/content/binary/WindowsLiveWriter/LinkblogTheSequel_14522/image_87c148fa-c278-4d81-aa5b-6279824642bb.png" width="400" height="400"&gt;&lt;/a&gt;
&lt;br&gt;
&lt;br&gt;
Every now and again I need reminding.&lt;br&gt;
&lt;li&gt;
&lt;a href="http://www.lambdassociates.org/blog/bipolar.htm"&gt;The Bipolar Lisp Programmer&lt;/a&gt; -
this is partially about Lisp programmers, but also partially about programmer attitudes
and, lacking a better word, 'psychology.' I don't like that word. Anyway, the article
isn't necessarily based in hard science, but hey, it's a fun read, and you may just
recognize something of yourself in it. 
&lt;li&gt;
&lt;a href="http://github.com/raganwald/homoiconic/blob/master/2009-05-01/optimism.md#readme"&gt;Optimism&lt;/a&gt; -
the three axes of optimism (or pessimism, if you're one of &lt;em&gt;those people&lt;/em&gt;)&amp;#8212;interesting
because it provides an &lt;strong&gt;algorithm&lt;/strong&gt; to make you more optimistic. Which
is a good thing. And yes I said &lt;em&gt;algorithm&lt;/em&gt;, which is why I'm linking to it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;Software engineering topics&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.codinghorror.com/blog/archives/000889.html"&gt;(Updated Classic Mistakes
List) Coding Horror: Escaping From Gilligan's Island&lt;/a&gt; - Classic software development
mistakes. You'll recognize a few (or several) from your last project. 
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.stevemcconnell.com/rdenum.htm"&gt;Classic Mistakes Enumerated&lt;/a&gt; -
and for more detailed descriptions of the original classic mistakes, here's the original
list of 36 classic software development mistakes, copyright 1996.&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
&lt;a href="http://www.arxta.com/"&gt;AR⊗TA - Artisinal Retro-Futurism crossed with Team-Scale
Anarcho-Syndicalism&lt;/a&gt; - and no, this isn't a joke. This is a type of "post-Agile"
thing as it tries to address the reality of failed Agile projects.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;My ongoing obsession with learning, which is arguably the skill software developers
need most&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.infoq.com/articles/levison-TDD-adoption-strategy"&gt;Making TDD Stick:
Problems and Solutions for Adopters&lt;/a&gt; - for those of you trying to teach others
TDD, read this article for sage advice. For those of you new to TDD and frustrated
by how weird and difficult TDD is, read this quote:&lt;br&gt;
&lt;br&gt;
&lt;font color="#800080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Test Driven Development
can be very hard to learn. The learning phase (the time during which it becomes a
deeply ingrained habit) typically lasts from two to four months, during which productivity
is reduced [2]. Eventually the &lt;/font&gt;&lt;a href="http://www.notesfromatooluser.com/2008/10/advantages-of-tdd.html"&gt;&lt;font color="#800080"&gt;benefits&lt;/font&gt;&lt;/a&gt;&lt;font color="#800080"&gt; will
be obvious and the technique is usually self-sustaining, but the question is: how
to get there? Many developers give up after only a few days.&lt;/font&gt;
&lt;br&gt;
&lt;br&gt;
&amp;hellip;then go check out the article to see what tips they have for making learning
easier. 
&lt;li&gt;
&lt;a href="http://codebetter.com/blogs/karlseguin/archive/2009/04/27/the-7-phases-of-unit-testing.aspx"&gt;The
7 Phases of Unit Testing&lt;/a&gt; - step 1 is "Refuse to unit test because "you don't have
enough time." 
&lt;li&gt;
&lt;a href="http://wolfbyte-net.blogspot.com/2009/06/we-have-no-class-personal-journey-of.html"&gt;We
have no class (a personal journey of not learning OO)&lt;/a&gt; - here's some honesty about
how learning object-oriented programming is a large undertaking. I'm there with you
man, I'm there. I'll say that though I "get" the SOLID principles, that building systems
of lots of interacting objects is messy. Procedural-based refactorings (e.g. splitting
a huge method into smaller methods) are almost always straightforward and can even
be measured (see cyclomatic complexity), so you know when you're on the right trail.
On the other hand, when you split responsibilities into multiple classes, you get
into the world of, yes, I'm going to use the word, brace yourself, here it comes: &lt;a href="http://blogs.msdn.com/elee/archive/2009/03/03/formalism-vs-hermeneutics.aspx"&gt;hermeneutics&lt;/a&gt;.
Using words I understand: it means that object-oriented design is messy and mushy
and it's difficult to say objectively whether a design is better or worse than competing
designs. And no, I'm not going to acknowledge the pun, if you noticed, well that's
your problem. 
&lt;li&gt;
&lt;a href="http://aac2009.confreaks.com/06-feb-2009-20-30-lightning-talk-under-your-fingers-corey-haines.html"&gt;Under
Your Fingers [5 min of QuickTime video]&lt;/a&gt; - here Corey Haines exhorts us to engage
in &lt;strong&gt;deliberate practice&lt;/strong&gt;. &lt;strong&gt;Deliberate practice&lt;/strong&gt;. It's
an important concept, and it's something every programmer seems to be lacking. Wax
on, wax off. 
&lt;li&gt;
&lt;a href="http://ayende.com/Blog/archive/2008/07/20/The-difference-between-derivation-and-innovation.aspx"&gt;The
difference between derivation and innovation&lt;/a&gt; - Oren gives a rule which explains
why so much of the new hotness in .NET is uninteresting to me. Azure, for example,
is the same thing you're already doing, but in the cloud&amp;hellip;a &lt;em&gt;derivation&lt;/em&gt;.
See, that sounds better than "it's boring" or "I hate it," right?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;My ongoing obsession with TDD, unit testing, and/or producing quality software
in general&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.lostechies.com/blogs/jimmy_bogard/archive/2007/04/23/classifying-tests.aspx"&gt;Classifying
tests&lt;/a&gt; - good article that disambiguates unit, integration, and functional tests.
Most of you reading this have an incorrect understanding of what a unit test is, and
yes I'm talking to &lt;strong&gt;you&lt;/strong&gt;. I'm not going to write your name here in
the post, because that would just embarrass you, but trust me, it's &lt;strong&gt;you&lt;/strong&gt;.
So read the article :) 
&lt;li&gt;
&lt;a href="http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/05/05/a-testing-survey-on-a-large-project.aspx"&gt;A
testing survey on a large project&lt;/a&gt; - the title isn't flashy linkbait like "40 Reasons
I Can Make You Click This Link,"&amp;nbsp; but bear with me&amp;#8212;this is one of the few
places I've seen unit testing, integration testing, and acceptance/functional/UI testing
put into a kind of cohesive whole. Being still in the stage where I'm forming a usual
style, this type of post is great to gain a sense of perspective. 
&lt;li&gt;
&lt;a href="http://www.artofunittesting.com/Test_Review_Guidelines"&gt;Test Review Guidelines
- Art Of Unit Testing&lt;/a&gt; - Roy Osherove has posted the test review guidelines from
his book on this page. Most of the guidelines are unsurprising, excepting the one
interesting point he makes about overspecifying tests. These are subtle points and
as I struggle with this issue, it's good to read his concrete rules on avoiding overspecification. 
&lt;li&gt;
&lt;a href="http://stackoverflow.com/questions/311807/unit-testing-with-functions-that-return-random-results"&gt;Unit
Testing with functions that return random results [Stack Overflow]&lt;/a&gt; - This issue
has ruined (sorry, produced valuable learning experiences during) no less than two
full coding dojos, and has almost derailed a third. Now, every time we even catch
a whiff of randomization, it's "uh-oh, let's break all the dojo rules and just work
past the issue." So I find it satisfying to see that it's not just &lt;a href="http://jphamilton.net/post/Lessons-from-the-Coding-Dojo-Simple-is-Hard.aspx"&gt;us&lt;/a&gt;. 
&lt;li&gt;
&lt;a href="http://www.ibm.com/developerworks/java/library/j-eaed3/"&gt;Evolutionary architecture
and emergent design: Test-driven design, Part 2&lt;/a&gt; - I'm only interested in the claim
in the first section under "moist tests" that "DRY doesn't apply to unit tests." I'm
suspicious that those following the "moist test" philosophy are classical TDDers and
those who disagree are mockists. Yeah, I didn't make those terms up, see &lt;a href="http://martinfowler.com/articles/mocksArentStubs.html"&gt;this
Martin Fowler article&lt;/a&gt;. In fact: 
&lt;li&gt;
&lt;a href="http://martinfowler.com/articles/mocksArentStubs.html"&gt;Mocks aren't stubs&lt;/a&gt; -
from Martin Fowler. I found this looking for the difference between mocks and stubs,
and ended up with an excellent bit of perspective: TDD advice from classical TDDers
and TDD advice from mockist TDDers won't always agree, especially in the teensy details
like "moist tests" above. Also, coding dojos.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;Counter-counter culture (wherein we get to 'why' answers)&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.lostechies.com/blogs/chad_myers/archive/2009/07/14/the-usual-result-of-poor-man-s-dependency-injection.aspx"&gt;The
usual result of Poor Man’s Dependency Injection&lt;/a&gt; - Chad explains why in his experience
using Poor Man's Dependency Injection (look it up if you're interested) always ends
in tears. Up to reading this post, I assumed that allegiance to IoC tools was one
of those irrational tribal values, but now (after reading the post) I understand. 
&lt;li&gt;
&lt;a href="http://sdk.org.nz/2009/02/25/why-unit-testing-is-a-waste-of-time/"&gt;Why unit
testing is a waste of time&lt;/a&gt; - the "waste of time" title is more inflammatory than
the post, but the core point is that unit testing is &lt;strong&gt;&lt;em&gt;part&lt;/em&gt;&lt;/strong&gt; of
a balanced diet. &lt;strong&gt;&lt;em&gt;Part&lt;/em&gt;&lt;/strong&gt;.&lt;br&gt;
Also, to be clear: unit testing is not a waste of time.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;Architectures&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://ayende.com/Blog/archive/2009/07/22/the-tale-of-the-lazy-architect.aspx"&gt;The
Tale of the Lazy Architect&lt;/a&gt; - Oren describes a composable system. This sounds sweet. 
&lt;li&gt;
&lt;a href="http://sharepoint.mindsharpblogs.com/Kathy/archive/2009/06/29/Submit-this-Form-InfoPath.aspx"&gt;Submit
this Form InfoPath - FAQs&lt;/a&gt; - and here is something of the opposite. This FAQ exemplifies
why I don't want to ever do anything complex with InfoPath. Not to pick on Kathy the
author, that isn't the point&amp;#8212;the point is to show what kinds of awful workarounds
and hacks you have to do just to make a field read-only, or to pull in a user's email
address. For fairness, I should point out that this FAQ is for InfoPath 2007.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;Business/organizational development/management/CEO stuff&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.slideshare.net/reed2001/culture-1798664"&gt;Culture [flash rendering
of PPT presentation]&lt;/a&gt; - the presentation isn't very fancy but the content is dynamite. &lt;a href="http://www.scottberkun.com/blog/2009/the-netflix-culture-guide-to/"&gt;Here's
an analysis of the concepts presented&lt;/a&gt;. I particularly like where they discuss
corporate values and how the values are often meaningless ("Enron had a nice-sounding
value statement"). They've got crazier (crazy in a good way) stuff in there, including
a discussion of how they fire average performers. It's almost utopian-sounding.&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>NUnit's Assert.That</title>
    <link rel="alternate" type="text/html" href="http://www.pseale.com/blog/NUnitsAssertThat.aspx" />
    <id>http://www.pseale.com/blog/PermaLink,guid,18d1a516-74ee-42e4-a4f4-09df303ad4fc.aspx</id>
    <published>2009-05-26T18:08:01.6885263-07:00</published>
    <updated>2009-05-26T22:08:34.0931927-07:00</updated>
    <category term=".NET" label=".NET" scheme="http://www.pseale.com/blog/CategoryView,category,NET.aspx" />
    <content type="html">&lt;p&gt;
I'm here today to present the case against a particular piece of NUnit's fluent syntax.
But before I do, let's set up a concrete example, something that gives the test meaning.
Instead of just writing something down in boring old plain text, I've sloppily remixed
a work of art I found via an image search and retitled it "Rebellion Against the &lt;font color="#808080"&gt;(overuse
of unrelated, Creative) &lt;/font&gt;Commons&lt;font color="#808080"&gt;(-licensed images)&lt;/font&gt;!":&lt;br&gt;
&lt;a title="Rebellion against the Commons!" href="http://www.flickr.com/photos/aaronescobar/2147301541/"&gt;&lt;img border="0" alt="Rebellion against the commons!" src="http://www.pseale.com/blog/content/binary/WindowsLiveWriter/NUnitsAssert.That_117DE/test_sample_6c422296-4317-4e6d-b13b-a15aa2e72793.jpg" width="700" height="521"&gt;&lt;/a&gt;&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Solid. Requests for ~/Default.aspx should redirect to the Home controller. Let's get
on with the show.
&lt;/p&gt;
&lt;h3&gt;My Gripe: Assert.That syntax
&lt;/h3&gt;
&lt;p&gt;
Here is a comparison of the Assert.That syntax, the traditional Assert.AreEqual syntax,
and the syntax provided by MSpec's NUnit extensions (MSpec isn't the only framework
with these extensions, it's just the one of which I'm familiar):&lt;br&gt;
&lt;img border="0" alt="image" src="http://www.pseale.com/blog/content/binary/WindowsLiveWriter/NUnitsAssert.That_117DE/image_d4787b05-28c9-4f2f-a7c4-e18080335b64.png" width="700" height="254"&gt; 
&lt;/p&gt;
&lt;p&gt;
I don't like the Assert.That syntax, in this scenario.
&lt;/p&gt;
&lt;p&gt;
Look at all that. The new syntax is just&amp;hellip;ugh. 
&lt;/p&gt;
&lt;p&gt;
I've read elsewhere that it's good because it reads like a sentence. Well, to shock
you into elevated awareness, may I &lt;a href="http://authors.aspalliance.com/aldotnet/examples/coboldotnet.aspx"&gt;jog
your memory of something else that reads a lot like a sentence&lt;/a&gt;? In case you didn't
dare hover over that link, allow me to properly title it: 
&lt;/p&gt;
&lt;p&gt;
"&lt;a href="http://authors.aspalliance.com/aldotnet/examples/coboldotnet.aspx"&gt;My First
COBOL.NET Web Application&lt;/a&gt;."
&lt;/p&gt;
&lt;p&gt;
Check out the action in the linkage section!
&lt;/p&gt;
&lt;p&gt;
&lt;img border="0" alt="My first, and last, COBOL.NET Web Application" src="http://www.pseale.com/blog/content/binary/WindowsLiveWriter/NUnitsAssert.That_117DE/image_d2d61e0d-6921-4c22-9028-1346814697a1.png" width="700" height="321"&gt; 
&lt;/p&gt;
&lt;p&gt;
Rock on, COBOL.NET!
&lt;/p&gt;
&lt;p&gt;
Okay, conflating "reads like a sentence" to COBOL is a &lt;a href="http://en.wikipedia.org/wiki/Appeal_to_ridicule"&gt;sucker
punch&lt;/a&gt;, it's unfair. Let's do this by the numbers.
&lt;/p&gt;
&lt;h3&gt;Comparing the three ways to do the same thing
&lt;/h3&gt;
&lt;p&gt;
In &lt;strong&gt;all&lt;/strong&gt; cases, the fewer, the better.
&lt;/p&gt;
&lt;table border="1" cellspacing="2" cellpadding="2" width="700"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;
&lt;strong&gt;Syntax&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Total chars&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Chars used by test syntax (by my measure)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Total times Intellisense was necessary*&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Of these, times Intellisense &lt;u&gt;&lt;font color="#ff0000"&gt;couldn't&lt;/font&gt;&lt;/u&gt; help
(e.g. Assert, Is)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Assert.That&lt;/td&gt;
&lt;td&gt;
66&lt;/td&gt;
&lt;td&gt;
28&lt;/td&gt;
&lt;td&gt;
6&lt;/td&gt;
&lt;td&gt;
2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Assert.AreEqual&lt;/td&gt;
&lt;td&gt;
58&lt;/td&gt;
&lt;td&gt;
20&lt;/td&gt;
&lt;td&gt;
4&lt;/td&gt;
&lt;td&gt;
1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
result.ShouldEqual&lt;/td&gt;
&lt;td&gt;
53&lt;/td&gt;
&lt;td&gt;
15&lt;/td&gt;
&lt;td&gt;
3&lt;/td&gt;
&lt;td&gt;
0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style="font-size: 0.7em"&gt;
* "Intellisense is necessary" is roughly defined as "any point at which you can use
Intellisense." Definition is left purposefully imprecise.
&lt;/p&gt;
&lt;p&gt;
I could go on for a bit about this, but I'll let the fancy HTML table do most of the
talking. If there are any takeaways from this oversized-for-its-topic post, let them
be:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
The fewer magic syntax words I have to learn (e.g. Assert, Is), the easier a framework
is to learn. By this measure the MSpec extensions are the best, and the Assert.That
syntax the worst. 
&lt;li&gt;
The fewer characters typed, the easier a framework is to use. Terseness is better
when it doesn't impact learnability. 
&lt;li&gt;
"Reads like a sentence" is presumably the means to achieve some other goal, not a
goal in and of itself. If your fluent syntax doesn't help achieve&amp;hellip;whatever
that other goal is, reconsider trying to make your fluent interface read like a sentence.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Related counter-point I don't care about today:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
The fewer&amp;nbsp; extension methods attached to "object," the better.&lt;br&gt;
NOTE: test frameworks and mocking frameworks get a pass from me because they are supposed
to work against &lt;em&gt;any object.&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Final note: Better vs Best
&lt;/h3&gt;
&lt;p&gt;
I'm complaining today specifically about NUnit's Assert.That(actual, Is.EqualTo(expected))
syntax. I'm not down on the Assert.That() syntax as a whole, just the most commonly
used method. And maybe that's what's bugging me&amp;#8212;Assert.That has a lot of great
stuff in there, allowing fuzzier comparisons beyond simply .AreEqual(), but &lt;strong&gt;the
most commonly-used scenario is measurably worse than the old syntax.&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
And the Assert.That(actual, Is.EqualTo(expected)) syntax isn't the worst thing ever.
It's not the end of the world. But shouldn't it be better than the thing it's replacing,
not worse?
&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>First Irregularly-Scheduled Linkblog</title>
    <link rel="alternate" type="text/html" href="http://www.pseale.com/blog/FirstIrregularlyScheduledLinkblog.aspx" />
    <id>http://www.pseale.com/blog/PermaLink,guid,59333d60-6a54-4085-bedf-f172d0726996.aspx</id>
    <published>2009-05-16T16:18:50.769231-07:00</published>
    <updated>2009-05-16T16:18:50.769231-07:00</updated>
    <category term=".NET" label=".NET" scheme="http://www.pseale.com/blog/CategoryView,category,NET.aspx" />
    <content type="html">&lt;p&gt;
In the past I've questioned the viability of linkblogs&amp;#8212;&lt;strong&gt;does anyone (including,
and perhaps &lt;em&gt;especially&lt;/em&gt; the linkblog author) have time to read all these articles?&lt;/strong&gt; 
&lt;/p&gt;
&lt;p&gt;
The short answer is no. They couldn't possibly have time to read and evaluate all
those articles.
&lt;/p&gt;
&lt;p&gt;
I think it's become something of a cultural expectation that we scan each of the 50+
links in a daily linkblog post as a way of discovering something interesting, without
having the expectation of, you know, &lt;em&gt;reading&lt;/em&gt; anything. Inevitably the quality
of the links degrade, because nobody's reading the articles. As for me, I'm batting
.000 on following linkblog links this year&amp;hellip;I'm in a kind of "linkblog hitting
slump." Maybe it's just me.
&lt;/p&gt;
&lt;p&gt;
This also goes for programming-related aggregators. First we had Slashdot, then briefly,
Digg, then Reddit, then the front page of Reddit became something of a wasteland,
so we moved to programming.reddit.com, then there was that thing called Hacker News.
Somewhere along this timeline DotNetKicks reached critical mass, before slipping into
the doldrums of all-ignorance-all-the-time .NET op-ed pieces; ugh. For the record
I still think the aggregators do a good job, it's just that they could do better.
&lt;/p&gt;
&lt;p&gt;
Where were we? Ah yes, links. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;font color="#800080" size="2"&gt;I've found the following links fascinating
for some reason or other, and I personally vouch for them.&lt;/font&gt;&lt;/strong&gt; If I haven't
looked at the link, I'll point it out right there (which I do a lot in the "Books"
section.)
&lt;/p&gt;
&lt;h3&gt;Links
&lt;/h3&gt;
&lt;p&gt;
&lt;strong&gt;Podcast series (AKA Super Podcast Roundup Turbo HD Remix)&lt;/strong&gt;
&lt;br&gt;
Podcasts are roughly ordered by how much I like them&amp;hellip;but note that if they're
listed here, I like them. &lt;a href="http://www.pseale.com/blog/TheGreatPodcastRoundup.aspx"&gt;My
first podcast roundup was in 2006&lt;/a&gt;.
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://blog.stackoverflow.com/"&gt;Stack Overflow podcast&lt;/a&gt; - having read
both CodingHorror and Joel On Software, this one's a lot of fun. Revisit old topics,
get their unfiltered take on newer topics. It's good to get the unfiltered opinion,
even if they're uninformed from time to time. 
&lt;li&gt;
&lt;a href="http://deepfriedbytes.com/"&gt;Deep Fried Bytes&lt;/a&gt; - I like their rusty washers
segment. Maybe that's the pessimist in me, but hey, I'd prefer risking listening to
an over-critical rusty washers segment over over-exuberant marketing talk. 
&lt;li&gt;
&lt;a href="http://herdingcode.com/"&gt;Herding Code&lt;/a&gt; - when there are four co-hosts,
you get better questions, and the guest isn't allowed to spout FUD/ignorance for an
entire episode like sometimes happens on DotNetRocks. 
&lt;li&gt;
&lt;a href="http://www.hanselminutes.com/"&gt;Hanselminutes&lt;/a&gt; - I like the recent trend
of doing "follow-up" shows to correct inaccuracies on other podcast series. 
&lt;li&gt;
&lt;a href="http://www.dotnetrocks.com/"&gt;DotNetRocks&lt;/a&gt; - classic, still going, and
like the rest of 'em, DotNetRocks has both good and bad episodes. 
&lt;li&gt;
&lt;a href="http://se-radio.net/"&gt;Software Engineering Radio&lt;/a&gt; - in theory I like this
show, but I'll be honest and say I haven't listened in a long while.&amp;nbsp; My commute
dropped from an hour to just 8 minutes, what can I say. 
&lt;li&gt;
Irregularly updated podcasts I enjoy: 
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.oopsla.org/oopsla2008/community/podcast.html"&gt;OOPSLA podcast 2008&lt;/a&gt; and &lt;a href="http://www.oopsla.org/oopsla2007/index.php?page=podcasts/"&gt;OOPSLA
podcast 2007&lt;/a&gt; - some of the best episodes/talks come from this podcast series.
Hopefully we'll get the equivalent shows for their 2009 conference. 
&lt;li&gt;
&lt;a href="http://www.polymorphicpodcast.com/"&gt;Polymorphic Podcast&lt;/a&gt; - Craig's still
going, several years later. ASP.NET/web development/object-oriented development topics. 
&lt;li&gt;
&lt;a href="http://elegantcode.com/"&gt;Elegant Code&lt;/a&gt; - I don't remember the last time
they published something, but, hey, we're in the "irregular" section for a reason. 
&lt;li&gt;
&lt;a href="http://www.altnetpodcast.com/"&gt;ALT.NET podcast&lt;/a&gt; - just switched hosts,
so we'll see where this goes. 
&lt;li&gt;
&lt;a href="http://rubiverse.com/"&gt;Rubiverse podcast&lt;/a&gt; - run by the former ALT.NET/now-Ruby
guy. His shows are infrequent, but good.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Career-oriented (whether the career is freelancing, entrepreneurial, independent
consulting, or even working as an employee)&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://video.google.com/videoplay?docid=-1057787544886461551"&gt;Daniel James
- Building an Indie MMO (Puzzle Pirates)&lt;/a&gt; - this is (believe it or not) not much
about making games, as it is about building a product. He explicitly mentions that
you have to be extraordinarily productive. I'm not selling this well, but trust me,
you'll want to check this out. Also, he wears a pirate hat. 
&lt;li&gt;
&lt;a href="http://www.infoq.com/presentations/archaeopteryx-bowkett"&gt;Archaeopteryx by
Giles Bowkett&lt;/a&gt; - wherein he describes that he'd like to someday have Archaeopteryx
(the open source app he built and loves) be his main job. Sometime late in the presentation
Giles also says he'd like to describe himself as a "musician who happens to know how
to program." It's an engaging laser show, fog machine and all, and as the InfoQ page
says, "slides edited directly into the video &lt;strong&gt;since there were 500 of them."&lt;/strong&gt; I
don't agree with everything he says, but the career aspect of his presentation is
something to think about. 
&lt;li&gt;
&lt;a href="http://www.justin.tv/hackertv/97862/DHH_Talk__Startup_School_2008"&gt;DHH (creator
of Ruby on Rails; 37signals) at Startup School&lt;/a&gt; - apparently his talk immediately
followed a VC who spent an hour describing how to get VC money. One of the first thing
he says is "you don't need VC money" and explains why working in a VC-funded startup
is like playing the lottery, instead explaining that you should follow his revolutionary
advice and "charge money for your product." Engaging/entertaining, and a lot of straightforward
wisdom. 
&lt;li&gt;
&lt;a href="http://www.infoq.com/presentations/fernandez-sales-do-the-hustle"&gt;Do the
Hustle, by Obie Fernandez&lt;/a&gt; - straightforward talk on the business aspects of independent
consulting for Rails folk. Most of this applies to the rest of us. 
&lt;li&gt;
&lt;a href="http://www.reddit.com/r/programming/comments/71jks/lisping_at_jpl_the_rise_and_fall_of_lisp_at_the/c05g0t8"&gt;ajmoir's
description of a hyperproductive software team&lt;/a&gt; - this is a Reddit conversation
with multiple threads, so for the full story you've got to read all his replies. I
think this is important for everyone to read because &lt;strong&gt;you need to believe software
development can be done, for lack of a better term, "way better."&lt;/strong&gt; The promise
of hyper-productivity is fascinating. Also: Lisp. 
&lt;li&gt;
&lt;a title="http://blogmaverick.com/2009/05/13/success-motivation/" href="http://blogmaverick.com/2009/05/13/success-motivation/"&gt;Mark
Cuban on Success and Motivation (long, mostly storytelling)&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://railsconf.blip.tv/file/2086330/"&gt;How to become a famous Rails Developer,
Ruby Rockstar or Code Ninja&lt;/a&gt; - I haven't watched the presentation, but I did read &lt;a href="https://gist.github.com/0a2655aed6a26fa15a02"&gt;his
transcript&lt;/a&gt;. Also you may be interested in the &lt;a href="http://railsconf.blip.tv/posts?view=archive&amp;amp;nsfw=dc"&gt;RailsConf
video feed&lt;/a&gt;&amp;hellip;I haven't found anything else I'd recommend.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;Screencasts/webcasts/watching presentations on your computer&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.infoq.com/presentations/Fail-Scrum-Henrik-Kniberg"&gt;Ten Ways to
Screw Up with Agile and XP&lt;/a&gt; - this presentation is a kind of response to the "post-agile"
idea. Like the "post-agile"stuff we're beginning to hear about, he talks about how
Agile projects and teams can fail. Unlike "post-agile," he doesn't blame Agile, instead
focusing on solutions for the ten common problems he encounters. Highly recommended, &lt;strong&gt;especially&lt;/strong&gt; for
those not sold on Agile. &lt;a href="http://flux88.com/"&gt;Ben&lt;/a&gt; sent me this link some
time ago. 
&lt;li&gt;
&lt;a href="http://www.virtualaltnet.com/"&gt;Virtual ALT.NET meetings&lt;/a&gt; (ongoing) - these
are the in-depth presentations I've been looking for.&amp;nbsp; You can listen in live
to any meeting&amp;hellip;just plug in a working headset, go to &lt;a href="http://snipr.com/virtualaltnet"&gt;http://snipr.com/virtualaltnet&lt;/a&gt; &amp;hellip;
and that's it. Also, they record sessions! Awesome! &lt;a title="http://www.virtualaltnet.com/van/Recordings" href="http://www.virtualaltnet.com/van/Recordings"&gt;http://www.virtualaltnet.com/van/Recordings&lt;/a&gt; On
my queue of sorts: 
&lt;li&gt;
Øredev 2008 videos - I'm digging through these presently. Unlike most conferences,
Øredev has provided videos for each track (i.e. "the breakout sessions")! Awesome!
Find the videos either 
&lt;ul&gt;
&lt;li&gt;
Split out by category ( &lt;a title="http://www.oredev.org/" href="http://www.oredev.org/"&gt;http://www.oredev.org/&lt;/a&gt; in
the "Watch the videos from 2008" sidebar) 
&lt;li&gt;
&lt;a href="http://www.viddler.com/explore/oredev/videos/"&gt;in one big bag of videos on
VIddler&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
Haven't watched - &lt;a href="http://www.langnetsymposium.com/2009/talks.aspx"&gt;Lang.NET
symposium talks&lt;/a&gt;. I think I'll check out the two PowerShell videos and then bail,
I mean, hey&amp;#8212;I've got plenty to check out without delving into programming language
design. But, enough about me: you may find some of the other talks interesting. Big
ups to Microsoft for publishing the videos.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;Books (.NET development-related)&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.jphamilton.net/post/More-Bang-For-Your-Book.aspx"&gt;JP Hamilton
has the only "required reading" book list I've seen that's less than 4000&amp;nbsp; books&lt;/a&gt;.
His list has three (3). I'm on 1/3. For the record, I'm okay with longer "required
reading" lists, so long as they're given some sort of priority. JP prioritizes his
list. 
&lt;li&gt;
&lt;a href="http://www.foundationsof.com/"&gt;Free PDF eBook: Foundations of Programming
by Karl Seguin&lt;/a&gt; - in full disclosure I haven't read this. Karl doesn't directly
tell you why you should read his book, but maybe &lt;a href="http://accidentaltechnologist.com/book-reviews/book-review-foundations-of-programming-by-karl-seguin/"&gt;this
book review will help you make the decision&lt;/a&gt;. 
&lt;li&gt;
&lt;a href="http://www.lostechies.com/blogs/mokhan/archive/2009/02/12/object-thinking.aspx"&gt;Object
Thinking by David West&lt;/a&gt; - I'd like to think the author saw some trollish post on
Usenet about object-oriented programming, and started writing a long, detailed response.
One thing led to another, and hey! &lt;u&gt;Object Thinking&lt;/u&gt;. There's a chapter in this
book that has a long discussion about &lt;a href="http://blogs.msdn.com/elee/archive/2009/03/03/formalism-vs-hermeneutics.aspx"&gt;hermeneutics&lt;/a&gt;. &lt;a href="http://blogs.msdn.com/elee/archive/2009/03/03/formalism-vs-hermeneutics.aspx"&gt;Hermeneutics&lt;/a&gt;.
Try and work that one into a sentence. 
&lt;li&gt;
&lt;a href="http://manning.com/payette2/"&gt;PowerShell in Action 2nd Ed.&lt;/a&gt; is coming!
Excitement! I'm biased, what can I say.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;Code camps/Saturday developer events (Houston area, sorry everybody else)&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.adnug.org/AustinCodeCamp09/Proposal/List"&gt;Austin Code Camp&lt;/a&gt; -
May 30th, 2009 (soon!) - check out the hot hot hot session proposals! Hot! 
&lt;li&gt;
&lt;a href="http://fosshealth.eventbrite.com/"&gt;FOSS in Healthcare unconference&lt;/a&gt; -
July 31st - August 2nd, 2009 - costs money, but maybe it's worth it to you. 
&lt;li&gt;
&lt;a href="http://www.houstontechfest.com/"&gt;Houston Techfest 2009&lt;/a&gt; - September 26th,
2009. This is the day of the Texas Tech at University of Houston game, &lt;strong&gt;on
the University of Houston campus&lt;/strong&gt;. Techfest: est. 600 attendees. Football
game: ~30,000 (it's a small stadium). I think we'll have a crowded campus that Saturday!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;Everything else&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.vimeo.com/1513129"&gt;Using Photos to Enhance Videos&lt;/a&gt; - this is
one of those jaw-dropping demos. &lt;a href="http://www.vimeo.com/1513129"&gt;Click&lt;/a&gt; &lt;a href="http://www.vimeo.com/1513129"&gt;click&lt;/a&gt; &lt;a href="http://www.vimeo.com/1513129"&gt;click&lt;/a&gt; &lt;a href="http://www.vimeo.com/1513129"&gt;click&lt;/a&gt; &lt;a href="http://www.vimeo.com/1513129"&gt;click&lt;/a&gt; &lt;a href="http://www.vimeo.com/1513129"&gt;click&lt;/a&gt; &lt;a href="http://www.vimeo.com/1513129"&gt;click&lt;/a&gt;. 
&lt;li&gt;
&lt;a href="http://www.fredtrotter.com/2009/04/28/ncvhs-testimony-on-meaningful-use/"&gt;Fred
Trotter on the "VA VistA Underground Railroad" and how our US government should spend
its Healthcare IT money on open source&lt;/a&gt; - Healthcare IT has a problem, and I hope
an open source ecosystem is a solution. This article is long and gives a lot of history,
so you'll get something out of it even if not interested in the politics. Also the
links to the VA VistA Underground Railroad were fascinating; folks interested in Behavior
Driven Development would be interested by the stories about how "a programmer sits
down with a clinician" to write the app. Fascinating for a lot of reasons. 
&lt;li&gt;
While we're talking about BDD, &lt;a href="http://predelusional.blogspot.com/2008/06/parnas-oopsla-keynote-podcast-notes.html"&gt;you
might be interested in the David Parnas' keynote at OOPSLA&lt;/a&gt;, wherein he lays out
eerily similar goals (see the section on Documentation.) 
&lt;li&gt;
&lt;a href="http://underhanded.xcott.com/"&gt;The underhanded C contest&lt;/a&gt; - 2007's underhandedly-weak
encryption contest: "Your challenge: write the code so that some small fraction of
the time (between 1% and 0.01% of files, on average) the encrypted file is weak and
can be cracked by an adversary without the password." Make sure to look at the criteria
for bonus points, and of course, the winning submissions. 
&lt;li&gt;
"&lt;a href="http://www.reddit.com/r/programming/comments/7pd89/is_anyone_else_here_worried_that_theyve_spent_so/"&gt;Is
anyone else here worried that they've spent so long looking briefly at everything,
that they've still good at absolutely nothing?&lt;/a&gt;" - you don't have to click the
link, just acknowledge the point. This reddit post has 1000 upvotes. 
&lt;li&gt;
&lt;a href="http://www.scottberkun.com/blog/2009/project-management-for-beginners/"&gt;Scott
Berkun's Project management for beginners&lt;/a&gt; (post is short!) - because, aren't we
all beginners? You don't see this kind of straightforward talk from the PMBOK (if
you do, it's sandwiched between "effectively denying reality" and "having long status
meetings." In other news, I think I have a rebellious attitude towards the PMI, judge
for yourself. 
&lt;li&gt;
&lt;a href="http://blogs.msdn.com/michael_yeager/archive/2009/04/14/design-and-develop-versatilities-not-applications.aspx"&gt;Abstract
architecture-y type discussion - Design and Develop Versatilities, Not Applications&lt;/a&gt; -
focus on the idea of what he calls "versatilities," and not so much on the specific
technology involved (i.e. SharePoint.) I think it's a noble goal, but no, SharePoint
in its current form can't realize the lofty goal he sets forth. Sorry, no. As I said
elsewhere, you'll get far more mileage by training your power users to build their
own SQL queries and how to use pivot tables in Excel. But the ideal is good. 
&lt;li&gt;
&lt;a href="http://thedailywtf.com/Articles/Programming-Sucks!-Or-At-Least,-It-Ought-To-.aspx"&gt;Programming
Sucks! Or At Least, It Ought To&lt;/a&gt; - Alex (the author) runs thedailywtf.com. I don't
know what to say about this. Every programmer needs to find the balance between getting
real work done the ugly way, and spending time learning new techniques that make the
ugliness go away. I haven't found this balance. This goes in hand with Alex's other
classic article, &lt;a href="http://weblogs.asp.net/alex_papadimoulis/archive/2005/05/25/408925.aspx"&gt;Pounding
a Nail: Old Shoe or Glass Bottle?&lt;/a&gt; - and carries the same assumption that you must
live with your (bad) programming environment. 
&lt;li&gt;
&lt;a href="http://www.sharepointplan.com/mark_schneiders_sharepoin/2009/02/all-this-sharepoint-stuff-is-going-to-be-normal-pretty-soon.html"&gt;All
this SharePoint Stuff is Going to be Normal Soon&lt;/a&gt; - a lot of people see SharePoint
as the next "Microsoft Web OS," i.e. that the SharePoint trend will accelerate, and
that we'll start to see every future web-based product from Microsoft (and products
from other vendors!) run on top of SharePoint. As it is today, the easy answer is
"no that's not going to happen," because the cost of running your complex app on SharePoint
can't be justified. And for tomorrow the answer still looks to be "no that's not going
to happen," because I don't see any fundamental changes taking place. Non-trivial
add-ons today write their data to their own database, making their "SharePoint integration"
more lip service than truth. I've thought about what I'd like to see in an application
framework, and if I could summarize, the one thing SharePoint doesn't support that
it needs to: it would be nice if it allowed deep customizations that the product team
did not anticipate. I think this is the fundamental problem which at this point is
unsolvable for SharePoint. Solving this problem would require re-inventing SharePoint
into something that doesn't resemble the SharePoint of today.&lt;br&gt;
But, who knows, I could be horribly wrong about all this. 
&lt;li&gt;
&lt;a href="http://www.elumenotion.com/Blog/Lists/Posts/Post.aspx?ID=88"&gt;Discussion about
Microsoft Gold Partners, titled "Why Your Vendor Screwed Up Your SharePoint Project"&lt;/a&gt; -
wherein the author (gently, ever so gently) points out that Microsoft needs to change
its partner ecosystem. 
&lt;li&gt;
&lt;a href="http://www.scottberkun.com/blog/2009/how-to-call-bullshit-on-a-guru/"&gt;How
to call BS on a guru&lt;/a&gt; - again Scott Berkun. He writes books by the way :) 
&lt;li&gt;
&lt;a href="http://thedailywtf.com/Articles/OMGWTF-Finalist-10-FerronCalc.aspx"&gt;The DailyWTF
programming contest entry (a calc.exe replacement) which is built entirely in C++
templates&lt;/a&gt;. I can't tell you what kind of respect I have for that kind of compiler
abuse. 
&lt;li&gt;
News: &lt;a href="http://clojure.blogspot.com/2009/05/clojure-10.html"&gt;Clojure 1.0&lt;/a&gt; -
dismiss this at your own peril. Related: &lt;a href="http://www.mail-archive.com/clojure@googlegroups.com/msg09387.html"&gt;ClojureCLR
alpha up&lt;/a&gt;. 
&lt;li&gt;
&lt;a href="http://stackoverflow.com/questions/242650/is-mutation-testing-useful-in-practice"&gt;Is
mutation testing useful in practice [StackOverflow question]?&lt;/a&gt; I'm reading through
Kent Beck's TDD By Example, and he mentions mutation testing. Years later, it seems
like no one's talking about mutation testing. Are we doing something else to test
our unit tests? Is this too much overhead? Have we adopted a new mental framework
that eliminates the need for mutation testing? Anyway, there's your new-old idea for
the day: mutation testing.&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>My Own Aroma</title>
    <link rel="alternate" type="text/html" href="http://www.pseale.com/blog/MyOwnAroma.aspx" />
    <id>http://www.pseale.com/blog/PermaLink,guid,6581d4ce-15cc-4445-a30c-9ec505c598cb.aspx</id>
    <published>2009-03-26T21:48:49.2610081-07:00</published>
    <updated>2009-03-26T22:36:30.6606577-07:00</updated>
    <category term=".NET" label=".NET" scheme="http://www.pseale.com/blog/CategoryView,category,NET.aspx" />
    <content type="html">&lt;p&gt;
I'm here today to relay two messages:
&lt;/p&gt;
&lt;h3&gt;First: I'm still alive and well
&lt;/h3&gt;
&lt;p&gt;
I haven't posted anything of real substance in quite a while (and some of you in the
back of the room are shouting "in a while&amp;hellip;&lt;strong&gt;or ever!&lt;/strong&gt;" I can
hear you.) I'm not here to promise more frequent and meaty updates; instead, I'm here
to say that you can expect a lot less from me, at least on this blog.
&lt;/p&gt;
&lt;p&gt;
My growth-as-a-developer plan (&lt;a href="http://www.pseale.com/blog/2009HereICome.aspx"&gt;I
introduced it in detail here&lt;/a&gt;) is going full steam. While I'm not on track to hit
all specific targets, the most important thing is that I'm seeing real growth. The
bits that have been most helpful for me have been a) writing my own mini-project,
and b) reading source code.
&lt;/p&gt;
&lt;h4&gt;Lesson: read source code!
&lt;/h4&gt;
&lt;p&gt;
I'd like to emphasize how drastically this has changed my outlook. First, reading
others source code gives me self-confidence. And yes that's somewhat mean, I know.
But it's true, and I try to beat the "you are adequate" drum as often as possible&amp;#8212;by
reading others' bad source code, you'll better know where you stand. Sometimes you
realize you've got a lot to learn; sometimes you realize that hey, you're not all
that bad, relatively. Bad source code can be inspiring in its own way.
&lt;/p&gt;
&lt;p&gt;
And let's pull this around to the positive&amp;#8212;&lt;strong&gt;I've learned a ton reading
others' source code.&lt;/strong&gt; I've picked up lots of little nuggets like using &lt;font face="consolas"&gt;params[]&lt;/font&gt; as
a method argument, and bigger nuggets like the several different styles of context/specification-ish
unit tests. I shouldn't have to explain this; it should be self-evident that one can
learn by studying source code. Duh.
&lt;/p&gt;
&lt;h4&gt;Lesson: have a side project!
&lt;/h4&gt;
&lt;p&gt;
But &lt;strong&gt;more helpful even than reading others' source code is simply getting out
there and writing my own&lt;/strong&gt;. And I don't mean the type of stuff I do at work&amp;hellip;let's
not go there today. I mean code that is almost 100% logic; data stored in List&amp;lt;T&amp;gt;
and passed around as IEnumerable&amp;lt;T&amp;gt;. I don't have a database. I don't have a
UI. My project is entirely useless at this point, and will remain useless maybe forever.
&lt;/p&gt;
&lt;p&gt;
But I'm learning a ton! What's great about building my own project is that I'm able
to focus on learning specific topics. My focus points for this project are:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
OO (I'll flesh this out further when I know what it means) 
&lt;li&gt;
Test driven development (not just unit tests, but actual test-first, drive-out-the-design
via tests, TDD) 
&lt;li&gt;
Context/specification-style tests&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Along the way, as a kind of bonus, I've picked up:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
LINQ to objects - replacing for loops and foreach loops with LINQ calls. Related and
also learning: nuttiness featuring delegates. 
&lt;li&gt;
Rhino Mocks AAA syntax - with the exception of method argument constraints. If someone
wants to show me a good example of using constraints, I'd be ever so grateful&amp;#8212;just
a link to a project where someone's using RM constraints will work, I'll find it from
there. 
&lt;li&gt;
NUnit/XUnit/MSpec - in that order, and yes, I switched all my tests over, and yes,
the process was ugly. Also you can't claim to know NUnit if all you know is the [Test]
attribute and Assert.IsTrue().&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;What's most important about this whole 'writing my own side project' experience
is that it is &lt;u&gt;&lt;font color="#800080"&gt;fun&lt;/font&gt;,&lt;/u&gt;&lt;/strong&gt; and I had, and continue
to have, the energy to keep at it. I'm &lt;strong&gt;never&lt;/strong&gt; motivated to do self-directed
learning, so this boost of energy is the biggest win. If you're one of those people
who can't imagine this kind of thing could be &lt;em&gt;fun&lt;/em&gt;, well, maybe it's time
to try out a side project.
&lt;/p&gt;
&lt;h4&gt;Everything else has suffered
&lt;/h4&gt;
&lt;p&gt;
Everything else has become unimportant. Learning the newest wave of MS technology
isn't even a concern at this point; I'll pick it up when I need to, or when my side
project calls for it. What's surprising to me is that even ASP.NET MVC, which I happen
to like, is being shunned with the rest of them.
&lt;/p&gt;
&lt;p&gt;
Also, blogging has suffered. Also, my book reading has suffered. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;I've completely stopped reading those futile "here's 80 things you don't know"
linkblog posts.&lt;/strong&gt; Aside from &lt;a href="http://stevepietrek.com/"&gt;the SharePoint
one&lt;/a&gt;, which is golden, what are you getting out of your linkblogger? Do they read
all the articles they link you to? Are the links relevant/do you intend to read any
of them yourself? Are the links accurate/factual? See, I'd prefer a monthly linkblogger
who had on average six or seven links, and &lt;strong&gt;all &lt;/strong&gt;six or seven would
be interesting. Then, every year or so, there'd appear one starred link. This link
would be considered so important you couldn't ignore it, a "must-see" so to speak.
&amp;hellip;Anyway, that's how I see proper linkblogging. Seven links a month, or so.
&lt;/p&gt;
&lt;p&gt;
But who cares about all that, really. I'm learning a ton, and you can't stop me!
&lt;/p&gt;
&lt;h4&gt;Everything in Balance
&lt;/h4&gt;
&lt;p&gt;
I should clarify: I'm coming to this concept as the podcast junkie/blog consumer/programming
aggregator consumer person, who didn't have a side project. I've been at it (this
side project) a few months now. 
&lt;/p&gt;
&lt;p&gt;
So if you're thinking my advice is unwise, that's fine&amp;#8212;I'll take this space
and make a disclaimer: I intend to use common sense, and re-evaluate my learning strategy
from time to time. In particular, I&amp;nbsp; do intend to read books in the future, hopefully
the near future.
&lt;/p&gt;
&lt;p&gt;
Just not right now.
&lt;/p&gt;
&lt;h3&gt;Second: I like reading my own Twitter feed
&lt;/h3&gt;
&lt;p&gt;
Way at the top I told you I had two things to say tonight. First was the message that
everyone needs to start their own side project even just to help them learn.
&lt;/p&gt;
&lt;p&gt;
Second is to tell you that &lt;strong&gt;I'm on twitter. Believe it, &lt;/strong&gt;&lt;a href="http://twitter.com/pseale"&gt;&lt;strong&gt;twitter.com/pseale&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.
Subscribe!&lt;/strong&gt; Do it!
&lt;/p&gt;
&lt;p&gt;
Something I've found amusing is that I enjoy reading my own twitter feed. It's either
a sign that my tweets are engaging and are chock-full of hilarity and insightful content&amp;hellip;or
that I like smelling my own aroma.&amp;nbsp; You be the judge!
&lt;/p&gt;
&lt;p&gt;
Here's a sampling of my twitter bouquet:
&lt;/p&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;Posted update to my SP unit testing blog entry: &lt;a href="http://www.pseale.com/blog/SharePointNotUnitTesting.aspx"&gt;http://www.pseale.com/blog/SharePointNotUnitTesting.aspx&lt;/a&gt; -
summary is "learn OO first"
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Thu
Mar 05 16:26:41 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;I should point out I updated the post because @jopxtwits
linked to it at &lt;a href="http://tinyurl.com/af9tnc"&gt;http://tinyurl.com/af9tnc&lt;/a&gt;
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Thu
Mar 05 16:29:17 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;TDD in SP projects is a gun rack: &lt;a href="http://www.pseale.com/blog/SharePointNotUnitTesting.aspx"&gt;http://www.pseale.com/blog/SharePointNotUnitTesting.aspx&lt;/a&gt; -
yes I just re-updated my own post
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Fri
Mar 06 03:29:57 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;In most recent episode of my ongoing "My Tests Suck" series:
just found out I forgot to wire up events, 'the hard way'. No test failed,oops
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Fri
Mar 06 03:56:11 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;Just hit CTRL+SHIFT+B on my Firefox window, out of habit.
In other news, I've hit the 50 test mark.
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Fri
Mar 06 05:43:10 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;Oops another bug, not covered by tests. Hopefully I'm learning
by experience, emphasis on the word "learning"
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Fri
Mar 06 06:10:58 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;I'm dead serious when I say that using PowerShell to explore
SP central admin/SSP is faster than using the browser, esp. w/ 30 sec compile
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Fri
Mar 06 21:19:18 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;compare-object $updateJob ($addToSsp+$inSsp) | group sideindicator
&amp;#8212;-note it's comparing list of fields in $updateJob to UNION of 2 lists
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Fri
Mar 06 21:42:49 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;New-WebServiceProxy - instant web service test harness.
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Fri
Mar 06 22:34:24 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;Does anyone use structs in C# for value objects? Because,
I don't.
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Sun
Mar 08 18:47:55 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;Finally discovered what Func&amp;lt;T&amp;gt;/Action&amp;lt;T&amp;gt; are
for, yes, I should know this; no, I didn't know this. Now I do.
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Mon
Mar 09 01:48:55 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;Note to self: learn how to use Rhino Mocks constraints&amp;hellip;later.
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Mon
Mar 09 05:42:09 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;Ugh, Can't use WCF Service References in VS2005 without
installing a never-updated CTP that just now failed install. And yes, I said VS2005.
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Mon
Mar 09 16:51:35 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;In related news: how do you troubleshoot a ~misbehaving
VS Web Reference? Is there a verbose mode I can try to see why it fails to map data?
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Mon
Mar 09 16:57:00 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;Q: Where are some good development-related mailing lists
in which I can lurk? For me mailing lists are out of sight, out of mind
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Mon
Mar 09 19:56:05 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;RT @yourdon I've begun writing a 3rd edition of "Death
March" as a collaborative blog. DM me with your email adr if you'd like to see it.
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Tue
Mar 10 01:55:55 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;RT 2of2 @yourdon Re: "Death March" 3rd ed: emphasize I'm
just *starting* it; it's not a finished draft. But you can influence its content&amp;hellip;
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Tue
Mar 10 01:56:46 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;This ugly state machine state base class MUST DIE! Rolling
up sleeves; got protective eyewear, steel toed boots, lead cup. I'm prepared.
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Tue
Mar 10 04:05:25 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;Interesting series of posts about high expectations set
on SP admins: &lt;a href="http://www.sharepointblogs.com/matt/"&gt;http://www.sharepointblogs.com/matt/&lt;/a&gt;
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Tue
Mar 10 18:41:39 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;Someone needs to make a "Watermark Production Central Admin
+ SSP" branding Feature, so I can know at a glance I'm looking at a prod site
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Tue
Mar 10 19:26:31 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;In other news, the presence of a trailing slash (/) in
my URL bombed out a stsadm -o createsite operation. Encourages my paranoia
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Tue
Mar 10 19:42:15 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;I'm using this quick PowerShell script to compile my SharePoint
Search scopes on demand: &lt;a href="http://poshcode.org/925"&gt;http://poshcode.org/925&lt;/a&gt;
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Tue
Mar 10 20:33:41 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;I don't think Folder rules on custom Scopes work. I assume
they work on doc libs, but not my custom list. Ugh
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Tue
Mar 10 20:48:04 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;1) Write down concrete next action-style tasks. Failing
that, 2) break them up into tiny actions. Failing that, 3) go home. See you tomorrow
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Wed
Mar 11 00:12:24 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;Had thought: "hmm, how am I going to test this? Requires
a lot of mocking." Answer: duh, move it out of the class. Trying for 0 static mthds
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Wed
Mar 11 03:08:54 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;Not that I'm saying static methods are totally bad, I'm
saying I'm trying to do this entire little project without them. I.e. to try it out.
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Wed
Mar 11 03:09:44 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;In other news, I have test code duplication, and it's painful.
But, I'm not sure how best to change tests, need to look around some
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Wed
Mar 11 03:11:30 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;As an added bonus of doing my tests the hard way, JP's
BDD framework ( &lt;a href="http://is.gd/m3G0"&gt;http://is.gd/m3G0&lt;/a&gt; ) makes sense to
me now. Well, almost :)
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Wed
Mar 11 03:14:08 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;IEnumerable shouldn't hate on null values as much as it
does. Live and let null
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Wed
Mar 11 04:43:51 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;1of#:"Since 2001, 23 TDD studies were published&amp;hellip;13
reported improvements&amp;hellip;4 were inconclusive, 4 reported no discernable difference.
1&amp;hellip;
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Wed
Mar 11 16:30:22 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;2of#:"&amp;hellip;Only one study reported a quality penalty
for TDD." &lt;a href="http://bit.ly/13F8g"&gt;http://bit.ly/13F8g&lt;/a&gt; - SKIP the article,
go straight to Hakan Erdogmus comment
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Wed
Mar 11 16:31:41 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;3of#: Meanwhile, this article (&lt;a href="http://bit.ly/mHqZL)"&gt;http://bit.ly/mHqZL)&lt;/a&gt; is
fascinating. Found link via @raganwald's RSS feed.
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Wed
Mar 11 16:34:29 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;1of#: For the record people: learn how to do your dayjob
better first, THEN look to the shiny new GUI toolkit. If it doesn't help&amp;hellip;
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Wed
Mar 11 19:21:43 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;2of#:&amp;hellip;doesn't help you be better in some way, than
why are you learning it? Also, there's a lot of room for improvement with what we
&amp;hellip;
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Wed
Mar 11 19:23:05 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;3of#:&amp;hellip;have now. No need to wait for Azure on Silverlight
+ WF + WPF + jQuery to solve our problems for tomorrow; instead, learn how to&amp;hellip;
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Wed
Mar 11 19:23:54 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;4of#:&amp;hellip;how to build web apps TODAY. People are so
far behind, and then they read an article that casually says "learn WPF." LEARN WPF&amp;hellip;
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Wed
Mar 11 19:24:28 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;5of5: I'm done. Lesson: if anyone tells you to learn a
framework/technology, ask them if they've learned it. Because they haven't.
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Wed
Mar 11 19:25:05 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;Link that started my rant: "6 Things *EVERY* ASP.NET Developer
should know by 2010" &lt;a href="http://blog.saviantllc.com/archive/2009/03/09/4.aspx"&gt;http://blog.saviantllc.com/archive/2009/03/09/4.aspx&lt;/a&gt;
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Wed
Mar 11 19:25:34 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;RT @yourdon: I need lots of new examples, war stories,
etc about today's death-march projects. If you've got one, DM me or email
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Wed
Mar 11 21:21:13 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;Someone just said "Shame on you" on my "SP Wikis" post,
I need to update the post body itself to be more accurate: &lt;a href="http://bit.ly/VihV3"&gt;http://bit.ly/VihV3&lt;/a&gt;
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Wed
Mar 11 21:27:59 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;Also I'll point out I'm highly bemused by the "shame on
you" comment :) He's right, but it's still a little funny, esp. the way it's worded
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Wed
Mar 11 21:29:48 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;Q: How many off-hours technical learning would you say
is COMMENDABLE? 4 hours a week? 2 hours? Please do reply, I'm curious. I say 4hrs
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Wed
Mar 11 21:48:20 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;PHP is its own reward
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Thu
Mar 12 18:26:17 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;Tomorrow's forecast: EXTRAORDINARILY PRODUCTIVE
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Thu
Mar 12 20:53:26 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;Yes, I'm saying that codebehind in InfoPath forms is exactly
like The One Ring: turns good intentions into GREAT EVIL
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Fri
Mar 13 20:47:59 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;"Krikey,the things these artists are doing while everyone
else is rewording their unit tests and staring at the TIOBE index." -&lt;a href="http://is.gd/nfE2"&gt;http://is.gd/nfE2&lt;/a&gt;
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Fri
Mar 13 22:58:09 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;META: when your new follower follows 10000+ people, block
them; they won't miss you. Also, blatant ads. Block.
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Sat
Mar 14 00:14:04 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;Whatever happened to Blossom? The TV show. Yeah, now you're
remembering, that one.
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Mon
Mar 16 03:16:54 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;On keeping up: &lt;a href="http://bit.ly/5km3k"&gt;http://bit.ly/5km3k&lt;/a&gt; -
this is the #1 reason I've stopped SP-targeted learning&amp;#8212;focus on fun! Link from
@jpboodhoo
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Mon
Mar 16 17:59:25 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;"SharePoint 14 to public beta in 2 or 3 months" - tweeted
26 days ago - &lt;a href="http://twitter.com/rmaclean/statuses/1222833833"&gt;http://twitter.com/rmaclean/statuses/1222833833&lt;/a&gt;
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Mon
Mar 16 20:31:18 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;Neat, this is what a psake script looks like: &lt;a href="http://is.gd/nDSD"&gt;http://is.gd/nDSD&lt;/a&gt;
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Tue
Mar 17 03:09:15 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;Botched AnkhSVN file move =&amp;gt; "Microsoft Visual Studio
(2008) is Busy" dialog
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Tue
Mar 17 03:21:03 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;Ugh, NBehave / NSpec examples (from src) are trivial=&amp;gt;not
useful. JP's sample is scary, but is believable
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Tue
Mar 17 03:48:34 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;The MachineSpecifications NUnit extensions are certainly
neat: &lt;a href="http://bit.ly/MSpecNUnitLove"&gt;http://bit.ly/MSpecNUnitLove&lt;/a&gt; - also,
CollectionAssert&amp;hellip;it exists.
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Tue
Mar 17 04:26:57 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;DL'ed files are "blocked" for my own safety. Downloaded
"streams" from sysinternals to remove blocks en masse. Irony: streams.exe is blocked
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Tue
Mar 17 04:53:07 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;RT @subdigital: 36* seats open for #altnethouston, please
help spread the word! &lt;a href="http://houston.altnetconf.com"&gt;http://houston.altnetconf.com&lt;/a&gt;
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Tue
Mar 17 16:23:24 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;Ok there are a lot of great PowerShell + SharePoint scripts
at &lt;a href="http://sharepointpsscripts.codeplex.com/"&gt;http://sharepointpsscripts.codeplex.com/&lt;/a&gt; -
common tasks, automated, easy
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Tue
Mar 17 22:30:42 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;YEEAaaaaaaaaaaaaaaaaargh no-index attribute
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Wed
Mar 18 00:50:52 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;~ ~ ~~ ~ ~~ ~ ~~ ~ ~~ ~ ~~ ~ ~~ ~ ~~ ~ ~~ ~ ~~ ~ ~~ ~ ~~
~ ~~ ~ ~~ ~ ~~ ~ ~~ ~ ~~ ~ ~~ ~ ~~ ~ ~~ ~ ~~ ~ ~~ ~ ~~ ~ ~~ ~ ~~ ~ ~~ ~ ~~ ~ ~~ ~
~
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Wed
Mar 18 02:27:52 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;SharePoint 14 upgrade details via MS KB articles: &lt;a href="http://tinyurl.com/clv8ku"&gt;http://tinyurl.com/clv8ku&lt;/a&gt;
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Wed
Mar 18 13:47:50 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;I've got to unsubscribe from dotnetkicks.com. I keep succumbing
to the "someone wrong on the INTERNET" bug
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Thu
Mar 19 05:25:40 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;Most recent post I "couldn't let go": &lt;a href="http://tinyurl.com/d6vvx9"&gt;http://tinyurl.com/d6vvx9&lt;/a&gt;
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Thu
Mar 19 05:27:31 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;Fellow developers: you can BOTH a) acknowledge your dev
skill shortcomings, AND b) feel adequate. SEE: &lt;a href="http://secretgeek.net/inadequate.asp"&gt;http://secretgeek.net/inadequate.asp&lt;/a&gt;
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Thu
Mar 19 17:54:13 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;Run one test =&amp;gt;pass. Run all tests=&amp;gt;same test fails.
Lesson: I'm misusing the test framework
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Fri
Mar 20 02:45:37 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;In related news, I'm still looking for how others do "rowtest"-style
tests while adhering to the AAA convention. Examples?
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Fri
Mar 20 02:55:30 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;Halfway done switching tests over to MSpec, and just read
the output (which shows all specs formatted nicely). It's surprisingly readable.
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Fri
Mar 20 04:14:42 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;Ok I just deleted 2 tests that were dumb. Who's the jerk
that wrote them in the first place! Jerk! Oh, that's me, I wrote them, my bad.
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Fri
Mar 20 04:28:00 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;#followfriday @CobraCommander - proving that everyone succumbs
to the inanity of Twitter
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Fri
Mar 20 15:54:27 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;Do the SHIFT key! ~ ! @ # $ % ^ &amp;amp; * ( ) _ + ~ ! @ #
$ % ^ &amp;amp; * ( ) _ + ~ ! @ # $ % ^ &amp;amp; * ( ) _ + ~ ! @ # $ % ^ &amp;amp; * ( ) _ +
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Fri
Mar 20 17:50:31 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;Finished conversion of my tests to mspec. Now to fix the
ugliness that reared it's head during the conversion. "Now"=&amp;gt;"later"
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Sat
Mar 21 07:28:03 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;Seriously considering changing my avatar to this:(&lt;a href="http://is.gd/ou6J"&gt;http://is.gd/ou6J&lt;/a&gt;)
- Related: &lt;a href="http://qwitter.com"&gt;http://qwitter.com&lt;/a&gt; isn't owned by qwitter
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Mon
Mar 23 03:24:50 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;Do the UNICODE! Õ??????¦?n?????
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Mon
Mar 23 19:06:10 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;New favorite word: "roughage" - &lt;a href="http://tinyurl.com/dltl2g"&gt;http://tinyurl.com/dltl2g&lt;/a&gt;
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Mon
Mar 23 21:22:25 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;In other news, I like Neal Ford's arguments against workflow
designers: &lt;a href="http://bit.ly/ILTZq"&gt;http://bit.ly/ILTZq&lt;/a&gt;
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Mon
Mar 23 21:27:40 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;New thought: someone needs to write another twitter client&amp;hellip;specifically,
a gopher twitter client. Believe it, gopher.
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Mon
Mar 23 22:28:15 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;RT @doctorlinguist: @pseale gopher://gopher.floodgap.com/1/fun/twitpher
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Mon
Mar 23 22:49:03 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;Nothing encourages me to learn keyboard shortcuts more
than my laptop touchpad. Tonight's find: CTRL+W, CTRL+E gives focus to Error List
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Tue
Mar 24 02:40:58 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;Found my pre-LINQ code that attempted to count items in
an IEnumerable. Thankfully today's me is smarter; ~5 lines replaced with .Count()
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Tue
Mar 24 02:52:39 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;SharePoint's search engine can go die. Forget any nice
things I've said about it in the past.
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Tue
Mar 24 13:41:41 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;Or, it's my fault I sacrificed the chicken BEFORE the goat,
not AFTER as clearly laid out on MSDN.
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Tue
Mar 24 13:42:34 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;And by "chicken"I mean "ran full crawl" and by "goat" I
mean "updated the search scopes." Also forgot to do macarena and sprinkle fairy dust
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Tue
Mar 24 13:43:48 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;And by "macararena" I mean "include displaytitle AS WELL
AS ows_Title in the managed property mapping."
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Tue
Mar 24 13:48:18 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;Issue is resolved, I did the macarena and sacrificed a
chicken, in that order. See previous tweets to see what I mean, that's the real sol.
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Tue
Mar 24 14:09:16 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;jQuery eliminates crapola JavaScript. I HAVE PROOF
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Wed
Mar 25 00:00:54 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;Another example of how the real-world Internet surpasses
imaginations of any fictional cyberspace: &lt;a href="http://bit.ly/tCKU"&gt;http://bit.ly/tCKU&lt;/a&gt; -
home router worms
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Wed
Mar 25 12:43:30 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;SP as app dev platform: 1) do your app dev the old way,
ASP.NET/SQL, but deploy to _layouts/ folder. Declare SUCCESS
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Wed
Mar 25 21:36:52 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;SP as app dev platform 2): 80/20 rule, pretend remaining
20% is "impossible." no project longer than a week
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Wed
Mar 25 21:42:05 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;&amp;hellip; 3) extenuating circumstances require you do app
dev in SP.
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Wed
Mar 25 21:45:18 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;There is no fourth option. You're doing 1-3 or it's (in
my opinion of course) a bad idea.
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Wed
Mar 25 21:46:39 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;The example demonstrating spec failures from thrown exceptions
is hilarious: &lt;a href="http://bit.ly/HSLYMY"&gt;http://bit.ly/HSLYMY&lt;/a&gt; - just click
the link
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Thu
Mar 26 03:47:32 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;Also note in MSpec that Catch.Exception( ()=&amp;gt;stuff()
) is the syntax. For example see: &lt;a href="http://bit.ly/18tVh8"&gt;http://bit.ly/18tVh8&lt;/a&gt;
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Thu
Mar 26 03:55:18 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;Cloud computing appreciation manifesto! &lt;a href="http://cloudappreciationsociety.org/manifesto/"&gt;http://cloudappreciationsociety.org/manifesto/&lt;/a&gt; CLICK!
Click it! You won't be disappointed
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Thu
Mar 26 18:07:33 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.8em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #f9fefe"&gt;
&lt;div style="margin: 0.5em"&gt;Is it just me or should I NOT feel dirty using an image
submit button in HTML? &lt;a href="http://tinyurl.com/df76nm"&gt;http://tinyurl.com/df76nm&lt;/a&gt; (&amp;lt;input
type="image"/&amp;gt;)
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Thu
Mar 26 18:12:43 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="border-right: maroon 1px dashed; border-top: maroon 1px dashed; max-width: 40em; margin: 0.5em; border-left: maroon 1px dashed; border-bottom: maroon 1px dashed; background-color: #effefe"&gt;
&lt;div style="margin: 0.5em"&gt;I call this code pattern "choosing to suppress disgust:" &lt;a href="http://img205.imageshack.us/img205/8726/choosingtosuppressdisgu.png"&gt;http://img205.imageshack.us/img205/8726/choosingtosuppressdisgu.png&lt;/a&gt;
&lt;/div&gt;
&lt;div style="margin-top: 0.3em; font-size: 0.8em; margin-bottom: 0.4em; margin-right: 1em; text-align: right"&gt;Thu
Mar 26 18:59:16 +0000 2009
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
There wasn't really a point to listing all these out. Well, no reason besides blatantly
advertising &lt;a href="http://twitter.com/pseale"&gt;twitter.com/pseale&lt;/a&gt;. Subscribe!
Do it!
&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Pablo Picasso Refactors</title>
    <link rel="alternate" type="text/html" href="http://www.pseale.com/blog/PabloPicassoRefactors.aspx" />
    <id>http://www.pseale.com/blog/PermaLink,guid,ffe343f2-263b-42a9-bf85-9dc0f1771dc3.aspx</id>
    <published>2009-02-18T21:12:52.9846099-08:00</published>
    <updated>2009-02-18T21:40:20.153318-08:00</updated>
    <category term=".NET" label=".NET" scheme="http://www.pseale.com/blog/CategoryView,category,NET.aspx" />
    <category term="Awesomeness" label="Awesomeness" scheme="http://www.pseale.com/blog/CategoryView,category,Awesomeness.aspx" />
    <content type="html">&lt;p&gt;
&lt;strong&gt;&lt;em&gt;&lt;font color="#800080"&gt;Or, how two unlike things can seem alike!&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
A while back, I followed a fascinating link from programming.reddit titled &lt;a href="http://artyfactory.com/art_appreciation/animals_in_art/pablo_picasso/pablo_picasso.htm"&gt;Pablo
Picasso's version of refactoring: Reducing a drawing to 12 perfect pen strokes&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
As the story goes, Pablo Picasso created a series of eleven lithographs of a bull
in profile. He first created a detailed, accurate image of a bull. Then, for his next
lithograph (&lt;a href="http://www.google.com/search?hl=en&amp;amp;q=define%3Alithograph&amp;amp;btnG=Google+Search&amp;amp;aq=f&amp;amp;oq="&gt;I
don't know what a lithograph is either&lt;/a&gt;, let's just pretend these are drawings
from now on) he changed some aspects of the bull, accentuating its &lt;strong&gt;bull&lt;/strong&gt;-ness.
As he progressed, he began to remove detail, slowly replacing photorealism with smaller
expressions of the same aspect, retaining the &lt;strong&gt;bull&lt;/strong&gt;-ness. His last
drawing was twelve or so thin strokes, a stick figure still roughly recognizable as
a bull.
&lt;/p&gt;
&lt;p&gt;
As the programming.reddit title indicated, this sounds a whole lot like refactoring!
&lt;/p&gt;
&lt;p&gt;
It's super impressive, and I &lt;strong&gt;&lt;font color="#800000"&gt;dearly urge you to look
at the progression of Picasso lithographs yourself (click link below)&lt;/font&gt;&lt;/strong&gt;:
&lt;/p&gt;
&lt;div style="border-right: yellow 3px dashed; padding-right: 0.4em; border-top: yellow 3px dashed; padding-left: 0.4em; background: yellow; padding-bottom: 0.5em; margin: 0.4em; border-left: yellow 3px dashed; width: 460px; padding-top: 0.4em"&gt;
&lt;div style="border-right: #50ffff 1px dashed; padding-right: 1em; border-top: #50ffff 1px dashed; padding-left: 1em; background: #cc0000; padding-bottom: 1em; margin: 1em; vertical-align: middle; border-left: #50ffff 1px dashed; width: 400px; padding-top: 1em; border-bottom: #50ffff 1px dashed; text-align: center"&gt;
&lt;div style="text-align: center"&gt;&lt;a style="font-weight: bold; font-size: 3em; background: #cc0000; vertical-align: middle; color: #50ffff; font-family: georgia; letter-spacing: -2px; text-align: center" href="http://artyfactory.com/art_appreciation/animals_in_art/pablo_picasso/pablo_picasso.htm" target="_blank"&gt;Click
Me!&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Now for the dangerous part.
&lt;/p&gt;
&lt;p&gt;
.
&lt;/p&gt;
&lt;p&gt;
.
&lt;/p&gt;
&lt;p&gt;
.
&lt;/p&gt;
&lt;p&gt;
. 
&lt;/p&gt;
&lt;p&gt;
.
&lt;/p&gt;
&lt;p&gt;
.
&lt;/p&gt;
&lt;p&gt;
.
&lt;/p&gt;
&lt;p&gt;
.
&lt;/p&gt;
&lt;p&gt;
.
&lt;/p&gt;
&lt;p&gt;
Extra space added so you follow the link before viewing the section below; you'll
miss out on the full experience otherwise!
&lt;/p&gt;
&lt;p&gt;
.
&lt;/p&gt;
&lt;p&gt;
.
&lt;/p&gt;
&lt;p&gt;
.
&lt;/p&gt;
&lt;p&gt;
.
&lt;/p&gt;
&lt;p&gt;
.
&lt;/p&gt;
&lt;p&gt;
.
&lt;/p&gt;
&lt;p&gt;
So you're with me, right?
&lt;/p&gt;
&lt;p&gt;
.
&lt;/p&gt;
&lt;p&gt;
.
&lt;/p&gt;
&lt;p&gt;
.
&lt;/p&gt;
&lt;p&gt;
.
&lt;/p&gt;
&lt;p&gt;
.
&lt;/p&gt;
&lt;p&gt;
I was feeling great until I read this, the first comment on the &lt;a href="http://www.reddit.com/r/programming/comments/6suxs/pablo_picassos_version_of_refactoring_reducing_a/"&gt;reddit
comments thread&lt;/a&gt;:
&lt;/p&gt;
&lt;p&gt;
&lt;img height="158" alt="image" src="http://www.pseale.com/blog/content/binary/WindowsLiveWriter/PabloPicassoRefactoring_139D4/image_d8092c15-9a1f-4414-aeca-df523dbbf0b1.png" width="822" border="0"&gt;&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
This is something with which I want to leave you. The next time someone makes a bad
analogy, &lt;strong&gt;nail them with this Descartes quote.&lt;/strong&gt; I can't pronounce Descartes
properly, but that won't stop me, and it shouldn't stop you either. If in doubt, try
a "dude, the French philosopher dude," sprinkle the word "dude" anywhere you're uncertain;
they serve as TODOs for your vocabulary.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Aside: &lt;/strong&gt;in true reddit fashion, this is the next highly-rated comment
thread:
&lt;/p&gt;
&lt;p&gt;
&lt;img height="432" alt="image" src="http://www.pseale.com/blog/content/binary/WindowsLiveWriter/PabloPicassoRefactoring_139D4/image_dcd84b49-a75f-4e75-8695-3cf279fa4780.png" width="423" border="0"&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&amp;hellip;and following that, unintentional, then intentional, references to &lt;a href="http://realultimatepower.net/"&gt;realultimatepower.net&lt;/a&gt;.
&lt;/p&gt;
&lt;h3&gt;Linking this discussion to the present day
&lt;/h3&gt;
&lt;p&gt;
This misuse of &lt;em&gt;seeming similarity&lt;/em&gt; is (among other reasons) why a lot of us
are bugged with recent CodingHorror posts. Specifically, let's take list a):
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;font size="5"&gt;List A: SOLID principles et al&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;img height="369" alt="image" src="http://www.pseale.com/blog/content/binary/WindowsLiveWriter/PabloPicassoRefactoring_139D4/image_f0c6fe16-51e8-4460-aa9d-b83222941b0d.png" width="678" border="0"&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Here's list b), in &lt;a href="http://www.codinghorror.com/blog/archives/001225.html"&gt;The
Ferengi Programmer&lt;/a&gt; (emphasis added):
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;font size="5"&gt;List B: 285 Ferengi Rules of Acquisition&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;blockquote style="border-right: cyan 1px dashed; padding-right: 1em; border-top: cyan 1px dashed; padding-left: 1em; padding-bottom: 1em; margin: 1em; border-left: cyan 1px dashed; padding-top: 1em; border-bottom: cyan 1px dashed"&gt;The
Ferengi are a part of the Star Trek universe, primarily in Deep Space Nine. They're
a race of ultra-capitalists whose every business transaction is governed by the 285
Rules of Acquisition. There's a rule for every possible business situation&amp;#8212;&lt;strong&gt;and,
inevitably, an interpretation of those rules that gives the Ferengi license to cheat,
steal, and bend the truth to suit their needs.&lt;/strong&gt;&lt;/blockquote&gt; &lt;blockquote&gt; 
&lt;p&gt;
And in case that was a coincidence, &lt;a href="http://www.codinghorror.com/blog/archives/000856.html"&gt;here's
the list from his next post, responding to the standard rebuttal&lt;/a&gt;:
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;font size="5"&gt;List C: processes and methodologies&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;img height="504" alt="image" src="http://www.pseale.com/blog/content/binary/WindowsLiveWriter/PabloPicassoRefactoring_139D4/image_491cae45-fdd0-4f6d-901d-f67e915ba64f.png" width="399" border="0"&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
So the question to you: are these three lists the same? 
&lt;/p&gt;
&lt;h3&gt;I win either way
&lt;/h3&gt;
&lt;p&gt;
My logic is inescapable. If you think the SOLID principles (list A) are in fact, as
sneaky and extensive as the Ferengi Rules of Acquisition (list B), and are just the
newest in a long line of fad methodologies (list C), then hey: I'll point you to the
story about the bull, and how we all thought it was similar to refactoring. Except
when you think about it, it's wasn't refactoring, it only resembled refactoring on
the surface. I mean, come on, he drew pictures of a bull, it wasn't refactoring. I
dare you to say the Picasso bull lithograph series was like refactoring.
&lt;/p&gt;
&lt;p&gt;
And there I have you as well! Because if you refute my drawing-a-bull-isn't-like-refactoring
argument, then by the very nature of your disagreement that "these two things aren't
alike," you're proving that "these two things aren't alike!" Refute my "bull-metaphor
doesn't apply to refactoring" argument to the "Ferengi rules metaphor doesn't apply
to the SOLID principles" argument, and &lt;strong&gt;you've proven the very thing you're
trying to argue against!&lt;/strong&gt; I have you either way!
&lt;/p&gt;
&lt;p&gt;
Next time I see you I'll collect the five dollars you owe me. And before you say to
yourself "but I don't owe Peter $5," remember, my logic is irrefutable and you owe
me a fiver*. Descartes says so. THE BULL! Pay up.&lt;br&gt;
&lt;strong&gt;&lt;font size="1"&gt;*this is a real word, people use it&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;/blockquote&gt;</content>
  </entry>
  <entry>
    <title>iPhone App Gold Rush</title>
    <link rel="alternate" type="text/html" href="http://www.pseale.com/blog/iPhoneAppGoldRush.aspx" />
    <id>http://www.pseale.com/blog/PermaLink,guid,ed5e02ef-159f-48ba-a812-b217188c12c0.aspx</id>
    <published>2009-02-01T14:32:01.912-08:00</published>
    <updated>2009-02-01T21:17:25.0564644-08:00</updated>
    <category term=".NET" label=".NET" scheme="http://www.pseale.com/blog/CategoryView,category,NET.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
This deserves its own post. After declaring that I won't be writing any iPhone apps,
despite my secret dreams of iPhone app fame and riches, I went back and looked for
the source of these secret, repressed dreams. Where did I get the idea that there's
an iPhone app gold rush?
</p>
        <h3>iPhone app gold rush stories
</h3>
        <p>
I didn't write the titles; the following links are as they appeared to me on either
programming.reddit or Hacker News. Click each [comments] link if you're interested.
</p>
        <ul style="font-size: 1.4em">
          <li>
            <a href="http://www.iphonesavior.com/2009/01/iphone-developer-quits-day-job-after-ishoot-hits-number-one.html">iPhone
Developer Quits Day Job After 'iShoot' Hits Number One</a> - <a href="http://www.reddit.com/r/programming/comments/7pqeg/iphone_developer_quits_day_job_after_ishoot_hits/">[comments]</a></li>
          <li>
            <a href="http://venturebeat.com/2008/12/23/iphone-fart-app-pulls-in-nearly-10000-a-day/">Today
I lost a little faith in humanity: iPhone fart app pulls in nearly $10,000 *a day*</a> - <a href="http://www.reddit.com/r/programming/comments/7lkyo/today_i_lost_a_little_faith_in_humanity_iphone/">[comments]</a></li>
          <li>
            <a href="http://www.tgdaily.com/html_tmp/content-view-40982-140.html">ISteam for iPhone
earns a bunch of 22-year olds $100,000 in one month</a> - <a href="http://news.ycombinator.com/item?id=433577">[comments]</a></li>
          <li>
            <a href="http://www.iphonedev.in/iPhone/Crap-iPhone-App-Milking-$200/hr.html">"Crap"
iPhone App Milking $200/hr</a> - <a href="http://news.ycombinator.com/item?id=445145">[comments]</a></li>
          <li>
            <a href="http://www.cnn.com/2008/TECH/11/18/iphone.game.developer/index.html">Developer
strikes it rich with iPhone game: Makes $250K profit in two months.</a> - <a href="http://news.ycombinator.com/item?id=368476">[comments]</a></li>
        </ul>
      </div>
    </content>
  </entry>
  <entry>
    <title>2009, Here I Come!</title>
    <link rel="alternate" type="text/html" href="http://www.pseale.com/blog/2009HereICome.aspx" />
    <id>http://www.pseale.com/blog/PermaLink,guid,e06f86e8-3a68-463a-8a30-6db5d73017ac.aspx</id>
    <published>2009-01-28T00:27:42.7445293-08:00</published>
    <updated>2009-01-29T23:24:46.0515439-08:00</updated>
    <category term=".NET" label=".NET" scheme="http://www.pseale.com/blog/CategoryView,category,NET.aspx" />
    <content type="html">&lt;p&gt;
I won't recap 2008; I dislike public introspection and what's more, you can read all
about my 2008 by visiting my blog's home page, which has &lt;em&gt;everything&lt;/em&gt;. I think
the home page weighs in at 5MB of content right now. It's huge, and unashamed of its
hugeness&amp;#8212;my blog wears a T-shirt that says "large and in charge." The T-shirt
has prominent pizza stains. Deal with it.
&lt;/p&gt;
&lt;p&gt;
It's already late January, and I've missed the new year's deadline, but I'm still
roughly in time for the Chinese new year.
&lt;/p&gt;
&lt;h3&gt;New year's resolutions ahoy! 
&lt;/h3&gt;
&lt;div style="border-right: #b6c8d1 1px dashed; padding-right: 0.5em; border-top: #b6c8d1 1px dashed; padding-left: 0.5em; font-size: 0.9em; float: right; max-width: 240px; padding-bottom: 0.5em; margin: 0.5em; border-left: #b6c8d1 1px dashed; padding-top: 0.5em; border-bottom: #b6c8d1 1px dashed"&gt;
&lt;div style="min-width: 100%; font-size: 1.2em; text-align: center"&gt;Programming-related
aggregators:&lt;br&gt;
&lt;i&gt;your new hobby!&lt;/i&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://news.ycombinator.com/"&gt;Hacker News&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://www.reddit.com/r/programming/"&gt;programming.reddit.com&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://codebetter.com/"&gt;CodeBetter.com&lt;/a&gt; | &lt;a href="http://www.lostechies.com/"&gt;LosTechies.com&lt;/a&gt; | &lt;a href="http://devlicio.us/"&gt;devlicio.us&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://www.dotnetkicks.com/"&gt;DotNetKicks&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://ayende.com/blog/"&gt;ayende.com&lt;/a&gt; - (due to quantity, counts as aggregator)&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;
One thing dramatically missing from my 2008 was a proper book education. I read every
programming-related aggregator known to mankind, listened to every programming podcast
known to mankind, and read my share of technical weblogs. But I can't say I read programming
books. Books!
&lt;/p&gt;
&lt;p&gt;
I shouldn't have to explain why books are uniquely and deeply beneficial to any education.
&amp;hellip;So I won't.
&lt;/p&gt;
&lt;h4&gt;Resolution: read 6 "fundamentals" books this year
&lt;/h4&gt;
&lt;p&gt;
6 is the reach goal, because for me, reading dense textbooks is &lt;em&gt;tough&lt;/em&gt;. I
used to put myself to sleep reading history textbooks. It turns out, &lt;u&gt;Object Thinking&lt;/u&gt; by
David West works just as well as a history textbook&amp;#8212;even though (in both cases!)
I'm interested in the subject at hand, focusing is tough.
&lt;/p&gt;
&lt;p&gt;
Of the six, I'm going to start with &lt;a href="http://www.jphamilton.net/post/More-Bang-For-Your-Book.aspx"&gt;JP's
short list focused on coding fundamentals&lt;/a&gt;&amp;#8212;not necessarily design, estimation,
DDD, business analysis, project management, management, or whatever other useful fundamental
skill you can imagine. Coding, not that other thing.
&lt;/p&gt;
&lt;h5&gt;Sub-resolution: read 3 technology-focused books this year
&lt;/h5&gt;
&lt;p&gt;
No specifics here because I don't know which three; I'll know when I need them. I'm
just writing this as an acknowledgement that yes, at some point in the next year I'll
have to tackle some new frameworks; this space is reserved for three such Unnamed
Frameworks.
&lt;/p&gt;
&lt;p&gt;
Okay, so, books. That's obvious.
&lt;/p&gt;
&lt;h4&gt;Resolution: read source code
&lt;/h4&gt;
&lt;p&gt;
Another obvious (and easy!) candidate is reading others' source code. &lt;a href="http://www.hanselman.com/blog/CategoryView.aspx?category=Source+Code"&gt;Scott
Hanselman has covered the why's of this topic well&lt;/a&gt;; I'm just here to say "me too."
What's unfortunate is that I'm already running out of good samples. Most of the ASP.NET
MVC samples don't even cover all the CRUD operations! CRUD!
&lt;/p&gt;
&lt;p&gt;
At this one I'm doing well. So, stay the course!
&lt;/p&gt;
&lt;h4&gt;Resolution: complete and release one minor development project this year
&lt;/h4&gt;
&lt;p&gt;
Next: practice. This is easy to describe. If I want to become a strong developer,
I need to practice. Others have done a good job explaining why; I'll just say that
I plan to do this. And not &lt;strong&gt;just&lt;/strong&gt; attending coding dojos, which are
great, but actually doing some self-directed practice. "Practice" isn't a specific
goal, so instead, we'll work at one minor development project.
&lt;/p&gt;
&lt;p&gt;
Minor means that it doesn't have to change the world or make me a billion jiggawatt
dollars. I'm also going to try to stop reading all the rags-to-riches-iPhone-app stories
that appear regularly, seducing me with their plausibility. There's been a lot of
those recently (&lt;a href="http://www.reddit.com/r/programming/comments/7pqeg/iphone_developer_quits_day_job_after_ishoot_hits/"&gt;story#1&lt;/a&gt;&amp;nbsp;&lt;a href="http://www.reddit.com/r/programming/comments/7lkyo/today_i_lost_a_little_faith_in_humanity_iphone/"&gt;story#2&lt;/a&gt;&amp;nbsp;&lt;a href="http://news.ycombinator.com/item?id=433577"&gt;story#3&lt;/a&gt;&amp;nbsp;&lt;a href="http://news.ycombinator.com/item?id=269765"&gt;story#4&lt;/a&gt;&amp;nbsp;&lt;a href="http://news.ycombinator.com/item?id=445145"&gt;story#5&lt;/a&gt;&amp;nbsp;&lt;a href="http://news.ycombinator.com/item?id=368476"&gt;story#6&lt;/a&gt;).
&lt;/p&gt;
&lt;p&gt;
Anyway, the point is&amp;#8212;make a project, finish it, and do so in such a way that
I'm not ashamed to release the source code. No ulterior motives, like releasing it
later as an iPhone app. But if I were to release an iPhone app&amp;#8212;I have a dream
where Steve Jobs shows up on my doorstep holding a duffel bag full of cash. He's there
making his daily delivery of my iPhone app's earnings. In my dream Steve Wozniak is
there too, giving me a thumbs up and another duffel bag full of cash. Woz doesn't
work for Apple anymore; he's there because my iPhone app is &lt;em&gt;that good&lt;/em&gt;. 
&lt;/p&gt;
&lt;p&gt;
Anyway, no iPhone apps.
&lt;/p&gt;
&lt;p&gt;
As a way to practice, make one project; practice techniques while making the app;
no ulterior motives. Sounds easy enough. I should clarify that I can't count work
projects, no matter how proud of them I may or may not be.
&lt;/p&gt;
&lt;h4&gt;Resolution: boycott more Microsoft frameworks
&lt;/h4&gt;
&lt;p&gt;
While boycott is a strong word, it may not be strong enough to express &lt;a href="http://www.pseale.com/blog/LearningLahar.aspx"&gt;how
overwhelmed I am&lt;/a&gt; by the tide of technologies and frameworks coming from Microsoft!
Also, it's a proven strategy&amp;#8212;by boycotting Workflow 3.0 and LINQ to SQL in 2008,
I saved a bunch of time &lt;strong&gt;not &lt;/strong&gt;learning these deprecated frameworks.
I'm sticking with this general strategy for 2009: if I don't need a technology, I
won't pressure myself to learn it.
&lt;/p&gt;
&lt;h3&gt;Putting all this in perspective
&lt;/h3&gt;
&lt;p&gt;
These are my technical learning goals for the year. Let me state that by no means
is this my life priority for 2009. I think it would be awesome to reflect on 2009
and say "this was a great year," despite &lt;strong&gt;woefully failing&lt;/strong&gt; to meet
any of my stated goals above. 
&lt;/p&gt;
&lt;p&gt;
The point being, there are more important things than &lt;a href="http://www.pseale.com/blog/SilverlightVersusMagicalFairylandSilverlight.aspx"&gt;arguing
about whether Silverlight matters&lt;/a&gt;. You know, &lt;em&gt;life&lt;/em&gt;!
&lt;/p&gt;
&lt;p&gt;
Oh and, quick, shot-across-the-bow answer: no, Silverlight still doesn't matter; don't
learn it yet.
&lt;/p&gt;
&lt;h3&gt;Final note: if your goal is continuous improvement, ask yourself why?
&lt;/h3&gt;
&lt;p&gt;
Something I noticed at the KAIZENC0NF was that there were exclusively enterprise development-related
sessions (and I'm culpable as I could have suggested a topic Friday had I been there
Friday). This didn't bother me at the time, but as I look back on the conference,
it bothers me now. I think it's because I don't want to be &lt;em&gt;truly great &lt;/em&gt;at
enterprise development. Sure, I'm driven by a desire to be good at what I do. Sure,
I want to remain gainfully employed, ideally such that I'm more valuable, rather than
less, as time passes. This is all reasonable, and yes, I will put in the requisite
effort. I.e., this means I'll spend time learning things I have no interest in learning,
i.e. I'll work at it. The key word there being &lt;em&gt;work&lt;/em&gt;.
&lt;/p&gt;
&lt;p&gt;
But I'm not passionate about (name your enterprise vertical). &lt;strong&gt;I don't get
excited learning a technology, framework or skill if I can only use it at work.&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
And don't think I just mean SharePoint (unpopular amongst .NET developers, an easy
target); this applies also to the enterprise development aspects of DDD and Lean (popular,
and on an upward arc*), and in learning enterprisey things like data warehouses. Or
BPEL, or the abstract concepts behind BPEL. Yawn.&lt;br&gt;
&lt;strong&gt;&lt;font size="1"&gt;*the key here is to note that yes, I believe they're valuable,
but no, I can't seem to get excited about learning them. Don't overreact, I just mean
"I can't get excited about learning them."&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
What's the point of trying to become &lt;em&gt;truly great&lt;/em&gt; at enterprise development? &lt;em&gt;Just&lt;/em&gt; enterprise
development?
&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>SharePoint Plus ASP.NET MVC</title>
    <link rel="alternate" type="text/html" href="http://www.pseale.com/blog/SharePointPlusASPNETMVC.aspx" />
    <id>http://www.pseale.com/blog/PermaLink,guid,f40d2433-ea7c-447d-a680-e27babce5a4c.aspx</id>
    <published>2008-12-18T13:48:39.0092721-08:00</published>
    <updated>2008-12-18T13:48:39.0092721-08:00</updated>
    <category term="SharePoint" label="SharePoint" scheme="http://www.pseale.com/blog/CategoryView,category,SharePoint.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
It's all business again.
</p>
        <h3>First: I'm going to be away from (hopefully all) computers for a while
</h3>
        <p>
I'll be on vacation, in a very real and non-metaphorical sense. Which is awesome.
</p>
        <p>
What it means for you is, if on the offhand chance you leave a comment or email me,
I won't respond. Sorry, I'll be away. Sucks for you, awesome for me.
</p>
        <h3>Second: ASP.NET MVC and SharePoint, together as one
</h3>
        <p>
It still boggles the mind how many people are searching for this term. The only thing
I want to ask you, the many people who are searching for "how do I get ASP.NET MVC
running underneath SharePoint," is: why? Why do you want to do this?
</p>
        <p>
I'm not here to provide any answers today; instead, I'm posting this as a kind of
googlebait to lure you in. Maybe it's wrong, but whatever. Why do you want to use
the still-beta ASP.NET MVC framework on top of SharePoint? I honestly don't know why
anyone would do this. So please, if you search for "how do I combine SharePoint with
ASP.NET MVC," and you hit this page, leave me a comment! I want to get in your brain
and swim around a little.
</p>
        <p>
I'm pretty sure I can get ASP.NET MVC running underneath SharePoint; the only magic
will be removing pieces of SharePoint from the MVC project's web.config, and (maybe)
integrating with SharePoint's security (or maybe not). Besides ugprading to .NET 3.5
SP1, which is by far the most arduous step on a production farm, it shouldn't be too
tricky to get this working.
</p>
        <p>
Anyway, there's a somewhat rambling teaser—it's probably possible, even if I
can't imagine why it would be a good idea.
</p>
      </div>
    </content>
  </entry>
  <entry>
    <title>Disoriented</title>
    <link rel="alternate" type="text/html" href="http://www.pseale.com/blog/Disoriented.aspx" />
    <id>http://www.pseale.com/blog/PermaLink,guid,41c8820e-b318-402b-b67f-265fbc66617e.aspx</id>
    <published>2008-11-06T12:16:47.098-08:00</published>
    <updated>2008-11-06T13:54:24.2274268-08:00</updated>
    <category term=".NET" label=".NET" scheme="http://www.pseale.com/blog/CategoryView,category,NET.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <div style="float: right; text-align: center; max-width: 274px;">
          <img src="http://www.pseale.com/blog/content/binary/elevator-bank.jpg" />
          <br />
          <span style="font-size: 0.8em; font-weight: bold;">This isn't my building, but you
get the idea. Like my building, the elevators line both sides of a short hallway.</span>
        </div>
        <br />
I had a moment of sudden disorientation during an elevator ride recently.<br /><br />
First, let me explain the elevator setup. In our fancy downtown building, we have
a bank of five (or is it six?) elevators. Our elevator bank is housed in the center
of the building, lining both sides of a short hallway. As fancy as we are, we aren't
fancy enough to justify glass windows or any of the other elevator luxuries. The doors
open, you get in, the doors close, and your new, smaller world is the four brushed-metal
elevator walls.<br /><br />
So, as the scene had played out hundreds (or possibly thousands) of times before,
the doors opened, I got on the elevator, the doors closed. This time, however, I was
distracted—more so than usual—and wasn't paying too much attention to
where I was walking.<br /><br />
As the elevator began its descent to the ground floor, and as is quite unusual for
me, I had a new thought intrude—which elevator am I on? And which way do I turn
when the door opens—left or right? I had no idea.<br /><br />
And for a brief moment, I was suddenly disoriented—almost in a physical sense.<br /><br />
We'll get back to the elevator story in a moment.<br /><h3>Conference that shall not be named so that keyword searches shall not pick it
up
</h3>
Last weekend I attended the open spaces event in Austin, and while I'd like to post
something saying "it was a great time, well worth it, etc," I can't. There were only
two impressions I have after attending the conference.<br /><br />
One: I'm not ready. I'm not even currently using the tools discussed by (and at times,
designed by) the other attendees, nor (with my current technology stack) am I planning
to use them. Tools aren't everything; my "I'm not ready" feeling also goes for the
softer topics like lean/agile/kanban, which are definitely of interest to me, but
not in the sense that I have any authority to make changes outside of myself. I'm
not a "Big Tymer" like Manny Fresh and Baby.<br /><br />
Before we move onto the second impression, let me talk for a second about my learning
queue, by way of Billy Hollis.<br /><h3>Learning queue
</h3>
I listened to a fascinating Deep Fried Bytes podcast interviewing Billy Hollis. Most
interesting to me was his discussion of how no one is keeping up with the .NET framework—while
Microsoft is now pushing Azure and Windows 7 and C# 4.0 and whoops, throw out the
old Workflow Foundation, we're pressing the reset button on Workflow 4.0—while
all this is happening, of the developers Billy Hollis interviews, only ~1 out of 10
are using generics. Generics, which were introduced in 2005, and as Billy Hollis pointed
out, not a large topic to learn, are still not in regular use by 9 our of 10 developers. 
<br /><br />
Sample bias noted, even if the developers he interviews aren't representative of the
developer population, this is still something to sit up and take note. The key takeaway
is that <b>almost everyone is far behind</b>. And he illustrates this with some stark
(if anecdotal) numbers.<br /><br />
Meanwhile, over the last several years I've focused on SharePoint. I've been learning
about web parts and workflow and InfoPath and web content management publishing features
and ASP.NET app pools and IIS6 and XSL and Solution packages and Feature packages
and governance and taxonomies and IA and so on—I've immersed myself in the SharePoint
world. It was tough to keep up, especially given the magnitude of SharePoint itself.<br /><br />
But, at some point in the past, I publicly and officially declared, "I'm done." No
more SharePoint learning, except what I need for my job, today. And it's really freed
me up, in terms of mental weight. Now that I know I no longer need to learn how to
do SharePoint workflow, for example, why would I ever want to learn it—especially
now as they've announced WF4.0 will be completely new? Why would I want to research
SharePoint object disposal best practices, when I myself no longer need this to get
things done at work?<br /><br />
But something else happened, something unintentional. At the moment I declared I was
no longer going to learn SharePoint—at that moment I experienced a similar moment
of disorientation. If I'm not going to be a SharePoint guy in the long term, what
now? The elevator doors will open soon; left or right?<br /><h3>Back to the conference
</h3>
And we're back to talking about the open spaces conference I just attended. This was
the conference where I was to meet up with what would become my new community of practice.
This would be the group with which I could identify.<br /><br />
But for whatever reason, it didn't work out that way.<br /><br />
I've already mentioned that at the conference, I got the strong impression that I
wasn't ready to attend; that I needed to do some homework before even being able to
process most of what was discussed in the sessions, much less contribute.<br /><br />
Surprisingly, at this conference I also had a strong moment of disorientation again.
Instead of cementing my understanding of software development into a rigid cast, and
allowing me to fall into something of a comfortable pattern as I expected, I felt
distinctly less comfortable afterwards.<br /><br />
I don't think it's necessarily a bad thing to be uncomfortable. If we're following
the elevator story from earlier, a dubious metaphor to begin with, but hey, here we
are at the end and we can't exactly go back and invent a new and possibly worse metaphor—well,
let's stick with the elevator story. At the open spaces conference last weekend I
experienced a kind of career vertigo—I'm in the moment just before the elevator
doors opens. It's uncomfortable, but I'm sure the sensation will pass. And when it
does, my world will have grown.<br /></div>
    </content>
  </entry>
  <entry>
    <title>SharePoint Timer Jobs</title>
    <link rel="alternate" type="text/html" href="http://www.pseale.com/blog/SharePointTimerJobs.aspx" />
    <id>http://www.pseale.com/blog/PermaLink,guid,40122a00-12d3-4107-9f44-042a8bc4845b.aspx</id>
    <published>2008-10-28T16:46:47.877-07:00</published>
    <updated>2008-10-30T16:21:33.09127-07:00</updated>
    <category term="PowerShell" label="PowerShell" scheme="http://www.pseale.com/blog/CategoryView,category,PowerShell.aspx" />
    <category term="PowerShell Plus SharePoint" label="PowerShell Plus SharePoint" scheme="http://www.pseale.com/blog/CategoryView,category,PowerShellPlusSharePoint.aspx" />
    <category term="SharePoint" label="SharePoint" scheme="http://www.pseale.com/blog/CategoryView,category,SharePoint.aspx" />
    <content type="html">&lt;br&gt;
I couldn't hold out.&lt;br&gt;
&lt;br&gt;
It's okay though, because today we're strictly business. In the course of developing
a bunch of SharePoint timer jobs recently, I've learned several things, most of which
aren't obvious from the get-go:&lt;br&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;b&gt;Storing and retrieving configuration data is a problem.&lt;/b&gt; Because I don't have
a &lt;a href="http://www.sharepointnutsandbolts.com/2008/05/introducing-sharepoint-config-store-for.html"&gt;farm-wide
configuration list&lt;/a&gt; (yet&amp;#8212;the temptation grows every day), I was forced to
do some ugliness in order to store and retrieve configuration data. I don't necessarily
recommend my approach; instead I'll just say I'm using a custom SPPersistedObject
as my Timer Job's config store and I'll further say that it works, roughly, though
I'd now prefer a better way. Consider &lt;a href="http://www.sharepointnutsandbolts.com/2008/05/introducing-sharepoint-config-store-for.html"&gt;setting
up a farm-wide config list&lt;/a&gt;, it's a relatively big time investment but is probably
worth it. Other traditional config storage options (such as the web.config, or a site-local
config list, or your site-local property bag) aren't accessible to Timer Jobs without
some sort of&amp;hellip;&lt;i&gt;configuration's configuration&lt;/i&gt;&amp;hellip;hmm, yes&amp;hellip;without
something extra pointing the way. Anyway, it's a problem.&lt;br&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;font size="4" color="#800080"&gt;&lt;b&gt;ANYTIME YOU UPDATE YOUR TIMER JOB CLASS (or custom
assembly), YOU MUST BUMP &lt;u&gt;ALL&lt;/u&gt; SHAREPOINT TIMER SERVICES ON THE FARM!&lt;/b&gt;&lt;/font&gt; I
learned this lesson the hard way. If you fail to bump the timer service, it will blissfully
run the old copy of your timer job class; I don't know how or why it caches your assembly,
but it does, and bumping the SharePoint timer service is the only way to clear the
assembly cache(?) and force it to use your minty fresh assembly.&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;
Side-note: can we report this as a bug in the Solution framework? Because this is
a big enough gotcha that the Solution framework needs to include an option to -bumptimersvc
&amp;hellip;or something. Maybe a custom stsadm command (stsadm -o resetadmsvc) or maybe
tack something onto the Solution deployment API and associated stsadm commands&amp;hellip;we
need &lt;i&gt;something&lt;/i&gt;.&lt;br&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;li&gt;
&lt;b&gt;There are differences between the context of a test harness (i.e. something like
an NUnit integration test running under the NUnit test runner) and a timer job running
in the Timer service.&lt;/b&gt; This may sound obvious, but when you're troubleshooting
something that "only breaks on the test farm," this little bit of trivia is important.
If you need to troubleshoot your timer job &lt;i&gt;as it runs on the timer service, specifically&lt;/i&gt;,
this can get tricky.&lt;br&gt;
&lt;/li&gt;&gt;
Also, in the course of troubleshooting just such an issue (as outlined in #3) I've
created a little script to speed up the code-compile-test loop; instead of scheduling
a timer job for "0100 hours" and waiting until tomorrow to see the results, why not
reschedule the timer job by your own self? And that's exactly what I did.&lt;br&gt;
&lt;b&gt;
&lt;br&gt;
My script below will reschedule your timer job to run 10 seconds in the future&lt;/b&gt; (read:
instantaneously). All you have to do to get this script working for you is customize
four variables to match your own timer job, then follow the quick "usage instructions"
at the bottom of the script. Below is a rundown of the four variables: 
&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;b&gt;$siteUrl&lt;/b&gt; - the site collection root URL. We need this to get a reference to
the SPWebApplication that holds your Timer Job.&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;$customAssemblyName&lt;/b&gt; - the partial name of your custom assembly. This is necessary
because &lt;b&gt;we're going to new up an instance of your timer job&lt;/b&gt;, and thus we'll
need to first load the containing assembly.&lt;br&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;$jobName&lt;/b&gt; - this need only be a rough equivalent of your job name. I'm usually
lazy and say something like "*custom profile job*" or the minimum necessary to identify
my job from all the rest. &lt;b&gt;Messy is good&lt;/b&gt;; we're running a one-off script, right?
Or you can go ahead and type the perfect exact case-sensitive job name in there, that's
fine too.&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;$timerJobClassName&lt;/b&gt; - again, we need this because we're going to new up a rescheduled
timer job.&lt;br&gt;
&lt;/li&gt;
&lt;/ul&gt;
Assumptions:&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;
Your original schedule doesn't matter, and may be destroyed. Because that's exactly
what this script does, by the way&amp;#8212;it destroys the original schedule and sets
a "10 seconds from now" schedule. Incidentally, whatever it did before, your job now
runs on a daily schedule :)&lt;br&gt;
&lt;/li&gt;
&lt;li&gt;
You're only concerned about the timer job running on one web application's context.
Because in truth that's all that mattered to me when I wrote this script, I didn't
consider the possibility of multiple jobs.&lt;/li&gt;
&lt;li&gt;
You're running a single-server farm (i.e. a developer VM). My script only stops the
service on the local server.&lt;br&gt;
&lt;/li&gt;
&lt;li&gt;
No one else cares if you bump the SPTimerV3 service, including any other timer jobs
that may be running presently. Note in the script below, PowerShell has some cmdlets
to work with Windows Services. I was totally unaware of them until I had to bump this
service; neat.&lt;br&gt;
&lt;/li&gt;
&lt;/ul&gt;
While these assumptions sound scary, trust me&amp;#8212;&lt;i&gt;you won't care.&lt;/i&gt; On a single
developer VM, you won't care about all these things. Even on a multi-server test farm,
you won't care&amp;#8212;because this script is going to save you hours of troubleshooting.&lt;br&gt;
&lt;br&gt;
The PowerShell script is as follows:&lt;br&gt;
&lt;br&gt;
&lt;font face="Courier New"&gt;$siteUrl = "http://dev"&lt;br&gt;
$customAssemblyName = "Corp.SharePoint.Assembly"&lt;br&gt;
$jobName = "*your job name*wildcards*work*"&lt;br&gt;
$timerJobClassName = "Corp.SharePoint.Namespace.TimerJob"&lt;br&gt;
&lt;br&gt;
[void][reflection.assembly]::LoadWithPartialName("Microsoft.SharePoint")&lt;br&gt;
[void][reflection.assembly]::LoadwithPartialName("Microsoft.Office.Server")&lt;br&gt;
[void][reflection.assembly]::LoadwithPartialName($customAssemblyName)&lt;br&gt;
&lt;br&gt;
function Run-Init&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $global:s = [Microsoft.SharePoint.SPSite]$siteUrl&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $global:webApplication = $s.WebApplication&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $global:job = $webApplication.JobDefinitions | ? { $_.Name -like
$jobName }&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
function Create-NewJob&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Stop-Service "SPTimerV3"&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Start-Service "SPTimerV3"&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $global:job.Delete()&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $global:job = new-object $timerJobClassName -arg $webApplication&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $sched = new-object Microsoft.SharePoint.SPDailySchedule&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $now = [datetime]::now.AddSeconds(10)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $sched.BeginHour = $now.Hour&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $sched.EndHour = $now.Hour&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $sched.BeginMinute = $now.Minute&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $sched.EndMinute = $now.Minute&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $sched.beginsecond = $now.Second&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $sched.endsecond = $now.Second&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $global:job.Schedule = $sched&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $global:job.Update()&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
#Usage: paste this script directly into a PowerShell console; the quickest 
&lt;br&gt;
#way is to right-mouse-button click. Then when you're ready, 
&lt;br&gt;
#run the following commands (minus the # of course):&lt;br&gt;
#&lt;br&gt;
#Run-Init&lt;br&gt;
#Create-NewJob&lt;br&gt;
#&lt;br&gt;
#Anytime you update your custom assembly "Corp.SharePoint.Assembly", you will need
to&lt;br&gt;
#DESTROY your open PowerShell console/session and create a new one. This is the cleanest
way 
&lt;br&gt;
#to unload your old custom assembly.&lt;br&gt;
&lt;br&gt;
&lt;/font&gt;That's pretty much it. Change the variables to whatever you need, open a PowerShell
console, right-click, then type "Run-Init; Create-NewJob". You're done! Step 3: Profit!&lt;br&gt;
&lt;br&gt;
Tiny footnote: if you don't care about "context", this script also allows you to execute
the timer job immediately. First run the "Run-Init" function, then just type $job.Execute([guid]::Empty)
in PowerShell. You can also attach to the PowerShell.exe process and do "remote debugging"
of your timer job, if desired. Though if you're going to go that far, you should probably
just write an NUnit test that performs the same task, and debug &lt;i&gt;THAT&lt;/i&gt;. I'm very
pro-unit testing frameworks, really, they're great. &lt;i&gt;Anything&lt;/i&gt; that closes the
code-compile-test loop, in &lt;i&gt;any &lt;/i&gt;way, is a good thing.&lt;br&gt;
&lt;p&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Exploring System.Drawing; I'm aware it's the year 2008</title>
    <link rel="alternate" type="text/html" href="http://www.pseale.com/blog/ExploringSystemDrawingImAwareItsTheYear2008.aspx" />
    <id>http://www.pseale.com/blog/PermaLink,guid,346890db-9fe6-47ee-ab37-f5e1bf92948b.aspx</id>
    <published>2008-10-27T18:52:14.5405685-07:00</published>
    <updated>2008-10-27T19:10:38.8787265-07:00</updated>
    <category term="Awesomeness" label="Awesomeness" scheme="http://www.pseale.com/blog/CategoryView,category,Awesomeness.aspx" />
    <category term="PowerShell" label="PowerShell" scheme="http://www.pseale.com/blog/CategoryView,category,PowerShell.aspx" />
    <content type="html">&lt;p&gt;
Yes, I'm aware it's late in the year 2008, I'm aware this stuff isn't as fresh as
WPF 3D or Ruby Processing.
&lt;/p&gt;
&lt;p&gt;
As I've posted earlier, I've accrued some &lt;a href="http://www.pseale.com/blog/AwesomenessWithoutWords.aspx"&gt;treasured
junk&lt;/a&gt;. Now that I have all this junk, what am I to do? Well, um&amp;hellip;I didn't
really know either.
&lt;/p&gt;
&lt;p&gt;
So I started messing around.
&lt;/p&gt;
&lt;h3&gt;Messing around with System.Drawing: first, infrastructure
&lt;/h3&gt;
&lt;p&gt;
The first thing I did was to determine the average color for a single image. I'm not
sure exactly where I'm going, but I figure, hey, if you want to get a rough "picture"
of what an image looks like, it's not a bad idea to look at the average color value.
And we're using the RGB breakdown for color, meaning white is #FFFFFF (256,256,256),
black is #000000 (0,0,0), and everything else falls in between.
&lt;/p&gt;
&lt;p&gt;
Note that in my case, performance is not a big deal; I'm doing all these calculations
one pixel at a time which, as you might image, is &lt;em&gt;suboptimal&lt;/em&gt;. Mostly a straightforward
operation:
&lt;/p&gt;
&lt;span style="font-family: consolas, courier new"&gt; 
&lt;p&gt;
public static Color Average(Image image)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; using (Bitmap bitmap = new Bitmap(image))&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int red, green, blue;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; long redRunningSum = 0, greenRunningSum
= 0, blueRunningSum = 0;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; long numPixels = bitmap.Width * bitmap.Height; 
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (Color pixelColor in ImageHelper.GetPixelsFor(bitmap))&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; redRunningSum +=
pixelColor.R;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; blueRunningSum
+= pixelColor.B;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; greenRunningSum
+= pixelColor.G;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; red = (int)(redRunningSum / numPixels);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; green = (int)(greenRunningSum / numPixels);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; blue = (int)(blueRunningSum / numPixels); 
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return Color.FromArgb(red, green, blue);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
} 
&lt;/span&gt; 
&lt;p&gt;
Ok, so why do we care&amp;#8212;it's a function, right? Well, okay, yes&amp;#8212;but here's
a PowerShell function you may also find interesting:
&lt;/p&gt;
&lt;span style="font-family: consolas, courier new"&gt; 
&lt;p&gt;
function Average-Images ($filenames)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; [void][reflection.assembly]::Loadfile("C:\a\sandbox\ImgTest\bin\Debug\ImgTest.dll")&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $i = 1&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $total = $filenames.count&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $results = @()&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach ($filename in $filenames)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; write-host "$i - $($i*100/$total)%- $($filename)"&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $i++&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $img = [System.Drawing.Image]::FromFile($filename)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $o = new-object PSObject&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $avg = [ImgTest.ImageHelper]::Average($img)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; add-member -inp $o -membertype "NoteProperty"
-name "Filename" -value $filename&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; add-member -inp $o -membertype "NoteProperty"
-name "Image" -value $img&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; add-member -inp $o -membertype "NoteProperty"
-name "Red" -value $avg.R&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; add-member -inp $o -membertype "NoteProperty"
-name "Green" -value $avg.G&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; add-member -inp $o -membertype "NoteProperty"
-name "Blue" -value $avg.B&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $results += $o&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $results&lt;br&gt;
}
&lt;/span&gt; 
&lt;p&gt;
So. This is getting interesting. What the "Average-Images" function above does is
create a custom object with some useful properties: we've got the original filename,
we've got a still-breathing reference to the System.Drawing.Image object, and we're
storing the "average pixel's" red, green, blue values as individual properties. The
resulting objects look something like this:&lt;br&gt;
&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="217" alt="image" src="http://www.pseale.com/blog/content/binary/WindowsLiveWriter/ExploringSy.DrawingImawareitstheyear2008_14DCD/image_470a1daa-fef3-4fe0-8a71-589b53755152.png" width="604" border="0"&gt; 
&lt;/p&gt;
&lt;p&gt;
Maybe it's still not interesting for you. That's fine, 'cause this party's* just getting
started!&lt;br&gt;
&lt;strong&gt;&lt;font size="1"&gt;*despite what I've just written, this is &lt;em&gt;not&lt;/em&gt; a party&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
I have one more piece of "infrastructure" to explain, before we can get cooking: I've
created a PowerShell function called "Make-Html," which creates a permanent HTML file
listing all the images I want to see, in the order I want to see them. As an added
bonus, the function immediately launches the newly-created file in my browser. Here's
the code:
&lt;/p&gt;
&lt;span style="font-family: consolas, courier new"&gt; 
&lt;p&gt;
$startDir = "C:\a\ps1\scrape\"&lt;br&gt;
function Make-Html ($fullfilenames, $resultingFilename)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $files = $fullFilenames | % { $_.split("\")[-1] }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $tags = $files | % { "&amp;lt;div style=""float:left;""&amp;gt;&amp;lt;img
src=""$_""/&amp;gt;&amp;lt;/div&amp;gt;" }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $html = @"&lt;br&gt;
&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;$($resultingFilename)&amp;lt;/title&amp;gt;&lt;br&gt;
&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&lt;br&gt;
$($tags)&lt;br&gt;
&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;br&gt;
"@ 
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $html &amp;gt; "$($startDir)$($resultingFilename).html"&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ii "$($startDir)$($resultingFilename).html"&lt;br&gt;
} 
&lt;/span&gt; 
&lt;p&gt;
Ok, I know, we're &lt;em&gt;still not doing anything&lt;/em&gt;. 
&lt;h3&gt;Let's warm up
&lt;/h3&gt;
&lt;p&gt;
Okay, as I say to everyone, the real power of PowerShell is its object piping. PowerShell
pipes objects, not text; this is something best seen, not heard, and hopefully we'll
see a little something today. The objects we'll be slinging through the pipeline today
are, as mentioned above, custom objects that have a Filename, an Image, and the RGB
values representing the image's average (mean?) color. 
&lt;p&gt;
So, let's count how many items we have:&lt;br&gt;
&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="55" alt="image" src="http://www.pseale.com/blog/content/binary/WindowsLiveWriter/ExploringSy.DrawingImawareitstheyear2008_14DCD/image_07778ba5-0311-41d8-b1f1-ec64d808c753.png" width="409" border="0"&gt; 
&lt;p&gt;
Awesome. Let's count how many items we have that are more red than any other color:&lt;br&gt;
&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="94" alt="image" src="http://www.pseale.com/blog/content/binary/WindowsLiveWriter/ExploringSy.DrawingImawareitstheyear2008_14DCD/image_a236ead8-5035-4f2f-9465-762e901792dc.png" width="604" border="0"&gt; 
&lt;p&gt;
Hmm, that was unexpected, 359 red-dominant images out of 503, that's proportionally
huge. I'll point out that I did some extra fanciness to get this count to evaluate
on one line, but usually (i.e. when I'm &lt;em&gt;not &lt;/em&gt;posting to my blog) I'll work
my way in parts, not all at once. So the same thing, split out, would be:&lt;br&gt;
&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="92" alt="image" src="http://www.pseale.com/blog/content/binary/WindowsLiveWriter/ExploringSy.DrawingImawareitstheyear2008_14DCD/image_025856ce-dadf-4135-a9de-e438b4eb9ad0.png" width="604" border="0"&gt; 
&lt;/p&gt;
&lt;p&gt;
That's more realistic.
&lt;/p&gt;
&lt;p&gt;
Okay, one more thing before we go. Finding out most of my pictures are red-dominant
has me wondering: what about the other two? Let's work with the objects a little*
to massage the answer out of them:&lt;br&gt;
&lt;strong&gt;&lt;font size="1"&gt;*a lot; ugly function that pulls out the dominant color not
shown&lt;/font&gt;&lt;/strong&gt;
&lt;br&gt;
&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="174" alt="image" src="http://www.pseale.com/blog/content/binary/WindowsLiveWriter/ExploringSy.DrawingImawareitstheyear2008_14DCD/image_103f7c74-7207-4545-898f-826a227c9a46.png" width="604" border="0"&gt;&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Weird.
&lt;/p&gt;
&lt;h3&gt;Skipping ahead to the end
&lt;/h3&gt;
&lt;p&gt;
This is the pattern: we'll ask a burning question, we'll form this question as a PowerShell
pipeline, and we'll see the results.
&lt;/p&gt;
&lt;div style="border-top: 0.9em cyan solid; border-bottom: 0.9em cyan solid; border-left: 0.5em cyan solid; border-right: 0.5em cyan solid;"&gt;
&lt;div style="border-top: 0.9em yellow solid; border-bottom: 0.9em yellow solid; border-left: 0.5em yellow solid; border-right: 0.5em yellow solid;"&gt;
&lt;div style="border-top: 0.9em magenta solid; border-bottom: 0.9em magenta solid; border-left: 0.5em magenta solid; border-right: 0.5em magenta solid;"&gt;
&lt;p&gt;
&lt;strong&gt;Question:&lt;/strong&gt; can we see the images in order of "redness"?
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Pipeline:&lt;/strong&gt;
&lt;/p&gt;
&lt;span style="font-family: Consolas, Courier New;"&gt; 
&lt;p&gt;
$a | sort red | % { $_.filename } 
&lt;/span&gt;
&lt;p&gt;
&lt;strong&gt;Results:&lt;/strong&gt; 
&lt;p&gt;
Least red: 
&lt;p&gt;
&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="312" alt="20080707024010" src="http://www.pseale.com/blog/content/binary/WindowsLiveWriter/ExploringSy.DrawingImawareitstheyear2008_14DCD/20080707024010_9fa2055c-78fc-43d6-aebb-535c2772b79f.jpg" width="500" border="0"&gt;
&lt;br&gt;
&lt;img height="500" alt="200549766" src="http://www.pseale.com/blog/content/binary/WindowsLiveWriter/ExploringSy.DrawingImawareitstheyear2008_14DCD/200549766_b28277a4-fa1b-4ccf-9a82-8b684a6de16a.jpg" width="500" border="0"&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Most red: 
&lt;p&gt;
&lt;img height="400" alt="20080524165059" src="http://www.pseale.com/blog/content/binary/WindowsLiveWriter/ExploringSy.DrawingImawareitstheyear2008_14DCD/20080524165059_7afa097f-1901-4066-8f80-cac52a6ea052.jpg" width="400" border="0"&gt;
&lt;br&gt;
&lt;img height="500" alt="439193020" src="http://www.pseale.com/blog/content/binary/WindowsLiveWriter/ExploringSy.DrawingImawareitstheyear2008_14DCD/439193020_2e0e18ae-7539-4f2a-ab86-b7a8393a8510.jpg" width="500" border="0"&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;
&lt;p&gt;
Summary:
&lt;/strong&gt; okay, that makes sense. We used a naive algorithm that simply counted the
red value, meaning that a pure black image or a pure blue image would have the "least
redness" and a pure white image would have as much "redness" as a pure red image.
Hmm, we can fix this. Onwards!
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="border-top: 0.9em cyan solid; border-bottom: 0.9em cyan solid; border-left: 0.5em cyan solid; border-right: 0.5em cyan solid;"&gt;
&lt;div style="border-top: 0.9em yellow solid; border-bottom: 0.9em yellow solid; border-left: 0.5em yellow solid; border-right: 0.5em yellow solid;"&gt;
&lt;div style="border-top: 0.9em magenta solid; border-bottom: 0.9em magenta solid; border-left: 0.5em magenta solid; border-right: 0.5em magenta solid;"&gt;
&lt;p&gt;
&lt;strong&gt;Question:&lt;/strong&gt; Okay, so we're looking for redness. Let's call this proportional
redness. Hmm, here we go:
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Pipeline:&lt;/strong&gt;
&lt;/p&gt;
&lt;span style="font-family: Consolas, Courier New;"&gt; 
&lt;p&gt;
$relativelyRed = $a | select filename, @{Name="redness"; expression={$_.red / ($_.red+$_.green+$_.blue)
}}&lt;br&gt;
$relativelyRed | sort redness | % { $_.filename } 
&lt;/span&gt;
&lt;p&gt;
&lt;strong&gt;Results:&lt;/strong&gt; 
&lt;p&gt;
Least red: 
&lt;p&gt;
&lt;img height="333" alt="883437048" src="http://www.pseale.com/blog/content/binary/WindowsLiveWriter/ExploringSy.DrawingImawareitstheyear2008_14DCD/883437048_9f8c3367-c581-419b-93b9-8a7ae5acaf8b.jpg" width="500" border="0"&gt;
&lt;br&gt;
&lt;img height="710" alt="20080327175323" src="http://www.pseale.com/blog/content/binary/WindowsLiveWriter/ExploringSy.DrawingImawareitstheyear2008_14DCD/20080327175323_c21b8d97-818a-4860-adc3-8f9be14c3c52.jpg" width="500" border="0"&gt; 
&lt;p&gt;
Most red: 
&lt;p&gt;
&lt;img height="335" alt="899605173" src="http://www.pseale.com/blog/content/binary/WindowsLiveWriter/ExploringSy.DrawingImawareitstheyear2008_14DCD/899605173_1bcb114d-7d55-4d1a-902c-74d662a20790.jpg" width="500" border="0"&gt;
&lt;br&gt;
&lt;img height="231" alt="20080418093945" src="http://www.pseale.com/blog/content/binary/WindowsLiveWriter/ExploringSy.DrawingImawareitstheyear2008_14DCD/20080418093945_42fafafe-eff4-4af9-80fd-3f73e9f25337.jpg" width="490" border="0"&gt;
&lt;br&gt;
&lt;img height="449" alt="20080524164842" src="http://www.pseale.com/blog/content/binary/WindowsLiveWriter/ExploringSy.DrawingImawareitstheyear2008_14DCD/20080524164842_5c1c8b77-9e8e-40e7-b51c-f3dc84dae74c.jpg" width="447" border="0"&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;
&lt;p&gt;
Summary:
&lt;/strong&gt; now that's more like it. Our earlier naive results were &lt;em&gt;instructive&lt;/em&gt;,
but this is more what I was looking for.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="border-top: 0.9em cyan solid; border-bottom: 0.9em cyan solid; border-left: 0.5em cyan solid; border-right: 0.5em cyan solid;"&gt;
&lt;div style="border-top: 0.9em yellow solid; border-bottom: 0.9em yellow solid; border-left: 0.5em yellow solid; border-right: 0.5em yellow solid;"&gt;
&lt;div style="border-top: 0.9em magenta solid; border-bottom: 0.9em magenta solid; border-left: 0.5em magenta solid; border-right: 0.5em magenta solid;"&gt;
&lt;p&gt;
&lt;strong&gt;Question:&lt;/strong&gt; okay, so let's stop messing with redness. Instead, let's
find out what images have the most variance between the colors. We're less interested
in the white-gray-gray-gray-black spectrum, and are looking for more colorful images.
Let's do this:
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Pipeline:&lt;/strong&gt;
&lt;/p&gt;
&lt;span style="font-family: Consolas, Courier New;"&gt; 
&lt;p&gt;
$variance = $a | select filename, @{Name="Variance"; Expression={$avg = ($_.red+$_.green+$_.blue)/3;
$var = [math]::Abs($_.red-$avg) + [math]::abs($_.green-$avg)+ [math]::abs($_.blue-$avg);
$var} }&lt;br&gt;
make-html -fullfilenames ($variance | sort variance | % { $_.filename }) -resultingFilename
"variance" 
&lt;/span&gt;
&lt;p&gt;
&lt;strong&gt;Results:&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Most balanced:
&lt;/p&gt;
&lt;p&gt;
&lt;img height="500" alt="783914459" src="http://www.pseale.com/blog/content/binary/WindowsLiveWriter/ExploringSy.DrawingImawareitstheyear2008_14DCD/783914459_19b4a1fc-6d62-4f5f-b4e9-0ba9cf738dec.jpg" width="333" border="0"&gt;
&lt;br&gt;
&lt;img height="350" alt="281592264" src="http://www.pseale.com/blog/content/binary/WindowsLiveWriter/ExploringSy.DrawingImawareitstheyear2008_14DCD/281592264_f3363fc7-94a6-46c1-85e3-8622d151e119.jpg" width="348" border="0"&gt;
&lt;br&gt;
&lt;img height="400" alt="741444854" src="http://www.pseale.com/blog/content/binary/WindowsLiveWriter/ExploringSy.DrawingImawareitstheyear2008_14DCD/741444854_ae8c5cbe-6819-4d10-977e-88e9090e1eed.jpg" width="400" border="0"&gt; 
&lt;/p&gt;
&lt;p&gt;
Most variance:
&lt;/p&gt;
&lt;p&gt;
&lt;img height="345" alt="20080831161327" src="http://www.pseale.com/blog/content/binary/WindowsLiveWriter/ExploringSy.DrawingImawareitstheyear2008_14DCD/20080831161327_7f53084d-8bc0-41ed-8cba-86649bc20721.jpg" width="500" border="0"&gt;
&lt;br&gt;
&lt;img height="353" alt="20080701085401" src="http://www.pseale.com/blog/content/binary/WindowsLiveWriter/ExploringSy.DrawingImawareitstheyear2008_14DCD/20080701085401_aa897288-d7ec-45ad-b35a-3be365b1e37a.jpg" width="500" border="0"&gt;
&lt;br&gt;
&lt;img height="336" alt="787193910" src="http://www.pseale.com/blog/content/binary/WindowsLiveWriter/ExploringSy.DrawingImawareitstheyear2008_14DCD/787193910_7cb867e5-d11c-4988-a84f-45cce0b3addb.jpg" width="500" border="0"&gt;
&lt;br&gt;
&lt;img height="375" alt="307907780" src="http://www.pseale.com/blog/content/binary/WindowsLiveWriter/ExploringSy.DrawingImawareitstheyear2008_14DCD/307907780_7395845f-6c0f-492d-8542-b2f1c216eaf3.jpg" width="500" border="0"&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;
&lt;p&gt;
Summary:
&lt;/strong&gt; most interesting, besides a grouping of the "grayish" and "black and white"
images all together, is the smattering of images that have color, but are so perfectly
balanced they're nestled right in there with the pure black-and-white images. Neat.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;Final bits
&lt;/h3&gt;
&lt;p&gt;
This post is already too long. There's not too much else to say, besides a) &lt;strong&gt;stuff
is awesome&lt;/strong&gt;, and b) with the aid of either PowerShell functions or .NET library
calls, you can do some complex things. If you only remember one thing from this post,
try and pick up the impression I'm trying to leave. This is how I see PowerShell:
it's an experimental playground where I morph a thought, an idea, slowly into something
workable, and in each step along the way, I'm getting feedback and refining, and in
the end, I've satisfied my curiousity. Maybe it's something as useless as basic image
analysis using System.Drawing.
&lt;/p&gt;
&lt;p&gt;
Incidentally, if you want to see how the professionals do this kind of thing, check
out &lt;a href="http://labs.ideeinc.com/multicolr/"&gt;Multicolr&lt;/a&gt; - an color search engine
indexing 10 million Flickr pictures, which makes the stuff I did above kind of pitiful
looking :) When I checked last, the Multicolr site was slow, otherwise it's neat;
check it out.
&lt;/p&gt;</content>
  </entry>
</feed>
