Tuesday, August 19, 2025

Pear Butter

Our pear tree has good years and bad years. It doesn't always know when spring is, and can bloom at the wrong time, resulting in unsuccessful fruit. But this year its early blooming worked out in its favor. It was able to hold onto a lot of fruit which got very large (compared to its usual size). So far, we have picked over 50 pounds of nice ones, from 8-16 ounces each.

A lot of the fruit have damage from birds or bugs or disease. They're edible, but you can't leave them out on the counter to get soft. They're good candidates for making pear sauce or pear butter. I tried a new recipe for pear butter this year and wanted to write it down so I can do it again the next time we have a big harvest.

Enough pears to fill an 8-quart pot, cut into pieces.
1/2 c water

Heat on stovetop, covered, on medium-high heat for 6 minutes. Stir and reduce heat to medium. Continue to cook, stirring every 10 minutes, until pears are breaking down and swimming in juice.

Optional: strain solids out of juice, and return the juice to the pan. In either case, mill the solids, discarding the skins.

To the juice (or all, if not separating), add:

1 1/2 c sugar
4 t Ceylon cinnamon
1 t ground ginger
1 t ground cardamom
1/2 t ground nutmeg
1/2 t ground cloves

Cook the juice down on medium-high heat until it's syrupy, then stir in the solids and continue to cook down. Use a spatter guard, but allow the steam to escape.

To avoid spatter burns, turn the heat way down before stirring with a silicone spatula, which you need to do every few minutes.

Friday, December 31, 2021

Getting stronger

For years, I have done push-ups and other body-weight exercises as a daily fitness routine. The latest schedule was:

Day 1

Burpees, crossfit-style. 10 sets of 11, starting on 1 minute. That's about 30 seconds on, 30 seconds recovery. Exhausting, but a full-body workout all in 10 minutes.

Day 2

Standing horizontal rowing using elastic bands. 30 seconds on, 30 seconds off for 7 sets. Then 3 minutes of slalom squats: squat over right leg, center, left leg, center, repeat, and every eighth squat, hold the down position for a count of 6.

Day 3

Push-ups for 20 seconds, hop up to standing, rest for the remainder of the minute, repeat for 7 sets. Then stationary lunges: step out with right foot, 7 lunges (or split-squats), hold the down position for count of 6, 5 more lunges; do left foot; continue through four sets.

Days 4-6: repeat days 1-3.

Day 7: rest

This has been a good routine. I am thin, fit, and balanced, but not particularly strong. I haven't worked out with weights regularly since college, when I weighed 15 pounds more than I do now. But we got a Tonal home gym, so my whole routine is changing.

Tonal offers many workout programs, delivered as videos on the machine itself. I am on a strength training program, which comprises 4 half-hour-ish workouts a week. On off days, I do my Burpees routine, or find another workout to do.

Tonal gamifies working out in several ways, which provides motivation to push yourself. My initial assessment gave me a "strength score" of 376 on December 19. As of today, it is 467. I think the former is higher than 27% of male Tonal users; the latter is higher than 44%. Am I really that much stronger in 12 days? Probably not, but likely some. Some of it is just getting used to the machine, I think. Still, I'm on my way.

Shelly is also on her way. A big part of the reason we got the Tonal is that it has a "smart spotter" feature that detects when you're struggling and can reduce the weight on the fly. Since she's prone to injury, we want to minimize the chances of that.

We'll be taking photos and measurements each month to see how we're changing. Maybe by this time next year I'll be in or near the "comma club", with strength score of 1,000 or more.


Friday, May 28, 2021

Making pickles

I don't like pickles, but Shelly does, so this year I've made two types of refrigerator pickles for her. The first ones are dills, for which I simply followed this online recipe. Shelly proclaimed them the Best Ever, which is also what the web page calls them.

Next, I went for bread and butter pickles. I wanted to put cooled (rather than hot) brine over the cucumbers, as that preserves crunchiness better. Some of what I was using were slicing (not pickling) cucumbers, which are more prone to going soft.

I mostly followed this recipe, but wanted to salt the cucumbers first, rather than just having salty brine.

About pound of cucumbers
1T kosher salt
3/4 c white vinegar
1 c cider vinegar
3/4 c granulated sugar (maybe cut this by 2 T)
1/4 c water
1 t celery seed
1/2 t brown mustard seed
1/2 t white mustard seed
1/2 t ground turmeric

1/2 onion, sliced

Slice cucumbers about 1/4 inch thick. It should be enough to nicely fill a quart jar.

Put the slices in a large bowl and sprinkle with the salt. Mix it up well with your hands, then stuff them into the jar, and put the jar in the fridge for an hour or so. (A jar is easier to fit in the fridge than a big bowl is, but you could do that if you wanted.)

Meanwhile, in a small saucepan, combine the remaining ingredients and bring to a simmer. Turn off the heat and add the onion to the pan. That will lightly cook the onion. Let the brine cool for the remainder of the pickles' hour in salt. Should be about 40 more minutes.

