I’m a huge fan of Vagrant’s recent omnibus style installer. It makes it so
much easier to recommend to others as they can be up and running with Vagrant
extremely quickly, instead of wondering why their distro packaged ruby
installation isn’t working. However, because Vagrant is using an embedded ruby
installation, other gems which add to vagrant are unable to find it.
One such tool is veewee, which makes it dead simple to automatically build VMs from
kickstarter files and basic scripts. Version 0.2 also adds a great subcommand
to Vagrant called ‘basebox’ which lets you use veewee to build baseboxes that
Vagrant may then use to launch new VMs. But with Vagrant being run from its own
embedded ruby environment, veewee is not able to find the vagrant gem to add
to, making it a little harder to use for ruby newbies.
There is a way around this, though. If you were to run:
veewee is installed to the vagrant embedded environment and vagrant basebox
is available and functions as expected. I’ve done this on my OSX 10.8 box that
uses rbenv to manage ruby versions as well on a Ubuntu 12.04 box that uses rvm.
I making this into a post because I have found it so handy. Some web
APIs have rate limits on requests per minute or you may want to play nice
and not overwhelm the service. In Python, you can use this decorator to
rate limit a function that may handle the API access:
import time
defRateLimited(maxPerSecond):
minInterval =1.0/ float(maxPerSecond)
defdecorate(func):
lastTimeCalled = [0.0]
defrateLimitedFunction(*args,**kargs):
elapsed = time.clock() - lastTimeCalled[0]
leftToWait = minInterval - elapsed
if leftToWait>0:
time.sleep(leftToWait)
ret = func(*args,**kargs)
lastTimeCalled[0] = time.clock()
return ret
return rateLimitedFunction
return decorate
@RateLimited(2) # 2 per second at mostdefPrintNumber(num):
print num
if __name__ =="__main__":
print"This should print 1,2,3... at about 2 per second."for i in range(1,100):
PrintNumber(i)
This answer is simpler than setting up a queue system and is blocking,
which can be good for sequential jobs.
Over the month of October, I took an incredible trip to Singapore and Japan.
That trip deserves its own post, but until then,
thesephotos will have to suffice.
However, I ran into a little snag while editing and publishing everything. The
problem was that each photo’s GPS/location data wasn’t making the jump to
Flickr from Aperture. The solution was these two check boxes that needed to be
selected in order for the location info to be correctly exported: one in
Advanced Options and another in Export Preferences.
So in the end, if you make sure “Include location information for published
photos” and “Include location info in exported photos” are both selected,
everything works beautifully.
It has been more than a year since my last
post and that
computer has been retired. However, I still find it useful to run my new
MacBook Air attached to an external monitor and with its internal display
disabled. A few days ago, I found a better and more permanent solution than a
flimsy magnet:
Attach the closed MacBook to an external display
Wake the MacBook with an external input device, like usb or bluetooth
keyboard.
Open the lid of the MacBook and the internal display will remain off
That’s it. No magnets required.
It takes a little bit more for this to work under OS X 10.7 Lion,
though. Entering the following command in terminal seems to do the
trick:
``` shell
sudo nvram boot-args=“iog=0x0”
Undoing this is as simple as typing the following, also in terminal:
``` shell
sudo nvram -d boot-args
You can also zap the PRAM (press Cmd+Opt+p+r at power up) to restore it
to the new Lion behaviour.
This works great and I’ve been using it to improve my laptop’s ventilation and
wireless reception.
UPDATED Nov 2011: I found a better way to do this that is posted
here
Up until now, I have run my laptop at work with the lid closed and everything
on an external monitor on my desk. However, I was starting to get really
concerned about the heat (60C idle and 95C under load) and how the little fan
was struggling to keep up.
So, I started looking around for tips about how to leave the lid open, but
trick my MacBook into thinking the lid was closed and leave the LCD off. I
found a few goodtips, but I still had to hunt with a magnet for that magical switch
point. Well, I found it and the picture is below. Things look pretty frosty so
far, let’s hope this extends the life of my 3 year old laptop a bit more.
Today I freed 150GB of space from my Macbook by moving my music to my Mac Mini
that sits below my TV, at home, behind two firewalls.
First, I hardened SSH on the mini and setup my laptop to log in without a
password, but I didn’t go through the SSHFS stuff, as I like AFP better (for
the moment). Now, I can access my Mini by running:
Where PORT is the random port I choose when [hardening SSH][1], USER is the
username on my mini and OUTSIDEIP is the external IP of my cable modem. Then,
I can exit from Terminal on my laptop, press command-K and run:
``` shell
afp://localhost:1203
and get the list of shared folders. Or I can run:
``` shell
vnc://localhost:1202
and get Screen Sharing with the Mini behind all those firewalls.
Finally, I [moved my iTunes Library to an external harddrive] [2] and hooked up
that beast to the Mini. By SSHing into my Mini and then running the AFP
command, I can now access my very large iTunes library from anywhere with an
internet connection.
If I would like to end the SSH tunnel, I run:
``` shell
ps auxww | grep -i ssh
After finding the ID of the process I do:
shell
kill -9 SSH_PID
`
with the SSH ID.
I will use some applescript to make this “connect, mount, launch iTunes” dance
a little bit more simple, but I think this is progress, as it has breathed new
life into my 2.5 year-old laptop.
I get many, many, many presentations, spreadsheets and PDFs sent
to me over email. I usually View them through Google Docs or Download them and
let the files launch in their proper programs. There are some times, however,
when I wish I could view or edit these files on my iPhone or on another
computer, usually located in our cleanroom.
Dropbox is an incredible service for this, with an
iPhone app and multi-platform support, but
those fab computers are locked down hard and I can’t edit things in the iPhone
app.
##The Caveat
Since I use Gmail for everything, I could just view the file
through the web interface on my iPhone or another computer and import things to
Google Documents with a click.
I recommend this way. I really do. Mostly because my solution is a folder
action applescript with your gmail password in plain text. This is stupid.
Very stupid. Beyond moronic. I would like to get Keychain Access from the
applescript for a better password handling, but a few hours of fiddling yielded
nothing and further thought showed it to be even more insecure to have
scriptable readouts of passwords globally enabled.
So, for the record, this is my hacked together solution.
##The Solution
Download google-docs-upload and put it
somewhere. I used /Users/USERNAME/Library/Scripts/GoogleDocs/
Open Script Editor.app and it should pop up with an Untitled and blank
script window. Copy this into the window:
applescript
on adding folder items to this_folder after receiving added_items
repeat with aFile in added_items
do shell script "java -jar /SOMEWHERE/google-docs-upload-1.3.2.jar
aFile -rf Downloads --skip-all -u YOURUSERNAME -p
YOURPASSWORD >> /SOMEWHERE/GDocs-upload-log.txt"
end repeat
end adding folder items to
`
Replace SOMEWHERE with the path to google-docs-upload, USERNAME with your
OSX username, YOURUSERNAME with your Google username and YOURPASSWORD with your
google password. This script will run when a file is placed in the folder.
Each file is passed to google-docs-upload along with your username and password
and it decides whether it can upload the file. Any output goes to that log
file tacked on the end.
Save this script under ./Library/Scripts/Folder\ Action Scripts/UploadGDocs.scpt
Right click on your Downloads folder and hover over “More” until it expands.
Go and click on “Configure Folder Actions…”
Make sure the “Enable Folder Actions” check box is ticked, then click on the
left “+” sign, select the Downloads folder and click the Open button. Then,
select UploadGDocs.scpt from the next menu to drop down and click Attach.
Close the Script Editor and the Folder Actions Setup.
That should do it. Any new file placed in your Downloads folder will be kicked
automatically to Google Docs.
PS: For some reason, whenever I tweak this script, my Downloads folder becomes
Read-Only for my user. I fix this by right clicking on my Downloads folder,
clicking on Get Info, clicking the lock icon in the new window, inputting my
password and then setting the drop-down menu next to my name to Read&Write.
If you know what is causing this, let me know.