July 2005 Archive

Slow down

By Luke Smith on July 31, 2005 11:56 AM

I often have a hard time speaking. Especially when addressing a topic I am not intimately familar with. When I'm involved in a problem solving conversation, I tend to stumble over my words. The solutions I devise usually come with caveats, and so I end up back at the problem stage. I then devise solutions for these problems, which (you guessed it) also have caveats of their own. The effect of this is that I end up saying something like "we could do A, but then we might have to deal with B and C, but B could be handled by doing D, but then that might necessitate E and possibly F if C involves G. C might be handled by doing H or I, but if we choose H, then G might be worse. I or J on the other hand might be against policy X or department Y would need to be involved. If they do ...". You get the point. But it's worse than that. In fact, I can't get out half of an idea before considering its repercussions, interrupting that idea to address the new one/s (and so on). The trouble is, often it's the process of voicing my thoughts that helps me unearth the considerations therein. The end result is a lot of blubbering that often ends in a sort of deadlock leaving me unable to suggest anything. Or at least it sounds that way. Basically a seemingly random vocal barrage ending in a question mark. Not terribly helpful.
Speaking quickly communicates to your listener that you are thinking quickly. It doesn't communicate your ideas.
Contrast this with when I feel confident about a topic or solution that I'd previously devised or am introducing. In that case, I've already done all the preprocessing. I want to share my considerations with my audience, thinking it will help make everybody smarter. You know, share the wealth. In this case, I speak clearly, but very very quickly. I don't want to be describing my solution for an hour but I do want to save them the trouble of asking questions for clarification. So in this case, a decidedly nonrandom vocal barrage ending in the silent assumption that you get my point in great detail. This is particularly frustrating to me. I feel incapable of organizing my thoughts, then succinctly voicing a summary. I understand that clear communication involves a managable tempo. Speaking quickly communicates to your listener that you are thinking quickly. It doesn't communicate your ideas. You're asking too much of them: keep up and absorb every word. I need to slow down. I need to not be cornered by nervous tension and succumb to the urge to perform. A coworker invited me to a Toastmasters meeting*Not because he noticed my inability to speak. He was just evangelizing. and I think I'll go. It starts a 6:40am and I live 40 minutes away. I'm not an early riser, but I think in this case, I'll give it a try. Have any other tips on organizing your thoughts and communicating clearly? Any techniques you've used that proved helpful in being understood?

Ajax + Client side XSLT

By Luke Smith on July 25, 2005 10:53 PM

Recently I had the pleasure of working with a web interface that simultaneously displayed a single XML data set in two ways, an navigable outline format, and a pure content format. The data itself was describing contract terms, clauses, and rates. Legalese. The interface up to that point was built using a good old fashioned table layout with a healthy side order of custom attributes and inline event handlers on non-standard elements. Ick! Ugly, yes, but there was technically nothing to raise any cross browser compatibility issues. It was designed for IE and didn't display all that well in FireFox, but it did display close to correctly, and all the functionality was there.

That is, until they added this interface. The UI framework loaded separately, then issued three Microsoft.XMLHTTP requests: one for the XML data, and two for the XSL stylesheets to be used to transform the XML.

All the code was IE specific, so I couldn't very well leave it alone, now could I? Besides, I like to develop in FF,*due to its plethora of wonderful extensions. Well that and it's a much faster, safer, and more standards compliant browser. Old news, I know. but was prevented from doing so by this unwarranted tryst with the unruly IE.

So I came up with a nice little library to manage the collection and transformation of XML data, and do it in a cross browser and OO way.

Use it like this:

function page_init() {
    // Create a new object.  Note this needs to be globally
    // scoped so the IO Bridge can reunite the response with
    // the calling object
    xml = new XMLData();

   // Define the source of your data. This can be any URI    // that returns valid xml data    xml.setDataSource("my_data.xml");
   // Also define a couple of stylesheets to transform the    // data once it's here    xml.addStylesheet("outline_view.xsl","outline");    xml.addStylesheet("content_view.xsl","content");
   // Tell the object to call build_view() when all the    // data and XSL files are ready to rumble    xml.setCallback(build_view);
   // Start things in motion    xml.load(); }
function build_view() {    var tree = document.getElementById('data_tree');    var content = document.getElementById('data_content');
   // flush the contents    tree.innerHTML = content.innerHTML = "";
   // Append the generated DOM structure to the target    // nodes    tree.appendChild(xml.transform("outline"));    content.appendChild(xml.transform("content")); }
// Using Keith Gaughan's EventManager library to separate // out the <body onload="page_init();">. EventManager.Add(window,"load",page_init,false);

After the page loads, this will send the ajax requests for each file

  1. my_data.xml, then
  2. outline_view.xsl, then
  3. content_view

Naturally it doesn't wait for one response before sending any other requests.

The two stylesheets are given labels for use in the call to transform(). Label assignment isn't strictly necessary. If you don't provide one to addStylesheet() or transform(), they will assume a label "default", so just don't call addStylesheet(url) with different urls and you should be fine.

Happy transforming!

Z is for zealous

By Luke Smith on July 23, 2005 12:58 AM

I wasn't the pimple-faced 13 year old engaged in a flame war on icq about which linux distro had the better package manager. I also wasn't the football player pushing this kid around in the hallway. I was somewhere in the invisible in-between, doing my part to avoid classification into one extreme or another. I wasn't really outgoing or charismatic, nor was I prone to hiding in the basement cruising BBSs for porn. Sure I played around on my Commodore 64, but I didn't do anything like start my own hardware consulting business before I turned 18. In short, I was kind of a nobody. However, I did test well when I was in school. Very well in fact, and I didn't have to study much, either.*That was me in the back of the class wearing all black and acting aloof yet getting straight A's. In many ways, I consider my test taking ability to be my strong suit. Not just in the school sense, but in all aspects of life. When I pay attention I can determine the relative importance of things with pretty decent accuracy. If I have some confidence that I will be "tested" on a certain subject matter, I'll retain the important points until the test. After that, of course, all bets are off. The problem with this is that, while it did make me a good learner, it didn't instill a passion for learning. I wasn't driven to learn everything about this subject or that, I was just waiting to get a hint from the teacher about what bits will be required for the test so I could focus my attention there. I was lazy, and it was working just fine for me. Having been out of school for about a decade now, the "teacher" in my scenario has become the accumulated perspectives of my boss and coworkers. My ongoing test has become to appear that I know my stuff, whatever my stuff needs to be at that time. I don't really need to know it, I just need to appear to know it.*Actually knowing it is helpful of course. Over the years, I have actually come to know quite a bit, in the real sense of the word, but I still find it hard to apply myself to actually pursue a more focused excellence in a specific field. I'm now trying to cultivate, or even germinate, a sense of passion in the field of web design and usability. Despite what this sounds like, I am quite happy doing web design stuff. I really enjoy it. I'm just missing that sense of "belonging". I'm troubled by my fear that I would feel that sense of belonging in a different line of work. Simultaneously, I fear that I won't feel that sense of belonging wherever I look. One of those no-win situation things, I guess. Fear is funny that way. Though this is one big aside, I'd like to clarify that I'm not a religious man. As such, I don't take direction from the origins of faith pertinent to such beliefs, though I do accept that faith, as an extension of your concept of reality (et al), is a driving force for everybody regardless of affiliation.*I'm pretty sure God didn't tell me to write that sentence. Yikes! Nonetheless, I'm not going there here. What it all comes down to is that sometimes I wish I were a zealot. I'm torn though. Without that feverish direction I feel that I can view more of the world, though the other camp could argue that there's beauty, even truth, in the details; that the closer you look, the more of the world you see. I suppose certain people look around by turning their heads and others by zooming in to what their already looking at. There's more to see either way you go about it. For myself, it just doesn't feel right to close my eyes to so much even though what I see may lack the zealot's clarity. But is the grass really greener for them? Would you give up the panorama for a microscope (or vice versa)?

The Beast

By Luke Smith on July 18, 2005 10:09 PM

The first day on the job was a success. I'm very happy with the environment and I really get the impression that the company has an interest in taking care of its employees. That's a nice change. Well worth the (much) longer commute. I expected to spend my first day setting up my environment, reading docs, and generally familiarizing myself with the application that I was hired to help develop/support. Instead, I'm barely finished installing the bulk of my apps when my boss comes in and tells me that I can learn about the product tomorrow. Today he needs me to review some html and HttpUnitTest classes and make a recommendation for the way this particular strategy thing is to be done going forward. So much for lazing through my first day. I review the code and make a recommendation and my boss forwards it to everybody, telling them this is how things will be done now. Yikes! If I knew I was making policy, I would have used a different writing style. But aw well. I get back to the business of learning about the product and he comes in with another task. I guess there's work to be done here. Another nice change. All things considered, I held up pretty well for running on 2 hours of sleep. About midday, I confirmed my suspicion that the product interface was designed using tables. It's been quite some time since I put anything but tabular data in a table. This is going to take some getting used to. In the interview, I recall the various people who grilled me universally praising my predecessor's apparent god given talent for design. Well, I guess some of them didn't like the color scheme. I wasn't so impressed, but I was looking beyond the flashy round glowing image buttons*Can you say "chimp attract" boys and girls? at the crippled usability. I didn't get a chance to look at the source during my interview. At this point I'm glad, because it may have impacted my decision to work there. The code is truly awful, but there are plenty of perks to compensate for it. Here's an "interesting" code snippet:*Please note that this element was found inside a form
<img src="..."
onmouseover="this.className='imgBtnHover';"
onmouseout="this.className='imgBtnNormal';"
onclick="document.forms[0].action='{resetting the form action to something else}'; document.forms[0].submit();"
class="imgBtnNormal"/>
Now I'm not sure what camp you're from but in my book that qualifies as BAD. In many categories. So what's the punchline? This wasn't the worst of it. Not by a long shot. To tell you the truth, I think the guy had issues with all form controls except text inputs and selects. I can't seem to find any input elements of type button, image, or submit anywhere. There are plenty of tds and spans spammed with any number of event handlers to make them function as such, but no actual, honest to goodness button type inputs. Weird. I think it's ironic that I'm presented with this the day after my article on separating functionality from content. If you'll pardon me, I have some icky code to attend to.

I'm normal, sort of

By Luke Smith on July 18, 2005 5:32 AM

I start my new job in a couple of hours. I didn't sleep worth a damn last night. Naturally, I assume it was nerves. I'm sure the heat had something to do with it as well. Although it got as low 65deg last night (guessing, of course), inside it likely didn't drop below 75. Still, I'm sure it was mostly nerves. My party line has been that I'm both eager and anxious to start my new job. I'm sticking with it. I was concerned with my lack of anticipatory madness, but I guess it was just building quietly. Funny, really. I do so much worse in front of people. When other people are involved, I get plenty nervous, but left to my own devices, I just ride the river. A friend once told me about a dream he had where we were stuck in a little row boat going down a set of nasty rapids toward a waterfall that seemed to drop for miles. He was freaking out of course, because there was no way out and no way to survive. I, on the other hand, was just sitting there enjoying the ride, perfectly calm. I kept telling him we'd be fine.*Convincing argument, I'm sure. When we came to the lip of the waterfall and went over, the boat just sort of floated off the edge like a cartoon, then slowly drifted downward. A perfectly serene trip to the eventual bottom. We were fine after all. I took the dream as a compliment, regarding it as a testiment to my easy going nature. I often consider others' opinions of me to be more accurate a character analysis than my own. See yourself in whatever light you like, but if people think you're a jerk, chances are, you're a jerk. Time for some breakfast. I hope my brain works today. Word on the street is that limited sleep can impare your ability to think clearly. It's 5:40am.*Damn it's early! I need to be there at 8. I'm nearing the waterfall. Let's see what happens next.

Getting around the IE flicker bug

By Luke Smith on July 17, 2005 11:44 PM

IE 6 has a known bug where background images assigned to a tags via css will "flicker" when hovered over or when the page is scrolled. This is due to some quality code that refreshes the image whenever any changes occur in the display (like scrolling or hovering). I recently ran into this issue while working on my wife's site. She wanted the main "Well Mannered Mutts" logo to be a link to the home page. A reasonable request. Since the image is just a graphical representation of content, I set up the logo area like this:
<div id="page">
    <h1><a href="/" title="Well Mannered Mutts">Well Mannered Mutts</a></h1>
   ...
</div>
Then did my favorite image replacement technique:
#title {
   margin: 0;
   padding: 0;
}

#title a {
   display: block;
   background: url(/images/logo.gif) no-repeat top right;
   padding: 147px 0 0 0;
   height: 0;
   overflow: hidden;
}
Then came the flicker. I took advantage of the fact that there was a dedicated container element and changed the stylesheet to:
#title {
   margin: 0;
   padding: 0;
   height: 147px;
   overflow: hidden;
   background: url(/images/logo.gif) no-repeat top right;
}

