Seattle: Overcast, 61° F

website design

I'm finishing up the musings part of the site. This should be the first musings page. Underline here.

I'm spending a lot of time redoing the inner workings of the website. I'll explain later why I've done this (damn you Chuck!), but I've been realizing that rehashing old musings is not the same as discovering new ones. Except for the formatting (which Julie promised to help me on), I think I'm mostly done with the website.

It's now time to do something with all this neat technology I created. (That is, until I figure out what else the website is missing...perhaps a comments page? Damn, I'm so easily distracted.) I should have some time during my long, long vacation to write stuff. Here's to writing stuff that's worth reading!

Houston, TX | | sewcrates.com

holy spellchecker, batman

I just thought I’d drop a quick note informing my faithful reader (since we’re not counting my mother) of a significant change to my website.

Allegedly, I misspelled ‘ennui’ on the title of my webpage. Thankfully, all evidence of this so-called misspelling have been removed (not that there was any evidence to begin with, of course). I would never have missed such an important spelling mistake while coding my website. As a certain bald, Sicilian warrior-thinker once said, “it’s inconceivable.”

Chuck pointed out this supposed mistake to me today. He finally returned to Korea from his US visit, and I'm now expecting to see lots of updates at his website. You see, it’s an ego-thing between Chuck and me. As I will explain once I get around to writing my about section, my entire inspiration for improving my website came about because Chuck’s site was so damn good. If his had been crappy, I never would have implemented any of the improvements, and I would have gotten a lot more sleep (I stayed up to at least three in the morning every day I worked on coding my site). The arms race continues....

Did you noticed my zoomed-in thumbnails, Chuck? Hmm? All done automatically through a web-interface on this website. Yes, I am fancy-shmancy.

Houston, TX | | sewcrates.com

90th birthdays and Stephen King's writings

I’m back. I’ve received messages from my Frequent Readers: both were terribly worried. Okay, they weren’t so much worried as disappointed. They asked, Why would you pretend to post often, even going as far as calling others out for not posting, and then turn around and not post at all. It’s a good question and I will describe the answer in sufficient detail to bore the lot of you (I was going to say “to tears,” but I’ll spare you the cliché—oops, too late).

Sit back, make sure your seatbacks are in their reclined and comfortable position, and prepare yourself. If the measure of a musing is the number of letters typed on the screen, then this one’s a doozy. If the measure of a musing is the amount of caffeine that I intake before sitting down to write, then this one’s a grande (that’s with caffeine).

To start with, as you noticed if you’ve read my last few musings, I’ve been in a bit of a rut. These musings have become less about what’s going on in my life and more about my writing, and lately my writing has been rather bad. I don’t write about my work life here, partly because this is a public website, but mostly because I deal with it enough during the day and I don’t want to relive each moment through this. Instead, I share my current thoughts and environments. I’ve written a number of musings on my Starbucks pals—pals might be too strong of a word. Except for the coffee girl who believed I was a student (I haven’t seen her in awhile), I avoid talking to the masses at the coffeehouses. (My entire conversation with the coffee girl consisted of her asking, “Aren’t you a student?” And me responding, “Why…umm…yes.” And her saying, “I thought so. Will that be decaf?”) The masses are not exactly beating down the doors to talk to me either, but I’m fine with that. I come here to write, not talk. If I wanted to talk, I have plenty of imaginary friends at home to entertain me.

At times, I’ve used this forum to share the broad strokes of my life in asides, usually as the first or last few paragraphs. And occasionally, like today, I sit down with the purpose of describing in detail what’s been going on in my life. But most of the time, I focus on my writing.

This is as good a time as any to come clean on the reasons I designed sewcrates.com (this is something that I should have put in the about section ages ago). First, I’m vain: very, very vain. I like reading my own writing and having others read it and comment on it (I enjoy the, Boy that was a great piece of writing, to the, That sucked! Don’t you know the word is “outset,” not “offset,” but both comments work for me—once my ego gets over the bruising, I actually prefer the latter (that’s the critiquing to those who get confused by the former/latter pair)) (notice the double closing parentheses).

Before I designed sewcrates.com, I started sharing my writing on a few websites, including Enter the Muse, but I didn’t like the comments I received. Not that I was looking for the aforementioned praise, but I was looking for insightful critiques and I wasn’t getting any. The thrill of posting a story got me back into writing again, and I thank those websites at least for that. But I decided the ego-gratification was actually hurting my writing. I ended up posting the story too soon just to fish for a comment or validation. This is something that still hurts my writing and something I will hopefully rectify by withholding the first draft (see below, way below).

Second, I wanted someplace to store my notes. Before I started this site, I explored a number of programs that promised to keep track of notes. You need to understand that my memory is not good. I have trouble remembering things that happened to me a month ago. Stuff that happened a year ago I remember when prompted with hints. Anything beyond that is fuzzy. When I visited Shannon this weekend, I forgot that he visited me in Houston two and a half years ago (I think he was on an interview). When he first mentioned that he had visited Houston, I thought, “What is he smoking? He’s never been there. I’m the good friend here, flying all the way to DC to see him.” It was only after I remembered a particular incident that I remembered that he had.

Shannon visited shortly after I moved to Houston and purchased my car. At the time, I was still learning to drive stick (I bought it because real men drive stick—don’t let wusses tell you differently—and, for the record, stick doesn’t give you more control over your car than automatic, it just makes you feel more manly as you manipulate the shaft). Shannon was showing off and parked my car inches away from the wall of my garage. (I still park the car three feet away from the wall, mostly because I can’t judge the front or rear distances. I really shouldn’t be allowed behind the wheel of an automobile.) When I started the car the next day, I let go of the clutch. Shannon had left it in gear (I didn’t even know you can leave it in gear when you parked) and the car jerked forward, denting the license place but doing no other harm.

Until I remembered this, I didn’t remember that Shannon had visited. After I remembered this story, I started remembering other aspects of his visit, including his disdain of Ruth’s Chris’s Steakhouse (high quality food does not impress his holiness—at the time I brought him there I had also forgotten that I had introduced him to the buttery goodness of this particular steakhouse in NYC). As you can see, my memory is bad. I’m not proud of it, but I have learned to accept it.

These gaps in my memory extend to academic- and work-related information. When I have information, my work product is rather good, which is one of the reasons I did so well in graduate school. My notes were specific and complete. To remedy my lack of an adequate way to store my home and work notes, I started trying out various pieces of software. I settled on The Brain. I used it for a few months, but grew frustrated with the lack of synchronization between my home and work computers, and my PocketPC. The Brain offered a web-based solution, but wanted to charge additional money. After forking over $70 for the original product, I was not willing to pay for a more complete solution. It was then that I decided to create a website to hold my notes. It wouldn’t be as fancy as The Brain, but it would hold the same information.

Third, I wanted a place to store my pictures and writing, someway to share them with the world. Like everyone who owns a website, I pictured that after I installed my website, millions of people would visit it. That hasn’t happened and I don’t expect it to happen. I’m not disappointed. The people I really wanted to share my thoughts with do occasionally frequent here, and that’s the important thing.

Finally, I wanted a presence on the internet. As a nerd, I felt it was my obligation (and right) to mark my digital territory (visualize: dog urinating on wall). I reserved the URL david.figatner.name and sewcrates.com for this purpose. (I had problems linking david.figatner.name to this site. One day I’ll fix that.) I now have a presence and everything seems right in the world.

The creation of my original website is an interesting story, but I’ll leave it for another time. In short, after the Chuck Inspiration (we’ll call that post-CI), the current incarnation of sewcrates.com came into being.

I’m sure Julie is asking where is the Julie section in the musing (she does word searches for her name and skips right to that section—and you think I’m vain). I’m getting there right now. I spent the last week with Julie. She had another one of her mythical one-week vacations. I describe the vacations as mythical because as an intern (she incorrectly refers to herself as a first-year resident, or an R1, but in reality she’s just an I), you’re supposed to work your butt off. Last year, the medical powers-that-be implemented, among other slavery-saving procedures, an 80-hour workweek. Since then, residents’ life, most especially Julie’s life, has become much easier. Julie has four, one-week vacations. While I think it’s despicable that tomorrow’s doctors are not going to have nearly the skills of today’s doctors, I’m personally grateful for this change. I wouldn’t see Julie half as much if her schedule were what it would have been in 2000. We also couldn’t go on all our exotic vacations (see the photographs section for more details).

Julie flew to Houston on Saturday night. She could have flown Friday, since she had Friday afternoon off, but she’s not a good planner. She also could have flown from SNA (which is ten minutes away from her home) instead of LAX (which is forty minutes away), but, again, bad planning. In the end, I had to wait an extra day to see Julie, a long extra day. My plan for the week was to work four hours days on Monday and Tuesday. Work had a different opinion. It dumped oodles of paper on my desk and I had to work full days while Julie stayed in my apartment. The good part is that Julie, who is incapable of staying in a messy place, cleaned my apartment (before you ask, my apartment was David-clean before she arrived, but that’s a completely different standard from Julie-clean).

