Results tagged “technology”

This is crazy. Someone must have made a mistake. I just got my work monitor shipped to me today and was plugging it in and testing it. After I did so I could not get wifi to work. Wifi has worked flawlessly from my office using a similar Macbook Pro in the past. The wifi was working for my wife’s Mac Mini downstairs. Why did the wifi suddenly stop? The answer: the monitor is killing my wifi connection.

I still see “4 bars” of wifi on the little gauge at the top, but nothing is going across that excellent connection. I can repeat this experiment over and over and the pings tell all:

64 bytes from 192.168.1.1: icmp_seq=100 ttl=64 time=1.563 ms
64 bytes from 192.168.1.1: icmp_seq=101 ttl=64 time=1.555 ms
64 bytes from 192.168.1.1: icmp_seq=102 ttl=64 time=1.333 ms
64 bytes from 192.168.1.1: icmp_seq=103 ttl=64 time=1.507 ms
64 bytes from 192.168.1.1: icmp_seq=104 ttl=64 time=1.585 ms
64 bytes from 192.168.1.1: icmp_seq=105 ttl=64 time=1.558 ms
64 bytes from 192.168.1.1: icmp_seq=106 ttl=64 time=1.553 ms
64 bytes from 192.168.1.1: icmp_seq=107 ttl=64 time=2.514 ms
64 bytes from 192.168.1.1: icmp_seq=108 ttl=64 time=1.571 ms
64 bytes from 192.168.1.1: icmp_seq=109 ttl=64 time=1.333 ms
64 bytes from 192.168.1.1: icmp_seq=110 ttl=64 time=1075.141 ms
64 bytes from 192.168.1.1: icmp_seq=111 ttl=64 time=78.932 ms
64 bytes from 192.168.1.1: icmp_seq=112 ttl=64 time=5909.617 ms
64 bytes from 192.168.1.1: icmp_seq=113 ttl=64 time=4909.318 ms
64 bytes from 192.168.1.1: icmp_seq=115 ttl=64 time=15571.986 ms
64 bytes from 192.168.1.1: icmp_seq=116 ttl=64 time=14588.171 ms
64 bytes from 192.168.1.1: icmp_seq=117 ttl=64 time=13587.816 ms
64 bytes from 192.168.1.1: icmp_seq=118 ttl=64 time=12587.626 ms
64 bytes from 192.168.1.1: icmp_seq=119 ttl=64 time=11590.435 ms
64 bytes from 192.168.1.1: icmp_seq=120 ttl=64 time=10591.978 ms
64 bytes from 192.168.1.1: icmp_seq=121 ttl=64 time=9592.633 ms
64 bytes from 192.168.1.1: icmp_seq=122 ttl=64 time=8593.659 ms
64 bytes from 192.168.1.1: icmp_seq=123 ttl=64 time=7594.748 ms
64 bytes from 192.168.1.1: icmp_seq=124 ttl=64 time=6595.005 ms
64 bytes from 192.168.1.1: icmp_seq=125 ttl=64 time=5601.815 ms
64 bytes from 192.168.1.1: icmp_seq=126 ttl=64 time=4603.203 ms
64 bytes from 192.168.1.1: icmp_seq=127 ttl=64 time=3603.183 ms
64 bytes from 192.168.1.1: icmp_seq=128 ttl=64 time=2603.059 ms
64 bytes from 192.168.1.1: icmp_seq=129 ttl=64 time=1612.565 ms
64 bytes from 192.168.1.1: icmp_seq=130 ttl=64 time=612.293 ms
64 bytes from 192.168.1.1: icmp_seq=131 ttl=64 time=1.103 ms
64 bytes from 192.168.1.1: icmp_seq=132 ttl=64 time=1.346 ms
64 bytes from 192.168.1.1: icmp_seq=133 ttl=64 time=1.428 ms
64 bytes from 192.168.1.1: icmp_seq=134 ttl=64 time=1.459 ms
64 bytes from 192.168.1.1: icmp_seq=135 ttl=64 time=1.516 ms
64 bytes from 192.168.1.1: icmp_seq=136 ttl=64 time=1.444 ms
64 bytes from 192.168.1.1: icmp_seq=137 ttl=64 time=1.599 ms

You can see my normal pings to my router are around 1.5 milliseconds. The hop up to 1 second happens at icmp_seq 110 when I plugged the monitor in. You’ll note from there that nothing got out until I unplugged it after about 15 seconds. You can tell by looking at 115 to 130. The first, 115, is one second higher than 114. This pattern continues down until 130. They’re one second apart because that’s how fast ping was firing them. Nothing got out while the monitor was plugged in, but they immediately got out and were all responded back to at the same time as soon as I unplugged the monitor.

This is a very interesting phenomenon and one I’ve never encountered before.

Weird.

Update June 8, 2008: Wireless-N to the rescue. I bought a LinkSys WRT160N to replace the wireless of my LinkSys WRT54G and my problems are solved. My wifi access is considerably faster to boot. Cheers.

I'm currently experimenting with some stuff related to using JavaScript on the server and the client. The results I'm getting are somewhat mixed. The idea I had was to see about letting someone customize some aspects of an application I'm developing that is intended to help you live more healthy. Basically, based upon the statistics of a food or other parts of the application, you could create custom metrics to measure your success or failure according to your particular preferences. (Some people monitor carbs, some monitor Weight Watcher points, others are interested in fat and protein, etc.)

I've successfully added tools that will allow you to add your custom metrics to the system using your own JavaScript snippet. This snippet is passed a object representing the food item (and eventually to include other information). I can then calculate your metric based upon the current food your viewing and your code.

This calculation is performed on the server side using Mozilla Spidermonkey
and the JavaScript
module on CPAN. On the server, this ends up looking something like this:

use JavaScript;
my $runtime = JavaScript::Runtime->new;
my $context = $runtime->create_context;
$context->eval_file('benchmark.js'); # base API library

# do some other setup of the objects I need in __tmp.food

$context->eval(
q/function evalIndicator(food) {/
.$user_calculation # this variable contains code from the end-user
.q/}/
);
$result = $context->eval(q/evalIndicator(__tmp.food)/);

I've added a little more in there for error handling and such, but that's the core of how I handle the work on the server. The really nice thing here is that the user's JavaScript can't really do much bad other than a denial of service by looping or recursing internally. The server-side JavaScript doesn't include any BOM objects that could be used to do terrible things like steal user information, etc. Furthermore, if I run this code as a separate process that communicates back to the server, I can easily wipe it out if it takes longer than a few seconds to work.

Then, using a combination of Dean Edward's sandbox
and some custom hacking of my own, I can then provide on-the-fly updates from the client using most of the same JavaScript code. This allows the JavaScript to run in a relatively safe container within a hidden IFRAME.

On the client, I've implemented the sandbox in this form. I've left out some of the error handling and other details for simplicity:

// Dean Edward's sandbox in OO form:
function Sandbox(preloads) {
  this.iframe = document.createElement("iframe");
  this.iframe.style.display = "none";
  document.body.appendChild(this.iframe);

this.frame = frames{eval:function(s){return eval(s)}};"+
"top=opener=parent=null"+ // cut off access back to the parent
"<\/script>"
);
this.frame.document.close(); // stop the throbbing
}

