## Archive for July, 2011

### Find files from the future and touch them

Friday, July 29th, 2011

Moving files off my old laptop I somehow managed to corrupt the Last Modified dates. Many had their dates set to Epoch, but others were set to May 2021. This was very annoying. When I would sort by Last Modified I would get all these bogus files coming up on time. So, here’s a simple bash script to find all files with last modified date’s greater than the current time and touch them so that their last modified date is rest to the current time.


#!/bin/bash

USAGE="Usage: find_and_touch_future_files [directory]"
if test -z "$1" then echo "$USAGE"
exit 1
fi

if [ ! -d $1 ]; then echo "find_and_touch_future_files:$1 is not a directory"
echo "$USAGE" exit 1 fi # make a temporary file (timestamped with right now) tmp=tempfile touch$tmp
# find all files modified after temp file (right now) and touch them
find $1 -newer$tmp -exec touch {} \;
# clean up temp file
rm $tmp  ### Downgrade iPhone from 4.3.5 to 4.3.3 Thursday, July 28th, 2011 I upgraded to ios 4.3.4 and then 4.3.5 and finally wanted to go back to 4.3.3. At this point I tried to download the ipsw of 4.3.3 and restore with it via itunes. But I get the error:  The iPhone could not be restored . This device isn’t eligible for the requested build.  1. Upgrade to 4.3.5 OOOOOPssss 2. Add 74.208.10.249 gs.apple.com to the end of /private/etc/hosts 3. Download the 4.3.3 ipsw 4. Use Pwnagetool in expert mode, giving it the 4.3.3 ipsw, this creates a custom ipsw 5. In Itunes option+restore using the custom ipsw 6. After that restore is done, RE-option+restore in iTunes, this time with the regular 4.3.3 ipsw ### Share internet (via wifi Airport) applescript Sunday, July 17th, 2011 Here’s an applescript we’ve been using at home to share the ethernet internet connection between our two laptops. The computer with the ethernet cord plugged in runs this script, then the other computer can connect to the wireless network of that computer’s name and share its internet connection.  tell application "System Preferences" activate end tell tell application "System Events" tell process "System Preferences" click menu item "Sharing" of menu "View" of menu bar 1 delay 2 tell window "Sharing" if value of checkbox 1 of row 11 of table 1 of scroll area 1 of group 1 is 1 then click checkbox 1 of row 11 of table 1 of scroll area 1 of group 1 click checkbox 1 of row 11 of table 1 of scroll area 1 of group 1 end if click checkbox 1 of row 11 of table 1 of scroll area 1 of group 1 delay 1 if (exists sheet 1) then if (exists button "Turn AirPort On" of sheet 1) then click button "Turn AirPort On" of sheet 1 delay 1 end if click button "Start" of sheet 1 end if end tell end tell tell application "System Preferences" to quit end tell  ### Downloads ShareInternet.app (zip) Here’s a version wrapped into an app with a nice little icon so you can put it on your dock. ### Making http://alecjacobson.com/blog == http://alecjacobson.com/weblog Wednesday, July 13th, 2011 At some point youtube wasn’t letting me link to http://alecjacobson.com/weblog. I guess because it was too long. So I made a symbolic link on my server:  ln -s weblog blog  This worked OK, until my friend realized that when you accessed my blog through http://alecjacobson.com/blog all the links wordpress made were getting screwed up. At first when I tried to tackle this with .htaccess Apache directives, I came up with:  RewriteEngine on RewriteBase / RewriteRule blog/(.*) weblog/$1


But then wordpress was still constructing the urls wrong (sometimes putting weblog/blog/… instead of just weblog/… in links), so I had to have:


RewriteEngine on
RewriteBase /
RewriteRule blog/(.*) weblog/$1 RewriteRule weblog/blog/(.*) weblog/$1


But then this is annoying, although the page works, you could have every page with weblog/blog/… instead of just weblog/… It’s kind of ugly. So, I found this very simple solution instead:


Redirect /blog /weblog


Now blog/something just redirects to weblog/something. The redirect costs the view an extra network back and forth but oh well.

### Super resolution from many small images

Wednesday, July 13th, 2011

Searching for large, high resolution images of famous artwork I’m often frustrated. There are so many small, low resolution images. Many are different resizes of the same image, but there are still many totally different images of the same thing: photographs various tourists have taken, scans from different galleries or museums. What I always end up wishing for is a way to combine all of these low resolution images into one super-resolution image. In this specific case of famous artwork, the problem should be rather simplified from the general problem of super-resolution. The images are of the exact same object. And the object more or less doesn’t change over time. There are lighting differences, but we can assume that since the work is famous there will be enough “correct” images to uncover the true colors. The images will be different scales, and perhaps taken from slightly different camera orientations or projections. But since artwork is mostly photographed head on with little to no perspective projection, I think these will be easy to cope with.

