Erin’s Whole Wheat Sandwich Bread
My adorable wife is very picky about her bread. It has to be 100% whole wheat, and the right shape for sandwiches. I'm kinda picky too, it has to taste good, have a light and soft crumb, be fun to make, and be able to wrap around my work schedule.
It's easy to make bread that satisfies some of those constraints, but it's been a long process to get everything just right. But get it right I have, and now I'm blogging it.
First, the recipe:
20 oz whole wheat flour 10 g salt 8 oz milk 7 oz water 2 oz sourdough culture tablespoon honey tablespoon oil or butter Mix Proof covered for an hour Stretch and fold twice Proof covered for another hour or two, until it begins to rise Retard in the fridge overnight or up to a couple days Stretch and fold, let rest 10 minutes Shape (8½"x4½" pan) and let rise about 4–8 hours (depending on temperature and culture) Bake at 375°F to an internal temperature of about 200° (adjust for altitude)
This is 75% hydration—the dough should be soft and sticky when first mixed. I could explain in detail what each of these loaded terms means (e.g. stretch and fold), but most of you are sick of hearing me prattle on about them and the rest of you can ask in the comments or search the all-knowing internet. There are helpful videos for S&F and shaping. Google for the poke test if you're not sure how to know when it's done rising.
It's sourdough, but it's not sour. It does have excellent flavor, but if you are put off by really sour bread don't worry (and if you want it, this isn't the recipe for you). It's not as light as white bread, but it is soft and not dense as whole wheat bread notoriously can be.
WARNING: Science Content!
The 8½x4½ pan size is nominally a "1 lb loaf" pan. This either means 1 lb of dough, or 1 lb of cooked bread (which means roughly 3 oz more than 1 lb of dough). Both are a far cry from the 2+ lb of dough we use here. I don't have a good explanation for this, and it makes me kind of uneasy. But this is the amount of dough it takes to get the loft my wife wants with whole wheat. Probably less would be required for white bread; the fact is whole wheat just doesn't rise as high as white bread—but don't ever let anyone tell you it must be dense or won't rise to lofty heights. Another factor is probably that my wife really likes a high mushrooming crown, and I get the impression that the professional bakers calling this pan a 1 lb loaf pan are satisfied with a squarish top loaf that crowns not far above the top of the pan. Maybe? Please enlighten me.
We grind our own flour, from white wheat. Red wheat and store bought is of course fine, it's a matter of preference. You may adjust the liquid as needed but 75% is going to be a good start for any whole wheat dough. The long life of the dough (thanks to the overnight retard and sourdough pace) gives the enzymes plenty of time to work, which gives a much more interesting and sweeter taste vs the harsh bitter whole wheat taste we all love to hate. You really will be surprised at how good it tastes.
One of the keys to whole wheat bread is to make sure it's kneaded well enough to develop the gluten. The long rise and wet dough means we don't have to do much work to achieve that (no-knead style), but if you want to throw it in your mixer and do the windowpane test, I doubt it would hurt anything.
The short initial rise (2 hours is a short time for sourdough) gets the sourdough beasties going without getting them into overdrive. It takes the dough a little while to cool to retarding temperatures once you stick it in the fridge, and so we will be well into the exponential phase. This means optimal growth after deflating and shaping (once the dough has warmed up again) which is important for good loft in sourdough. You can toy with the timing a bit, e.g. more initial proof for a shorter second proof (up to a point), or a shorter initial proof for a longer second proof (e.g. so it can proof overnight for a first-thing-in-the-morning bake). Exact timings are highly dependent on your ambient temperature and sourdough culture character.
I have a nice sourdough rhythm that I use for maintaining my start. When I use it, e.g. mix up a loaf of bread, I feed the jar 2 tablespoons of flour and water, then let it grow at room temperature about 8–12 hours. Then I feed it again and stick it in the fridge. This way it's ready to go in a few days and is live and healthy in the fridge, not old and dying. But it doesn't spend all its growing time at fridge temperatures, because every other feeding is on the counter, which is important for maintaining various desirable properties. I use the start straight out of the fridge, but you can also refresh the culture 6–8 hours before mixing your bread for extra vigor.
If you have any questions, please ask them and I'll fill in the gaps.
OSX ignores ownership on external drives by default.
I had reason to copy my harddrive off and back (to reformat as case-sensitive), and I missed one very important detail.
http://www.egg-tech.com/mac_backup/
IMPORTANT STEP: disable "Ignore ownership on this volume".
Yeah, with everything owned by user 99, it won't even boot. You can boot into single-user mode and "chown -R root:wheel /" which will at least let it boot, then you can go into Disk Utility and repair permissions (which will actually do something useful and vital in this situation). Then chown -R your home directory. But it's still a mess to clean up, and you lose all that user and group info.
Lilypond 2.12 in the OSX Terminal
Getting this error?
$ /Applications/LilyPond.app/Contents/Resources/bin/lilypond
dyld: Library not loaded: @executable_path/../lib//libstdc++.6.dylib
Referenced from: /Applications/LilyPond.app/Contents/Resources/bin/./lilypond
Reason: image not found
Trace/BPT trap
I don't know why this is screwed up, but I have a workaround:
ln -s /usr/lib/libstdc++.6.dylib /Applications/LilyPond.app/Contents/Resources/lib
While I'm at it, here's my script in ~/bin:
$ cat ~/bin/lilypond
#! /bin/bash
exec /Applications/LilyPond.app/Contents/Resources/bin/$(basename "$0") "$@"
You can symlink it to midi2ly or whatever other executables you want to execute. Or you could add that directory to your path, of course.
Mythtv Cleanup
A couple tricks on manually cleaning up the mess if mythtv gets screwed up.
First, go into your recording directory and "rm *.png". This will remove all the preview images. Now page through the list of recordings and they'll all be rebuilt (this step may require some patience). Now look in the directory again (ls) and notice if there are any video files not accompanied by a .png file—if there are then they're orphaned and you can delete them (or move them somewhere where you can watch them by hand later).
Now pull up your recordings in mythweb and sort by size. Any that are 0 bytes, you should delete (no, I don't know a faster way than clicking and confirming each one).
Finally, if mythtv has something in its db that isn't on disk, it can cause trouble when it's trying to autoexpire. So do this in your recording directory:
grep 'should be local' /var/log/mythtv/mythbackend.log | egrep -o "[0-9_]*\.(mpg|nuv)" | xargs touch
HDMI out Sony BDP-360
HDMI out on my Sony BDP-360 BluRay player worked fine for a month or two, then mysteriously cut out. I'm still troubleshooting, and the unit may need repair, but when I contacted Sony support they sent me this link which has already been very helpful: http://www.kb.sony.com/selfservice/documentLink.do?externalId=C567099
It may be coincidence but twice in a row I held down the stop button for 10+ seconds then replugged the HDMI cable, and it came back. I have it on 720p now and if it doesn't cut out again I'll assume some kind of 1080p problem, e.g. I need a better cable or there's some EM interference or something.
Tangentially, the player has a quirk in audio output. It refuses to send the full audio signal over HDMI to the TV, even though the TV passes a digital signal through to my receiver. I know this works because MythTV send Dolby Digital 5.1 audio through HDMI, which is then passed from the TV to my receiver unharmed. But I can't get more than stereo downmixed dolby surround from this BD player, except if I hook up the digital audio out directly to the receiver. This is annoying because I have to switch the TV input source and the receiver both.
My favorite bash idiom
Stuart and I came up with a refinement to my favorite bash idiom today. It was:
find ... | while read FOO; do ...; done
as demonstrated in:
find . -name '*.mp3' -type f | while read MP3; do
ffmpeg -i $MP3 ${MP3%.mp3}.m4a
done
This handles whitespace (except newlines) in filenames. Except that ffmpeg is sharing stdin with while, which can cause some very funky problems. This is safer:
find ... | while read FOO; do echo | (
...
); done
and while you're at it, you might as well take into account the unlikely-but-possible corner case of a filename containing a newline:
find ... -print0 | while read -d $'\0' FOO; do echo | (
...
); done
Free File Fillable Forms
If you saunter on over to irs.gov you'll see that there's a new option for free electronic filing: Free File Fillable Forms (0xFFFF). Unlike the partnerships with companies like H&R Block which limit free filing by your income, this is free for everyone. And unlike those companies, you have to do all the thinking and math. Well, most of the math.
I did this with my taxes this year, mostly out of curiosity and because the notion of electronic filing user-filled forms is elegant and I think we should have been doing it for at least 10 years by now.
Alas, the implementation of this elegant idea is pretty shoddy. I went to FreeFileFillableForms.com via irs.gov and immediately hit a hurdle. While trying to sign up for an account, the captchas consistently failed. I'm not stupid enough to miss 5 captchas in a row. Just for kicks I did the audio captcha instead. Wow, that's a thorough captcha—you have to type a whole phrase from a TV snippet from like 1955. I had to try 3 before I even had a good guess on all the words. (I'm betting you only had to get one word right, though.) That worked. Armed with an account I got started.
Or at least I tried to. It redirected me back to the login page. After a few times around the block I decided it was probably some kind of browser incompatibility, so I ditched Chrome and fired up Safari. That worked (it may have solved my captcha problem, too).
The interface is nothing sensible like PDF forms or standard HTML forms. It's a flash-based GUI. Very slick in some places, but very deficient in actual usability. The most glaring problem is that you can't type faster than about 20 words per minute or it goes all dyslexic on you. This is a serious problem. I had to triple check every word and number entered to be sure it hadn't switched the letters around behind my back. Lest you think I'm a paranoid defective keyboardist, I watched it shuffle the letters around, like something out of the new Electric Company. I typed a word while watching the screen, saw it lay down the letters in the order I typed them, then watched in horror as it rearranged the last few letters. My hypothesis is that it's doing some sort of input verification, but doing it poorly and rife with race conditions.
In spite of all my diligence, I missed the fact that it had rearranged my SSN at the top of the 1040, and so when I submitted it the IRS rejected it and I now have to go back in and fix it, recheck every number, and resubmit.
I said you do the math, which isn't entirely true. You follow the instructions and the forms automatically do most of the math. But not until you actually press "do the math" (that's very 1998). But it's not very consistent about how helpful it is. Some forms automatically fill in your AGI, others require you to enter it manually. Some remember your filing status and enter the right number, others require you to do it manually. Basically, you have to try to enter every number and check box, and the only way you can tell whether you should have tried to enter it is by whether it pops up a little red tooltip telling you it's going to do that for you, thanks.
All in all, with those major caveats, it worked well. The overall interface wasn't horrible, the generated PDF when you print your forms is very nice, and I'm sure once I get my return right in spite of its buggy input validation it'll file without issue. If they had just used regular HTML and Javascript like H&R Block does, it would have been more likely to be less buggy and more compatible with all browsers. I can recommend 0xFFFF, but only to the patient and diligent who really want that refund sooner rather than later. Otherwise go with the paper forms.
Defeating the AC_CHECK_HEADER cache
The AC_CHECK_HEADER macro caches its result, so if you want to call it again with a different CPPFLAGS it will just remember the result of the first execution.
If you want to defeat this cache, as I did, this is the pattern:
header=foo.h
cache_var=AS_TR_SH([ac_cv_header_$header])
...
AC_CHECK_HEADER([$header])
...
CPPFLAGS="-I/opt/local/include"
$as_unset $cache_var
AC_CHECK_HEADER([$header])
...
AS_TR_SH does the escaping (giving ac_cv_header_foo_h in this case), $as_unset is the portable way to unset a shell variable in autotools.
Incidentally, if you don't restore CPPFLAGS to its original user-set value, I will hunt you down and shave your head.
Defeating the Anti-Autocomplete Demons
There are demons out there. They have sent their evil henchbugs to make my life difficult. The Santa Clara library login page for some unfathomable reason doesn't trigger Firefox's autocomplete. No, the HTML form doesn't specify "autocomplete=off". As far as I can tell, it's just that Firefox doesn't seem to think that my library barcode is worth remembering. Which is a real bummer because it's impossible to remember and about as sensitive as the callus on my big toe.
So I got jiggy with GreaseMonkey and made my own autofill script:
// ==UserScript==
// @name Santa Clara Library Autocomplete
// @namespace http://hans.fugal.net/
// @include https://sccl.santaclaraca.gov/patroninfo*
// ==/UserScript==
name = document.getElementsByName('name')[0];
code = document.getElementsByName('code')[0];
name.value = 'Fred Flintstone';
code.value = 'Your impossible-to-remember-barcode goes here';
Graph-paper Weight Loss
I think I've posted on this before, but I want to post my method for weight loss again, and try to do it in as few words as possible this time. If you want more information about the principles upon which I based this method, read Total Fitness in 30 Minutes a Week by Laurence Morehouse, and The Hacker's Diet by John Walker.
First, why you should care: I lost 40 pounds eating whatever I wanted and have kept it off even after joining Facebook and eating up to 3 meals a day at the gourmet buffet plus micro kitchens.
Second, why you may not care: you want to lose more than 2 lb / week (good luck with that) or you are a masochist.
Here's what you need: a piece of graph paper, a pencil, and a bathroom scale (digital is best). Oh, and a little patience and a small amount of willpower (much less than your average diet requires). To set up all you need to do is draw a line in the corner that goes over 5 squares and down 1 square for a weight loss rate of 1 pound per 5 days, you can choose any weight loss or gain rate that you want as long as it's not more than 2 pounds per week. Obviously, the faster you lose the more willpower you need, but no matter how much willpower you have it won't work if you go much over 2 pounds per week.
Here's what you do every day: just after you wake up you use the bathroom and then step on the scale—before eating or drinking anything. Mark your weight on the graph paper. Then, imagine the line that best fits the marks for the past 5 days (least squares fit for you mathy types).
Is that line sloping down more steeply than your reference line? Congratulations: you can eat as much of anything you want today. Don't gorge yourself, but don't fret it. Want that ice cream? Go for it. Candy bar? Sure. Triple burger with guacamole? Ok, but think about making it a double man.
Is that line flatter than your reference line (or going up)? Then today you still get to eat (almost) whatever you want! But, we need to restrict quantity. In specific, we need to eat about 500–800 calories less than your normal intake. You can accomplish this easily by eating smaller portions at meals and skipping dessert.
That's it. Fast forward 1 year and if you have stuck with the plan you will have lost as much as 70 pounds. But we know life (and holidays) happens, so be realistic and figure you'll fall off the horse a few times. No big deal, this system is designed to keep your morale up and recover gracefully. To be safe, expect 40 pounds per year, then be pleasantly surprised.
There is no correlation between what you eat today and what you weigh tomorrow. Well that's technically a lie, but there are much bigger effects than what you ate. Your weight will fluctuate as much as 2 lb due to various effects. You have no control over this. The method is not relying on any correlation between today's diet and tomorrow's weight. It is relying on the long-term effects of eating smaller portions approximately half the days (maybe even less). If you weigh more today it doesn't mean you failed yesterday! If you weigh less today it doesn't mean you succeeded yesterday! You have to take the long-term view and just stick with the program.
Now some short notes. First, exercise is a good idea. No, a great idea. Although it's not essential to this plan, I think you'll find it helps you with appetite control and to just feel better all-around. Second, eating healthy doesn't hurt either, obviously.