Geekery: Transferring this blog from iBlog 2 to WordPress

Note: For those looking to move from iBlog 2 to wordpress, this article and some follow-up can be found at the iBlog survivors’ forum. The complete script is available there for download. You really don’t have to understand all this stuff.

I started using iBlog several years ago, when it was new and I was new to blogging. It had one advantage over other blogging packages: it came free with my .mac account back in the day and it worked on .mac servers, which are, to put it kindly, inflexible.

Two things have happened in the intervening years: first, all the blogging platforms have gotten much better, including the ability to work on the blog while offline. The second is that iBlog made an abortive step forward to iBlog 2, which was a major improvement, but then the whole company stalled before that release was really finished (although by then I was fully committed to it). I will miss iBlog 2, but not as much as I will enjoy getting my stuff onto a faster, more versatile platform.

After a rather exhaustive search of blogging and CMS systems, I settled on WordPress. While it’s not perfect, it is a straightforward MySQL-Apache-php application that is easy to fiddle with, and some of the customizations I was looking for were much easier with WordPress than with others.

WordPress has a whole bunch of tools and instructions for importing your stuff from other blog systems. None of those did me much good at all, however, as iBlog was too obscure for anyone to worry about. After searching the Internet I found some helpful information, but it all applied to iBlog 1 – most people never made the move to the ill-fated upgrade. I was pretty much on my own.

WordPress can import data in a variety of formats, but it was up to me to get the data out of iBlog in a format WrodPress could understand. The most versatile format was one created by the folks at WordPress, which could include information specific to WordPress. Cool! Decision made, I was on my way.

Except… the folks at WordPress have never bothered to document the structure of their files. Apparently It’s something they’ve been meaning to get around to eventually (though the people writing translation software for the other major blogging software have long since muddled through it). I did what everyone else has had to do to export data: copy one of WordPress’s files and fiddle with it until it works. Not only is this a pain in the patoot, there might be tags that don’t appear in my examples that could nonetheless be useful to me. Oh, well.

I needed my import file to include definitions of categories, and then each of the blog entries, with correct category associations. My example file had a lot of fields that seemed redundant for my purposes, but without documentation I wasn’t going to waste time trying to figure out which tags were required and which weren’t.

Here is a very small (one episode) export file. We’ll go into the details of things like nicename later:

<rss>
<channel>
    <title>Muddled Ramblings and Half-Baked Ideas</title>
    <link>http://jerssoftwarehut.com/muddled</link>
    <description>blog!</description>
    <pubDate>Thu, 28 Jun 2007 21:32:21 +0000</pubDate>
    <generator>Jers Very Clever Script</generator>
    <language>en</language>
    <wp:wxr_version>1.0</wp:wxr_version>
    <wp:base_site_url>http://jerssoftwarehut.com/muddled</wp:base_site_url>
    <wp:base_blog_url>http://jerssoftwarehut.com/muddled</wp:base_blog_url>
 
<wp:category>
    <wp:category_nicename>bars-of-the-world-tour</wp:category_nicename>
    <wp:category_parent></wp:category_parent>
    <wp:posts_private>0</wp:posts_private>
    <wp:links_private>0</wp:links_private>
    <wp:cat_name><![CDATA[Bars of the World Tour]]></wp:cat_name>
    <wp:category_description><![CDATA[blah blah blah]]></wp:category_description>
</wp:category>
 
<item>
    <title>Delayed by Weather</title>
    <link></link>
    <pubDate>2007-03-27 18:23:57</pubDate>
    <dc:creator><![CDATA[Jerry]]></dc:creator>
    <category><![CDATA[Bars of the World Tour]]></category>
    <category domain="category" nicename="bars-of-the-world-tour"><![CDATA[Bars of the World Tour]]></category>
    <content:encoded><![CDATA[<p>The Weather Channel is calling the roads around here "a big mess", so I'm going to take time out from driving and catch up on some writing. Unfortunately, TWC is also calling for dangerous surf and "rough bar conditions". I'd better leave the laptop in my room.</p>]]></content:encoded>
    <excerpt:encoded><![CDATA[&amp;nbsp;]]></excerpt:encoded>
    <wp:post_id>1065</wp:post_id>
    <wp:post_date>2007-03-27 18:23:57</wp:post_date>
    <wp:post_date_gmt>2007-03-27 18:23:57</wp:post_date_gmt>
    <wp:comment_status>open</wp:comment_status>
    <wp:ping_status>open</wp:ping_status>
    <wp:post_name>Delayed by Weather</wp:post_name>
    <wp:status>publish</wp:status>
    <wp:post_parent>0</wp:post_parent>
    <wp:post_type>post</wp:post_type>
