Shallow Thoughts : : Aug
Akkana's Musings on Open Source Computing and Technology, Science, and Nature.
Thu, 28 Aug 2014
For the last several months, I repeatedly find myself in a mode where
my terminal isn't working quite right. In particular, Ctrl-C doesn't
work to interrupt a running program. It's always in a terminal where
I've been doing web work. The site I'm working on sadly has only ftp
access, so I've been using ncftp to upload files to the site, and git
and meld to do local version control on the copy of the site I keep on
my local machine. I was pretty sure the problem was coming from either
git, meld, or ncftp, but I couldn't reproduce it.
Running reset
fixed the problem. But since I didn't know
what program was causing the problem, I didn't know when I needed to
type reset
.
The first step was to find out which of the three programs was at fault.
Most of the time when this happened, I wouldn't notice until hours
later, the next time I needed to stop a program with Ctrl-C.
I speculated that there was probably some way to make zsh run a check
after every command ... if I could just figure out what to check.
Terminal modes and stty -a
It seemed like my terminal was getting put into raw mode.
In programming lingo, a terminal is in raw mode when characters
from it are processed one at a time, and special characters like
Ctrl-C, which would normally interrupt whatever program is running,
are just passed like any other character.
You can list your terminal modes with stty -a:
$ stty -a
speed 38400 baud; rows 32; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = ;
eol2 = ; swtch = ; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
ignbrk -brkint ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl -ixon -ixoff
-iuclc -ixany -imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig icanon -iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke
But that's a lot of information. Unfortunately there's no single flag
for raw mode; it's a collection of a lot of flags.
I checked the interrupt character:
yep, intr = ^C
, just like it should be. So what was
the problem?
I saved the output with stty -a >/tmp/stty.bad
, then
I started up a new xterm and made a copy of what it should
look like with stty -a >/tmp/stty.good
. Then I looked
for differences: meld /tmp/stty.good /tmp/stty.bad
.
I saw these flags differing in the bad one: ignbrk ignpar -iexten -ixon,
while the good one had -ignbrk -ignpar iexten ixon. So I should be
able to run:
$ stty -ignbrk -ignpar iexten ixon
and that would fix the problem. But it didn't. Ctrl-C still didn't work.
Setting a trap, with precmd
However, knowing some things that differed did give me something to
test for in the shell, so I could test after every command and find
out exactly when this happened. In zsh, you do that by defining a
precmd function, so here's what I did:
precmd()
{
stty -a | fgrep -- -ignbrk > /dev/null
if [ $? -ne 0 ]; then
echo
echo "STTY SETTINGS HAVE CHANGED \!\!\!\!\!\!\!\!\!\!\!\!\!\!\!\!"
echo
fi
}
Pardon all the exclams. I wanted to make sure I saw the notice when it happened.
And this fairly quickly found the problem: it happened when I suspended
ncftp with Ctrl-Z.
stty sane and isig
Okay, now I knew the culprit, and that if I switched to a different ftp
client the problem would probably go away. But I still wanted to know
why my stty command didn't work, and what the actual terminal
difference was.
Somewhere in my web searching I'd stumbled upon some pages suggesting
stty sane
as an alternative to reset
.
I tried it, and it worked.
According to man stty
, stty sane is equivalent to
$ stty cread -ignbrk brkint -inlcr -igncr icrnl -iutf8 -ixoff -iuclc -ixany imaxbel opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
Eek! But actually that's helpful. All I had to do was get a bad
terminal (easy now that I knew ncftp was the culprit), then try:
$ stty cread
$ stty -ignbrk
$ stty brkint
... and so on, trying Ctrl-C each time to see if things were back to normal.
Or I could speed up the process by grouping them:
$ stty cread -ignbrk brkint
$ stty -inlcr -igncr icrnl -iutf8 -ixoff
... and so forth. Which is what I did. And that quickly narrowed it
down to
isig. I ran reset, then ncftp again to get the terminal
in "bad" mode, and tried:
$ stty isig
and sure enough, that was the difference.
I'm still not sure why meld didn't show me the isig difference.
But if nothing else, I learned a bit about debugging stty settings,
and about stty sane
, which is a much nicer way of
resetting the terminal than reset
since it doesn't
clear the screen.
Tags: linux, cmdline, debugging
[
15:41 Aug 28, 2014
More linux |
permalink to this entry |
]
Sun, 24 Aug 2014
I love this Adopt-a-Highway sign on Highway 4 on the way back down from
the Jemez.
I have no idea who it is (I hope to find out, some day), but it gives
me a laugh every time I see it.
Tags: humor, sign
[
10:50 Aug 24, 2014
More humor |
permalink to this entry |
]
Wed, 20 Aug 2014
We caught another mouse! I shot a movie of its release.
Like the previous mouse we'd caught, it was nervous about coming out
of the trap: it poked its nose out, but didn't want to come the rest
of the way.
Dave finally got impatient, picked up the trap and turned it opening down,
so the mouse would slide out.
It turned out to be the world's scruffiest mouse, which immediately
darted toward me. I had to step back and stand up to follow it on camera.
(Yes, I know my camera technique needs work. Sorry.)
Then it headed up the hill a ways before finally lapsing into the
high-bounding behavior we've seen from other mice and rats we've released.
I know it's hard to tell in the last picture -- the photo is so small --
but look at the distance between the mouse and its shadow on the ground.
Very entertaining! I don't understand why anyone uses killing traps --
even if you aren't bothered by killing things unnecessarily, the
entertainment we get from watching the releases is worth any slight
extra hassle of using the live traps.
Here's the movie:
Mouse released
from trap.
Tags: nature, mouse, trap
[
17:10 Aug 20, 2014
More nature |
permalink to this entry |
]
Fri, 15 Aug 2014
A few weeks ago I wrote about building a simple
Arduino-driven
camera intervalometer to take repeat photos with my DSLR.
I'd been entertained by watching the clouds build and gather and dissipate
again while I stepped through all the false positives in my
crittercam,
and I wanted to try capturing them intentionally so I could make cloud
movies.
Of course, you don't have to build an Arduino device.
A search for timer remote control
or intervalometer
will find lots of good options around $20-30. I bought one
so I'll have a nice LCD interface rather than having to program an
Arduino every time I want to make movies.
Setting the image size
Okay, so you've set up your camera on a tripod with the intervalometer
hooked to it. (Depending on how long your movie is, you may also want
an external power supply for your camera.)
Now think about what size images you want.
If you're targeting YouTube, you probably want to use one of
YouTube's
preferred settings, bitrates and resolutions, perhaps 1280x720 or
1920x1080. But you may have some other reason to shoot at higher resolution:
perhaps you want to use some of the still images as well as making video.
For my first test, I shot at the full resolution of the camera.
So I had a directory full of big ten-megapixel photos with
filenames ranging from img_6624.jpg to img_6715.jpg.
I copied these into a new directory, so I didn't overwrite the originals.
You can use ImageMagick's mogrify to scale them all:
mogrify -scale 1280x720 *.jpg
I had an additional issue, though: rain was threatening and I didn't
want to leave my camera at risk of getting wet while I went dinner shopping,
so I moved the camera back under the patio roof. But with my fisheye lens,
that meant I had a lot of extra house showing and I wanted to crop
that off. I used GIMP on one image to determine the x, y, width and height
for the crop rectangle I wanted.
You can even crop to a different aspect ratio from your target,
and then fill the extra space with black:
mogrify img_6624.jpg -crop 2720x1450+135+315 -scale 1280 -gravity center -background black -extent 1280x720 *.jpg
If you decide to rescale your images to an unusual size, make sure
both dimensions are even, otherwise avconv will complain that
they're not divisible by two.
Finally: Making your movie
I found lots of pages explaining how to stitch
together time-lapse movies using mencoder, and a few
using ffmpeg. Unfortunately, in Debian, both are deprecated.
Mplayer has been removed entirely.
The ffmpeg-vs-avconv issue is apparently a big political war, and
I have no position on the matter, except that Debian has come down
strongly on the side of avconv and I get tired of getting nagged at
every time I run a program. So I needed to figure out how to use avconv.
I found some pages on avconv, but most of them didn't actually work.
Here's what worked for me:
avconv -f image2 -r 15 -start_number 6624 -i 'img_%04d.jpg' -vcodec libx264 time-lapse.mp4
Update: I don't know where that -f image2 came from -- ignore it.
And avconv can take an input and an output frame rate; they're
both specified with -r, and the only way input and output are
distinguished is their position in the command line. So a more
appropriate command might be something like this:
avconv -r 15 -start_number 6624 -i 'img_%04d.jpg' -vcodec libx264 -r 30 time-lapse.mp4
using 30 as a good output frame rate for people viewing on 60fps monitors.
Adjust the input frame rate, the -r 15, as needed to control the speed
of your time-lapse video.
Adjust the start_number and filename appropriately for the files you have.
Avconv produces an mp4 file suitable for uploading to youtube.
So here is my little test movie:
Time Lapse Clouds.
Tags: photography, time-lapse
[
12:05 Aug 15, 2014
More photo |
permalink to this entry |
]
Sat, 09 Aug 2014
We're having a huge bloom of a lovely flower called pale trumpets
(Ipomopsis longiflora), and it turns out that sphinx moths
just love them.
The white-lined sphinx moth (Hyles lineata) is a moth the size
of a hummingbird, and it behaves like a hummingbird, too. It flies
during the day, hovering from flower to flower to suck nectar,
being far too heavy to land on flowers like butterflies do.
I've seen them before, on hikes, but only gotten blurry shots with
my pocket camera. But with the pale trumpets blooming, the sphinx
moths come right at sunset and feed until near dark. That gives a
good excuse to play with the DSLR, telephoto lens and flash ...
and I still haven't gotten a really sharp photo, but I'm making
progress.
Check out that huge eye! I guess you need good vision in order to make
your living poking a long wiggly proboscis into long skinny flowers
while laboriously hovering in midair.
Photos here:
White-lined
sphinx moths on pale trumpets.
Tags: nature, moth, photography
[
21:23 Aug 09, 2014
More nature |
permalink to this entry |
]
Tue, 05 Aug 2014
I got an envelope from my bank in the mail. The envelope was open
and looked like the flap had never been sealed.
Inside was a copy of their privacy policy. Nothing else.
The policy didn't say whether their privacy policy included sealing the
envelope when they send me things.
Tags: privacy, security, humor
[
13:22 Aug 05, 2014
More humor |
permalink to this entry |
]