Pretty PDF Annotation with OmniGraffle

Paul Brown @ 2006-07-09T07:15:13Z

The Mac OS Preview application is good for lots of things, but the annotation functionality is not that great, i.e., crappy. So, I decided to try OmniGraffle instead, and that approach has its pluses and minuses. On the plus side, OmniGraffle supports importing a multi-page PDF document. On the minus side, at least for me (OmniGraffle Pro 4.1.1), it doesn't actually import any of the PDF but just creates a document with the right number of pages...

Fortunately, Melissa O'Neill from the CS Department at Harvey Mudd College cooked up an app called PDFtoKeynote that will export a multi-page PDF document either as a Keynote presentation or as an OmniGraffle document. (Check out her rant at the bottom of the page that was inspired by Keynote's XML file format, ending with “And remember, in the time it takes to write a DTD, you could have written a grammar specification for a parser generator like Yacc or Antlr.” Amen, sister.)

Here's my recipe for using OmniGraffle for annotations:

  1. Use Preview to scale the document to 75% of its original size by changing the scaling factor in the page setup and exporting to PDF. This will give you a nice border to scribble in. (Or have the author(s) leave a big margin for you in their draft.)
  2. Open the scaled-down document in PDFtoKeynote, select the 612x792 dimensions, and save as an OmniGraffle document.
  3. Open the document in OmniGraffle. Hit CMD-A CMD-L (select all, lock) to lock all of the pages in place.
  4. Draw on the document with OmniGraffle.
(comment bubbles) 0 comments

The Kid Likes Krautrock

Paul Brown @ 2006-07-08T22:22:00Z

