Administrivia

Paul R. Brown @ 2008-01-02T20:03:19Z

I've switched my publishing engine from Typo to a home-brew platform called "perpubplat" which appears to be stable enough (i.e., better than Typo) but will remain a work in progress. (I'll post more on perpubplat later; I'm happy to share source code with folks and will post Darcs repository information once I've cleaned things up a bit.)

Of relevance to feed subscribers (and perhaps how you ended up here):

  • RSS feeds are no longer provided in any form. What would have been a request for an RSS feed directs to an Atom feed containing this post.
  • As a corollary of the non-existence of RSS, categories (as semantic artifacts of RSS) no longer exist. Instead, you can pick out a relevant by-tag feed, e.g., for posts tagged Haskell, Java, or entrepreneurship. (For any by-tag or by-date view, there is an associated feed available via autodiscovery.)
  • Comment feeds by article internal identifier are no longer supported. (Comment feeds by article are supported with a different, permatitle-based URI; check the autodiscovery links on a single article page.)

Of relevance to visitors:

  • For the time being, new comments aren't supported directly on this blog, but that shouldn't stop you from commenting on your own blog or posting to a community site like Reddit or DZone. The plumbing for comments (as well as trackbacks and backreferences) is present, but I haven't decided how I want to restrict content and control spam yet. Historical comments and trackbacks are present.
  • I've made some effort (i.e., using FeedValidator and xmllint) to ensure that specification compliance is provided when advertised, including cleaning up the content of older posts, but please let me know if something falls short.
(comment bubbles) 0 comments

Phishing Without a Pole

Paul R. Brown @ 2007-12-19T09:15:26Z

The following phishing email showed up in my GMail inbox today:

Even if I was to be taken in by the ploy, there is no web link or other way to submit the form. Maybe I'm supposed to reply to the email? Too bad it's not as amusing as other stupid criminal tricks.

(comment bubbles) 0 comments

Scripting for the Cloud

Paul R. Brown @ 2007-12-18T20:50:59Z

Paul Fremantle posted a brief analogy between classic UNIX pipelines and scripting for web services, and I posted a comment about some work going on with Ode that deserves a bit broader audience. Matthieu, Tammo, et al are working on a Javascripty language called SimPEL that maps to BPEL. They're making good progress, and the straw man examples are looking good, both for terseness and for legibility. It's still a way off, but it's on its way.

XML languages are known to be awful (hard on the hands, hard on the eyes, underspecified by document- or data-oriented schemata), and an orchestration DSL that maps onto BPEL has been on various wish lists for a while. (See, e.g., Brian's thought.) WSDL and XSLT should also be on the chopping block, and there are at least a few general approaches to abbreviating an XML syntax from which to draw inspiratiom. (See., e.g., RELAX NG compact syntax and Tom Moertel's PXSL.)

(comment bubbles) 0 comments

No You Should Not Pay Your Investors' Legal Fees

Paul R. Brown @ 2007-12-17T21:41:41Z

I noticed a post over on Venture Hacks that suggests that a company absorb an investor's legal fees (via dilution) as part of a financing, and while some of the advice is sound, I've got the opposite opinion. In no particular order, here are my thoughts:

  • First, cash on hand is not the same as cash obtained as part of a round of funding. Depending on the structure of the round, the cash from funding probably comes with liquidation preferences and various other privileges, meaning that the investor receives a multiple of their investment before lower classes of stock participate in the proceeds of a sale. The exact impact on the bottom line for existing investors might end up being small in the event of an exit at a significant multiple, but it will take a big bite in the event of a less favorable exit or a down-round in which anti-dilution provisions kick-in.
  • If you get sob stories from your potential investor about their level of planning or unruly limited partners, run away. If you get any sob stories from them at all, run away. Fast. A weak member on a small team can ruin you, let alone someone with a Board seat and a strong set of additional rights and privileges.
  • As an entrepreneur, you need to be a revenue animal and a cash bastard. You should be repulsed by the idea of letting someone else spend your money (present or future) on counsel (or anything else!) without your direct oversight.
  • As a potential investor and subsequently as a shareholder, the investor's interests and the company's interests are not equivalent. It's improper to spend the company's money (cash or stock) protecting the interests of any third party or single class of shareholder. It would be legitimate to spend the company's money on generic offering documents, but not counsel for a third party reviewing or amending those documents.
  • It's your obligation to run a tight ship, and it should be easy (ergo quick and inexpensive) for a potential investor to review your accounts, minutes, and agreements.

Finally, it rubs me the wrong way and sets off various alarms about being not quite correct. In any negotiation, each party should bear their costs, have counsel directed to protect their interests, and when they're all done, the dollars and cents should get recorded in their proper places.

(comment bubbles) 0 comments

Move, Rename, and Ne'er the Twain Shall Meet

Paul R. Brown @ 2007-12-12T20:27:05Z

The mv command in Unix has some subtlety to it in that it either moves or renames the file in question (never mind that it uses rename(2) to do it), but that subtlety is a good thing in that mv usually does what you expect it to do.

Not so with IntelliJ. I use IntelliJ for Java development, and while I do occasionally dally with Eclipse or Netbeans, I always come back. Anyway, with a bunch of packages to rearrange across a multi-module project, I tried using the "move" refactor, e.g., to change com.foo.x to com.foo.y. Contrary to my expectations, this produces com.foo.y.x, but not noticing immediately, I ended up with goofy package names like com.bar.impl.impl.impl. ((in classic Monty Python falsetto) That doesn't have much impl in it...) Grrrr.

A little commandline action will get things cleaned up in terms of file layout, e.g.:

find src -type file \
| sed -E '{h;G;s:\n: :;s/(impl\/)+/(impl\/)/;}' \
| xargs -n 2 mv

The first part of the sed program is a recipe for echoing the input as the first hunk of the line.

(comment bubbles) 0 comments

Just a Scoatch More Memory

Paul R. Brown @ 2007-12-12T20:23:05Z

After I saw post about a WTF-worthy comment a while back, I had meant to post this gem, which I'll paraphrase from memory:

foo *f;
f = (foo *) malloc(sizeof(foo)+4); // seems about right

The comment was the tip that code elsewhere was abusing the allocated memory, and the developer had added the padding to avoid segmentation faults...

There were quite a few similar gems lurking around in that particular app, like a catch block wrapped around printing "Whoops!" to stdout, which wouldn't be so bad if it hadn't been cut-and-pasted all over the place, making it difficult to determine where a "Whoops!" on stdout for the app actually came from...

(comment bubbles) 0 comments

No Fame for Violence

Paul R. Brown @ 2007-12-06T20:50:57Z

From the CNN story about the shooting in Omaha:

"He basically said how sorry he was for everything," Maruca Kovac said of the note. "He didn't want to be a burden to people and that he was a piece of s--- all of his life and that now he'd be famous."

(Emphasis mine.) I don't understand why names and pictures and other information about killers and criminals is published by the media, as it effectively rewards the behavior. Remember the victims, but let murderers die in anonymity.

(comment bubbles) 0 comments

All Posts contains 399 items in 57 pages of 7 items each:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57