Time for a rewrite.
Sorry I haven't posted in the last few hours. I've been rewriting all my code in Wasabi on Wails.
(You don't follow? Go here, then here, then here then here then here then... get back to work.)
Sorry I haven't posted in the last few hours. I've been rewriting all my code in Wasabi on Wails.
(You don't follow? Go here, then here, then here then here then here then... get back to work.)
If you're developing code today, it's probably 'controlled' using a version control product of some sort. (We use Vault here, and in the past we used V S S)
That's great, your code is covered. But what about your stored procedures, and your database schema? Many developers (I suggest 'most') have no form of version control on their stored procedures or their table structures etc.
So here's some articles and some tools, to get you thinking about how you can implement change control over this other, crucial, piece of your work.
This list is completely un-guaranteed. The prices might also be wrong and can be assumed to be US dollars ((tell me if you know better).
What do you use? Got any suggestions? Improvements?
Would you write your own XML Parser? Only if you're f***ing crazy.
Yet developers constantly write their own "little" csv parsers.
"Oh this will be easy, I'll just read the file one line at a time, calling String.Split(',')
to break each line into an array.
"Then I'll be able to refer to each item by number."
(You're already headed for stormy water... anything you do from now on will only drive you into the rocks harder and faster...)
"Oops. I need to handle for commas, which are either escaped (by prefixing them with a special symbol) or contained inside quotes."
(So you decide to use regular expressions. After a bit of tinkering you've got a nice little regular expression that seems to work.)
(That ringing in your ears is Jamie Zawinski saying "Some people, when confronted with a problem, think 'I know, I'll use regular expressions.' Now they have two problems. )
"The quotes worked good at first... but quotes need to be escaped too. And sometimes there's double quotes, sometimes single quotes. Easy -- I'll just fix my regular expression."
You start to adopt a 'test-driven' approach, only it's more of a 'panic driven' approach. You write numerous test cases for your unwieldy csv parser. It behaves nice.
You test it on more real world examples... it breaks your existing code and you need a new test case or two.
You begin to add new test cases, and trying always to do the simplest thing that will get the code to work.
It's now eight weeks since you said "I know! I'll just use String.Split(...
". You have grown a long beard, which is particularly annoying as you are a woman. You have lost all boundaries in regard to personal hygiene. Managers circle your desk like vultures circling a wounded leopard.
You lift your head from the keyboard for just moment when a thought strike you. The problems you are facing have been faced before. You are re-inventing the wheel.
You download a code sample from the internet, and use your test cases to try them out. The downloaded code is much worse than what you've written yourself.
You download more samples from the internet. They're all broken. In. Different. Ways.
When you try to contact the developers of each library to see how they work, you find that the developers have generally retired and/or passed away and/or quit working in the IT industry. You consider how fortunate they are.
You go to the blog of someone you know and trust. You email that person. That person writes back and says, in big letters:
The great thing about File Helpers is not just that it works, but that it is actively developed by Marcos, and if you need an improvement to it, you can contact Marcos (marcosdotnet at yahoo.com.ar). He's a real person who cares about getting his library to work properly. He's not just stopping at a 'good-enough' solution.
The other, and perhaps even greater, advantage is one you never dreamed of. Now you don't have to refer to fields by number. No more "myArray[4]
" -- you can now say "myCustomer.Id
".
The resulting code is so readable that you'll survive your next code inspection without getting your arms and legs torn off by Terry (Head Code Nazi and leader of the local chapter of The Programming Gestapo).
You can stop re-inventing the wheel and get on with your day job: cranking out more bugs, faster.
(But it's a good thing this experience gave you a chance to try out test driven development!)
After much work -- and almost a year since we entered the Larkware developer competition, we've reached our next major milestone with TimeSnapper.
TimeSnapper 2.0, the 'Professional Edition' is now available (you can go to TimeSnapper.com, or download directly from here)
The good news is that there's a bunch of new features. The not-so-good news is that the Professional version has a price tag (you do get thirty days to try it out for free). But then, the other good news is that the classic version is still free.
Quick rundown in case you haven't heard of this before: TimeSnapper is a piece of software that runs in the background of your computer, taking screenshots of your computer every few seconds.
It uses these screenshots to put together a kind of journal: a movie you can flick back over to help fill out your timesheets, or to remember what you were doing at a certain point in time.
It's also invaluable for working out why something went wrong, or for recovering information that would otherwise be lost.
There was a staggering amount of work in getting the details right for this release. We've got new forums, a proper installer (at last!), and we now use a firebird database to help you manage your data.
Here's a rundown of the new features:
Lets you view only the snapshots you're interested in.
This little feature makes it much faster to translate a day of activity into something you can use to fill out a timesheet. The drop down list contains the name of every program that received focus throughout the day. Pick any one of them, and the timebar will be filtered to only show the snapshots for that program.
You can use a filter to make sure you only record the programs you want to record.
For example:
Don't record when I'm using MineSweeper
or: only record when I'm using Microsoft Excel
This was a commonly requested feature, and we tried to make it as flexible as possible.
Filters are configured right on the startup screen:
You can have as many filters as you need:
And each filter has its own set of files to include or exclude:
Ability to add a note to any point in time.
For example: record when a phonecall occurred, or when you switched task.
Use this feature to pinpoint important moments in your day.
When you create a flag, it is added to the timebar, so you can quickly get back to that point in time.
Hit [Start-Key]+"S" to bring up the TimeSnapper shortcuts menu.
Lets you quickly change mode, without lifting your hands from the keyboard.
As always, we (Atli and myself) are after your feedback. Any problems you have with the software, any suggestions, any stray thoughts... either leave a message at the forum -- forums.timesnapper.com/forums, or email us: support at timesnapper.com. (You can also leave a comment below, of course)
I don't like to talk about sad things on an otherwise upbeat blog, but Australia has lost two of its favourite sons in the last week.
As you no doubt know, Steve Irwin, 'the Crocodile Hunter' was killed by a stingray barb. And yesterday, legendary racing car driver Peter Brock, died in a car accident.
Peter Brock is probably not as well known outside Australia as Steve, but within Australia he is a much loved hero, having won our biggest car race (the bathurst 1000) a record nine times.
I think there's some consolation that in each case the men died quickly, doing what they love. It would be akin to Scott Hanselman getting zapped by a lightning bolt while installing a new wireless hub on his roof.
I've tried hard to come up with a cheerful joke revolving around the death of these two heroes, on the proviso that it is neither degrading nor exploitive. Here's the best I could do (and of course this is based on an old old joke of my father's):
So Peter Brock gets up to heaven and after a day or two he goes to have a chat with Saint Peter back at the gates.
So how are you enjoying it? Asks the saint and Brockie replies, Oh it's heaven, you know, everything's wonderful. But something I keep noticing is that everywhere I look: there's Steve Irwin. I see him in one place, then I turn my head and wow! There he is again! I know he's hyperactive, but it's amazing, it's like he's everywhere at once. How does he do that?
Oh no, says Saint Peter, That's not just Steve Irwin. One of those people is Steve Irwin, but the rest of the time, that's not Steve Irwin, that's God you keep seeing. He just thinks he's Steve Irwin.
(no, it's not what you think.)
When I was but a child, I imagined that the coolest thing in the world would be Flying.
I wanted to be a bird, or, if necessary, a pilot. As things worked out, I never did sprout wings, nor did I learn to fly a plane.
Cut forward to now, I've ended up as a computer programmer. I guess I'll never know just how much fun I'm missing out on.
Luckily, I have a friend who is both a commercial airline pilot and a programmer. (He writes airline safety systems)
He became interested in programming initially for practical reasons; he needed to track information efficiently. But over time, he's really gotten into it. He writes excellent applications.
Here's the thing: he told me recently that programming is more fun than flying a plane.
;-) So there you go. No regrets. Programming is the absolute most fun activity in the world.
I've collected a small list of tools for powershell.
I can't find anything else in this category!! (Quote from Alan Stevens's blog: "I went to talk to members of the Visual Studio team about the possiblity of a PowerShell add-in for VS. They've never heard of PowerShell! ") Anyone have ideas for a useful powershell related VS add-in/macro?
We are different to other people. So very different.
And why is this? What is it that makes us different? And why is this dangerous?
The keynote speech at tech.ed this year was by a microsoft anthropologist named Anne Kirah and she highlighted a simple, yet major difference.
This is how normal people react:
"Stupid thing is broken! I don't need this! I've got important things I'm trying to achieve!"
This is how a geek reacts:
"Ah! A challenge! Lucky me! Forget all my other priorities! Let me dig a little deeper!"
Here's a snippet from Sam Gentile's blog, as a tiny example:
"Small problem installing RC of .NET FW 3 Windows SDK. Install program from root of directory will not run, even as Administrator, was able to go down to setup subdirectory and run SDKSetup.exe"
This is an example of a problem that is tiny to geeks like you and me. And yet it's an insurmountable obstacle to people who are not geeky: that is, to the majority of people.
Similarly: today at work I had a misbehaving laptop. It took me over an hour to work out that a particular service was responsible, and to find a way to disable this particular service (it was locked in a 'starting' state and wouldn't respond to any commands). Although the experience was frustrating, I also found it just a tiny bit thrilling, and I was quite happy once the problem was solved. A non-geek should've given up immediately.
Look at the way Scott Hanselman solved this seemingly insurmountable problem Rick Strahl had getting his laptop onto a projector:
"Fire up another machine and remote desktop into my machine then run the presentation over Remote Desktop. Link the two machines together with a network cable ... assign two local IP addresses... ...5 minutes later the two machines are connected and talking."
I don't expect my elderly aunt Agatha to engage in this kind of activity.
This is dangerous if your software is tested by geeks.
Geeks will overcome almost every problem, without ever telling you about it.
Geeks generally report bugs when something is impossible, not when it's just incredibly hard.
A product is boring from a geek's point of view when it simply fulfills a purpose. The same product might be thrilling to a non-geek, for exactly the same reason.
Down the scary end of this line of thinking: geeks will derive the most pleasure from flaky tools that behave only when you nurse them properly (e.g. beta software, hello web 2.0) and tools that let you dig much deeper (e.g. linux), while non-geeks derive the most frustration from such tools.
[note: i edited the above paragraph to remove an unintentional dissing of linux. linux ain't flaky as i originally described.]
I enjoyed that little revelation. Here's some articles mentioning Anne Kirah and her observations (can you believe she, like, doesn't have a blog??)
Des Traynor has written a great little introduction to microformats and hCard. If you're reaching the "Curious Tipping Point" with microformats yet, then read what Des has to say.
The legendary Phil Haack wrote a slightly longer Developer's Introduction to Microformats a while back.
(how's that for a geeky title)
Okay, the simple excel function i wanted to teach someone to write:
"If A1 is between 1986 and 2000 (inclusively) then print '1', otherwise print '0' "
How would you write that as a cell function?
I haven't done much excel lately. Here's how I thought it would be written:
=IF(B12 >=1986 AND B12 <= 2000,1,0) <-- Nope!!!
How about:
=IF(B12 >=1986 && B12 <= 2000,1,0) <-- Uh-uh!! No siree!!
(i was still refusing to look up help at this point...)
Forget it... i'll nest the logic...
=IF(B12 >=1986, IF(B12 <= 2000), 1 ,0) ,0) <-- Yes this worked. But...
Yuck. I mean... honestly!!
So I tried...
=IF(B12 BETWEEN (1986, 2000), 1, 0) <-- Doesn't work
=IF(B12 IN (1986...2000), 1, 0) <-- Doesn't work
(also tried with square brackets, curly brackets, angle brackets, pipe symbols, the phoenician alphabet, a donkey's leg, a bat's wing....)
Looked in help... and oh my god how lispy is this:
=IF(AND(B12 >=1986, B12 <= 2000), 1, 0)
How am i supposed to teach my frail elderly aunt to grok that?
It's elegant from the computer's point of view... it's an expression tree... i'd enjoy writing a program to parse that, i know i would... but teaching a regular human to read it, use it, debug it, maintain it, trust it, tweak it, share it, co-opt it, .... never.
This is a symptom of excel decimating the competition a long time ago and then stagnating. Yes: the dodo effect.
If excel were a version 2 product, I'd say "hey that's pretty good", but we're talking about version 11 here. They should've allowed cell functions like this: "= IF (B12 >=1986 AND B12 <= 2000, 1, 0) " long long ago. Operators... operators... not just functions. Lisp had it back in 1902. ah forget it. I wonder how wikiCalc handles cell functions? or spreadsheets.google.com?