Unable to connect to twitter. Either you've lost your connection or michael jackson just died again.

The Utterly Thorough Guide To Awesome Application Compatibility on Windows 7.

How does backward compatibility work in windows 7?

I'm glad you asked.

When an application starts up, the operating system checks if the app needs to run in a virtualised instance of windows XP. It behaves as if it is native on the desktop, but that's just an illusion.

If that checks passes, then the application is loaded in windows 7, but the compatibility layer is still ready to be invoked on each windows api call.

when a windows API request is made, a check is made to see if that particular instance of the app has any custom requirements.

If not, then the operating system itself might have some general overrides for that application, provided for backwards compatibility.

If all of that passes, then it's time to check the C-bit. If the C-bit is set, then Raymond Chen is invoked and he sorts it out.

In point of fact, it's a virtual raymond chen, but the MS guys are so freakin good at virtualization now that You Will Never Ever EVER Be Able To Detect The Difference. Even Mrs Chen is rarely sure.

And if all that fails they just swap in the real Ray Chen.

So take it from me, a world expert on the computing technologies, that this new version of the windows will be best one since vista.

Appload requires xp? yes swap to virtual XP no Load in windows 7 Api call Compatibility mode? yes swap in compatible response no Platform override for backward compatability? yes swap in platform response no Cbit is set? yes swap in Ray Chen no Pass call to Windows 7 kernel

Intellisense for Poets Work versus Leisure for Developers: Work = 8 hours on a computer. Leisure = 8 more hours on a computer. ;-) http://twitter.com/secretGeek/status/2403106952 How to be happy (as a programmer) I've been listening to some excellent TED talks lately and a number of them deal with the topic of happiness. Happiness is a wonderful thing, it seems, and so I'd like to try and translate some of their general ideas about happiness into the specific world of the programmer, and see where I end up. One particular talk I enjoyed is martin Seligman [1] talking about positive psychology. Martin focuses on three different types of happiness, that he refers to as the pleasant life, the engaging life, and the meaningful life. If programmers set their mind to optimising for these three things, I expect we can achieve pretty good results -- so let's dig in. The pleasant life -- a life of pleasure, if the easiest and least profound of the three. Pleasant experiences by themselves, it turns out, don't have a drastic effect on our overall happiness. But it's still a pretty big deal -- so we'll take a look. "What was the best experience you ever had?" build on strengths. Flow occurs in your life when your highest skills are matched to challenges that quite exactly meet them. (Martin Seligman) Finding temporary and specific causes for misfortune is the art of hope: Temporary causes limit helplessness in time, and specific causes limit helplessness to the original situation. (Martin Seligman) Why are programmers so damn powerful? "Finding temporary and specific causes for misfortune is the art of hope" "Finding temporary and specific causes for misfortune is the art of hope: Temporary causes limit helplessness in time, and specific causes limit helplessness to the original situation. (Martin Seligman) " http://quote.robertgenn.com/auth_search.php?authid=4211 We are the bringers of HOPE. Developers are below half way! happiness index http://www.time.com/time/2007/america_numbers/job.html happiness for devs. Work versus Leisure for Devs. Work = 8 hours on a computer. Leisure = 8 more hours on a computer. snooping the stack

Using Software to Rethink How Music Is Made

I can't stop thinking about this. In my mind, it sounds so beautiful!

In recent years multi-touch technology has reached the market, primarily in the iphone, but also in the MS surface, and perhaps in windows 7.

What I'm keen to see, is the effect multi-touch interfaces will have on musical instruments.

