Sunday, March 7, 2010

Image Processing with Python

I needed to turn this:



into this:



Why? Well, my wife wanted to paste smiley faces onto some triangles, rectangles and other shapes. The set with the outline is great, but she wanted to put faces onto triangles, rectangle's and some other shapes too. (She's a teacher, the shapes were warring, harmnony day is approachng and, and ..... it's complicated, trust me). Anyway, the borders looked a little odd.

As there were 60 of them to do (15 expressions in 4 different colours), I started thinking I'd figure out how to do some python scripting from inside GIMP, but after half an hour of futzing about, I decided that was too messy, and just decided to process the images directly. This is pretty easy actually. One of python's included batteries is the "Image" library.

I decided to tackle it thusly; modify any pixels within a specified annulus to transparent. I originally intended to check that the pixel was black before modifying it, but I forgot, and in this case, it worked just fine anyway.

Here's the code I used:

# RemoveAnnulus_01.py
# Removes a dark circle from smiley faces
# Replaces black pixels in a specified annulus with transparency
# Doesn't do anti-aliasing

import os
import sys
import Image
import math

# Parameters to modify pixels in an annulus
xMid=53 # Centre position
yMid=53 # (origin)
rInner=45.0 # Inner radius
rOuter=54.0 # Outer radius
xMax=106 # (Image size)-1
yMax=106

inputFile=sys.argv[1] # Input image file
outputFile=sys.argv[2] # Output file, will be overwritten if it exists

thisImage = Image.open(inputFile)
pixelArray=thisImage.load() # Use load method for pixel addresing mode