</item>
 
</channel>
</rss>

But how to create the file? The data for iBlog 2 is distributed over (literally) thousands of files. Writing a program to track down all the information and make sense of it would be a major chore. That’s where AppleScript came in. iBlog’s programmer took the time to provide access to the iBlog data through the Apple Scripting system. I was able to let iBlog read all of its silly scattered files and make sense of them, then provide the data to me in a coherent fashion. So far, so good. All I needed to do was loop through all the episodes, pull out the data I needed, and shovel it into a text file that WordPress could read.

[IMPORTANT NOTE: I’ve tried to go back and reconstruct the scripts as they were at the appropriate stage in development, but the snippets are untested.]

[ALSO IMPORTANT: you don’t really have to understand the code. If you are in this boat, I will help you. You should understand the challenges, but I’m here for you.]

on run

set exportFile to 0

try

set exportFile to open for access “Users:JerryTi:Documents:scripts:” & niceName & “.xml” with write permission

set eof of exportFile to 0

tell application “iBlog” to set cats to the categories of the first blog

repeat with cat in cats

tell application “iBlog” to set catname to (the name of cat) as text

set niceName to the first word of catname

write rssHead to exportFile as «class utf8» — xml/rss header stuff that’s always the same

set catDescription to “blah blah blah”

write out the category info

tell application “iBlog” to set nextText to “<wp:category>” & newLine & tab & “<wp:category_nicename>” & niceName & “</wp:category_nicename>” & newLine & tab & “<wp:category_parent></wp:category_parent>” & newLine & tab & “<wp:posts_private>0</wp:posts_private>” & newLine & tab & “<wp:links_private>0</wp:links_private>” & newLine & tab & “<wp:cat_name><![CDATA[” & catname & “]]></wp:cat_name>” & newLine & tab & “<wp:category_description><![CDATA[” & catDescription & “]]></wp:category_description>” & newLine & “</wp:category>” & newLine & newLine

write nextTex
t
to exportFile as «class utf8» — have to coerce the text from 16-bit unicode

tell application “iBlog” to set ents to the entries of cat

repeat with ent in ents

get the stuff in iBlog’s world, work with it here

tell application “iBlog”

set titl to (the title of ent)

set desc to (the summary of ent)

set bod to (the body of ent)

set postDate to the post date of ent

end tell

set nextText to (((“<item>” & newLine & tab & “<title>” & titl & “</title>” & newLine & tab & “<link></link>” & newLine & tab & “<pubDate>” & postDate) & “</pubDate>” & newLine & tab & “<dc:creator><![CDATA[Jerry]]></dc:creator>” & newLine & tab & “<category><![CDATA[” & the name of cat & “]]></category>” & newLine & tab & “<category domain=”category” nicename=”” & niceName & “”><![CDATA[” & the name of cat & “]]></category>” & newLine & tab & “<content:encoded><![CDATA[” & bod & “]]></content:encoded>” & newLine & tab & “<excerpt:encoded><![CDATA[” & desc & “]]></excerpt:encoded>” & newLine & tab & “<wp:post_id></wp:post_id>” & newLine & tab & “<wp:post_date>” & postDate) & “</wp:post_date>” & newLine & tab & “<wp:post_date_gmt>” & postDate) & “</wp:post_date_gmt>” & newLine & tab & “<wp:comment_status>open</wp:comment_status>” & newLine & tab & “<wp:ping_status>open</wp:ping_status>” & newLine & tab & “<wp:post_name>” & titl & “</wp:post_name>” & newLine & tab & “<wp:status>publish</wp:status>” & newLine & tab & “<wp:post_parent>0</wp:post_parent>” & newLine & tab & “<wp:post_type>post</wp:post_type>” & newLine & “</item>” & newLine & newLine

write nextText to exportFile as «class utf8»

end repeat

end repeat

write rssTail to exportFile as «class utf8» — xml/rss file closing stuff

on error errStr number errorNumber

if exportFile is not equal to 0 then

close access exportFile

set exportFile to 0

end if

error errStr number errorNumber

end try

if exportFile is not equal to 0 then

