Put the current Chrome URL in your Safari reading list

… or “Hey, dawg, we heard you like Safari so we put your Chrome in your Safari so you can Safari when you’re done Chroming!”

safari_service_menu

I tend to do desktop surfing with Google Chrome because I do a lot of “open 10 tabs at the same time” stuff on our Drupal multi-site and Safari’s not very good at that. Sometimes, when it’s time to head downstairs for lunch or by the fireplace for some iPad surfing, I find myself wanting to take a few things I had open in Chrome with me on the iPad. I used to use Pinboard, but Safari’s new reading list is more convenient and doesn’t clutter up Pinboard with short-lived links, so it’s cool that there’s an AppleScript command to add things to it:

And here’s one that does the same thing with the selected NetNewsWire headline:

Hook them up to the actual apps to taste.

I made the mistake of writing a quick Automator workflow that created a Service Menu item to do the same thing with any selected URL in any app, but when I went to try out my new service I noticed Apple had already thought of that. Easier to go into System Preferences and create a shortcut for it.

If you don’t mind the extra keystrokes, you could also just ⌘l then ⌘c to get Chrome’s current URL and use the service, no need for AppleScript at all, but I wrote it all before I realized Apple had done it for me.

What about Firefox?

No real scripting support because Firefox is lame like that and always has been. You can get the current Firefox URL by using AppleScript to press ⌘l then ⌘c:

Yuck.

Stand in the Place Where You Work

Some notes on adopting a standing desk for my home office. Maybe an odd entry because I started writing it several weeks ago, just after installing it and now I’m circling back because I didn’t want to do the whole “I got this standing desk and it’s been awesome for, like, 30 minutes now!” thing.

Read the rest of this entry »

Quick sharing from Acorn to imgur

Skitch is neat, but I usually have Acorn open already and it has a very nice layered screenshot tool. This gist just takes the frontmost Acorn image, web-exports it to a PNG file, uploads it to imgur then copies the resulting URL to the system clipboard for sharing.

That MacBook Air (and the iCore of the Future)

I’m officially a fan. I think it’s the  SSD that manages to make an ultralight laptop packing a 1.4GHz processor and 2GB of RAM feel as nimble as a desktop with a 2.4GHz processor and 8GB of RAM. There are some things I don’t do on the Air: It’s not running MySQL, Apache or Rails. But for all the “normal computer” stuff —surfing, writing, mail, RSS, light coding — it’s great. It even seems to run WinXP in VMWare pretty well, though doing that manages to get the (very quiet) fans to spin up.

Some day, if my situation changes such that I don’t want to have a big desktop machine handy, I can see entertaining the notion of owning another “full-sized” laptop, like a MacBook or MacBook Pro. For now, though, I don’t think I’ll ever want to own a notebook larger than an Air. It does everything I need in a notebook at about half the weight and without any sense that I’m making some big tradeoff. In fact, the old white MacBook just feels bloated and unnecessary: A device packing too much because there was a good chance it was going to be The Main Computer for a lot of its anticipated market.

Having had both side by side for a week now, I’ll be the first to say that having both an Air and an iPad is an unimaginable extravagance. There may be times when I’ll be glad to shave an extra pound off my bag and take just the iPad along, but I think I’d also be about as happy having my iPhone in a lot of those cases. During the day, when I’m still working but taking a break from the desk, there’s no way the iPad makes more sense than the Air.

Could it ever? Maybe, but it would involve Apple building the sort of hybrid device that third parties have stepped in and created with iPad keyboard cases, and it would involve Apple opening iOS more than it seems willing to. My day-to-day basics are heavily tied up in things like being able to use clipboard history applets, quick flipping between apps that are guaranteed to remember their states under normal load, and browsers that don’t need to reload tabs if I’ve been away from them. With those things, I could make some of the compromises needed to work around other deficiencies.

I’d like “some sort of hybrid device” a lot, but here’s my notion:

In under ten years, Apple’s going to be selling us iPhone-like devices we’ll jokingly call “iCores,” because they’ll (either literally or virtually) snap into the back of three form factors: larger tablets, notebooks and consumer desktops. The iCore will pack enough RAM, processing power and storage to do everything you need in a desktop computer today (with some help from the cloud). It’ll just be less wasteful about it, because you won’t need three different CPUs, GPUs, storage devices or sets of RAM. Instead, each form-factor will have a slot for some kind of physical interconnect or enough wireless hardware to communicate with nearby iCores and drive audio/video/input: They’ll be thin hosts to a fat client where fat has been defined down to “thin metal wedge you can slide into your pocket and use as a phone, too.”

TMTOWTDI – mysql2 and Windows edition

So, you’re trying to get Rails going on Windows, and you’ve used the handy package at RubyInstaller.org, installed the equally handy Ruby DevKit, and now all you need to do is install the mysql2 gem to get going.

At this point, if you do what any normal person might think to do, which is gem install mysql2, you’ll fail because the gem wants a bunch of MySQL dev headers. That’s not a bad thing … we live in a world of dependencies that must be met.