Take the cucumbers out of the fridge and rinse off the salt, and put them back in the big bowl. Fill the jar by alternately adding some brine to the jar, then stuffing cucumbers into the jar. If you have a weight to put on top of the cucumbers to hold them down in the brine, that's good.

Cap the jar and refrigerate for at least a day.

Saturday, March 3, 2018

Planting tomatoes

The 2018 tomato roster consists of, left to right, Gregori's Altai, Chocolate Sprinkles, Braveheart, Sun Gold, and Tasti-Lee.

We had a lot of edema in our seedlings this year. We tossed Cherokee Purple and a lot of Sakura Honey F2 seedlings, as well as several Chocolate Sprinkles. Don't know why that's become a problem. It's not a disease, as far as we can tell, just a condition. Something unfavorable about the planting mix or fertilizer, I guess.

Monday, November 23, 2015

Racing Cars

Asphalt 8: Airborne is an amazing racing game for Android devices. I regularly run my battery from full to empty playing it. It is not what one could call a realistic game, what with surviving 200-foot drops and being able steer while in mid-air, but it is fun. And frustrating. The game decides sometimes that you belong in 3rd place. Or last place. Or first place. It is not up to your skill. The game has spoken. But over the longer term, these tend to balance out.

How the game works is, there are a vast number of cars available. Each one has its own characteristics, and you can buy upgrades to them. You win credits for winning races and performing tricks (like barrel rolls and knocking other cars down). There are races against computer-controlled cars, and multiplayer races, where you are pitted against other people online. Kind of amazing what they can do with mobile apps these days.

Each car has a rating according to its characteristics and how much you've upgraded it. You might think that equally-rated cars would tend to perform about equally, but that is not true. There are cars that are simply better for multiplayer racing. Also, I've found that (counterintuitively), the more you upgrade a car, the less well it does against similar rated cars.

The best cars for multiplayer are: Survolt, Felino cB7, and Biome. If you pay attention to who wins races, it's very often one of these. Don't bother with the Corvette or Countache, they just lose. Some others like the Pagani Zonda are fun to drive, and they at least have a chance of doing well in a race, but for dependable top-3 finishes, pick a Survolt, Felino, or Biome, preferably not fully upgraded. Get one and start winning races. That's how you make money.

There will always be more cars and upgrades than you can afford. It takes a lot of racing to win money, but there are a few shortcuts. First, winning streaks: if you place top-3 for 7 races in a row, you will sometimes win a class-D engine upgrade. Be aware of what your most expensive upgrade available is. When you win the upgrade, that can save you a lot. Similarly, if you continue on to get 9 in a row, you can (sometimes) get a class-C. Again, they can be worth a lot of money.

A relatively recent development, the Mastery series of races, also has a few upgrades scattered among the prizes. You don't have to claim them immediately upon winning them. You can look through your inventory and see where it would best be applied.

Another way to save a few bucks is to watch for cars to go on sale. They can be anywhere from 20-50% off.

There's also a bonus for your first race of the day, if you play every day. Double your money. Try to do a race that promises a good payout: one where there are stars to be won. If the race isn't going your way, you can quit the race and re-start, and you'll still have the bonus waiting for you.

There are always "special events" going on, too. These are time-limited, running for 1 to 5 days, and your participation is also limited by "fuel bars" that you have that recharge over time. The money payoffs are fair, but the non-money prizes are what usually make them worthwhile. In addition to earning prizes for scoring 1st place or beating a time, there's a hierarchy of prizes for the top scorers overall. In a multiplayer cup, that means playing again and again, which is usually not worth it. But in a non-multiplayer event, you just need to manage your best race.

Another aspect of the game is "Pro Kits". These are upgrades that can take you beyond the maximum normal upgrades, but in addition to money, you have to have cards specific to the upgrade. Those cards are often prizes in the special events. Although the intent is for the pro kits to be applied after you've maxed a car's upgrades, you can apply them at any time. This is good if your stash has gotten too full for you to open more boxes of cards. However, you need to be judicious about your card use, because you will run out of cards for particular upgrades. So focus on upgrading one or two cars in each class, rather than just applying upgrades all over the place.

Got tips? Tell me in the comments.

Sunday, September 20, 2015

Understanding Knockout

What's the Goal?

I once worked with a man who, when discussions of a solution turned confusing, would always ask, "What's the goal?" It is surprising how often we see a problem and try to find a solution without really understanding what solving the problem really means. The problem that we had in AJAX apps is that our data was stored in the DOM, and we would always be fiddling with sometimes-complicated widgets there to do conceptually simple things. And the entanglement meant that changing superficial presentation things might require wide-ranging changes to the code.

The goal, then, is to separate presentation (the view) from data (the model). Numerous libraries exist to solve this problem, but most of them threw in several other goals, leading to over structured and indirect solutions to the problem. Knockout focuses on this one goal, and as a result is easy to learn and easy to read.