close access exportFile

set exportFile to 0

end if

end run

So far things are pretty simple. The script loops through the categories, and in each category it pulls out all the episodes. Only it kept stalling. It turns out that sometimes iBlog took so long to respond that the script gave up waiting. I added

with timeout of 600 seconds

at the start to make the script wait a full ten minutes for iBlog to respond. Yes, iBlog certainly is no jackrabbit of a program.

Now the program ran! The only problem is, the resulting file doesn’t work. Hm. The first thing the importer reports is that it can’t read the dates the way AppleScript formats them. So, I added a function to reformat all the dates to match the example. Then it was importing categories, but not items. Why not?

Um… actually I don’t remember the answer to that one. Let’s just say that it took a lot of fiddling and testing to get it right. Eventually, hurrah! There in my WordPress installation were episodes from iBlog.

And they looked like crap. The thing is, that iBlog included unnecessary HTML tags around the blog title, excerpt, and body. It’s going to be a lot easier to clean them up now, while we’re mucking with each bit of text anyway, so back to AppleScript’s lousy string functions we go to clean up iBlog’s mess. Now, after we get all the data from iBlog, we call a series of functions to clean it all up:

set titl to stripParagraphTags(titl)

set desc to stripParagraphTags(desc)

set postDate to formatDate(postDate)

set bod to fixBlogBodyText(bod, postDate)


The actual functions are available in the attached final script.

Things are looking better, but still not very good. Much of this is due to some junk iBlog did when converting my older episodes into iBlog 2 format. One thing it did was to insert hard line breaks in the text of the blog body. No idea why. Maybe they were there all along and I had no way to see them. WordPress helpfully assumes that if you have a line break in the data it imports, you want a line break when it shows on the screen. So, every line break is replaced by a <br /> tag when imported into WordPress. This will not do. Additionally, iBlog replaced paragraph breaks </p><p> with a pair of break tags: <br /><br />. Once again, the reason for this is a mystery. The latter issue is less important, but we may as well address it while the hood is up.

Back we go into the fixBlogBodyText function, to repair more silly iBlog formatting. The resulting function looks like this:

on fixBlogBodyText(s, postDate)

this assumes that if an episode is supposed to start with a div, it will have a style or class

if (the offset of “<div>” in s) is equal to 1 then

set s to text 6 thru (the (length of s) – 6) of s

in some cases there was an extra line feed at the end of the text as well

if the last character of s is “<” then

set s to text 1 thru (the (length of s) – 1) of s

end if

set s to “<p>” & s & “</p>”

end if

