Shallow Thoughts : : Aug
Akkana's Musings on Open Source Computing and Technology, Science, and Nature.
Sun, 27 Aug 2017
My first total eclipse! The suspense had been building for years.
Dave and I were in Wyoming. We'd made a hotel reservation nine months
ago, by which time we were already too late to book a room in the zone
of totality and settled for Laramie, a few hours' drive from the centerline.
For visual observing, I had my little portable 80mm refractor. But
photography was more complicated. I'd promised myself that for my
first (and possibly only) total eclipse, I wasn't going to miss the
experience because I was spending too much time fiddling with cameras.
But I couldn't talk myself into not trying any photography at all.
Initially, my plan was to use my
90mm Mak
as a 500mm camera lens. It had worked okay for the
the 2012 Venus transit.
I spent several weeks before the eclipse in a flurry of creation,
making a couple of
solar finders,
a barn-door
mount, and then wrestling with motorizing the barn-door (which was
a failure because I couldn't find a place to buy decent gears for the motor.
I'm still working on that and will eventually write it up).
I wrote up a plan: what equipment I would use when, a series of
progressive exposures for totality, and so forth.
And then, a couple of days before we were due to leave, I figured I
should test my rig -- and discovered that it was basically impossible
to focus on the sun. For the Venus transit, the sun wasn't that high
in the sky, so I focused through the viewfinder. But for the total
eclipse, the sun would be almost overhead, and the viewfinder nearly
impossible to see. So I had planned to point the Mak at a distant
hillside, focus it, then slip the filter on and point it up to the sun.
It turned out the focal point was completely different through the filter.
With only a couple of days left to go, I revised my plan.
The Mak is difficult to focus under any circumstances. I decided
not to use it, and to stick to my Canon 55-250mm zoom telephoto,
with the camera on a normal tripod. I'd skip the partial eclipse
(I've photographed those before anyway) and concentrate on
getting a few shots of the diamond ring and the corona, running
through a range of exposures without needing to look at the camera
screen or do any refocusing. And since I wasn't going to be usinga
telescope, my nifty solar finders wouldn't work; I designed a new
one out of popsicle sticks to fit in the camera's hot shoe.
Getting there
We stayed with relatives in Colorado Saturday night, then drove to
Laramie Sunday. I'd heard horror stories of hotels canceling people's
longstanding eclipse reservations, but fortunately our hotel honored
our reservation. WHEW! Monday morning, we left the hotel at 6am in
case we hit terrible traffic. There was already plenty of traffic on
the highway north to Casper, but we turned east hoping for fewer crowds.
A roadsign sign said "NO PARKING ON HIGHWAY." They'd better not try
to enforce that in the totality zone!
When we got to I-25 it was moving and, oddly enough, not particularly
crowded. Glendo Reservoir had looked on the map like a nice spot on
the centerline ... but it was also a state park, so there was a risk
that everyone else would want to go there. Sure enough: although
traffic was moving on I-25 at Wheatland, a few miles north the freeway
came to a screeching halt. We backtracked and headed east toward Guernsey,
where several highways went north toward the centerline.
East of Glendo, there were crowds at every highway pullout and rest
stop. As we turned onto 270 and started north, I kept an eye on
OsmAnd on my phone, where I'd loaded
a GPX file of the eclipse path. When we were within a mile of the
centerline, we stopped at a likely looking pullout. It was maybe 9 am.
A cool wind was blowing -- very pleasant since we were expecting a hot
day -- and we got acquainted with our fellow eclipse watchers as we
waited for first contact.
Our pullout was also the beginning of a driveway to a farmhouse we could
see in the distance. Periodically people pulled up, looking lost,
checked maps or GPS, then headed down the road to the farm. Apparently
the owners had advertised it as an eclipse spot -- pay $35, and you
can see the eclipse and have access to a restroom too! But apparently
the old farmhouse's plumbing failed early on, and some of the people
who'd paid came out to the road to watch with us since we had better
equipment set up.
There's not much to say about the partial eclipse. We all traded views
-- there were five or six scopes at our pullout, including a nice
little H-alpha scope. I snapped an occasional photo through the 80mm
with my pocket camera held to the eyepiece, or with the DSLR through
an eyepiece projection adapter. Oddly, the DSLR photos came out worse
than the pocket cam ones. I guess I should try and debug that at some point.
Shortly before totality, I set up the DSLR on the tripod, focused on a
distant hillside and taped the focus with duct tape, plugged in the
shutter remote, checked the settings in Manual mode, then set the
camera to Program mode and AEB (auto exposure bracketing). I put the
lens cap back on and pointed the camera toward the sun using the
popsicle-stick solar finder. I also set a countdown timer, so I could
press START when totality began and it would beep to warn me when it was
time to the sun to come back out. It was getting chilly by then, with
the sun down to a sliver, and we put on sweaters.
The pair of eclipse veterans at our pullout had told everybody to
watch for the moon's shadow racing toward us across the hills from the
west. But I didn't see the racing shadow, nor any shadow bands.
And then Venus and Mercury appeared and the sun went away.
Totality
One thing the photos don't prepare you for is the color of the sky. I
expected it would look like twilight, maybe a little darker; but it
was an eerie, beautiful medium slate blue. With that unworldly
solar corona in the middle of it, and Venus gleaming as bright as
you've ever seen it, and Mercury shining bright on the other side.
There weren't many stars.
We didn't see birds doing anything unusual; as far as I can tell,
there are no birds in this part of Wyoming. But the cows did all
get in a line and start walking somewhere. Or so Dave tells me.
I wasn't looking at the cows.
Amazingly, I remembered to start my timer and to pull off the DSLR's
lens cap as I pushed the shutter button for the diamond-ring shots
without taking my eyes off the spectacle high above. I turned the
camera off and back on (to cancel AEB), switched to M mode, and
snapped a photo while I scuttled over to the telescope, pulled the
filter off and took a look at the corona in the wide-field eyepiece.
So beautiful! Binoculars, telescope, naked eye -- I don't know which
view was best.
I went through my exposure sequence on the camera, turning the dial a
couple of clicks each time without looking at the settings, keeping my
eyes on the sky or the telescope eyepiece. But at some point I happened
to glance at the viewfinder -- and discovered that the sun was drifting
out of the frame. Adjusting the tripod to get it back in the frame
took longer than I wanted, but I got it there and got my eyes
back on the sun as I snapped another photo ...
and my timer beeped.
I must have set it wrong! It couldn't possibly have been two
and a half minutes. It had been 30, 45 seconds tops.
But I nudged the telescope away from the sun, and looked back up -- to
another diamond ring. Totality really was ending and it was time to
stop looking.
Getting Out
The trip back to Golden, where we were staying with a relative, was
hellish. We packed up immediately after totality -- we figured we'd
seen partials before, and maybe everybody else would stay. No such luck.
By the time we got all the equipment packed there was already a steady
stream of cars heading south on 270.
A few miles north of Guernsey the traffic came to a stop. This was to
be the theme of the afternoon. Every small town in Wyoming has a stop sign
or signal, and that caused backups for miles in both directions.
We headed east, away from Denver, to take rural roads down through
eastern Wyoming and Colorado rather than I-25, but even so,
we hit small-town stop sign backups every five or ten miles.
We'd brought the Rav4 partly for this reason. I kept my eyes glued on
OsmAnd and we took dirt roads when we could, skirting the paved
highways -- but mostly there weren't any dirt roads going where we
needed to go. It took about 7 hours to get back to Golden, about twice
as long as it should have taken. And we should probably count
ourselves lucky -- I've heard from other people who took 11 hours to
get to Denver via other routes.
Lessons Learned
Dave is fond of the quote,
"No battle plan survives contact with the enemy"
(which turns out to be from Prussian military strategist
Helmuth
von Moltke the Elder).
The enemy, in this case, isn't the eclipse; it's time.
Two and a half minutes sounds like a lot, but it goes by like nothing.
Even in my drastically scaled-down plan, I had intended exposures from
1/2000 to 2 seconds (at f/5.6 and ISO 400). In practice, I only made
it to 1/320 because of fiddling with the tripod.
And that's okay. I'm thrilled with the photos I got, and definitely
wouldn't have traded any eyeball time for more photos. I'm more annoyed
that the tripod fiddling time made me miss a little bit of extra looking.
My script actually worked out better than I expected, and I was very
glad I'd done the preparation I had. The script was reasonable, the
solar finders worked really well, and the lens was even in focus
for the totality shots.
Then there's the eclipse itself.
I've read so many articles about solar eclipses as a mystical,
religious experience. It wasn't, for me. It was just an eerily
beautiful, other-worldly spectacle: that ring of cold fire staring
down from the slate blue sky, bright planets but no stars, everything
strange, like nothing I'd ever seen. Photos don't get across what it's
like to be standing there under that weird thing in the sky.
I'm not going to drop everything to become a globe-trotting eclipse
chaser ... but I sure hope I get to see another one some day.
Photos: 2017
August 21 Total Solar Eclipse in Wyoming.
Tags: eclipse, astronomy, photography
[
20:41 Aug 27, 2017
More science/astro |
permalink to this entry |
]
Mon, 14 Aug 2017
While I was testing various attempts at motorizing my barn-door mount,
trying to get it to track the sun, I had to repeatedly find the sun
in my telescope.
In the past, I've generally used the shadow of the telescope combined
with the shadow of the finderscope. That works, more or less, but it's
not ideal: it doesn't work as well with just a telescope with no finder,
which includes both of the scopes I'm planning to take to the eclipse;
and it requires fairly level ground under the telescope: it doesn't
work if there are bushes or benches in the way of the shadow.
For the eclipse, I don't want to waste any time finding the sun:
I want everything as efficient as possible. I decided to make a little
solar finderscope. One complication, though: since I don't do solar
observing very often, I didn't want to use tape, glue or, worse, drill
holes to mount it.
So I wanted something that could be pressed against the telescope and
held there with straps or rubber bands, coming off again without
leaving a mark. A length of an angled metal from my scrap pile
seemed like a good size to be able to align itself against a small
telescope tube.
Then I needed front and rear sights. For the front sight, I wanted a
little circle that could project a bulls-eye shadow onto a paper card
attached to the rear sight. I looked at the hardware store for small
eye-bolts, but no dice. Apparently they don't come that small.I
settled for the second-smallest size of screw eye.
The screw eye, alas, is meant to screw into wood, not metal. So I
cut a short strip of wood a reasonable size to nestle into the inside
of the angle-iron. (That ripsaw Dave bought last year sure does come
in handy sometimes.) I drilled some appropriately sized holes and
fastened screw eyes on both ends, adding a couple of rubber grommets
as spacers because the screw eyes were a little too long and I didn't
want the pointy ends of the screws getting near my telescope tube.
I added some masking tape on the sides of the angle iron so it wouldn't
rub off the paint on the telescope tube, then bolted a piece of
cardboard cut from an old business card to the rear screw eye.
Voila! A rubber-band-attached solar sight that took about an hour to make.
Notice how the shadow of the front sight exactly fits around the rear
sight: you line up the shadow with the rear sight to point the scope.
It seems to work pretty well, and it should be adaptable to any
telescope I use.
I used a wing nut to attach the rear cardboard: that makes it easy to
replace it or remove it. With the cardboard removed,
the sight might even work for night-time astronomy viewing. That is,
it does work, as long as there's enough ambient light to see the rings.
Hmm... maybe I should paint the rings with glow-in-the-dark paint.
Update: I have an even simpler design that works perfectly on a camera
with a hot shoe, and almost as well on a telescope, pictured here:
Camera solar finder made from popsicle sticks.
Tags: astronomy, eclipse
[
15:25 Aug 14, 2017
More science/astro |
permalink to this entry |
]
Thu, 10 Aug 2017
I've been meaning forever to try making a "barn door" tracking mount.
Used mainly for long-exposure wide-field astrophotography, the barn door
mount, invented in 1975, is basically two pieces of wood with a hinge.
The bottom board mounts on a tripod and is pointed toward the North Star;
"opening" the hinge causes the top board to follow the motion of the
sky, like an equatorial telescope mount. A threaded rod and a nut
control the angle of the "door", and you turn the nut manually every
so often. Of course, you can also drive it with a motor.
We're off to view the eclipse in a couple of weeks.
Since it's my first total eclipse, my plan is to de-emphasize
photography: especially during totality, I want to experience the
eclipse, not miss it because my eyes are glued to cameras and timers
and other equipment. But I still want to take photos every so often.
Constantly adjusting a tripod to keep the sun in frame is another
hassle that might keep my attention away from the eclipse. But real
equatorial mounts are heavy and a time consuming to set up;
since I don't know how crowded the area will be, I wasn't
planning to take one. Maybe a barn door would solve that problem.
Perhaps more useful, it would mean that my sun photos would all be
rotated approximately the right amount, in case I wanted to make an
animation. I've taken photos of lunar and partial solar eclipses, but
stringing them together into an animation turned out to be too much
hassle because of the need to rotate and position each image.
I've known about barn-door mounts since I was a kid, and I knew the
basic theory, but I'd never paid much attention to the details. When I
searched the web, it sounded complicated -- it turned out there are
many types that require completely different construction techniques.
The best place to start (I found out after wasting a lot of time on
other sites) is the
Wikipedia
article on "Barn door tracker", which gives a wonderfully clear
overview, with photos, of the various types. I had originally been
planning a simple tangent or isosceles type; but when I read
construction articles, it seemed that those seemingly simple types
might not be so simple to build: the angle between the threaded rod
and the boards is always changing, so you need some kind of a pivot.
Designing the pivot looked tricky. Meanwhile, the pages I found on
curved-rod mounts all insisted that bending the rod was easy, no
trouble at all. I decided to try a curved-rod mount first.
The canonical reference is a 2015 article by Gary Seronik:
A
Tracking Platform for Astrophotography. But I found three other good
construction guides:
Optical Ed's
"Making a Curve Bolt Barn Door",
a
Cloudy Nights discussion thread "Motorized Barn Door Mount Kit",
and
Massapoag
Pond Photography's "Barn Door Tracker".
I'm not going to reprise all their construction details, so refer to
those sites if you try making your own mount.
The crucial parts are a "piano hinge", a long hinge that eliminates
the need to line up two or more hinges, and the threaded rod.
Buying a piano hinge in the right size proved impossible locally,
but the folks at Metzger's assured me that piano hinges can be cut,
so I bought one longer than I needed and cut it to size.
I used a 1/4-20 rod, which meant (per the discussions in the Cloudy
Nights discussion linked above) that a 11.43-inch radius from the
hinge to the holes the rod passes through would call for the nut to
turn at a nice round number of 1 RPM.
I was suspicious of the whole "it's easy to bend the threaded rod ina
11.43-inch circle" theory, but it turned out to be true. Draw the
circle you want on a sheet of newspaper, put on some heavy gloves
and start bending, frequently comparing your rod to the circle you drew.
You can fine-tune the curvature later.
I cut my boards, attached the hinge, measured about 11.4" and drilled
a hole for the threaded rod. The hole needed to be a bit bigger than
5/8" to let the curved rod pass through without rubbing. Attach the
curved rod to the top wood piece with a couple of nuts and some
washers, and then you can fine-tune the rod's curvature, opening and
closing the hinge and re-bending the rod a little in any place it rubs.
A 5/8" captive nut on the top piece lets you attach a tripod head
which will hold your camera or telescope. A 1/4" captive nut on the
bottom piece serves to attach the mount to a tripod -- you need a
1/4", not 3/8": the rig needs to mount on a tripod head, not just the
legs, so you can align the hinge to the North Star. (Of course, you
could build a wedge or your own set of legs, if you prefer.) The 3/4"
plywood I was using turned out to be thicker than the captive nuts, so
I had to sand the wood thinner in both places. Maybe using half-inch
plywood would have been better.
The final piece is the knob/nut you'll turn to make the mount track.
I couldn't find a good 1/4" knob for under $15.
A lot of people make a wood circle and mount the nut in
the center, or use a gear so a motor can drive the mount. I looked
around at things like jam-jar lids and the pile of metal gears and
sprinkler handles in my welding junkpile, but I didn't see anything
that looked quite right, so I decided to try a wing nut just for
testing, and worry about the knob later. Turns out a wing nut works
wonderfully; there's no particular need for anything else if you're
driving your barn-door manually.
Testing time! I can't see Polaris from my deck, and I was too lazy to
set up anywhere else, so I used a protractor to set the hinge angle to
roughly 36° (my latitude), then pointed it approximately north.
I screwed my Pro-Optic 90mm Maksutov (the scope I plan to use for
my eclipse photos) onto the ball head and pointed it at the moon
as soon as it rose. With a low power eyepiece (20x), turning the wing
nut kept the moon more or less centered in the field for the next
half-hour, until clouds covered the moon and rain began threatening.
I didn't keep track of how many turns I was making, since I knew the
weather wasn't going to allow a long session, and right now I'm not
targeting long-exposure photography, just an easy way of keeping an
object in view.
A good initial test! My web searches, and the discovery of all
those different types of barn-door mounts and pivots and flex
couplings and other scary terms, had seemed initially daunting.
But in the end, building a barn-door mount was just as easy as
people say it is, and I finished it in a day.
And what about a motor? I added one a few days later, with a stepper
and an Arduino. But that's a separate article.
Tags: astronomy, hardware, eclipse
[
19:25 Aug 10, 2017
More science/astro |
permalink to this entry |
]
Sat, 05 Aug 2017
I do most of my coding on my home machine. But when I travel (or sit
in boring meetings), sometimes I do a little hacking on my laptop.
Most of my code is hosted in GitHub
repos, so when I travel, I like to update all the repos on the laptop
to make sure I have what I need even when I'm offline.
That works great as long as I don't make branches. I have a variable
$myrepos that lists all the github repositories where I want to contribute,
and with a little shell alias it's easy enough to update them all:
allgit() {
pushd ~
foreach repo ($myrepos)
echo $repo :
cd ~/src/$repo
git pull
end
popd
}
That works well enough -- as long as you don't use branches.
Git's branch model seems to be that branches are for local development,
and aren't meant to be shared, pushed, or synchronized among machines.
It's ridiculously difficult in git to do something like, "for all
branches on the remote server, make sure I have that branch and it's
in sync with the server." When you create branches, they don't push
to the server by default, and it's remarkably difficult to figure out
which of your branches is actually tracking a branch on the server.
A web search finds plenty of people asking, and most of the Git experts
answering say things like "Just check out the branch, then pull."
In other words, if you want to work on a branch, you'd better know
before you go offline exactly which branches in which repositories
might have been created or updated since the last time you worked
in that repository on that machine. I guess that works if you only
ever work on one project in one repo and only on one or two branches
at a time. It certainly doesn't work if you need to update lots of
repos on a laptop for the first time in two weeks.
Further web searching does find a few possibilities. For checking
whether there are files modified that need to be committed,
git status --porcelain -uno
works well.
For checking whether changes are committed but not pushed,
git for-each-ref --format="%(refname:short) %(push:track)" refs/heads | fgrep '[ahead'
works ... if you make an alias so you never have to look at it.
Figuring out whether branches are tracking remotes is a lot harder.
I found some recommendations like
git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
and
for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done
but neither of them really did what I wanted. I was chasing down the
rabbit hole of writing shell loops using variables like
localbranches=("${(@f)$(git branch | sed 's/..//')}")
remotebranches=("${(@f)$(git branch -a | grep remotes | grep -v HEAD | grep -v master | sed 's_remotes/origin/__' | sed 's/..//')}")
when I thought, there must be a better way. Maybe using Python bindings?
git-python
In Debian, the available packages for Git Python bindings are
python-git, python-pygit2, and python-dulwich.
Nobody on #python seemed to like any of them, but based on quick
attempts with all three, python-git seemed the most straightforward.
Confusingly, though Debian calls it python-git, it's called
"git-python" in
its docs or in web searches, and it's "import git" when you use it.
It's pretty straightforward to use, at least for simple things.
You can create a Repo object with
from git import Repo
repo = Repo('.')
and then you can get lists like
repo.heads
(local branches),
repo.refs
(local and remote branches and other refs such
as tags), etc. Once you have a ref, you can use
ref.name
,
check whether it's tracking a remote branch
with
ref.tracking_branch()
, and make it track one with
ref.set_tracking_branch(remoteref)
. That makes it very
easy to get a list of branches showing which ones are tracking a remote
branch, something that had proved almost impossible with the git
command line.
Nice. But now I wanted more: I wanted to replace those baroque
git status --porcelain
and git for-each-ref
commands I had been using to check whether my repos needed committing
or pushing. That proved harder.
Checking for uncommitted files, I decided it would be easiest stick with the existing
git status --porcelain -uno
. Which was sort of true.
git-python lets you call git commands, for cases where the
Python bindings aren't quite up to snuff yet, but it doesn't handle
all cases. I could call:
output = repo.git.status(porcelain=True)
but I never did find a way to pass the -uno; I tried
u=False
,
u=None
, and
u="no"
but none of them worked.
But -uno actually isn't that important so I decided to do without it.
I found out later that there's another way to call the git command,
using execute, which lets you pass the exact arguments you'd
pass on the command line. It didn't work to call for-each-ref
the way I'd called repo.git.status (repo.git.for_each_ref
isn't defined), but I could call it this way:
foreachref = repo.git.execute(['git', 'for-each-ref',
'--format="%(refname:short) %(push:track)"',
'refs/heads'])
and then parse the output looking for "[ahead]". That worked, but ... ick.
I wanted to figure out how to do that using Python.
It's easy to get a ref (branch) and its corresponding tracking ref
(remote branch).
ref.log()
gives you a list of commits on each of the two branches,
ordered from earliest to most recent, the opposite of git log.
In the simple case, then, what I needed was to iterate backward over
the two commit logs, looking for the most recent SHA that's common to both.
The Python builtin reversed was useful here:
for i, entry in enumerate(reversed(ref.log())):
for j, upstream_entry in enumerate(reversed(upstream.log())):
if entry.newhexsha == upstream_entry.newhexsha:
return i, j
(i, j) are the number of commits on the local branch that the
remote hasn't seen, and vice versa. If i is zero, or if there's nothing
in ref.log(), then the repo has no new commits and doesn't need
pushing.
Making branches track a remote
The last thing I needed to do was to make branches track their remotes.
Too many times, I've found myself on the laptop, ready to work, and
discovered that I didn't have the latest code because I'd been working
on a branch on my home machine, and my git pull hadn't pulled
the info for the branch because that branch wasn't in the laptop's
repo yet. That's what got me started on this whole "update everything"
script in the first place.
If you have a ref for the local branch and a ref for the remote branch,
you can verify their ref.name is the same, and if the local
branch has the same name but isn't tracking the remote branch,
probably something went wrong with the local repo (like one of my
earlier attempts to get branches in sync, and it's an easy fix:
ref.set_tracking_branch(remoteref)
.
But what if the local branch doesn't exist yet? That's the situation I
cared about most, when I've been working on a new branch and it's not
on the laptop yet, but I'm going to want to work on it while traveling.
And that turned out to be difficult, maybe impossible, to do in git-python.
It's easy to create a new local branch:
repo.head.create(repo, name)
.
But that branch gets created as a copy of master, and if you try to
turn it into a copy of the remote branch, you get conflicts because
the branch is ahead of the remote branch you're trying to copy, or
vice versa. You really need to create the new branch as a copy of
the remote branch it's supposed to be tracking.
If you search the git-python documentation for ref.create, there
are references to "For more documentation, please see the Head.create method."
Head.create takes a reference argument (the basic ref.create
doesn't, though the documentation suggests it should).
But how can you call Head.create? I had no luck with attempts like
repo.git.Head.create(repo, name, reference=remotebranches[name])
.
I finally gave up and went back to calling the command line
from git-python.
repo.git.checkout(remotebranchname, b=name)
I'm not entirely happy with that, but it seems to work.
I'm sure there are all sorts of problems left to solve. But this
script does a much better job than any git command I've found of
listing the branches in my repositories, checking for modifications
that require commits or pushes, and making local branches
to mirror new branches on the server. And maybe with time the git-python
bindings will improve, and eventually I'll be able to create new tracking
branches locally without needing the command line.
The final script, such as it is:
gitbranchsync.py.
Tags: git, programming, python
[
14:39 Aug 05, 2017
More programming |
permalink to this entry |
]