My working example will be to uncover a super-resolution version of Matisse’s “Nude in a white dress”. If you’d also like to try, here’s a zipped folder of bunch of low-res images of the painting I’ve grabbed from the web. But it’s easy to make your own dataset. Just search for images of your favorite famous painting.

### Rename files with number using bash

Tuesday, July 12th, 2011

I had a bunch of jpegs:


my_file_name.jpg
my_other_file_name.jpg
here's_one.more.jpeg
...
my_fiftieth_file.jpg


and I want to quickly rename them to


01.jpg
02.jpg
03.jpg
...
50.jpg


I do this with the following small script in bash. Save this in rename_numbered.sh:

#!/bin/bash
# USAGE: rename_numbered.sh files
x=1;
pad=echo "(l($#+1)/l(10)) + 0.5" | bc -l for var in "$@"
do
dn=dirname $var; ext=${var##*.}
echo $ext echo "mv \"$var\" \"$dn/printf '%0'$pad'd' $x.$ext\""
#uncomment next line to enable
#  mv "$var" "$dn/printf '%0'$pad'd'$x.$ext" x=$(($x+1)); done  Then you can rename a bunch of files, like all those in a directory with:  ./rename_numbered.sh path/to/dir/*  ### can’t artists learn to make art that fits on my computer screen Tuesday, July 12th, 2011 ### Extract full resolution image from PDF using Illustrator and Photoshop Tuesday, July 12th, 2011 I had the problem that when kinkos scanned my artwork they gave me a PDF. This doesn’t make a whole lot of sense because the scan is a raster image. It’d be much better off in PNG or in many cases JPG. I tried just opening the PDF in Preview or Photoshop and saving as a PNG but when prompted for the resolution I wasn’t sure what to put. What was the resolution of the PDF? And what was the resolution of the embedded image? Then I tried opening the PDF in illustrator, selecting the image and pasting it as raw pixels into a new photoshop document. This didn’t work either since the image was embedded into the PDF in a scaled form so the copied image was too small. My final solution is as follows: ### In illustrator 1. Select the image object 2. Open View > Document Info > Embedded Objects 3. Record the size of the image 4. Copy the selected image ### In Photoshop 1. Create a new document (this will be the correct dimensions of the copied object, but perhaps the wrong resolution) 2. Paste the object, but as a Smart Object 3. Choose Image > Image size… 4. Enter the size of the image, previously recorded 5. Choose Layer > Flatten Image Update: As suggested in the comments it’s much easier to use pdfimages to extract embedded images. I made a follow up post which does this then uses imagemagick’s mogrify to convert the files to pngs. Update: Also, (see the comments), this is not even the easiest way to a get a single image from a pdf into photoshop. ### Bounded Biharmonic Weights: 2D MATLAB Demo Monday, July 11th, 2011 I’ve finally released the matlab prototyping codebase for Bounded Biharmonic Weights. The code base runs without any prerequisite libraries on MATLAB 2011a or greater. With earlier versions of matlab, users should install MOSEK (which is available for free to academic users). This matlab package demos computing skinning weights automatically for a 2d shape. To start, add bbw_demo/ to your matlab path and issue: >> bbw_demo  If you just want to start digging around in the weight computation code, look at: • boundary_conditions.m • biharmonic_bounded.m Currently the bbw_demo.m file just shows basic weight computation and linear blend skinning deformation for point handles. The following features are supported in the codebase above, but are undocumented besides their file header comments: • Bone handles • Cage edges • Dual quaternion skinning • Automatic rotations at point handles via pseudo-edges • 3D weight computation over tetrahedral meshes • 2D/3D remeshing along bones and cage edges • …and more The following things are not supported and probably never will be in the MATLAB demo. If I release the C++ demo then of course they will be available: • 3D interactive deformation • 2D texture mapping Please contact me if you find any bugs or have any trouble using the code. Update: Here’s a new C++ demo ### Mac os X Screencapture loop, bash script Monday, July 11th, 2011 Here’s a simple bash script that grabs screen captures at a specified interval and saves them to files:  #!/bin/bash # ./screencapture_loop delay_in_seconds file_name_prefix x=1; while : do screencapture -C -m$2-printf "%03d" $x.png x=$(( $x + 1 )); sleep$1
done