clean up iBlog junk (lots of this stuff is the result of upgrading to iBlog 2 – the conversion was not clean

replace all line breaks with spaces

set s to replaceAll(s, “

“, ” “)

replace all double-break tags with paragraph tags

set s to replaceAll(s, “<br /><br />”, “</p>” & newLine & “<p>”)

replace all old-fashioned double-break tags with paragraph tags

set s to replaceAll(s, “<br><br>”, “</p>” & newLine & “<p>”)

get rid of some pointless span class info


set s to replaceAll(s, ” class=”Apple-style-span””, “”)

return s

end fixBlogBodyText

note: replaceAll is a utility function I wrote that does pretty much what it says. You will find it in the attached source file. newLine is a variable I defined because left to it’s own devices AppleScript uses the obsolete Mac OS 9 line endings. What’s up with that?

At this point the text is importing mostly nicely. But wait! I was running my tests just working with one category to save time. When I looked at Allison in Anime on WordPress, some really weird things started happening. It turns out that when importing the data, you need line breaks every now and then, otherwise the importer will insert them. That would be nice to put in the documentation somewhere! In one of my episodes, the newline was inserted right in the middle of a <div> tag, which led to all kinds of trouble. So, to the above script I added a line that inserts a line break between </p><p> tags. As long as any one paragraph isn’t too long, I’ll be all right.

set s to replaceAll(s, “</p><p>”, “</p>” & newLine & “<p>”)

And with that, we’ve done it! We’ve written a script that will export all the data from iBlog 2 and format it in a way that WordPress can accept. Time to run it on the whole blog, go take a little break, and come back and see how things went…

Dang. Didn’t work. There’s a maximum file size for import, and my blog is too damn big. Not a huge problem, just a bit of modification to make each category a separate file. Now, at last, the data is imported, the text looks nice, and we’re ready to make the move to our new home.

Except…

The images don’t show up, and links between episodes are broken. Also, it would be nice if people could still read the old Haloscan comments. I guess we’re not done yet.

Image links were the easiest to repair. In iBlog 2 the source code always looks for the image at path /https://muddledramblings.com/wp-content/uploads/iblog/. We just have to find those links and replace them with new info. I used Automator to find all the image files in the iBlog data folders, then I copied them all up to a directory on the WordPress server, and pointed all the links there. Worked like a charm! (Icerabbit goes into more detail on that process here. I used different tools, but the process is the same.)

Links between episodes turned out to be a lot trickier. It came down to this: How do I know what the URL of the episode is going to be when I load it into WordPress? I had to either know what the episode’s id was going to be, or I had to know what its nicename was going to be.

Nicename is a modified title that can be used in URL’s – no spaces and whatnot. “Rumblings from the Secret Labs” becomes “rumblings-from-the-secret-labs”. If I set up wordpress to use the nicename to link to an episode rather than the ID number, it would have some advantages, but I can get long-winded (have you noticed?) and that applies to my episode titles as well. The URL’s for my episodes could get really long. Therefore, I’d rather use the episode’s ID for its permalink. (If you try the icerabbit link above, you will see the nicename version of a link.)

Happily, the import file format allows me to specify the id of episodes I upload. (I don’t know what it does if there’s already an episode with that ID.) After some fiddling I managed to specify reliably what ID to give each episode. Now in my script I make a big table with the iBlog paths to each episode and the ID I will assign it. Before the main loop I have another that builds the table:

first loop

set postID to firstPostID

set idTableRef to a reference to episodeIDTable

tell application “iBlog” to set cats to the categories of the first blog

repeat with cat in cats

set cat to item 1 of cats

tell application “iBlog” to set catFolderName to the folder name of cat

display dialog catFolderName

copy {catFolderName, -1} to the end of idTableRef

tell application “iBlog” to set ents to the entries of cat

repeat with ent in ents

tell application “iBlog” to set episodeFolderName to the folder name of ent

set episodePath to catFolderName & “/” & episodeFolderName

copy {episodePath, postID} to the end of idTableRef

set postID to postID + 1

end repeat

end repeat


Now it’s possible to look up the id of any episode, and build the new link. The lookup code is in the attached script, and also handles the special cases of linking to a category page and to the main page. For category pages, I just hand-built a table of the category ID’s I needed based on previous import tests.

Finally, there is the task of preserving the links to the old comment system. Happily, those Haloscan comments are also connected based on the file path of the episode. (Though it looks like really old comments are not accessible, anyway, which is a bummer.)

In the main loop, after the body text has been cleaned up, tack the link to Haloscan on the end, complete with hooks to allow CSS formatting:

set bod to bod & newLine & newLine & “<div class=”jsOldCommentBlock”><span>Legacy Comment System:</span> <a href=”javascript:HaloScan(‘” & entFolder & “‘);”><script type=”text/javascript”>postCount(‘” & entFolder & “‘); </script></a></div>”

Not mentioned above are functions for logging errors and a few other utililties that are in the main script file. They should be pretty obvious. The script includes code that is specific to issues I encountered, but it should be a good start for anyone who wants to export iBlog 2 data for import into another system. It SHOULD be safe to execute on your iBlog data; it doesn’t change anything on the iBlog side of things. I don’t know if there’s anyone else in the world even using iBlog 2 anymore, but if you would like help with this script, let me know.

Is the Hut running?

Hey, can someone test these links for me?

From where I’m sitting right now, I can’t access Jer’s Software Hut or the blog construction site. I can reach everything else on the Web, so I’m wondering if my server is down or if my IP address has been blocked by my host’s security robots (again). I went to sleep with an open connection to my WordPress database and that might have triggered something. Can anyone out there load those pages and let me know? Thanks!

New Blog Design Progressing Sideways

Ambitions are skyrocketing here at the Hut as the new blog starts to take shape. Too bad you can’t see most of it. But I’d like to ask two things:

1) When you wander over there, can you tell me what you see? I’ve got some of the same CSS that kills Internet Explorer over here at work over there as well, but I think I have things constrained so that the poor software can handle it.

2) Do you see a really dumb animated header? If not, what do you see?

Behind the scenes, that dumb header is grabbing haiku from a database using XML. The perfect storm of tech and art. Best of all, some of those haiku were written in a spreadsheet.

