MacBook, defective by design banner

Put the knife down and take a green herb, dude.

One feller's views on the state of everyday computer science & its application (and now, OTHER STUFF) who isn't rich enough to shell out for

FOR ENTERTAINMENT PURPOSES ONLY!!! Back-up your data and always wear white.
URLs I want to remember:
* Atari 2600 programming on your Mac
* joel on software (tip pt)
* Professional links: resume, github, paltry StackOverflow * Regular Expression Introduction (copy)
* The hex editor whose name I forget
* JSONLint to pretty-ify JSON
* Using CommonDialog in VB 6 * Free zip utils
* that hardware vendor review site I forget about is here * Javascript 1.5 ref
* Read the bits about the zone * Find column in sql server db by name
* Giant ASCII Textifier in Stick Figures (in Ivrit) * Quick intro to Javascript
* Don't [over-]sweat "micro-optimization" * Parsing str's in VB6
* .ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.InvariantCulture); (src)
email if ya gotta, RSS if ya wanna RSS, ¢ if you're keypadless
Saturday, December 13, 2014

Joe's Blog:

I can’t help but think of something I said to my brother a few years ago: If you don’t own a piece of the company you work for, you’re always getting screwed. It doesn’t matter if you’re a senior VP making 30 Million a year. You’re still getting a sucker’s share of the overall take.

"Screwed" is too harsh. If you don't think you're getting a fair wage for your work, find a better job.

But do remember that even with every fair exchange, both sides should think the other side is getting the short end of the stick. That's why trade occurs, you know? You think it's worth more than $2.50 a gallon to go 30 miles, and the gas station believes it's worth less. If it was the other way around, you'd never buy gas.

But there's an inherent inefficiency in each trade, and that's what Joe is speaking to. If you were sitting in the trader's seat, you'd be getting your gas at wholesale prices. That's a nicer place to sit.

Labels: ,

posted by ruffin at 12/13/2014 08:50:00 PM

What’s the issue with too much funding? Here are four key drawbacks:  
Pitfall 1: Solving every problem with non-scalable hacks

Shocking.  ;^)  I wonder if that's causal, though. It could be a start-up mentality (We've got to build features ASAP!) moreso than being flush with cash.

But then I suppose the point is that having too much cash from funding enables you to turn ye olde blind eye to hemorrhaging cash for overhead, kinda like when Sepia Labs over-funded Glassboard. Which makes you also wonder -- what does it mean when your start-up finally gets smart about overhead costs? What's driving the "maturity"? ;^)

Labels: ,

posted by ruffin at 12/13/2014 08:46:00 PM
Friday, December 12, 2014

Sometimes, as Don Jones alludes to in this thread, Powershell gets a little too clever in its attempts to "coerce" variables. In this case, it's the battle between ValueFromPipelineByPropertyName and ValueFromPipeline on a (string?) parameter.

I think the quick upshot is that, if you want what's promised by ValueFromPipelineByPropertyName, you need to roll it on your own.

See this, from said Don Jones:

Another option is to add an -InputObject parameter that accepts, ByValue, the exact object type being output by your first cmdlet. That way, it should bind without coercion. You'd KNOW you were getting that whole object, so you could grab the appropriate property internally. Make that part of a separate parameter set so that folks can do one or the other, but not both.

This is essentially how a lot of built-in cmdlets, like Stop-Service and Stop-Process, work.

Interesting discussion at that thread over whether the coercion is a bug (apparently not) and if that intended behavior is a good idea (not necessarily).


posted by ruffin at 12/12/2014 09:17:00 AM
Wednesday, December 10, 2014

Just a quick blog-by to say I'm pretty disappointed with SourceForge's closed source installer, used by FileZilla, that at least tries to put adware, etc on your box. I hate these things, first because once you start putting adware (I'm looking at you, Oracle's Java installer) I can't tell how much trust I should lose. What else are you trying/actually installing? And second, in my case (see image), I couldn't run what was supposed to be an offline installer b/c it couldn't pick up SourceForge's ad-of-the-day feed.

ARGH.  I thought online disk space was getting cheaper. Is SourceForge really still growing so fast it needs not just misleading ads on its download pages, but trust-compromising installers as well?

Anyhow, at Jotti, two hits from the FileZilla server installer:

2014-12-10 PUA.Spyware.XPCSpyPro​
2014-12-10 Win32/InstallCore.TM potentially unwanted

Not sure how bad that is, but I'm looking for another installer at this point.

Labels: , ,

posted by ruffin at 12/10/2014 09:04:00 AM
Wednesday, December 03, 2014

