Category Archives: Tech Talk

Some potentially life-threateningly boring discussion.

Introducing… Write-O-Matic 9000

So, over the years we’ve gotten many complaints about Writer.app’s name. Many many many.

So we decided to change it.

Write-O-Matic 9000
Write-O-Matic 9000

Introducing the Write-O-Matic 9000, available on the Mac App Store.

It’s our first experiment in paid software. For the low low price of $0.99 you can get all the functionality (or intentional non-functionality) of the original Writer.app, but support a small software shop by doing so.

It’s like the local, organic, sustainable version of getting and using software — the tool will still help you stay on track by focusing on the words to come, rather than the words past, and you’ll feel amazing for helping a very very small development shop.

As a blessed App Store app we can’t create a network location which will shut off all internet access for you any more, so we have a tool, which you should only have to run once, to do that, called the Empty Network Location Creator. It will guide you through the process of creating a very productive Network Location, or do it for you. Write-O-Matic 9000, like it’s predecessor, will try and switch to this location before you start typing, to help you stay focused and away from the big bad internet.

Dashboarding

Right, it’s been a while… how does this work again? Right. Anyway.

I’ve been following Mark Bernstein’s posts on building a dashboard in Tinderbox and enjoying them… and puzzling out how to implement them, in a lot of cases.

One thing I wanted to do, once I figured out how the example he gave in the post above worked, was not have to type in all the random words I wanted as notes in a note in my Tinderbox file.

So what I did was use Tinderbox’s ability to run command line to grab a random word out of the built-in system dictionary. I couldn’t quite get the perl one-liner working inline, so what I did was I created a file called randomWord and put the following in it:

#!/bin/sh

word=`perl -e 'open IN, "</usr/share/dict/words";rand($.) < 1 && ($n=$_) while <IN>;print $n'`

echo $word
I made it executable and dumped it in /usr/bin.
Then, in my Word of the Day note in Tinderbox, I added the following in the Rule section of the note (modified slightly from Mark’s example – visible when you right-click on a note and choose to the Rename menu item):
if($Date!="today") {
 $Text=runCommand("randomWord", "");date="today";}
And I was done. A daily word of the day from the built-in dictionary… now to just find the time to write in that Tinderbox file everyday…

Coding Horror: You’re Doing It Wrong

[From Coding Horror: You’re Doing It Wrong]

Jeff Atwood talks about templating engines (for generating html) being wrong… and I agree, with code like this:

<%foreach (var User in Users) { %>
<div class="action-time"><%= ActionSpan(User)%></div>
<% if (User.IsAnonymous) { %>
<div class="gravatar32"><%= RenderGravatar(User)%></div>
<div class="details"><%= RepSpan(User)%><br/><%= Flair(User)%></div>
<% } else { %>
<div class="anon">anonymous</div>
<% } %>
<% } %>

But, and I might be biased here, the WebObjects approach is much more pure, much more clean, from a markup vs. code point of view.

A quick crack at something similar in WebObjects would look like:

<webobject name="UserRepetition">
<div class="action-time"><webobject name="UserActionSpan"/></div>
<webobject name="IsAnonymousConditional">
<div class="gravatar32"><webobject name="UserGravatar" /></div>
<div class="details"><webobject name="UserRepSpan" /><br/><webobject name="UserFlair" /></div>
</webobject> <webobject name="IsNotAnonymousConditional"> <div class="anon">anonymous</div> </webobject> </webobject>

With a bindings file looking like this:

UserRepetition: WORepetition {
    list = users;
    item = currentUser;
}
UserActionSpan: SomeOtherCustomWOComponentToDisplayThisThingMaybe {
}
IsAnonymousConditional: WOConditional {
    condition = currentUser.isAnonymous;
}
IsNotAnonymousConditional: WOConditional {
    condition = currentUser.isAnonymous;
    negate = true;
}
...

Not too bad, eh? If you’re looking for separating your presentation from your code, well… I don’t think there’s anything better. But then, like I said, I’m biased.

It’s such a shame, with all the comments, that not a one has brought up the Old Lady…

Active Life Outdoor Challenge

Okay, so we got a Wii a few weeks ago (it might be two now).

And we’ve been playing Wii Sports after the kids go down to bed. And just today we got this:

Active Life Outdoor Challenge

Wow. Okay, so I may have ruined any (you know me) street gamer cred I may have had by just buying a Wii. But man oh man, was this one fun for our little lunchtime challenge session.

More than a quick half hour playing it will probably bring up a couple issues or problems, but since we have approximately a half an hour every six to seven months to play video games, well, it’ll take long enough before those are born out.

Mark Bernstein: NeoVictorian 1: Civilization and its Discontents

Interesting first shot by Mark Bernstein, with promises for more:
Mark Bernstein: NeoVictorian 1: Civilization and its Discontents

Why do I say we are unhappy?

• Our scientific conferences are filled with papers that focus on incremental improvements observed when asking unskilled laborers (whom we call “novices”) to perform office chores. We call this “usability”.
• Scholars interested in arts and humanities computing are strangely obsessed with box office and weirdly uninterested in making software, or making meaning.

I’m looking forward to more…