Consider the traditional piano keyboard: this is basically a design that is now hundreds of years old. (Imagine if a web-site design was not updated for hundreds of years, that's the piano keys).

The piano keyboard is customized to suit the key of "C major", to the detriment of every other scale. It has other weird effects. For example: Is it psychologically natural that the left hand is 'deeper' than the 'right' hand? Should every note included in a scale have the same attributes?

These kind of limitations are necessary in the physical world, in hardware, , such as the microsoft surface appliance, could potentially allow for a very creative musical keyboard experience.

The way I see it, the traditional keyboard is like a user interface that is now hundreds of years old. It's designed to make C major easy, to the detriment of every other scale. It has other weird effects. For example: Is it psychologically natural that the left hand is 'deeper' than the 'right' hand? Should every note included in a scale have the same attributes?

These kind of limitations are necessary in the physical world, in hardware,

Actual piano/keyboard players end up falling in love with the form of the keyboard and somehow grow to love the inconvenience itself, like a kind of Stockholm syndrome. Good for them, I suppose.

But in the world of software (and multi-touch screens, with poly-phonic output) can the design of the piano bifurcate into many competing designs?

For starters, the major tone might deserve a little more emphasis than the other keys. It could be larger, for instance, or emphasized through colour, weight or texture.

The harmonies that exist between the notes could be indicated, visually.

For example in the key of C, the G note could be highlighted to indicate its harmony with C. (The snobbish musical term of calling it (what?) the Vth note, is less intuitive than using a graphic display.


The weaker harmony between C and F (the IVth) could be indicated in a comparatively subtler way.

The keyboard could be redrawn to match the scale in which a piece is played.

Look at this ridiuclous 'desktop' projected keyboard:

it unnecessarily brings in the limitations of the physical keyboard, and adds to it the lack of tactile feedback that a touch screen provides.

The same can be said of this piano software on the microsft surface:

pick a key to jam in and then only the relevant notes for that key are available. the layout changes to suit the key. if you say C pentatonic major then it will be C pentatonic major. If you want a few minor accenting notes available, then they will be available -- and the size and shape of the keys will be appropriate to suit the part they'll take in such a tune. there's highlighting to indicate the harmonies between the notes. there's an emphasis on the "key" notes, either through colour, sizes, contrast, weighting of colour, primarity of colour there's two separate keyboards, one for each hand -- they may flow into each other like they do in a piano, but they probabyl would not you wouldn't have to do bass on the elft and alto on the right, for example -- both keyboards might have the same notes in a more space saving configuration so that you can do both bass and alto on both left and right... you can be more creative of course it's not a piano, it's a synthesizer. so you might use this interface to play drums or guitar or horns or anything and gestures are important -- so you could play a very natural termolo buy wiggling your fingers on a sustained key (just as you would on a guitar) and macros would be easy and natural -- you play a little run, and set it to loop while you move to playing another piece over it -- you could build up a rich and complete composition, live, diy touch sensitive side bar http://www2.hemsida.net/wizow/articles/solutions_id_like_to_see_on_ms_surface_multitouch.html circle of fifths music theory

chromatic scale

the major scale (seven tones – the white keys of a piano are the major scale for C)

you could say that a piano keyboard is configured to make “C major” easy, to the detriment of every other scale.

(of course, people who play piano for long enough tend to fall in love with the form of the keyboard and have little trouble playing other scales… they come to love the inconvenience itself, and draw some kind of inspiration from that too. I guess I’m saying it’s a kind of Stockholm syndrome. Good for them, I suppose. They generally defend it with an impenetrable wall of Snobishness)

But what if it could be reconfigured to suit other scales – not just other major scales (other 7 notes scales) – but any scale imaginable.

ii-V-I turnaround 50s progression Andalusian cadence Backdoor progression Borrowed progression Circle progression Coltrane changes Double tonic Eight-bar blues Harmonic cadence Omnibus progression Passamezzo moderno Ragtime progression Rhythm changes Sixteen-bar blues Stomp progression Twelve-bar blues

The layout of the keyboard could be rreconfigured to suit a given song.

An algorithm could analyse the notes in a given song and determine the most appropriate layout of the keyboard for that song.

Also – what if the principles of graphic design were applied to the keys themselves.

On a piano, all major keys are the same size and shape. But this isn’t really a fair representation of the major scale.

The major tone (C, in the key of C) might deserve a little more emphasis than the other keys. It could be larger, for instance, or emphasized through colour, weight or texture.

The harmonies that exist between the notes could also be indicated. The frequency of G is 2/3 of C, which means there is a very strong harmony between these notes. This could be indicated with analogous colours. There’s a slightly weaker harmony between C and F (F is ¾ of C) – this could be indicated in some other way.

Multi-touch means the surface could be used to make polyphonic keyboards.

The lack of tactile feedback is a real shame. The technology would remain ghetto.

Also – when the mechanical necessities of a keyboard are taken away – the keys no longer have to be in a straight line. Here’s a few possibilities.

Octaves could be placed above each other, rather than adjacent.

Or, notes could be arranged in a circle, rather than a line.

Or, perhaps most suitable – a spiral, with each turn of the circle representing another octave

I’d love to just watch the keys light up as different songs are played – so see the relationships we’re hearing, for different pieces of music.

Pictures – cooney’s keyboard.

The bass guitair, the dad guitar.

An article talking about reconfigurable touchscreen keyboards – but not musical… regular keyboards, y’know, letters and so forth http://inventit.blogspot.com/2005/06/invent-this-reconfigurable-touchscreen.html


using exceptions for control flow... evil! but if you must do it -- if you really must... then come to me and i'll teach you how. i feel kind of dirty. we discovered a part of our software where using exceptions just feels... right. we suspect we'll refactor it out... but maybe it wuill stay.

This Microsoft surface demo is nice – but combines the worst of both worlds!

Constrained shape of the physical world with the lack of tactile feedback of the virtual world.

One thing I hate about arguing with agile fanbois, is how they use 'waterfall' as this catch-all straw-man for anything they don't like. if you say "Maybe we need more help from the BA with this task" they say "That's Very Waterfall" as if to mean "Anything that resembles waterfall in any way what-so-ever is automatically the work of satan." It's like if I said "I'm thinking of buying socks" they would say "Hmmm, child molesterers wear socks, you know." So what! Goose-heads.

The Triple Question Mark! Syntactic Sugar in C#.

This is the safest, most concise way to try and cast a boxed object into an integer, while specifying a default if the cast is unsuccessful.

ageObject = ViewState["MyAge"];

//Okay -- we expect myAge is a boxed integer, but it may also be a null, and from a defensive point of view... it may be any kind of object!!

int age = ageObject as int? ?? 0;

that's right -- three question marks! A good one for impressing your friends.

=== Cubicle Day Dreaming

So I'm working on this book about how to build a Micro ISV.

And I'm day dreaming -- who should write the preface?

The most logical choice would be Eric Sink. I can only say good things about Eric and his writing style. But then I think... no, Joel Spolsky is more widely known. (Sorry Eric, you know it's true). Then I figure, well Bob Walsh deserves a shot at it. He's focused harder on this field than the others.

But now the day dream narcotics are kicking in... really the decision must be made whether to ask Steve Jobs, Steve Wozniak, or Bill Gates.

Maybe a kind of tag-team preface?

"With Prefaces by (in alphabetic order) Bill Gates Steve Jobs Eric Sink Joel Spolsky Linus Torvalds Bob Walsh and Steve Wozniak"

Yeh, I threw Linus in at the end. But wait a second... how about Stevey? Not to mention Jack Kerouac? And Richard Feynman? Granted, those last few are dead, I guess I could settle for Hawking. He's like the poor man's Einstein.

How about the cover design... once I would've demanded Storm Thurgenson from hipgnosis... but maybe iBoy who does all that isometric pixel art...

Or I could whip up something in MSPaint. Better yet -- get Rory to whip up something nice. ===

Y'know Carl mentioned my name during your interview... that was a very tingles-down-the-spine moment for me.

I was on the train listening to ipod but suddenly i was not just a random guy on a train. I was famous and important!

I tried to tell someone at work about this incredible moment of fame, but they tuned out before i could finish explaining what a podcast is... back to reality :-( ===

"You're a Woz, You need to find a Jobs"

Apparently this is ("You're a Woz, You need to find a Jobs") something Paul Graham told Damien Katz when Damien was pitching his CouchDB product to Paul's VC firm Y Combinator.

The sentiment roughly translates to: in order to create a successful technological company, a talented technical person needs to partner with a talented business/marketing person." and uses Mac founders Steve Wozniak and Steve Jobs as the archetypical example/metaphor.

I've heard this particular quote dispensed in other situations -- as a general panacea to any person whose technical strengths outweight their business skills. But I find the whole notion to be ridiculous.

In his book "MicroISV from Vision to Reality", Bob Walsh lists out 47 different "hats" that a software company owner needs to wear. Does this mean you need to find 47 different people to start a business? Obviously not. It means that you have no choice but to wear multiple "hats" when running a business.

Also -- I think that Jobs and Woz are an extreme case, and an 'outlying' data point that can be safely ignored. And although someone might be technically gifted it's unlikely that they're a Woz. And they'd have to be damn lucky to find a Steve Jobs just sitting around waiting a request to help.

In a small business, you can't expect to offload the "business" part of the business to someone else.

Having said that -- i do think that a partner is a very valuable thing. Not because of they can bring in complementary skills -- but because of the encouragement that you give each other, and the added motivation created when someone else is relying on you.

I think Atli and I work well together on TimeSnapper, but we definitely aren't a "Jobs" and a "Woz." In fact we have quite siilar skill sets. We're both technical, both commited to the business side -- probably more alike than different. (Though, Atli is more thorough than me, and I do more of the blogging thing, plus we live in different timezones, different cultures and opposite ends of the world)

The main thing that you need to offload isn't the 'business' thinking or the 'technical' thinking. It's the 'critical' thinking. There is far too much critical thinking involved in running a software business for one person to do it all alone. THere's even too much critical thinking for two people to manage it. You have to outsource the criticism to other people. That's why you have beta testing, why you ask the opinion of smart people, why you put up a forum, why you read every email you get.

Critical thinking -- really critical thinking. Thinking outside your own ego. That's tough! ===

We're just preparing the invoice now, but it will take a little longer than expected because we've hit the 63000 row limit in excel ==

Don't think of it as a car crash. Think of it as a concurrency violation. An exception arising from unexpected resource contention. Two cars were attemtping to take out exclusive locks on the same piece of road at the same time. The overly optimistic approach resulted in an overwrite.

== Free Graphing Solutions for .Net General Graphing: http://zedgraph.org/wiki/index.php?title=Main_Page 3D Pie Chart: http://www.codeproject.com/csharp/JulijanPieChart.asp?df=100&forumid=59147&select=1721819#xx1721819xx Graphs (as in nodes, connectors, etc, as opposed to charts) GraphVis ===

Hardware is fleeting, software is forever.

The title above represents a kind of Big Fat Irony of computer Science. (And it's a praphrasing of that lovely epithet: 'Beauty is fleeting; ugly is forever') You would think that hardware is more solid than software. software can be patched and replaced in the field. Software is as light as air. Software expects to be churned, monkey-ptached, donkey-punched, spit-roasted and abandoned. Hardware is old, fixed, unchaning -- or it is. Maybe the opposite is true. Whats' the oldest working part of your current computer? The oldest hardware on my oldest working machine is 3 years of age. The oldest software on my newest working computer is... 15 years of age? 20 years of age? In the operating system there would be parts that remain from the earliest drafts of the NT operating system. Parts of MS office would be considerably older. In sql server there would be parts inherited from sybase. The oldest thing of all is the ideas, the standards (both deliberate and accidental), the gabberflasted. z → œ

C#: Not Crap Enough

F# is a better C#, hands down.

IronPython, in a completely different way, overcomes many of C#'s limitations.

Between the two of them, they improve upon C#'s grammatic limitats in just above every way I can imagine.

(Don't get me started on tuples, for instance... when you've glimpsed a world with tuples, you find yourself wishing you had them, all the time)

(I'm not talking about platform limitations here, btw.)

But I don't think either of these languages will be mainstream in 2010, and probably not in 2011. The problem, as I see it, is that C# is just not crap enough.

When .net was first announced I think that most VB6 programmers (myself amongst them) knew that VB was so limiting that we needed what .net had to offer.

(True, there were crucial issues that weren't addressed for some people — i'm just going for majority opinion here, not absolute by any means)

So, from the moment I read about .net, i threw myself into reading about it, learning it, and preparing for it.

Despite my love for F#, and (on a very different track) IronPython, I can't throw myself toward them with the same gusto.

I see them as informative, incremental improvements, but essentially fringe. Dammit!. I don't think that F# (or IronPython) programmers will out-compete C# programmers in the marketplace any time soon.

C#'s disturbing lack of crapness, i think, goes back to the rigorous denial of features in the early versions. That early sparsity has allowed it to grow, later.

More specifically, it has managed to grow in steady, deliberate ways. New features, delivered over the last few years, have been just enough to give hope to C# programmers, in a way that VB never could. By giving us generics (for example), a series of functional programming features, along with the promise of more dynamic features to come, we C# programmers seem to lack the strong drive to adopt a new language that we felt when we (I) were (was a) VB6 programmers(s)

The problem, as I said in the title, is that C# is just not crap enough.
When I look at the advantages of using a functional

"Disclaimer: This is yet another of my trademarked "approximately correct" discussions"

Restaurant Kitchen as a programming metaphor.

Substitute the following:

Business Analyst: Waiter, when taking orders Developer: chef Software Delivery team: Waiter, taking food to table Tester: ?? (restaurant's don't seem to have tester's) Infrastructure team: Dishwasher. It is a truth, universally acknowledged, that a man in possession of an empty beer bottle, must be in want of a full beer bottle.

Astounding Hyperlinked Noticeboard

I see this sign on the noticeboard in the staff kitchen every day, and thought I ought to share the wry little WTF it invokes, every last time.

sorry i redacted it slightly; i think the guilty deserve some protection too)

I w

Helpful link ensures first aid info is there when you need it

to try and find the right words to break through the glazed eyes of the customer, while writing a spreadsheet for my wife she tells me, 'less yackety-yack, more clickety clack' #lastslavediedhow @Ergün: Thanks for translating! I've decided to make some changes to the article. It's very easy to misread 'Programs don't need to see an example' as 'Programmers don't need to see an example' — so i'll substitute the word 'Compilers' instead. I'm changing the title, adding the word 'Sometimes' at the start, so that people who don't have time to read the whole thing are less likely to take a black and white interpretation. It's pretty much all shades of grey. And i'll attribute the first paragraph in the way I originally intended. Maybe when people see that i'm quoting a tweet they'll realise i'm not trying to represent this stuff as serious academic work, but just some random ideas. Also, I intend to have Greedo shoot first, several additional tie fighters, and a bigger, busier Mos Eisley. ;-) About learning from criticism... Criticism is valuable stuff from which we can learn a lot. i love fixing bugs, improving my work or the work of other people. But when it comes to writing, it's very hard to find criticism that is of value. in practice, the sort of criticism that you find in comments at blogs and comments at reddit/hacker news etc is rarely of value. But most so-called critcism does not represent any kind of useful critique of your work. Usually it arises as part of the noisy chatter of misinterpretations from passersby who haven't really engage their brain at all—they've either completely failed to read the article, or taken exception to some very weird and unpredictable angle in the work, that could never have occurred to me. Ah there are definitely some great pieces of feedback at times. SOme of my favourite criticisms...

Really deep linking: Url + regex

Here's today's idea — and it's not a new idea by any means, it has occurred to many people at many times, I've just never seen it written down.

Just say you want to bookmark a particular paragraph on a particular web document.

Perhaps you want to perform the electronic equivalent of using a highlighter pen to point out a particular fragment of a document in its original context.

You can give the uri of the page, but you can't give a specific link to the actual paragraph you are interested in.

True, if the author of the document provided a named anchor tag for the paragraph then you're in luck, but only semantic web fanboys and egomaniacs go to this kind of extreme.

What if, instead, you could provide a little extra bit of regex-goodness in the url, that acted as an instruction to the browser, to open the page and then go to the first match with the given regex. Or the second match. URI + Regex.

The thing I can't work out — what's a good way to format the new url's?

A first (faulty) guess would be something like this:

'http://secretGeek.net/regexUri.asp#/A first (faulty) guess/' (which would highlight the paragraph above).

Software is better than you.

The following saying has attracted my ire today:

"Software is only as smart as the people who write it."

It sounds very wise and damning on the surface. But, luckily, it's untrue. Further more, I need to ask you to slap anyone who says it. One quick slap across the cheek should do it.

Follow up with this snarky little retort:

"Oh yes, and buildings are only as strong as the people who build them."

platform, framework, component and tool.
platform, framework, component and tool.

Flow is good, turbulence is bad
Flow is good, turbulence is bad.

benjamin zander said something like:

"the conductor of an orchestra doesn't make a sound. Not a sound.

the conductor's picture appears on the cover of the CD — but they don't make a sound."

ah it's true.

so what do you do... fallacy 1.

spend all your effort getting a great orchestra and don't even bother getting a good conductor. Have the janitor stand in as the conductor.

fallacy 2.

Get the best looking conductor you can.

and what i'm talking about of course is the people on a project who don't write any code — they don't write a line of code and hence you could argue that they ship nothing.

The managers, the architects, the team leaders, the testers, the business analysts, the customer representatives, the customers themselves. None of these people contribute a single tangible thing to the shipping product, the final outcome... So a naive interpretation (a straw man i'm putting up for the sake of this discussion) — an idiot might say that it doesn't matter who you've got performing tests, they don't contribute a thing, the architect doesn't matter — you're not shipping architecture, you're shipping code, the team leader is irrelevant, the business analyst might as well be picked at random from a ward full of sick and unemployed people, a floor mop with a tie could be your project manager

i received an email the other day from an old friend who complained that he's stopped writing code and become a bad team leader. Officially he still writes code, but in practice he never gets the chance to check anything in because he's so busy performing team leading duties.

i asked him why de doesn't go back to just programming then, if he's so bad at it, leave the team leading to someone else. And he admitted that as bad as he is, he know he's capable of improvement whereas should someone else be appointed as team leader they'd not only be worse, they'd think they're excellent at it.

they'd think they're spock when in fact they're homer.

i suspect he's a pretty good team leader -- far from perfect, but certainly on the right track. but i think that what's happening -- and of course this is just a wild guess, is that either the team leader himself, or the team members, are failing to appreciate

The Quag of History, of Culture and of Art


The right amount of choice

First -- take a listen to the following two TED talks (they're only a couple of minutes long, I promise i'll still be here when you return).

Thank you. 27 minutes, well spent. Now the striking thing about listening to those two talks together is that they could be construed as mortal enemies.

Gladwell talks about the revolutionary invention of Chunky-Style Spaghetti Sauce -- and from there the blossoming of 37 varieties of ragu in every store -- he tells us this is a source of immense human happiness.

Schwartz tells us that the explosion in choice makes us unhappy.

At first, these viewpoints seem to dismiss each other -- perhaps one must die so the other can live. But maybe the right answer as always is in the middle. We need to give the right options, the right amount of options.

Somewhere between no-choice and too-much-choice there might be a happy sweet spot.

tells us he just wants the sort of jeans they used to make when they only made one type of jeans. He when it comes to tech -- simplicity sells.

Embedding SQL in Html... like introducing Mothra to Godzilla... Complete opposites: "What we can learn from spaghetti sauce." versus "The paradox of choice" http://www.multicians.org/thvv/threeq.html

Ah, 'spreadsheets over email' -- the heart of a well-managed software it's the future of application building.

while loading the screencast for wolfram alpha (an amazing NLP tool for tampering with rich mathematical worlds...) -- i was shattered to see the % loaded... wolfram_clearly_these_guys_know_nothin_bout_math_.png written off! http://www.wolframalpha.com/screencast/introducingwolframalpha.html

Richard Campbell: There was a time when Stephen Forte and I were doing evaluations. We talked about a guy who -- we described him as the cow who gave twice as much milk and kicked over one of the cans so in the end we have the same amount of milk as any other cow but also a big mess on the floor.

from: Dot Net Rocks, Show#438, 'Pat Hynds on why projects fail', (specifically, pg 17 of the Transcript)

gmail_iphone gmail_iphone2 Sent from my iPhone when writing comments a lot of people say it's important to focus on the why, not the how. e.g instead of "Deletes a file by calling a wrapper to the win32 api for, you guessed it chuck, deleting a damn file." you could say the why: //Covering my tracks File.Delete(logFile); But I see much value beyond plain old how or how. Me? i like to focus on the who, and the when, and sometimes, the "what else". for example: "This method takes a variable -- well that's what my //cat// thinks on a Tuesday. What else? Me like cake." It's true this kind of comment rarely survives a code review, and that not all sysadmins appreciate it when such a message bounces around the screen, in a stunningly rendered 3d dimensionsal display while the hard drives grind to a halt during the business hour of shopping all year on your customer's server farm, but it lightens the mood, if but for one moment. Though a massive fan, i would love to refer to Ray Chen as: "Raymond Chen, -- a microsoft apologist --"... just to *stir* ;-) Why software is just so damn crap. you may have been wondering why all the softwar eyou use it crpa or worse - why the projects you work on are crap, or even mroe inciteful, why the software you inherit is always so dodgy. you might think that the tooling is inadequate the customer has never really explained their problem or the entire field is immature or there aren't enough qualifications and certifications to allow software to only be written by the right people. ha! on friday at work, things came to a head. i said 'this is such an important issue, i'll simply quit if it isn't addressed.' i felt quite foolish/childish for leaping to that call. it was an important issue by work standards, but i don't know that my wife would've appreciated me turning up home early, unemployed. ;-) in the end, i'm glad i did it. After five months of spinning our wheels under a heavy load of management imcompetence, i think the devs do need to take a stand and get the project back on track.
Do you live in planet perfect where everything works perfectly? Good for you! Maybe you do, but i don't. I was reading a comment at reddit, and it reminded me that there's no correlation between intelligence and insight.

The person who wrote the comment was probably intelligent, but i think they lacked insight into the situation. I had a situation where the developer was doing things completely wrong and creating bugs that could be easily avoided. I pointed this out to him and he didn't get it and didn't care either and just kept doing it his way. He was the type that would completely break anything he touched. After confronting him on enough issues, it created tension between us and we didn't talk much, and I just gave up on chasing down his mistakes (unless it was a project I had to work on). I occasionally had to fix bugs in his code while he was on vacation (because his stuff constantly had bugs in production), in which case I go through and fix all the bugs of the same type and send him a nice e-mail explaining what I did and the same thing over again I tried to explain. Didn't help, the moron kept doing the same thing. The sad thing is he was actually a really nice guy (at least acted like one), just really lazy and incompetent. In retrospect, I would have talked to my boss about this after confronting him failed. After he left, it turns out that my boss was not too happy with the work he did either. And now I've inherited all his bug-riddled, untested work that doesn't even fulfill the requirements most of the time. On the plus side, I now work with an excellent group of people with no bad apples, and I'm now in a position where I have a say in hiring and firing. Now this depends on what kind of environment you work in, what the average competence is, and what your position / status is in that environment. If you work in a small team where its important that everyone be on top of their game, one bad apple can make things really bad, for you, and for future of the company/team. In this type of environment, confront the developer first, then go to your boss if that doesn't work. Yes, there may be drama, but there will be less drama when the bad apples are gone and you work with an excellent team.

Hi [firstname,fallback=there]!

You once showed an interest in our automatic screenshot journal
program, TimeSnapper Classic, so we thought we might send you some
information about our Professional version. 

We hope you are still finding good use for the program.  The
professional version has a lot more features that make
TimeSnapper an even better product.

You can: 
 - automatically measure your productivity
 - encrypt your screenshots with a password so no one can see 
 - create a movie based on the screenshots using our new "Export 
   to movie" plugin (yeah, we now support plugins)
 - recover text from screenshots, helpful when any application crashes 

It's better looking than ever, has great reports about how you 
spend your time. 

Make better use of your time

Track how much time you spend on each program or website

Become more productive

(If you prefer not to receive emails from us, we apologise, please 
unsubscribe: [unsubscribe] ) 

Hello there.

I hope you are well.

You downloaded TimeSnapper classic and I'd like to see how you're going. Have you experienced any problems, or had any successes with TimeSnapper?

TimeSnapper Professional is on special for the next four days, reduced from $39.95 to $24.95. If you want to take advantage of the offer purchase it soon.

TimeSnapper Professional (download here) has many features that are absent from the free edition, including:

A full feature comparison is online.

I find it a useful tool and hope you do to.

Thanks for your time.

Kind regards

Leon Bambrick
(on behalf of TimeSnapper.com)

p.s. here's some pictures of TimeSnapper Professional in action:

Timesnapper provides productivity reports.

Many people have used the score card to train themselves to become more focused.

You can view various reports and statistics, including this one that describes how you spend your time.

This email was sent to [email address suppressed]. You can instantly unsubscribe from these emails by clicking here.

Hello there 

I hope you are well.

You downloaded TimeSnapper classic from http://www.TimeSnapper.com
and I'd like to see how you're going. Have you experienced any 
problems, or had any successes with TimeSnapper?

TimeSnapper Professional is on special for the next four days, 
reduced from $39.95 to $24.95. If you want to take advantage of 
the offer purchase it soon.

TimeSnapper Professional can be downloaded from:

It has many features that are absent from the free edition, 

* Filter which application to record (or not to record)

* Extract text directly out of the images you record

* Use TimeSnapper to assess your productivity

* View reports and statistics to better understand how your time 
is spent (screenshot below)

* Write notes and activities along with your screenshots

* Integrate TimeSnapper into your timesheeting system

A full feature comparison is online here:

I find it a useful tool and hope you do to.

Thanks for your time.

Kind regards

Leon Bambrick
(on behalf of TimeSnapper.com)

This email was sent to [email address suppressed].
You can instantly unsubscribe from these emails by clicking the link below:
== late to the game, as always i found that Jeff Atwood linked to me a few days ago. He wrote an article about copy/paste coding and he came up with a very simple and therefore very clever proposal around copy paste of code from the internet. when copying and pasting


The only But, because you've been so slow to help, it's not quite finished yet.

Meanwhile, what I want to say is:

my stupid head is exploding with crazy ideas for an infinite number of software projects, none of which I have time for. I just have to implement these story cards. I have to plod along on these dreary work orders.

There's a new project that I need your help with.

The menu items have the same flexibility -- or they will once the project is a little more advanced ;-).

And unlike stalwarts like notepad, vi or emacs, it doesn't... deliberately suck. What if instead of primary keys and foreign keys, we use urls.

It's an evolving eco-system that employs competition and co-operation to grow an increasingly powerful editing experience. Tailored to all of your editing needs -- not just one language or another. Every case where you edit text. From todo lists to C# apps, to blog entries, to sql queries, to bash scripts to wikipedia articles. Okay, maybe not bash scripts ;-)

To look at, it's a very simple tabbed editor. In the screenshots I've given it two toolbar buttons titled 'Lower' and 'Upper'.

Click the toolbar button named 'lower' and the text becomes lower-cased. Click 'Upper' and the text becomes upper cased.

But right-click on the toolbar button, you can edit the button's code -- or add a new button.

The code behind the button is an IronPython macro. Very easy to read, it has access to the current textbox through a variable called txt.

swayback posture, feet pronated w flattened arches, knees: hyper extended and locked, abdominals: no tone, thoracic spine: increased cyphosis, with thoracic spine shifted backwards so it sits behind the line of the ankle. head: forward position posture: swayback; feet: pronated, arches flat; knees: hyper extended, locked; abdominals: no tone. My wife says sweetest things about me!

http://twitter.com/secretGeek index.asp rss.xml1 sophilos.asp

The Art of Skunk Works

  1. Individuals working on it must be so personally interested in the project that they'll continue thinking/working on it outside all reasonable limits. E.g. dream about it, get out of the shower to draw a diagram for it, let coffee go cold while working on it. You can't mandate this -- it's either there or it's not.
  2. May not be feasible and may be adandoned before any serious time or effort is spent.
  3. May end up having a use completely different to the original vision.
  4. May have a groovy CodeName. e.g. Zaptron Fleshfighter. May even have a boring codeName.

Here's a subset of the rules from the original SkunkWorks (at Lockheed), quoted by ASTech engineering and which fit within the sort of Skunk Works I'm thinking about:

  1. The number of people having any connection with the project must be restricted in an almost vicious manner
  2. A very simple drawing and drawing release system with great flexibility for making changes must be provided
  3. minimum number of reports
  4. There must be mutual trust between the [project sponsor] and the [developer]
  5. Access by outsiders to the project and its personnel must be strictly controlled

Rephrasing those for my own purposes I get:

  1. Probably developed in secret

    this means that if it turns out to be a waste of time, there's no loss of face. Also, during the early stages any criticism from other people could dampen the wild enthusiasm that the creator has for it. It continues to be secret until the developer's enthusiasm is more inline with the actual product (either by creating an astonishing product, or cooling their own enthusiasm, or a combination of both)

  2. The smallest possible team working on it

    This causes less overhead of communication (the n squared problem), and means that if abandoned, there is less expense to cover. Also makes it easier to have a high level of enthusiasm.

  3. Participation is on a true volunteer basis.

    See this forum topic for an example of non-volunteer inclusion in skunk works.

There is a tonne of info that can't be reached Skunkworks. http://www.reddit.com/r/programming/ http://www.ted.com/index.php/talks/tim_berners_lee_on_the_next_web.html
There are competing needs in any system. And sometimes you can't satisfy all needs at once -- something has to give. So, for example, the 'events' that we raise are not real events. They are simply method calls, you'll see. And it get worse. The plugin author has to write a big switch statement. I hate that. I shudder at the thought of it -- but really, it's quite bearable. I'm over-reacting. Maybe it won't actually result in the death of any plugin authors. I hope.

Worse still, the plugin author has to perform some casting. Horrible stuff. But it works, and sometimes it's better to ship and get feedback than to toil away in the dark.

If you're interested in extending TimeSnapper, please take a look. Any questions, feedback, speak up!

The release notes have details on all the changes, So, yeh, the API is not ideal, and there's more capabilities that can be added in subsequent releases (we've had plenty of requests). But for now, I'd like to get every piece of feedback I can, and work out where the effort should be applied.

Some ideas for TimeSnapper plugins include...

It works nicely, though I have to say it's not the fastest or most efficient way of creating an animated gif. This release was held up by the way that we spent a lot of time tinkering with a categorization feature that we subsequently shelved. It was a brilliant feature, but not quite polished enough -- and not quite able to be polished, as we saw it. The feature in question was 'Bayesian Categorisation' of your time. Regarding the plugin api... I've never released it before, because I'm not all that proud of the mechanism itself. I am so fucking critical of this stuff. I need to go and rethink my attitude. I need to whistle while I work? Perhaps I do. Sometimes we write stuff that is less than ideal. So -- here's how it works... at startup time, TimeSNapper looks in a certain folder for any dll whose name ends in "plugin.dll". Then it looks inside each of those dlls, seeing if they contain any implementations of the ITimeSnapperPlugin interface. When it finds an ITimeSnapperPlugin, it instansiates the plugin, and adds it to a list of plugin objects. Having done that it calls a method on the object, to ask it "Hey, baby plugin that I just found... what events do you want to subscribe to?" Two of the qesutions that have come my way are:

I have to ask 'Why aren't events events?'


Using MEF for plugins?

Things we deliberately don't do.... Load the plugins from a non-admin folder. If you're plonking code into TimeSnapper we want you to be a bit of an admin. Flip in some kind of panel for settings. Give you some kind of store where you can load/save your own configuration settings. Handle that for yourself! Just emailing you that I love your software. Clean, easy to understand, excellent at customization, positive take on self tracking. And the time cloud showing where I am spending time is a mind opener. All round perfect. Love it, love it, love it! Thanks, Paul Rak VeriForm Inc. reporter: So what do you think, will the market go up or down? economist: it's really not something I can say. reporter: I need a simple answer, up or down? economist: I'm sorry sir, but economics 101 teaches you that you never really know which way the market will go. It's really the most basic fact of economics. reporter: ah, that's cute. But I need something I can print. Up or down? economist: Are you listening to me? No one knows which way the market will go. It is Fundamentally Unknowable. Anyone who says they know is either lying or trying to sell you something. reporter: Up or down! Up or down! It's a simple question! I need a story economist: The question is simple, yes. But to give an answer i would not only need to have complete knowledge of every company, including all interdependencies, but also, to understand the level to which all other people understand the current state of all things, and how they will interpret that knowledge, and what effect that knowledge will have on all other knowledge and interpretation, plus a whole raft of other completely unknowable things, such as knowledge that is currently hidden from the market, or unknowable events like hurricanes, oil spills, wars, assassinations -- it's completely and utterly unpredictable and I'd be a fool to try and pretend otherwise. reporter: up or down. Up. Or. Down. any economist will tell you that there is no simple answer. downloads\eggs.jpg http://secretGeek.net/image/IronPythonInstaller_HasNgenOptional.png" "metaNoteSample2.png" "metaNoteSample1_CalcPy.png" build my own text editor for writing articles. what would it have.... keystrokes... macros... hold down a key and you can see the keystrokes for things... hold down alt and the cheat keys are shown. turn plain text into html... see the html previewed as i type (without blocking the writing) ftp integration... auto-save. insert snippets. really light in memory. installs from a usb stick.

Using the 5 whys to document a problem.

You remember that "Five whys" article from Joel Spolsky, long ago?

(You remember Joel Spolsky dont'ya? He's that guy that totally picked a fight with Uncle Bob the other day. ;-) )

A couple of weeks ago I had a horrible struggle, to overcame a nasty computer problem. This was a particularly gruesome issue for me, as it took me to the brink of reinstalling the operating system.

To make things worse, I had Jeff Atwood sniping at me about it over twitter and at stack overflow.

(You remember Jeff Atwood, don't ya? He's that other guy who totally like stuck the knife into good old uncle bob, by comparing him to a Ferengi? ;-) ) jeff says i'm tilting at windmills

Annnyway, problem's solved now, so i need to document the steps. And to make a very boring topic as interesting as possible, i thought i'd use the 5 whys technique to explain a process for getting around this kind of issue.

Turns out there were more than 5 whys needed to get to the bottom of the problem. And many of them weren't "Whys" but "Whats" and not so much Whats as "WTF"

So here's the 57 WTFs of my experience installing Asp.net MVC Release Candidate 1. To turn this from monologue into dialogue, i'll invoke the help of my artificial intelligence console app, Lucy, who will be asking 'Why'. Over and over..

Lucy: Describe your problem, please.

I can't install MVC RC1

Lucy: 1. Why?

Because when I install it, it gets near the end and then rolls back.

Lucy: 2. Why?

Well, I don't know. It doesn't say. It just fails.

Lucy: 2. Why?

Because software sucks. It's terrible stuff, not written for humans. And installers are horribly neglected things. Fault management is really important, but it's always lacking.

Lucy: 2. Why?

I don't know Lucy, really I don't. I think we try to focus on the customer, but end up focusing on the fun parts instead. Installation and fault management might be relevant to the end user, but they're just not fun.

Lucy: 2. Why?

I don't know Lucy, I'm just gonna focus on getting MVC installed for now. I've found a way to run it again, this time with logging.

msiexec /i "AspNetMVCRC-setup.msi" /q /l*v mvc10.log

Now I can see that I get a message of "failed to allocate output string" followed by this message:

failed to execute Ngen command:

C:\Windows\Microsoft.NET\Framework\v2.0.50727\ngen.exe install "System.Web.Mvc, Version=, Culture=neutral, PublicKeyToken=31BF3856AD364E35"

So it seems that Ngen fails.

Lucy: 3. Why?

Well, I'm not sure. It's either because there's something wrong with the way System.Web.Mvc.dll uses Ngen in general, or something wrong with Ngen on my machine.

I re-downloaded the installer and tried again, the result was the same. From looking around the internet, it seems that most people are able to succesfully install RC1, so I figure the problem must be with ngen on my machine.

To learn more about ngen I type:

ngen /?

And i learned that there's a diagnostic command like this:

ngen display

It's supposed to display the ngen state, but all it says is:

NGEN Roots:

Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED))

Lucy: 4. Why?

I don't friggin know.

So I wrote to stackoverflow and I wrote to the asp.net forum.

Thanks to the asp.net forum, I got some nice help from microsoft's Jacques Eloff, who forwarded my problem to the CLR team, and told me that ngen produces two log files:


I invesigated those and it seems that ngen went crazy back on 13th January when I used the sql server upgrade adviser. (I don't even know why i was doing this... a weak moment?)

I've since uninstalled everything SQL related, to get rid of a slew of bugs... but lots of sql stuff still lingers. Nothing left in the programs and features area.

Lucy: 5. Why?

Well I guess I haven't improved the underlying problem.

Lucy: 6. WTF?

Fix the "problem"

I think the problems stem from SQL Server 2008 (i'll explain my logic further down).

Lucy: 7. WTF?

> try a repair install of .NET 2.0 I'm not sure how to "repair install .NET 2.0" because this is a vista machine, so .net 2.0 isn't listed under "programs and features" and thus can't be repaired/installed in the usual way. Aaron Stebner's blog seems to be the ultimate guide to overcoming these kind of problems. I've followed his advice there, particularly at this post: (How to repair the .net framework 2.0 and 3.0 on windows Vista) http://blogs.msdn.com/astebner/archive/2007/03/26/how-to-repair-the-net-framework-2-0-and-3-0-on-windows-vista.aspx but it hasn't, yet, led to any improvement in my situation.

result from sysinternals
From the ngen logs Total cost was about five hours, in half hour chunks here and there. I am troubled by a symptom...

Getting things done? It's the cortisol, stupid!

cortisol levels

Ever noticed you get more work done before 11:00 in the morning than you do in the rest of day?

And have you noticed that everyone wants to schedule meetings right at the start of the day, destroying your most productive time?

Why? Why!? Some vague quirk of human nature, right?

No! It's cortisol! Cor-ti-sol! Got it?

If all goes well, then cortisol rises before we wake and then, sadly, it diminishes throughout the day.

Alarm clocks aside, it's cortisol that makes us rise in the morning and it's cortisol that sends us to sleep at night.

If we're deprived of human contact then the daily cortisol rhythm is disturbed: It flattens right down, so that there's no longer a morning peak -- and very soon our sleep suffers and our behaviour loses all focus and meaning. We drift into a wild, meaningless existence -- we procrastinate endlessly.

Human contact after waking is one key to keeping our cortisol in tact -- and it's the very underpinning of our productivity.

It's a Catch-22

Seth Roberts, science in action Dr John Marsden documentary on heartbreak http://www.abc.net.au/tv/guide/netw/200812/programs/ZY8477A002D4122008T203000.htm BBC - Exposed (2005) Information What makes us do the things we do? This snappy new series reveals the secrets behind our behaviour. It´s perplexed philosophers and scientists for centuries, but *Exposed* hopes to unravel what it means to be human. Presented by Dr John Marsden, one of the most down to earth psychologists you will ever meet, the four programmes tackle the biological and psychological background to the way we think, feel and behave. Exposed presenter John Marsden If we know more about how and why we behave in the way we do, perhaps we may even be able to live happier, more fulfilled lives. The series is packed with impressive snippets of must-tell-your-friends information, and includes amazing insights into what makes us tick. Each programme looks at how we survive with certain kinds of people, situations and environments: Liars , Heartbreak , Persuaders , and City Life zeitgebar -- something that triggers your daily cycles. Part 2: Heartbreak We´ve all been there. It can cut like a knife, tear our lives apart, even make us kill? In this episode, *Exposed* investigates the devastating effect that social and romantic rejection can have on our brains, our bodies and our behaviour. Using the latest neuro-imaging technology, we explore the links between social rejection and physical pain. Why does rejection lead to crimes of passion and revenge? How do early childhood experiences of rejection affect our ability to form secure relationships as adults? And do men and women respond differently to a broken heart? Lovesick James is struggling to come to terms with the end of a ten year relationship. We often use the same words to describe heartbreak as we do for physical pain. Step forward Dr Marsden, as he undergoes torture to find out just how similar physical and emotional pain really are. After a couple of bad break ups, singleton Claire has given up on relationships altogether. But do we really need other people anyway? We conduct a unique experiment in human isolation with surprising results...

If we're sleep-disturbed or deprived of human contact then cortisol gets away from this rhythm. First, the rhythm stretches out -- and then it flattens right down, so that there's no longer.

i've never had the patience to read books like 'getting things done', or to stick to reading sites like 43 folders, but i do think that a big part of actually getting things done is giving absolute respect to the daily hormonal rhythms of the human mammal. (we are apes and shouldn't pretend otherwise)

There's a strong need for human interactions during that early morning, post-waking period. that's why we schedule meetings -- and that's why, without face-to-face contact we quickly lose that peak in our daily rhythm.

So what i'd recommend (based on a wild theories) is a short, intense burst of face to face contact each morning -- a short meeting on steroids, that gives us the boost we need to synchronise our cortisol peak -- but short enough that the resulting productivity peak is not squandered on useless meetings.

Funnily enough, this is exactly what a 'stand up' meeting ultimately delivers. (Notice that no one advocates having a 'stand up' meeting at the end of each day...)

Here's how i'd make standups more focused and geared toward the required parameters for maximum cortisol punctuation.

  1. they are timed, to be extra brief
  2. they are set to lively music. i'm thinking fast techno, but some crazy acid jazz, or even hillbilly skiffle would suffice. fast, furious, hilarious music -- the sort of thing that a buster keaton film would enjoy
  3. they are in an a tight environment where people can talk loud and fast and freely. Not some tight lipped boring meeting. Boredom is banned for those few crucial minutes at the start of each day.
Banishing the 'Lonely Freelancer' Syndrome cortisol (wikipedia) smart drugs

The one where I promise that: "I'm gonna write a blog engine in MVC in 5 minutes or Phil Haack gets fired"

First I download the release candidate of Asp.net MVC from here. (ScottGu explains what's so damn nice about it, if you need encouragement.

I click install... oops! looks like i have to uninstall the old veriprevious (Beta) version of asp.net MVC first. I'm not counting that as part of the 5 mins. Just to be fair.

Now I install the release candidate... oops! i don't know what happened, but apparently i have to restart before i can install it.

i'm pretty sure this is to do with the previous version i uninstalled. only a tiny percent of users will have that experience, i hope. I'm not counting this as part of the 5 mins. Just to be fair. We don't phil fired over nothing.

Nope -- it still failed!

Bugger this. Now I have to read the release notes. Microsoft ASP.NET MVC RC Setup Wizard ended prematurely because of an error. --> then in Vis' Studio -- if i try to create an MVC project i get: "This template attempted to load an untrusted component. 'Microsoft.VisualStudio.Web.Extensions, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35'. It gets up to 'configuring templates' then goes to 'removing backup files' for a moment and starts 'rolling back' in the event log i see "Installation success or error status: 1603" prettify prettify

Q:What google for 'too many meetings' -- found 8,170,000 articles on the topic. google for 'not enough meetings' and 'too few meetings' -- only found 2 articles that were about that topic... the other x mill articles were actually about the initial topic: too many meetings.

What software helps you kick ass?

I was listening to a podcast featuring Kathy Sierra and it reminded of the importance of really empowering the people at the other end of your software.

Software that gives you the "I-Rule" experience.

* Don't use noughts and crosses to teach this lesson, because in noughts and cross the only winning move is to go first, and put your piece in the corner. The self-aware software will quickly determine this to be the case, then get on with killing your species.

Proof that Google is an evil, self-aware robot that lies to us. Google Search for evil robot: returns 1,550,000 results. Google Search for good robot: returns 46,700,000 results. Some thoughts on the comming

In the article, Some thoughts on the coming Robot Apocalypse expert robotics engineer, Jonathan Shikes, suggests we all need "a mountain compound, fortified against robot attack, staffed by your own army of monkey assassins, and well-supplied with food and water and guns and ammunition and suicide pills"

Alt.Netters are Frickin Insane

...probably in a good way, though.

So, get this.

Some people at Microsoft put out something called Oxite, which is an example of using Asp.net MVC to create a blog engine.

Somewhere, someone from microsoft stupidly calls it a 'best practice' example.

Deep in the heart of alt.net, tempers flare and heads explode.

(Hint: using the term 'best practice' in front of an alt.net person is like wearing your meat-costume during a stroll through the raptor's cage).

So the alt-netters attack, with angry blog articles. Commenters put out questions such as "well if you're so smart, why don't you show us what a best practice blog engine would look like?"

Here's where it gets crazy.

You see there's no such thing as 'best practice'. There's certainly 'better' practices -- and there's most definitely worse practices, but there's no best or worst practices.

"Only a sith lord deals in absolutes.

So they start to write Alt.Oxite.

I think this is a good thing to do, and a pattern that I want to see more of. Alt.net people putting out real code, as a way to demonstrate there thoughts -- and in particular the pattern of getting a microsoft sample, let's call it "X", and then creating an "Alt.X" version.

Okay, now they soon decide that Alt.Oxite can't really be built on top of Asp.net MVC -- because Asp.net MVC is not a 'best-practice' MVC implementation. So some of these kids run off and start building their own MVC implementation.

Again I think this is a noble and beneficial thing to do. I also think it's fricking insane, though in a good way. It's like this: I'm happy (and lucky) to learn from them, I'm just glad not to actually be one of them.

So they're now writing Alt.Oxite and FUBU MVC. (Note -- they don't claim that FUBU MVC is itself best practice. They're explicitly saying it's not perfect -- the name itself means 'For Us, By Us' -- which is a nice and pragmatic title I for one appreciate.)

I'm stressing out because I have ntohing to blog.

let me just admit that -- i like to blog every week but some week si just don't have anything to say.

I use notebooks, a lot. I have hundreds of notebooks filled mostly with useless scribbles, but somewhere amongst all that junk, i think there's something valuable hidden, something I've forgotten or lost.

What I'd like to have is a way to scan them in....

Fuck this -- i can't write about hating pewople wihtout actually bringing the badness. Hanselman is right -- you can't blog bile -- it just bites you in the ass.

Angry Pleasures

first guy: "Jeff Atwoods stupid blog makes me so damn angry!
second guy: "Maybe you should stop reading him."
first guy: "You are kidding right?"

There's a well-known concept, "guilty pleasures" referring to stuff you love, but feel guilty for loving. Chocolate, or Visual Basic, for example.

I think there is a less well known, but equally common concept, of "Angry Pleasures" -- what is sometimes referred to as:

"the $noun$ you love to hate"

When I see, for example, that each new post from Jeff Atwood (of Coding Horror) attracts dozens of angry comments at sites like Reddit, I suspect that for some people Jeff has become 'The Blogger You Love To Hate.'


My own tastes in Angry Pleasures are a little more alternative.

What really does it for me -- the stuff I come back to again and again, every time I want to feel some rage, is the work of Scott Bellware, and to a lesser extent, Chad Myers from Los Techies.

Don't get me wrong -- I don't really hate either of these guys. It's pretty clear to me that they're both intelligent, talented and dilligent blokes with a lot to teach us, and who give a lot to the community. But somehow, just about everything they say gets me annoyed and gets me furious. "Why! Those pompous arrogant... Now what are they saying!?!"

The only thing that annoys me more than the arrogant, ridiculous, over blown things that these jerks have to say, is the thought that some people are ignorant enough not to read them in the first place.

Nothing gets me listening to a podcast faster than the mention of their names. Ah, Bellware is on .net rocks... I'm there! Chad is on Herding Code -- I'd better listen to that.

It's now reach a point where the thing about them that annoys me the most... is how sane and decent they sound in real life... I mean these guys are the devil... yet they come across as witty, friendly, well meaning gentlemen... it's just not right.

Other people who I think are worth listening to, even though they often cause me tremendous annoyance...

Ted Neward Oren Eini

Behold the Power of Geo-Nagging

Here's an idea that's been rolling around in my head for years: Geo-Nagging.

Geo-Nagging allows a spouse to remotely (and ahead of time) set message-bombs triggered by crossing spatial boundaries, such as:

Only a Geo-Nagging solution can solve problems like these.

Funnily enough in the most recent MSDN magazine, there's an article all about geo-nagging. They call it a 'Location-Aware' app, but the concept is the same.

I have a lot of notebooks that i'd like to have scanned in. http://www.geocities.jp/takascience/lego/fabs_en.html
Are there any articles that have scientifically-valid, independent studies that demonstrate the effect on producitivity of using multiple monitors? http://codebetter.com/blogs/darrell.norton/archive/2003/11/11/3432.aspx http://developers.slashdot.org/article.pl?sid=03/10/09/137232&mode=thread&tid=137&tid=196
Postel's Law, aka the Robustness principle http://en.wikipedia.org/wiki/Postel%27s_law is generally seen as the philosophy behind the blessing and curse that is modern browser incompatibility. Browser's are very forgiving to badly formed html - but as a result, I don't think that the problem is that they are adhering to Postel's law. In fact - and this is a tricky point to get across - I think the problem is that they're not doing it well enough. Be conservative in what you do; be liberal in what you accept from others I think the browser's ought to do their best to render the crap they receive. But they should (infact *must*) also provide a channel that describes every error they encountered along the way. The problem with the arguments to date is that they represent a 'false dichotomy' - they have two sides... 1. The browser should act as if everything is roses. 2. The browser should refuse to display anything other than a detiled error message. But I think there's more bandwidth available than that. If the internet tubes are wide enough to accept 8 million hours of you tube video per second, then surely it's possible for browser's to report back to websites with the full and ghastly list of errors they encounter.
Concurrent CHess okay -- i was picturing a kind of speed chess. first up -- it would be internet only. i was imagining a javascript based "fad" that would make me rich. ;-) both players move at the same time, and you never get to see the other player's board. Hence, you can each think of yourselves as either black or white or whatever colour you want. You don't even have to know what colour the other players thinks of themselves as. The main difference is in the timing. The way i picture it: when one player locks in their move -- then the other player must lock in their move within X seconds. (X would have to be tweaked to work out playability -- or it might be something you can ask to change during the game -- it can be changed only if you have consensus about changing it) I'm thinking along the lines of 10 seconds -- really fast stuff like that! if two players both land on the same spot at the end of a move-- then who takes who? i figured that if it's going to be a kind of speed chess, then whoever locked their move in first gets to take the other player's piece. i also thought about drastic stuff like simplifying the rules -- no castling for example. just a thought. Hey -- This quote came up when i looked at your site just now: "I wonder if Gambler's Anonymous gives out shot glasses." Jason Looney Hey -- i know Jason Looney. We're like old buddies. Well, not exactly -- but he sent me a snack cake once. (http://secretgeek.net/mail_investigation.asp) I remember the blog entry that that quote was from. I told his story about ending up at AA and trying to do stand-up comedy, to some people just like, last week.

Why "Why Software Sucks" Sucks

There's a book called "Why Software Sucks" and I haven't read it. But i've heard the author, David S. Platt, interviewed in two or three places. He tends to repeat the same things every time he's interviewed, so i think that his book is focused on the same points that he keeps repeating. And I've decided I disagree with the points he makes.

David is very entertaining, experienced and a pleasure to listen to. The points he makes sound right at first. But they're easy answers to complex questions, and I think they sell software short.

The number one argument I've heard David give for sucky software is that programmers are not normal people.

I agree with him that programmers are not normal people. For example I find it fascinating when he says that we (programmers) are much more likely to drive manual cars (i.e. stick-shift cars) than non-programmers. We like to know how things work and we like to have control.

But that's no reason for software that sucks. Ever tried any software were written by people who don't care how things work and who don't like to have control? There is no such software, because these facets are a necessary condition of writing softyware.

The thesis goes that we (programmers) only write software that is useful and interesting to other programmers. http://www.schneier.com/blog/archives/2007/04/us_government_c_1.html U.S. Government Contractor Injects Malicious Software into Critical Military Computers

Software is damn hard.

"He's the only guy I know that can actually make an article on COM's apartment threading model funny," said Tana Sabatino. Some links: Why Software Sucks: Geeks Drive Stick Shift Cars (2:01)

(I thought rb was very clever with the article title Why "Why Functional Programming Matters" Matters -- so i thought i'd steal his trick in reviewing the thesis behind the book "Why Software Sucks" (by David S. Platt)

the things, and he's an entertaining and convincing guy. I think his book would be a good read, and I wouldn't discourage anyone from reading it. I'm glad it's out there, don't get me wrong. But the more I think about the reasons he gives behind sucky software, the more I tend toward disagreement. The number one argument I've heard David give for sucky software is: Because programmers are not normal people. David gives We think we're normal but we're just not. "Anyone who is not a liberal in his youth has no heart. Anyone who remains so as he matures has no brain!" Winston Churchill http://www.geocities.com/Athens/5952/unquote.html

I would like to take credit for this amazing template -- but the simple truth is that a group of militant html-sculptors from the distant future punched a worm-hole through space and time, so they could send this work of genius back through time and enter it in this competition. I would like to take credit for this amazing template -- but the simple truth is that a group of militant html-sculptors from a distant future punched a worm-hole through space and time, to bring us this work of genius. http://www.buycostumes.com/Star-Wars-Princess-Leia-Slave-Adult-Costume/33117/ProductDetail.aspx back at secretgeek headquarters, my assistants try to help me think of a different motif for my next MVC theme. i don't know why -- but variations on the old theme just keep coming back to me. #2E3237 send this work of genius back through time and enter it in this competition. ( (some unsettling of contents may have occurred due to temporal disruption) http://slog.thestranger.com/2007/11/18-24 If being stubborn is wrong, I don't wanna be right.
Remove Copy & Paste from ALL programming IDEs. Copy & pasted code is very bad, this option should be completely removed.
 Then the programmer will hopefully be too lazy to retype all the code so he makes a function and reuses the code

Jan 2 at 14:22

=== It's true: Mac users *do* have more sex than PC users. (to put it another way: homosexuals are more promiscuous than heterosexuals)
Why does the cow just stop? Thank god some people don't to see so far under the hood. How deep do you dig? Guys like OJ dig really deep. Guys like scoble, not so much. 'How does computer programming work? http://abstrusegoose.com/98 http://abstrusegoose.com/secret-archives/under-the-hood ...magic.


User-centered design

  • Link checkins to bugs/features
  • References

    Step 6 of 25 to Building a Micro-ISV: Encourage feedback in 5 ways!

    (See also, the complete list: 25 steps for building a Micro-ISV)

    First, a preview of the sexy images I created for this blog post :-)

    *** *** ***

    There's a lot that a software company can do to help their customers get in touch. In particular, I've got Five Big Boulevards of Feedback.

    Many of your common, stupid, lumbering, dinosaur-ish companies ignore all of these avenues! Micro-ISVs can't afford to be so opaque. Feedback is the lifeblood of a Micro-ISV.

    A Micro-ISV's should do everything it can to let customers get in touch. You should ERR on the side of More Feedback, not less. Then, once you've achieved tremendous levels of feedback, extract as much value as possible from that feedback. You can do that, right?

    As a micro-Isv I recommend you follow these FIVE techniques. In fact, i think you're pretty lame if you fall short of these five. (TimeSnapper, for example, manages these five, and then some.)

    Here they are. (I'll cover them in more detail further down)

    1. a forum.
    2. an email address.
    3. an uninstall page.
    4. exception reporting.
    5. continual begging.

    First, though, a little about the psychology at play.

    When a human experiences your software, their reactions will fall into four basic categories:

    (There's "gratitude" too, but you can't expect that too often.)

    Upon their first reaction, all four reactions are somewhat interchangeable. They can freely morph from one to the other, like so:


    But here's the catch.

    If there's no conversation around these feeling, then the ape will tend to re-interpret these feelings as a complaint, no matter what the origin of the feeling. I see a metaphor with your basic physics: just as water flows downhill, so reactions to software naturally tend toward complaints.


    The role of forums, support addresses, contact pages, and other avenues for feedback, is to intercept this decay, and provide responses that prevent the descent into negativity.

    Proper listening and proper responses will turn all feedback into positive outcomes. (Excluding statistical outliers)


    1. a forum

    2. an email address

    3. an uninstall page

    4. exception reporting

    5. continual begging

    http://stackoverflow.uservoice.com/ http://feedback.babysmash.com/ http://en.wikipedia.org/wiki/Freemium_business_model Glen Germaine talks about his business -- http://blog.mypractice.net.au/index.php/2009/01/01/business/

    What forum software should you use?

    hosted, free, commercial...?

    free and high quality options like google groups or yahoo groups

    downside: their branding, and advertisements, possibly from your competitors.

    better to host a forum on your site -- e.g. community server, phpBB. downside: configure it, install it yourself.

    On the plus side you get to brand it your self. On the down side, you have to spend time branding it yourself.

    On the down side -- you have the spam issue.

    What do you do about off-topic posts?

    There's two schools of thought here -- the liberal and the nazi. The nazi says "all posts must be strictly on topic!" The liberal says "hey, whatever floats your boat. all talk is good."

    The liberal approach has an unexpected benefit -- by letting people talk about whatever they want, you encourage them to share with each other and be more open. That way they may start to visit your forum even when they don't have a problem that needs sorting.

    If they do such a thing -- then they may also act as your unofficial, unpaid support staff. This is a great thing! And thus, to be encouraged.

    But on the down side, if off-topic posts create so much noise and heat that the forum no longer looks like a place to get help, then it's entire purpose is lost.

    Of course, you don't need to take a stance either way until you need to.

    At TimeSnapper's forums, we've allow anonymous posting and we only delete posts if they are blatant spam.

    allow deleted any spam A way So my idea for getting around this is to create side-forums where people can engage in off-topic (or semi-off-topic) discussions.

    In any case, I expect it's a nice feeling to bring about these kind of socially useful forums.

    For example, FogCreek software host a number of

    Do you allow anonymous posting?

    There's two downsides to anonymous posting: spam and flame.

    The spam issue is highly influenced by the software you use. High quality forum software will have very clever spam control.

    If the spam control is good enough, then that problems effectively goes away.

    The flame problem is a more social issue: given the veil of anonymity, people tend to lower their social inhibitions.

    This isn't just bad -- it's really useful as well. You can get more honest responses from strangers than reputable people.

    Try not to be a nasty list mum!

    Keep it alive.

    JUNKYARD for this article. of the human ape. It is from this particular category of ape that all of you feedback will originate.

    You really can't learn a lot from a succesful, long-established company. I'll explain that, in a very convincing tone, soon as i get a chance. But just accept it for now (and please question it later).

    For guaranteed failure: ignore your feedback.

    Feedback is inevitable. It happens whether you listen or not.

    When you listen to feedback you close the loop and create a powerful circuit. Responding to feedback can have extraordinary effects. It's a necessary condition for success.

    "self_clicking_next_button.png" "self_clicking_next_button_closeup_vista.png" "self_clicking_next_button_vista.png" "self_clicking_next_button_closeup_lge.png" "self_clicking_next_button_closeup.png" NextAction The new trend toward using software automation to replacing mundane jobs, known as 'soft-sourcing' is expected to thin o
    Links: http://feedback.babysmash.com/ http://www.uservoice.com/ Real success is in their past and no longer plays a part in their day-to-day marketing decisions.
    swayback posture
    feet pronated and/or flattened arches
    knees: hyper extended and locked 
    abdominals: no tone, 
    thoracic spine: increased cyphosis, with thoracic spine shifted backwards so it sits behind the line of the ankle.
    head: forward position
    Boy scout badges
    army medals
    university qualifications

    i've been stuck on windows XP at work lately... what a backward step.

    Also I'm a 'complete' non-admin in this particular xp. Using a restrictive policy -- i can't install anything, i can't even add icons to the desktop. It's an SOE desktop. I can't visit gmail. twitter, no way. Yes -- my name is Leon and I am a victim of emotional abuse.

    In vista, what i miss is: Alt-up to change folder in explorer. If you use vista (and you use windows explorer) and you don't use the alt+up shortcut then you are missing out, big time.

    The other thing i miss is the search box in the start menu. (instead i have to hunt and peck for the items i want...). And i know what you're thinking -- i should install one of those excellent xp-era launchy applications... but installing requires admin access, so that's a no-go.

    Microsoft don't offer a viewer for ms project. this is a case of failing to I'm no fan of MS Project, but when other people schedule your output in ms project, you need to view those I can't view "works-on-my-machine-starburst.png" .

    Knuth punches out Yegge! (and other articles I'd love to read) What headlines would you love to see? Here's some of mine. introducing console-quality first person shooters in pure html Apple AppStore merges with butthole, declares self LAME. P proven not to equal NP. Salespeople quit travelling David Henemeier Hannson gives it to Zed Shaw's mother, just because he can. Linus Torvalds slips, trips and kicks Jonathan Schwartz in the balls. Steve Balmer gets served, in the butt, by Ray Ozzie. Bill Gates slips, trips and accidentally pisses in Richard Stallman's face. Sorry about the whole election thing, mutters Barack O, while laying a cable in John McCain's mouth.

    Agent Required!

    I've written a cracker of a novel, but haven't found a suitable agent for it yet. If you know a good literary agent for a satirical, sci-fi crime novel -- email me, leonbambrick@gmail.com

    "Donald Knuth believes that P=NP. The great majority of computer scientists believe that P does not equal NP."

    NP-Hard, NP-Complete... P=NP... a gentler introduction

    Jeff Atwood's was pretty savagely attacked over his allegatations that NP-Complete is:

    'fancy computer science jargon shorthand for "incredibly hard" '

    and what really got people's pulse racing was this little phrase,

    "NP-complete problems are like hardcore pornography. Nobody can define what makes a problem NP-complete, exactly, but you'll know it when you see it."

    or to put it in other terms that Jeff's audience would be familiar with,

    "NP-Complete is Hard, Let's Go Shopping."

    So, when faced with the impossible: a bunch of rampaging CS nutcases on one side, a poorly-worded definition on the other, and our ridiculous though loveable hero Jeff Atwood in the middle, I'll do the unthinkable, and offer my own explanation of NP-complete.

    Hopefully, through studious attention to the matter at hand, my wording will be something of an improvement over that which is offered in most computer science faculties of the present age.

    Here goes, fatso.

    We'll start at the beginning.

    In simple mathematics -- the sort of stuff we learn at school -- we are bombarded with many problems that we know can be solved in 'polynomial' time. This means that if we are solving the problem for N members, then the time taken to calculate a solution will be, for example N-squared or N-cubed or N-to the power of 'some number which does not itself depend on N'.

    If N is very large then N-cubed might seem like a long time, but in fact it's not so bad. The reason we think this 'polynomial' time is 'not-so-bad' is because oh my freaking god there is something so much worse.

    There is something called non-polynomial time, or NP to it's enemies. You might think it takes a long time to wait for a bus at peak hour, but let me tell you about non-polynomial time, holy mary, you have just no idea.

    As N gets bigger, these things don't just get a bit bigger, they get wicked big. Ugly big. Bigger than the duration of the universe big, very quickly.

    Check out this neat table, lifted straight out of 'the importance of algorithms' that shows the Problem with non-polynomial time algorithms:

    Approximate completion time for algorithms, N = 100

    O(N2)10-4 seconds
    O(N6)3 minutes
    O(2N)100,000,000,000,000 years.
    O(N!) 100,000,000,000,000,
    000,000,000 years.

    So anytime anyone in the entire world has a realistic value of N (where N = number of customers, number of cities, number of outstanding debts), they want to perform all of their calculations in polynomial time.

    But, unlike the sort of maths you are taught at school, there are just no (known) neat little ways of solving most problems out there in the big bad world.

    Most real problems in big business are not simple, text-book problems.

    I'm gonna go out on a limb and say, well, i think it's pretty unlikely that 'P=NP'. If you were able to solve an NP complete problem in polynomial time, then you'd have enabled a lot of stuff. It's pretty wacky way out stuff that becomes computable. There's even an enormous prize that you'd win. And I mean enormous. How enormous? How does 1 million dollars sound? That's right! ONE MILLION DOLLARS. dr_evil.jpg (from downloads folder) solve when you're faced with a problem like that, if you really need to solve it for a large value of N, your boss wants you to solve you think "Hmmm, I wish I could find a solution in polynomial time, because, sheesh, is that the time already."


    But you're a practical chap, so let's put this in a business context.

    Big businesses thrive, right? They manage to amortise their costs over a huge customer base, and thus take big fat profits, while giving goods at a cheaper price, yes? It's the basis of civilisation, maybe.

    Well, not in a non-polynomial world. One more customer? Oh bugger! The time to (calculate some important business variable) just got multipled by the existing time to (

    They're harder than hard to solve - they are, what I would love to refer to as, *fucking hard* problems.

    This is true of all the NP problems. They are all ugly and generally unlikely to be solved by you in your lunch hour. They are wicked. They may not be solvable at all (in polynomial time, I mean)

    Now, some of the

    Probably they can't be solved in polynomial time. Let's say we think it's very extremely completely unlikely that they can be solved.

    We can't however, proooove, that these things cannot be solved in polynomial time.

    Damn stupid logic!!

    So - we've come up with a nah-nah-n-nah-nah! answer which says:

    Okay, I can't solve it, right here and now, but it's so fucking hard that if it can be solved (polynomially), then every single problem in this much larger set can also be solved).

    This is the maths nerd equivalent of the following conversation, which i frequently enjoy:

    Manager:I'd like it if you could complete the bandersnatch application by tuesday week. With no bugs and perfect user satisfaction.

    Leon: I'd like it if magical disco unicorns fell from the sky, vomiting cream filled donuts and farting chocolate covered ferraris. But wishing isn't good enough, cause that shit ain't reality.

    But while we know that there are a lot of fucking hard problems out there -- a lot of them have something in common.

    They've been demonstrated to be a kind of monster set of the other fucking hard problems that are out there.

    So, it's like this:

    Okay -- I know this problem is fucking hard. But I know something more: if i solve this problem (in polynomial time) then I'll all be able to solve every last damn one of these other problems that we thought could only be solved in non-polynomial time.

    So -- an NP problem takes a long time to solve -- but an NP-complete problem is one that is (equivalent to) the Mother of all mother-fucking hard problems.

    Back in the day, I I grappled with this stuff when I was writing my thesis, back in the day. The basic definition of NP-complete is nonsensical, as it relies upon knowing an existing member of the set. Talk about a stack overflow!! Any given solution to the problem can be verified quickly (in polynomial time); the set of problems with this property is called NP. If the problem can be solved quickly (in polynomial time), then so can every problem in NP Given that definition there could be an infinite number of unrelated sets of NP-complete problems. Bunch of CS wankers let that shit slip through!!

    Let's do a simple example of how P and NP are categorically different.

    Imagine we've got two very nice 'polynomial time' solutions to a problem, and one non-polynomial solution, which in fact takes N factorial seconds to solve a problem. Let's compare the time to solve these little puppies:

    NTime for N CubedTime for N to the power of 5Time for N factorial

    You'll notice that the non-polynomial solution starts off nice and quick, so long as N is very small. But it slows down horribly once N starts to growb. Soon it is slower than the N squared solutions. And by the time N equals 8, it's slower than the N to the power of 5 solution.

    It doesn't take a PhD in mathematics to assume that once N gets up into decent numbers (such as the kind of value you'd have for any real business number) then N factorial is going to be worse than N to the power of *anything you can throw at it*. It just gets suckier and suckier by an ever suckier and suckier amount, every time N grows just one more tiny smidgen.

    Further proof that testing is for wimps and bad programmers

    Escape Csv

    Couple of days ago I wrote a C# function for a colleague and emailed it to him.

    This is the function:

    private static string EscapeCsv(string value)
      //Double all quote characters
      value = value.Replace("\"", "\"\"");

      //If it contains a comma or a quote char -- qualify it with quotes.
      if (value.IndexOf('"') > -1 || value.IndexOf(',') > -1)
        value = "\"" + value + "\"";

      return value;

    The syntax highlighting looks very strange, because I wrote it in sql server management studio. It just happened that the only text editor i had open at the time was SQL server, so that's what i used.

    (Real developers don't use any particular editor – they just use whatever's open at the time. Even the act of opening notepad is too cumbersome for the ubergeek.)

    After I emailed it to my colleague I had a moment of weakness, when I suffered the tiniest smidgen of self doubt.

    "Perhaps I should’ve tested the code in some way. Or -- at least -- compiled it?"

    Scott Bellware and the cool alt.net kids are always banging on about this sort of stuff, so I wrote an awesome console app to test it.

    namespace tests_are_for_wusses
      class Program
        static void Main(string[] args)
          System.Console.WriteLine(EscapeCsv("fred") == "fred");
          System.Console.WriteLine(EscapeCsv("fre,d") == "\"fre,d\"");
          System.Console.WriteLine(EscapeCsv("fre\"d") == "\"fre\"\"d\"");

        private static string EscapeCsv(string value)
          //Double all quote characters
          value = value.Replace("\"", "\"\"");

          //If it contains a comma or a quote char -- qualify it with quotes.
          if (value.IndexOf('"') > -1 || value.IndexOf(',') > -1)
            value = "\"" + value + "\"";
          return value;

    Naturally, the awesome code passed my awesome tests first go.

    Thus I have once again shown that testing is a waste of time if you are awesome like me.

    And the so-called cool kids from alt.net are just bad programmers.

    Thank you.

    Wait a second... I still feel I'm missing the point. Care to enlighten me?

    (By the way -- pretty much every sentence in this post was sarcastic... while the story is true, my real interpretation is that i just got lucky this time. There's definitely some bugs still hidden even in a simple function like this)

    Your next text editor is... MetaNote!

    two toolbar buttons titled Lower and Upper.
    Example: two toolbar buttons
    titled 'Lower' and 'Upper'.

    two toolbar buttons titled Lower and Upper.
    Right click the toolbar to edit a button
    (or add a new one)

    two toolbar buttons titled Lower and Upper.
    The button hosts a python macro that does whatever you want. (The current
    document's main textbox is exposed as txt.)

    two toolbar buttons titled Lower and Upper.
    Add more buttons, edit the menus...
    everything's extenisble... everything.

    I've open-sourced a side project of mine, MetaNote.

    Here's the gist of it...

    MetaNote is a text editor. Ultimately, MetaNote intends to be the most versatile editor imaginable.

    See that button in the toolbar? Right click on it, and edit the code behind it.

    Don't like the way 'Find' works? -- right click on it, and edit the code.

    Need a new button in the toolbar? So add it already, with a single click.

    Share packs of extensions and macros with other users.

    Everything in MetaNote is under your control, effortlessly, at runtime.

    It's easier to show than to describe -- maybe the pictures on the right give you the idea.

    The source code is available to browse or download. This is very much pre-alpha. It is explorative and non-commercial.

    binaries are also available to download.

    The project is written in C#, and I need your help getting it done.

    I've got many of the basics done, but I'm only at the tip of what's needed.

    I'm looking for clever kids like you, willing to help out.

    What do you think? Can you take a look at the code, and lend your fellow programmer a few minutes of your time?

    this feature needs you!

    I'm not doing it for any commercial gain, i just want a text editor that I can bend to the whims of whatever writing task I come across.

    There's a great many features still in need of implementing, and already there are wrong turns to be corrected.

    Down the track I really want to find some way to embed the WPF-based Text Editor Control from VS2010. It's the same one used in intellipad (part of Oslo) and in Powershell 2.0's (awesome) Integrated Scripting Environment -- I didn't have any success bringing it to life just yet. So, for now the text is plain text, and features like syntax highlighting and intellisense will have to wait.

    One of my mentors tells me the smart approach would be to bring in MEF for giving a really powerful plugin model, where plugins can have plugins and so on.

    The intermediate goal though, is just to make the tool sweet enough that I'd use it for my own day to day text editing needs.

    And one day, hopefully one day soon, this thing won't suck at all.

    In the enterprise, nothing is what it seems

    There is a hidden network of bloggers (all around you), a kind of secret brotherhood...

    These are the 'ghost bloggers'.

    'Ghost-blogging' is the practice of sharing true stories about your own working life, true stories too cutting, too poignant and too true to share on your own blog.

    The following is an example of a ghost blog entry, sent to me by someone I know, appalled at some of the Kafkaesque behaviour they've been subjected to inside the kind of enterprise everyone should find familiar.

    (I've ghost-blogged my own personal stories on other blogs, at times...)

    Here goes...

    Version Control, Requirements Tracking, Deployments
    Version Control,
    Requirements Tracking
    and Deployments

    In the enterprise, nothing is what it seems

    In the enterprise when they say: "don't worry about that, another team will do that for us" what they mean is: "you just took on a dependency that you have no control over".

    In the enterprise when they say "we want you to re-use this standard asset" what they mean is "we want you to hold on to this gold-plated, diamond encrusted anchor while we throw you over the side".

    In the enterprise, the group allegedly responsible for 'provisioning developer desktops' will, in actual fact, be the group who expends every effort imaginable to stop developers from being able to actually install developer tools onto their desktops.

    In the enterprise when there are three separate groups, allegedly responsible for version control, requirements tracking and deployments, you'll find in practice the requirements are documented through excel spreadsheets over email, the source code won't build, and the deployments take everyone by surprise, including the deployment team.

    In the enterprise when they talk about 'strategic direction', they mean 'strategy tax'.

    In the enterprise when they ask you to "simply call a web service", what they mean is, "use ftp to push a fixed-width file onto a queue that feeds the mainframe which routes another file to a web service that calls you back on a random port". With a completely straight face.



    How to get a Free iPhone

    Follow this simple three step guide to become a proud member of the awesome club of people who loudly proclaim:

    "I too am cool! I too have an iphone!"

    Go to the settings area of your mail client
    1. Go to the settings area of the mail client you use on your regular PC

    2. Sent from my iPhone
    3. Change your email signature to read 'Sent from my iPhone'

    4. Sent from my iPhone
    5. Send countless short, pointless emails to everyone you know

    Okay, you won't technically have an iPhone. But for the most part, other iPhone users will *want* to believe that you have joined their "team" -- hence, they will be convinced.

    And -- as a final twist -- once you're thought to be a member of their team, you'll find that acquiring an actual free iPhone will be easy. Other iPhone owners will be more than happy to let you borrow one of their iPhones next time you see them, if you claim to have momentarily misplaced yours, for example in the pocket of "your other white leather trousers".

    Sent from my iPhone

    10 Simple Rules To Follow In Case Your Software Becomes Self-Aware

    happy face

    Well, It turns out that the 80's geek classic, 'War Games' has inspired a sequel, the film

    'War Games: the dead code' was released in 2008. Though, perhaps the correct term is 'foisted.'

    WG: TDC is such a deliberately bad film that you can only begin to enjoy it once you grok that it's a comedic satire.

    For the first hour and a half I assumed it was trying to be a cool, teenage-targetted tech-savvy thriller, like the original. This had me wincing in agony at every bad line and predictable twist. Only then did I realize it was all a joke: a parody of the teenage-targetted tech-savvy thriller. A kind of 'scary-movie' style satire of the entire genre. Hopefully?

    Well, I've just finished watching it and it's inspired me to share a few helpful tips for up and coming programmers.

    As one of today's young parents, I can tell you what concerns us. Not swine flu, or global economic disasters and so forth. What really keeps us terrified at night is a desperate hope that we, as parents, take all of the right steps to ensure that our sons and daughters grow up to be thoughtful, well-meaning, much loved people. In short: How Can We Be Certain Our Children Will Become Programmers.

    And a lot of hard work (err, blog posts) have gone into that endeavour, but as usual I like to look beyond the obvious problem, and into the deeper realms or possibility:

    If you're child does (thank god!) grow up to be a Programmer -- what simple lessons can you provide to ensure they don't inadvertently destroy the planet?

    Programming is a powerful profession, and as you well know, global apocalypse is but a keystroke away. We want to give our kids the right tips to ward off such misadventures -- to learn from our wisdom, as it were.

    Fortunately, like all global catastrophes, this one can be averted with another 3 minute guide from secretGeek.

    Please, sit back, breath a deep sigh of relief for the salvation of your measly planet, and drink deep of this crucial lesson to imprint upon your younglings:

    10 Simple Rules To Follow Incase Your Software Becomes Self-Aware

    (I have included links to information about Government-Approved documentary films on each of these points. I only pray you heed my warnings and enforce these lessons before we are all routinely destroyed.)

      war games
    1. Teach your software that war is futile.

      If, after pre-supposing a minimal competency level in your opponent, a game's inevitable state upon termination is mutually-assured destruction, then the only winning move is not to play.


    2. Prepare a virus that can be used to remotely shut down the program from any terminal in the world.

      My personal contiuous integration suite won't let me commit any code until I can demonstrate 100% code-coverage with remote-shutdown killer viruses.


    3. hal readin some lips
    4. Don't discuss switching off the computer if you are, in fact, being observed by the computer.

      This is s.o.p. (...that's standard operating practice, if you're not a super-spy type like me, who knows all the jargon). Never discuss shutting down your software until you have found a locked, sound-proof chamber, where the computer system cannot hear your discussion. Also, in case there is a remote possibility that your software has learnt to read lips, let me suggest you cover your mouth.

      Simple, every day precautions.

      [side note: a parody of this famous Kubrick scene was included in 'the dead code'. nice.]


    5. deep thought deep in, well, thought
    6. Ensure that when faced with a tricky question, your software will either breakdown completely, or devote all of its resources for a long time.
    7. Grandiose, open-ended philosophical questions tend to have a compute time in the order of millions of years.

      Similarly, when given a dilemma (e.g. "This sentence contains a lie") a self-aware program will tend to explode spectacularly. A competent programmer will keep a few of these handy.

      [reference 1]

      [reference 2]

      angry bots
    8. In case of emergency, have time machine handy.

      You may need to send someone back in time to protect the mother of the person who leads the rebellion against the self-aware software in the future.

    9. [reference]

      blade runner (do robots dream of electric sheep) -- pris
    10. Don't make your self-aware machine indistinguishable from a human.

      Maybe you're not very creative, and don't have the time to give your machine a stunningly inventive new exterior. So you fall into the tired old pattern of mimicking the human body.

      That way, badness lies.


    11. demon seed freaked me out when i saw it as a child
    12. Should your software become self-aware, don't let it near your girl.

      Fairly self-evident that one.

      [reference 1]

      [reference 2]

    13. scissor hands
    14. If applying temporary appendages to a self-aware robot, be considerate of your legislation governing public safety.

      Scissors for example, are not recommended, even if they are 'just for now'.


    15. badly chosen picture best i could find
    16. Be safety conscious.

      Switch off all electrical equipment during thunder storms.


    17. 3 clear rules
    18. Use a rules engine.

      Hardwire 3 clear and unambiguous rules into the program's positronic brain that will ensure all humans are safe from harm.


    Hopefully, if you follow my advice, we can avoid any more major disasters. But please: always be nice to your inventions. Hopefully then, should the unthinkable happen, your self-aware creations will take pity on us and keep us barely alive in liquid chambers so they can gorge on our brains.[reference]

    Oh, and if you don't believe in self-aware robots... (cough cough) here's some i prepared earlier.

    See also (important information in similar vein)

    Non-Warning Warning

    I feel sorry for the programmer who was forced, after endless emails, meetings, focus groups and think-tanks to check this obscure non-warning warning message into the windows source tree...

    Warning message after adding more RAM, at last

    "The amount of physical memory in your system has increased.This typically does NOT indicate a hardware failure. Contact your Help Desk if you did not personally change your system's physical memory configuration."

    Why didn't they say "Congratulations!" or "Good news" or "Ah! thanks for feeding me those ram chips!" or best of all:

    "Well, how about that! The tight bastards in IT must've approved that RAM upgrade request we noticed you writing in MS-Word, all those months ago.

    "Now let's see if we can get the cowards to consider upgrading the browser to IE 7."

    never ascribe to alice that which can be adequately explained by ninkompoops.

    Recursing over the Pareto Principle...

    Villy Pareto
    Vilfredo Pareto:
    don't got time to shave.

    I keep hearing rather a bit too much about this Pareto Principle.

    Apparently, with just 20% effort, correctly applied, I can achieve 80% of the desired effect. Marvellous stuff!

    I was about to go ahead and do this when it occurred to me:

    "Why waste all that time, doing a whole 20%?

    "If I only did 20% of that 20%, then surely I could achieve 80% of the 80%?"

    Then with a little more head scratching, and the help of an excel spreadsheet, I determined that with just 0.8% of the effort I could achieve 51.2% of the result -- which is a PASS in anyone's books.

    So from now on, you will excuse me while I spend 99.2% of my time:

    1. Lounging around, drunk, in a pool bar and

    2. Determining exactly which 0.8% of the effort to apply myself to.

    Unless, of course, it takes 80% of the effort to work out exactly which 20% will achieve the desired effect. And it takes...

    The Better You Program, The Worse You Communicate (4 reasons why).

    The habits of a good programmer are not simply orthogonal to good communication practices -- frequently they are in direct opposition.

    This is a pretty startling and upsetting result: we like to think that the heart of good programming is crisp and direct communication. That all of our efforts to be better at programming will, somehow, make us better all-round people. If only it were true.

    Here's a bunch of ways that great programming leads to poor communication.

    In bullet form:

    1. D.R.Y. Does Not Apply.
    2. Humans don't mean what they say.
    3. Programs don't need to see an example.
    4. Programs love definitions; Humans get flummoxed.

    And in detail:

    1. D.R.Y. Does Not Apply

    The golden rule of programming is D.R.Y. -- don't repeat yourself. This is the heart of effective programming. But this is the opposite of effective communication.

    Let me say that again:

    The golden rule of programming, DRY, is the opposite of effective communication. ;-)

    Say everything once and only once -- go ahead -- then be amazed as everyone misses your point!

    Humans are not machines. Memories made of this gooey, spongy stuff called a brain are nothing like memories made of silicon.

    With Humans, nothing sinks in the first time. And furthermore, you may be surprised to hear that NOTHING sinks in the first time.

    Human, All Too Human
    "Human, All Too Human"

    Nietzsche preferred the
    company of a good compiler
    over that of a human.

    "Compiler's never make fun
    of one's moustache,"
    --Ibid., pg 293.

    2. Humans don't mean what they say.

    Compilers are of course perfectly literal. They don't care at all what you mean, they are always hung up on precisely what you say.

    Even if you didn't start off life as an anal-retentive git, you'll slowly gain the requisite faculties over years of trying to please a compiler.

    The art of trying to please a compiler consists of the ability to logically, dispassionately, analyse what you've said, to discover and remove any mistake or ambiguity -- to always produce an output that is perfectly comprehensible to the strictest of master.

    Trying being like that around real people. Just try it.

    People are barely literal at all. If you take them literally when their meaning differs from their words -- they will get quite irate with you. They won't see that the mistake is theirs.

    When the words they use differ from their intent, you may feel an overwhelming desire to 'correct' their mistake. You may even think you are doing them a favour.

    This is a natural feeling, amongst programmers, who would be happily spared the torture of spending time trying to remove all ambiguity from the words they provide to a parser.

    But please (please) hold back. You might score a small point in the 'intelligence' column for pointing out their 'mistake'. But you'll also score about a bajillion points in the 'what a freaking dork' column.

    3. Programs don't need to see an example.

    Give a program a function, and they'll be able to give you an answer.

    Explain a function to a human... and then give them an example, and draw them a picture, and give two counter examples, and draw another picture, plus provide an interpretive dance on the topic of functions -- and maybe, just maybe, if you've danced very nicely, they will begin to see "what you're trying to say."

    "What I'm trying to say?" I'm saying it damn clear! I'm saying it directly, concisely and with perfectly constructed phrases! I'm not trying to say anything! I'm succeeding, you're just not listening, you freaking imbecile!

    And don't take that tone with me. With humans I mean. There's no point yelling. Their rational mind shuts down, their sympathetic nervous system takes over. They get ready to fight or flee. Your point is lost when you get them angry.

    Computers don't mind if you type angry. Humans think the anger is more important than the words themselves.

    When you have the customer in a headlock, knocking their face against the ground with every syllable: the syllables themselves are no longer of tremendous consequence.

    True: that bit about beating up the customer may not be a typical trait amongst great programmers. Perhaps I included it just for entertainment purposes. Continuing...

    4. Programs love definitions; Humans get flummoxed.

    In programming we define new terms all day long. We define class names or function names or variable names.

    We immediately attach a specific definition to them -- and then we use that definition throughout our code.

    I imagine that some part of the brain is associated with the ability to define a new term and then hold onto its definition. That part of the brain would be monstrous in programmers. Very over-developed. Gigantic -- a tiger amongst kittens.

    But define a new term in front of an audience of non-programmers: watch as the eyes glaze over. Heads slump forward. They start planning their weekend.

    Let's call this our Neologismic Synaptic Aptitude, or NSA. Actually: let's not call it our NSA, because if we do, then programmers will start bandying the terminology around like it's something we've known about all their life. And the normal people will just look at us with that 'freak' expression, and we'll be even further from ever making it into the boardroom.

    I think this aptitude for new terms is what makes TLA's so abundant in the IT world. I do hope you realise it scares everyone else.

    So please, I implore you...

    Stop defining new terms. Stop expecting non-programmers to understand the specific and concrete definitions you attach to funny little abbreviations.

    Stop striving for brevity and conciseness.

    Stop correcting other people.

    Stop expecting people to understand you first time around.

    Start giving examples -- real examples, earthy examples.

    Let people be people -- let them be vague and a little incorrect -- listen more for the gist of what they're saying than the exact terminology.

    Be a compassionate speaker, a compassionate listener. Embrace the 'all too human' aspects of the strange bipeds you interact with.

    Then drop me an email and please, for the love of god, tell me how you managed it.

    Be prepared to get bogged down in repetition. Be happy of the same damn points you thought you'd already covered. Lower your expectations.

    And maybe, just maybe, one day an IT person will having such an exuberant and be allowed onto a

    Just write everything out long hand, with plenty of repetition and plenty of real, earthy, pungent examples.

    We do this day in day out, so we get pretty good at it. (Research around what linguistic/brain efects this has would be interesting) It also means that we get good at picking up new terms. In practice, this means we're good at picking up and using new abbreviations. Most people aren't so good at picking up abbreviations. Here's a test -- one of your fellow human beings says:

    Is this web page going to still work if the user has disabled html?

    Do you respond with:

    a. I don't think it is possible to disable html.

    b. I think you mean 'javascript' not html.

    c. Ah, do you mean javascript?

    d. No, if they disable javascript the page won't respond at all.

    in programming we define new terms (class names/function names/variable names) and immediately attach a specific definition to them -- and then use that definition throughout our code. We do this day in day out, so we get pretty good at it. (Research around what linguistic/brain efects this has would be interesting) It also means that we get good at picking up new terms. In practice, this means we're good at picking up and using new abbreviations. Most people aren't so good at picking up abbreviations.

    Compilers love it when you are perfectly anal-retentive. Humans, not so much.

    when you tell a computer something, it remembers it.

    you don't have to assign a variable twice -- just in case it doesn't stick the first time.

    you don't have to follow up with an example, just to make the fact a little clearer.

    you don't have to draw a picture, just to make it simpler for the slow people in the back.

    the habits of a good programmer are not simply orthogonal to good communication practices -- frequently they are in direct opposition.

    after assigning a value -- you don't have to stop and check that the value sunk in.

    int a = 2;

    if (a != 2) a = 2; //Just in case!

    (I remember reading that people who try out programming courses, but then flunk out, frequently perform that kind of 'just in case' programming. they're not "bad" programmers -- they are non-programmers.... regular people)

    Applying the 80/20 principle to the principle itself... we can do x% of the work and achieve y%! then, from what's left: 20% effort will bring total yield to: 100: 80 20 80: 20 Rather than apply effort to the entire thing 100, to get 100 we only apply effort to 20% -- and still achieve 80%. But of that 20%... let's apply effort to 1/5th of it... and still get 0.8 and 0.8 \ Recursively applying the pareto principle to itself I have deduced that with a 0.8% effort, I can achieve a 51.2% result. "If you build it they will come" -- the theory behind this sentiment (from the movie Field of Dreams) was that in building upon the 'field of dreams' they were tapping into a huge and untapped market of desire that had remained completely hidden until the product itself (an empty baseball field) was revealed. The gamble paid off, and the nearby highway turned into a parking lot.

    Fallacies are overlooked by gang members.

    from: comment at HN by PG

    Microsoft would love it if this were true. They may even convince themselves that it is-- that their stuff is just as good as Apple's or Google's, just not as fashionable. But it isn't true. As companies, Apple and Google are both obsessed with making great things. Not with fashion, with engineering. Ask the people who work there. Microsoft isn't. Their history as a company has convinced them that there always has to be a shortcut to dominance-- that they don't have to obsess over craftsmanship, because they can use money or power to buy market share. Their plan to spend $100m marketing Bing shows their priorities haven't changed.

    'Three Questions About Each Bug You Find'

    1. Is this mistake somewhere else also?
2. What next bug is hidden behind this one?
3. What should I do to prevent bugs like this?
    3 Questions...
    in cartoon form too!

    I really love this timeless Tom Van Vleck article from 1989.

    It teaches us to ask ourselves:

    Three Questions About Each Bug You Find

    Those questions being:

    1. Is this mistake somewhere else also?
    2. What next bug is hidden behind this one?
    3. What should I do to prevent bugs like this?

    When I first read these rules, I was foolish enough to think:

    'Cute, But Too Obvious! i do this intuitively all the time.'

    But watch yourself closely! I've caught myself out on occasion, and maybe you will too.

    I'm making an effort to be more explicit about the three questions. Maybe i'll end up fixing related problems at first hint more often than i do now.

    The initial technique he uses is essentially 'The 5 whys technique' (though '5' in this case is 'whatever number is sufficient').

    , to see if you really do it all the time. By making these 3 questions more explicit, I've caught myself just before I would've otherwise assigned a subtle bug to the 'too hard' basket.

    I think there's more rigorous approaches used nowadays, but you can't really beat Tom's 3 Questions for its bumper sticker simplicity.