The Knockout Approach


Knockout says that there are two types of JavaScript in an application: the ViewModel and the Bindings. The Bindings exist to synchronize the ViewModel and the View: changes in the View that are made by the User will be reflected in the ViewModel, and changes in the ViewModel will be reflected in the View.

Because Knockout guarantees the View and the ViewModel will always be synchronized, there is never any reason for you to reach around the Bindings and manipulate the View. That means you're never going to use a jQuery selector outside of a binding. If you are selecting elements of the DOM, stop and ask yourself why you are not dealing with the corresponding element of the ViewModel.

What's a ViewModel?

The ViewModel is a collection of variables that represent everything that can change in the View. Instead of manipulating DOM elements, you manipulate the variables, and the Bindings update the DOM for you automatically. And if the User changes some setting in the DOM, the Bindings update your variables for you.

What's a Binding?

A Binding (or binding handler) is the code that understands how an element of the View should reflect (and be reflected by) ViewModel variables. Knockout comes equipped with a number of the most common types, but you should expect that you will need others to handle specialized widgets. Happily, bindings for many well-known widgets have been written and are available on GitHub (and elsewhere). Still, you should expect that you will need to write some of your own. It is no more difficult than writing DOM manipulation code that isn't part of a binding. Knockmeout has a great writeup on writing custom binding handlers.

Where's the Model?

Some people have (rightly) noted that, although Knockout is billed as an MVVM (Model-View-ViewModel) system, it's not obvious where the Model part is. You model the application you are building with your ViewModel. Any data you work with is part of that, but does not necessarily require being separated from the rest of the ViewModel. That is up to you. Always ask yourself, "What's the goal?"

Friday, May 1, 2015

Class-free object-oriented programming in Javascript

Douglas Crockford has given another talk on the future of Javascript, with particular attention to what he now considers the Right Way to do object-oriented programming, which is quite a departure from classical thought. Years ago, he stopped using new explicitly, and came up with Object.create to use instead, for more straightforward use of Javascript's prototypal inheritance design.

Now, he has also stopped using this, which means he has effectively abandoned Javascript's notion of inheritance altogether. He calls his new style "class-free object-oriented programming", the basic feature of which is that every object actually contains its own methods, rather than sharing them in a prototype or parent object. This is "inefficient" by some measure, but if you think about it, the sharing of methods is simply an optimization, and in most cases, optimizing for space in JS is not going to make a critical difference.

It happens that this was the style I adopted when I got into programming JS, because I was not trained up in classical object-oriented languages. Ironically, more recently, I did get into the typical use of new and prototypes, but I'm going to reconsider that for a while.

Crockford's basic boilerplate for a constructor is:
function constructor(spec) {
  let {member} = spec,
      {other}  = other_constructor(spec),
      method   = function () {
        // accesses member, other, method, spec
      };

  return Object.freeze({
      method,
      other,
  });
}
Which is to say that there is no built-in inheritance; objects that are composed-in are simply member sub-objects. You can, of course, make pass-through member calls.

Danny Fritz blogged about the concept of class-free OO programming, with some helpful illustrative examples, but his techniques differ somewhat from Crockford's, notably in the use of this. Predictably, I have a take that is somewhat different from each of them, but which I think marries their best features.

Crockford uses constructors for everything, which has the code smell of boilerplate in the form of the return Object.freeze portion. Fritz has constructors and extenders, with a copy-in extend function. I have always hated such extenders, and I don't see a reason to have a distinction between constructors and extenders.

Instead, I propose that the proper separation of duties is to have a universal constructor and everything else is an initializer. This gives you freedom to inherit and allows you to avoid the security hazards of this.

The universal constructor looks like this:
Function.prototype.construct = function (spec) {
    var obj = {};
    this(obj, spec);
    return Object.freeze(obj);
}     
Almost too simple to bother with, but it takes care of the boilerplate issue. Note: I formerly had defined this as Object.construct, but this definition makes every function be a potential constructor, which seemed more appropriate.

Now, for any object type (or extension type), all you have to concern yourself with is the initialization. I will illustrate using Fritz's examples of alligator, duck, and goat objects that are defined in terms of extensions Animal, Walking, Swimming, Flying. This is a straightforward port of his alligator:
function alligator (self, spec) {
    self.name = 'alligator';
    self.word = 'grrr';
    animal(self);
    walking(self);
    swimming(self);
}
All of the extensions are just initializers called on the self object (which, being passed in, avoids the security problems of this), and the alligator function is, itself, just an initializer. spec is not used in this case, but I have kept it to show how Crockford's model fits. Most objects do have inputs to their initialization. Similarly, animal et. al. would normally take a second argument.