The kid does this bouncing thing when she hears music that she likes. (It's kind of like the way an average white guy dances...) If she's stuck in her high chair or in the car, she bobs her head to the beat to show approval. She has pretty good taste. She dances for the Beatles, for Bach, and for the musical interludes on NPR programs like This American Life or Marketplace. She also likes “indietronica” (a.k.a. modern minimalist Krautrock), which is nice, since I have plenty of it around and can get more DRM-free and on-demand from my favorite on-line music store, Bleep. The kid's picks in the genre include Boards of Canada, Plaid, Plone, I.S.A.N. (their rendition of some classic Satie is her current go-to-sleep music), b. fleischmann, and pretty much anything on Morr.

(comment bubbles) 0 comments

"worksforme" Is Not an Issue Resolution

Paul Brown @ 2006-07-08T00:00:00Z

Most of the bug/issue tracking systems that I've worked with have “worksforme” as a common end-state for a bug or issue, e.g., in Trac or Jira, but I'm opposed to its use. (I see bugs and issues as distinct entities.)

For a bug, “worksforme” is irrelevant. A bug is already a well-defined and specific flaw in the software, so either a fix is completed and tested or it isn't. If the faulty code is no longer in use, then the bug is “vacuouslyfixed” or “nolongerrelevant” or some such.

For an issue, “worksforme” is potentially applicable but still semantically incorrect. Valid and semantically consistent states in the issue lifecycle might be “expectedbehavior” or “usererror” or “needmoreinfo” or “unabletoreproduce”, and even so “needmoreinfo” or “unabletoreproduce” aren't necessarily terminal states. The “worksforme” is at best dismissive and at worst a flippant if not inflammatory message to the customer.

(comment bubbles) 1 comment

Post Hoc and Post-Graduate Work

Paul Brown @ 2006-07-05T23:00:00Z

I think that I emitted an audible snort when I read Paul Kedrosky's post about completion of graduate studies:

[...] people who don't finish doctoral degrees are people to watch. They have demonstrated deep intellectual curiosity by entering such programs, and they have demonstrated street smarts and a laudable willingness to ignore sunk costs by leaving before they get sucked into the vortex.

First off, this is blatant post hoc reasoning — “Successful people I know dropped out of graduate school, so people who drop out of graduate school are successful.”

Second, I think it's incorrect in addition to being poorly reasoned. I started my career at Berkeley with 68 peers and exited in a class of 19, and there are plenty of people I respect who finished and plenty of people I respect who didn't. Some left because of lack of ability, either in terms of raw intellectual horsepower or in terms of political savvy. (Political savvy matters more than you might think in staying supported, finding a strong advisor, promoting yourself and your work, and getting research signed-off by a committee.) Some left because of a change in personal circumstances, and some left because they saw an opportunity outside of academia in technology or financial services. If I may dabble in proof by example, two of the most successful extra-academic mathematicians I know, one trader and one entrepreneur, were successful in academia before leaving. Two of the most successful people who left without a Ph.D. did so after having completed (and even published) their research but made an informed and conscious choice about the academic career path.

I do agree with Paul that windmill detection is an incredibly valuable skill, but it's a much finer point than I think he's making. If it is really so disadvantageous to stay, then I question the base instincts of the person who got themselves into that circumstance in the first place.

Graduate work in physics, mathematics, chemistry, computer science, statistics, etc. is rocket science, but finishing is straightforward. Be disciplined. Choose wisely, put your head down, charge into the unknown, and look up to reassess frequently. Stick to your guns where you think you're right, demand thorough and valid reasoning, and aim for achievable and relevant ends. And, just like everything else, be at least a little bit lucky. Seems like good advice (and experience) for just about anyone.

(comment bubbles) 0 comments

ANTLR Tooling

Paul Brown @ 2006-07-05T21:00:00Z

I've been tinkering on a little language in Java with ANTLR v3 (still in beta, but desirable because it supports incremental parsing) as the parser generator, and so far ANTLRWorks is quite convenient as an editing environment for the grammar. (I'm also a fan and paid licensee of Prashant Deva's very nice ANTLR Studio Eclipse plugin, but it only supports ANTLR v2 for the time being.)

More approachable tooling for ANTLR will motivate fewer people to create XML languages, and the possibility to have out-of-the-box support for incremental parsing in a generic editing environment (e.g., Eclipse,NetBeans, IDEA, JEdit, etc.) should make writing a real parser a hands-down winner over using an XML parser and a ream of glue code as a crutch.

(comment bubbles) 0 comments

Seriality

Paul Brown @ 2006-07-05T01:00:00Z

The EIN for “Multifarious, Inc” showed up in the mail on Monday, so I can finally get bank accounts set up, file the 2553 (subchapter S election) with the IRS, and finish up the initial accounting work. This will be my second company, although it has an undefined purpose by design initially and won't ever use “multifarious” as a brand. The company is a financial tool and a shell in which a number of different business concepts can compete, with one or more successful ideas getting spun out into their own entities.

(comment bubbles) 0 comments

Feedburnerizing Typo, Part II

Paul Brown @ 2006-07-03T19:49:34Z

Last year, I wrote a rudimentary sidebar to display Feedburner feed links in Typo, but I didn't really get it to the point I wanted at the time. So, I took another fifteen minutes to rewrite the sidebar to work with the enhanced API, ditch the auto-subscribe chiclets, add links for category feeds, and muck with routes.rb. In routes.rb, I mapped a new set of feed URLs for Feedburner onto the controller that currently serves feeds, switched the existing mappings to a two-line controller that 301's to the Feedburner equivalents, and left holes so that people can subscribe directly to article-specific or tag-specific feeds if they wish. (The bonus in this approach is that autodiscovery gets taken care of for free, because the autodiscovery feed is one that gets 301'd.)

Just for grins, here's the two-line controller implementation:

class FbController < ContentController
  def redirect   
    headers["Status"] = "301 Moved Permanently"
    redirect_to "http://feeds.feedburner.com/Multifarious" +
      params[:type].to_s.capitalize + params[:id].to_s.capitalize
  end
end

Sometimes I think that the cornucopia of methods on some of the Ruby core classes (like capitalize on String) is overkill, and sometimes, it's convenient.

I hope that the enhanced setup is useful to any readers (since Feedburner should ensure QoS), but mostly I hope that it's transparent. (FWIW, NetNewsWire did the Right Thing and changed the feed URL for my self-subscription to the new one in response to the 301.) If for some reason you can't see this, let me know...

(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