Sandbox.prototype.eval = function(code) {
var sandboxObject = Sandbox.functions[this.serialNumber

;
return sandboxObject.eval(code);
}

Sandbox.prototype.close = function() {
document.body.removeChild(this.iframe);
Sandbox.functions[this.serialNumber] = null;

this.frame = null;
this.iframe = null;
this.serialNumber = null;
}

Sandbox.serialNumber = 0;
Sandbox.functions = new Array();

Now that I have the sandbox to run things in, I need to setup a similar environment as I use on the server. My initial implementation embeds the user's code as a special attribute in the middle of the page, but it could be special block in the header or an Ajax request once to fetch the code string into a variable just after load, etc.

// This code runs onload, to make sure benchmark.js is loaded completely
var sandbox = new Sandbox(['benchmark.js']); // base API library

// When the user changes a value inthe page, the calculation can be made again on the fly...
var result = sandbox.eval(
""

// do some other setup of the objects I need in __tmp.food

+ "function evalIndicator(food) {"
+ user_calculation // this variable contains code from the end-user
+ "}"
+ "evalIndicator(__tmp.food)"
);

Again, I've omitted some of the other details to keep this article at a manageable length. That's the gist of how I run this on the client.

Now, after I've done the work, I probably am going to drop the client-side effort and provide updates by contacting the server using Ajax-ish requests. Why? Well, I can control the server-side environment much more closely by running the code in a separate process that I can kill off if it runs away. If someone's code accidentally (or intentional) tries to do something malicious on the client, I get the blame. The browser is a much less controllable environment. They could fire off requests passing information regarding the end user off to an unknown third party or compromise something even worse if I'm not very careful. I'd have to do a very thorough job of stripping the sandbox area completely. Even then, I don't know if I can actually protect the user from a malicious attacker since there are so many unknowns regarding browser implementations. I'd need to do a lot more studying before I'd be willing to run untrusted code this way for sure.

On the other hand, this trick might work swimmingly in an environment where I trusted all the code being executed in both boxes. I'd certainly be willing to do this on a project at some point to provide calculations on both server and client using the same embedded code, which is why I'm writing the article for others. Anyway, this has been an interesting adventure in JavaScript.

Cheers.

If you ask my wife when I work, her answer would almost certainly be, "All the time." She means a couple different things by that. One, she doesn't really like it when I work away from the house, which I do when I work in my cube three days a week. Bee, she means that I work in the shower, while eating breakfast, when I'm playing with my son, when I'm relaxing in the evening, always. I eat, sleep, and breathe work. This is what I am calling, "Stream of Consciousness Work Style."

Round Peg, Cubicle Hole

The first aspect of what Terri, my wife, has described is a bad thing. When I work in the office, I'm conformed to work from my cubicle. There's no creative workspace in our finely decorated offices at Boomer Consulting. That's not a knock against the company, but a sign of the company's origin, as a department of a CPA firm. CPAs are more creative than they'll admit, but they don't always need creative workspaces. They need orderly workspaces. They need workspaces that impress clients. Boomer has posh looking, orderly workspaces.

Not only am I constrained to my cubicle, I'm constrained in my work hours. I am expected to work from 8 to 5 or 9 to 5 or 9 to 6 or 7 to 4 or something. There's something in the Human Capital arena called "flex time" which is neither flexible nor timely, in my estimation, but for a well-ordered firm with top-down management, it's the rule. You can work flexible hours (i.e., not the typical 8 to 5), but those hours should be set in a regular schedule and your coworkers/supervisors should be aware of deviations in advance, etc. For a guy who found college hours to his liking (i.e., whenever as long as you and your project team got the job done), this is hard for me. I try, but I'm very bad at it. I try not to resent it too much. I try to conform, but I seem to fail regularly.

Finally, I'm nearly always in the middle of something when five o'clock rolls around. This is because I usually finish a task around 4:15, 4:30, or 4:45 and then it's not yet 5:00. I could leave before 5pm, but appearances are what they are and where would I draw the line if not 5pm? Thus, I pick up something else I hope won't take long, if I can. That generally pushes me to 5:10, 5:30, or 6:00 before I'm done. Terri no likey. Me no likey. Fortunately, my drive home takes 12 minutes, but I still don't like working late at the office. When five rolls around, I must make one of two choices: (1) drop what I'm doing in the middle and risk the mess that leaves things in or (2) complete the task and get home after dark. I despise both of those options, but I choose one or the other regularly depending on how long I estimate the task will take or how troublesome dropping it in the middle will be.

That's the negative aspect of "working all the time." It's a bummer, but that's life and while I work to slowly move my life away from work schedules that interfere with my work process, I deal with it in the meantime. This traditional office life is traditional for useful reasons as well. It is not without value. I'm not really knocking it. I am basically saying that I, as a round peg, find the cubical hole an uncomfortable fit.

Stream of Consciousness

The other aspect of "working all the time" revolves around my creative thought process. An article I recently read from A List Apart discusses the difference between the hat heads and the bed heads
. I definitely fall into the latter category. The bad news is that I'm difficult to manage, tend to work on my own, and don't necessarily communicate clearly all the time. The good news is that I'm a creator and I get stuff done.

First, I am always thinking about something. My brain almost never shuts off. The only time it really shuts down is when I read a book right before bed. This is a habit I've cultivated to avoid insomnia. The goal of the book, even if it is intellectual or stimulating is to put my brain into the right mode to sleep. It takes about an hour for my motor to get up to speed in the morning, but after that, I'm again full on working. I begin thinking about work before I step into the shower, while I eat breakfast, when I drive to work (or walk upstairs to my home office), while I'm officially working, while I eat lunch, etc. If I'm not in front of a computer, white board, or tablet of graph paper doing what looks like work, I'm still working somewhere in the back of my mind.

Next, I'm not always working on work. I have several hobbies, most of which look like work, but aren't what I get paid to do. For example, I keep a blog, which feels the same as work since I write articles and blogs for work. I build web sites, contribute to Open Source projects, and do other computer science stuff, which feels like work, but might be projects I like on my own time rather than stuff Boomer pays me for. I study theology and my Bible, which is really not much different than studying whatever latest technology I need to know to get my job done.

As a really excellent article, The Nerd Handbook
, points out I see everything and everyone as a project. That's not far from the truth. Even wrestling with my son is something I see as a task to be completed. That doesn't at all diminish the preciousness of the experience, but after I put Gabe to bed, a little check box gets ticked off in my head next to, "Had a significant amount of quality time with the Goober Pants." (At least, it usually gets marked, sometimes I'm not satisfied and that box takes on a larger font in the tag cloud floating in my brain for tomorrow night.) The same goes for time with my wife or playing video games or any other form of fun and recreation. It all falls into the same category as work.

The interesting thing about this way of living is that work is no longer work, but it's life. I don't take a vacation from work to get away from work, but so that I don't have to structure my time to fit the needs of my coworkers. We have this mystical thing we talk about at Boomer called the "Work-Life Balance." I say "mystical," but I should say "mystifying to me" because work and life are synonyms as far as I am concerned. I will work until I die. I will live until I retire. I could say I'm a workaholic because I'm never "off", but that wouldn't really be accurate. That would be missing the point. I'm never off because I never need to be because sometimes my on-time is the same as my off-time. That really means that my vacation days are merely on-time where my time is structured according to my choice even more so than usual.

Another Boomer doctrine is that of Free Days versus Buffer Days versus Focus Days. Everyone should take Free Days (like weekends) to recharge, Buffer Days to get the crap work done, and Focus Days to get the really cool stuff done. My life doesn't work that way. That's just another set of boxes to constrain my work style. I see every day as a Freefercus Day. Part of my day is spent working on my job doing fun stuff, not fun stuff, and whatever other stuff needs to happen to keep everything moving towards my goals. I spend another part of my day working on eating while I think about my job or fun projects. I spend another part of my day focused on my family. I spend another part of my day working on paying the bills or taking out the trash. I spend another part of my day dinking around on a fun work and/or personal project, etc. All of this blends together in my brain without strict delineation.

If I really had my way, I would give myself over to this work style. I wouldn't constrain myself to a certain set of hours. I wouldn't put myself into a cubicle box. I wouldn't announce my work hours ahead of time (mostly). In order to satisfy my team members, I could seek a compromise position of having regular meetings or daily office hours or something, but even that would be part of this unstructured system of work/life I lead. The structure of my life/work would center around getting stuff done rather than following some pre-programmed formula of time management.

For the most part, I would work day or night on my job whenever it best fit to do so. I would spend time with my wife or work on fun projects or play with my son whenever it fit, even if it happened in the middle of the day. I would work in an environment that supported my creativity rather than constrained it. I would balance the work that recharges me (fun projects, hard tasks, family time, etc.) with the work that drains me (paying taxes, data entry, meetings, etc.) The nature of the structure of the time would morph over time as well.

What works to keep me organized this month rarely works six months from now. My life would be systematically unstructured, evolving from period to period depending on my current projects, team and family needs, and other factors in my life at the moment. This is what I call Stream of Consciousness Work Style. You can like my idea of work and life or not, but that's how I roll.

Cheers.

IRC for the Uninitiated

I use IRC (Internet Relay Chat) quite a bit. If you don't know what I'm talking about or just barely or don't much know how to use it, that's why I'm writing this. IRC is similar to instant messaging, except that it's been around longer and it is primarily oriented around group conversation rather than individual-to-individual. For example, I hang out on #k-slug, which is a channel for the local Linux User Group. I also am on #jifty for Jifty developers and users to get help, #drupal-churches for people who use Drupal for church and other religious web sites, and a few other miscellaneous channels. So, I want to explain how to best use IRC if you're interested and tell you some things not to do.

First, you need to find an IRC chat room on the topic you wish to chat about. In general, if you don't know what channel to join, you probably aren't ready yet to use IRC. However, if you use an Open Source project or some local support group has a chat channel posted, you now have what you need. Find a client (I don't know about clients, find another web site for that) and join the appropriate server and then join that channel.

Second, be prepared to stay in that channel for a long time. The more you have your IRC client open, the better. Assuming you're familiar with instant messaging, you don't typical connect to your instant messenger and then immediately disconnect when those you want to talk with aren't around (or maybe you do). It'd be difficult to let other people start a conversation with you unless you stay connected a little while.

In IRC, this is even more important. Connect and stay connected. Many times the people in the channel are very busy and are connected while at work (myself for example). You might post a question about something related to the topic and not be responded to for hours on a quiet channel. If you expect to pop into an IRC channel and ask a question and get an answer within 5 minutes, expect to be disappointed. However, if you ask your question in a channel and no one else is talking on the channel you could be answer hours or even days later, if you stick around. Anyway, I see a lot of people pop into a channel I'm in, ask a question and then leave within minutes when I look in on a channel 30 minutes too late to have caught them and would have answered them.

Third, you also need to understand the lurker nature of IRC. If you look at a channel, many times there may be 10, 20, or more people listed as currently connected. However, of that maybe only 1 or 2 (or even none depending on the channel) are looking at that channel at any given moment. Getting mad that no one is answering is silly. They are participating in other discussions or are simply logging the channel for reference. For example, I am in 18 different channels 24 hours a day, but I only really pay attention to 4 or 5 of them and only in 1 or 2 of them 95% of the time I'm actually looking at the screen (I'm not actually awake 24 hours a day, though I sometimes come close). But I do watch for activity on certain quiet channels and will help you or talk to you if you're patient. Many of the regulars on IRC operate in a similar way.

Next, when joining a channel, avoid saying, "HI" or "hello" or "hey guys". That's an instant newby flag and first impressions are important. If you have a question on topic, just ask the question. You don't need to introduce yourself other than just being a member of the channel. You'll be taken serious in almost any channel out there. If you don't have anything specific to say that's on topic to the channel, just listen. If I go to a party where I don't know many of the people, I listen for a few minutes to get a sense of the group dynamics, whether people agree with my politics, what topics people prefer, etc. Then, I can start talking about things the others I don't know well can relate to. The same principle applies in IRC. Listen first if you're not sure how to join in and watch.

Finally, don't be a troll. Don't respond (i.e., encourage) trolls. A troll is someone who joins a channel to tick people off or who drags the conversation off-topic. Sometimes, the folks in #k-slug discuss Mac OS X or Windows or Python programming or other things that are sometimes related or sometimes not at all related to Linux, which is the group's purpose. These folks have been in the channel long enough that they are just making conversation and it's acceptable. However, if someone joins the channel and immediately asks, "how do i setup my bluetooth phone on my apple running mac os x?" they will not be well received. At all. This is a channelf or Linux, go find some Mac fanboys in another channel for help. However, if you've been in the channel for a long time and now there are other Mac users in the group, the question might irritate someone who thinks Linux is the One True Way, but the channel as a whole isn't going to descend on you out of irritation.

That's just some tips on how to use IRC. I hope someone finds them useful.

Cheers.

While working at my current job, we've used three different systems to manage our projects. First, we used Trac
, which I liked very much. As we transitioned from project management into user support after the first launch of the new web site and related products we tried to use RT
for project management, which I like very much as well, but turned out to be a poor choice for what we were doing. Finally, over the past few months we've implemented a new system during Drupal
, which has been moderately successful for us. I wanted to discuss the progression briefly and explain how to use Drupal for the task of software project management.

Initially we used Trac. Trac is basically a wiki + issue tracker + code browser + milestone manager. It does those four things extremely well together. You can create wiki pages for documentation very easily. You can easily link between wiki, issues, code revisions, files, etc. You can gather your issues together in dated milestones for releases. You can track all the activity of your developers from a central timeline. All of these were working well for us. The only major drawback is that my knowledge of Python (which Trac is written in) is limited and there are things we wanted to do with it that would have required more customization than Trac is really capable of without patching it. That wasn't a show stopper. I can learn Python and we could have lived without the customizations, but it was a drawback for us.

However, Trac is not a tool that works well for end-user support since it's email integration doesn't work very well and isn't quite as transparent as I'd like. Having used RT for end-user support and loving it for that purpose, we implemented that and transitioned to RT for project tracking as well. At that point, I setup a Drupal site to sit beside the RT site to hold documentation. As far as end-user support goes, RT is the bomb. The keys, as far as I'm concerned, is the ability to logically separate support issues into queues, being able to transparently integrate email, being able to link and merge various tasks together, being able to make private technical comments on a ticket separate from replies that go out to the person with the problem (that's a killer feature), and having lots of flexibility when it comes to building email templates and triggers that send email on comment... oh, and really, really, really flexible access control. I've not seen a system for incident tracking with end-users that even comes close (not that I've seen many such systems). I've also made quite a few customizations to the system to make it more useful for us.