#title a {
   display: block;
   padding: 147px 0 0 0;
}
The image in the h1 isn't subject to the flicker, and the overflow: hidden hides the content of the link since it was top padded by that same amount. The entire visible area of the logo is linked, but the link text is below the radar.

Body onLoad done the separatist way

By Luke Smith on July 17, 2005 5:31 PM

I'm a big fan of separating content from functionality. Clean semantic markup doesn't have a place for javascript. That's icing. I like to keep to this sequence:
  1. Start with content
  2. Markup the content using the appropriate semantic tags
  3. Begin building your stylesheet to define the character of your presentation
  4. Add the necessary container elements to allow for the design/layout your going for*Ideally, you can create an effective space without adding extra tags, but this usually isn't realistic.
  5. Add the layout style to the stylesheet/s
  6. Build the javascript functionality to augment the site (in a separate file)
  7. Add any noscript section/s to replace "necessary" functionality
  8. Lather, rinse, repeat
Rather than clutter the markup with onBlah events and other stuff that doesn't celebrate the content, add the event handlers in a page_init() function. Then add this handy little code snippet to the end of your javascript file to purge that last remnant of markup+code, <body onload="page_init();">: your_javascript.js
if (window.addEventListener) {
     window.addEventListener('load',page_init,false);
} else if (window.attachEvent) {
     window.attachEvent('onload',page_init);
}
I won't take credit for this code. I copied it from some site a while back. I can't recall which, though. If I happen across it, I'll link it here. Now your <body> is clean and fresh.

Four new eyes

By Luke Smith on July 17, 2005 12:05 AM

I've been wearing glasses since ...oh...maybe 3rd grade. Basically all my conscious life. My eyesight went downhill like an olympic ski jumper that missed the ramp entirely. Before middle school, I was in full on Coke bottles. To this day, without correction, I can't read 12pt type unless it's about 4 inches from my face. Styles being what they were in the early 80s, not only were my glasses thick, but they were tall and wide and the frames were thick plastic. Yeah baby, nothing but the best for me! Contact lenses were becoming more available and cost efficient about the time I moved into middle school. I'm sure permanent psychological scarring still abounds, but at that time, I was able to redeem some inkling of self esteem. Before long, disposables were available and then extended wear. I made the switch as soon as I was able, and I dumped my glasses. After all, why would I ever want to wear them again? From then on I've lived the happy illusion that I was just like normal seeing people: waking up, going about my day, and going to bed again, not thinking once about the fact that I'm practically blind. Then came college where my vision impairment came off sabbatical and took a turn for the complex. Astigmatism. Sorry old chap, contacts can't correct an astigmatism. They couldn't then, anyway. So I had to get glasses again. The blow was softer because I didn't have to wear them except for reading or computer work, and even then, only if I felt I needed them. Besides, they weren't the Coke bottle behemoths of my youth. They were thin, light and hip looking. Studious, even. Well as time passed I seemed to need them more and more, and when I got a job as a programmer, that meant 8 hours a day in front of the computer. At least they were hip. In 1995, anyway. Toric lenses came out which used a ballast to ensure a proper axis on the eye, making them capable of correcting an astigmatism. Hurray! Back to two eyes again! Except when I tried torics they twisted on my eyeball every time I blinked. They always settled back to their proper axis, but this meant every time I blinked my correction would be wrong for a second while a thin object slithered its way around on my eyeball. I couldn't get over this and went back to disposables. Also, they were daily wear only, so I would have had to take them out every day. I'll stick with the glasses, thanks.

I was a 27 year old wizard wannabe

I'm not your typical craven fan of the Harry Potter series. In fact, I'm not much a fan at all. I don't dislike the series, it's just not my bag. However, the young protagonist did happen to have one thing in common with me: his glasses.*Well, that and super powers Though mine were thin metal rims and were never broken in two and magically repaired, they did share that same round shape. Fan frenzy being what it is, simple geometric similarity was enough. I wore Harry Potter glasses. God help me. Styles change. That much is common sense. I accepted that my rims had pretty much gone out of style, and beyond that, I was nearing 30. The "studious" look wasn't really me any more. I dealt with the Harry Potter issue by simply never wearing them in public. Jokes get old fast at work*especially if you help them get old so I was reasonably safe. I still wanted new glasses, but now some other factors were at play.
  • I didn't have a lot of money
  • There was nothing functionally wrong with my glasses
  • I hadn't owned a pair of fully corrective glasses for nearly 15 years
  • My eyes hadn't been exposed to much oxygen for said years
I*Heidi really figured it'd be a good idea to have fully corrective glasses to give my eyes a break from time to time. Really, I'm not sure what that means except that it would be more convenient for me should I suddenly feel a need to go swimming. I don't do a lot of swimming. So I guess it's the oxygen. It must be, cause it sure as hell isn't the convenience. Glasses are a pain, albeit a minor one. So today, Heidi and I went and got two new pairs of glasses for me. One set of full correction, and one to replace my Potter specs. The full correction are on order and will show up in a week or so. I'm wearing the hip (circa 2005) and distinctly non-Potteresque astigmatism correcting lenses right now. I think they're giving me a headache. Where did I put my old glasses?

Of mice and men

By Luke Smith on July 16, 2005 12:02 PM

The other day I had to kill a mouse. Maybe I didn't have to, but I did kill it. I'm not fond of killing things. Insects I can deal with, but creatures with legs and without an exoskeleton, that's another matter. Heidi and I have three cats, so usually around early Spring we start seeing bits of bird carnage staining the garage floor. It's not like I get home from work every day and have to take a snow shovel to the piles of corpses or anything. More like every few weeks we find a bird's foot or some feathers and dried intestine. A little gross perhaps, but no big deal. That's what cats do after all. So the other day I'm about to brush my teeth and I see out the bathroom window my cat Tank fiddling with something. Then the something moves on its own. The last time this happened it was a mortally wounded bird. As you know, cats don't just deal a lethal blow, pull out their napkin and silverware and go to town, they slowly kill their prey while playing with it.
Play
verb.
To manipulate a creature (preferably living) using sharp implements such as teeth or claws.
This time, it was a mouse, and a surprisingly large one at that. It was intermittently crawling slowly away, but otherwise just sitting there awaiting its inevitable demise.*Perhaps I'm anthropomorphizing. It was having better luck when it wasn't moving, but it didn't really look to be that bad off.