One answer you can pursue is to download the big MySQL archive and pass a few flags along when you install the gem:

gem install mysql2 -- --with-mysql-lib="c:\Program Files\mysql\lib" --with-mysql-include="c:\Program Files\mysql\include"

Then be ready to tell Bundle the same thing for your Rails app proper, which I couldn’t get working.

What also works, and is much more simple, is just getting the version that works with Mingw32 build environments (which is what you get when you install the DevKit):

gem install mysql2 --version 0.2.6

Bundle file?

gem 'mysql2', '0.2.6'

then bundle install

This is all, by the way, another lovely use case for VMWare: Freeze dry a VM at the point before you start desperately following whatever random advice you can find from people trying to make some portion of Ruby or Rails work on Windows so once you think you have it figured out you can roll back to a pristine state and make sure it all works before you document.

Not a bad time at all (tech edition)

Sometimes it’s nice to stop and look around and think about all the things you’ve been taking for granted. I’ve been in the process of handing two projects over to coworkers, one small and one large, and it’s caused me to go out looking for ways to make that easier. I don’t work on an actual dev team: My stuff has been solo efforts, so I’m aware that it probably looks and feels a little different from what everybody else is used to. It was good to find a few tools to make the handover less painful.

So here are a few things I’m newly grateful for:

GitHub

Wow. TextMate has great support for git repositories, so it was super-easy to set up a repository, add all the files, write a few READMEs in Markdown and hand things over. When something needed tweaking, it was a simple matter to make a fix, push it up, and let the recipients know. One of them was on Windows and needed different instructions to get things running? Fine … I made a Windows branch with its own instructions and dependency lists.

Maybe not as important, but GitHub made me feel better about dropping that code on my coworkers because it made everything more approachable. It makes the READMEs look good (and readable) and it makes the source easy to browse with pleasant syntax highlighting.

RVM

I’ve been developing with Rails on OS X, able to install whatever I need to get a gem working, updating my rubygems install whenever it suits me, etc. etc. I didn’t want to make my coworkers go through custom-building their own Ruby or rubygems, and after a few years of getting everything just so I know there’s a chance I’ve got something on my machine they don’t have on theirs. So RVM completely rocked.

RVM stands for “Ruby Version Manager,” and it’s a way to get a self-contained Ruby sandbox running on an unprivileged account. At its simplest, RVM lets you bypass your distro’s elderly Ruby packages and update your Rubygems package without getting a scolding about how your distro will be pleased to update that on its own timetable.

RVM can do a lot more: You can install multiple versions of Ruby and switch back and forth between them with something like:

rvm use 1.8.7

If you’d like to use whatever Ruby came with your distro:

rvm system

If you’ve got three or four Rubies floating around, you can set a default:

rvm --default use 1.9.2

You can also create swappable gem sets.

VMWare

I first reviewed VMWare 11 years ago, when this is what passed for a middling machine:

VMware’s base system requirements are a Pentium II/266 MHz processor and at least 96 MB of RAM. We tested the software on several configurations, ranging from a machine at the very lowest end of the recommended specifications to a Pentium III/500 with 128 MB RAM. Performance is clearly helped by devoting plenty of RAM to the virtual machine. A computer with 160 MB or more is closer to ideal, unless you run X with a conservative window manager and few applications.

I could have spent some time guessing about what might be needed to get my projects working for somebody else, but it was a lot easier to ask “which distro are you running?” download the necessary disc image, set up a VM to match their environment, then run through installation and testing. I did that twice this week: Once to match a developer’s workstation, once to make sure I was testing against the company server platform.

Ubuntu each time, by the way. I don’t know what the current state of the distro wars is, but Ubuntu went up about the way I remember Debian going up: easily and thoughtfully, leaving me with something that Just Worked for my limited purposes. So good for it.

progress_bar

So, _I_ know the script is doing what it’s supposed to be doing because I’ve been fiddling with it for a year. Not everybody else does, so there are a few ways to denote that something is happening. One is just adding an extra bit of noise to each iteration of the main loop to simulate a comforting beeping noise. Another is to use the handy progress_bar gem, which adds a progress bar that can show a counter, percentage completed, rate and ETA with just a few extra lines. Looks nice, less noisy, took all of a minute to add.

iPhone Tracker

iPhone Tracker is pretty neat.

Iphone tracker

Interesting how wrong some of the data is, too.

Padrino

Neato! Sam tipped me to Padrino, which sits on top of Sinatra and provides a sort of bridge between Sinatra’s minimalism and Rails’ … uh … Railsiness.

I’ve been fiddling around with the idea of building an app that would help me keep track of client sites: What plugins they have installed, what version their core software is at, what needs to be added to them, etc. It’s the kind of thing you could keep in a spreadsheet, but as I’ve sketched out what I want to keep track of, it’s gotten more and more unwieldy. I’d like, for instance, to keep track of which version WordPress is at in one place by updating just my WordPress entry, then list all the sites and get some quick visual feedback on which ones need an update. Same with plugin versions, template versions, etc.