Which, now that I think of it, leads me to another way someone can help. All the old poems in the rotation are image files. Now I need them as text. Anyone want to transcribe them? It would be a big help! Just need a nice table (or spreadsheet!) with poem, author, comment, and link, if applicable. Surely someone out there is looking for a way to contribute to the arts.

So there we have it. My head is in such a technical realm right now that I can’t even watch cartoons. I amused myself tonight with wine and the ActionScript 3.0 documentation, with brief forays into php and WordPress APIs, thinking all the while about how to tackle a page count memory leak in Jer’s Novel Writer. Yeah, I know how to party on a Saturday night.

Getting the Hut Back Up and Rolling

Um… actually two releases. The first didn’t last long.

It’s been a while since I’ve really knuckled down and worked on Jer’s Novel Writer, but after wrestling with the script to extract data from iBlog to export to WordPress, my brain has been sliding into technomode, and it was nice to work in a programming environment that was less frustrating than AppleScript. I had a version of Jer’s Novel Writer that I’d done some work on a while back, but it took a while to get myself back up to speed on just what was going on in the code.

I missed something on my first try. Happily a loyal user caught it almost right away, and one day later version 1.1.8 is out there, helping people write. Whew! Slowly things are returning to the balance I’d managed to keep for the last few years. The last few months have been… less balanced. (Obviously I’m operating in the geek hemisphere right now. No metaphors for you today!)

Meanwhile, a few days ago I got this!

Jer's%20Novel%20Writer_award.png

2

I Guess this is Good

I’ve been thinking quite a bit about one of my stories recently, one I’ve worked on quite a lot because the story is very short but the ending is really tricky. I submitted it a while back to Fantasy and Science Fiction, and I hadn’t heard back. I assumed that their email rejection had not reached me due to my ongoing difficulties with my ISP (it was fine until the Germans took over). I started to get my head around the necessary modifications to the ending, but before I did anything rash, I thought I’d best contact the editor to make sure I was rejected.

It turns out I hadn’t been rejected, at least not until I asked about it. He’d been sitting on the story, on the bubble about whether to take it or not. When I asked directly, he had to say ‘no’, since he had no place to put it. Apparently the moon is common these days. Ultimately, I was almost there, but not quite, which bodes well for this story finding a home in a pro publication eventually.

Isaac Asimov, I’m told, advised writers to not revise stories between submissions. Let’s face it, the thing is never going to make a whole bunch of money and meanwhile you can be working on something new. It’s about that whole diminishing returns thing. Still, I can’t help but fiddle with this one. I’ve had endings that were lyrical, and others that were emotional, and others that were tight, but I haven’t hit all three. Maybe it’s impossible, but I have to keep trying. So I’ll tweak it, but not too much, and send it on to the next magazine.

I’m Boned

I’ve been under the weather the last few days, but last night I resolved to get back out into the world. I had a plan: visit the bread and cheese store, visit the bankomat, then on to the friut and nut store, then sit down for a nice pizza.

Mmm… pizza.

Step 1 went flawlessly, but they were short on stuff for my classic recipe “Rice and Stuff”. No worries. On to the bankomat (rhymes with ATM). After some deliberation I punched in a large number (rent is due) and the machine replied, “Unauthorized use. Card retained.”

So much for pizza.

I wasn’t terribly worried; I figured I’d be able to drop by the bank in the morning, communicate my predicament in broken czech, prove I was the same guy that was on the card, and recover my cash lifeline. Those who have been around a long time may recall that a bankomat ate my card once before. That was long ago, and I had a backup, so I just started using that one. Time has made me complacent, and now I have no backup.

There will be no pizzas until I get my card back.

This morning bright and early I popped down to the bank and spoke to a rather gruff person there. She spoke no English, but I’d mentally gone over the vocabulary I’d need. It took a couple of tries to get across that my card had stayed in the machine and that it was not a card for their bank. She went off for a brief conference with her colleagues and came back to tell me, “you have to call your bank and get a new card.”

No pizzas for a long time. Rent is a bit of a problem as well.

I left the bank in a bit of a daze, turned in the direction away from home, not sure what to do. Western Union? I’ll call the bank and we’ll figure something out. As I was walking I was stopped by an old man who asked me to help him across the street. So I’ve got a little karma working anyway.