As far as project management goes, the RT-Drupal combo was a failure. It caused a lot of headaches, there was confusion about what was happening, and we really didn't store much of any documentation in Drupal. We should have added RT as an end-user support mechanism and kept Trac in place without modification. Had we done that, I don't think we would have implemented the Drupal system we're using now, however. Basically, I/we decided that trying to use RT to track our software projects wasn't working for us.

I suppose we could have found a way, but we decided instead to give the Drupal Project and Project Issue module a try. This decision was made for several reasons. First, we'd made a strategic decision to use Drupal as the new base platform for our central web service, the Boomer Knowledge Network
. By reusing Drupal for project management, we could more effectively reuse our knowledge and even try a few things out on the support site that could be copied on the BKN. We weren't sure it would succeed and we might have switched back to Trac again if it hadn't.

However, our use of Drupal with the Project and Project Issue modules has worked out better for our purposes at this point than I think Trac would have. The Project module for Drupal provides little to no value on it's own for us except to break up our various software projects into chunks. The Project Issue tracker, on the other hand, has all the power we need. The only major drawback at this point is the inability to assign another user to an issue //drupal.org/node/4354">http://drupal.org/node/4354, perhaps, eventually they will even agree on a fix and apply a patch!
. Other than that, it can track pretty much anything we need it to in a way that fits our team's development style [# Our development style bears some vague resemblance to Agile, but much less formally structured].

The thing that's really helped though is Drupal's CCK module. This is a customization tool that allows you to add custom fields on nodes. The Project module has a system for building releases and such, but it's really strongly geared towards how Drupal's core, theme, and module code is released, which isn't precisely the way we release our work. Rather than using it, we built our own system by building a custom Release node and then associating custom fields to link that node to a project, setting a status (in progress or deployed), a planned delivery date [# usually within 2 weeks], and a list of references to issues that should be completed on release.

