Shallow Thoughts : tags : hack
Akkana's Musings on Open Source Computing and Technology, Science, and Nature.
Fri, 17 Aug 2018
Over the years I've picked up a couple of cellphone stands as
conference giveaways. A stand is a nice idea, especially if you
like to read news articles during mealtime, but the stands I've
tried never seem to be quite what I want. Either they're not
adjustable, or they're too bulky or heavy to want to carry them
around all the time.
A while back, I was browsing on ebay looking for something better
than the ones I have. I saw a few that looked like they might be
worth trying, but then it occurred to me: I could make one pretty
easily that would work better than anything I'd found for sale.
I started with plans that involved wire and a hinge -- the hinge so
the two sides of the stand would fold together to fit in a purse or
pocket -- and spent a few hours trying different hinge options.I
wasn't satisfied, though. And then I realized: all I had to do was
bend the wire into the shape I needed. Voilà -- instant
lightweight adjustable cellphone stand.
And it has worked great. I've been using it for months and it's much
better than any of the prefab stands I had before.
Bend a piece of wire
I don't know where this wire came from: it was in my spare-metal-parts
collection. You want something a little thinner than coathanger wire,
so you can bend it relatively easily; "baling wire" or "rebar wire"
is probably about right.
Bend the tips around
Adjust the curve so it's big enough that your cellphone will fit in
the crook of the wires.
Bend the back end down, and spread the two halves apart
Adjust so it fits your phone
Coat the finished stand with rubberized coating (available at
your local hardware store in either dip or spray-on varieties)
so it won't slide around on tables and won't scratch anything.
The finished product is adjustable to any angle you need -- so you
can adjust it based on the lighting in any room -- and you can fold
the two halves together to make it easy to carry.
Tags: hardware, hack
[
12:06 Aug 17, 2018
More hardware |
permalink to this entry |
]
Fri, 28 Dec 2012
My local mechanic (Ministry of Transport Foreign Auto Repair and Art Gallery
in San Jose) often has a motorcycle parked out front. But I'd never
noticed the attachment points behind the seat. Until one day, when
they were being used.
A bike rack! On a motorcycle! How cool is that?
Tags: motorcycle, hack, maker
[
21:37 Dec 28, 2012
More hardware |
permalink to this entry |
]
Wed, 11 Nov 2009
I almost always write my
presentation
slides using HTML. Usually I use Firefox to present them; it's
the browser I normally run, so I know it's installd and the slides
all work there. But there are several disadvantages to using Firefox:
- In fullscreen mode, it has a small "minimized urlbar" at the
top of the screen that I've never figured out to banish -- not only
is it visible to users, but it also messes up the geometry of
the slides (they have to be 762 pixels high rather than 768);
- It's very heavyweight, bad when using a mini laptop or netbook;
- Any personal browsing preferences, like no-animation,
flashblock or noscript, apply to slides too unless explicitly
disabled, which I've forgotten to do more than once before a talk.
Last year, when I was researching lightweight browsers, one of the
ones that impressed me most was something I didn't expect: the demo
app that comes with
pywebkitgtk
(package python-webkit on Ubuntu).
In just a few lines of Python, you can create your own browser with
any UI you like, with a fully functional content area.
Their current demo even has tabs.
So why not use pywebkitgtk to create a simple fullscreen
webkit-based presentation tool?
It was even simpler than I expected. Here's the code:
#!/usr/bin/env python
# python-gtk-webkit presentation program.
# Copyright (C) 2009 by Akkana Peck.
# Share and enjoy under the GPL v2 or later.
import sys
import gobject
import gtk
import webkit
class WebBrowser(gtk.Window):
def __init__(self, url):
gtk.Window.__init__(self)
self.fullscreen()
self._browser= webkit.WebView()
self.add(self._browser)
self.connect('destroy', gtk.main_quit)
self._browser.open(url)
self.show_all()
if __name__ == "__main__":
if len(sys.argv) <= 1 :
print "Usage:", sys.argv[0], "url"
sys.exit(0)
gobject.threads_init()
webbrowser = WebBrowser(sys.argv[1])
gtk.main()
That's all! No navigation needed, since the slides include javascript
navigation to skip to the next slide, previous, beginning and end.
It does need some way to quit (for now I kill it with ctrl-C)
but that should be easy to add.
Webkit and image buffering
It works great. The only problem is that webkit's image loading turns out
to be fairly poor compared to Firefox's. In a presentation where most
slides are full-page images, webkit clears the browser screen to
white, then loads the image, creating a noticable flash each time.
Having the images in cache, by stepping through the slide show then
starting from the beginning again, doesn't help much (these are local
images on disk anyway, not loaded from the net). Firefox loads the
same images with no flash and no perceptible delay.
I'm not sure if there's a solution. I asked some webkit developers and
the only suggestion I got was to rewrite the javascript in the slides
to do image preloading. I'd rather not do that -- it would complicate
the slide code quite a bit solely for a problem that exists only in
one library.
There might be some clever way to hack double-buffering in the app code.
Perhaps something like catching the 'load-started' signal,
switching to another gtk widget that's a static copy of the current
page (if there's a way to do that), then switching back on 'load-finished'.
But that will be a separate article if I figure it out. Ideas welcome!
Update, years later: I've used this for quite a few real presentations now.
Of course, I keep tweaking it: see
my scripts page
for the latest version.
Tags: programming, hack, python, web, speaking
[
17:12 Nov 11, 2009
More programming |
permalink to this entry |
]
Thu, 05 Feb 2009
Making desktop backgrounds in GIMP is a bit tedious if you have
several machines with screens of different sizes. The workflow goes
something like this:
First, choose Crop tool and turn on Fixed: Aspect Ratio.
Then loop over images:
- Load an image
- Go to Tool Options
- Type in the aspect ratio: 4:3, 8:5, 5:4, 1366:768 etc.
- Go to the image and crop.
- Image->Scale (I have this on Shift-S, can't remember whether
that was a default binding or not).
- Ctrl-K to delete the current width (Ctrl-U also works, but beeps;
I'm not sure why)
- Type in the desired width (1024 or 1680 or 1366 or whatever)
(I always hit Tab here, though it's probably not necessary)
- Click Scale or type Alt-S (unfortunately, Return doesn't work
in this dialog).
- Save As to the appropriate name and path for the current resolution
- Undo (the Scale), Undo (the Crop)
- Load a new image (continue loop)
But you can use Save Options (Tool Presets) to avoid step 3,
typing in the aspect ratio.
Here's how:
- Set up the aspect ratio you want in the Crop tool, with Fixed checked
- Click on Save Options (the floppy disk icon in the lower left of
Tool Options)
- Choose a name (choose New Entry first if you've already saved options).
Repeat, for each aspect ratio you might want to use.
Now clicking on Restore Options gives you a menu of all your commonly
used aspect ratios -- much faster than typing them in every time.
Too bad there's no way to use this shortcut for the Scale step,
or to do Crop and Scale in one operation.
Nice shortcut! But having done that, I realized I could shorten it
even more: I could make a selection (not a crop) with one of my preset
aspect ratios, then run a script that would figure out from the aspect
ratio which absolute size I wanted, crop and scale, and either save
it to the right place, or make a new image so I could save without
needing to Redo or Save a Copy. That was an easy script to write,
so here it is:
wallpaper.py.
Tags: gimp, tips, programming, hack
[
23:45 Feb 05, 2009
More gimp |
permalink to this entry |
]
Sun, 14 Dec 2008
Dave has been fighting for I don't know how many weeks trying to get
a buildable set of gtk libraries installed on his Mac.
He doesn't need them to build GIMP -- the
GIMP on OS X
project (split off from Wilber Loves Apple) provides binaries
complete with all the libraries needed. Alas, it's just a binary
package with no development headers, so if you want to build any other
gtk packages, like pho,
or maybe some GIMP plug-ins, you're in for a much longer adventure.
Mac Ports used to make that easy,
but the Ports version of gtk2 doesn't build on OS X "Tiger".
It's a long story and I don't (want to) know all the hairy details,
but this weekend he finally gave up on it and began downloading all
the gtk2 packages and dependencies (cairo, pango, bonobo, atk etc.)
from their various project sites.
Oddly enough, building them went much more smoothly than Ports
had, and after a little twiddling of --disable flags in configure
and a lot of waiting, he had most of the libraries built.
Even gtk2 itself! Except ... gtk2's make install
failed.
Seems that although gtk is configured to disable building docs by
default (configure --help
shows a --enable-gtk-doc option),
nevertheless make install
calls something
called gtkdoc-rebase
from a lot of the subdirectories.
And gtkdoc-rebase doesn't exist, since it wasn't ever built. So
the whole make install
process fails at that point --
after installing the libraries but before telling pkg-config that
gtk-2.0 is indeed present.
After twiddling configure dependencies all day, Dave was getting
frustrated. "How do I configure it to really disable docs,
so it won't try to run this gtkdoc-rebase thing I don't have?"
I was in the middle of a timed quiz for a class I'm taking.
"I have no idea. You'd think they'd check for that. Um ...
all you need is for gtkdoc-rebase to return success, right?
What if you make a script somewhere in your path that contains
nothing but a shebang line, #! /bin/sh
?
It's a horrible hack, but ..."
"Horrible hacks R us!" he exclaimed, and created the script.
10 minutes later, he had gtk-2.0 installed, pkg-config notified
and pho built.
Sometimes horrible hacks are the best.
The gtk2 package list
Incidentally, for anyone trying to accomplish the same thing,
the packages he needed to download were:
pgk-config gettext glib pango atk jpeg jasper libpng tiff
pixman freetype libxml fontconfig cairo gtk2
and he had to configure gtk2 with --disable-cups
(because it introduced other errors, not because of CUPS itself).
The trickiest dependency was atk, because it wasn't in the place that
gtk.org points to and it wasn't on its own project site either;
he eventually found it by poking around on the
gnome ftp
site.
Tags: hack, gtk, OS X
[
21:44 Dec 14, 2008
More programming |
permalink to this entry |
]