It’d also be nice to have on place to keep track of which hosts each site lives on, what the path to the site files on the server is, client contact info, client support/development rates, and a worklog for each site (the better to have invoicing at some point).

Padrino’s cool because it provides a way to generate an admin interface that’s a step beyond Rails’ basic scaffolding. It’s nothing you couldn’t do in Rails pretty quickly, but Padrino makes it pretty and simple. For instance, here’s how to generate a Site model for my app:

g model site name:string url:string client_id:integer cms_package_id:integer server:string path:string

And here’s how to quickly create an admin panel to manage sites:

padrino g admin_page site

Then you just load up /admin/sites, enter your user name and password, and you have a password-protected Web admin interface from which you can create and edit sites:

Padrino panel

It doesn’t figure out associations, so you have to hand-edit here and there to do stuff like create a select item to pick which of your clients a site belongs to. You can do that by defining a collection in the controller (e.g. “clients”) and then use that collection with a form helper:

And that gets you this:

Padrino helpers

Combined with Pow and an hour of poking around the docs to figure out how to make the helpers work, Padrino gave me a working site manager app in under an hour. Nice.

Pow! etc.

It seems as if a few colleagues might need to use that little Sinatra-based reclassifier ditty, which is always a nice thing: The first iteration of these things usually seems to come close to breaking even on time saved if I just use it once, but if I can make the same tool available to one or two more people, then it’s a lock to earn the development time back and start saving a lot of time.

The problem with sharing stuff like Rails and Sinatra is deployment. Easy for me to set something up on my desktop that never seems to leave dev mode, but less of a pleasure to get it working for others, especially on shared hosting.

Several things will help with that:

First, Pow! from 37 Signals makes it easy to create a local development domain for webapps that use Rack. You just install it, create a config.ru file for your app in its directory, then symlink the app directory to ~/.pow and it becomes available at http://yourappdir.dev. Besides being a great way to work on a number of webapps in parallel, it’s a nice way to practice dealing with Rack.

Second, it looks like it’s not too hard to use those Rack-enabled apps on Dreamhost. This worked for my config.ru file, and it’s the same as the one I use for my desktop machine:

Third, it’s not too hard to add http authentication to a Sinatra app. That means I can deploy little apps that don’t require a robust user model to a subdomain and protect them for as long as they need to be up, which is just a day or two. Here’s all I had to add to the top of my app file to get http authentication:

This all makes me think back to 2008, when I wrote about my recent discovery of Rails: The combination of Sinatra, Pow! and Rack does even more to provide me with a comfortable replacement for lightweight databases, and makes it much easier to share my work, which is even better.

No More Hats, No More SEO

… no more moon in the water.

Andy Budd to SEO practicioners:

Please distance your self from the world of SEO, stop talking about search engine rankings and start helping your clients deliver real value to their users. Stop defining yourself by the discovery medium and focus on the content itself. I don’t mind what you call yourselves, be that digital marketers, content strategists or simply web designers. But whatever you do, remove the word ‘search’ from your job title. It’s tainted and devalued and you’re much better than that.

That’s exactly what Web publishers need to be hearing right now. Not new ways to go back to the old game of finding shortcuts to the top.

I like the phrase “content strategist,” too. It describes how professional Web editors and website owners should be thinking of themselves and the content they produce for their sites. It suggests a mindful approach that goes beyond “my site is about this so I’m going to put up lots and lots of stuff about it,” and raises questions like “where does this thing fit in?” and “what does this mean to where I want to go and will it help get me there?”

I talk to other editors who don’t really like thinking about SEO and who act like it’s a discipline outside their natural skill set. At the same time, they sneer about SEO and SEO specialists. Well, until editors can assume some responsibility for content beyond “my site is about this so I’m going to put up lots and lots of stuff about it,” they’re going to have SEO specialists to deal with. Ways they can take responsibility include:

  • Understanding what constitutes good HTML. That doesn’t mean being an expert at CSS positioning or even remembering how the markup for a table with headers works from memory, but it does mean understanding what heading (h1, h2, h3, etc.) and a handful of other tags are for and probably investing $9 in a HTML quick reference as readily as they spend $20 for each and every new edition of the AP stylebook.
  • Understanding what a handful of page-level (think head, title, some meta) tags are for and how to see if their pages have them.
  • Learning to think about whether their pages help visitors get what they came for and how they can facilitate that.

There’s plenty more, but if the picture post-Panda is one of Google and other search engines ratcheting the pressure on all the shortcut-takers and SEO charlatans, Web editors are in a position to reclaim some of what they lost over the past few years as short-sighted suits tried to replace good content with clever automation and cheating.

(Via Smashing)

© Michael Hall, licensed under a Creative Commons Attribution-ShareAlike 3.0 United States license.