In which I switch to Jekyll and figure out how to post from my iPad
It all started with a tweet.
Last summer, a colleague asked for recommendations of WordPress alternatives; I replied with a link to this article. At the time, I had been running this site on Movable Type for over 10 years; the article piqued my interest: Did I really need a full-fledged content-management system? Did I need to keep shelling out $10 a month for a web host with a database server?
I decided to give Jekyll a try. The Jekyll documentation includes a handy script for importing posts from Movable Type. I found a Bootstrap-based, Medium-esque theme that I liked, and Manuel Gruber (no relation to Hans) has an awesome post explaining how to have Wercker (a free continuous integration service) rebuild my site and deploy it to Amazon S3 whenever I check in a change.
Within a few hours, I had a fast, good-looking site running on modern software, and my hosting bill from Amazon is less than a dollar a month. I recently upgraded to Jekyll version 3; at the same time, I added an archive page to surface older content on the site.
Authoring on the iPad
Now that I can create a post simply by editing a Markdown file and committing it to a Github repository, I wondered if it’s practical to post from my iPad. (You may recall that I struggled with this several years ago.) This post is evidence that it is indeed: I authored it almost entirely on my 9.7-inch iPad Air 2 (I cheated a bit and created the image thumbnails on a Mac).
There are several capable Github clients in the App Store; I chose Git2Go because of its attractive UI and reasonably-priced ability to access private repos. My first step in writing a new post is to create a draft branch and clone it to the iPad.
Textastic gets rave reviews and integrates nicely with Git2Go: I can create a new file in Textastic and export it to my local repo, or create an empty file in the repo and open it in Textastic for editing.
My one complaint is that my (older) version of Textastic doesn’t support Split View in iOS. It’s a bit tedious to have to switch to a separate app to look up a link (or use the anemic Slide Over mode), but I’m not sure it’s worth an additional $10 to upgrade to the latest version.
What about QA?
At this point, I could commit my changes and merge the draft branch with master; my Wercker process would kick off and automatically publish the post to my site. But I’d prefer to preview the post in a browser and correct any issues before I push it to production. I have several options:
Manuel Gruber uses two S3 buckets, one for QA and one for Production. When he commits to his draft branch, Wercker publishes his site to the QA bucket, which is accessible at a secret URL. I considered this approach, but Wercker takes several seconds to publish the site; that would quickly become annoying if I wanted to make several changes;
Aerobatic offers automated continuous deployment of Jekyll sites. It works with Bitbucket, where I host my code (free private repos!), and it will host up to two sites free of charge. But the free tier only allows five deployments a day; I can see myself easily blowing through that trying to fine-tune some CSS;
What I really want is the same experience I get while working on my laptop: open a Terminal and execute jekyll serve, then point my browser at localhost:4000 and preview the site. I thought I had found the perfect solution: Codeanywhere spins up a container and runs your code in the cloud; the container is accessible via SSH. But alas, it chooses a random SSH port each time it starts a container; there’s no way to see what that port is in their mobile app, and their web application doesn’t work correctly in mobile browsers. ☹
I was ready to resign myself to merely writing on the iPad and waiting to publish until I got back to my desk, or using RDP to launch Codeanywhere on my home computer and finding the secret SSH port. But then it hit me: AWS!
If I set up an EC2 instance with Git and Jekyll, can I start it from my iPad, pull the latest code from my repo, and use an SSH client to run jekyll serve? Yes!
Then I can point my iPad browser at [ec2-instance-name]:4000 to preview the post:
Now I can write, preview, and publish posts wherever I am when inspiration strikes…as long as I have my iPad with me. And an external keyboard. After writing this post on the iPad, I’ve learned that trying to do real work makes that 9.7-inch screen feel really small; maybe I need to upgrade to the large model. 😉
As this blog approaches its tenth anniversary, I’ve been considering some changes.
For my first year of blogging, I used Radio Userland, a now-defunct piece of software created by the godfather of blogging, Dave Winer. Userland charged $40/year for Radio; when the time came to renew, I researched the available alternatives and chose Movable Type, which is free for individuals. I’ve used it, more or less happily, ever since.
A few weeks ago, Scott Hanselman tweeted about a new service that lets you create a web site by simply saving text files to Dropbox. That concept appealed to me, particularly since it would simplify blogging from my iPad.
It turns out there are severalsuchservices. Scriptogram seems the most flexible, so I created an account and began the process of converting my existing content to Markdown format.
I soon realized, however, that Scriptogram creates URLs like this: scriptogr.am/username/post/post-title. The service supports custom domains, so I could do this: philweber.com/post/post-title, but beyond that I can’t customize the generated URLs. If I migrate this blog to Scriptogram, all the existing URLs will change. Not good.
If I were starting a new blog, I would definitely use Scriptogram. But until I can keep my existing URLs, I’ll leave this blog where it is. I am, however, going to start writing posts in Markdown and saving them in Dropbox; I used Byword and MarkdownPad to compose this one. When it’s time to publish, I’ll paste the text into Movable Type (which supports Markdown); not as seamless as Scriptogram, but it’ll do.
I also plan to change this site’s focus (or, more accurately, give it one): Ten years ago, I was a software developer working on my first major ASP.NET project; I wanted a place to capture what I was learning and share it with others. Since 2005, I’ve been a technical trainer, learning instructional design, facilitation skills, and how to create e-learning that doesn’t suck. Watch for posts on these topics in the coming weeks.
Balasuggests that I add a “Funny Story of the Week” category in order to boost readership. I don’t know if I can come up with a funny story every week, but I have created a Humor category; here’s this week’s entry:
Not long ago, we had a “Bring Your Child to Work” day at my office, and we had a barbecue for the kids. I was eating at a table with some boys, so we started telling kids’ jokes. At one point I asked, “What's round and white and lifts weights?” (Correct answer: Extra-strength aspirin.) One of the boys looked at me and answered, “You!”
When I started this blog three years ago, I was working on my first significant ASP.NET project and I wanted a place to record and share all the new stuff I was learning. Since then, the whole world (including hundreds of Microsoft employees) has started .NET blogs, and I've changed jobs so that I no longer write code every day.
I considered shutting the place down, or simply letting it languish as Google-fodder. But three factors have inspired me to resume blogging:
According to FeedBurner, at least 150 people subscribe to this feed, so I guess I’m not just talking to myself;
The site is a great way to build and maintain my personal brand. I’m the #1 “Phil Weber” on the major search engines, and I’d like to stay that way; and,
I actually have some things to say!
So, today is the first day of the rest of my blog. The focus will change somewhat — I’m now a trainer, so I’ll write about the lessons I’m learning in that new role — but I still have several .NET articles bouncing around my head, so watch for them. To those of you who haven’t pruned me from your blogroll, thanks for your loyalty. Tell a friend!
So, I'm sitting in Oakland airport this evening waiting to board my flight to Portland, when over the loudspeaker I hear, "Passenger Robert Scoble, please report to Gate 8." So I wander over to Gate 8, and sure enough, The Evangelist himself!
Now, I'm not just some anonymous fan: I've known Robert since before he was famous; I worked for several years with him and Maryam (when her last name had more than two syllables) at Fawcette Technical Publications. So we spent a few minutes catching up on what we’ve each been up to, exchanged business cards, and Scoble gave me a coveted Channel 9 Guy. Then my flight was boarding, and my brush with greatness was over as quickly as it had begun.
But let me tell you this, Dear Reader: In spite of all his cachet and notoriety, Robert still flies coach.
I'll never forget my first e-mail address. Back in 1986, I signed up for a CompuServe account; my address was 72451,3401. Several years later, I opened an account with a "real" ISP and started using my new e-mail address in newsgroups and on my Web site. It was then that I was introduced to the scourge of spam.
Three years ago, when I registered the philweber.com and philweber.net domains, I thought, "Here's my chance to retire an address that's on every spammer's list and get a fresh start!" I informed my friends and family of the new address and scrupulously avoided using it anywhere it might be seen by spammers. Or so I thought.
Then the spam starting trickling in. How had they found me? Turns out I had used my new address to register my domains! D'oh!
Rather than change addresses again, I began using spam-filtering tools, starting with Qurb, a PC Magazine Editor's Choice. Qurb works well enough, but it integrates with your e-mail client; if you check your mail on the Web or with a mobile device, you're out of luck.
To address this limitation, I've been using a server-side spam-filtering service, MailSift. I simply set my POP3 server to forward all messages to MailSift, then point my e-mail software at MailSift's server to retrieve my messages. (MailSift can also poll your mailbox if your ISP doesn't support forwarding.) The service works great, and at $2/month it's quite affordable. (My current stats reveal that since I signed up two months ago, I've received 767 spam messages, but only 247 legitimate e-mails.)
Another annoyance with which I've been dealing recently is comment spam. If you host a blog on Movable Type 2.x, I recommend MT Blacklist, a donationware plugin that blocks comment spam by comparing the commenter's URL against a list of regular expressions. It can also despam your comments if one of those parasites slips through your defenses.
Poor Betsy Aoki: I think my Betsy Fan Club initiative creeped her out. All I meant was that I thoroughly enjoy her online persona -- it's a breath of fresh air among the mostly humorless blogs to which I subscribe -- and I wanted her to know that her efforts are appreciated. (I could have proposed a Rory fan club for the same reason, but he has more than enough fans already, and I find him far less attractive.) Unfortunately, I may have been excessively effusive (in retrospect, I concede that my marriage proposal was over the line ;-) and come off as a bit of a wacko.
To her credit, Betsy didn't decline to meet me for lunch when I visited Redmond a few weeks ago, but she did bring along a bodyguard. I took my meds, though, and hopefully the experience was a pleasant one for all concerned. Betsy was even gracious enough to chronicle the event on her weblog, going so far as to declare me “quite normal” (my therapist was thrilled!)
So, thanks, Betsy! I'm still a fan, not at all underwhelmed. And I promise to honor the restraining order.
Well, frankly, it is a bit of information overload. It's a full-time job just to keep up with blogs.msdn.com, and I have to wade through a lot of BizTalk/C++/Exchange/Windows Mobile stuff that's really not relevant to me. And what's the deal with this guy? ;-)
Occasionally, however, sifting through all that chatter pays off: I discover an unsung blogger who speaks to my soul, one whom I may never have found otherwise. Betsy Aoki is such a blogger; I find her (too infrequent) posts a perfect combination of smart, funny and quirky that never fails to bring a smile to my face. (Don't worry, Betsy: I'm happily married and I live 200 miles away, so you're not likely to find me lurking in the bushes outside your home or office. I'm content to eStalk™ you via RSS.)
I hereby propose the formation of a Betsy Aoki Fan Club; to join, post a comment. Live it vivid! :-)
I first learned of the release of Visual Studio 2005 Beta 1, as well as Express Editions and the MSDN Feedback Center, shortly after midnight this morning. Since then, I've seen it reported by dozens of bloggers, and the day is young. ('We blog more by 8 a.m. than most people do all day.') If you're a .NET blogger and you haven't yet written about today's new releases, please don't!
What is the thought process that leads one to blog about an event of this magnitude? 'If I don't blog this, nobody will hear about it!' Or perhaps, 'Ooh, if I hurry and blog this, I'll be the first, and I'll get lots of links and notoriety!' Please.
Before you post (not just today, every day), I urge you to peruse the home page at weblogs.asp.net or do a search at Technorati. If you don't have anything to say that hasn't already been said several times, do us all a favor and step away from the keyboard. Thank you.
When I went dark last August, I was in the final throes of a death-march project, one of those that seems like a good idea at the time, but ends up going on far longer than anyone anticipated. It was my first experiment with an "agile" methodology, but I obviously did it wrong ('An agile methodology is neither agile nor a methodology. Discuss.') Bottom line: I spent my last couple of months there working overtime to finish the project and trying (unsuccessfully, as it turned out) save my job; I was laid off in October.
Thankfully, I was able to land a consulting gig within a month: I worked on a medical transcription app for a large healthcare provider. Like resuming dating after a divorce, it was reassuring to have a client who liked me and my work ('I am still attractive!') It was, however, the first time in over four years that I had to actually go to work -- I'd been working from home since early 1999 -- so by the time I got home in the evening, blogging was the last thing I felt like doing.
About the time that project was ending, I was offered what seemed like my dream job: developer evangelist for a consulting firm/component vendor. I would be paid to promote the company's products and services among the .NET developer community by writing technical articles, speaking to user groups and participating in online discussions; blogging was actually in my job description! Unfortunately, after only four months my employer decided he couldn't actually afford a developer evangelist, and my position was eliminated.
Thankfully (again), I've landed a new job; I'm scheduled to start in mid-July, after my vacation. This time, I've made sure it's with a financially stable company and that the position capitalizes on my strengths, so hopefully I can remain employed for at least a year this time.
So, Heather, I hope that answers your question. ;-)
Wake the kids and phone the neighbors: philweber.net is one year old! To celebrate, I'm re-launching with new software, a new host, and a new design. (What do you think of the way my comments work? I couldn't decide between popup and inline comments, so I've done both (or neither.)) Anyway, a lot has happened these past four months, so there's plenty to talk about!
I grew tired of that sad little calendar staring back at me from my weblog, silently berating me over the fact that I've been writing only about once a month (or less!) -- and besides, does anyone actually use the thing for navigation? -- so I replaced it with links to monthly archives. Much better!
One minor wrinkle that made the change more challenging: Radio Userland (the software I use to produce this masterpiece) names its index pages "index.html". This site, however, is hosted on a Windows server configured to look for default pages named "default.aspx/asp/htm". Now, I could have simply included the file name in my archive links, or asked my ISP to add "index.html" to the server's list of default pages. But what I really wanted was for Radio to generate archive pages named "default.htm". Here's how I did it:
First, I went into user.radio.prefs.indexFileNames (in radio.root) and changed fname2 and fname3 to "default.txt" and "default.htm", respectively. Then I modified "on getArchiveFilePath" in system.verbs.builtins.radio.weblog.publish so that it returns a file named "default.txt", rather than "index.txt". That's it!
The downside, of course, is that the next time Userland updates the code in question, my changes will be overwritten. Wouldn't it be nice if Radio exposed the default filename as a preference?
This is a problem with writing every day. I only have something smart to say once a month.
I suggested that he employ the Spolsky method of only writing when he actually has something to say, but Robert says that reading his blog is "like playing the lottery." Hmm, OK, the Forrest Gump method.
At any rate, I have the opposite problem: Plenty to say, no time to say it. By the time I've worked all day, replied to my e-mail, participated in discussiongroups, read the sites in my blogroll (on a good day I get to about half of them), worked out, and spent some time with family and friends, blogging is the last thing I feel like doing! How do you people do this?
Robert Scoble is looking for a third-party solution for comments on his Weblog. I've been very happy with HaloScan: It's stable, it's fast, and it lets me edit and delete comments. Its latest cool feature is an RSS feed, so new comments appear in my news aggregator. Tell 'em Phil sent ya!
Welcome to philweber.net! I currently work as a software developer for FTPOnline. For most of the past year, I've been developing applications in ASP.NET; I decided to start this weblog to share my ever-growing collection of tips, techniques and stupid mistakes. I've learned this stuff the hard way; hopefully you won't have to!