Now I at Little Café near home, squandering pocket change on tea, thinking of the upcoming release of Jer’s Novel Writer (long, long overdue) and about scheduling problems with Moonlight Sonata, and generally moving my worry into channels I can do something about until business hours in San Diego.

But, yeah, I’m boned.

1

AppleScript Sucks

Here’s the thing: the idea behind AppleScript is actually very cool. That I can write a (theoretically) simple program that harnesses the power of several applications on my computer is the Next Frontier in Computing (Apple is not the only company doing this stuff). Now Apple even has a program called Automator to handle some of these tasks without you ever having to write any code. That’s a good thing, because AppleScript the language really, really blows. So much for the next frontier. It’s like the covered wagon is being pulled by an armadillo.

The temptation of AppleScript is that I need to take information from iBlog and convert it to a format that WordPress can use. AppleScript makes it really simple to ask iBlog for its data, already set up and accessible. Cool. Then we get to the part where we have to make AppleScript do useful things to the data. Uh oh. Welcome to the worst programming language ever created.

Sometimes with familiarity one learns that although a different language might do things a different way, it has its own strengths. Perl, for instance, is a text monster, but makes sacrifices to be one (so I’m told). AppleScript occupies a unique position in the programming world as I know it by doing everything badly. I challenged myself tonight to come up with one good thing to say about it. For perspective, when I try I can even think of good things to say about Microsoft and the Yankees. Not AppleScript. It’s like Apple is intentionally hiding powerful capabilities I know are there, built into the operating system. Not only that, it hides simple abilities that I can use in any other comparable scripting environment. AppleScript doesn’t want me to get my work done.

On top of that my task this time is made harder by iBlog’s grinding horrible slowness. Is nothing at all happening because I made a mistake, or is iBlog just off smelling the roses right now? What I want to do is exactly what AppleScript and iBlog’s script support were designed for, and I’ve already written some text functions that every other comparable environment has built-in, yet in the end I’ve been wasting my time. Now it’s time to bring in the big guns. Doing this the hard way turns out to be simpler than doing it the easy way. Go figure.

I will be doing a series of propellerhead articles documenting the migration from iBlog to WordPress. The articles might be interesting to someone if I wasn’t the only one on the planet still using iBlog.

1

Moving the Blog!

Yesterday I was hacking at some code, fixing a problem with the way the site looks on the Opera browser. I use iBlog right now, a platform with some cool features and some pretty obvious warts. It was designed to work on servers where the blogger had no control over the server at all (say, Apple’s .mac servers), and therefore the way it did some things was… unusual. Without going into too much detail, iBlog does some things that have unpredictable results on some browsers, including the latest Opera. In addition, the company that made it stopped working on it some time ago and even the discussion forums are gone now.

I fixed the most obvious problem, but there were others, and once again I was faced with the choice of spending my time cobbling together the old system or shifting to a more robust platform. Sooner or later I’m going to have to move, so I decided not to spend any more time tweaking this one.

I’ve been looking into various blogging and content management packages, without finding one that matched the features of iBlog. A couple came close, however, and that’s going to have to do. I will be moving to WordPress sometime this spring. I should be able to make it do what I want, as long as I don’t mind getting my hands dirty. Looks like I’ll be learning a bit of php.

Here’s where you come in: I’ve got a test blog up and running, and out of the box it looks… boring. Slick and professional and all that, but not really me. I Browsed through the bazillion other options people have already created and, well, they’re not very good either – either stodgy or designed by illiterates for illiterates. “Oh, you want to read the text? Dang, I never considered that…”

I takes only a glance around here for you to to see that my design skills are no better; but now I’m going to be doing a ground-up redesign of the site, even if I want to keep it looking the same. I have some thoughts about some fairly ambitious things I’d like to try, but before I get carried away I’d like to know what you guys think of the way things look right now. What do you like? What don’t you like? Layout? Colors? Content? Too much in the sidebar? Not enough whatnot?

One idea I just had: a page with links to all my stories, with a way for people to rate them. The favorites would rise to the top. Yeah, I suspect that feature’s not coming soon. But maybe your crazy idea will work! Leave a comment! Go nuts!

I met a guy once

I met a guy once

I met a guy once, a big guy his skin black his teeth white his eyes red his laugh came from deep in his belly, and “who the hell are you?” he asked me.

1

Relativity is Relative

