In 2004, in the summer before my last year at NAU, I worked at USGS, on the Astrogeology Team. What I did there was nothing special, but it was a pretty special place to be, especially at that time.
I worked on a package called ISIS, Integrated Software for Imagers and Spectrometers. It was software for processing high-resolution photos we received from sources including the Lunar Orbiter, the Mars Rover...and Cassini.
Cassini entered Saturn orbit shortly after I started working there. It was an exciting time. I got to spend a lot of time looking at images that looked a lot like these:
I grabbed this image from FiveThirtyEight. Original source is, obviously, NASA.
My work on ISIS wasn't anything high-level or complicated. I edited makefiles, so that the ISIS source code (a mix of C and FORTRAN) would compile for different platforms. If memory serves, we supported Windows, OSX, Solaris, and x86 GNU/Linux.
My work wasn't glamorous, and I'm sure it's all long-gone for the codebase. But I was thrilled just to be on the team, to be part of something like that -- getting photos back from Saturn.
It's been more than thirteen years, and I've had nearly that many jobs, since my time at USGS. But I still feel that connection to the work and to the project. In all that time, every time I've see a headline about Cassini or Saturn, I've checked out the article. My favorite part is always the pictures.
Today, Cassini concludes its journey, burning up on entry into Saturn's atmosphere, transmitting data back for as long as it can.
It's been a good run. And I'll never forget the small part I played in it.
I was working for a small company in north Phoenix. (That was not the mistake. ...Well, actually, it was, but not the one I'm here to talk about today.) And I represented that company in a networking group of local small businesses.
One of the people in the group was Sam Crump. I'm not used to using people's real names when I tell stories like this, but Sam's a public figure, so I'm going to go ahead and make an exception in this case.
Sam owns a law firm. I can't tell you anything about it from personal experience, but I hear good things.
And in 2006, Sam decided to run for the state legislature.
Sam's politics are not my politics; he would later describe himself as a "Tea Party Republican," though people weren't calling themselves that yet. I wouldn't have voted for him. But I liked him; he was a nice guy, and so when he asked us all to join his mailing list, I went ahead and wrote my E-Mail down.
Never put your E-Mail address on a political mailing list. Not for a politician you agree with, and certainly not for one whose views you find appalling. No matter how much you like him as a person.
Now, I don't know for sure that Sam or his people sold or gave away my E-Mail address to some group that collects E-Mail addresses for various fringe Republican candidates. It could be just a coincidence. But it's an E-Mail address I don't give out to a lot of people, it's the only E-Mail where I regularly get right-wing spam, and it just so happens that I started getting right-wing spam at that address after giving it to a local right-wing politician. Maybe whatever godforsaken list that address got put on got it from someplace else. But if I had to guess, I'd say they got it from Sam.
In the past, I've gotten spam for Arizona political candidates including Pamela Gorman and Joe Arpaio. But the latest politician who won't leave me the fuck alone is a woman named Calandra Vargas, who is running for Congress in Colorado Springs.
I have never set foot in the state of Colorado.
In fact, I've explained that to Ms. Vargas, or whoever's reading her inbox (if anybody), multiple times, in between clicking the Unsubscribe link at the bottom of her E-Mails.
The campaign's response to my first unsubscribe request, a few weeks ago, was to send me three more fucking E-Mails. When I got them, I clicked the Unsubscribe link again, and sent a reply letting Ms. Vargas, or whoever's reading her inbox (if anybody), know that if I received any more E-Mails from her campaign I would report her to the FCC for violating the CAN-SPAM Act.
I got another E-Mail from the Vargas campaign today.
Calandra Vargas is a politician, so she's probably not used to dealing with people who keep their promises. But I'm a man of my word, and I filed that complaint. And if I hear from her again, I'll file another one.
Here's the FCC's guide to reporting spam. If you're getting unsolicited E-Mails from politicians who won't let you unsubscribe from their lists, they're breaking the law.
This one is probably obvious, but just in case it isn't: I started with a short story because when you want to learn a new skill, you want to start small. I didn't want to write something novel-length and then run into a bunch of problems.
A short story's the perfect length to start with. Old Tom and the Old Tome clocks in around 3,000 words, split up into 4 separate sections (cover, copyright, story, About the Author). It has a great structure for learning the ropes.
Of course, you don't have to go the fiction route. In fact, it occurs to me that this blog post would actually convert quite nicely into a short eBook. Hm, food for thought.
I checked out Scrivener because Charles Stross swears by it. It's basically an IDE for writing books; it's quite simply the most advanced and mature piece of software there is for the purpose.
There's a Linux version, but it's abandonware. For a GNU/Linux user such as myself, this is something of a double-edged sword: on the plus side, I get Scrivener for free, where Mac and Windows users have to pay $40 for it; on the minus side, if a system upgrade ever causes it to stop working, I'm SOL. If Scrivener stops working on my system, there's not going to be a fix, I'll be locked into a platform I can no longer use. I could try and see if the Windows version will run under WINE, but there's no guarantee of that.
The good news is that Scrivener saves its files in standard formats, so if it ever stops working I'll still be able to access my content in other programs. The bad news is that it saves its individual files with names like 3.rtf and 3_synopsis.txt.
So Scrivener's pretty great, and I'll probably stick with it for a little while even though there are no more updates on the horizon for my OS -- but there's a definite downside to using the Linux version. (And if they decided the Linux version wasn't going to bring in enough profit to justify maintaining it, what happens if they decide the same thing for the Windows version someday, maybe leave it as a Mac-only product?)
Scrivener's got a great tutorial to run through its functionality; start there.
When you're done with the tutorial and ready to get to work on your book, I recommend using the Novel template, even if you're not writing a novel, because it automatically includes Front Matter and Back Matter sections; the Short Story template does not.
Scrivener's got your standard MS-word-style tools for formatting your work. I didn't use them. Since I was targeting a digital-only release and no print version, I wrote my story in Markdown, which converts trivially to HTML but isn't as verbose as HTML.
Since I went the Markdown route, I found that the best option for output at compile time was Plain Text (.txt). The most vexing thing I found about the output was the limited options under the "Text Separator" option -- the thing that goes between different sections. What I wanted was a linebreak, followed by ***, followed by another linebreak. Scrivener doesn't have any option for that -- your options are Single Return, Empty Line, Page Break, and Custom. Under Custom you can put ***, but there doesn't seem to be any way to put a linebreak on either side of it. So I found the best option was to just do that, and then manually edit the text file it put out and add a linebreak on either side of each one.
If you plan on making an EPUB file, you'll probably want to keep all the "smart quotes" and other symbols that Scrivener adds to your text file. However, if you want to distribute the Markdown file in plain text and want it to be readable in Chrome, you'll need to remove all the pretty-print characters, because Chrome won't render them correctly in a plain-text file (though it'll do it just fine in a properly-formatted HTML file). You'll also want to use the .txt extension rather than .md or .markdown if you want the file to display in Firefox (instead of prompting a download).
You've got different options for converting from Markdown to HTML. Pandoc is a versatile command-line tool for converting between all sorts of different formats, but I don't like the way it converts from Markdown to HTML; not enough linebreaks or tabs for my tastes. There are probably command-line flags to customize those output settings, but I didn't find them when I glanced through the man page.
I thought Scrivener's Multimarkdown to Web Page (.html) compile option worked pretty well, although the version I used (1.9 for Linux) has a bug that none of the checkboxes to remove fancy characters work correctly: you're getting smartquotes whether you want them or not. You also don't want to use *** as your section separator, because Scrivener reads it as an italicized asterisk (an asterisk in-between two other asterisks, get it?) instead of an HR. Similarly, it reads --- as an indicator that the previous line of text is an h2.
So your best bet for a section break is something like
(Actually, you don't want to use HR's at all in an EPUB, for reasons I'll get to later, but if you want to distribute an HTML version of your book, it's fine to use them in that version.)
Sigil is an excellent, very straightforward tool for editing the EPUB format. I recommend you grab the Sigil User Guide, go through the Tutorial section, and do what it tells you -- even the stuff that generates seemingly ugly code. For example, if you use Sigil's Add Cover tool, you wind up with code that looks like this:
If you're like me, looking at that makes you wince. And your instinct will be to replace it with something simple, like this:
<img src="../Images/cover.jpg" alt="Cover" />
But don't do that. Removing the <svg> tag, or even removing those ugly-ass inline styling attributes, will prevent the cover from displaying correctly as a thumbnail in readers.
(If there is a way to clean up that ugly <svg> tag and still have the thumbnail display correctly, please let me know; I'd love to hear it.)
Now, Sigil is for the EPUB2 format. It doesn't support any of the newfangled fancy features of EPUB3, and neither do most readers at this point. You're going to want to keep your styles simple. In fact, here's the entire CSS file from Old Tom and the Old Tome:
Oh, and that last class, .break? That's there because some readers ignore <hr/> tags. FBReader on Android, for example, will not display an HR. No matter how I tried formatting it, it wouldn't render. Not as a thin line, not even as a margin. If you use an <hr/> tag in your EPUB file, FBReader will act as if it isn't there.
So I wound up cribbing a style I saw in Tor's EPUB version of The Bloodline Feud by Charles Stross:
where, as noted in the above CSS, the .break class centers the text and puts a 1em margin above and below it.
(Some readers won't respect even that sort of simple styling, either; Okular parses the margin above and below the * but ignores the text-align: center style. Keep this in mind when you're building an EPUB file: keep the styles simple, and remember that some readers will straight-up ignore them anyway.)
(Also: this should go without saying, but while it's okay to look through other eBooks for formatting suggestions and lifting a few lines' worth of obvious styling is no problem, you don't want to go and do anything foolish like grab an entire CSS file, unless it's from a source that explicitly allows it. Even then, it might not be a good idea; formatting that works in somebody else's book may not be a good idea in yours.)
Once my EPUB was done, I tested it in a number of different readers for a number of different platforms at a number of different resolutions. There are a lot of e-readers out there, and their standards compliance is inconsistent -- much moreso than the browser market, where there are essentially only three families of rendering engines.
If you're used to using an exhaustive, precise set of CSS resets for cross-browser consistency, you probably expect to use something similar for e-readers. Put that thought out of your head; you're not going to find them. The best you're going to get are a few loose guidelines.
Consistency across different e-readers just isn't attainable in the way that it is across different web browsers. Don't make that a goal, and don't expect it to happen. You're not looking for your eBook to display perfectly in every reader; you're just looking for it to be good enough in a few of the most-used readers.
For example, I found that the margins the Nook reader put around my story were fine on a tablet, but I thought they were too much on a phone. If I'd wanted, I could have futzed around with media queries and seen if that was possible to fix -- but I decided no, it was Good Enough; it wasn't worth the effort of trying to fix it just for that one use-case.
If you already know HTML, here's what I can tell you about the Smashwords Style Guide: read the FAQ at the beginning, then skip to Step 21: Front Matter. Because it turns out that Steps 1-20 are about how to try and make Microsoft Word output clean HTML and CSS. If you already know how to write HTML and CSS yourself, there is of course absolutely no fucking reason why you would ever want to use Word to write your HTML and CSS for you.
It's probably a good idea to read the rest of the guide from Step 21 through the end, but most of it's pretty simple stuff. To tell the truth, there are exactly two modifications I made to the EPUB for the Smashwords edition: I added the phrase "Smashwords edition" to the copyright page, and I put ### at the end of the story (before the back matter). That's it.
For all the time the guide spends telling you how easy it is to fuck up and submit a file that will fail validation, I experienced none of that. My EPUB validated immediately, and it was approved for Smashwords Premium the next day (though Smashwords says it usually takes 1-2 weeks; the quick turnaround may have been a function of how short my short story is).
Most of the forms you fill out on the Smashwords Publish page are well-documented and/or self-explanatory. The Long Description and Short Description fields are exceptions; it's probably not entirely clear, at a glance, where your listing will show the short description and where it will show the short one. So here's how they work:
On Smashwords, your book's listing shows the short description, followed by a link that says "More". When you click "More", the long description appears underneath the short description.
Kobo and iBooks don't appear to use the short description at all. Your book's listing will show the first few lines of your long description, followed by an arrow (on Kobo) or a "More..." link (on iBooks), which you can click to expand to show the entire description.
Inktera shows the long description, followed by an HR, followed by the short description.
Lastly, Blio doesn't show either description of my book. Clearly this is a problem and I should probably talk to tech support about it.
As you might expect, the various different ways the different sites use the two descriptions create a bit of a conundrum: how can you write a short description that is the primary description on one site and a long description that is the primary description on four other sites, and write the two descriptions so that they don't look pointless and redundant when you put them side-by-side?
I haven't come up with a good solution for this in the case of Old Tom yet.
It turns out the Amazon conversion is really easy. I just set up an account at kdp.amazon.com, filled out the forms, uploaded the cover and the EPUB file, and Amazon's automatic conversion software switched it over to Kindle format with no trouble at all. Amazon's even got a really nice online reader that lets you check how your file will look in the Kindle Reader on various devices (Kindle Fire HD, iPhone, iPad, Android phone, Android tablet, etc.).
I only hit one speed bump when I submitted to Amazon: after a few hours, I got an E-Mail back saying that the book was freely available online (because of course it is; I've posted it in multiple places, including this site). Amazon required me to go back through and reaffirm that I am the copyright holder of the book -- which meant just going through the exact same forms I'd already filled out and clicking the Submit button again. It was a little bit annoying, but not time-consuming and mostly painless, and the book appeared for download on Amazon shortly after.
And that's it.
The hardest part of self-publishing an eBook was finding the time, figuring out what resources to use, and learning the EPUB format. And now that I know what resources to use and understand the EPUB format, it doesn't take nearly as much time. For my next book, I'll be able to spend a lot more time writing and a lot less time formatting. Hopefully this blog post has helped you so that you can do the same.
This was an interesting project, and I hope it will be the first of many. In the coming days I expect to share some of the Making-Of information -- what tools I used to make it, the learning curve, etc.
So I've got a current resume posted publicly up on CareerBuilder.
And oh God, the spam that brings.
It's kind of amazing how many hiring agencies seem to have taken a look at the scammers who sell penis pills and decided, "Yeah, that looks like a pretty good business strategy."
I'm inundated, every day, with postings for jobs that aren't even in my state. I've gotten ten of them this week alone (and one phone call), and it's only Wednesday morning.
Most of them seem to be coming through one single distributor, or at least one single software kit -- because they follow the same format, and if you click Unsubscribe, all the Unsubscribe pages look exactly the same except for the logo.
Needless to say, they do not actually honor the unsubscribe requests. These are spammers we're talking about.
Of course, the big problem here is that unlike the spambots selling Cialis, I can't just mark these as spam and rely on Bayesian filters to sort the wheat from the chaff -- because aside from the location, these postings are indistinguishable from real job posting E-Mails, of the sort I want and need, because I am trying to find a job. Job spammers have an in that other spammers don't: they're advertising something I actually want, they're just advertising it in a place I don't want it. So I can't filter out an entire class of E-Mails, because the risk of false positives is far too high.
Which leaves me relying on filtering by domain name. Which, as anybody knows, is unreliable Stone Age Whac-a-Mole shit, because spammers use all the domain names they can get their mitts on.
Still, it's better than nothing, and I'll be putting a list of the spam domains I've filtered so far at the end of this post -- maybe it'll be of some help to some other folks out there looking for work. And maybe it'll give these agencies a little bad publicity.
But first, here's a story about the absolute worst, slimiest job spam I've gotten to date.
It's from an organization called Strategic Staffing Solutions, which started out by straight-up brazenly lying to me. Here's a portion of the E-Mail I got, with the rep's last name and E-Mail redacted -- I don't want to rain down Internet mob justice on anybody, even if they are engaging in sleazy tactics; I just want to name and shame the company that encourages this type of behavior.
From: Adam [redacted] <[redacted]@strategicstaff.com> Subject: data scientist - MO 01/26/2015 02:17 PM
Hello Thad Boyd,
Please contact me as I have many job opportunities to discuss.
We have 24 locations within the USA.
I have called your phone number about your resume. The phone number has been disconnected.
Would you be interested in this job position? Please send me your resume.
Here are two job orders:
What followed were two job listings that have absolutely nothing to do with my education, training, or job experience.
So, straight into the circular file it went.
And then I thought, you know what? No. That line about trying to call me and my phone being disconnected was low. That's just a gross way to start any kind of relationship.
So I replied to the guy, and decided to press him on the "Your phone has been disconnected" lie.
From: Thad Boyd <[redacted]> Subject: Re: data scientist - MO 01/27/2015 08:45 AM
I've had the same phone number for ten years, and haven't had any trouble receiving calls that I'm aware of. What number were you trying to call, and where did you get it?
He, of course, completely ignored my question, and responded with this boilerplate:
From: Adam [redacted] <[redacted]@strategicstaff.com> Subject: Re: data scientist - MO 01/27/2015 09:55 AM
Please send me your resume.
Are you actively seeking work?
Please make use of Central Sourcing@STRATEGIC, as they can accelerate your recruiting.
I decided to press the issue one more time:
From: Thad Boyd <[redacted]> Subject: Re: data scientist - MO 01/29/2015 09:52 AM
Yes, I'm actively seeking work.
Where did you say you got my contact details, and what phone number were you trying to call? I'd like to know if there's something wrong with my phone service. My grandfather is in the hospital right now and I need to know that people can reach me.
(And since he pretended not to notice my question about the phone, I pretended not to notice he'd asked for my resume.)
That last part is true, by the way -- Grandpa's going to be okay but he is currently in the hospital. I brought this up to make a point: lying to somebody about his phone being disconnected has consequences. If I had been gullible enough to believe his lie, I could have wound up wasting a good chunk of my day on the phone with Sprint, trying to figure out what was wrong with my phone service, and worrying all the time that I was missing important calls about a family member's health.
Lying to somebody like that -- what the hell is even the point? You think you're going to build a rapport with me by starting our relationship off by lying to me? Specifically, lying about something that could cause me a considerable amount of stress if I believed you? And how long do you think you can keep somebody believing the lie when you clearly have never even looked at his resume?
Does this actually work often enough to keep Strategic Staffing Solutions in business?
I sent that E-Mail out on the 29th. It's been four business days and I think it's a pretty safe bet that Adam's not going to be getting back to me. Not so much as a "Look, I'm sorry, they make us say that, there's no problem with your phone and I hope your grandpa gets better; is there any way I can still help you?" When faced with the potential consequences of his lie, he didn't take the thirty seconds it would have taken to come clean and apologize to me. He just chalked me up as a loss and moved on to the next sucker.
So I'm pretty comfortable in saying fuck Strategic Staffing Solutions, fuck their sleazy, dishonest recruitment tactics, and fuck the horse they rode in on. If you do business with Strategic Staffing Solutions, know that you are doing business with spammers and liars -- and that if they were so cavalier about lying to me, they're probably going to be more than happy to lie to you too.
Finally, here's a list of domains that have sent me job spam, and I'll probably add to it as time goes on. Please feel free to add them to your own spam filters. And hey, if this creates some negative word association for these domains on Google, I'd be pretty okay with that.
I've still got a ways to go -- so far all I've done is tweak my existing, circa-2008 codebase. I'd like to redo the backend and base it on the latest WordPress default theme (for better compatibility with widgets and things, and ideally to get responsive CSS and semantic tags working from the get-go), but that's probably going to take me a bit.
In some ways, I'm veering more retro than ever (you'll note the red links are gone and we're back not just to blue but to good old #0000FF); in others, I've made a few modest concessions to CSS3 (rounded corners and box-shadows aren't so bad -- gradients and transparencies are still bullshit, though).
I thought about writing a lengthy post discussing my design sensibilities and how I've applied them in this latest update, but I think I'll hold off because I'm not actually done yet and I'm still deciding on some changes. (Links aren't currently underlined; I'd like to underline them, but post titles are also links and if they're links I want them to look like they're links, and I don't like underlines on post titles. Considering adding a colored background to post titles, but I'm still deciding. Stuff like that.)
I've learned a lot about modern Web design over the course of the past year and a half or so, since it went from being hobby/occasional freelance gig to day job. I'm still not much of a graphic designer, and my sensibilities are still very much those of a programmer rather than an artist. (I'm disappointed that XHTML was deprecated in favor of updating the HTML4 standards base, but on the other hand I dig the semantic stuff.)
And speaking of Web design as day job...well, I feel like one of these days I should continue my Tempin' Ain't Easy post and talk about the jobs I've had since. It's been interesting.
Left work early yesterday, and didn't make it in at all today. Rough week. Starting to feel better; hope that holds.
Not much else to add, I guess. Puttering around the house a bit, continuing to take inventory. Got my broken Wii to work with my broken CRT TV. It would appear that we literally can't have nice things.
So the main reason the blog's been kinda quiet this week is that my house was broken into on Monday. I don't really want to say anything more about it publicly at this point. Stuff was stolen, it sucks, we're okay but shaken-up and stressed-out, we'll get through this and things will be back to normal eventually.
It's been a pretty lousy week -- mainly due to the burglary but also because there's been some turnover on my team at work, and today I came home early with a headache. I've been getting headaches all my life, but they didn't used to happen every single fucking time it started to get cloudy out. If this is what happens when you turn 30, I can't wait for all the myriad health issues that will crop up at 40, 50, ...
Anyway. I'm bound to get back to more regular blogging and Zappa posts somewhere down the line, but I'm not quite there yet. Still got a lot else to do.
But for now, I think I'm going to take a break and play some DuckTales.
There are few things more infuriating than submitting a randomly-generated password and seeing it rejected based on some stupid asshole's stupid asshole idea of what constitutes a strong password.
Yesterday I encountered a site that rejected K"Nb\:uO`) as weak but accepted P@55w0rd as strong.
And my first day at my current job, we had to take mandatory security tutorials that, among other helpful hints, suggested that we satisfy the requirement for a capital letter and a symbol by putting the capital letter at the beginning of the password and an exclamation point at the end. Which, for those of you who are as bad at basic arithmetic as whatever moron put that suggestion in a security tutorial, defeats the entire purpose of requiring a capital letter and a symbol.
Which is, of course, why requiring capital letters and symbols in the first place is stupid, because "make the first letter a capital and put an exclamation point at the end" is what pretty much everybody does to satisfy that requirement anyway, even without official company-sanctioned security tutorials assuring them that this is okay and totally better than just having an all-lowercase password because math class is tough.
Woke up this morning with a nasty headache. After some coffee and ibuprofen I managed to get it manageable enough that I made it to work, but I was still achy, and the extra coffee made me jittery besides.
Felt better by around lunchtime, and the second half of the day wasn't so bad. Aside from having some tedious tickets. The good news/bad news is that I've become the go-to guy for putting together websites for extra-difficult or -particular sets of requirements.
Latest OpenSUSE upgrade gave me a KP on reboot, but rolling back a few versions let me boot okay. Then my speakers were making horrible noises; inexplicably, rebooting and removing and reconnecting the audio cables didn't do anything but removing and reinserting the USB cable for the external sound card did.
Went out to my in-laws', played with my nephew, and ate a calzone from Spinato's, my favorite pizza place. Watched Jack the Giant Slayer on DVD. Entertaining if forgettable action flick.
Got home and saw the black widow who lived under my door was out. I first saw the little fucker a few weeks back; back then I tried to find something to smash it with but by the time I did it was gone. (I wear sandals in the summer, and I'm not about to try to step on a black widow with an open-toed shoe.) I vacuumed up its webs, sprayed Raid around the area, and hoped I'd killed it, and didn't see it again after that, but tonight made it clear that either that hadn't killed it or another one had moved into its spot.
Tonight I managed to get into the house and get my hands on a shoe (closed-toed) without disturbing it, and gave it a good and thorough smashing. Sprayed Raid around the threshold afterward, just in case it laid eggs. If it didn't work last time, I don't know if it will this time, but while I have stronger poisons I'd really rather not sprinkle them in an area where they're certain to be tracked into the house, so hopefully Raid will do.
...I just noticed I'd been reflexively writing "RAID" in all caps and went back and fixed it. Funny the things your mind does.
(The last time I took a typing test -- which was sometime around late 2005 or early 2006 -- the only error I made was writing "Thad" instead of "That". Obviously it's a word I write fairly frequently.)
Anyway, got a good 25 minutes left in the day; guess I should probably go find me a Zappa something to post.