We went to DC to visit Shannon and Max (and her 13 children and grandchildren—fish and birds, which you would have known if you remembered Shannon’s distaste of monsters) on Wednesday and Thursday. He is getting along as usual. We then went to NY for my Grandma’s ninetieth birthday and Orli's second birthday. I won’t get much into these visits. I've posted pictures of these events. Julie also created her second album with my assistance as sound engineer (and Sugar Daddy for buying all the expensive sound equipment). Ain't she great? My intention today (as if I have an intention in this poorly organized and much too long musing), was to discuss my new writing rules and Julie (always Julie). I’ll breeze over my trips to accomplish this in a reasonable five pages.

While waiting for Shannon to finish his treatments (his laser zapping of mostly female clients in search of the smoothest skin—I asked but he wouldn’t let me play with the lasers after-hours, in case you were wondering) on Wednesday night, Julie and I bided our time in a monster-infested mall. There weren’t many monsters in the mall, but every other store sold monster accessories. Everything a monster could possibly need (or, more exactly, everything that a monster’s parent would think a monster could possibly need). Shannon later told us that in DC, having children has become a sort of status symbol. The more monsters you leashed, the more important (rich, good-looking, powerful, etc.) you were to the rest of society. This is wrong on so many levels. As I was saying before I was rudely interrupted, while in the mall, we stopped in a bookstore and for $5.98 I bought Stephen King’s On Writing. It’s an autobiographical look at his career as a writer, including his advice to young and impressionable writers. Since I’m such a writer (or at least pretend to be one), I read it. It was a bit slow at parts, but overall it was a good read and I picked up some hints and validations of my current writing plans.

In brief, Stephen (since reading his book, I feel like I’m on a first name basis with him) validated my decision to stop watching television. I have now changed the rules for DVDs: I will only watch them on the weekends, leaving my weekdays free to focus on my writing. Before the vacation, I had been playing the Jedi video game rather often, even without friends (yes, this does get around my no-video game-without-friends-rule, but I made lots of excuses for this, such as, I needed the practice so Jason would stop kicking my ass when I played against him). Before the vacation and especially after Stephen’s book, I decided to curtail this and stop playing video games unless there’s a real, live friend in there with me.

Another suggestion he made was that to write well, you must read and write a lot. He recommended six hours a day, which seems fair to me. I calculated that I read and write an average of three to four hours a day, not counting work or internet sites. I’m going to try to increase that to six hours (I’m on my way with this musing, which I’ve been fiddling with for the past three hours, sad, huh). I’m also going to increase my reading intake. That’s one of the reasons I’ve decided to change my DVD watching rules. I’ve been spending too much time watching movies instead of reading. I’ve also gone out and bought an audio book on CD for my car. Now my five-minute trip to work will count toward my reading total.

Stephen discussed not overdoing the synopsis. When I thought about this, it made sense. I’ve been consternating and fighting the plot for my latest story about the lost mall child. Stephen’s suggestion is to pick a situation, a few one-dimensional characters, and let the characters and the situation tell the story. A plot will develop from their experiences, and the author will be pleasantly surprised by this development, which should flow better than if it had been meticulously planned. This is a good thing. I look back to my failed Grelko story for an example of too much planning. I became so obsessed with planning the details of the story that I lost track of what the story was about. In the end, I wrote the story more to just be done with it than to tell the story. The writing was halting and the characters undeveloped, pushed along more to get words on a page than tell the story. By having the characters tell the story, more possibilities will open up. In the end, the results are similar. Instead of planning the plot in an outline form and then writing from that outline, I’ll plan the plot in the form of the story. It might force me to rewrite parts of it after I discover a better plot twist, but that’s not bad. The more I write, the better I’ll become. It’s like the circle of life, only different.

The last important suggestion Stephen made relates to drafts and sharing drafts with others. This will have the greatest effect on my adoring fans (cough, cough). First, Stephen recommends that after you finish the first draft, you put the draft aside for six weeks before reading it again. This allows you to review the story with a different mindset, and lets the story percolate (my word, not Stephen’s) in your brain for a while. By the time you revisit the first draft, you’ll have more distance from the story. This should make it easier for you to cut your “darling children,” since the second draft should ideally be 10% shorter than the first. Besides not reading the first draft, Stephen also recommended that you not share the first draft with anyone else. This draft is a “closed door” draft. The only person you’re trying to please with this draft is yourself. Once the second draft is finished, then it’s time to share it with trusted friends (i.e., all three people who read this website), to get their honest opinions on the story and characters, the “open door” draft. I’m going to try this for my current story. Except for some thoughts on the direction of the story, you will probably not read anything for a while about my current story. I’ll keep you updated on where I am, but I’m not going to post any snippets until the second draft is finished.

I’ve also adjusted my writing schedule a bit to make more room for writing. I’m going to attempt to wake up early to write my story. You’ll be happy to hear that I plan to visit coffeehouses to draft musings in the evenings. We’ll see how long this lasts. Waking up at six this morning was difficult. What made it worse was that I only wrote three lines in my story. I’m hoping it’ll get better with time.

I did want to get back to Julie. I had a wonderful week with her. I forgot how much I love sleeping with her (get your minds out of the gutter, we’re talking about the actual act of sleeping now). She’s warm and quite squishy and fits rather well in most of my sleeping positions. She flew back with me to Houston yesterday before heading back to LA. Seeing her off at her gate was difficult, extremely difficult. I felt a ripping pain in my stomach when I watched her board the plane. I’ve never really felt that before. As I was driving back to my apartment, I missed her terribly. My feelings for her have grown over the past year that I’ve known her. I love her. I now can say that I know what love is. I’ve always known what familial love is, but not this other type. Where that will take us, I don’t know. But I felt it was important to say.

Starbucks is closing in five minutes. I think I’ve dragged this out long enough. If you’ve made it this far, I’m impressed. If you’ve just skipped down to the end then you should know that the Butler did it in the Pantry. I’ll try to be more regular with these musings.

Houston, TX | | Diary, Julie, sewcrates.com

bitter reflections

I had some additional thoughts I had to get out after I wrote the following musing. I couldn't sleep until I put them down. They relate to the website and my sharing of my thoughts and writings. I was thinking whether I should post the musing below. It's a bunch of crap about my story synopsis, it's not well organized, and it's certainly not good reading.

While staring at the ceiling and thinking, I remembered the real purpose of this website. While I enjoy sharing my thoughts and writings with friends and family and the random explorer, that was not my intention. I have written a number of musings with this audience in mind, but, in general, I am not writing for that audience. This website was designed to document my thoughts and ideas for me. It was not designed to be a blog or a diary. I don't want it to be that. There are times when my musings are just that, and that's fine. But I don't want to fall into a rut where I only post (and write) musings and thoughts that are designed to amuse. I will do that, but I want to cut the string and tell you that that's not always my intention for my musings.

I don't always share what I'm thinking or what I'm feeling. Sometimes I feel things that I just don't want to talk about. Other times, I think things that I have no desire to put down. I write when I have to or want to write. Sometimes I write to entertain. Other times I write because I'm angry or sad. Rarely (regrettably), I write to tell a story. And, at times, I write to update my life for you and me. The quality of the writing and the topic will usually tell you which category a musing falls into. I have to remind myself (and you) that I write this for me. (All mine; mine, mine, mine.) It is a selfish thing, but I'm comfortable with it. The most selfish thing I do is post it. Even if it's crap, it's sometimes nice to know that someone else reads it, listens to my inner demons and spurts of inspiration, even after I belittle them and tell them it's not written for them. Go figure.

For example, Julie asked me why I had not written about her in a while. It's not because I haven't thought about her, because I have. It's also not because I don't have feelings for her, because I do. It's because that's not what I wanted to write. I could write (and I'm sure she'd love to read) paragraphs on my feelings toward her. What I don't want to do is force those thoughts onto paper. I wouldn't force them in the sense that I don't think them; it's more not ready in the sense that I haven't written them down yet. That doesn't make any sense, but you'll have to believe me here.

Similarly, my mother gets worried when she reads some of my more depressing musings. I use this as an outlet for my feelings. I'm not suicidal (and have never been suicidal). I sometimes write dark thoughts and feelings, and as long as you remember that I'm writing them for me (and for the voyeurs in the world), you shouldn't worry.

Those last paragraphs sounded rather bitter. I just had to get this out. I'm not sure whom I'm angry with. I think it's mostly me. I don't want to filter what I say here. Sometimes the writing will be raw, and other times it will be polished. You don't have to read the polished stuff if it doesn't amuse you, and you certainly don't have to read the raw stuff. But I put it up here anyway. Just understand where it's coming from and what my intention is. These are my thoughts for me. Anything in addition to that is gravy, sometimes tasty gravy, but still gravy. You can eat the meat without it (by meat I mean photos, finished stories, and bad poetry).

Now, onto my bad musing:

I'm trying not to fall asleep. It's 1833 (that's 6:33pm in American time) and I thought I'd type a musing to try to stem the inevitable pull of the bed. I've been traveling since last Saturday, making my quarterly trip to Norway. With jet lag and a cold I picked up in Stavanger, this has been a horrid trip. My jet lag is wearing away, and my cold has been improving since I slept last night; I didn't sleep the previous three nights.

Since I've been unable to fall asleep tonight (it's past 0200), I figured I'd write down some of my thoughts. After I finish my current story, I want to start work on a longer story'the immortality pill. I want to use it to explore the genius: the dedication to an ideal, the no-compromise position that Ayn Rand explored in Roark. The conflict is between this person and living in society. Roark was able to live in society. Most geniuses are not capable of doing that. Peter Keating was not the opposite of Roark, like Ayn described. Peter Keating was weak. There are stronger, compromising people, who do things within the bounds of genius, and still work for society. They might not innovate, but they take the innovation and actual bring it into practice.

Steinbeck explored that in the introduction to part II of his book. He went through the single person has all the ideas, and society destroys ideas. Nothing creative ever came out of more than one person. Collaboration does not equal creation. Groups cannot innovate, they can only improve what has already been innovated (not sure what the difference is between the two). For the immortality story, the person trying to free the society is a Roark. He has teamed up with a Keating. Not sure how it's going to work'but my most cliché¤ thought would be that the Roark character is the insider who escapes after realizing that the society was falling into itself. His co-conspirator, when he gets back, is the Keating character. He changes society after Roark convinces him it needs changing. The Keating character takes the innovation and makes it a reality, with prodding from Roark, as well as planning and the spark of innovation. The Keating character is the only one that survives at the end, with a stash of I-pills.

This needs more development, but it's a good start. It's a good story to tell, probably more of a novel length, but we'll see how it goes. I just have to get back and finish my current story before I begin work on that one. I wish it was going better, but you know how it goes. Bad.

I'm going to try to get to sleep now. It's not going too well. Part of that is because of the stupid TV. The TV did help me'it, once again, presented the innovator/follower dynamic, this time in the person of a rock video director (the French one who did the Lego-video). He's obviously an innovator.

Houston, TX | | Diary, sewcrates.com, Writing

changes in direction

I have made a list of topics I want to discuss today. According to my battery meter, I have four hours and twenty-seven minutes to muse on those topics. In a normal musing, I start babbling until either I have nothing more to say or (more usual) I have no energy to say more. Today is different. I’m going to plow my way through the list. This has the advantage of forcing me not to give up until I say everything I want to say regardless of my dedication. I’ll even share the list with you so you can judge my success. The list has changed a bit as I’ve added topics that popped into my mind, including this introductory paragraph (which, come to think of it, doesn’t appear in the list), and changed the order to make the organization a bit more consistent. The list: consternation, writing to write, emotional musing, video games, fish, Passover. I’ve also started a list in a different document of topics that I think of as I’m writing. This will give me ideas for later musings when I can think of nothing to say (more about this later).

To start, I wanted to discuss my second favorite topic, the improvement of David. There are actually two improvements today, but we’ll get to the second, less important one in a bit. The first improvement is a change in the direction of my musings. To understand this change, I need to discuss my (hopefully soon-to-be-former) favorite topic, consternations about writing.

I write about writing often, usually in different forms and with different goals, but my writing musings group is rather crowded. There’s a reason for this: I aspire to write best-selling fiction. Another time I’ll analyze the two parts of that aspiration: the best-selling part and the fiction part (the first topic in my musing ideas file). Today, I wanted to concentrate on whether my musings on writing help me write my stories.

These thoughts originated after reading part of Chuck's last post, in which, somewhat as a joke, he said that he was “writing about writing about writing.” It came into focus yesterday while I was reading Nick Hornby’s How to be good. Nick is a skilled writer. Through only dialogue and his (female) narrator’s thoughts, he builds a family of interesting characters, introduces a family conflict, and examines the morals of good versus evil. He describes almost nothing in the book. He reminded me why I wanted to write: to tell interesting stories and touch emotions. I started wondering whether writing about writing (about writing) was helping me achieve this.

I have kept my quasi-New Years resolution and stopped writing endlessly about how I am incapable of writing anything of value. If you thumb through my older musings, you will see plenty of these consternations. Regrettably, I have replaced these consternations by different consternations on writing. The purported purpose of these new musings was to synopsize my ongoing story, but I have gone beyond synopsizing. While the volume of complaints about writing has decreased, I am spending an inordinate amount of time discussing not the actual writing, but my failings on writing.

Some of these discussions are valuable. For example, my discussion relating to writing something I want to read, and another musing relating to writing stories that touch emotions are valuable insights for me. But in writing these musings, I am sacrificing actual writing. I’m not sacrificing in the sense of writing musings instead of stories (which is also a point of contention, but not something I want to dwell on today), but sacrificing by not writing about my thoughts and theories that I can use as fodder for my stories.

Right about now, you must be asking yourself: if this is a problem, isn’t this musing just another symptom of that problem? Aren’t you doing the very thing that you’re complaining about in this musing? Actually, I’m doing something worse. If the musings I’m complaining about are writing on writing, then this musing is about writing on writing on writing. This reminds me of the Simpsons’ episode in which Sideshow Bob uses a nuclear bomb to blackmail Springfield into destroying its television stations. He uses a large television at an airshow to present his demands, and acknowledges the irony of using a television to decry television.

There is madness behind my plan. Proposing and implementing changes are important steps for me. I have given up television (with a few exceptions), stopped playing video games (more about that later), improved my website, spent more time reading, and become more focused on my writing. It sometimes takes me a while to realize my problems—I have many problems, and it’s sometimes hard to identify the important ones. And it can take me even longer to implement the solution. But that’s one of the purposes of this musing. To fix another perceived failing and get me back on track in my writing.

This does not mean that I won’t discuss my writings. Because writing fiction is so important to me, I will still discuss it, probably often. What I will also do, however, is reveal more of my ideas, theories, and daily experiences. I will then use these musings as fodder for my stories. My second story, Loud Neighbors, is based almost completely on experiences I wrote down during my Hawaii trip. The more I understand my experiences and ideas, the more I can apply those to my stories.

So, if you see the same ideas and theories in my stories that are in my musings, you’ll know that I have succeeded. It has taken me a long progression to get here, but I think (for today) this is the right path.

I have three hours and fives minutes to discuss the other topics in my list.

My second David-improvement relates to video games. I have a confession: I have been playing video games quite a bit, especially Jedi Knight: Academy. It all started when Jason, one of the OGGers (my secret gamers organization), finally agreed to actually play a video game (this is something rare, which is surprising since the group was designed to play video games). My resolution was not to play video games except with friends, which seemed a fair compromise, since my friends normally don’t play video games (losers). Jason and I dueled for a few hours and he kicked my ass in the game. Because of my humiliation, I decided to improve my play by playing on the public servers. To make a long story short, I became rather good and started playing more, spending entire days and evenings playing the game.

This morning, I decided to do something about it. I took the Jedi CD out of my computer and placed it in the trash. This is the second time I had to do something this drastic. The first time was for Dark Age of Camelot. As I discussed before, that didn’t work. I actually went out and bought another copy. This time, my addiction is less severe. I play more because I don’t know what else to do than because I really want to play. I’m hoping that now that I don’t have the game, I’ll spend the time writing or (something I decided to pick up again) meditating. I’ll let you know how that goes.

Looking over the list, I wanted to discuss a number of other items. I’m going to fail. This is a rather long musing, so I won’t feel too guilty. I will try to edit my emotional writing musing I wrote a few days ago. No promises on whether I will post it. I don’t like it because I think it panders to get cheap, emotional feelings. On second thought, I promised myself I wouldn’t edit my thoughts and I would post what I write. So here it is.

Oh yeah, Happy Passover! (You can now check off one more item on my list. I wanted to talk a little more about Passover, but you’ll have to wait on that.)

Houston, TX | | sewcrates.com, Writing

purposes and notes on responsibility

You must be as anxious as I am to read more about sewcrates.com’s purpose. As I’m sure you’ve discovered by reading my contradictory purpose pronouncements, the purpose evolves with my many mood swing. I doubt I’ll ever come up with a definitive purpose, but as I search, I will share all my advances and missteps. All for your entertainment, of course.

I’ve been told that the best part of my website is watching me fail. Chuck summed it up best with a comment about my discussion on meanness: “While I applaud your efforts at being mean, I think it is far more humorous to watch you try to be mean and fail.” Julie chimed in as well: “HAHAHAHAHAHAHAHA!”

Today’s purpose is brought to you by the letter “S.”

