Hey kids, it’s Sysadmin Appreciation Day! Go out and give your admin a hug, a smooch, and buy ’em lunch!
I have mad appreciation to all my co-administrators working on the Greater Homeport Server Cluster. We have a lot of users, a lot of sites, and do a lot of good stuff. Because of the purely volunteer hard work done by these people, we have happy users, stable hosting, and very very few outages.
Super-duper mad props to…
Dwight Ernest – owner of ‘msb’ and ‘msb2’ – he helps keep our network glowing.
Mort – he of the ever-patient Movable Type hackery and general “No problem, I’ll take care of that” approach to stuff.
Tim Pierce – a former demigod of Usenet, now good friend and one of the first in the line of fire when Stuff Breaks. I, sir, salute you.
The Greater Homeport Servers can’t function without help from all the community members. I want to also send thanks to others who have done a ton of help with technical and content related stuff…
Lisa Holsberg – while not technically a sysadmin, Lisa is our primary Movable Type geek, and we wouldn’t be able to run our blogs without her help.
Catya Belfer-Shevett – When I first set up Drupal for Arisia, Cat jumped in and is now a Mad Drupal Goddess.
Luwenth – Luw owns the machine(s) that function as Homeport’s secondary DNS servers out in California, and has jumped in and helped several times when we’ve had Issues. Thank you!
Nathan Mehl – I’ve known Nathan for many years, and have an enormous amount of respect for him. Right now, Nathan runs a machine that helps keep our IRC network stable. Thank you!
Picker / Selector for GSM phones?
So I’m getting ready to make the jump away from Verizon, and it looks like we’re going to be going with a GSM-based provider. I’d like to see a picker / selector for GSM phones that lets me pick phones based on criteria.
Anyone know of such a beast?
My baseline criteria is:
- Does not run a Microsoft OS
- Is not an iPhone
- Is not a PalmOS Treo.
- Has a full Bluetooth stack – including A2DP, various HID profiles, etc
- I’d prefer a full keyboard, but I can wiggle on that
- Music support, with open formats (I can put my own MP3’s on it)
- Very good Bluetooth ‘modem’ capability. Want to use it as a data gateway for my laptop
- At least a few games. The only game I really play on my Treo anymore is Sudoku. I think that may be a dead requirement on any replacement device.
My current top contender is the Nokia N95-3 (the North American version). Pricing is down to about $300 (the -3 is a slightly ‘older’ version, but has a removable Micro-SD slot – pretty good for loading music and other stuff on it), but I want to make sure I’m not missing out on something. (Oddly, I can’t find that price on Amazon now. I’ll keep looking).
One possibility is going with a fairly cheap, capable Bluetooth enabled handset now – no music, games, etc, but able to function as a phone and a GSM modem, and look toward an Android based solution in the next 6 months.
Pointers?
Back in the Real World
I’m on my way back from camping this weekend. Sitting here in the Pittsburgh airport, it’s sort of odd having the trappings of modern society all around me again, having spent the last 4 days and three nights sleeping in a tent (on the ground, no air mattress), and hiking through knee-high grass several times a day to socialize and get food.
There’s much to talk about, all sorts of geeky interesting things to go on about camping, food, waste, economy of living, and social interactions, but for now I’m just going to enjoy the air conditioning and modern plumbing.
Eclipse XML Validation can BITE ME
There are times when I want to take an axe to Eclipse. Today’s particular grief is due to the XML editor. There are numerous faults with it (one of the biggest is that it ‘captures’ the control-pgup and control-pgdn keys into local tabs, so if you have an XML file open, and you use the keystrokes to navigate through your files, when you switch tabs to an XML file, the only way you can view a different file is to click on it), but todays stabbity-stab comes from the validator.
Eclipse shows you errors and warnings in realtime. Usually, they’re fairly accurate. Today I was editing a struts.xml file, and was getting a validation warning. When Eclipse senses a problem with the XML (based on it’s DTD), it tells you “this XML file fails the DTD validation”.
But it doesn’t tell you where.
This completely baffles me. “Somewhere in the following several hundred lines of XML code, there’s a problem. But I won’t tell you where or what it is.”
Off to the W3.org Validation service. I fed the XML file into it, and lo! A detailed description of the problem, and where it was:
Line 26, Column 39:
document type does not allow element "include" here.<include file="struts-editevent.xml"/>
Was that really that difficult?
Gnar.
Gotta Love Americans
Or maybe it’s just New Englanders.
Shall we run down the list here?
1) Big ass SUV.
2) Parked as annoyingly as possible (I suppose they could have gone diagonal and covered 3 spots)
3) Bike rack that sticks a good 3.5 feet out into the lot (empty)
Understanding that at one point I actually owned a Suburban just like this, I think I can safely say I at least had some clue how to park it.
Giving Back – Working for OLPC
It’s no secret I’ve been a huge fan of the One Laptop per Child project. After all, I contributed to the Give One Get One project, and obtained a unit for my son Zach, which meant a child elsewhere in the world received a laptop as well.
Following this success, and watching Zach teach himself Python and learn basic programming skills using Scratch, I found myself wanting to do more to support OLPC. I don’t have bottomless resources to throw at the project, but I still wanted to contribute somehow.
After getting to know some of the project folks, and after some back and forth, I was admitted to the OLPC Support crew, and now am an official OLPC Support Volunteer.
What this means is when I have some spare time, I log into the support system and answer questions from folks all over the world about OLPC, the laptops, and the applications. I’m a volunteer, so I’m not paid, but I feel that I’m giving something to the community. I can answer questions and communicate clearly, there are people who need help. For the most part, these are people who, like me, feel the OLPC project is important, and are willing to contribute to it, and get a unit of their own to boot. I’m proud to help them out as much as I can.
In 4 days, I’ve handled about 38 problems. That’s 38 people who are a little better off with their machines than they were before.
This is one of the few true volunteer organizations I’ve ever committed myself to. I’ve always given financially to causes I believe in, but when it comes to manning booths or spending weekends “lending a hand”, it’s usually been isolated to things like SF and gaming conventions.
This is bigger. This is important. This means something.
And I’m helping it be successful.
It feels good.
Cohousing Affordable Housing Open to Qualified Buyers
I’m signal boosting this message a bit. Our cohousing group (collectively Sawyer Hill Ecovillage, consisting of my group, Mosaic Commons and a second community, Camelot Cohousing) have just completed the state-mandated lottery for offering our affordable units to qualified buyers under the 40b Affordable Housing law. Because we did not have a full slate of applicants, the process is now thrown open to anyone who qualifies within the 40b limits.
If you’ve been interested in our project, and have held off because of the daunting numbers, now may be a perfect time to look into it. These units are being offered on a first come, first served basis.
We have 40b units available priced between $136k and $176k
The 40b limitations are:
- Income limits between $46k/year and $76k/year, depending on number of family members.
- Assets no more than $75k
Note there are a variety of exceptions for seniors, single parents, etc. See this web page for details.
We also still have a few market rate units for those families
who don’t meet the limits for the affordable units, so come
check us out: http://www.sawyerhill.org.
Maine Fireworks!
This past weekend I was up with the Fam in Maine doing our traditional July 4th joy. A lot of fun to be had – the weather cooperated (not too hot, not too cold), we got some good time on boats and ate gobs of food.
Thursday night we went to Sanford, ME, as we usually do, and saw the fireworks show there, alongside probably 5000 other people all camped around a lake. As always, it was a great show.
This time I decided to try and photograph it. For the camera geeks, I used my 50mm lens, F-stop all the way open to 1.8. ISO was wobbling around, but I settled down to a very low 200. I was worried it wouldn’t be fast enough, but with a 1/15th second shutter speed, it worked out fine.
The gaping F-stop meant my depth of field was measured in feet, even 300ft away from my subject (the fireworks themselves). I could not autofocus for obvious reasons, so with a lot of experimentation, I found “All the way out, backed off about 10th of a turn” seemed to be the ‘sweet spot’ for focus.
As usual for these sorts of shoots, I shot a LOT. 320+ images for 1/2 hr show (filled my 1gig memory card). From that, I ended up with less than 50 useable images.
I may take a handful and postprocess further into a nice gallery, but this was a good first attempt. The one thing I didn’t expect was the reflection you can see in some of the brighter images. What I’m guessing it is is the image reflected onto the UV filter off my primary lens. I should have thought to remove that filter for such bright shots, but that’s the joy of experimenting, eh?
Anyway, enjoy!
Jumping the RSS train Again
About 3.5 years ago I changed my web surfing habits and went totally into “RSS Aggregator” mode. Initially I was using the Sage RSS reader, a Firefox plugin. It worked well, and with Google Browser Sync I was able to sync my views. Or so I thought.
The syncing of my feeds never actually worked too well, so if I finished reading articles on one machine, when I sat down at the other, I couldn’t be sure if the ’18 new articles’ really meant 18 new articles. Also, Google Browser Sync is being end of lifed, so I need to find an alternative.
For a while, I switched to using Akregrator for KDE. All in all, I found it a fantastic tool, very fast, easy to use, and well integrated into KDE. Alas, I don’t always sit at my desktop machine, and really started pining for a way to stay synced on my feeds while out and about, while still being able to read at home.
After denying the inevitable for so long, I’m now working with Google Reader, which appears to do everything I need in an RSS aggregator, and is not localized to one specific machine. I’m slowly migrating my vast array of feeds (somewhere around 200) into it, and organizing them into folders by subject.
So far, I’m reasonably happy with it. It works, it’s fast, it’s ubiquitous, and, well, it’s Google. I have some real issues with how Google is overly dependent on their AJAX magic to get things done, though Reader doesn’t seem to too overboard with it (unlike, say, something like Picasaweb, which I loathe).
I’ll give it a few weeks and see how well I like it. Fortunately, it hasn’t required a major investment in time or configuration to set up. About an hour of basic twiddling and I’m up and running. Stay tuned!
Weird Ways of Working
I was gone all weekend on a wonderful camping trip, hence the radio silence. Today I’m back in the saddle, and faced with an annoying situation with my home setup.
I’ve come to the conclusion ‘yawl’ just can’t cut it as a development host. I had no idea that Pentium 4 CPU’s were such garbage. A 2.26 ghz machine isn’t fast enough to do serious work in Eclipse.
Most of my development is done on ‘clipper’, but alas it’s a Windows machine (it can’t help it, it was born that way). I wanted to start fiddling with CONGO (v2.0) via Konqueror, and hit upon running up ye ole VNC viewer on ‘yawl’, and just ‘moving’ the Eclipse environment onto yawl’s desktop.
Lo, it worked remarkably well. Clipper’s monitor is powered down, and I have an Eclipse environment on my Linux KDE desktop, but actually powered by the Windows dual core laptop next to it. I could overlap a Konqueror browse window and flip between it normally, and keyboard interaction was snappy and useful.
It’s not quite like having a local Eclipse install, but it’s mighty close. It gives me a feel for what it’s like for folks having big vmware server installations, and other less fortunate folks dealing with the variety of RDP based solutions, and being able to just pop into an existing running machine and work with it directly.
Really though, I should have a faster desktop machine. Alas, that’ll have to wait, it’s pretty low on the budget tree nowadays. And, in case anyone is curious, that is in fact a snapshot of CONGO v2 running in a pure Java environment – screens and back end all running within a Tomcat server. Sure it looks identical to CONGO v1, but that’s by choice. Quick port to Struts + JSP, then enhance and refactor. Progress is being made.
Furthering my supposed damnation
I’m packing up to head out to a geek camping event going on in upstate New York, but wanted to share this with ya’ll. It’s no secret I enjoy taking part in the debates on the Convert Me Livejournal community, taking on my Aspect as a rabid evangelical agnostic, and wielding my Attribute of “be a dick”. It keeps the heart rate up and gives me a good rant target.
Someone in the group pointed to a fascinating atheist blog / website called Russels Teapot. On the top of the site is the following quote:
“If I were to suggest that between the Earth and Mars there is a china teapot revolving about the sun in an elliptical orbit, nobody would be able to disprove my assertion provided I were careful to add that the teapot is too small to be revealed even by our most powerful telescopes. But if I were to go on to say that, since my assertion cannot be disproved, it is intolerable presumption on the part of human reason to doubt it, I should rightly be thought to be talking nonsense. If, however, the existence of such a teapot were affirmed in ancient books, taught as the sacred truth every Sunday, and instilled into the minds of children at school, hesitation to believe in its existence would become a mark of eccentricity and entitle the doubter to the attentions of the psychiatrist in an enlightened age or of the Inquisitor in an earlier time.” – Bertrand Russell
Pretty good commentary and right in line with my thinking.
Want to be a lighthouse keeper?
Saw this come across a sailing list I’m on. Scituate Lighthouse is looking for a new keeper…
“A lot of people have a romantic notion of living in a lighthouse,” said historical society president David Ball. “There are responsibilities that go with it. There’s a lot more to it than people think. It takes a special person, no doubt about it.”
For the past 22 years, that special person has been Ruth Downton. Since 1986 she has lived in the keeper’s cottage at the picturesque, 198-year-old lighthouse that marks the entrance of Scituate Harbor. But Downton is set to retire this fall.
I know for me, being a lighthouse keeper definitely had that romantic edge of being on your own, doing a job that others depend on, isolated but there for the ships and travelers that pass nearby. I suppose nowadays I’d need to have a net connection…
See the entire article on Boston.com.
A decent ride today. Phew
While Zach was out to lunch with Rosa, I decided to take the bike in to town with me, and ride around Cambridge. I don’t get much opportunity to ride in town, so I thought it would be a good opportunity.
I managed to avoid all the downpours that were skirting through the area, and got in about 10 miles on city streets. I passed all the hot spots of Cambridge… Porter Square, Community Boating, Central Square, Harvard Square, etc etc
Afterwards, Zach and I had an hour or two to kill, so we walked down on the north end and took a good look at the Constitution (I had never actually seen it in person). We didn’t have time to go on the tour of it, but Z was suitably impressed (“That’s a big boat! All wood? Wow.”).
The combination of the long walk and the bike ride, and my lack of anything resembling regular exercise lately (coupled with helping Tim and Ellen move yesterday) has left me pretty wiped out. The hot tub is calling my name.
Revisiting old code, and Good decisions made
Over 5 years ago, I began work on an application called CONGO, a registration and badging system, not only in the vein of “There’s gotta be a better way”, but also to help out a friend who was running registration at con in Philadelphia.
The first versions of CONGO were crude, but worked well – with a custom Swing interface, custom terminals and servers, it was an impressive setup. What wasn’t apparent was this was my first foray into writing any decent sized Java application. I made what I thought at the time were good design decisions, and looking back on 30+ events run, and hundreds of thousands of badges printed, I’d say the design was, for what I knew at the time, solid.
But it’s time to change. With everything I’ve done over the last 3 years in Java and enterprise-level applications, I feel I’m ready to rewrite CONGO into a proper Java based webapp. CONGO 1.0 was part Java, part PHP, part templating. CONGO 2.0 will be a pure java application, based on Struts, and will allow features that I could not shoehorn into the old model
I started work on CONGO2 about a week ago, and I have my first screens working properly and chaining together as they should. Part of this process is factoring in the old logic code, and linking it up with the new presentation layer I’m building using JSPs and Struts. This means making calls to 12,000+ lines of Java code that was written as I was learning the language.
But one thing I did consistently – I documented my methods. Every piece of the CONGO appserver has full Javadocs describing how to call the method, and what it returns
Because I’m doing CONGO2 using modern tools (like Eclipse and Tomcat, my GUI is showing me these docs whenever I try to link to my old code, and is reminding me how to use the old libraries. Why is this remarkable? Because other than generating static documentation, I’ve never actually seen my own comments and documentation popping in interactive windows in my IDE. Until now.
It gives me a little thrill each time I see my own docs pop up as helper windows in Eclipse, showing me comments I made half a decade ago on structures and calls, and reminding me how to use the system.
It wasn’t easy to learn Java, it wasn’t easy to learn Swing, it wasn’t easy to learn JSPs, JSTL, and Struts. But now I do know them – some more than others, and I’m enjoying this massive refactoring of one of my proudest creations.
And now, a word from my day job.
I don’t talk about my day job much. For those outside of the Java Geeky circles, it’s pretty dull stuff. But today has been particularly active, so I thought I’d share some of the bits I learned while teaching myself the wonders of Struts. This can best be summed up by the following revelations…
1) When changing a struts.xml file, within an Eclipse WTP environment, being serviced by Tomcat, WTP does not click that the Tomcat server needs to be restarted. The ‘Dynamic’ part of WTP does not take effect, and no matter how many times you save what you’re working on, it won’t go live in the server until you actually restart Tomcat.
2) Despite all the awesome advances in Eclipse in the last few years, there’s twitches that still drive me absolutely gonzo. One is that the ‘smart insert mode’ (which helpfully closes XML tags and closes quotes and parentheses for you) cannot be turned off globally. You can do it on a per-editor basis, but not globally, so I’m always forgetting to turn it off when I open a new editor. Another is XML syntax validator is still quite twitchy, and occasionally will flag incomplete tags or non-well-formed XML when the file is just fine. A close and re-open fixes it, but ugh.
3) Last, but not least – that which almost got me up on the roof with a high powered rifle. I give you a quiz as my example. One of these two struts.xml configurations apparently tickles a bug in Struts2 and will cause an internal server error and stacktrace with a Null Pointer Exception. The other will not. Can you figure out which is which?
<action name="/*"> <interceptor-ref name="mystack" /> <result name="success">/WEB-INF/jsp/{1}.jsp</result> <result name="login">/WEB-INF/jsp/index.jsp</result> </action>
<action name="*"> <interceptor-ref name="mystack" /> <result name="success">/WEB-INF/jsp/{1}.jsp</result> <result name="login">/WEB-INF/jsp/index.jsp</result> </action>
Just for fun, here’s the actual stack trace:
1.
INFO: Server startup in 954 ms
2.
Jun 17, 2008 7:41:14 PM org.apache.catalina.core.StandardWrapperValve invoke
3.
SEVERE: Servlet.service() for servlet default threw exception
4.
java.lang.NullPointerException
5.
at com.opensymphony.xwork2.config.impl.ActionConfigMatcher.convertActionConfig(ActionConfigMatcher.java:168)
6.
at com.opensymphony.xwork2.config.impl.ActionConfigMatcher.match(ActionConfigMatcher.java:144)
7.
at com.opensymphony.xwork2.config.impl.DefaultConfiguration$RuntimeConfigurationImpl.getActionConfig(DefaultConfiguration.java:316)
8.
at com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:169)
9.
at org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:41)
10.
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:494)
11.
at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:419)
12.
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
13.
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
14.
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
15.
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
16.
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
17.
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
18.
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
19.
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
20.
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874)
21.
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
22.
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
23.
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
24.
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
25.
at java.lang.Thread.run(Thread.java:619)
How the hell am I supposed to debug that?
I finally did, after a good 2 hours of hair-ripping, gnashing of teeth, and spewing my venom upon the #struts IRC support channel.