Hero or Hatchetman?

So now I'm in a spot. If I continue to go about my business, the mouse will die a slow and agonizing death and finally end up in bits strewn across my garage floor, or if I'm lucky, on the patio. Tank would eat it and probably be just fine*and need less for dinner. On the positive side, I now have one fewer mouse traipsing about my home. Now, I don't much like the idea of even a mouse suffering a slow death. If it's destined to die, then mercy; if not, life.

But which is it?

At the time, I certainly wasn't in the mood to reflect on how the concept of destiny fit into my greater world view. I had just learned there was a mouse in my house (bad) which my cat had caught (good) and was about to transform it into all-organic finger paint. Really, I just wanted to brush my teeth. Keep in mind that I'm nonplussed about the idea that the reward for saving the mouse is the continued existence of a mouse in my house. I considered the following options:
  • I could catch it and
    • toss it into my neighbor's yard, making me the obvious first choice for the coveted "Best Neighbor" Award, OR
    • drive it to the nearest animal hospital—who am I, Mother Theresa? OR
  • I could kill it and get back to brushing my teeth, OR
  • I could close the window and make a mental note that I likely had some clean up to do later
Uncharacteristic of my idiom, I chose the more violent route.

Choose your weapon

Heidi has killed far more rats, mice, and other small creatures than I'm sure I will in my lifetime. She studied at Moorpark College in their Exotic Animal Training and Management program. This involved feeding a lot of big things littler things. She's told me many stories of slamming rats, giving hand gestures and everything, but I'm not feeling up to grabbing this mouse. So at first I think "What would Heidi do?" then I opt for the hatchet*Heidi would not have opted for the hatchet.. Feeling like a positive barbarian, I grab the hatchet from the garage, walk outside, push away the cat, and swing. And miss. Well, worse than a miss, really. It moved during the downstroke, causing my blow to fall off target and grievously wound it. It screamed*squeaked, really, and I quickly chopped again. And again. And perhaps one more time to make sure its life was extinguished. I bagged the body and chucked it in the trash. It was dead, and I felt like a monster. If the first swing had done the deed, I'm sure I wouldn't feel this bad about it. It's silly, I suppose, but I feel like I let the mouse down. I failed in my silent promise to be kinder to it than my cat would have been. I think I forgot to brush my teeth afterward.

Dream state

By Luke Smith on July 16, 2005 12:43 AM

I'm a big fan of human behaviour. I'm constantly studying myself and those around me. There are volumes in body language, be you the author or reader. There's much to be said about the art of writing your body language—purposeful use of physical subtleties—to reveal, hide, or even disguise your thoughts when interacting with someone. Some people have a good poker face, others don't. Some think they do, but in fact don't. But it's not all poker*I think I'd like to play some poker sometime...I wonder how good I'd be. Giving somebody the impression you're interested in what they're talking about when you aren't or vice versa. Is that smile paper or plastic? But I digress. The point is that I pay a lot of attention to human behavior. This story is about my recent observations of my own behavior.

I quit!...sorta

Old news, but I quit my job for a new one across town. I had some time-off to burn, so I took my last week off. I've been working on my blog design (and a bit on Heidi's site), and that's pretty much it. I've had a great time doing it and all, but the weird thing is that my mind never really wandered to distraction. I mean, I just quit my job for crying out loud, and I'm starting a new one in three days that I feel ill prepared for. Nonetheless, I'm working on my blog and simply not concerning myself with all that drama. I'm just not feeling it, almost as if I never had a job, and in fact wasn't starting a new one on Monday. As if what I have been doing for the last week is what I have always done.

Paring down my mental scope

Today I had to go into work for my exit interview and to receive my final check. It just felt like another day going to a place where there were people I knew. The dress code there is mostly casual, but today I wore flip-flops and a teeshirt, which are against policy, as if it wasn't at all unusual. I can understand wearing what you want on your last day, but I didn't even think about it. It wasn't a subtle defiance, I was just getting dressed and that's what I decided on. I went in, had my exit interview and went to my farewell lunch with a group of my coworkers. Just another lunch. Came back, cleared off my desk as if I were moving my stuff to a new cubicle, saved off some personal data, cleared off some accounts etc. No trepidation, no nervous tension, no nothing. Just doing this, then doing that. No thought beyond the moment. I went to a final checklist interview with my boss's boss*My boss left on vacation two days after my two week notice then went around saying goodbye to everybody, shaking hands, offering my leavings to the scavengers, etc.

I don't need to worry about what's going to happen next, I'm directing this picture show

All the while, I feel like I'm in a dream state. I don't need to worry about what's going to happen next, I'm directing this picture show. I'll just make something interesting happen (or not). Or like I'm a kid again, when my world spanned as far as my cul de sac. On Monday, I'll drive to the other end of town, walk into a new building and start working with entirely new people in an entirely new environment. But right now, it feels like today I walked through this door, and tomorrow I'll walk through a different one. But on the opposite side of either door will be the same thing: me.

em, what?

By Luke Smith on July 15, 2005 11:37 PM

Elastic layouts seem to be the new nifty idea on the web design scene (or maybe just the scene that I'm privvy to). "Elastic" is just one of the buzz words available in the layout market. The big ones, it seems to me, are:

  • Fixed
  • Liquid
  • Elastic

I'll talk a bit about each of them, the UOM of choice for each, and some of the pros and cons and why you would chose one over another.

What, no gaseous layout?

You'll note that all the layout categories listed above are themed according to a state of matter. Cute, huh? Yeah, whatever, but their use to describe the layouts is fairly accurate. Think of them like this:

  • Fixed => solid
  • Liquid => liquid (duh)
  • Elastic => colloidal*Coll—what? Think pudding

For all the examples below, let's use a simple two column layout:

sample.html

<html>
<head>
  <title>Two, count them, TWO columns, a a.</title>
  <link rel="stylesheet" type="text/css" href="style/basic2.css" />
</head>
<body>
  <div id="page">
<div id="left_column">
      <p>
        This is my left column.  Isn't this nice?
      </p>
    </div><!-- End left_column -->

    <div id="right_column">
      <p>
        Imagine a search form or link list here.
      </p>
      <p>
        Yeah, that would be neat.
      </p>
    </div><!-- End right_column -->

  </div><!-- End page -->
</body>
</html>

basic2.css

body {
  background: lightblue;
}
#page {
  margin: 0 auto;
  overflow: hidden;  /* wrap container around floated contents */
  border: 1px solid black;
  background: white;
}
#page div {
  float: left;
}