So I’m writing a story that takes place in the Tincaniverse, a neighborhood of the Science Fiction world that suspends a couple of physical laws because they are inconvenient, while still maintaing a general feeling that science is real. Anyone who writes a story with faster-than-light travel or spaceships with gravity holding people to the decks is playing in this same universe. Everyone knows time travel is sci-fi hooey, but time travel and faster-than-light travel are pretty much the same thing as far as physics is concerned. This is the inconvenient bit that writers and readers would prefer to ignore.

Time travel stories are really tough to do, because the writer is obliged to create an elaborate set of rules to prevent paradoxes. Many writers go for the branching-universe model for time travel, that posits that when you change an event in the past you spawn a branch universe that reflects the change, while there’s still another copy of the universe crashing along as if nothing ever happened. Which means the catastrophe the protagonist went back in time to prevent still happens, just not on his new time line. He’s just blown off his friends to horrible suffering while he goes and has fun with copies of them. Selfish bastard.

Still, time travel makes a good story once in a while. (See “William Ashbless” and “Red Dorakeen”)

Anyway, here I am in the Tincaniverse, thinking about the most poetic way to wrap up a story, and suddenly selective relativity is attractive. Distance and time being synonymous really works in this case. The question is, am I brazen enough to go for it?

Kindle 2 Rocks?

kindle.png

Hmm… super-high resolution screen, and FREE unfettered internet access anywhere? Add to that books that cost a fraction of what they would on paper. Interesting. Very interesting. Is this one of those geat “writers don’t need stinking publishers anymore, they just need a bit of marketing and good word of mouth”, or is it “good writing will get buried in the noise because the traditional filters between the public and the host of really bad writers has been torn down” or is it “the era of the influential critic”?

Or is it all three?

By the way, the comic is xkcd, which will appeal to geeks of all stripes.

Important things you should know: I get a kickback if you use the link to buy a Kindle. I’ve never even seen a Kindle in real life. Make sure when you buy it that you’re getting a Kindle 2.

Visitor in the Night

I almost didn’t answer the door. There was no one I was interested in seeing on a night like that. When the bell rang I was sitting in front of a fire, contemplating the book I had just completed, while the storm raged outside. Occasionally the warm glow in the room would be interrupted by an electric flash, followed almost instantly by a bone-jarring crash of thunder. But the doorbell rang, and after a brief hesitation I answered.

I opened the door and there she was, a lock of her raven hair stuck to her pale face, glued there by the rain. She was wearing a long jacket but no hat; she was soaked.

“May I come in?” she asked. I stood aside and she brushed past me. “Do you have anything to drink?” she asked.

“Sure,” I said. She followed me into the den, loosening the belt on her coat while she walked. In the doorway she watched as I poured her a drink, then she let her coat slide to the floor. Beneath was lace and not very much of that.

We collided in the middle of the room, a four-legged beast fueled by lust, a tangle of flesh and sweat and breath. Finally we lay on the couch, intertwined, spent.

She got up at last and crossed to where her coat lay on the floor. She pulled out a compact pistol and pointed it at me. “I’m sorry Mr. Jones, but now you must die,” she said.

“My name is Thompkins,” I said. “Jones lives next door.”

“Huh,” she said. She glanced around the room before meeting my eye. “This is awkward.”

Rejected At Last!

I sent a story off to Wierd Tales, a venerable monthly magazine that publishes stories that fit under the broad category ‘horror’. It is the magazine that H.P. Lovecraft published most of his stories in, back in the 1930’s. When I sent off the story I thought publication in that magazine would count as a pro sale for the Science Fiction Writers of America, a group I would like to qualify for someday. Turns out it wouldn’t have counted.

On top of that, after I submitted I had a lot of thoughts about how to make the story better. The thing was, as long as there was a possibility that they would publish the story in its current state, it was a bit of a waste to go editing it.

Time passed. A lot of time. I began to assume that I had been rejected but had somehow missed the notification. Then I heard that the two magazines that publisher puts out (the other one named for Lovecraft) were consolidating into one. One less market for genre writers. Now that their reorganization and shrinkification is complete, I got the rejection I’d been waiting for. Hours later, I have a better story.

On the subject of shrinking markets, one and a half true pro publications have also bit the dust. One is gone completely, the other is going from twelve to six issues annually. That’s the publication that has been kind to me in the past. Tough times. I have a better story, and now I need to find the right place to send it.

A Change in Schedule

