This is too cool. One of the nearby links in my GeoURL neighborhood is for the free WiFi at the Dana Street Roasting Company.
If I was a coffee drinker, I'd be all over that. As a blogger, I think that's great. What a neat application.
I've added a GeoURL meta tag to my blog's main index page and added it to their database. You can click the little green image to see who else is geographically near me.
What a fascinating way to literally find my blog neighbors.
Update: Coo! There is even an RSS feed for blogs near me.
Blogspace never ceases to amaze me.
I've decided to finally take advantage of the fact that I live near wine country. I got a bottle of Merlot from St. Supery (one of my favorite vineyards to visit in Napa) at the store a week or so ago. I've been having a glass with dinner at night. It's pretty good. They make a truely excellent desert wine too.
Yesterday I picked up a Cabernet Sauvingnon from Hess Vineyards. Amusingly, I drank a glass with a hamburger tonight. I don't know if that makes me a bad person, but I'm enjoying tasting a variety of wines. I like this one too.
It just occurred to me that the cell phone plan I've had for the last 2 years from Sprint is complete overkill for me. I've been paying roughly $35/month for way more minutes than I'd ever use. So I headed over to their web site to see what I could do about changing it. I was looking for a plan that gave me just a few minutes per month and charged me a lot more per minute for going over--figuring that I won't go over very often.
The selections on their web site were't impressive. The cheapest plan available was $30/month for way less stuff that I have now. So I called them up. And wouldn't ya know it. When you get them on the phone, there are several other unadvertised and much cheaper options available.
My new plan is $20/month and provides about 180 minutes per month. That's still more than I need, but at almost half the price it's much better. I almost went with the $10/month "vacation plan" they offer. It comes with 50 minutes per month and you pay $1/minute when you go over. That'd be perfect for me except that I cannot add on the paging service. And since I need some form of paging for work, it was best to just go with the $20 plan. I still get all the services their other plans have (loarge local calling area, voicemail, caller id, etc).
The best part is that there's no committment. Since I've been a Sprint customer for a while now (2 years or so), I can switch plans without any strings attached. If this one turns out to be too much, I could just ask work to get me a pager and pay $10/month for my cell. But I don't want to carry Yet Another Device.
That was time well spent.
As part of my personal switch and a desire to get a bit more organized (utilizing my Palm m105), I've been messing with Palm Desktop on the TiBook. It's actually a very nice piece of software, but I've been having sync problems. I'll update my TODO items on the Palm and then sync. None of the changes make it to the computer. So I add some calendar items on the TiBook and sync. None of them make it to the Palm.
Grr.
So I downloaded iSync and iCal from Apple and installed the iSync Palm conduit. Synced my iApps with the Palm. It worked on the first try. Changes seem to flow in both directions, as they should. This is most excellent. Not only do I have the ability to sync easily, I've added my iPod to the mix. This way I've covered if the Palm dies or the Mac dies or both. I'd just need to find another Mac somewhere.
Go Apple!
I stil need to keep the Palm Desktop around, of course. It knows how to completely backup the Palm.
Now, if only I can find a way to sync the phone book on my Motorol Timeport cell phone.
Well, while taking a break I decided to catch up on some blog reading. It seems that AmephetaDesk has freaked out. It uses hundreds of megabytes of RAM. So I fired up the latest version of NetNewsWire Lite to import my subscriptions. It fails. Well, it imports the first 33 but the other 90 or so are sliently discarded.
Grr.
Anyone know why? (Yes, I filed a bug reoprt.)
The file is here: http://jeremy.zawodny.com/tmp/bug.opml
This cracks me up.
I remember back in the mid-90s when Java first came out. I actually read the Java 1.0 language spec. The whole thing. It was cool. One of the folks who was telling me about it (just before I read the spec) endorsed it by saying "it's like a cleaner C++ with no pointers!" I've heard the "you don't make pointer mistakes in Java" bit a lot over the years.
Despite all that, I'm still able to convince Java to throw a java.lang.NullPointerException at me. Every time I get one (which is pretty often right now) I have to laugh just a bit because this is the a language without pointers.
Riiiiight.
Excellent. Another of my co-workers has caught the RSS bug. We chatted a bit about my experience in Y! Finance to help prepare him for the, uhm, "organizational challenges" he may face.
I hope it works out. I'm always looking for good airfares back to Ohio and points East.
Success! I understand a bit of the object/interface model I'm working with--at least enough to add some functionality and not have it blow up. It compiles and runs. I've sucessfully extended my first real Java code in a meaningful way.
I got a TrackBack ping that lead me to K's article about my and Java which I thought was interesting. (K is not to be confused with Kasia who has been called "K" on some occasions.)
Apparently the transition I'm going thru is expected--or at least not unusual. That's makes me feel a bit less dumb when I'm struggling with this stuff. The other reassuring experience is sitting down with the code architect and finding that his design and implementation now stumps him to a degree too--at least in a few places.
K recommends that I look at Eclipse (again) as an editor that will help me out. I may have to do that. A fair number of folks have suggested it.
The next part is what has me wondering out loud...
I'll venture to give yet another advice. When getting to design with Java, know your Anti Patterns. Patterns are important, but I've found most experienced developers already use them (even if they can't name them). Anti patterns, on the other hand, are a tar pit for even the most seasoned developer. And Java lends itself to grandious designs, full of anti-patterns.
Okay. I'm the first one to claim complete ignorance on the whole "design patterns" fad. I call it a fad because it seemed to come out of nowhere (as most fads do) and everyone was talking about it for a while. Now it's pretty quiet again. So whether or not it really is a fad, it seems like one to a person that never really paid any attention to it. (I just figured it was a lot of noise being generated by the C++/OO/XP crowd.)
I assumed that design patters was a formal way of teaching folks to design their stuff the right way. You know, "here's the way to implement a foo... and here's how you do a bar." Something one step (or level of abstraction) above STL or other popular component libraries.
But that's all me thinking out of my ass. Like I said, I never paid any attention. Why? I never saw a compelling reason to. I don't follow fads. And nobody ever presented a good "here's why you should learn this" argument. I just saw a lot of folks going after design patterns and getting all intellectual and impressed with themselves for being able to use a bunch of fancy new words for the things that probably weren't new at all.
And, well, they didn't teach "Patterns" in my computer science program. I wonder if they do now?
Anyway, now I find out there are Anti-Patterns. Okay, fair enough. They must be the opposite of Patterns. So I followed the link and read the page about Anti-Patterns.
It doesn't tell me anything. Well, maybe a little.
An AntiPattern is a pattern that tells how to go from a problem to a bad solution. (Contrast to an AmeliorationPattern, which is a pattern that tells how to go from a bad solution to a good solution.)
A good AntiPattern also tells you why the bad solution looks attractive (e.g. it actually works in some narrow context), why it turns out to be bad, and what positive patterns are applicable in its stead.
But beyond that it begins to feel really academic in a hurry.
Okay. So it's a collection of "you think you want to do this, but it's actually bad... here's why" stories and rules. Fine. Once you've learned the right way, you get to learn the wrong way too.
K's advice, then, is easy after you've gut thru all the OO babble. Learn the wrong ways to do things so that you can spot them. You shouldn't be re-inventing the same mistakes that others have.
That seems like good advice to me.
Ignorance is bliss. But not always. Sometimes it just makes you feel like you might have missed something important in all the hype.
So I've been working to understand the Java code I need to extend at work. And it's quite a bit of culture shock after being a Perl Hacker for the last... well, a long time. I've done Perl in some capacity now for over nine years.
Java folks love abstraction. Thanks to Kasia's blog entry on Interfaces, a bit of chatting with her, and reading up a bit, I now get interfaces. They're Java's answer to multiple inheritance. The provide a contract of sorts between various objects. And object that implements interface foo must provide (at least) all the methods defined in the interface. It's enforced at the language level. Very good.
The downside is that folks can get carried away, building so much structure that the real workings of a system end up obscured and hidden behind so many layers of indirection and abstraction. It makes my head hurt a bit. I've spent a bit of time manually drawing out some inheritance diagrams (anyone have a free tool to automate it) based on reading the code and associate javadocs.
I suspect that once I get my head wrapped around all the interfaces, I'll be far more productive and have a real understanding of the system's design.
The other thing I've noticed is that Java folks are big in infrastructure and re-usability. Really big. I'm starting to wonder if I'll ever see code that looks like someone wrote it to actually get some work done--without much regard for the random person who might want to sub-class it someday, maybe.
Don't get me wrong. This isn't bad, but it sure is different. It takes some getting used to. Instead of learning a new language and gradually putting it use, I'm forced to also learn several large frameworks along the way. It's a bit of a double hit. I feel like I've been thrust into a foreign country where I need to learn the language and function as a useful member of society--once with a lot of unwritten and complex rules that I just need to figure out.
Hey, I could have written about Apple's various MacWorld announcements but it seems like blogspace has that covered very well without me today.
I've been playing around a bit with MySQL 4.1's spatial indexes as I write chapter three (Indexes) for the book. Here's a quick demonstration in which I add three points to a table and then ask MySQL which points fall within the bounds of a couple polygons.
Before you play with this, you might want to read the OpenGIS spec. Since the MySQL docs don't yet cover this stuff, that's one of the better references.
First, create the table with a small blob field to contain the spatial data:
mysql> create table map_test -> ( -> name varchar(100) not null primary key, -> loc tinyblob, -> spatial index(loc) -> ); Query OK, 0 rows affected (0.00 sec)
And then add some points:
mysql> insert into map_test values ('One Two', point(1,2)); Query OK, 1 row affected (0.00 sec) mysql> insert into map_test values ('Two Two', point(2,2)); Query OK, 1 row affected (0.00 sec) mysql> insert into map_test values ('Two One', point(2,1)); Query OK, 1 row affected (0.00 sec)
Then ensure that it looks right in the table:
mysql> select name, AsText(loc) from map_test; +---------+-------------+ | name | AsText(loc) | +---------+-------------+ | One Two | POINT(1 2) | | Two Two | POINT(2 2) | | Two One | POINT(2 1) | +---------+-------------+ 3 rows in set (0.00 sec)
Finally, ask MySQL which points fall within a couple of polygons. (I'll omit the "mysql>" prompt to make sure things aren't too wide.)
SELECT name FROM map_test WHERE Contains(GeomFromText('POLYGON((0 0, 0 3, 3 3, 3 0, 0 0))'), loc) = 1; +---------+ | name | +---------+ | One Two | | Two Two | | Two One | +---------+ 3 rows in set (0.00 sec) SELECT name, AsText(loc) FROM map_test WHERE Contains(GeomFromText('POLYGON((0 0, 0 1, 1 1, 2 0, 0 0))'), loc) = 1; +---------+-------------+ | name | AsText(loc) | +---------+-------------+ | Two One | POINT(2 1) | +---------+-------------+ 1 row in set (0.00 sec)
Pretty cool, huh? That's really just the beginning. You can do much more impressive stuff with spatial indexes.
Wow. A Google search for "open source blog" ranks me pretty high. I'm not sure what to think of that. Makes you wonder how much they rank the incoming links compared to the page titles and h1/h2/h3 tags.
If nothing else, yeay for referer logs! :-)
In unrelated news, Sprnt's ever-flakey network is making it difficult to check my mail this morning. Grr.
As of today, I'm spending more time on my book and less time on almost everything else--including my blog.
I've set an agressive schedule for completing it and need to spend many hours each day on it from now until mid-April. If I do, it should be on shelves in time for the annual Open Source Convention.
I should really update the negelcted web site for the book, too. Maybe I could use MT to make it blog-like. Hmm.
It'll feel so good to be done with it. But there's a lot to get done yet.