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
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:
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
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.
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 ===
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(
"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.
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)
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).
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."
"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.
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
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.
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)
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 them - 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] )
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.
(on behalf of TimeSnapper.com)
p.s. here's some pictures of TimeSnapper Professional in action:
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: http://www.TimeSnapper.com/downloads/TimeSnapperProSetup_v2.5.exe It has many features that are absent from the free edition, including: * 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: http://www.TimeSnapper.com/compare.aspx 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: http://timesnapper.cmail1.com/u/ykbuj/l/== 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
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:
Rephrasing those for my own purposes I get:
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)
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.
See this forum topic for an example of non-volunteer inclusion in skunk works.
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?'
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 MEF for plugins?
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? ;-) )
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=220.127.116.11, 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:
And i learned that there's a diagnostic command like this:
It's supposed to display the ngen state, but all it says is:
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).
> 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)
but it hasn't, yet, led to any improvement in my situation.
Lucy: 7. WTF?
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.
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.
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=18.104.22.168, 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
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.
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"
...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.
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:
$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.'http://barrkel.blogspot.com/2009/01/jeff-is-wrong-and-dont-listen-to-him.html
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
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:
(And a classic problem I used to have on the trains in england...)
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.
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
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 http://stackoverflow.com/questions/406760?sort=votes&page=2#sort-top Jan 2 at 14:22 martinus
(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)
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)
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.
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
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.
Keep it alive.
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).
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.
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 ribbons/statues/medals/medallions/certificates awards/honours/certifications/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
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 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. 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:
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.
"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
O(N2) 10-4 seconds O(N6) 3 minutes O(2N) 100,000,000,000,000 years. O(N!)
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
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:
|N||Time for N Cubed||Time for N to the power of 5||Time 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.
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 + "\"";
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.
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 + "\"";
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.
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)
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?
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.
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...)
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.
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 the mail client you use on your regular PC
Change your email signature to read 'Sent from my iPhone'
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
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:
(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.)
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.
My personal contiuous integration suite won't let me commit any code until I can demonstrate 100% code-coverage with remote-shutdown killer viruses.
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.]
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.
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.
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.
Fairly self-evident that one.
Scissors for example, are not recommended, even if they are 'just for now'.
Switch off all electrical equipment during thunder storms.
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)
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...
"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."
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:
Lounging around, drunk, in a pool bar and
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 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:
And in detail:
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.
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.
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.
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...
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.
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.
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.
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.
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)
from: comment at HN by PGMicrosoft 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.
in cartoon form too!
I really love this timeless Tom Van Vleck article from 1989.
It teaches us to ask ourselves:
Those questions being:
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.