To create an instance:
var myAlligator = alligator.construct(spec);
It should be clear from this how duck and goat would similarly be created, but let's take a look at the extensions. Again, a straightforward port of animal:
function animal(self) {
    self.name = 'name';
    self.word = 'word';
    self.talk = function () {
        console.log(self.name + ' says ' + self.word);
    }
};
It becomes clear at this point that all the things that inherit from animal have a name and a word. Initialization of those should be done with a spec, rather than having placeholder defaults and each derived object having to know about them:
function animal(self, spec) {
    self.name = spec.name;
    self.word = spec.word;
    self.talk = function () {
        console.log(self.name + ' says ' + self.word);
    }
};
Now we can rewrite alligator:
function alligator (self, spec) {
    animal(self, spec);
    walking(self);
    swimming(self);
}
alligator.construct({name: 'alligator', word: 'grrr'});
So our alligator doesn't merely contain animal, walking, and swimming objects (as would be the case in the Crockford model), but it has been initialized to have those traits directly. This requires that all the traits play nicely with each other. If that can't be guaranteed, Crockford's model offers more security, and can obviously be implemented with pass-through methods like so:
function alligator (self, spec) {
    animal(self, spec);
    var walkTrait = walking.construct();    var swimTrait = swimming.construct();    self.walk = walkTrait.walk;
    self.swim = swimTrait.swim;
}
alligator.construct({name: 'alligator', word: 'grrr'});
Note that I have initialized the alligator self as an animal, then added the other features as traits. Whether you initialize on the object itself or create sub-objects is up to you.

Monday, February 2, 2015

Exploring the smell of Javascript inheritance

In Javascript, objects inherit from other objects. By convention, the objects that are inherited from (prototypes) contain methods, while the inheriting objects contain data. This makes sense, as it is practical to share methods, but each instance must have its own data.
Given that we are interested in (only) the methods of the parent object, it strikes me as something of a code smell that inheritance is done by taking an instance of an object - including, in particular, its data members - to use as a new prototype to which we add functions. It's convenient, it's relatively low cost (what are a few unused variables, for a whole class), but you're still creating things that you will never use. For example, say we have this class:
function Button (label, position) {
  this.label = label;
  this.position = position;
}
Button.prototype = {
  // Button functions
  ...
};
You might derive a new subclass like so:
function RoundButton(size, label, position) {
  Button.call(this, label, position);
  this.size = size;
}
RoundButton.prototype = new Button();
RoundButton.prototype.newMethod = function () {
  // additional functions
  ...
};
You only create the new Button instance so you can inherit from its prototype and add methods to it. The data members don't matter at all to the prototype; you want them in the instance (hence the Button.call).
You could have the Button constructor check to see whether it receives any arguments, and if not, it doesn't create its members. That makes Button responsible for two things: constructing new buttons and constructing new prototypes for derived classes. Another approach would be to separate the prototype responsibility into another class:
function DerivedButton() {}
DerivedButton.prototype = Button.prototype;
Then RoundButton.prototype would be declared:
RoundButton.prototype = new DerivedButton();
Interestingly, because DerivedButton and Button share a prototype, deriving RoundButton from DerivedButton will make RoundButton instanceof Button yield true.
It looks like Object.create was set up to have prototypes inherit through prototypes and not through object instances (as well as to facilitate more traditional object-oriented features).

Tuesday, January 14, 2014

100 Pushups!

It finally happened today. This morning was hurried, since Maria, our housekeeper, was coming, and things were too messy to clean. If you have a housekeeper, you know what I mean. Because of this, I didn't have time to do my usual morning workout, so I decided I'd make it a pushup-test morning.

I felt pretty good, although I had taken about a week off of exercising when we went to Memphis for the Liberty Bowl, and I had definitely lost a bit of capacity in my regular routine. But I'd been back at it for two weeks, and was performing about as well as before.

It's hard to know how many you're going to be able to do, while you're doing them. They don't gradually get harder and harder until you fail, they're easy for most of the time, then they suddenly get challenging, and then you hit the wall and can't make another pushup. I felt good, though, through 50, then 60, then 70. When 80 was still not a problem, I started to think I was going to make it.

About 90 was when I started to feel like I was approaching the end. At 93, I had to pause at the top to take a breath. Up to then, it had been push-push-push, continuous, but the last 7 were individual, locking the elbows at the top each time, the way weightlifters do heavy bench-presses. To my surprise, it wasn't a great struggle to get through the last two. I probably could have done two more, but I was satisfied to make the 100 milestone.

What is my usual morning workout?

Five days a week, I do pushups and either squats or lunges. I use no weights besides my body weight. I alternate days, doing longer sets of pushups followed by stationary lunges, and shorter sets of pushups followed by slalom squats. This routine comprises all the exercise I do, although one of these days I'll get back to swimming.

I alternate the placement of my hands in pushup sets. The first set has them lower, beside my ribcage, the second in the usual shoulder-level position.

Long sets are timed at 1:30 per set; it takes about half the time to do the pushups, and the other half is resting time. I do 50, 50, 40, 40, and whatever I can manage (30-40) for a total of 210 or so.

Short sets start every 1:00. I do 6 sets of 30, plus one set to failure, another 30-40, for (again) a total of 210 or so.

