Friday, January 30, 2009

blogging about business, for once

Today my employer benefited through me, but almost despite me.

We're facing an exhausting slog through yet another incarnation of the Air Force's process for getting permission to continue to operate an IT system. My (Air Force) boss had heard somehow that Mark, one of my fellow employees at Intellitech, was shepherding some projects through this process, and asked if he'd be willing to give some advice. Mark came and spent a couple hours giving some desperately needed information, despite being warned that my boss has no prospects of funding to take on additional contracting help.

Everyone there was enormously grateful, because living, breathing survivors of the process are almost unheard of, and the available training material is of very little use. What's more, my boss had made a last-minute impromptu invitation to a friend whose project is also facing the process; she was just as happy to attend, and just might have the funding for some help. And everybody there is going to spread the word that they now know a source of much-needed information on this process.

The problem? I was passive. I hadn't thought to suggest to my boss to tap Mark's experience; good thing he knew about it and thought to ask. I hadn't thought to suggest inviting others to the meeting, either; again, credit to my boss. I really need to be more alert to this sort of thing.

The other problem? If Intellitech does end up with more work thanks to today, it's the kind of hellishly bureaucratic work that makes you want to chew your leg off to escape. Great for the company bottom line, but a blasphemous waste of a living human soul.

Tuesday, January 27, 2009

complexity

Fire up a program like Eclipse or Visual Studio and start a new project. Blam! It creates a dense forest of code files, text files, configuration files, XML files, directories, subdirectories, assistant directories, deputy directories, acting deputy subdirectories, and special liason to the ad-hoc subcommittee directories.

Java and C# people seem to think this is great. "Look at all this work the tool does for you!"

I disagree. "What IS all this stuff?" I wail. "What's it for? What's it doing? My program is already hopelessly complex and I haven't even started writing it yet! Guido, take me away!" A tutorial may tell me to start on one file and ignore everything else, but that's completely unsatisfying psychologically. I feel like I'm learning nothing because I'm at the mercy of so much auto-generated stuff I can't even hope to understand.

This, I think, is my biggest barrier to learning the "enterprisey" languages.

I admit, starting a project in TurboGears or Django does something kind of similar, and I tolerate it there. I think that's because I know Python well and can handle a limited amount of temporary mystery. It's when I'm trying to dip into a brand-new language and a brand-new environment that I want a small, digestible bite of mystery to get my mind around.

[ADDENDUM]

I'm beginning to think that what might get me over this hurdle is a C# tutorial that specifically avoids Visual Studio and similar IDEs... that gives projects and examples in old-fashioned code files in a text editor - and as few files as possible - even if that seems crazy to VS junkies, if it means the examples are a lot more painstaking and a lot less impressive. But that's what I need - I need to feel like the code I'm writing really encompasses the problem, isn't just a little flourish atop a vast understructure that I didn't write and don't understand. Then, after a while of that, I can start dipping into the IDEs and perhaps appreciate the code generation, rather than dreading it.

Any pointers to a C# tutorial along those lines would be most welcome.

Friday, January 23, 2009

Reinteract

Shortly after semi-finishing pyparsing_helper, I realized that it's really not needed, because there's a tool called Reinteract that can fill the same role, plus much more.

Reinteract is a graphical Python session that lets you tinker with your code at any point and get an immediate recalculation. That's what pyparsing_helper does, too, but pyparsing_helper is specialized for pyparsing use, whereas reinteract is suitable for any Python. Here's reinteract applied to a pyparsing example.

Reinteract is also more sophisticated and versatile, so I'm afraid pyparsing_helper's short time in the sun has been eclipsed. I'm happy to have found this new tool, though!

Monday, January 19, 2009

New Year's Resolution (blogging while angry)

From now on, before spending any significant money on anything, I will test their customer service phone number. If I cannot get to a human being who is reasonably helpful, I will not become a customer.

Understand, I'm all for saving money by automating customer service where possible. But many companies (AT&T Wireless, for example) now make ad hoc, human-interaction support literally unavailable. A demonstrated intent to avoid customer contact is a sign of a bad business partner, and I will not support such bad business practices anymore. (steam, steam, steam)

Friday, January 16, 2009

coworking for the rest of us

Ah, so many ways to learn from each other.
  • Formal conferences and meetings. "Eyes-front" presentations.

  • Getting together with the geeks for chat.

  • Unconferences and open spaces. Lots of potential for multi-directional learning, yet shaped around specific topics.

  • Sprinting: gathering to code together with people outside your usual circle on specific projects. GiveCamps.

And yet, there's a new one: hanging out and geeking out with other geeks. Programming with, or around, people who aren't your usual co-workers. Like sprinting, sort of, but on no predefined topic. Questions, advice, and ideas bubbling around unpredictably while you code.

That's basically what the CodeJam at CodeMash was, and I loved it. Even if you already work every day with a wealth of fiercely creative, inquisitive, knowledgable co-workers who are delighted to pitch ideas into your project - and not all of us do - it's still a benefit to mix it up with some new minds.

That happened just a week ago, yet suddenly, I'm seeing it everywhere. In Cincinnati, they're doing an evening called "bitslingers". In Ann Arbor, they're doing a daylong Code Retreat.

Solo from-home workers developed this a while ago; they call it "coworking". Now we cubicle monkeys are getting some chances at it, too. I'd love to see this carried to its logical extreme - a custom of getting out to work in new places with new people, say, one day a week. I think the payoff would be enormous.