try:
reportMessage="OK"
for thisX in range(0,xMax):
for thisY in range(0,yMax):
dX=float(xMid-thisX)
dY=float(yMid-thisY)
thisRad = math.sqrt((dX*dX + dY*dY))
if ( (thisRad>rInner ) and (thisRad
pixelArray[thisX,thisY]=(0,0,0,0)

except IOError:
reportMessage="Failed"

thisImage.save(outputFile, "PNG")

print "%s:Processing [%s] to [%s]" % ( reportMessage,inputFile,outputFile )


I've not shown the script for iterating through the 60 different files, but that's not really the point of this post. This code works with two command line arguments, the input file, and the destination file.

BTW, none of this is meant as a slight on the GIMP's scripting capabilities, I just have little experience with them, and decided to go with something more familiar.

Monday, March 1, 2010

A Cyberspace Independence Declaration

The "This Week in Google" podcast I just listened to mentioned the "Cyberspace Independence Declaration", written by John Perry Barlow. Leo read some excerpts and I thought a link to an audio version I enjoyed would be in order.

Link to MP3 audio, ~5 MB.

The reading is by Jan Ruback, and included as a bonus chapter at the end of his reading of Cory Doctorow's collectedion, Content. (Highly recommended, BTW) It's available a variety of audio formats on this internet archive page, the second bonus item after the numbered chapters. You can also play it directly from the embedded player on the page if you're so inclined (It's chapter 32 in the player).

The full text version is available, with a little background on the eff site. Here's the obligatory wikipedia article.





Friday, June 26, 2009

NFS Shares

Modifying both mine and my wife's ubuntu Desktop machines (both running 9.04 at the time of this writing) to mount our music folder (on the MythTV box on the lounge room) locally.

The music is on the media box (called mythty) in the lounge room, at /media/ourmusic

Using NFS, to mount manually it's:

sudo mount mythty:/media/ourmusic /media/ourmusic

(That's servername:serverpath localpath)

Edited /etc/fstab to add:

mythty:/media/ourmusic /media/ourmusic nfs rw rsize=8192,wsize=8192

Sunday, April 19, 2009

Using True Type Fonts with Ubuntu

My wife does a fair bit of crafty stuff, and often finds weird and wonderful fonts to use with her creations. Often they're Windows TTF font files, which aren't linux native.

I simply get her to copy the fonts into a particular directory, and then run the following script.

sudo cp *.ttf /usr/share/fonts/truetype/username/
sudo cp *.TTF /usr/share/fonts/truetype/username/
mv *.ttf /home/username/Fonts/installed/
mv *.TTF /home/username/Fonts/installed/
sudo fc-cache -f -v
You can get all the bacground and other information you'll need in this article on the Ubuntu Wiki, which is where I got a lot of the info for this post.

It simply copies the files into a folder I created to hold installed TTF fonts, (/usr/share/fonts/truetype/username/) which will work for everyone, and then move the filed from the "todo" folder into a backup folder for reference. ( /home/username/Fonts/installed/ )

You'll have to restart any apps (Such as open office) to see the new fonts, but there's no need to log out or reboot.

Note, I commented on this issue a while back, here's the previous post.

Wednesday, February 18, 2009

Ubiquity

I've been playing around with Mozilla labs ubiquity plug in in recent weeks. It's still in beta, and far from fully featured, but even so it's quite impressive.

Tonight I was reading comments on a boing boing post where a few of the commenters had used ROT13 to obscure spoilers. There are plenty of good sites to do the conversion for you (I'm too old/lazy to do that sort of thing in my head these days) but I thought to myself that this would be a perfect for for a ubiquity command.

I know the world isn't really crying out for a ROT13 utility, but I thought it would be a good way for me to test the waters in writing some browser code. My javascript-fu is far from strong, but it was surprisingly easy. I spent far more time futzing about with publishing it than I did writing the code itself.

You can check out my notes here. Even if you've no interest in my almost embarrassingly trivial utility, check out ubiquity for it's own sake. If you're a power web-user, you won't regret it.

Monday, November 10, 2008

Broken Windows Updates

This post was inspired by a folder cleanup in which I found a note to myself from earlier in the year (May 27, 2008). I'm putting it here as a quick reference, as it's the sort of thing that happens once in a while, and filtering through all the google hits can be time consuming when you just need to fix something now. *

Symptom: Neither Windows Update or Microsoft Update would complete. The machine in question in this instance was a vanilla P4 somethingorother, running XP pro. Before finding this solution I tried a bunch of things, including an install of Service Pack 3.

You can read the full thread on the techarena forums. I found it via a google search, I'm not familiar with this forum in general. The bit that I needed is from post 3 in the thread:

Start regedit.exe and delete the following key (contains the WU
service configuration):

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Servic es\wuauserv

Do a reboot now!

Then run this command line (from a command prompt of from Start/Run, it
installs the AutoUpdate service (line will wrap in the newsreader!):

%SystemRoot%\System32\rundll32.exe setupapi,InstallHinfSection DefaultInstall
132 %SystemRoot%\inf\au.inf

(it must be a space between DefaultInstall and 132)

If it asks for your OS CD-ROM to get some files, just point it to the
folder %windir%\System32 (%windir% is typically C:\Windows).

Then run the following commands:

regsvr32.exe wuaueng.dll
regsvr32.exe wuapi.dll
regsvr32.exe wups.dll
regsvr32.exe wucltui.dll

Do a reboot again.

Then check if you can start and stop the Automatic Updates service
successfully from services.msc

These steps repaired the problem.

* Caveat: This sort of stuff does change from time to time, but it should still serve as an indication of the sorts of problems you should look for if you have similar symptoms. At the very least, you might include some of the relevant terms in your search to speed things up.

Sunday, October 12, 2008

Resizing the swap partition size after install

I just increased the amount of RAM in an Ubuntu web server from 256 MB to 1 GB. I wanted to increase the size of the swap file accordingly. There are various schools of thought as to how big the swap file should be, I went with 2 GB which is almost certainly overkill, but there you go.

My procedure was as follows:
  • Boot to using the Ubuntu8.04 live CD.
  • Use the partition editor to shrink the primary partition, and grow the the swap file partition and volume.
  • Write the changes to the disk.
  • Reboot to the server command line.
  • Determine the swap volume's new UUID using:
ls -l /dev/disk/by-uuid
  • Edit /etc/fstab and change the UUID for the swap partition to the correct value
  • reboot
  • Check that the partition is correctly mounted with the "free" command. Don't mind that you may not be using any of the swap at present, but you can at least tell that it's there for when you do need it.

Text editing with multiple files on the command line

To make my life easier, and considering that my web server doesn't have a GUI I first saved the output of the ls command to a text file, and edited that so that it contained just a single line containing the UUID
I then opened fstab
sudo vim /etc/fstab
and then, at the end of fstab, I inserted the file I'd created with the command:
:r /home/john/uuid.txt
I copied the UUID to the appropriate spot, deleted the line at the end and saved the file.

There are plenty of good tutorials and command summaries for vi / vim around on the web if you need them. (here's one, and another). I admit I'm somewhat conditioned to using graphical editors, but one doesn't always have a choice.