If you don't know what a stationary lunge is, Google can direct you to explanatory videos. My variation is that I do 7 lunges, then "pulse" in the down position for a count of 5, then do 5 more, before switching legs. I do 8 sets of 12 this way with no rest between sets.

Slalom squats are like regular squats, except that instead of coming straight down every time, you shift your center of gravity over each leg. I do center, right, center, left. After each 8th squat, I pulse in the down position for a count of 5. I do 12 sets of 8 with no rest between sets.

Monday, April 8, 2013

The political spectrum


The common way of discussing political views is as a single spectrum running from left to right.  People identify themselves as one or the other or "centrist", and are pretty vague about what it all means.

Some people have tried to make it a bit clearer with a two-dimensional model, but in doing so, they appropriate the terms left and right and redefine them according to their own notions of what's important. I think that's a mistake. Left and Right have useful meanings which are still applicable today.

Leftism is the belief that government should break down social inequality.
Rightism is the belief that government should preserve social hierarchies.

So that's one dimension. If you believe that the government should do some of both, you're a "centrist".

The second dimension is how much control the government should have in shaping society. The less control it has, the less far to the left or right it can be, so the shape of the spectrum is a triangle. At the top is totalitarianism, with right and left very far apart. And at the bottom?

If you do away with all the laws that are aimed at either making things more equal or keeping society from changing, you still have some laws. They are the basic rules of settling differences that arise when people form a society. Libertarians believe that government should be limited to enforcing these laws, and that society should be free to structure itself in whatever ways work best.

Then there's a little tail hanging off the bottom of the triangle. If you do away with even the basic laws of society, you arrive at anarchy, a system without government that somehow still runs in an orderly way. Which, incidentally, was what Karl Marx believed his extreme leftism would lead to. Those who advocate it tend to be smelly hippies, like Karl Marx. Science can't explain that.

Saturday, August 11, 2012

Publishing a Kindle book

Over Thanksgiving 2010, we went to Kansas to visit my family. While there, we went to an auction for an estate. I think it was my grandmother's cousin. There were several boxes of books, and we bought one. They were old novels, in hardback library editions. Swiss Family Robinson was in there, plus a couple of Horatio Alger books, and other, lesser-known things. One was a sort of memoir of childhood in Maine, A Great Year of Our Lives At The Old Squire's Farm, by C. A Stephens. Searching online, we found that most of the books were available from Project Gutenberg, but this particular one was not. Even a couple of other titles in his "Old Squire" series were available, but not this one.
We decided it would be nice if it were available, so I have been taking pictures of the pages, OCR'ing them, and then editing them into shape. I have finished 12 out of the 27 chapters so far. Assuming I get it done this year, I will dub it the "Centennial Edition", since the original publication date was 1912.
Since we have a Kindle, I will be publishing it in Kindle form on Amazon. Almost surely it will be free for a few weeks, to get some people to download it and write reviews that might make someone want to pay 99 cents for it, although I'm not sure I'll change it from free.
I'm not doing it for money; having people pay would just make me feel like there was some value in what I'd done. My primary interest is in being a little part of the vast community of people preserving these old works and making them available to new readers.

Tuesday, July 10, 2012

Killing Zombies

I like the games at Toge Productions, possibly partly because they've got a lot of zombies. In some, you create zombies; in others, you kill them. They made two games called "Days 2 Die", which are nice for being able to play a few minutes at a time. Take a break from whatever, and kill some zombies for a while.

The second of the "Days 2 Die" has a story mode that makes for a good game. It also has a "survival" mode that's more like the first game. I have used walkthroughs for other games, but I haven't seen a walkthrough for survival mode Days 2 Die: The Other Side, so I'm writing one.

I'm not a very good gamer, so if I can do this, pretty much anybody can.

Streets

Day 1

Buy: absolutely nothing in the shop. You have plenty of ammo, and your pea-shooter will do for now.
Barricades: set up two tables, horizontally end-to-end. You're going to stand on top of them, in the middle: move out to the side of one table, press "Start", and jump up on the table top and start shooting, before you even see zombies. Hold down the "E" key the whole time, which will repair your tables as you go. Your objective is to keep the zombies from destroying your tables as long as you can. Shooting them in the head kills them faster.

If they take them out, try to jump over zombies as they approach and keep away from them. Dodging zombies is not what you want to be doing, but you can do some of it in the first few days. After that, they'll kill you more or less instantly. Holding down the "E" key while on top of both tables, and shooting pretty well should leave your tables intact.

Day 2 + 3

Buy: nothing in the shop. If your tables are damaged, you can click the bulldozer in the barricates section and  click the tables to trade them in, then buy new ones. But they should be ok.

Exactly like Day 1, but it will be tougher. You might lose your tables and have to dodge. Good luck. Remember to hold the "E" key.

Day 4