So there we were, careening toward our three days of shooting, which were scheduled to be next week. I had run some mildly distressing numbers, and despite some help from a corporate sponsor it looked like we were going to go over budget.

Yesterday I got one of those good news/bad news calls from fuego. The good news: he was going to have enough cash to pitch in enough to pay for the rental of a really good camera. That was encouraging. We’d spent the previous evening trying to figure a way to get one. fuego, it seems, felt even more strongly after reading my blog episode that it would be a real shame to miss the opportunity to look as good as possible on film festival screens. If we get everything else right, it would be a real shame to have a lower-quality product just to save a few bucks. We began planning how to raise a little more cash.

Note: If you or the company you work for would like to sponsor an independent short movie, it’s not too late! Product placement might be tricky, but a mention in the credits would not be a problem. You too can be a patron of the arts! And now back to our regularly scheduled ramble:

So, the call from fuego. The good news, if you will recall, was that he had found a source of money. The bad news was that he was going to have to work for it. He’d been offered a job that would take him from Belgrade to Milan to Monte Carlo over the next couple of weeks, planning and executing a show for Zepter, a company that markets high-end household crap. In typical Zepter fashion, they called him yesterday and asked him to be in Belgrade today. Also in typical Zepter fashion, they offered to fly MaK and Z-Dawg to Monte Carlo so the family could celebrate Z’s first birthday together.

Having the director on set during filming is fairly important, so we immediately began juggling the schedule. fuego gets back about the time Lenka leaves on a trip, and then when she gets back fuego is gone again, and that all adds up to push the schedule a month. Wow. fuego may cancel his second trip, but he’s already paid for it, so it comes down to finding someone to go in his place. Not something we can really plan around.

So, dang. That pushes editing into April. I think we don’t have to worry about the April 17th deadline for Karlovy Vary (which would be a sweet, sweet, place to premiere the film), since the handful of shorts they show seem to go through a different application process. No matter the date, getting it through post-production will be important, if only to let me see it before I head for the states.

2

Kofola… Isn’t Very Good

Back around 1959 or soon thereafter, the powers that be in the Czech Republic were looking for something to do with some sort of caffeinated byproduct of the coffee roasting process. They turned the problem over to a chemistry lab which developed KOFO syrup. Shortly thereafter Kofola was born, and Eastern Europe rejoiced that their children could also rot their teeth on carbonated sugar water.

Kofola boasts some 14 “natural” ingredients, and while the various references agree on the number, I could find no list stating what all of them were. The Wikipedia article (and the dozen other places that quote Wikipedia without citing it) focuses on things like apple extract, while others mention cardamom and licorice. They are proud to have less sugar than Coca-cola (almost certainly beet sugar in Kofola’s case), and essentially the same amount of caffeine as Coke, which is pretty tame by today’s standards.

According to the boys at Kofola, they are every bit as popular as the American invaders, but in my personal experience I don’t see how that could be true. Maybe it’s a city-country thing. More likely it’s a generational divide, and the people who drink Kofola were the ones who learned to like soda when the western options were limited. Among the people I know, however, Kofola drinkers are rare enough that in my years here I had never tasted Kofola. I decided this was one of the things I had to do before my return to the US.

I went to the corner store to buy a small bottle of the stuff. While I stood scanning the soft drink choices I noticed that the 2-liter bottle was the same price as the 1/2-liter bottle. Hm… I paid my money and hauled the big boy home. After all, if I liked the stuff, I wouldn’t want to regret not getting more for the same price.

I held my anticipation in check, deciding that my first taste of the stuff should be chilled. I wedged the bottle in the freezer next to the carp and waited. Before long I felt tired so I moved the drink from freezer to fridge and went to sleep.

The next morning I was up at the crack of midmorning and ready to try Kofola. I poured a glass, sniffed, swigged. As you might recall from the title of this episode, Kofola isn’t very good. I can also say that it defies description. Anyone who buys into Dr. Pepper’s claim as the most original soft drink in the world has not had Kofola. Perhaps if the communists had asked a kitchen to develop the syrup rather than a chemistry lab things might be different. Perhaps. Perhaps the recipe is “the fourteen things they had a surplus of in 1960.”

Now I have in my refrigerator most of two liters of Kofola (I had a second glass of the stuff to see if it might be one of those flavors that grows on you), and two carp. In the spirit of Communist Czechoslovakia, perhaps I should find a recipe that combines the ingredients I have a surplus of. CArp au Kofola, anyone?

1