Jump to: GIMP plug-ins • Astronomy software • Scripts and tiny programs • Bookmarklets and browser stuff • Miscellaneous fiddling • Patches
I also have a couple of online classes for beginning programmers: a Python course and a Javascript course.
You can browse my GitHub profile here.
I also have a separate app,
metapho,
for tagging collections of images in complicated ways you
wouldn't want to do in pho.
Ellie
plots elevation profiles uploaded from a GPS unit,
so you can see how much you climbed on your hike or ride.
gpxmgr is a little script for splitting GPX track files. If your GPS produces a single .gpx file that includes multiple tracks, which confuses some software, or if you have tracks from multiple trips and just want to keep them separate, gpxmgr can do that.
netscheme is a fast comand-line way of switching among network schemes in places you visit a lot. I find it faster to type "netscheme home" or "netscheme work" than to fiddle with NetworkManager-type menus.
It's built around a useful Python networking library called netutils.py
that offers Python wrappers for finding active network interfaces,
bringing interfaces up and down,
getting lists of ESSIDs, associating with an accesspoint, etc.
A quick-and-dirty solution
for people who don't like the GIMP 2.8 Save vs. Export separation.
GIMP Plug-ins and Scripts
The Save/export clean Python plug-in
Pandora: GIMP Plugins for Making Panoramas
A set of plugins
to assist in combining a set of images into a panorama in
the GIMP.
The beginnings of a set of GIMP scripts for making pages of labels (business cards, envelopes, etc.) so that they can be printed at high quality with gimp-print/Gutenprint.
These grew out of my older GIMP plug-ins to make it easier to
generate and print CD labels, though the
newer gimplabels includes all the CD plugins as well.
(That page also includes arclayer, a plug-in to bend text in
an arc of a specified radius.)
autocropall.c: a C plug-in to crop an image paying attention to the contents of all layers, not just the current one (as discussed in Chapter 11 of my GIMP book).
Arrow Designer: an interactive Python script that draws arrows. Surprisingly useful, and hard to do in GIMP any other way.
Selection to Wallpaper makes it easy to adapt one image to wallpaper for one or more different screen sizes: starting with a selection of appropriate aspect ratio, it copies the image, crops, scales and sets the image filename so you can save to the right place.
Blobipy gives a rounded shaded bevel to the current layer or selection. It's a little like Drop Shadow and Bevel, but the effect is somewhat more pronounced -- a good way of rounding text and making it more three-dimensional.
Save layers as patterns This is helpful for importing Photoshop pattern files. There's a GIMP plug-in available to load Photoshop pattern files, but what you get is an image with lots of layers, since Photoshop can store multiple patterns in a single file. My Save layers as patterns script can take this multi-layer file and save each layer to your GIMP pattern directory as a pattern usable by GIMP.
reverse-layers.scm reverses the order of the layers in the current image. Very useful if you're doing animation or stitching panoramas with Pandora. It's included in GIMP 2.4, but here's the script for 2.2 users.
stack.scm turns the layers in the current image into an averaged layer stack, where each layer's opacity is such that it contributes equally to the total.
allmodes.scm takes an image and combines it with a background color in each of the GIMP's layer modes. I used it to generate Figure 9-11 of my book, Beginning GIMP: From Novice to Professional..
paperproto.scm is a script which takes a set of strings and turns them into a set of draggable buttons, usable for "paper prototyping" or just magnetic fridge poetry. Inspired by Sven's blog entry and described in my post to the Gimp-developer list.
colorcircles.scm generates a set of overlapping RGB or CMY circles, with appropriate layer modes, to demonstrate color combinations (used for Figure 8-1 in my book).
fibonacci.scm generates a set of golden-ratio fibonacci boxes and a fibonacci spiral through them. It's a work in progress, neither flexible nor pretty yet.
mysphere.scm (from Chapter 11 of Beginning GIMP) is a slight modification of the normal Sphere script included with GIMP, which lets you draw your sphere on a transparent background for pasting into other images.
autocropall.c from Chapter 11 of Beginning GIMP. In GIMP 2.4 this is no longer needed: just use "Crop to selected" combined with "Sample merged" in the Crop tool options.
mode-dialog.py gives you two
new entries in the Layer menu:
Next mode sets the current
layer to the next mode in the layer modes list (try binding it to a
key or keeping it visible by tearing off the Layer menu), while
Mode dialog... gives you a window with buttons for every mode,
so you can try them in any order. Not that useful except as a demo;
hitting down-arrow in the the Layers dialog is good enough.
Astronomy Software
Moonroot
Moonroot
(Linux, X11) brings up a window showing the moon at its current phase.
It uses the X11 Shape extension, so you can put it on your desktop
background without window borders and it looks like the moon hanging
there on top of whatever background image you use.
Sky is a little planetarium program a la Java applet -- show bright stars and the planets. It has a difficult user interface, and I've trimmed down the star catalog because it took up too much space and took too long to download, so it's not likely to be very usable to anyone as is.
I also have a bunch of Javascript code on
the Hitchhiker's Guide to the Moon to calculate
the moon's phase and libration.
Scripts and small programs
Tweet: Play Bird Songs
How do you find out whether that bird you're hearing is a
Cassin's finch or a Bushtit?
I bought the Stokes
Field Guide to Western Bird Songs,
a 4-volume CD set. I ripped the four CDs to disk (you can't have mine
-- they're copyrighted, and it's an excellent set so I heartily
recommend buying a copy), getting filenames like Barn_Owl.ogg
(of course, you can use mp3 or whatever format you like).
Then wrote a Python script, tweet,
to play them. Pass an argument containing some part of the bird name you
want to match; for instance, "tweet mock" will play the mockingbird,
while "tweet spar" will display a list of sparrows, from which you can
either choose by number, or type another string, e.g. "hou" to play
the house sparrow's song.
For years, it was ridiculously difficult to take a standalone web app (HTML, Javascript and CSS) and run it as a standalone app on Android. WebClient was a little app that lets you collect a bunch of local web files and run them on Android from a home screen icon. Now, in 2017, you can make a Progressive Web App to accomplish that purpose much more easily (though there doesn't seem to be any way to keep a progressive web app entirely offline, so you can use it without paying data charges, which is possible with WebClient).
I didn't like the options on Linux so I wrote a couple of lightweight Twitter clients in Python. Completely unrelated to the "tweet" birdsong script (which was named long before Twitter existed).
A new project: shellerrs, a little bash script shell learners can add to .bashrc to get friendlier errors that give you a better idea what might be wrong. See the article I wrote explaining it in Linux Planet, Friendlier Shell Errors, or the earlier blog post, Friendlier error messages for shell newbies.
I wrote flashcard to help myself learn vocabulary words for a Spanish class. It's a tiny little program but it's pretty useful. For the same Spanish class, since I don't know how to type accented characters, I wrote a little python script called escribo that provides buttons for all the common Spanish special characters and copies that character to the clipboard, so you can paste it anywhere. (But then someone took pity on me and showed me how to do it the right way.)
I have a few modest Arduino programs, including a generic Makefile you can use to build Arduino software from the command-line without needing the IDE.
I had a problem with certain programs leaving tooltips on my display that wouldn't go away. So I wrote a Python-xlib script that can close any currently open tooltip (or similar override-redirect window) in X: killtips.
Long ago, before Linux even existed, Unix had a nifty program called od (Octal Dump) for viewing binary files. You could say, for instance, od -xc and it would dump the file as hexidecimal and characters, and it would line up the two lines so you could follow the file from printable characters to unprintable ones.
Unfortunately, the GNU folk got hold of od and, in their wisdom, changed it so that the bytes no longer line up. So you can follow the hex, or the characters, or the octal, or whatever, but heaven help you if you want to relate two or more of them.
There's a program called xxd (part of vim that does a slightly better job, but it isn't really as nice as I want either. And it's such an easy thing to write. So I did, in Python. bdump. -c, -x and -d indicate character, hex and decimal (does anyone ever want octal any more?) Default is all three.
I wrote a collection of Image Batch Processing
scripts which do things like rotate, resize, make thumbnails, and
collect images together into web pages. These work especially well
when combined with pho.
A javascript framework for HTML presentations, for using a browser, such as Firefox, as a powerpoint replacement for slide presentations.
A Javascript/HTML framework for Ignite talks.
Preso, a lightweight Python-Webkit script to display HTML presentations fullscreen without the overhead of a full browser.
I use PyBlosxom for my blog, and I've written a few PyBlosxom plug-ins and helper scripts to make that easier.
These days I keep my miscellaneous scripts in GitHub: Akkana's scripts. There's a README that I try to keep updated, describing what each script does.
For some older scripts, some of which might not be in github:
eggtimer (Python/TkIntr)
is a little "egg-timer" countdown application. Run eggtimer 15
your cornbread is ready
and 15 minutes later, it will pop
up a huge red window showing your message. Any key, or a mouse
click, will dismiss the window.
I also have a different version, eggtimer-gui, where you can set the time with a slider. Written for my Linux Planet article, GUI Programming in Python For Beginners: Create a Timer in 30 Minutes.
vol (python/gtk) is a fast and simple volume control app, written in PyGTK. The normal gtk volume control program changes its name seemingly monthly (is it gnome-volume-control, gtkmix, gtkmixer, gnome-mixer, or what?), and in any case it's slow to start up and creates a rather large window. All I need is a single slider for master volume, something which starts up quickly enough that I don't miss too much of the beginnings of audio or video clips; but that didn't seem to exist except as panel applets for specific window managers. vol calls the command-line program aumix under the hood (which means that you need the commandline version of aumix and not the program of the same name which actually has a gtk interface -- sigh). Maven I. Raphene has taken this script and extended and improved it in various useful ways: siv.
Or, if you don't even want anything as elaborate as vol, you can use louder (and make a link named "quieter" to the same script), then bind that to keys in your window manager to have volume control from the keyboard.
pyruler (python/gtk) is a quickie pixel ruler for measuring pixel distances on the screen, helpful when developing web pages or GUI apps. By default it's a horizontal ruler, but typing v will make it vertical; h will make it horizontal again. Uses pygtk.
langgrep (python) is a little hack that helps me figure out how to do things in various scripting languages by grepping in only files of a specified language. So if I can't remember how to use "find" to search within a string in python, I can say:
langgrep python -w find ~/bin/*(or /usr/bin/* if I don't have a lot of python programs in my own bin). Trivial but very useful -- I'd wanted something like that for years.
twitref lets you search twitter for a pattern: for instance, @yourname to see any references or replies to you. For instance, you could run it from cron and mail yourself the output.
parsexml is a demo of how to use Python's xml.etree.ElementTree class to parse a large XML file without reading it all into memory. Use this if you need to process a large XML file -- for instance, splitting it contextually. I wrote it in order to extract geographically smaller regions from a huge USGS KML file of geologic data (I'll make that script available when it's finished).
wifi-picker (python/gtk) is a very simple wireless network chooser. It lets you define essid and/or key for your usual networks, or you can type in an essid and/or key if you're somewhere new. Comments at the beginning of the script explain how to set up your known networks. It calls iwconfig eth0, so run it as someone who has permission to do that. (Unfortunately iwconfig seems not to work very well for setting essid on Ubuntu, so I haven't actually used this very much.)
lsconfig (sh) is a shell script which lists services available in this runlevel -- essentially what chkconfig --list does on Redhat systems.
talksplit (sh) is a script in sh which takes a long mp3 file and splits it into a collection of 5-minute segments. Why? Because I like to listen to podcasts, and my mp3 player can remember which file it was playing but not where it was in the file. With talksplit, at least I end up within five minutes of where I left off listening last time. Talksplit tries to do sensible things with id3 tags. It uses splitmp3 to do the actual splitting, and id3tool to handle the id3 tags.
pathmatch (python) searches for patterns in your path. The "which" command can search for complete strings, but you need pathmatch if you've ever wondered, "What volume control programs do I have? It's probably called something-mix or something-volume-something"; just type pathmatch mix volume and see the answer.
boondoc (python) searches for documentation related to a particular program: it looks for man pages, info, READMEs and other /usr/share/doc files, and anything else it thinks might be documentation. Written at request of a friend.
eg (perl) is a little perl script I wrote to simplify figuring things out from man pages. Lots of man pages have hundreds of lines of theory and background, when really all you want is a simple example of how to run the program. So eg looks at man pages and gives you only the EXAMPLES section, if there is one.
maybeshutdown (sh/zenity)
is a trivial little
script to let you shut down the computer from gnome-panel or any other
panel or menu that doesn't offer its own shutdown option.
It's easy enough to call shutdown directly, but since it's easy to
hit a panel button by mistake, the script gives you a confirmation dialog.
Put maybeshutdown somewhere in your path, adjust it for your own
system (shutdown vs. halt vs. poweroff) and remove the sudo if you've
made the shutdown program setuid, then make a new panel launcher which
calls maybeshutdown and has an icon you won't mistake for anything else
(I used the "Warning triangle" icon) and you're all set.
randomline (python) chooses and prints one
random line from whatever it's given as input. You can use it for
all sorts of things, like printing a random quote from a file, but
I use it to set a random wallpaper on my desktop, like this:
xsetbg -fullscreen -border black `find $HOME/Backgrounds | randomline`
dotback backs up my important
configuration files ("dotfiles") to a tar file, without getting lost
in backing up voluminous crap like the Firefox cache. You do have to
spend some time making a list of what files and directories you care
about.
Miscellaneous Fiddling
Neighbor
The April 2002 Atlantic had an interesting article called
Seeing
Around Corners describing population dynamics in terms of
cellular automaton rules, trying to explain why neighborhoods tend to
become segregated by race or other factors. It was a fascinating article,
but I questioned it, and decided to whip up my own simulation.
My results did not match those of the authors; in fact, I found
much less tendency toward segregation than they did. My simple
CA simulation (written in C, displaying in Xlib) is here:
neighbor.tar.gz.
It's written as a framework that makes it easy to write new apps for other 2-dimensional CA rules, and as an example it includes a bare-bones implementation of Conway's Game of Life.
Run animatch on a list of files, from a terminal window (you'll need to save the output later). You need to choose two control points in the image which will be fixed from shot to shot. As animatch shows you each image, click on the left control point, then the right one. When you've chosen the right control point on the last image, animatch will spit out a long list of Image Magick commands for rotating and translating each image. Save these commands to a file, edit as necessary, back up all your images!, then run the script.
Animatch is very rough. It's a one-off I wrote in a day, and it lacks
documentation and polish. It would be better done as a GIMP tool.
Use at your own risk, but by all means let me know if you're using
it and hit bugs or have a feature you'd really like.
animatch.tgz.
Simple
Bookmarklets: The Power of the Command Line in your Browser
For a description of how to use my
Count
Words bookmarklet, see the Linux Planet tip
Quick
Firefox Tip: Word Count Bookmarklet.
See also "Kitfox", in the next (Patches) section.
I didn't write xbrightness, but I found it very useful for adjusting
brightness on a monitor that doesn't have hardware brightness controls.
Particularly with some updates Mikael Magnusson made, then some other
changes I added later. They're all described in this blog posting:
Software
brightness control in X11.
I never heard back from the xbrightness
author, so I'm making it available here:
xbrightness-mika-akk.
By the way, if you grabbed an earlier version back when I first
posted the blog entry, now it clips at the top and bottom of the
range rather than wrapping around. I haven't updated the version.
XChat drives me crazy: it has a key binding dialog, but a lot of its
key bindings aren't settable through the dialog, and are compiled in
and can't be un-done. In particular, for people who like to use
Emacs/Readline bindings to edit text, you can't, even though xchat
sees your gtk key theme, because Ctrl-F is hardwired in the C code
to pop up a Find window whether you want one or not. There are several
other hardwired key bindings I change, like the Ctrl-I I keep
hitting accidentally that detaches the current tab, and then I have
to reattach it and go hunting for the magic keybinding to move the
tab back to its normal position.
Anyway, I've been building my own
xchat for years, and here's the current patch I apply to it:
xchat-2.8.6.diff.
I wanted to try exmap
for showing memory use on my system, but it totally failed to build,
and the patch in Ubuntu bug 284863
wasn't enough. I had to fix quite a few other things, and also
install libpcre3-dev/libpcrecpp0 and libgtkmm-2.4-dev/libgtkmm-2.4-1c2a.
Here's my patch:
Exmap 0.10 patch for Ubuntu Jaunty
and kernel 2.6.30.4.
Bookmarklets and other browser stuff
See my two Linux Planet articles:
and
Roll
Your Own Custom Bookmarklets In Firefox, part 2: Javascript
Bookmarklets.
Patches to Other Software
xbrightness
KitFox
A collection of assorted patches I make to Mozilla
Firefox locally to make it work more like the old, lamented
Mozilla Suite. The patches are against a full firefox development
tree, but might be useful to binary users who want to change
specific javascript or menu files.
XChat: don't hard-wire key bindings
exmap: make it build
Programming topics on my blog |
Shallow Sky Home