Buy: the Desert Eagle .357 magnum. It's a much better gun. A single head shot is usually enough to kill a zombie. Remember to buy ammo! Get 200 or more rounds for it.
Barricades: Trade in your damaged table(s) and get two fresh ones.

Empty Building

Day 1

Buy: more .357 ammo. You want to have at least 200 rounds.
Barricades: None! There is a trick on this level. At setup time, go all the way to the left, where there is a pile of rubble. Jump onto the pile of rubble. The zombies cannot hit you here. Just make sure you're as far left as you can go, behind the sawhorse.

Stand there and shoot all the zombies. Goodies will pile up amusingly in front of you. It there's a lull in the zombies and you feel lucky, you can jump down to grab them, and jump back up.

Day 2

Just like Day 1, but you probably won't have a lull in the zombies. Save your money so you can buy a nice gun.

Day 3

Buy: the G36C machine gun, and 500 rounds of 5.56 ammo. Fun time! Be sure to equip it as your primary gun, and the .357 as your secondary.

Day 4

Buy: ammo so you have 500 rounds of 5.56. Fire away.

You will now be cleared to advance to the Back Alley, but you don't have to go there yet. You can choose the Empty Building again, and build up your savings. Or you can try going on.

Back Alley

Day 1

Buy: ammo, of course. Also, 3 grenades. Remember to equip the grenades as your Explosive weapon.
Barricades: Buy a stone wall, and place it horizontal, to your left. You're going to be near the extreme right of the play area. The door there does not spawn zombies.

Be sure to stand right up against the wall and keep holding the "E" key down while you shoot. If things get hairy, press "4" to choose your grenade and click to throw it, then choose "1" to go back to your gun. Sometimes grenades can blast zombies up onto your barricade. That's not good! So avoid using them if you can.

Day 2

Buy: restock your ammo and grenades.
Barricades: Two stone walls, horizontal, just like the coffee tables from the Streets. The zombies will get through one, but the second should hold out pretty well. You may find yourself having to dodge near the end.

Day 3

Buy: restock your ammo and grenades, then hire Louis the Merc.
Barricades: Two stone walls, horizontal as before, but leave a space between them where you can stand, but not big enough for Louis to follow.

Position yourself to the right of the barricades. Press Start, then jump onto the right barricade and walk to your space between them. Hold the "E" key down to make your barricade last as long as possible. When the zombies breach it, you'll hop over the second barricade and try to defend it. With Louis helping, you may find that the barricades are a lot easier to defend.

Day 4

Just like Day 3.

If you want to get high scores, at this point, you will re-play Empty Building and/or Back Alley. I don't have any strategies for getting past Burning Building.

While you're accumulating cash, you can buy some neat stuff. I really like the GLM32 High Explosive gun, which is 15000. If there's a horde mobbing your wall, you can clear them out with a couple rounds from this. And the Barret M82 sniper rifle is cool, because it shoots through zombies. You can shoot several at once, which is pretty handy when those axe-throwing zombies appear.

Tuesday, May 22, 2012

The Trayvon Martin Story

There are a limited number of story formulas for movie plots. We need a hero. We need a villain. We need plot twists. If we don't have all that, we're likely to find the movie unsatisfying. Maybe that's why so many people thought a rewrite was in order after the first draft of the Martin-Zimmerman story was submitted.

George Zimmerman's story was that he had been attacked and beaten by someone he was watching as a suspicious character, and that he had shot his attacker in self-defense. Too straightforward. And the villain is a kid. That's not very satisfying. There's got to be a hidden after-school-special to be teased out here.

How about this? "White racist predator hunts and kills black teen. Police assist in cover-up."

Oh, I can smell ratings, baby! That's a narrative that will get an emotional response. Let's run with it. Get some photos of Martin as a smiling little boy, and Zimmerman as a hulking inmate. Push the idea that Zimmerman outweighed Martin by 100 pounds. Mention "Skittles" a lot.

President Obama weighed in, suggesting that what Trayvon looked like is relevant to his status as victim. Good, good.

The storyline hit a small hitch when it turned out Zimmerman wasn't white. No problem, we'll call him a "white Hispanic" and roll with it. The media were on board. They have space to fill and a need to attract attention from the public to get money from advertisers. ABC pushed the notion that George Zimmerman "seemed" uninjured in the police station video. To help that along, they obscured the portion of the video where his head was most clearly visible.

Emotions got ginned up. People got beat up in Trayvon's name. An unrelated Zimmerman family got harrassed thanks to Spike Lee's tweet of their address. The New Black Panther Party called for a race war. And all the people who were wringing their hands over the potential violence of the Tea Party were completely silent.

To help things along further, MSNBC edited both the 911 audio and the associated transcript to make it appear that Zimmerman was racially profiling Martin. Actually, that was so easily exposed, their motivation may have been simply to become more like Fox News rather than to actually push the narrative. Nevertheless, it does suggest what narrative they favored. Those who criticize Fox News for such shenanigans were silent.