I am forever inspired by how others write. A weakness of those who can’t: they study and aspire to understand those who can. Since I’m almost finished with The Da Vinci Code (finally), I drove to Borders (like most hyperlinks, this one is completely and utterly gratuitous (kind of like the words “completely and utterly” (notice the embedded parenthetical))—nobody will ever click it, and if they did, they’d ask themselves, why the hell did he link that? if I wanted to buy a book, I would have went to a book site and not read his crappy musing), and while browsing the bookshelves, I came across the journal of Albert Camus.

I glanced through the book and found inspiration. The publication of the journal is a precursor to the blog. Camus’s journal catalogued his everyday ideas and philosophies. He jotted down lines of dialogue, descriptions, synopses, or anything that struck is fancy. Some of this writing ended up in his novels as transcriptions or themes. His journal was his memory. He wrote sporadically. Some days he would write pages, other days a few lines, and sometimes months would pass with no entries.

While it is not clear whether he thought about publishing the journal when he wrote it, he did make the decision to publish it after he had found success as a writer. He typed his notes and edited the journal for publication. What I liked about the journal was that the audience was himself. He sometimes recorded cryptic notes with no introduction or conclusion. He was not trying to entertain with his journal, he was trying to document his thoughts for use at a later date.

I didn’t end up spending the seventeen dollars to buy the book, mostly because while the format interested me, the ideas were of less interest. They are Camus’ ideas, not mine. The format inspired me to not worry so much about completing my thoughts or musings. I posted my last two musings (April 15, 2004 and April 11, 2004). Both contained snippets of information. They were not complete, and they lacked a theme and polish. I will try to worry less about that. The polish will come later, when I use the musings for something discrete. For now, I’ll post my thoughts in whatever form or idiocy they come in. The following is the first step:

notes on responsibility

People try to avoid accepting responsibility, especially for negative activities. The afterward for The Rise and Fall of the Third Reich is an example. The book itself is an interesting history of how Hitler and his men doomed the world to a world war and some of the worst atrocities of the century. The author, William Shirer, was an American journalist covering Germany during the rise of Nazism. In the afterward, he discusses how the public reacted to his book—mostly positive, with some negative comments from the academic historians who didn’t think a journalist using his experiences and the Third Reich’s documents should write a history book (it seems, for them, history should only be told by history professors. I guess they fear a non-historian might make it interesting).

The not-so-surprising discussion in the afterward was how the German people reacted to his book. It was well received in most of the world. The German critics and people did not enjoy the book. Mr. Shirer attributes this bad reception to his belief that the German people have not accepted their role in what happened during Nazism. I’ve read and heard this before.

I didn’t want to discuss whether this is true or not. I do not know enough about the German people to get into that debate. I will assume there is some truth to it because it helps support my thesis: people hate negative history. They will avoid looking at the past if they know they made a mistake. An article I read discussed a study of car buyers. After buying their car, the buyers would read everything about their new car. They would not, however, read anything about other cars that they thought about buying. Like the German people, the buyers did not want to know or be reminded of any mistake.

This is probably why we never learn from our mistakes.

Houston, TX | | Philosophy, sewcrates.com

Seattle Move

In preparation for my Seattle move (yes, it finally, finally happened), I'm temporarily moving my website from my pentium Linux server to textdrive hosting. There will be a few broken links (e.g., comments and photographs) while I fix the website. I'll let you know when everything is back to "normal."

Update: Amazingly enough, almost everything works. Please let me know if you see something broken. You'll also notice that the photos load about a million times faster--blame my DSL company.

Houston, TX | | sewcrates.com, Work

I'm Back!