Fixed. What do you mean zoom?

Fixed layouts use pixels (px) dimensions to define a set of regions in a page to contain content, imagery, etc. Since a pixel is a fixed size on the screen, a block element with a width of 400px will be exactly 400 pixels across regardless of browser resizing or text zooming.

Add these instructions to our stylesheet:

#page {
  width: 770px;
}
#left_column {
  width: 500px;
}
#right_column {
  width: 270px;
}

We have a series of fixed width declarations for our columns and the container block #page. If you view this page at a resolution of 800×600 in a shrunken browser window, the page will extend horizontally beyond the viewing area, because the viewing area is narrower than 770 pixels. Similarly, if you view the page at a resolution of 1600×1200 on a full screened browser, the whole page would display, but would fill only a relatively thin slice of the window.

Additionally, if you zoom the text, the text grows (go figure) but the container size stays the same, so the visual effect becomes progressively more claustrophobic.

Fixed layouts are often used due to their ability to more easily incorporate imagery in the page style. It can be a lot of work to create a nice visually charged design. It's frustrating beyond words to spend all this time only to have it blow up when viewed under "unusual" conditions.

Don't drink any ol' liquid

Liquid layouts go the opposite direction. They embrace the flexibility granted to the viewer to browse at whatever resolution in a window of whatever size. Hippies. Where fixed layouts are based on the px uom, liquid layouts are based on percentages.

Liquid layouts are arguably the most difficult to develop cross-browser support for. Maintaining a nice look and feel, regardless of scale, can really limit a designer's style options. The reasons for this are many, but I'm not going into detail about them here. Suffice it to say, "who owns what percentage of a block's visual space?" and "what becomes the base measure for a nested percentage measure?" are intricate questions answered differently by our friends in the browser coding business.

Add these instructions to our stylesheet:

#page {
  width: 80%;
}
#left_column {
  width: 70%;
}
#right_column {
  width: 30%;
}

So the idea here is that the column space will consume 80% of the visibly available space in the browser window, and the two columns will consume respectively 70% and 30% of that space. Assuming this worked cross-browser (I'll give you a hint, it doesn't), when our 800×600 viewer and our 1600×1200 viewer each visit the page, the layout will be proportional to their view port size. If they resize the window, the widths will adjust automatically to maintain the layout.

The text inside the layout, similar to the fixed layout, lives in its own world. If we zoom in and in and in, the same claustrophobic effect occurs, but at least we can keep expanding the browser to fit it!

There's always room for ... elastic?

The elastic camp comes from the point of view that your design and your content are inextricably tied. A designer can't have full control of the presentation unless proportions can be maintained. Enter the em. The em has a soridid and vague history that has led to wide spread confusion about how one properly defines 1em as a unit of measure. I'll cut to the chase and say 1em = the point size of your font. If a12pt font takes up 16 vertical pixels of display space on the screen, then 1em = 12pt = 16px. Seems simple enough, right? Yeah, it took me a while to get it, too. There's (much) more to it, but for our purposes, this will do.

The basic idea behind elastic layouts is that your font size determines the widths/heights of the elements in the layout. The fact that the uom in elastic layouts is not percentages makes it more akin to fixed layouts than liquid, but there's a bonus to the elastic plan: the layout manages the typographical proportions automatically. In short, zoom, baby, zoom.

The vague point with building an elastic layout is how to best work with the uom. For starters, you as the designer don't know how big it is, and can't, since each viewer could have different font settings in their browser. So you start with an assumption that the default font size on most browsers is 16px. You know your multiples of 16, right? How many ems is a 770px column if 1em = 16px. If you know the answer, I'll bet you didn't just come up with it in your head. Though possible, who wants the pain of calculating the em equivalent to Xpx for every sized element in their design?

So let's prime the em to something more friendly. How does 10px strike you? I like it, too.

body {
  /* Set 1em ~= 10px under normal conditions */

  /* Note: you can't do the following.  it breaks IE */
  font-size: 0.625em;

  /* However, for some reason, this works */
  font-size: 62.5%;
}

There's actually more to it to get the pixel to pixel conversion working, but without, it's pretty darn close.

Now throughout your stylesheets, all units of measure are in ems unless yo want them to maintain specific sizes. For example, this site uses both ems and px to position the "...but I digress." image so it stays lined up with the horizontal rule images when you zoom*Try it. Zoom the page. the page. Getting to work in one unit of measure is, in my opinion, awfully convenient. Especially when you get the bonus of relational resizing.

The effect this has is that the page scales as a unit. If you zoom in or out, you're not just zooming the text, you're zooming the whole page (less the images, unless you sized them w/ ems). This gives the page more of a printed media sort of feel. Precisely the feel I was going for in this blog design.

The layout low down

Fixed layouts

The easiest, but restrict the browser to a specific display scale. If fonts are sized in pxs, some browsers won't allow text zooming. If you're using a small font size, your usability suffers. If you don't use pxs, your text will zoom inside the fixed container, unbalancing the typographical harmony (and crimping your style). Also, the layout is the size defined despite the machine's resolution or the size of the browser window.

For image heavy layouts, Fixed tends to be the way to go, since you will likely be working with images that might not handle scaling all that well, and work together with a layout of specific proportions.

Liquid layouts

The most difficult to create. They allow the greatest flexibility to the viewer, allowing for maximum screen real estate consumption. If snazzy style is less important than quantity of content, liquid layouts fit the bill. Also the relation of a static text size to the scaling content container effects the measure of the text, thereby effecting readability.

Elastic layouts

Fairly easy to use, but make the final product sort of a guessing game. Where they use a fixed unit of measure, the base size of this measure isn't constant across all browsers/views like in the Fixed layout. Also similar to the fixed layout, you have to construct your design with a particular resolution in mind (commonly 800×600). Sites with a limited number of images, but a strong need for content balance fit well in Elastic layouts.

Accessing the User's System Colors

By Luke Smith on July 15, 2005 7:21 PM