The New Black Panther Party helpfully put up "Dead or Alive" bounty posters offering $10,000 for the capture (or, it seems, killing) of a man who hasn't been charged with anything. The Tea Party phobics (including the Department of Justice) found this not at all disturbing.

While public pressure mounted for the Florida special prosecutor to charge Zimmerman, the Martin family's attorney (why do they have an attorney?) expressed their fear of his being a flight risk and asked for increased bail. He was in hiding, after all. It turns out there was no need: the prosecutor quickly came back with a murder 2 charge, and Zimmerman immediately turned himself in. At the press conference, the prosecutor promised that new information would be released about the case, but nothing new seems to have come from there.

More recently, new information did come out. It wasn't particularly helpful to the narrative. On the same day the the coroner announced that the only injuries to Martin were the gunshot wound and lacerations to his knucklesGawker asserted that Martin "was chased, beaten and shot by a self-appointed neighborhood watchman named George Zimmerman," in what was apparently the least successful beating ever. The speculation that Zimmerman initiated contact with Martin is continually asserted as fact despite there being zero evidence of it. Alan Dershowitz says the case has no merit and "The prosecution has already admitted that it has no evidence that Zimmerman started the actual fight."

Meanwhile, Mansfield Frazier wrote in the Daily Beast in favor of appeasing those who threaten violent responses.
"America can only dodge so many racial bullets, and a not-guilty verdict in this case could very easily turn the racial cold war into a very hot one."
He then goes on to argue for Zimmerman's lawyers to go for a plea deal, purely to prevent a violent response. Brilliant! "Justice" by expedience! Don't arrest the people promising violence, just give them what they want. They're not a problem, they're entertaining! Frazier dubs them "The Three Stooges." You don't arrest the Three Stooges! (Note: Ironically, a month later, he argues that the case must go to trial. He takes the opportunity to assert that Zimmerman initiated contact, but "Even if Zimmerman is found not guilty, if those dangerous laws are changed, society will have won a victory."  I guess he evolved.)

Thomas Sowell notes that we're not even reporting on race war activities as they happen. It appears the terrorists really have won, but they aren't the ones we were fighting.

Every bit of evidence says that the police handled this case fine initially. It is possible that some heretofore unknown facts will surface, justifying a murder two conviction, but it sure doesn't look likely. What looks likely to me is an acquittal, followed by violence. And far too many people see the former as the more problematic of the two. That is certainly the position of our Justice Department. Plot twist indeed.

Friday, March 9, 2012

Hypothesis: Red hair is a Neanderthal trait

They've constructed a Neanderthal model based on DNA. One finding: red hair.
http://www.dailymail.co.uk/sciencetech/article-1058538/Meet-Wilma-The-face-Neanderthal-woman-revealed-time.html

They have found that modern humans share 1 to 4% of their DNA with Neanderthals. Present-day Africans do not have Neanderthal DNA. This suggests to me that breeding with Neanderthals is responsible for a fair amount of the diversity of human morphology, including red hair and fair skin.
http://www.time.com/time/health/article/0,8599,1987568,00.html

Another recent discovery : redheads have different pain pathways. They are less sensitive to pain, and less susceptible to pain blockers. There's something genetic there, and my hypothesis is that it's in those Neanderthal-introduced genes.
http://gizmodo.com/5890532/redheads-feel-pain-differently-to-the-rest-of-us

Also, the redhead at the top of the Gizmodo article bears a passing resemblance to Wilma, the Neanderthal model.

Monday, March 5, 2012

You can read this in milliseconds

This is the second article I've seen lately that talks about how quickly something happens, and specifying the time in milliseconds. Yes, a millisecond is a short time. 400 milliseconds, though, is more appropriately referred to as four tenths of a second. 250 milliseconds is a quarter second.

Is it a matter of precision? I doubt it. I don't think that 400 milliseconds is exactly the amount of time that caused people to get exasperated with a page load. 390 was ok, but 400 wasn't? Not buying it.

Wednesday, February 23, 2011

Hysteria!

One of my friends on Facebook posted this link:
Do we need to have a full investigation when a woman miscarries to ensure she did not actually purposefully induce an abortion? If you're Bobby Franklin, a Georgia Representative, your answer would be "yes."
Well, if you read the bill, it doens't actually call for investigations. I pointed this out. The response from my friend:
Roy, I absolutely disagree. Read lines 118 through 120 of the bill. Determination of whether there was "no human involvement whatsoever" can only be made through investigation; it is implicit in the bill.
So apparently it's more dog-whistle hysteria. If reality isn't sufficient to gin up your outrage, find a way to read it as code for something more sinister. I said:
I think that is a possible reading, but an incorrect one, and one that would be impossible to implement. You don't investigate without probable cause.
yielding this response:
If a bill is that open to interpretation, it is insufficiently specific and therefore poorly crafted.
and, from another person:
Bills like this don't get written until they've been analyzed, strategized, etc., to a fine point. The fact that two people can look at it and find room enough to interpret it so differently is no accident. And history has shown that, when this is the case with legislation, the true intent of the legislation is usually closer to the more extreme, dire interpretation.
You see? It's all a conspiracy! They intentionally wrote it to be interpreted (though only by its opponents) as calling for investigations, although the bill itself never says "shall be investigated" or any such thing. My final reply:
I didn't say the bill is open to interpretation, I said it could be read incorrectly. The bill does not call for investigations. It simply doesn't. To say that it does, which your source claims, is a lie. If it's a lie you want to believe strongly enough that you find a way to believe it, that's your call to make.