My new computer arrived yesterday, and everything is now up and running. I'm self-hosting again (you should notice the drastic speed decrease), but on the upside, I've posted all new pictures in the photographs section (they're not clipped and resized). Enjoy!

Writing is going well. I'm working on a longer musing that I'm taking the time to draft over a few days. It's nothing earth shattering, just a way for me to get my feet wet again.

Seattle, WA | | sewcrates.com

Caffeinated Fish

Coffee really is the elixir of gods. Or was that beer? I forget. Either way, I’m sitting here with a tall Mocha and life is good again. This is usually the part of my writing where distraction sets in, and right on schedule, it’s ugly mug shows up. I’ve focused my life so much around my new job that the only thoughts that fly through my ears relate to work. Since I don’t talk about that here, I find myself with little to talk about. That’s where the yummy caffeine comes in.

The castle is doing well, if you were wondering. Besides unpacking and having the boxes carted off, I’ve not done much in the way of decorating. I’ve hung only one picture, and it’s in my reading room, which is rather funny because that’s the only room in my house with no furniture. I’m still not sure what a reading room is, but I know it’s something of a cross between a study and a hallway. I’m going to love writing on the furniture that will eventually inhabit the room: I’m thinking about plushy, old-school (think pipe smoking but without the sweet smoke, or pipe, or fire, or tobacco, or, you get the idea) leather chairs with matching ottomans and some small tables to hold the, yes, you’re getting good at this guessing, yummy caffeinated drinks. But for now, the picture hanging on the wall mocks me.

The last time I sat down with a cup of coffee to write I was sitting in the bucks of stars in Houston, Texas, lamenting my fate. Lamenting is not the right word. I wasn’t mournful about the change, it’s just that the change was all encompassing. I had trouble focusing on the writing, even with sweet caffeine scouring my veins. I’m still in the aftershocks of that change. While life is becoming more settled, my mind still races through empty corridors most nights. I’ve not had the free time, the free weekends, to sit down and evaluate everything that is happening. I’m not sure I even want to evaluate it. When you’re happy, it’s not always good to see what’s waiting under the covers. That made little sense. What I meant to say is that when you’re excited about a gift, it’s sometimes disappointing to unwrap it. That is, receiving a gift is sometimes nicer than the gift itself. Damn, now I’m babbling. I’ll move on now before I scare myself with my incoherence.

I’ve spent the last few days rethinking the inner workings of this site. I’ve started work on migrating my Linux/Apache/PHP server to an XP Pro/IIS/ASP.NET+C# server. I’m sure you’re asking yourself why. (I’ve tried to guess your thoughts a little too often in this musing. It’s a habit of mine. I tend to speak better when I have someone to bounce ideas off. The fact that you’re not actually there, well, at least not there when I’m writing this, is probably a sign of insanity. Hell, this whole aside is a sign of insanity and will be used in my commitment hearings. Your honor, I am sane. There are little people reading this while I write it. They’re even telling me what they’re thinking as I type. They’re my green, invisible, intangible, space-alien friends. Really. Yes, your honor, they are green. No, your honor, I don’t know how I know they’re green since they’re invisible, but trust me on this, they are. So you say I should follow these nice men in the white suits? Will they bring me more yummy caffeine? Oh, something better, you say? Egg-cellent.)

Anyway, as I was saying, I wanted to learn a new language (C#) and cut off my own head by trying to administer yet another un-administrable platform. I remember the weeks and months it took to set up my Linux box and get Apache and PHP to run on it. That fun is just starting with IIS. At least IIS supports C# out of the box. I’ve not made much progress. Two days ago, I thought I was actually getting somewhere. I went to sleep (too late, of course) having figured a few things out and with a number of possible avenues for development. When I plopped down in front of my computer yesterday, all that progress disappeared. I won’t bore you with the difficulties, but I went to sleep last night discouraged and lamenting (there’s the proper use of that word) my new website design.

Not that you will notice much of a change. Most of the external workings will remain the same (except for some minor, cosmetic changes). I’m focusing (for now) on migrating the internal workings to the new server, and redoing the generation of the pages and pictures. The impetus for the change, for those technically minded, was my frustration with PHP’s object-oriented design (actually, the lack of a good OOD). Of course, the opportunity to play with a new language and program again was another benefit.

Now that I’ve cleared that techno-babble from my mind, I can get back to the more important issues. Julie is coming up this weekend! She’s been traveling to Seattle often, which is a nice break from all my travels to Newport Beach. She’s in a tough rotation now, working nights in the OB (that’s the baby-delivery-thingy place) for the past few weeks, and that together with lack of sleep and her favorite fish dying yesterday, have left her in a rather strange place. But I’m sure my wonderfully planned weekend of sleeping and…umm…sleeping will get her back on track. Sleeping in the castle is exceptionally peaceful. You should try it one day (hint, hint: visit me!).

Dead Fish

Getting back to her poor fish, her golden Japanese algae sucker jumped out of her fish tank the day before yesterday. When we first bought him (I’m assuming it’s a he, although with algae fish, you never can know—or, at least, I can never know), he was rather timid. He hid in the door of the taller Pagoda that made the fish tank look more like a city then a, you know, glass box. He grew from less than half an inch to more than three inches, and moved to the smaller Pagoda with the larger door. As he grew bigger and we added more fish to the tank, he became aggressive, swimming around quickly to protect his underwater domain. After Julie found him, she performed an investigation that would have made CSI proud. Julie now figures it was during one of his aggressive swims that he jumped up through the back of the fish tank. (She didn’t find a suicide note, but the neon fish stuck with their story that they were swimming on the bottom of the tank when he jumped.) Julie found the proud algae sucker the next day behind the fish tank. I imagine he was stiff and rather white. My only regret was that it was too late to fry him up. But don’t tell Julie that. She sees each fish that dies (and there have been many dead fish in her tank) as a personal failing. R.I.P., algae sucker.

I’ve babbled enough for one day. From the length of this post, one thing is clear: caffeine is a good thing, a very good thing.

Seattle, WA | | Diary, Julie, sewcrates.com

Compasses

Silence shadowed me throughout the day. It has been quiet, a day spent in contemplation of nothingness and all of its aspirations. Depression fell as a heavy cloak over my shoulders and I haven’t shaken it all day. For a holiday weekend, this is not going as planned—not that I planned much, which is probably part of the problem. After a “world-wind” vacation, during which every day we spent going some place or doing something, my adjustment to doing little has not been good. When I combine that adjustment with Julie Withdrawal, I’m bound to find myself in such a state. I keep saying that I hope it passes but it’s staying with me, and my dodging and moving left isn’t helping much.

From as far back as he remembered, which he admitted readily was a mere few years, Adabu was what people called “slow.” His thoughts came in a bunch with pauses as he gathered and tied together the bunch in his mind. It wasn’t until Adabu turned eight that he began to understand what people said about him. He had never noticed a difference before then, but, he thought wryly at the time, that’s to be expected if his slowness was as true as everyone spoke.

Nothing much goes through my life of note. I took a trip to downtown Seattle today to get out of the house. After waiting for the bus until five minutes before it was to show up, I had second thoughts. The last bus returned to my bus stop at 5:30 pm, and I didn’t want to be stuck downtown. The hour between each bus on the weekend wasn’t encouraging. I decided to drive and stayed barely an hour before driving home. I’m restless lately, with nothing new and nothing doing. My laundry is piling up and my dishes need washing. I can’t seem to find the push needed to get back into my routine.

I spent most of today working on sewcrates.com. Obviously, I spent little time writing this entry. Instead, I finished redoing the comments, making them editable and more robust, and I’m trying to develop a new style and masthead. I’m not going to post any of the changes until I’m ready for the drastic change. I have a few other improvements I have in mind that I want to finish before presenting the site. I’ve decided not to rewrite all the code. While I am planning major changes, all of the features that I would have accomplished with a rewrite I can accomplish readily enough with more minor changes. The only thing important is the end user’s experience. The underlying code, as long as it runs well and is easy to use, doesn’t make much of a difference. My only outstanding concern is the code’s aesthetics, something about which I spend too much time thinking. While working on the site over the next week or so, I’m hoping my muse finds her way to me. I know, I know, I don’t believe in muses: it’s all perspiration not inspiration. As I said before, I’m more concerned about my mood than my muse.

I’m babbling, trying to get word count and to desperate to care much. Laurence, oh Laurence, why do you drop the compass in the sand?

Seattle, WA | | Diary, sewcrates.com

Rumblings

I’m almost done with the sewcrates.com redesign. If all goes well, I’ll make the switch this weekend. I’m excited about the new design. Think simple blues and white spaces.

What follows are today’s translated thoughts.

My mind is whirling, shapes unveiling in a twisted darkness. Accomplished: a light descends, spotlighting the dirty masses; their dirt isn’t on clothes or skin. They imprint their soul with their decadence.

I speak and beg others to decode my missives dipped in egg batter. The soda tastes of medicine; I do not know that soda will cure what ails me.

“She’s going to be a poster girl for her school,” her grandma says, with her blonde hair limping off her head and mixing with the darkening gray of old age. Her face appears elongated, stretched to peek through closed windows. She painted her face with unnatural roses. Pearls hang like hooked worms on her flabby ears. She looks out through invisible glasses, which enlarge her dying brown eyes.

Descriptions of the world cry for sharing. Am I the same person who counts fallen matchsticks and dictionaries? No. It’s not the counting but the winnowing and sharing.

Shortness. Brief tidbits shared by squared oranges, the juices sucked dry by corrupt spirits. I reach for deepness and I cut my hand on grease. Noxious liquids drip from my sores to feed the hungry earth. Rocks hurtle near home. I greet them and shake clean the welcome mat.

Experimenting before perfecting is like dancing before dressing.

It’s a lot to think about what to write daily. What to record and what to let get away. What informs me and what moves me an inch to the left.

Description of what I’m doing. Why? I wasn’t a good storyteller but I liked the words. As I walk, I pick leaves, bending and breaking them until I release the damp, broken pieces into the wind. Red branches droop all around me like curtains for a bathtub.

An old man peddles uphill and falters. He wears a helmet and bright glasses. His feet bend vertical as he tries to push against the hill. His wheel turns and he falls over. He spins the bike around and flies downhill. He wasn’t trying to ride to the top; he wanted the flight down.

The diamond blue sky shines before the disaster.

my scribbles

Seattle, WA | | sewcrates.com, Writing

Redesign: Cornflower Blue

Okay, it's here. I still have a lot of clean-up work to do, but most of it should be working. Please let me know if you see any problems. I'll try to post a summary later of what I did and why I did it.

Seattle, WA | | sewcrates.com

Broken comments

Yeah, I know. I broke the comments when I played with the website before I left. Sorry about that! It won't be fixed until I get back.

Paris, France | | sewcrates.com

Server go Poofy

Agh! I went to post a musing and my website was gone, vanished, no longer published, poof. It’s as if I don’t exist anymore. I’m hoping this is a connectivity issue, and not a server or power issue. If it’s the latter, the site won’t be back up until I arrive home on Monday. This makes me very sad.

Paris, France | | sewcrates.com

Server stands up

It's back up. My server rebooted for an unknown reason (might have been a short power loss--although no digital clocks show evidence of one), and it wasn't automatically set to restart the web server. I've since fixed that, and posted the entries I wrote in Paris.

Seattle, WA | | sewcrates.com

Retouched Old Photos

I'm spending a little time going through my parents' photographs and retouching them. I scanned them in a few years ago, and the colors didn't scan properly. I'm still not completely happy with the results, but it's an improvement. I finished my parents' honeymoon, and hope to get the other three albums done soon.

Original:

Touched up:

I'm not sure I'm going to write much today. I'm sick of my complaints and I'm tired and, well, I'm a failure. What else is new?

Seattle, WA | | sewcrates.com

Wedding Website

It's alive. It's ALIVE! Our new and improved wedding website is now available to the general public.

Let me know if you see any bugs. I know it doesn't look great on small monitors (I purposefully chose to exclude those people from the full experience as a way to ridicule them for their shortcomings). And people with slow internet connections may have issues with the slideshow.

Now, on to my other projects. If only I could remember...oh, yeah. Maybe I will return to "writing," which is this mythical (or should I say mystical?) exercise whereby I pour words onto the screen, and with each word, die a little bit inside.

(And, yes, this post does count as words to ensure that the front page doesn't get filled up by inane doodles. I'm evil that way.)

Seattle, WA | | Links, sewcrates.com, Wedding

Dr. Julie Show website part 2

After a lot of hard work, I’m happy to announce the completion of the new and improved Dr. Julie Show website. I’m still tweaking parts of it, but it’s a big enough improvement that I decided to post it as soon as possible. Enjoy!

Screenshot of front page

Seattle, WA | | Julie, sewcrates.com

Cast of Horribles is ALIVE!

After a few weeks of work, I am proud to announce the launch of my new home for Cast of Horribles.

Cast of Horribles Website screenshot

The coding was rather fun, as I moved away from flat files, and delivered all the content (including the doodles) through MySQL. I've used databases in the past, but not much. After programming the site, I realized how much of an idiot I was for not using a database for sewcrates. I think the revelation was almost at the level of my coffee awakening.

Along with the doodles, I'll also try to post short, pithy musings. They won't have the consternations or length of a sewcrates post, but they should be more frequent. I will continue to ply away at storytelling and longer musings on sewcrates, as well as uploading new photographs and keeping my about page more current with my list of books and movies--although, to be fair, my movies aren't updated as often since I've stopped buying DVDs and rent everything through Netflix.

I will continue to post the newest doodle on the front page of sewcrates, but have removed it from the RSS feed for annoying technical reasons (use the Cast of Horribles RSS feed).

Enjoy, and let me know how much you like/dislike the new site! I'm always up for suggestions. And as soon as I receive the expected Chuck e-mail, explaining how the design is terrible and unintuitive and downright ugly, I'll cry for a bit, before yanking it down and hopefully making it better. I've resolved myself to this course of action even before I post this.

Enough consternated self-loathing. (It wouldn't be a real sewcrates post without them!)

Seattle, WA | | sewcrates.com

Database, Shmatabase

For those who care nothing about programming, you might want to skip these entries. I plan to keep a journal of my programming efforts to rewrite sewcrates.com. I do this for two reasons: first, whenever I program, I tend to come across a technical problem that I cannot solve with a simple Internet search. I figure there are other people on the interwebs who come across similar problems. My hope is for these entries to alleviate some of the pains of finding these solutions. Second, these entries provide me both an excuse and a topic for writing. While I rarely need an excuse to sit down and throw down words, I often flounder (a word I use more and more as I replace consternations with unorganized babbling) without a topic.

I’m developing NAIS (the New And Improved Sewcrates.com) using PHP and MySQL, both running on Dreamhost’s servers. I’m not sure how much code I will use from the original sewcrates.com codebase. I do hope to reuse the code I wrote for the Cast of Horribles rewrite.

Ideally, I want to use Microsoft servers and .NET through C#, not only out of corporate loyalty, but because there are excellent (and free!) development tools. The problem is the Windows Server hosting plans are awful. There is a huge opportunity for a Dreamhost-type hosting company to create a similar business model for Microsoft-hosted solutions. Here are some comparisons of Dreamhost against a few of the top search results for “windows hosting” (most of these hosts provide overpriced Linux hosting as well):


HostDisk StorageMonthly BandwidthMonthly PriceOS and Database
Dreamhost500 GB5 TB$5.95Linux and MySQL
AccuWebHosting1 GB10 GB$15.00Windows Server w/ASP.NET and Microsoft SQL 2005
JodoHost2.5 GB35 GB$18.95Windows Server 2003 and Microsoft SQL Server
iPowerWeb100 GB1 TB$9.95Windows Server 2003 and MySQL
Verio20 GB500 GB$19.95Windows Server 2003 (includes SSL and dedicated IP)

This is a very high level comparison that does not take into account all the different features or reliability of the different hosting companies. (I did a double take at iPowerWeb. If it provided Microsoft Exchange mail services, I would probably switch.) What I was trying to show is that the price per month of Windows-based services that support ASP.NET and Microsoft SQL Server are for the most part, not comparable.

Dreamhost is an exception even for Linux-hosting companies: they have a very strong business and understand the market forces. They freely admit that the oversell, i.e., they sell more bandwidth and disk space than they can supply because they know people like me will only use a fraction of the available space. I appreciate that. I also appreciate that it is there when my site one day gets more than five hits.

One of my biggest pet peeves with these hosting companies is available disk space. Disk storage is relatively inexpensive, even taking into account necessary backup storages. Services that limit me to 1-20 GB are completely unacceptable.

Before the Marathon this year, I started a database design to hold NAIS. I plan to move the sewcrates’ data store from flat files to a database. The big draw of the database was the ability to create extensible pages through templates. I wanted to create pages that showed individual and groups (in both full and thumbnail fashion) of: text posts, doodles, photographs, book reviews, reading lists, movie reviews, etc.

I hit my first roadblock after thinking through the database design to enable these templates. I sat down with my data dictionary from the database, and realized this was a much bigger project than I expected. It always works like this: I get these huge ideas, and then I get stuck. Once I work through the ideas, and start programming, I usually remove the stickiness (there are times, of course, where I end up giving up halfway through). I keep looking to WordPress and MoveableType and asking myself why I feel a need to reinvent a perfectly round wheel. I then remember that it’s because I can, and it keeps me occupied and happy and provides a strange contentment that is difficult to explain.

Seattle, WA | | Programming, sewcrates.com

Overly Complicated URLs

After failing at my database design, I decided to take a step back and work on easier issues first. How should the new URLs look? The following are my thoughts mostly in the order they came. This is not a presentation of results, but a look at how my brain weaves its way through different mazes in an (in this case unsuccessful) attempt to arrive at a solution.

I started with this given: all old URLs will continue to work, at least for the older posts so as not to break anything. I decided to move away from the current URL design because for the most part it doesn’t provide useful information.

My first attempt:

http://sewcrates.com/Archive/2007/Database_Shmatabase/

http://sewcrates.com/Archive/2007/Database_Shmatabase_2/ (for duplicate titled entries)

http://sewcrates.com/Archive/2007/Database_Shmatabase_2/photo_001.jpg (the URL for a photograph uploaded and referenced in the above post)

To complicate matters, here’s the URL for an individual post for the img_013647.jpg file. This allows photos to exist outside of their photo albums or posts, so that tagging can be used to sort and display them. I’ll use the same process for doodles, and movie and book lists and reviews. I will also need to automate the creation of the albums. Many times I do not have the patience to do much more than upload lots of photos and assign a name and global tag. I want the ability to go back (or have Julie go back) and individually name and tag the photos at a later date. (This is how the current version of sewcrates works, although most of the photo information is contained in the album and not tied to the individual photograph.):

http://sewcrates.com/Crazy%20Monsters/2007/img_013647_jpg/

I’m still not decided on the year part of the URL. In the current sewcrates, I used the full date format, along with the category (what will now be tags), e.g., http://sewcrates.com/Archive/2007-11-26-15:21:36/. I realized that most people do not care much about the full date. I used the full date, including the time (and microsecond, because, you know, sometimes I posted twice in the same tenth of a second), to allow multiple posts within a single day. The original version of sewcrates.com supported only one post per date: http://sewcrates.com/2007-11-26/ (at least that’s how I remember it).

It is a bit strange to see the year in the URL in this way. For example, http://sewcrates.com/Crazy%20Monsters/2007/img_013647_jpg/ may be followed by http://sewcrates.com/Crazy%20Monsters/2008/img_019234_jpg/, which is a bit confusing from a logical perspective. With that said, when I am reading the internet, I do enjoy glancing up at the URL to see what year the post was made. This quickly clears up whether this is something brand new, or a very old archive. The month and the day, while important, do not fulfill this purpose, and make the URL unnecessarily complicated (at least more so than it is currently). Alternatively, I could just use http://sewcrates.com/Crazy%20Monsters/img_013647_jpg/. This doesn’t help with identifying the year of the post—but the post itself will provide that information. So many decisions to make!

The other advantage to the single year is the directory structure. While I attempted to use the database to store my doodles in castofhorribles, I realized it was not efficient, from both a storage and speed perspective. (I now save all my doodles in both file form and in the database. While I’m able to read both the database and file versions of the .png files, I cannot read the .ai from the large blobs in the database. This may be a MySQL limitation on large files (my .ai files are usually >1.5mb). I haven’t done the leg work to check on this, since I don’t use any of these tables to display the files. This may change in this or the next version. But that’s a much longer discussion.) I want to store all files in a directory. So, continuing with the above example, I will store the jpg in: http://sewcrates.com/2007/img_013647.jpg. The advantage is I am creating fewer directories. The disadvantage is that there will be a larger number of files in each directory. I don’t see any advantage either way. I’ve almost argued myself into returning the month and date to the URL. It’s an easy enough switch once I start programming, so I’ll leave this on my list. For the record, my doodles are stored in http://castofhorribles.com/doodles/. It’s one large directory with all the files. Since I guarantee a unique filename for each doodle (I base it on a simplified version of the title, and add “_n” if it’s a duplicate), there should never be a conflict in the directory.

As I think more about this (man, this is becoming much more of a planning exercise than I originally realized), I’m thinking of moving the category away from the first part of the URL. I included it in the URL for the current version of sewcrates because it was the easiest way to provide for stepping through the different posts. For example, you could use the next/previous links to move through all of my http://sewcrates.com/Writing/ posts, such as http://sewcrates.com/Writing/2007-08-21-00:00:00/ to http://sewcrates.com/Writing/2007-10-28-23:14:16/. In the next version of sewcrates, there are larger issues I need to contend with. What if a user wanted to see all photos with Julie in an album format (similar to how I use tags to show multiple Horribles: http://castofhorribles.com/tags/Julie/) There are two ways of providing that: the first is to open it in a large album, something like: http://sewcrates.com/Photos/Tags/Julie.

I also have the option of using variables in the URL: http://sewcrates.com/2007/?tags=albums+julie;years=2007+2006. (You can do this two ways: present this as a URL, or convert this complicated URL into a slash-based one in the .htaccess file. That’s how castofhorribles works.

I’ve written so much and decided to come back around:

http://sewcrates.com/img_013647_jpg/tag1/tag2/tag3/etc - where tags can be search terms: “years=1973-1976” this will show one image, and the next/previous buttons will allow you to step through other posts that meet the tag criteria in chronological order.

http://sewcrates.com/album/tag1/tag2/tag3/etc - this is more complicated. Here is how it will work: For albums that contain only one type (and the type will be included as a tag, e.g., Photos, Books, Cast of Horribles, Movies, Musings), then I will present a thumbnail version of the page. Thumbnails for photographs and doodles are the smaller version of the picture; for text posts, it’s just the title.

http://sewcrates.com/list/tag1/tag2/tag3/etc - this is the thumbnail for multiple types of posts, e.g., provide on one page, all the thumbnails with Julie, which would include thumbnails (if available) for photographs, doodles, and posts. (How it will be formatted will be a huge challenge. I think I did a good job with the photo thumbnails in sewcrates and the indexed thumbnails in castofhorribles because they were all of the same size. If we throw in text titles and different sized thumbnails, I’ll run into huge problems. But, again, that’s for another time.)

http://sewcrates.com/about/ - the URL for these “special” pages will remain the same.

I will store all files in a single /data/ directory, controlled by a simple name with the same rules as for castofhorribles.

That means I’m dropping the year from the URL. This provides more flexibility with only a small loss of readability. The years will still be available in the posts themselves. I’ve said a lot (most of which I later contradicted), and programmed very little.

Everything is a tag. The tags may have names: location=Seattle, WA. That’s a tag. This enables you to create a post with a Seattle, WA title and not confuse the system. For titles, you have title=This is a nice title. And then you create the simplename from that title that is used in the URL.

This allows me to create albums by referring back to titles. This is complicated, though. Wouldn’t a date be a tag? And in this case, I might be overloading what I mean by tags. A tag should not be so complicated. It’s just a list of items. I could yank out all the specific tags. I’ll use it for two purposes: to categorize and to provide information. That way everything is contained within a single table. But to what end? It allows me to change and add templates without worrying about changing the database. Is that helpful? I’m not sure.

As I continue to think about this, other issues pop out. Do I want to have the flexibility to have parent/child relationships between photographs (or assets, as Moveabletype calls them) and larger posts? Or do I want to tie them together through tags of tags, i.e., tags where there is a “type” and a “value” field, such as “title=This is a long stupid title.”

Ugh, my brain hurts.

Seattle, WA | | Programming, sewcrates.com

Flickr and other useful tools

After much thinking, I’ve decided to move away from my proprietary photo galleries, and into the welcoming (and API-ful) hands of Yahoo!’s Flickr. I spent many hours over the last two days trying to get my too smart phone to upload my photographs automatically to Flickr. So far I failed, but I am enthusiastic that if I spend another ten or so hours on it, it will eventually work, and everyone will revel in blurry photographs of my dog and my coffee cup. At least for the three days I actually take photographs with my too smart phone, before growing bored with the effort and realizing that I go to the same places and do the same things every day, and such things are, to put it mildly, not even mildly interesting.

I installed ShoZu on my phone. ShoZu tries to add value by providing its own web service where you send the photos before they route them to Flickr. While I understand ShoZu’s attempt to add value (and get eyeballs), it fails in annoying way. ShoZu required me to set up an account that I will never visit. It also didn’t work (although they may have something to do with my upgrade to Windows Mobile 6.0.) What I want is a simple application that attaches itself to my phone’s camera and sends the photo to Flickr directly after each photograph is taken. Somewhere between my phone, ShoZu, and Flickr, my photographs are getting lost. The ShoZu application tells me that the photos were properly uploaded to ShoZu. But the ShoZu website doesn’t find them. This is what happens when you add a middleman where it’s not needed.

Clearly, getting my phone to upload to Flickr is not an important part of my redesign of the photo section of sewcrates. What I need to do is use Flickr’s APIs to display sets (or is it groups?) of photos in NAIS. This also simplifies my website design, as there will be only four types of posts: text posts, photo albums (pulled from Flickr), Horribles, and lists (perhaps tied to Amazon’s service as in the current sewcrates). I would love to replace my proprietary movies and books list with a third-party service, but I haven’t found one with a decent API.

That’s a long way of saying I’m making progress, but it’s slow. I haven’t written a line of code yet.

Seattle, WA | | Programming, sewcrates.com

To Flickr or not to Flickr

I finally got my Flickr account working with sewcrates.com. I created a couple of sample photosets, and went about displaying them on a test page. It worked, but I’m disappointed. The Flickr terms of use limit the photos displayed on a page to 30, and a link back to the Flickr page from each photograph. There is also a rather significant delay as the API calls work through the Yahoo! systems. The photo download speeds once you have the list were quite good. It would be trivial to cache the results on a static page to avoid the delay. This doesn’t get around the terms of use limitations, however.

While coding, I ran into one snag: the Flickr API documentation uses PHP’s file_get_contents() to read the Flickr serialized output. Dreamhost does not permit the file_get_contents() call for URLs (the flag is allow_url_fopen in the PHP.ini file). Dreamhost’s wiki provides a very easy workaround using cURL.

The PHP serialized Flickr call function is as follows:

// On success: returns array with Flickr data related to $params; Echo calls+error and returns FALSE on failure
function flickr($params,$use_userid=false) {
        if (
$use_userid)
                
$params['user_id']='*'// your user_id goes here (for convenience) 
        
$params['api_key']='*'// your Flickr api key from http://flickr.com/services/api/keys/ goes here
        
$params['format']='php_serial';

        
$encoded_params = array();
        foreach (
$params as $k => $v)
                
$encoded_params[] = urlencode($k).'='.urlencode($v);

        
$url="http://api.flickr.com/services/rest/?".implode('&'$encoded_params);
        
$ch curl_init($url);
        
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
        
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,5);
        
$rsp=curl_exec($ch);
        
curl_close($ch);
        
$rsp_obj=unserialize($rsp);

        if (
$rsp_obj['stat']!='ok') {
                echo 
'Flickr call failed:<br>';
                
print_r($params);
                echo 
'<br>';
                
print_r($rsp_obj);
                return 
false;
        }
        else
                return 
$rsp_obj;
}

I created the following code to test the Flickr calls:

function flickr_sets() {
        
$params=array('method'=>'flickr.photosets.getList');
        
$sets=flickr($params,true);
        
$count=0;
        
$sets=$sets['photosets']['photoset'];
        foreach(
$sets as $set) {
                
$id=$set['id'];
                
$title=implode(' ',$set['title']);
                
$description=implode(' ',$set['description']);
                
$count=$set['photos'];

                
$params=array('method'=>'flickr.photosets.getPhotos','extras'=>'date_taken','photoset_id'=>$id);
                
$photos=flickr($params,false);
                
$photos=$photos['photoset']['photo'];
                foreach (
$photos as $photo) {
                        
$params=array('method'=>'flickr.photos.getSizes','photo_id'=>$photo['id']);
                        
$sizes=flickr($params,false);
                        echo 
'<img src="'.$sizes['sizes']['size'][0]['source'].'" alt="">';
                }
        }
}

While it was a fun exercise, I decided not to use Flickr to host my photos. There are too many limitations on how I can use the APIs. That means more coding for me, as I figure out a good way to store the photographs in my database. It’s also provides more flexibility in tagging and displaying the content. This means back to the drawing board on my database design.

Seattle, WA | | Programming, sewcrates.com

It’s a permalink, stupid

Update: I'm not sure if what I write below is true. There are obviously issues with sewcrates and search robots, but I'm not certain I found the culprit. (The fact that I'm stupid is not at issue.)

Okay, so I’m an idiot. This is what happens when you write your own blogging software. You miss things. I was interested to see what would happen when I started posting programming/technical advice. A few days later, I received a referral from Google for my Internet Sharing on the Q9 post. Excellent, I think. My name is out there. I’m in Google. I received a visitor.

I then checked the referral results, and noticed that Google does not link to the article, but to the front page. That can’t be right. If it links to the front page, then it will be gone in a few days, and when people visit, they won’t see the post unless they checked the Google cache.

It took me a few short searches on “Permalink” to realize my mistake: I never added the rel="bookmark" to my permalink (best source and Wikipedia: Permalink). Here I was, running around without real permalinks. I even titled the links “link back,” thinking those magical words would mean something to the search robots. (They don’t, of course.)

A few coding changes and I added the rel="bookmark" code to all of my permalinks on sewcrates and castofhorribles. If I wasn’t so stubborn, I would fall into the welcoming embrace of MoveableType or Wordpress. Thankfully, I’m terribly inflexible when it comes to programming.

Seattle, WA | | Programming, sewcrates.com

Python is awfully tempting

The coding process for the secret NAIS project is in full swing. I managed to port over all of my text-based postings to my new database. I am creating NAIS in three parts: retrieval (URL parsing and database fetch), display, and editing. I’m not yet decided on how or where editing will live. In the current sewcrates, all three mostly live in the same place (albeit separate source files). I’m trying to better abstract this relationship.

After reading today’s Xkcd comic, I spent about an hour reading through the Python documentation and growing very excited by the syntax of the language. It seemed to do things correctly compared to PHP, which is a badly designed language. Easy example: every time I call a string command, I have to look up the ordering of the parameters:

mixed str_replace ( mixed $search , mixed $replace , mixed **$subject** [, int &$count ] )

int stripos ( string **$haystack** , string $needle [, int $offset ] )

Note that the haystack variable (renamed $subject in the case of str_replace) is in different places for these two related functions. It is infuriating.

Even with all the problems I have with PHP, I decided to stay with it for NAIS. There seems to be some issues with the speed of Python-related webpages in Dreamhost. Additionally, it’s not a good idea to start a large project to learn a new language. It makes more sense to write smaller pieces of code. I don’t want to finish NAIS, only to have acquired enough elegance with Python to want to rewrite it.

Seattle, WA | | Programming, sewcrates.com

Painfully regular expressions

Updated: Chuck provided me with a much more elegant solution than described below. It's explained fully in Over-Thought Solutions.

I originally used the Apache rewrite engine to parse and rewrite the URLs to call my handler.php file with appropriate variables, e.g., translating:

  • http://sewcrates.com/tags/Programming/

to

  • http://sewcrates.com/handler.php?type=tags&tag=programming

While it worked reasonably well, I decided to scrap it and move the parsing code to the PHP handler to make it easier to manage and change.

It ended up being more difficult to code a generic rewrite condition than the individual rewrites that converted the URLs to their specific types. It was the regular expression used by Apache that required much work. I’ve used regular expressions rarely, and when I do, I try to find an example of what I want to do and copy it. This time, I decided to go to the source and actually learn what I was doing (mostly because I couldn’t find a good example). My sources:

My goal was to capture all URLs with 0-5 parameters, e.g., rewriting

  1. http//sewcrates.com/
  2. http://sewcrates.com/first/
    . . .
  3. http://sewcrates.com/first/second/third/fourth/fifth

to

  1. http://sewcrates.com/handler.php
  2. http://sewcrates.com/handler.php?a=first
    . . .
  3. http://sewcrates.com/handler.php?a=first&b=second&c=third&d=fourth&e=fifth

I used a-e because 1-5 didn't work in the Apache rewrite statement. In the handler.php code, I would take $_GET['a'] through $_GET['e'] and use them to identify the type and content of the URL. Here’s what I (finally) came up with for my .htaccess file:

DirectoryIndex handler.php

Options 
-Indexes
ErrorDocument 404 
/handler.php?a=error&b=404
ErrorDocument 403 
/handler.php?a=error&b=403

RewriteEngine on
RewriteCond 
%{REQUEST_URI} !/handler.php [NC]
RewriteRule ^([^/]*)/?([^/]*)/?([^/]*)/?([^/]*)/?([^/]*)/?$ /handler.php?a=$1&b=$2&c=$3&d=$4&e=$5

I’m not sure if it’s the best way, but after much testing, it does work. Besides my normal technique of “adding one when in doubt”—or in this case adding a question mark, there is some logic behind the expression. I’ll try to break it down. The important piece of code is the RewriteRule line, which is made up of two parts: the match and the result.

Match: ^([^/]*)/?([^/]*)/?([^/]*)/?([^/]*)/?([^/]*)/?$

Result: /handler.php?a=$1&b=$2&c=$3&d=$4&e=$5

If the URL fits the Match, then Apache rewrites it with the Result. The Result includes a bunch of variables. For each (…) statement, Apache rewrites it to a URL variable (the $1-$5 represents the results of the regular expression). I found regular expressions that captured an absolute amount of parameters, but not one that loaded arbitrary variables.

The Match was the difficult part. To start with, regular expressions are anchored by two characters: it starts with ^ and ends with $. Removing those from the expression leaves us the meat:

([^/]*)/?([^/]*)/?([^/]*)/?([^/]*)/?([^/]*)/?

Each (…) statement corresponds to a variable in the Result code, ranging from $1 through $n, where n is the number of (…) statements. All of the (…) statements look like this:

([^/]*)

If you look at the references above, you’ll see that the [^…] code means match any character except the one that follows the ^. In this case, I excluded the forward slash, which is the end character. The * after the [^/] tells the expression to repeat this match from 0 to n characters. In other words, match all characters until you find a forward slash.

Between each (…) statement, I included a /?. The slash is the character I expect to find between each expression (e.g., http://sewcrates.com/first/second/). The question mark means match 0 or 1 of the slashes. The advantage of using the question mark is that it allows for there to be zero slashes, or, in other words, it allows for less than five parameters.

That’s it. I use the RewriteCond to exclude the files and directories I want the server to find, and the rest get reformatted into this code. My handler.php file captures the results and parses it using the $_GET[‘a’]…$_GET[‘e’] variables. From there, I figure out what page should be sent to the client.

After learning regular expressions, I dived into the Perl documentation, and was amazed at how good Perl was compare to PHP (or even Python, which I fell in love with earlier in the week). It’s amazing how powerful and easy to use Perl is. I see where PHP steals many of its ideas (and then goes about badly implementing them). I spent many hours poring over the documentation, thinking I was going to change NAIS to use Perl. Like my earlier decision with Python, I decided to stick with PHP. It seems I fall out of love as fast as I fall in love with languages.

Seattle, WA | | Programming, sewcrates.com

NAIS Notes

My NAIS development work has been going relatively smoothly. I managed to converge on a decent database structure, and convert all my text posts and cast of horribles doodles into this structure. I even managed to write code that displays individual posts (text, photos, and cast of horribles), the home page, and posts based on tags. I began fiddling around with a new format for the posts, trying to create a cleaner look. I settled on the Calibri font from Windows Vista, with a fallback to Verdana and Arial. The posts themselves are simpler, stealing a few ideas from Kottke .

I originally used PHP 5’s new object-oriented (OO) structure, which provides much more OO power than PHP 4. That’s where I ran into problems. Most of the original sewcrates.com code was written using functional code. I used OO for some of the more complicated structures—such as the parser that indexed all the directories to generate my musing collection, and the code around the generation of photos. I saw NAIS as an opportunity to rewrite everything using an OO model.

It’s been a while since I effectively used OO design. (A “while” is a bit of an understatement. The last time I effectively used OO design was in graduate school before the millennium.) For the most part, I use objects as advanced structures to provide common global variables for functions to share. For NAIS I wanted to develop a more meaningful OO design, and I dived in before fully planning the approach. I ended up with a strange design that left me struggling.

As I looked through my code files, I noticed that I created too many objects, overusing inheritance (not multiple inheritance, which is not available, thankfully). I’ve since gone back and removed most of the OO use. OO is very useful in some areas, but it tends to be overused, especially by me. In replacing the classes with functions, I did find a bunch of places where I could have used the class to limit how many variables I pass in related functions. There is an advantage to passing variables, however. I can control (and more importantly understand) what parameters the functions are using.

Seattle, WA | | Programming, sewcrates.com

Over-thought Solutions

After posting my Painfully Regular Expressions, Chuck commented that on his site, he threw the entire URL to the handler and let PHP parse it.

His RewriteCond probably looked something like this:

RewriteRule ^(.*)/?$ /handler.php?url=$1

And his PHP code probably looked like this:

$url=explode('/',$_GET['url']);

Alternatively (and where I ended up where I ran into problems with the way rewrite handled ampersands (&) in the tagnames, e.g., http://sewcrates.com/tags/D&D):

RewriteRule ^(.*)/?$ /handler.php

And the PHP code:

$url=explode('/',$_SERVER['REQUEST_URI']);

Both of these, by the way, beats the crap out of my PHP code for my original RewriteCond formulation:

$url=array($_GET['a'], $_GET['b'], $_GET['c'], $_GET['d'], $_GET['e']);

And has the added benefit of handling any number of parameters.

Sigh. This is one of those situations where my own cleverness got the best of me. I’ve since reconverted my .htaccess file to Chuck’s more elegant solution. I leave it to PHP to parse the URL. And with this egg on my face, I’ll return to my little programming hole.

One good thing did come of my earlier exercise. I learned the basics of regular expressions. After reading Chuck's mail, I created the new RewriteCond in only a few seconds. Before I went through my Painfully Regular Expressions, it would have taken much longer. I could have probably found Chuck's solution by Googling a bit--but I wouldn't have learned much. And look how many words I pushed to explain my failure!

Seattle, WA | | Programming, sewcrates.com

MySQL Buddies

My coding continues to go smoothly. I hit a snag yesterday as I worked on an administration function. I attempted to display all the photos that did not belong to a post, the orphaned photos, if you will.

In the old sewcrates, I tied the photos to individual posts. The photos were uploaded to the post’s directory (remember, each post had its own directory that contained flat files and attachments), and I generated the /slides and /thumbs as subdirectories for the posts.

In NAIS, I decided to separate the photos from the posts. Each photo (and I use photo loosely—it includes music and videos as well) lives in a table and in the /photos directory. I generate the /slides and /thumbs as subdirectories from /photos, and use a table in the database to tie the posts and photos together.

I designed it this way to allow for different types of albums. Besides the post-based albums (what you currently see on sewcrates), I wanted to create albums based off tags. For example, I could view an album with every photo tagged with "Julie." While the functionality will be there, I still need to go back and tag all my old photos. This is not something I'm rushing to do. I’m planning to build in functionality to allow for batch drag and drop tagging of photos. It may not make it until 3.1 as I’m getting anxious to post NAIS.

Let's get back to my snag with the orphaned photos view. At first, this seemed easy. I used my photos index code to generate a page with a group of photos. I just needed the MySQL query to finish it. I thought I had gotten rather good at writing the queries. When I coded castofhorribles.com, I spent a lot of my time looking up the format of the queries. After coding NAIS, I no longer have