Let's say you want to create an app interface that has the look and feel of a desktop app. Well, besides the lack of state being an issue, there's the color issue. For better or worse, anybody can set their window colors to any number of horrendous combinations of painful colors. We're talking train wreck here. Or, for the sake of equality, let's say the user has an innate ability to mix and match colors like Rembrandt. Regardless, as a designer, you can't assume the audience has left their button colors alone. Well, there's an answer. CSS2 defines access to the user's system colors. Take a minute to skim over that... Done? Good, Perhaps you might be interested in making some links look like buttons. sample.html
<style>
  a {
    background: ButtonFace;
    color: ButtonText;
    border: 2px solid;
    border-color: ButtonHighLight ButtonShadow
                  ButtonShadow    ButtonHighLight;
    padding: 3px 5px;
  }
</style>
Have fun.

Modularized Stylesheets and html>body

By Luke Smith on July 15, 2005 7:00 PM

Now that IE is the antequated browser on the block, I believe that style instructions (hacks) necessary to make IE behave should be separated from your “official” stylesheet. In this article, I’ll discuss using modularized stylesheets and using the > element identifier to help produce clean, readable stylesheets.

Our friend @import.

So NN4 sucks. That’s a known. However, we still needed to support it. A shame really, because we could do so much more with a browser that understands at least CSS1. So it became standard practice to separate the style rules for NN4 and IE by means of:

sample.html

<link rel="stylesheet" type="text/css" href="style/blah.css" />
<style>
  <!--
  @import url(style/kazowie.css);
  -->
</style>

This kept NN4 from reading any of the style instructions in kazowie.css that it did understand (which would no doubt ruin the interface for NN4 users). Yeah yeah, old news.

Before we get into the new news, let me address a building block concept:

Modularize your style

Every page has a layout, a presentation scheme, and a set of typographical rules to establish the over all look and feel. Most pages also have a navigation of some sort. Every page in a (well themed) site should share these aspects, but individually, pages will likely have certain content that should get some special attention from the style department. But you don’t need to clutter your stylsheet/s with all these details.

So instead of thinking of giving a page a stylesheet, think about setting up the layout, building the presentation framework, and describing the typography, then think about “styling” your specific page.

So let’s create a sort of style heirarchy where a default.css uses the @import rule to pull together the full page style from a series of stylesheets, each assigned a task:

sample.html

<html>
<head>
  <link rel="stylesheet" type="text/css" href="style/NN4.css" />
  <style>
    <!--
    @import url(style/default.css);
    -->
  </style>
  ...

default.css

  @import url(style/layout.css);
  @import url(style/presentation.css);
  @import url(style/typography.css);

When you want to make proportion adjustments to the layout of your site, you know right where to look.

There are arguments against excessive @importing. For example, each @import is going to make another call to the server and hence, after all the http info sent to and fro, you’ve now consumed more bandwidth than you would have if all your CSS was in one file. Whatever. Make up your own mind on this. I like the cleanliness and flexibility.

Using this model, you could have a series of page-specific stylesheets that each begin with either @import url(/style/default.css) or with a series of @imports that pull in just the stylesheets needed to support this page. You might go so far as to “classify” your stylesheets into a sort of @import-based heirarchy like this:

sample_page.css

  @import url(style/core.css);
  @import url(style/golden_list_presentation.css);
  …

core.css

  /* Set global style rules */
  @import url(style/layout.css);
  @import url(style/presentation.css);
  @import url(style/typography.css);

golden_list_presentation.css

  /* inherits from list_presentation */
  @import url(style/list_presentation.css);

  /* override some style elements and set new ones
      to customize the default list presentation rules */
  li { color: yellow; }
  …

But I digress. That seems a little overkill, even to me.

Let’s get back on track…

Using the html>body syntax to work around IE quirks

Just as NN4 doesn’t support @import, IE doesn’t support the > element identifier. So, sticking with a familiar paradigm, we’ll use the same lack-of-support technology to isolate IE quirks. This may seem a little backwards and in a way like we’re isolating the good browser rather than the bad, but bear with me as the effect is the same.

Since we’re in the heirarchy mood, let’s branch the layout stylesheet file as well.

layout.css

  @import url(style/layout/IE.css);
  @import url(style/layout/CSS2.css);

  /* Universal settings */
  div#container {
    padding: 15px;
    margin: 0 auto;
  }
  …

Here we’ll split the layout instructions into two stylesheets, one to set IE’s quirky dimensions, and a second to set the dimensions and such for up to date browsers. To prevent IE from reading this style, use the html>body element { ... } syntax:

IE.css

  div#container {
    width: 770px;
  }

CSS2.css

  html>body div#container {
    width: 800px;
  }

Maybe I’m just being a clean freak, but I sure do like the look of css files that are simple, and uncluttered with hacks.

Put all the code you’ll need to (properly) reimplement in one file

Another, probably simpler, method is to first import a stylesheet that contains all the instructions you’ll need to reimplement for modern browsers, then split the reimplementation into a set of modularized stylsheets.

sample.html

  <html>
  <head>
  <link rel="stylesheet" type="text/css" href="style/NN4.css" />
  <style>
    <!--
    @import url(style/default.css);
    -->
  </style>
  …

default.css

@import url(style/ie_hacks.css);
@import url(style/layout.css);
@import url(style/presentation.css);
@import url(style/typography.css);

Now design your pages for a modern browser, then @import a separate file with the (unfortunately) necessary IE settings. Now all we have to fear is that IE starts supporting the > element identifier syntax but leaves the box model broken!

Cheers.

New Hotness (and Tasklist)

By Luke Smith on July 13, 2005 6:59 PM

Say hello to my new style. It's been a long and very enjoyable several days working on it. Previous to this week, I really had very little contiguous time to throw at it, but as of Monday that changed. You might think that rolling out of bed, walking into the office, and sitting down to work sans-breakfast might be viewed as some sort of deadline induced torture. Far from it. I've had a positively exhilarating time.

I wanted a very open feel with plenty of white space and clean, intelligent typography.

Being the anal retentive perfectionist sort, I've been fighting myself the whole time not to get distracted with minutia; just focus on getting a beta product out there, and fix it in place. I'm quite happy with the overall theme. I was aiming for an homage to the print media, accented w/ the typical reds, but hilighted in conservative use of greens. I wanted a very open feel with plenty of white space and clean, intelligent typography. I may be new at this, but I'm pretty happy with this little offering. And now, time to go climbing.

I'll take what's behind door #2

By Luke Smith on July 7, 2005 12:12 AM