I'm not saying it's a good bill. I don't know what it purports to address -- whether there's a legitimate problem of some kind, and whether this bill would address it. It doesn't appear that this thread is the place to discuss the bill, but just a jumping-off point for people to vent their political spleens.
I thought it might be fun to occasionally post pieces like this to my blog, as a reminder not to get so caught up in wanting to be outraged by the political opposition that I set aside all critical thinking. I will try to include similar pieces from the conservative side, for I know they happen, too, and that I'm more likely to be caught up in them.

Wednesday, November 24, 2010

Caroling

I'll be caroling with Master Chords at Bayou Bend on Dec 2, 9, and 10.
Details on the flier.

Thursday, October 21, 2010

70 pushups!

I've been doing my push-ups* in sets: 20 push-ups, hop up, rest 10 seconds, down and do 20 more, etc., for a total of 80 push-ups (my third rest period is 15 or 20 seconds). I think I've done them that way for two weeks now. The hope is, of course, that it will increase the number I can do all in a row.

This morning, I did a progress test, and there was definite improvement. There's always some variability in how many I can do, so it might range from 63 to 67, but today I did 70. I have never, ever, done 70 at a stretch. So yay. I'll keep doing the sets, and probably slowly increase the number per set.

*Hmmm...no hyphen in the title, but hyphen here. There doesn't seem to be a consistent version in Google.

Sunday, September 12, 2010

Can't Go Bach Again

At the end of the Bach choral season in the spring, we have re-auditions. This allows Albert (the conductor) to review what he's got, and compare it to any potential new members auditioning. This year, I didn't hear back from Albert in a timely fashion. Around mid-summer, I got a phone message from him asking me to call back. I did, and left him a message. Then later, another.

I took the fact that I got a phone call rather than an email as a negative sign. Not hearing back was another. Finally, I got the email that confirms that I'm not in the core group for this season.

Sigh.

Saturday, August 14, 2010

We All Deal Feet

We went to Ideal Feet today. As you may know, Shelly has been plagued with foot and back pain for years. I heard Ideal Feet's commercials on 740 KTRH (which, I have to say, is not the best place to find things to try) and I thought it would be worth looking into.

The first thing to say about them is we do not like the way they do business. Most notably (and you'll find this complaint if you web search) is that they have no money-back guarantee. No refunds. Their policy on this is
"Since our products are personal items we do not offer refunds. But should you have any difficulty wearing the supports we will adjust them for FREE!"
What? I should point out that an "adjustment" means you bring them back and they re-measure and give you a different size. And you can do that at any time, as often as needed. The point being, they don't mind taking them back, they just don't want to give you your money back over your dissatisfaction. So it might help to think of this as a service contract, and not merely paying $400 for a couple of pairs of insoles.

On to our experience: we were helped by Brandon, who is a nice guy, and when he's not in the process of delivering the company-mandated spiel, seemed to be inclined to be honest with us. He is a salesman, and was up-front about having no medical expertise.

The spiel, on the other hand, is unadulterated hucksterism. It consists of mentioning "aligning 26 bones and 33 joints" any number of times; a "balance test" that doesn't test balance, but purports to show that the insoles provide stability (but is really just a bit of trickery worthy of the Church of Scientology); and taking impressions of your foot without and with the insoles to show how the pressure distribution changes, which is the most honest (and relevant) bit.

Then came the fitting. He measured Shelly's feet— the significant measurement being the arch length— and took "2 seconds" (yes, part of the script) to go to the back and pick out the insoles for her. Shelly asked whether this was a one-size-fits all solution, and he said that, no, there are some 40+ sizes back there, very precisely sized by arch length (not arch height). As your feet adapt, your arch length can change, and you would then need to come in for a re-fit (i.e., exchange them for a different size).

The insoles are noticeable: there's a big lump right under the middle of your arch, which requires you to gradually work up to wearing them for extended periods. Shelly required that I go through the fitting, as well. I actually like the main insoles; the secondary ones (that you wear when you're not wearing your primary ones, to keep your feet from reverting) I did not like.

In the end, in spite of all the red flags, we got a set for Shelly. Desperation makes you try things that you would otherwise consider stupid. Maybe the company is counting on that. There is a chance that this is a worthwhile product, and that the company is just horrible about how they do their marketing.

We'll let you know. So in the meantime, feel free to go in for a fitting. Enjoy the spiel. But don't buy anything. Tell them you're waiting to hear how they work out for us.