Sunday, January 11, 2009

pyparsing_helper

I'm back from CodeMash!

I got a lot of great ideas, and I especially liked Wednesday's CodeJam, where I started building pyparsing_helper. Hacking on code while surrounded by sharp people to absorb energy and advice from is a great way to get things done! I finished it on the way home, so pyparsing_helper is officially a child of CodeMash!


This is what I had in mind when imagining "Kodos for pyparsing" last week.

One big bad fly in my ointment: pasting into pyparsing_helper isn't working. I don't know why. That's top priority for fixing for v0.1.1; I wonder if I'll have to switch out of Tk to get it to work.

easy_install pyparsing_helper

[EDIT:] Paste does work under Windows, and it looks like it's an inherent Tkinter flaw... what's up with that? Tkinter's only been around for, oh, 15 years or so - and this core function is still unfixed? Maybe that's why all the cool kids quit using it years ago.

[EDIT #2:] OK, paste did work in *nix, but only in its Shift-Insert variety. pyparsing_helper 0.1.1 (available now) makes the more familiar Ctrl-V pasting available, too.

Monday, January 05, 2009

new baby

Items shipped on December 30, 2008:
Delivery estimate: January 6, 2009
1 package via USPSTrack your package
  • 1 of: One Laptop per Child XO Laptop (Give a Laptop, Get a Laptop)
    Sold by: OLPC Foundation (seller profile)
Before or after I leave for CodeMash? I MUST KNOW!

Well, even if the new baby doesn't arrive on time, I'm very much looking forward to CodeMash. It's very hard to decide what to do, though, particularly with the Precompiler day. I like the CodeJam idea best, but I'll have to see if the particulars of the project appeal to me - and I'd want to do it in a platform I don't yet know, and I'm not sure whether I could be effective that way. And a whole day of absorbing Ruby from Jim Weirich would certainly be an entertaining alternative. But maybe I should do the .NET tutorial... knowing some .NET would really help me get going in IronPython. Decisions, decisions... what a nice dilemma!

Friday, January 02, 2009

domain name woes

I bought the domain name for nerdstogether.org from 1and1.com, but I'm now realizing that domain name ownership isn't as straightforward as I thought.

Apparently, the Domain Name Servers of the world have not been alerted that nerdstogether.org now points to 66.35.48.8, the IP address where I'm hosting nerdstogether. Instead, they believe that it points to a server at 1and1, which then is responsible for passing the request along to my machine.

1and1 offers two choices for how this can be done.

HTTP forwarding

This simply sends the user's browser off to 66.35.48.8. There are two drawbacks:
  • The browser's URL bar shows 66.35.48.8; "nerdstogether.org" would be much prettier.
  • 1and1 truncates the URL before sending it on; this makes RESTful access impossible, since http://nerdstogether.org/dayton goes to 66.35.48.8/ instead of 66.35.48.8/dayton

Frame redirect

In this case, 1and1 hosts a webpage which simply contains a single frame; the contents of this frame are requested from my server. This looks better, since the user's URL bar continues to display "nerdstogether.org". Furthermore, 1and1 does attach the remainder of the requested URL, so RESTful access remains possible.

The problem? I'd like to provide not just visible HTML access from this domain, but a JSON web service as well. JSON data should be returned raw, as "content-type: text/json", not as an HTML frame embedded in an HTML webpage. No web service consumer can digest that! So I need to distribute a separate URL, with my raw IP address, to web service consumers.

Virtual servers

Finally, both HTTP forwarding and frame redirect also make virtual servers impossible. I'd like to serve multiple unrelated websites from my machine, which I can do by configuring my webserver to react differently based on whether the URL requested was for nerdstogether.org or for a different domain name. Unfortunately, either of 1and1's options remove this information from the request before it is passed along to my machine; my machine only sees a request with its IP address. The fact that nerdstogether.org was the domain name requested is not passed along.

It's still possible to host multiple sites, by specifying a separate directory within 66.35.48.8 for each separate domain. Virtual servers would enable a cleaner separation between sites, though, with no possibility of navigating back up the directory hierarchy.

As far as I can tell, there is no ideal solution for me, aside from buying my domain name from a different provider, one who would actually propagate my domain name ownership out through the worldwide DNS network. I don't even know what the term would be for that kind of "full ownership" of a domain name.

This is my first trip through this wilderness, and I'd be delighted if I've missed some better solution that someone wise can point out to me.

Thursday, January 01, 2009

nerdstogether.org

Happy New Year! And a happy new name for The Application Formerly Known As Geek Event Aggregator (or geekeventfinder). Say hello to

nerdstogether.org

It's your one-stop resource for finding out, "How can I get together with some nerds in <insert place here>?"

nerdstogether.org comes with an exciting new feature: it actually works now. No, really. Go try it.

I achieved this by using some cutting-edge technology called "CGI scripting" and a "database". The problem of gathering the data has been pretty much solved for literally years, but I kept trying to find Web 2.0-ish solutions for getting the data to you: Oracle Application Express, Google Calendar, Google App Engine. All of them seemed great at first, but eventually frustrated me to tears.

The one nod to Web 2.0 is the very helpful use of Yahoo and Google web services for interpreting location information.

Anyway. I was so proud I actually bought a domain name for it. So go use and enjoy, and suggest missing events for it, and I'll see you at the VIC-20 club in Kalamazoo.