We then reconfigured the states that they are defined for issues so that we have a "fixed / ready to deploy" state and a "deployed / completed" state to match with our releases. Those working on a given release can change the state of all the issues to "ready to deploy" as soon as they get everything on that issue complete. Once all of them go light green, I "schedule downtime" [# I.e., I do it late at night when our members are asleep] and perform a code push and do all the configuration necessary to finish the production release [# Usually, this is a 5 minute process, but sometimes as long as 2 or 3 hours]. Then I can mark that issue as resolved.

We also have some documentation in the system, but we're not doing as well here as we probably could. I'm also starting to build some tools using more custom node types with custom CCK fields to handle idea gathering. I'd like team members to be able to visit a site and share that link in a way similar to Digg or Delicious within the office and I'm already a good ways along on that. We're building a review system so that other staff outside the team will be able to comment on screenshots and comps so we can develop a feedback system.

I've also figured out a way to get the timeline back, which was a feature I really liked in Trac. Using the Drupal news aggregator, I can pull the feeds for code commits, issue creation, releases, and even comments [# via the Drupal Comment RSS module]. Unfortunately, I haven't found a way to pull issue followups in a way similar to Comment RSS so those are missing still, but I may just build a Followups RSS module if I have to.

Anyway, I'm pleased with how the project modules are working in Drupal for us. It's a little more flexible than Trac is (IMO) and since I'm very familiar with PHP [# I'm unfortunately familiar with PHP, which is a language I just don't like for both idealistic and emotional reasons.] and with Drupal [# On the other hand, even though Drupal is written in PHP, much of its design both internally and aesthetically is quite nice.], the code customizations are a piece of cake.

Well, that was a lovely ramble. That's what I get for writing so late after working all day....

Cheers.

I'm a big fan of Open Source software. I began to be a fan of Open Source (or Free Software as it was more generally known back in those days) because I feel that it is not right to "steal" software. When I started towards Free Software, I did so because I was a rather poor college student and I couldn't afford much of the commercial software available for various tasks I wanted to do. When I found out that much of that software was available for free as long as I learned to use Linux (and I really enjoy trying new things) I wouldn't have to worry about "stealing" anything to do what I wanted to do.

I switched to Linux, started using free tools for almost everything, and now have come to love Free Software for many of it's benefits. In my own software development, I often release my work under a Free Software license not because I necessarily think anyone else might find it useful but because the quality of my work increases when I do it. Open Source provides accountability.

This accountability may not work for everyone, but it certainly works for me. I am not a person who wants other people looking at my work and saying to themselves, "That's a piece of @#$%! It has no documentation. It has a horrible interface. It engages in bad design practices." The reason for this is two-fold: (1) I am a lot more concerned about appearances than I like to pretend and (2) I use my Open Source code as a resume enhancement and if I put out crap, I can expect my resume to look like crap.

Therefore, I often seek ways to take a program I've written for myself or for Boomer Consulting and see how I can abstract that code out so that it could be used in a my general solution. When I do so, I then go through all the modules and add documentation, I am more careful about adding inline comments to explain what it's doing, and I generally work harder at making my code reusable rather than hacking together a quick solution that just gets the job done. And, perhaps most importantly, it forces me to write extensive test cases to make sure that the code actually works rather than just performing the trial-and-error process one time around and then never verifying that a feature works again until it breaks in production.

In the short term, this often has the tendency to make my life harder (even significantly so), but in the long term, my it means I have to spend less time trying to fix my own crappy code because I was lazy about how I put it together initially.

Anyway, that's just one more benefit of publishing my code as Free Software.

Cheers.

Blue Screen of Dumb

Okay, so we've all heard of and mocked the BSOD (Blue/Black Screen of Death) on our computers. Today, I'm going to deride the Blue Screen of Dumb on my Apple. I just forceably shutdown my laptop by holding down the power button for 10 seconds. Was it hung? No. My mouse was still moving, it was still taking keyboard input, and Expose (Apple's window switching effect) appeared to be working. What was the problem? My screen was blue.

When you plug an additional monitor into an Apple computer, it turns the screen a pleasant shade of soothing blue while it figures out how to add the second screen. Apple tries to protect the user from ugly screen change side-effects by covering them over with a uniform color. This way, even if your screen flickers and blinks, you won't notice it so much. It's one of the ways Apple politely pats the users on the head so they don't have to be so worried about they're computer.

The problem is that sometimes when you're in a hurry and you don't take the time to unplug the external monitor cable and wait for the blue screen to go away before closing your Apple laptop and putting it to sleep, when it comes time wake-up, the Apple sometimes leaves that pleasant Blue Screen of Dumb up. Interestingly, I can still tell where the password box is for my screen lock-out (corporate computers MUST HAVE SCREEN LOCK PASSWORDS you know) by moving the mouse around. If it moves off where the box is it turns into the pretty Apple wait pinwheel. If I move it back on, it becomes an arrow or the "I" cursor over where the text fields should be shown.

After typing my password and hitting "Enter" (which I don't recommend doing if you think you had a chat window open before you shutdown that might be active again, that burned my on my Linux workstation the day when I told all my friends in the local LUG channel on IRC what my password was), after typing my password, I can then move the mouse into the corner that actives Expose and it turns to the finger cursor normally in place for Expose. Going back to the corner, it turns back to a regular pointer. All this indicates that if it weren't for the Blue Screen of Dumb, I should be able to use my computer. In fact, I suppose if I were blind and had all the accessibility features turned on, I might not even notice since I can't see the screen anyway.

The same thing has been known to happen with the lock-out screen, particularly if I get a little too eager to enter my password. I have my Mac set to lock the computer when waking up or after the screen saver starts as per company policy. However, if I start typing before the password box shows up (which can take several seconds after waking up because of how many programs I usually have running that it has to notify of the wakeup) then sometimes when I hit enter the password box goes away but this time the Black Screen of Dumb stays in place. This one I can almost always eliminate by closing my laptop again waiting about 30 seconds and then reopening and trying again.

Now, I know the real issue here is that properly handling sleep and wakeup is hard, very hard. I don't know of anyone who's had a computer running any OS that really got it right 100% of the time. Apples (other than the two issues I mention here) have got it about as close as I've seen in my experience, which is why I rarely hesitate to close my laptop lid to sleep at any point, even when I've been using a second monitor. These problems really don't come up very often. I don't know that that's because of any particular ingenuity or good design on Apple's part so much as it is that Mac OS X doesn't run on anything but Apple hardware so there are fewer variations to test and debug.

Anyway, that's just one annoyance on my Mac, but at least it doesn't crash as often as any Windows laptop I've ever had. Furthermore, since there aren't a lot of ways to tweak things under the hood without going into questionable territory I don't attempt to break it as much as any Linux laptop I've ever had. :)

Cheers.

Relationship Management

There's a pretty decent article over
at A List Apart on relationship management by Keith LaFerriere from a couple weeks ago (catching up on some of my reading). I enjoyed the "Hat Head" versus "Bed Head" comparison, particularly since I'd definitely qualify myself as a "Bed Head" in my attempt to live a creative lifestyle. Though, as a developer, my idea of a creative lifestyle is probably a little different from the conception of a typical designer (less coffee and black turtlenecks and more Dr. Pepper and not-shaving).

Anyway, he makes several very important points that I think everyone in development and design need to adhere to more.

  • Don't take things personally. Yes, you are being creative and it is important to you, but if you're making money doing it, you need to have a professional attitude and be willing to compromise.
  • Be an example, particularly if you're the team leader. It's really amazing how much the behavior of a person is determined by the people around him. If you get ticked off every time someone does something you don't like, people around you will probably start having at least a kernel of similar behavior. This goes doubly so for managers and leaders. Your behavior sets the tone the rest of the group will judge itself by. Be good.
  • Watch your language. By this I'm referring to trying to be what I would call "open-minded language." If you indicate by the adjectives you use that you're not listening or don't intend to, you will convince no one of anything. Avoid strong adjectives and try to talk as if all the options are still open even if you're already on a specific path. You can make it clear that a bad idea isn't going to fly without insulting your audience.

Anyway, I just wanted to post that link and give an infinitesimal boost to what I consider to be a good overall article on getting along with coworkers and getting the job done as a team.

Cheers.

Back Burner Projects

I'm currently in hurry-up-and-wait phase and rather than go back and edit yet-another-script I'm working on, I thought I'd make a short post about the projects I'm hoping to work on, but I haven't got time for just now.

Blog Reload

The first major project I'm working on is my blog reload. I've posted an early version of that here
previously. The development version is quite a bit further than the published version is, but I've reached that point where I can't really release anything until I tie up some loose ends (e.g., I have a blog component on it, but no comment component).

This one also happens to be the base tool I'm using to work on another project...

Gentle Birth Doula Services

A friend of ours, Rachel, recently started a web site
to go with her new hobby/business. She's taken the training and now either very close to or already officially licensed as a doula.

For those unfamiliar with modern labor and delivery practices, many people now hire an additional helper for labor and delivery called a doula. A doula is not a nurse, but just someone with knowledge of the birth process that can give aid to the mother during the process beyond what care is provided by the birthing center or hospital nurses. (For example, being available prior to going to the hospital.) Actually, that's just my understanding and I'm probably off a bit.

Anyway, Terri and I are helping her fix up her new web site. I'm going to give her the software I'm using to build my web site reload and then work with her and Terri to make it look better.

Sermon Illustrations

A few months ago a pastor, Monte, in North Carolina contacted me out of the blue about the possibility of starting a web site for collecting sermon illustrations ala social networking. It's a good idea and I'm still interested in it, but it's stalled out. I hope to make some time for it over the next few months. We'll see.

Jifty Book

I caught Chromatic and Jesse Vincent at OSCON and I suggested that Jifty really needs a book. I'm slowly working through a table of contents for it. I'm also hoping to get some time for it in the near future to get back to work on that idea. I really like writing and would love to do that more.

Software Ideas for IRC Bot Nets and POE

Something I've been building at work as sparked my interest and I'd like to combine somethings I've learned from using Jifty and from using POE to build an IRC Bot Net to build a better tool for building Bot Nets for various things. I've had a fascination with multi-agent systems since I took a course on the subject during grad school and I'd like to apply some of my knowledge from there as well (i.e., designing robust multi-agent communication protocols).

If I could, I would like to publish an article on the subject, but my previous outlet for such, OnLamp.com, may not be accepting articles of that kind anymore since their trying to produce higher quality content.

Expansion of Contentment

I'm thinking about ideas of taking this blog to the next level. I'd kind of like to expand it beyond just me and get other authors posting here. What that looks like, I don't know, but I'm thinking of possibly making it into a place where Christians working in web, design, and IT can get together to talk about what they're doing and what Christian Service in the modern workplace looks like.

Okay, looks like my tests have finished baking, so I need to go back to previously scheduled overtime.

Cheers.

This past weekend I decided to dink around with Jifty to create an app for listing my current and older development projects. In the process, I'm starting to build what I think will become my new blogs. We'll see, but so far things are looking good. Anyway, if you're interested in some of the projects I'm currently working on and what I've got so far in the development for my future web site, see:

//projects.contentment.org/

I've heard this mistake before, but the local talk radio station has at least one current offending commercial running that I heard the other day right after hearing a local leader talk to a reporter and make the same mistake. Both state something to the effect of, "Come visit our web site at Blah-Dot-Com-BACKSLASH-Yadda." For those of you that are non-techy, there is a significant difference between a forward slash (generally just called the "slash") and a backslash. Here's the difference:

/

slash

\

backslash

The slash is used in web site addresses, typed fractions (like 3/4), in abbreviations (such as "w/" and "w/o"), and indicating that two ideas stand side by side (such as "and/or" or "meet me tomorrow/Sunday"). The other is generally not used for anything unless you run CMD.EXE on Windows or are a programmer needing to write out escape codes or break up lines.

The slash is commonly enough used that it is beneath your right pinky on a standard QWERTY keyboard. The backslash, on the other hand, has no standard placement on a QWERTY keyboard. It usually appears above the ENTER key with another rarely needed character, the vertical pipe ("|"), but it also appears next to the space bar and near the escape key among other places depending on your keyboard.

So, when you give out your web address, don't be tempted to sound fancy or use an extra syllable. Rather, just keep it simple and say "slash." In fact, most folks can erase the term "backslash" from their mind and just ban it from their vocabulary altogether.

Cheers.

One of my coworkers, Doug
, passed me a link to an article by Jakob Nielsen titled "Write Article's, Not Blogs
." The basic suggestion of the article is summarized as "To demonstrate world-class expertise, avoid quickly written, shallow postings. Instead, invest your time in thorough, value-added content that attracts paying customers." On the face of it, this does seem like good advice, but it makes a basic assumption that is false: blogs and articles fill the same role in business.

Now, to be fair, Nielsen does point out that blogs have value in business and we may not be that far apart in our opinions. However, I still must disagree on his statement that a serious business person should "not [spend] the effort to post numerous short comments on ongoing blogosphere discussions." He suggests that such time would be better spent writing serious and well-researched articles rather than short blog-style posts on topics. He suggests that this will result in more revenue for the serious business person because it avoids "commodity status."

The main disagreement I have is that this sort of statement is like saying that newspapers shouldn't have editorials, but only serious articles. Newscasts should only provide commentary, and skip general reporting. Football quarterbacks should focus on passing and give up running plays. Limiting yourself to a single dimension in your writing can also tell your audience that you don't care about what anyone else is saying, that you are the expert unto yourself. I find myself unimpressed with the sort of expert that can't find value in or contrast himself with the opinions of someone else. The kind of expert that is only capable of writing articles and not able to make concise and witty remarks without the aid of research.

Therefore, I say write blogs when you that's the appropriate medium for the message you have to deliver. If you read an interesting article and want to commend or disagree with the author, this is a blog. If you have an interesting discussion with a client that reveals something about your company's core values, write a blog. If you want to talk about something you see on the horizon as becoming a serious topic of discussion in the next year or two, write an article. There's nothing lost in short blog posts when applied to the right content. However, I do agree with Nielsen that far, serious writing requires a good and well-researched article.

Cheers.

OSCON 2007 In Review

Okay, here's my take on OSCON 2007. I had a great time. It was good to be surrounded by professionals who do and care about many of the same things I do. Most notably: software development and Open Source. I met several folks and, being my first real Open Source event, I saw quite a few famous people whom I'd only seen in pictures or Revolution OS.

Tuesday: Travel

Cool clouds on the way to Portland

I skipped the tutorials (though, not completely willingly). That was mostly because I didn't want to be away from my wife and 7 month old son for longer than 4 days. I traveled to Portland direct from Manhattan, Kansas. Unfortunately, my flight arrangements were such that I was on three flights rather than just two. (My flights were not made by me.) I do thoroughly enjoy the first 40 minute jump from Manhattan to Kansas City on a Beechcraft B1900 turboprop. I also like to laugh at the n00bs on the plane that are a little nervous about riding a plane only holding 16 passengers. "Oh my, it still has propellers." N00bs.

My trip from Manhattan to Kansas City to Phoenix to Portland was pretty much uneventful. I caught the Trimax into downtown and walked over and checked into the hotel. I then met Lance for some Chipotle and headed over to the Doubletree where we met up with Seth and hung out in the bar for a bit. Then back to sleep a bit.

Wednesday: Sessions Day 1

The first keynotes of the day weren't very interesting. I now know what Mark Shuttleworth and Tim O'Reilly look like, but the only talk I found very interesting was the one on Transactional Memory and that for technical reasons I won't elaborate here. As with most conferences, they always try to pack as much of the best stuff into the first day of sessions since that's the day most people stay for. There were at least 3 sessions during each period I wanted to attend.

Keep Your Sense Of Humor hackable Tux robots

After the keynotes I hit the expo hall and started picking up free T-shirts, pens, and other swag. Here I met with James Turner, who's been my editor for a couple of my OnLamp.com articles. He was showing off his work on his comic at the Watering Hole. I also saw Mark Tiemann, current OSI President and founder of Cygnus, here, whom I recognized from Revolution OS, handing out OSI T-Shirts in exchange for donations.

For my first sessions I went to How to Herd Cats and Influence People with Jono Bacon of Canonical. The basic recommendation of the session is that if you want a successful community make it very easy to participate. Period. There was a comparison with McDonald's and how they've made it so easy for morons to make burgers and that's the secret to their success. In Open Source, we should learn to do the same.

Spam on one of the whiteboards outside the Expo Hall

The second session I attended was Care and Feeding of Large Open Source Applications by Perrin Harkins, which was basically a talk on the project management tools available for Perl development. It was largely a review of what I already knew on the subject, but he did provide some good suggestions that I hadn't really worked with before, such as using Test::Class.

I ate lunch with Seth and a couple other attendees and then moved on to the afternoon sessions. I nearly went to Beautiful and Unique Snowflakes: Cooking with Catalyst with Matt Trout, whom I've chatted with on IRC but missed shaking hands with at OSCON, unfortunately. However, I saw that his session was introductory and I've already built Catalyst applications (including a blog I used on this site briefly), so it probably wouldn't have been the best session to attend. Instead, I went on to Who Am I? The Age of the Digital Identity by Robert Richards, which was about OpenID and InfoCard. His talk was interesting, particularly since I'm writing an SSO application, CAS+, but I had a hard time following the talk. I hope to implement OpenID in my application, but I can't just yet (or at least, not as the primary login mechanism) as our clients aren't quite ready for it.

After this I went to the Perl 6 Update with Larry Wall, which was interesting as ever. One reason I got into Perl 5 was because of what I'd read about Perl 6. I decided on Perl as my language of preference during my first year as a grad student. I had hacked around in Perl before while working on Anomy Mail tools when I was with Network Resource Group, but I didn't take any particular liking or disliking to the language at that time. As I started my Masters Degree I was trying to decide which language I liked for building web applications since I already new I didn't like Java and while I liked C++, it's not considered an ideal language for web development. I tried out Python and then taught myself some better Perl and felt an affinity to Perl immediately. I can think Perl. I read the first couple Apocalypses and was sold when I found out what Perl 6 would (eventually) be. Larry Wall and the Perl 6 language team continue to impress with more good ideas and the elimination of more bad ideas.

Ubuntu Hair Guy at the OpenSolaris Party

After the Perl 6 Update, I went to the Programming with SQLite talk by Michael Owens with Lance and Seth. The main thing I learned from this talk is that SQLite isn't like other SQL databases and requires a little more manual intervention to make things work just the way you want, which can be seen as an advantage or disadvantage. That is, if you want to use SQLite efficiently, take your locking seriously.

Lastly, I went to Myths of Innovation by Scott Berkun and then promptly went down to the book store and bought his book. I don't agree with everything in the book (particularly the veiled hostility toward spirituality), but it is a good book overall.

Lance, Sterling, and Seth

At the end of the day, I took Lance and Seth out to the Rock Bottom Brewery where they had a couple pints and a microbrew sampler. I even drank a couple of the samples and enjoyed them as much as anyone who doesn't drink can. We then headed over to the OpenSolaris party at the Doubletree and I met Donnie, who's a PhD student at OSU, one of the top guys at Gentoo Linux, and a friend of Lance's. After chatting at the party for awhile, Lance and I headed back to the Red Lion to end another day.

Thursday: Session Day 2

The Thursday keynotes were very interesting. The keynote by Robin Hansen on Bias was simply depressing, but basically stated a fundamental Christian belief, people have a veil pulled over their eyes and refuse to believe truth when it whacks them in the face. Of course, he didn't make any spiritual remarks and my statements would be construed as my own biases in his view. He also made some good points that the key to discouraging bias in the work place is to use competition or even gambling as a mechanism for encouraging truthful predictions of project timelines and such.

Bill Hilf of Microsoft announced that they were sending their Shared Source licenses to the OSI for approval, which got applause. I don't really remember anything else about his talk. He was followed by Rick Falkvinge of the Swedish Pirate Party, which is a political party in Sweden based on the single issue of IP rights. He made some very good arguments about why copyrights are being abused to harm consumers and individual liberties while working to aid corporate and governmental power. His platform is very interesting and I've added Sweden to the places I'd like to visit someday.

The best talk of the morning, though, was Steven Yegge's talk about marketing and branding. He works for Google and was basically saying that OSI needs to remember to be focused on branding. Our brand is very important and the brands of individual products and even developers help us market our products to the wide world. He was very entertaining as well, especially since I think he was probably best representation of the audience that we saw give a keynote. He was one of us and I think he was persuasive only because of that. If a marketing guy had stood up there and said the same thing, he probably would have been written off in that crowd.

One of the One Laptop Per Child laptops

Linux Lightning Talk

After hitting the Expo Hall again for yet more free stuff, I went to the morning Lightning Talks. The talks I noted most were the talk by Donnie on the state of Gentoo and the talk on the current state of Linux, which is mostly funny because the speaker (whose name has escaped me) and his daughter give the talk together. He reads off every patch and improvement made in the last year and she holds up signs summarizing things and then mocking him and penguins toward the end. The most important statistic: Linux receives an average of 3.8 patches per hour all year long.

After lunch, I did want to go to Sam Vilain's Next Generation Version Control systems to learn more about GIT, but I decided to go shopping with Seth instead to pick something up to bring home. I ended up with a shadowbox frame with the cow jumping over the moon for Gabe's room.

When we got back, I went to straight over to Jesse Vincent's talk on Domain Specific Languages, which is interesting talk for me since it was about software I used regularly. It's also interesting because he was discussing work he and others have been doing on Jifty to create mini-languages in pure Perl. The declarative language used by Jifty to create models, action definitions, dispatchers, templates, and (coming soon) web application tests. All of these are written using pure Perl, but it doesn't look like traditional Perl because of how he's stretched the syntax a little bit. I like the ideas a lot and I've always been a fan of DSL's (I did write one for my multi-agent system for my MS a while back). This was first opportunity to do more than just shake Jesse's hand as we hadn't met but over IRC previously. I also stood by and watch Jesse, Larry Wall, and Matt Trout discuss some backport issues from Perl 6 to Perl 5, which was interesting and a little amusing.

Perl in a Nutshell to a tune by Bare Naked Ladies

Afterward, I went back to the Expo Hall to hang out with the OSL guys for a bit before the evening sessions. In the evening sessions, I went to the Perl Lightning talks. Andy Lester gave his talk on ack (and alternative to grep) and his assertion that we should call Perl work "programs" rather than "scripts" (which got cat-called by Larry Wall). There was also a rendition of a song by Bare Naked Ladies with new lyrics, Perl in a Nutshell. After the lightning talks, I went to the rest room and met Chromatic (another of my OnLamp editors) on the way out and chatting with him on the way back to where Larry was going to give the State of the Onion. At one point, I had both him and Jesse in front of me so I suggested that we needed a Jifty book. Perhaps we will someday soon. I also got to meet a few of Jesse's "minions" and others here, though I confess that my brain has blurred all the names other than Kevin Falcone.

Larry Wall delivering the State of the Onion

Outside we waited for the Perl Foundation auction to end while everyone made fun of the proceedings inside. However, we were shortly inside and listening to Larry Wall deliver the State of the Onion address, which is something I'd been looking forward to. Larry gave a summary of his history with language and reasserted his view that programming is hard and scripting is easy, so he strongly disagreed with Andy Lester's statement about what we should call Perl application components. He went on to discuss all the different areas where a scripting language can vary: strong typing or weak typing, early binding or late binding, etc. He also showed why he thinks Perl 6 is going to win in the end because Perl 6 isn't so much a new programming language, but the root of a family of programming languages, which played nicely into Jesse's earlier talk about DSLs.

After this, I dropped my stuff off at the hotel and hopped on the train to get over to the Thirsty Lion to attend the Open Source Lab party, sponsored by Jive. We chatted some and then went to the Irish Pub across the street to get some dinner. Lance needed to get back to Corvallis so he checked out and headed home and I spend the evening in the hotel room half-working and half-relaxing.

Friday: Session Day 3

Unfortunately, the last day had come. I wasn't really ready for it to be done. But it was. The keynotes today were certainly the funniest and most memorable of all. Philip Rosedale of Linden Labs gave a talk about Second Life. The most interesting thing about his talk was that Linden Labs does all their meetings in Second Life, which I think would be cool if they had better tools for collaboration that were easier to get to, but with everything going Open Source, perhaps they will.

Jimmy Wales of Wikipedia fame gave the second talk about Wikia which is the "Wiki to End All Wikis" (or he would like it to be) and also about his hope to provide a true Open Source search engine where everything from the algorithms to the data is all open. Which is a good idea, if it can get enough support to work.

Then came the "Keynote Resignation" of Simon Wardley where it was announced that Fotango (though he didn't use the company name) has refused to let it's subsidiary Zimki Open Source it's web development platform, which Wardley was to announce during his keynote. Too bad. It looked interesting and I'm guessing that if they'd Open Sourced it Zimki could have had a chance at becoming a bigger player, now they will be relegated to the same obscurity as the other hosted frameworks. However, his replacement talk on IT Commidization was very funny, though I have no recollection of what points he made other than he likes ducks.

Open Source therapy by the conference MC, Nat Torkington, was basically just an attempt to tell us all to get along with one another. Which I certainly agree with. I may mock Python, Ruby, Java, and PHP every now and then, but I don't mock those that use them (unless they really are worth mocking for other reasons). Anyway, there are certainly lessons that Perl can learn from each. PHP, for example, teaches that ease of deployment can make all the difference in the world to popularity. It also reminds of how bad things get if a language doesn't provide namespaces.

Pimp My Garage by James Larrson is easily the most humorous of all the talks. I hope he posts his videos online, but he basically like to take household junk and revamp it so that it's either funnier or more dangerous. He had some excellent visuals and I think he has a thing for tall leather boots.

For the last two sessions, I thought about going to Hack Your Manager, but ended up in Adventures in Copyright Reform with Karl Fogel, which was somewhat enlightening as to how the RIAA and MPAA are trying to restrict civil liberties in order to help their clients (record companies and movie producers) continue making money the old fashioned way rather than adapting to the new media. The new media tends to favor the artist over the producer, which producers don't like very much since there's a lot of money to be earned in production.

Finally, I went to Running Your Language on Parrot with Chromatic and Patrick Michaud. One of the things I regret leaving K-State for is the fact that I no longer get to play with Parrot as much. I was hoping to use Parrot more to teach my class on Computer Architecture, but, alas, I don't have much need to play with it as a web developer. However, the talk showed me all the new cool toys they've added in the last two years since I've played with it and it's getting to be very nice indeed. If you have a chance to play with Parrot, I highly recommend it.

The End of the conference. I didn't go to the last talk since I wasn't very interested in Open Source Hardware (I'm really not much of a hardware guy) and worked on some stuff for Jifty instead.

Friday: Corvallis

Lance standing next to the Gentoo Servers at OSL

After the conference ended. Seth and I grabbed some lunch at the Doubletree, picked up a rental and headed south to Corvallis. Corvallis is the home of Oregon State University, where Lance now works for Open Source Lab. He gave us a tour starting with meeting his boss who was still around waiting to start an after hours meeting. He then showed us the lab itself including many of the Open Source projects they host. He took us in to his office where one of his students was still working to fix some DB problems with Drupal.

The OSL server status board

I'm a little jealous of Lance and all his toys. However, I enjoy software development far more than I enjoy systems administration, so I'm not that jealous (but a little). OSL has a very nice facility, much nicer than anything I had at K-State. Lance also has some phenomenal students working for him. I am jealous for that being the lone wolf at my current job.

After the tour, we went out to Newport and had some seafood on the bay and then headed back to Portland. Seth and I said farewell and so ended my time in Portland.

Saturday: More Travel

My trip back to Manhattan was pretty uneventful, so I won't bore you with anymore details.

I had a lot of fun on my trip to OSCON and I look forward to making the trek again next year.

Cheers.

Update: (2007-09-30) Corrected references to Andy Lester. Thanks for the correction, Andy.

Drupal Database Tables

I've been going through the list of tables on my Drupal site in prep to convert an existing single-site to a multi-site with a shared database. However, I haven't found any reference that illuminates the general purpose of the tables. I've tried to put together at least a preliminary list here. I share it in hopes that someone else might find it useful, but it is not normative or complete.

access
User. This is the table used by the "Access Rules" section for banning usernames, IPs, etc.

accesslog

Statistics. This stores the accesslog if Drupal is collecting statistics.

aggregator_category

Aggregator. Store the categories feeds may belong to.

aggregator_category_feed

Aggregator. Links feeds to categories.

aggregator_category_item

Aggregator. Links feed items to categories.

aggregator_feed

Aggregator. Store the feeds that the Aggregator module pulls from.

aggregator_item

Aggregator. Store the items that the Aggregator module has pulled for the various configured feeds.

authmap

User. This stores a map to the authentication module used to authentication each user in the database.

blocks

Block. This stores information about blocks provided by every module installed, including custom blocks.

blocks_role

Block. Stores the roles permitted to view blocks in the system.

boxes

Block. Administrator created blocks.

cache

System. The general cache of data, used by many modules.

cache_filter

System. I have no idea what this table is used for.

cache_menu

System. I have no idea what this table is used for.

cache_page

System. I have no idea what this table is used for.

cache_views

Views. Used to cache information related to views.

client

Drupal. Used to record Drupal client sites. I believe this is the list of sites that others have logged in from if you use the Drupal module.

client_system

Drupal. I'm not exactly certain what this table is for.

comments

Comment. Stores all comments made on your Drupal site.

contact

Contact. Stores the emails sent via a contact form.

files

Upload. Stores information about files uploaded via the file upload module (and used by some other modules too).

file_revisions

Upload. Associated file revisions with node revisions allowing different node revisions to have different versions of a file associated with them.

filters

Filter. Stores information about the body content filters used in your install.

filter_formats

Filter. Associates filter formats and settings with a body content filter.

flood

Watchdog. Used to detect floods from requests coming from a set.

forum

Forum. Used to link forum posts with the forum topic.

history

Node. Used to track which nodes are read/unread.

locales_meta

Locale. Something to do with language translation.

locales_source

Locale. Something to do with language translation.

locales_target

Locale. Something to do with language translation.

menu

Menu. Storage of menu module customizations.

node

Node. The main table for storing general node information, including the title, node number, dates, workflow state, but it does not store most of the actual content.

node_access

Node. Storage of per-node access permissions.

node_comment_statistics

Comment. Notes certain statistics related to the number of comments and how recently comments have been made on a node.

node_counter

Statistics. Records the view count for each node.

node_revisions

Node. Stores information about node revisions, including the main content of the node.

node_type

Node. Stores information about the custom node types.

permission

User. Stores the permissions that have been assigned to each role.

poll

Poll. Extra information associated with poll nodes.

poll_choices

Poll. Associates the available choices with a poll node.

poll_votes

Poll. Votes by visitors on a poll node.

profile_fields

Profile. Definitions of available profile fields.

profile_values

Profile. Profile field values associated with a particular user.

role

User. Assigns role IDs and names to all the roles in the system.

search_dataset

Search. Something to do with search.

search_index

Search. The search index.

search_total

Search. The number of times a given word appears on the site.

sequences

System. The current counter for each of the sequence IDs.

sessions

User. User session tracking data stored in the database.

system

System. Information about installed modules.

term_access

Taxonomy Access Control. Access control per category.

term_access_defaults

Taxonomy Access Control. Access control per vocabulary.

term_data

Taxonomy. Definition of taxonomy terms.

term_hierarchy

Taxonomy. List of parent terms for each taxonomy term.

term_node

Taxonomy. Table linking taxonomy terms to nodes.

term_relation

Taxonomy. Relationships between taxonomy terms.

term_synonym

Taxonomy. Alternative names for a taxonomy term.

tinymce_role

TinyMCE WYSIWYG Editor. Roles assigned to use TinyMCE profiles.

tinymce_settings

TinyMCE WYSIWYG Editor. Definition of TinyMCE profiles.

url_alias

Path. Path aliases recorded to nodes.

users

User. User records.

users_roles

User. Link table between users and roles.

variable

System. Administrative settings and other site-wide variables.

view_argument

Views. Definition of arguments to a view.

view_exposed_filter

Views. Definition of exposed filters in a view.

view_filter

Views. Definition of filters in a view.

view_sort

Views. Definition of sorting in a view.

view_tablefield

Views. Something to do with the views plugin.

view_view

Views. Basic information about a view.

vocabulary

Taxonomy. Definition of taxonomy vocabularies.

vocabulary_node_types

Taxonomy. Associates vocabularies with node types.

watchdog

Watchdog. Records watchdog log entries.


Drupal
is by far my favorite CMS, despite the PHP (or poohp as I tend to pronounce it). One of the places Drupal is strong is organization, as long as you want to organize everything in a web. It does provide hierarchies and has breadcrumbs, but these are where Drupal begins to show weakness. In this articles, I'm going to explore how Drupal organizes itself and how you can take advantage of that organization out of the box, or with some module help, or by custom hacking. It's a summary of the research I've been doing on the topic.

Organization

Organization of content in Drupal, as shipped, primarily operates in these ways:

  • Follow that term. You click on a post in a list and see a list of categories (formally "terms" in Drupalese) associated with the post. You click on one of those and you can see all the other posts on the site that are like that one.
  • Order from the menu. You can assign a page to one or more menus, which are just hierarchical lists of links. If a menu item on the screen matches what you're looking for, clicking on it will take you to the node, term page, a list, or whatever the link points to.
  • By the book. Pages can be arranged in ordered hierarchies, like books. If you look at a page in one of these organizations, you can click on the sub-pages or go to the previous page or the next page or up to the next level from any page here.
  • Follow that forum. Forums are really glorified category terms.

That's it. Those are all the organization options you have built-in.

Caveat Emptor

However, there are some inherent gotchas that newbies aren't always aware of. The first is that the breadcrumb is pretty weak in Drupal without some help. This usually reveals itself in a scenario like this (this is approximately how I ran into it). A newby downloads and installs Drupal, logs in as administrator, and goes to create his first vocabulary (a custom system of categories). He creates a hierarchy and adds a bunch of terms. He finishes and adds a test node that has one of the category terms set that has two or three parents. Let's say, "Food > Fruit > Citrus > Orange". However, rather than seeing a breadcrumb on the node view that reads "Home > Food > Fruit > Citrus > Orange", he just sees "Home". If he's like me, he's confused but just assumes he did something wrong. He tries clicking on the "Orange" term to see the breadcrumb there. The breadcrumb turns out to be exactly as expected, "Home > Food > Fruit > Citrus". That means if someone gets that term and clicks on the test node, the breadcrumb that should, intuitively, expand one level deeper completely evaporates.

The problem is that this is a misunderstanding of the purpose of the taxonomy system. The taxonomy system does not provide any structure for the nodes. It provides some structure for itself, but the nodes themselves still belong at the top. It's a completely flat structure. Structure is provided to nodes in Drupal core in one of two ways: the Book module and the Menu module. Which way is appropriate for your site will depend on your needs. Also, neither of these may be satisfactory, but we'll get to that in a bit.

Book Solution

The first mechanism provided by Drupal is the book module. This module allows any node to have a parent. To use the book module, you must first enable the module, configure the permissions, and then create a Book page. The first Book page will be at the "Top Level" meaning it starts a new "book". You can then create additional nodes that are in the tree. The top must always be a Book page node type, but the rest can be any node type you like, but you have to go through the extra step of configuring the node via the Outline tab after your create it. Update April 21 @ 7:28pm: I just realized this is an error. I forgot about the Outline tab. You can make any page the root of a book via the Outline tab. (Book pages automatically have the "Parent" option configured on their create form.)

If you look a the breadcrumbs of Book pages, they operate exactly as expected. Each breadcrumb is created by traversing the list of parents until it gets to the top level and then adds "Home" in front of everything. The book module can also provide a hierarchical list of pages that looks like a typical Drupal menu as well via the Book block that comes with the Book module.

This is, by far, the most common sense method for hierarchically organizing your site's content. However, if you need special content other than the book pages you have an extra step to make it work. If you need to organize non-node content (special forms or something) the Book module may not be any help at all. Also, a single node can't belong to multiple books. A node may only have 0 or 1 parents in a simple hierarchy.

Menu Solution

An even more flexible solution is through the Menu module. The Menu module allows you to create Menus, which are hierarchical lists of links (it allows you to manipulate the built-in menu items as well, but that's another topic). These links may be to nodes, terms, or anything else on the local site that has a URL. They may also be absolute links to get to locations on other web sites. Each menu item has exactly one parent, but since you're only creating links, you could have a single node or other item linked in as many different menus as you need.

Furthermore, creating a hierarchical menu also tweaks the breadcrumb. If you have a node that would otherwise appear at the top level (i.e., it doesn't belong to a book), the first menu it is listed in will be used to create a breadcrumb for that node. Therefore, if you had a taxonomy structure with a matching menu, you could fix the problem of having your node appear without a breadcrumb.

Unfortunately, this too comes at a certain cost. You must maintain the menu structure manually. You have to add each node as it goes. If you have a taxonomy structure to mimic, you have to do double duty on your data entry and then make sure your menus point to each new node you create.

Setting up the menu while creating a node is pretty easy for an administrator. Anyone with permission to administer the menus can setup the menu for a new node via the "Menu settings" box on the create page. However, if you want authors to be able to do this without being able to tweak the entire menu structure, you're out of luck. You either grant someone the right to manipulate everything or nothing, which isn't acceptable in many situations with more than a few authors.

You can address this issue by looking into the Menu Subtree Permissions
module. This allows you to grant edit access on parts of menus to certain roles.

Add-ons

There are many, many add-on solutions for handling this. I'm going to give my favorite choices and then list the others I've found. This is not a complete list, but it does highlight the modules I've examined a bit in my search for a solution.

Taxonomy Menu

A solution that uses the combined power of taxonomy and menu is available in the Taxonomy Menu
module. This module creates a menu item for each taxonomy term in the system. This automatically gives you both downward navigation through menu items and upward navigation through breadcrumbs. This isn't quite as good as the navigation provided by the book module, but with intelligent use of the sticky flag or manual items, you can come relatively close.

Add on Custom Breadcrumb

Another way of handling the breadcrumb is via the Custom Breadcrumb
module. This module allows you to associate a breadcrumb with a node based upon it's node type. For example, if you have event nodes that always needed to appear in "Home > News > Calendar > Events," then you can use the Custom Breadcrumb module to do this. If you need a more variable structure than this, then Custom Breadcrumb still doesn't do it.

Others

Here are some other add-on modules that you may wish to consider:

  • Taxonomy Bradcrumb
    . This module provides half the abilities of the Taxonomy Menu in tweaking the breadcrumb. It does not, however, provide any way to navigate down to the items in the tree, just the parents on the way back up.
  • Category
    . For the daring, there's also the Category
    module which provides a complete replacement system for the core Taxonomy module, Book module, and provides a special menu module for creating menu items automatically on the creation of nodes. However, this is a big module with lots of options and I've back off from using it because it's almost too powerful to figure out how to use it most effectively. I've had some trouble getting it to work really well.
  • Pathauto
    . This module doesn't actually help you organize your site, but it can makes your URLs match your breadcrumb organization structure. I highly recommend this module to make your URLs pretty. However, be aware that the URL aliases can quickly clutter the URL Alias page if you have a lot of pages.
  • Theme Hacks

    If you do a search on the Drupal site for "breadcrumb" you will come across several hacks to the theme. All of which are customizations that make use of drupal_set_breadcrumb()
    . You pass that function an array of links and it will give that array of links to the page template. This is the ultimate solution if no other will work for you.

    However, again, this still only gives you the upward navigation. It doesn't provide any kind of downward navigational structure.

    Conclusion

    Drupal does provide ways for organizing your content, but some of the out-of-the-box methods may not be ideally suited for your situation. Drupal comes out of the box with excellent support for web-like and river-of-news style organization. Hierarchies are quite possible and can be managed, but the structures provided for such assume a relatively light amount of hierarchical information. However, by using a few modules and the taxonomy structure, you can create very flexible and functional hierarchies to suit any site structure.

I was scrolling through my morning feeds and came across this gem on Slashdot, "Should Schools Block Sites Like Wikipedia?
" The story goes on to describe someone's question regarding the fact that the local school board decided to block access to Wikipedia "because students may be exposed to misinformation". This simply describes an opportunity lost and a new form of book banning.

I grew up learning about how books like the Wizard of Oz were banned from schools because some people didn't like the fact that it had a witch. Other books were banned because they praised opposing political ideals. Now, apparently, it's vogue to ban something because it might not be accurate. However, this is still just as bad an idea as all the original book bans.

Where do you stop? The New York Times has in the past few years had at least one reporter fired because he fabricated information published in the Times. Should we block the New York Times because it might expose students to misinformation? Should we also block cable television because certain news anchors published stories in that medium without verifying the facts? Should we start blocking the text books because they sometimes contain errors or misrepresent facts?

Should we stop allowing teachers in the class room because sometimes teachers share incorrect informatino? I once had a teacher tell me that NASA was experimenting with mounting monkeys heads on robots and that the monkeys were controlling the robots successfully, but only for a few hours until the head died. Should we throw all the teachers out because there are some that are crackpots?

No! Of course not. This is an opportunity to explain that all sources are suspect until they are corroborated. If you read something in Wikipedia, you take a note to check any fact you can't verify from your own experience. You then verify that fact in the quoted source (for articles that properly quote sources), you can check your local library and do a database search, check another encyclopedia, look in a journal or magazine, find related books, etc. I find that Wikipedia is a great place to get started, but I certainly don't think of it as authoritative.

On the other hand, you should always do the same thing, insofar as you are able, for any source of information. If a source of information makes a claim, you should check it's sources and possibly verify the claim in other places. It's easy to make an unverified claim. It's hard to make a claim that is cited and backed up with facts and also backed up by other unrelated sources.

The lesson is that some sources are more trustworthy than others, but none are beyond suspicion. The lesson should be that you should always check your sources and verify that what you're reading is factual and reliable. Banning a source only means that you take this object lesson away and you raise students that are actually less able to think for themselves and more ignorant. Great, that's just what we need. Good job Anonymous School Board.

Cheers.

We made a major decision this week that I'm, personally, very happy about. The Boomer
web site is moving completely to Drupal
. Currently, our site uses a CMS called Magnolia
, which is an excellent product, but the needs of our web site are drifting out of sync with the features provided. Magnolia provides good content management, workflow, and document management, but our site is growing in the direction of community building rather than publications. We're already using parts of Drupal for part of the Boomer Extranet service for our top-tier clients
. We've got another offering coming soon that will make Drupal an excellent fit for us and it just doesn't make sense to maintain two platforms anymore.

Since we're still developing business plans and this product is not officially announced, that's about all I can say for now about the community part of the web site. However, I would like to discuss some of the issues I'm going to be dealing with in moving away from Magnolia to Drupal. Most of this involves handling the publication aspects we do deal with in Magnolia that need special consideration when moving to Drupal.

For example, we have a reference library of articles related to topics specific to the accounting profession. We provide these articles to our premium site members, but provide only stubs to the articles to the public. Therefore, I need a way to store these articles, categorize them, and associate downloadable documents with them. I also need a way to secure access so that only the teaser and tags are available for marketing purposes while the rest are avaialble only to the premium subscribers.

Since this is a big issue to cope with and one that Drupal doesn't directly deal with (though I considered a possible solution in an earlier post
), I've created a Drupal Group
to deal with the topic of document management
. I hope to find others interested in the topic to create better solutions in Drupal for this problem. Anyway, if you're interested, please join
the discussion.

Cheers.

There's an old saying that goes, "If it ain't broke, don't fix it." Scott Adams once made the comment regarding how engineers think, "If it ain't broke, it doesn't have enough features." I think the latter thinking must have applied when Google released their latest Google Notebook
improvements this week.

I've become a major fan of this tool over time, but the new look is clunky and cluttered. I liked how sleek the interface was before, but now there's a bunch of extra shadows and rounded corners and borders that really serve no purpose but to distract me from my note taking. The notes also don't collapse very well anymore. I've also found some bugs in the search.

Bah. I hope they fix this soon.

I was going through my daily news reads today and came across this one
on Newsbusters
. It caught my attention because it was about O'Reilly ETech
, which was a conference I had considered attending this year. There's usually at least a few interesting things that come up each year and thought it would be educational. However, when I found out one of the speakers stayed home
because she was receiving death threats on her blog
and in other blogs, that's just freaky.

I don't know Kathy Sierra and I don't particularly care for the Head First series of books by O'Reilly, but what kind of a pathetic human being makes death threats? I hope the person or persons who perpetrated these death threats
are caught and prosecuted. It's illegal and the Internet must not provide any protection from this kind of behavior.

Cheers.

Blogging from Google

Okay, in my last post I posted a blog from Microsoft Word 2007 straight into my blog using the blog API that the latest version of Word supports. I've known I could do this from Google Docs for a bit now, but I hadn't gotten it to work. The reason I hadn't gotten it to work was the same reason that I had trouble getting Microsoft Word to work, the Blog API for Drupal doesn't really work unless the Blog module is turned on. Normally, I blog on my site using the "Story" module rather than the Blog module. However, once I turned on the Blog module, I was able to create Story nodes from Word and now from Google.

Google Documents killer features include the following:

  • Easy to use. Anybody can figure this thing out. Login, create a document, edit the document, save. Done.
  • Easy to share. You can share your document with anyone who has an email address. They can then login, edit your document, and save.
  • Easy to compare. After you have edited your document or others have too, you can see every change that has been made by clicking on the Revisions tab. Again, super-easy.
  • Spreadsheets too. Many of these same features are available in the Spreadsheets as well as the documents.

It's not so great in that some of the editing tools provided are a little too simple. There are no custom styles. There are only three kinds of headings. Tables are difficult to use. Bulleted and numbered lists can't be formatted (outlines are very difficult). You can change fonts, text color, font size, and some other aspects, but there's no way to use styles to make this consistent.

Finally, the worst part is that some of the HTML generated is not clean¿i.e., it actually includes things like font tags and uses line breaks heavily rather than paragraphs. The new Word publisher made my blog entry completely clean. I didn't really use any formatting so it wasn't a complete test, but it was still much cleaner than I've come to expect from Word.

Anyway, I'm using Google Docs heavily at home, especially for collaboration on my pro bono projects. At work, once Word is in place with SharePoint and the other tools to back it up, I think that will be the collaboration location of choice there. We'll see and I'll keep you posted.

Cheers.

2 3 4 5  

Tags

Find recent content on the main index or look in the archives to find all content.