Today I turned in my official resignation. I'd told my boss last Friday that I was putting in my notice, but I didn't put it in writing. She and HR were agreeable in that HR said they could back date the resignation so I would be eligible for vacation payout (I guess there's a policy stipulation that states if you don't give two weeks, you don't get the payout). Since the company was just purchased, there was a very nice severance package available to people that suck—or are managers. Funny that. If you aren't a valued employee, we're going to pay you a lot of money and let you go in 6 to 12 months. If you are a valued employee, we're going to reward you by giving you the finger and a year's worth of busy work amidst org chart mayhem. As a valued employee, I'm naturally bitter. During one of the phases of org chart shuffling (which continue to date), I was moved out of the web department and into a role that tasked some of my talents but otherwise just set me back about five years. Now, the talents I'm referring to have to do with data mining and management. Sure, I'm good at it. But that doesn't mean I like doing it, or have any interest in pursuing a greater level of excellence forthwith. In fact, at least today, I'd be happy to leave that to the DBAs. Who knows, maybe I'll discover a new love for it in a few years or even months. But for now, it, along with the other work, was basically turning my resume to dust. I told my boss that I wanted an out date—a nice way of trying to get severance—or a chance in the very near future to work on something remotely progressive. She came back the next day with the answer: the finger. Metaphorically, of course. My boss is a very nice person, and I feel for her situation. But for me, nothing. So naturally, job hunt went into full swing. Shortly after (hurray for networking!) I got an offer for precisely the kind of work I'm good at and enjoy doing, with the icing of getting to work in Java, and potentially .NET. Good stuff for the resume if nothing else. Much better than sitting on my thumbs for a year, that's for sure. So after the offer, I told my boss that I was putting in my notice, but as I said, nothing in writing. As I was telling my coworkers and friends about my impending departure, some suggested that I try for the severance. There was a clause, after all, that stipulated that should my job responsibilities be changed substatially (presumed for the worse), that I could quit and evoke my severance. Now I'm not much of a gambling man, and certainly not one for confrontation, but the payout we're talking about could do wonders for my financial situation. The problem was, I just didn't feel right about it. I talked it over with more people and over time, got in the mindset of "it doesn't hurt to try". Mostly. It was an ethical quagmire. On the one hand, I'm very unlikely to see these people again, and there's no way I'm going back there. And the money! But on the other hand, I couldn't truly convince myself that my circumstance was a valid case for the severance. I used to be quite fond of creative interpretation of rules, given that such interpretation would allow me to do whatever it was I wanted. But I've grown up. I've come to accept that many rules are there for many reasons. Obviously some are just dumb, but usually it's easy to tell them apart. I'm not a religious man, but in the absence of a fear of eternal damnation (etc etc), I still try to follow the straight and narrow. So what's the real price of pursuing this ethically gray path? You know, it doesn't matter because what it comes down to for me is answering the question "does this feel like the right thing to do?" And to that, the answer is no. After all the discourse and philosophical wranglings, it was harder to accept yes than no. Sure I could use the money, and maybe there's a chance I'd get it. But I guess I'll take what's behind door #2.

If only IE didn't suck so bad

By Luke Smith on July 6, 2005 11:31 PM

I design first in firefox then revise for IE. Some design aspects can be frustrating to make work in the first place, but the real pain is that next step. Nowadays I pretty much know when something won't work in IE before even opening it, but I always seem to be surprised. It's become a sort of natural expectation that my work will be butchered by IE, but just how it's butchered often catches me off guard. I published a WIP page for the design I'm building for this blog, as a friend wanted to see it. Since I work in linux, it gave me the first opporunity to view the page in IE. I knew perfectly well that it would be broken, but what surprised me most was how certain things weren't broken. Nonetheless, I have my work cut out for me. It's an age–old song, I know, but it's very frustrating having the opportunity to design for good browsers, but having to hobble your work for the likes of IE. At least I don't have to care about NN4 any more—well maybe I should, but I don't, and I don't even feel bad about it.

A short aside

By Luke Smith on July 5, 2005 11:24 PM

So I'm wont to go off on tangents. It's just the way I think, and probably the way most people do. But rather than hear the internal dialogue and carry on, I tend to feel trapped by the new idea. The aside gains so much presence in my mind that unless it's vocalized or otherwise dealt with, it fully derails my thoughts. It just takes over. For my blog, I thought it would be a mistake, even dishonest, not to respect that part of my character. So I add asides to my posts. It's easier for me anyway.

But which track will the train follow?

The problem with asides is how to treat them textually so they add to the content, rather than temporarily derail the reader's flow. That whole respect the content thing. Well, asides are content...sort of. Like in theater, they help the reader along or offer situational comedy, but the story itself doesn't require them. So I wanted to have the asides in the flow of the text, so the raw semantics would be accurate, but I wanted to avoid them impinging on the logical flow of the actual content. Here's what I devised:

My layout is a sort of 1.5 column layout, where the primary content is given the lion's share of the horizontal real estate, but there's a second columnar "area" to the right. I purposely planned this space not to be wide enough for an effective second column. It's there for spice. I styled blockquotes and images to hang into the area, and supporting text snippets to reside there alongside the content to which it pertains. A perfect place for asides.

Off to the sidelines with you

The asides are marked up inside a <span class="aside"> tagset inside the paragraph which sparked the invading little idea. This makes it natural to continue writing in stream of consciousness mode. So first things first, let's pull it out of the content

.aside {
   display: block;
   float: right;
 …
}

Since the containing <p> tagset has a width set, we need to liberate it.

.aside {
   display: block;
   float: right;
   position: relative;
   left: 14em;
   width: 13em;
…
}

That's a handy way of pushing the float 1em beyond the border. An adequote padding in this case. But the problem with position: relative is that the space in which the element was assigned before moving is sort of reserved, as if the rest of the content didn't know it wasn't really there. Well, in this case, it left a big hole in the content. Not cool. Simple fix?

.aside {
   display: block;
   float: right;
   position: relative;
   left: 14em;

  width: 13em;   height: 0; … }

Default block overflow behavior is show, so our content now thinks the aside takes no vertical space, so there's nothing to wrap around. And our little aside lives happily on the sidelines.

Well-enough, you look lonely

I did say that pseudo-column was for spice after all. To give the aside a bit more flavor, I naturally set the font attributes to give it an appropriate feel, but then—for the browsers that can handle it—I added some colorful context.

.aside:before {
   content: '\0AB aside: ';
   color: #977;
   font-weight: bold;
}
.aside:after {
   content: ' \0BB';
   color: #977;
   font-weight: bold;
}

Leaving the text a lighter color to spare intrusion, I added the visual stimulus around the aside. Not just because I can, but I thought the red gave a little life back to the somber nature of the copy, which is, after all, the point of an aside.

Progress

By Luke Smith on July 5, 2005 10:39 PM

I'm making some headway on the design. I would say redesign, but the default design—while nice—isn't mine. I haven't read up to grid design yet, so let's just hope I can feel my way through it all. I've been focusing on the typography and it's looking pretty swell so far. Actually, I'm pretty much done (I think) with it. Now it's a matter of positioning the site information. The title area, greeting, footer, and post content is all places and happy. I'm trying to devise a navigation placement that fits with the theme. Truth be told, I should be working on my wife's site. I threw the thing together so many months ago, just to get something published. It was embarrassing then, and it's even worse now. Of course she's not the ideal client. *I hope she doesn't read this :). My favorite pair of requirements was that it be the earthy brown of her business cardstock, but fun!

Whatever you do, keep moving forward

By Luke Smith on July 3, 2005 11:37 AM

Ok, it's time to add a little me-style to this blog. I'm torn though. As you know, the domain is lucassmith.name, but the blog is named Dr Prolix, a favorite handle of mine, and very appropriate. Well, at least the prolix part. One of my goals for this blog is to help focus my writing; stop being so verbose. I could digress (obviously). So here's the crux: I believe that a site should have a consitent look and feel throughout it's navigable areas, and I want the domain to serve as a location for me, not my handle. However, Dr Prolix is much more inspiring a name/concept than lucassmith.

Just get on with it!

So I think I'll adopt a methodology that I've been trying to incorporate into my daily life. Just do little bits at a time. I tend to want to do everything at once. If the project is big, I'll wait until I have time to do it all, then just go from start to (hopefully) finish. (aside: I just noticed that the font used to type/edit a post in WordPress is a serif font, but the default style for displaying it is sans-serif. Odd.) Not surprisingly, I tend to not quite make it to the finish, but it's so close that it will do. I'm thinking specifically of my remodelling work. My bathroom has been nearly done for almost two years because I couldn't fit all the work into the two weeks I allotted myself to do it in. I'm just recently starting to finish it up because of my new method of "just do one thing every day".

GTD

There's a big following of the Getting Things Done book and teachings of David Allen (and I would suppose many others). I see GTD pop up time and time again on many of the blogs I read. Ironically, I haven't gotten around to reading many articles on it, let alone the book itself. But this blog is a testimate to my burgeoning ability to escape the overload paralysis that's plagued me for so long.

Did I say focus?

So here I am, a couple paragraphs later, and I haven't talked much about design. But at least it all relates. As I was saying, I'm having trouble coming to terms with the overall style direction for the site. Really this is just a symptom of my troubles deciding on an overall purpose of the site. What's the main purpose it serves, and for whom? And my answer is: blech. I'm not going to worry about that today. I have some style ideas for the Dr Prolix section, and I'll start there. The rest will work itself out in time. I need to keep moving forward. If I wait for all the answers to come, chances are I won't like those answers in a couple months anyway. May as well do some rough drafts. Really, every answer is a rough draft anyway.

Big changes

By Luke Smith on July 1, 2005 11:30 PM

So I quit my job today. Not the sort of thing I'm in the habit of doing. Eight years I've been there. Well, nearly eight. The last two years at least, I've been somewhat (read: totally) pigeon-holed into a sort of "fill in the blank" position, mainly consisting of data mining and updating, quick and dirty one off scripts, and simple web applications in Perl and PHP. In my growing anxiety for personal growth, I failed to realize until just recently that my employer doesn't technically have a responsibility to help me grow, though it would seem to be in their best interest. I guess I just grew up a spoiled child or something, but it didn't occur to me that personal growth is 100% my responsibility. If my employer puts me into a situation where I will be forced to learn, more's the better, but they are not obligated to do such—I am.

This good deed will cost you $24.99

It came as somewhat of a blow to me that the world doesn't owe me anything. How embarrassing! I mean, how long have I lived that way? You'd think I would have learned that amidst my teenaged angst. One of those "well, duh!" moments. In a flash, I went from feeling sorry for myself to feeling disappointed in myself. I'm sure there are all sorts of rationalizations I could make, and indeed must have been making, for this pattern of thought. For example, karma. I try to be a good person to everybody, do the right thing, even when I don't need to, etc etc. You know, all that do-gooder stuff. Look at my pretty white hat; I'm the good guy. The problem with this theory is that it's often a selfish desire driving the behavior. I expect good things to happen to me because I am about to do "the right thing". Now, I'm happy to say this isn't always the case, but there are times. Who knows, maybe there's something to the whole karma thing. It's far too late (and off-topic) to get into now. But you know, regardless if I'm "destined" for good returns, I'm not the keeper of the calendar for those returns.

Separation of work and life

Recently at my now former workplace, my boss asked me if I'd be interested in taking a Java class. Of course I would. The class, which I couldn't get into because registration was closed, ran Tuesdays and Thursdays in the evenings, right after work and stretching out until 9pm or so. But that infringed on my busy living schedule! This was the impetus for my epiphany. Of course a professional development class would be in the evening. The alternative is the class runs during the work day and you can't work. Oddly, some people have work to do at work, so an evening class is better for them. Ok, so most people. Somehow in my arrogance, it eluded me that my employer expects me to have an interest in bettering myself and as such expects me to pursue these opportunities myself. Now that I think about it, that does sound reasonable. But really the big failing here is that until then, it didn't occur to me to pursue these opportunities. I just waited for my employer to offer them to me. You can lead a horse to water (etc), but if you have to lead the horse to water because otherwise it would dehydrate and die, you've got a bum horse on your hands. That was me, the bum horse. Fortunately for me, I did manage to learn some things on the job that landed me a better job elsewhere. Mind you, many of these things had very little to do with my particular responsibilities, but in the end, those things were what made me marketable. In this new role, I'll be expected to learn many things I've been wishing I were expected to learn at my former company. This time, however, I think I'll try the proactive approach, and stop being the spoiled child.

ls.n

LucasSmith.name

Luke and Liam

I'm Luke. I am a front end engineer at Yahoo! on the YUI team.

Mostly I write about code stuff, but occassionally I'll mix in some real life. You've been warned.

Archives

Tags

Feeds

Subscribe to feed Recent entries

Content licensed under Creative Commons

Code licensed under BSD license

©2005 - 2010 Lucas Smith

Powered by Movable Type