Blogger is going to mangle whitespace again, but here goes... Yes, you can set up multiple Tags in Pester Describe blocks by passing arrays.
I should probably submit a pull for the Pester Wiki, just for fun (though not with this incredibly helpful code snippet. That'd be overkill).
By the way, am I the only person who sees a line like `Passed: 3 Failed: 0 Skipped: 0 Pending: 0` and often scans too quickly, seeing `3 Failed`? Wonder if `Passed: 3 - Failed: 0 - Skipped: 0 - Pending: 0` would be better. Otherwise, I'm liking 1.) Pester far too much, 2.) the time to write my PowerShell code with tests. Too many bugs found now that I'm doing TDD (okay, admittedly, here that's probably "Test Driven Debugging"), which is both good and depressing. ;^)

Describe -Tag "spam","ham" "testMe" {
    It "spam and ham" {
        $true | Should Be $true;
Describe -Tag "spam" "testMe" {
    It "spam only" {
        $true | Should Be $true;
Describe -Tag "ham" "testMe" {
    It "ham only" {
        $true | Should Be $true;
PS> Invoke-Pester
Executing all tests in 'C:\something'
Describing testMe
[+] spam and ham 93ms
Describing testMe
[+] spam only 90ms
Describing testMe
[+] ham only 65ms

Tests completed in 249ms
Passed: 3 Failed: 0 Skipped: 0 Pending: 0

PS> Invoke-Pester -Tag "ham"
Executing all tests in 'C:\something'
Describing testMe
[+] spam and ham 137ms
Describing testMe
[+] ham only 66ms

Tests completed in 203ms
Passed: 2 Failed: 0 Skipped: 0 Pending: 0

PS> Invoke-Pester -Tag "spam"
Executing all tests in 'C:\something'
Describing testMe
[+] spam and ham 71ms
Describing testMe
[+] spam only 61ms

Tests completed in 132ms
Passed: 2 Failed: 0 Skipped: 0 Pending: 0


posted by ruffin at 12/03/2014 09:21:00 AM
Monday, December 01, 2014

Pretty good answer from SO):
function A {    
    Write-Host "I'm calling $($functionToCall.Invoke(4))"

function B($x) {
    Write-Output "Function B with $x"

function C {
    write-Output "Function C with $x"

PS> A -functionToCall $function:B
I'm calling Function B with 4

Labels: ,

posted by ruffin at 12/01/2014 12:04:00 PM
Wednesday, November 26, 2014

So we all know how to run JSLint from Node, but what if you want to use Firebug or something to step through? The version Crockford uses on is minimized and includes a lot of overhead you don't need to run locally ( It's obviously not that difficult to set up.

Here's the easy version. I'm not sure how well the formatting will keep with this email-to-blog post, but hopefully I'll eventually remember to return and clean it up.

So save the below into index.html and knock yourself out. No jQuery or nuttin required.

Gosh, I hope this post works. HTML always worries me with Blogger. It's anyone's guess how it'll parse it this week.

        <script src="jslint.js"></script>

            function jslintalizeMe()
                var i, divOut, errs, errsMsg = "";

                divOut = document.getElementById("errors");
                divOut.innerHTML = "";

                if (!JSLINT(document.forms[0].elements[0].value))
                    errs = JSLINT.errors;
                    for (i=0; i < errs.length; i++)
                        err = errs[i];
                        if (null !== err)
                            if (undefined !==
                                errsMsg += "Error: " 
                                + err.code 
                                + " -- line " 
                                + err.line 
                                + " char " 
                                + err.character + "<br />"
                                + "    " 
                                + err.evidence + "<br />"
                                + "    " +
                                 err.reason + "<br /><br />\n";
                                errsMsg += err.reason;
                    divOut.innerHTML = errsMsg;



            <textarea rows="24" cols="80"
                placeholder="// Paste quality code here"></textarea>
            <br />
            <button onclick="jslintalizeMe();return false;">JSLint</button>

        <div id="errors"></div>
Look, that's ugly, I get it. But it's the easiest way to get JSLint running in a good, easily Firebuggable fashion. Enjoy. ;^)

Labels: ,

posted by ruffin at 11/26/2014 10:52:00 AM
Wednesday, November 19, 2014

Listened to Justin Williams on Release Notes ( talking about why he closed up Glassboard, and it was interesting enough I started looking at his blog, Carpe Aqua. Found a link to Ariel Michaeli (though the href was busted and you had to hack a trivial amount), who linked to Mark Suster, who said...

[Your investors] are not rooting for you to fail – please don't misunderstand me on that. They would prefer you always move up-and-to-the-right. I'm just saying that great progress with no revenue and you needing more money isn't always at odds with a VC's interest. Sorry to give away the game.

So that's clever. Having finally worked in a startup for about two years, that quote sounds awfully accurate. The point of Suster's piece is to slow down the bleeding, and, in a sort of Moneyball-ian "don't get outs" fashion, suggests that you need to keep your company alive, because it's in being alive that allows it to find good fits. The slower you burn money, the more chances you have to find your fit.

Actually, that's *exactly* the Billy Beane Moneyball angle. Playing defense and being fast is great, but what matters is runs. And what makes runs is continuing an inning. And what continues an inning is not getting outs. That's what you organize your team around.

Here, Suster's idea is to keep the inning going by making, well, income, duh. The more you depend on outside investment to create "runway", the more of your company's soul you're going to have to sell. As long as the growth can be turned into profit -- the way so many assume Amazon can at any moment, just at a much larger scale than your startup -- they're happy to keep banking what was your equity until you (plural, this time) flip the switch.

If you'd balance growth with income, you stopping hitting into triple plays. (Here's where the metaphor breaks down, of course. There's no way to sell part of your team to get more innings in baseball...)

Money is an interesting tool, and incentivizes fascinating behaviors, not all of which are exceptionally admirable.

Labels: ,

posted by ruffin at 11/19/2014 12:28:00 PM

Support freedom
All posts can be accessed here:

Just the last year o' posts:

Powered by Blogger