• Anthony Stevens

Are You A Square in Flatland?

Philosophy

The whole of this chapter, “Of the Liberty of Thought and Discussion”, is concerned with the subject of truth.  And its single thesis is the total dependence of truth upon the free expression of opinion.  It is here that Mill developed what is now called the adversary theory of truth: the idea that truth results from a “collision of adverse opinions,” a “struggle between combatants fighting under hostile banners.” The first part of his argument is the most familiar.  Its basic proposition is that only by way of the freest expression of conflicting opinions can truth emerge.  No opinion can be justifiably suppressed because there is no way of knowing what is true until all opinions have been subjected to full and free inquiry.  To suppress any opinion is to risk suppressing what might possibly be true, or what might contain some part of the truth, or what, if not itself true, might contribute to a testing and understanding of the truth.  Those who would silence any opinion are guilty of the presumption of infallibility; they assume that “their certainty is the same thing as absolute certainty.”

- Gertrude Himmelfarb, “On Liberty and Liberalism: The Case of John Stuart Mill”.  Italics are the authors.  Bold is mine.

No Comments

Unfortunate Bootstrap Error

Web

Twitter Bootstrap is a popular HTML/CSS/JavaScript layout framework that is supposed to help you get up and running with a powerful, cross-browser website template really quickly.

The “quickly” part is certainly true – download the components, make the right references, and bingo! – but there’s a big problem, which I first found on a different website, but which I’ll demonstrate on Wishery.

Here’s the normal-sized site:

image

Here’s the site when I shrink the horizontal down by just a little bit:

image

Notice that the navbar items: Plans & Pricing, Support, and Blog – are gone.  Not wrapped, but just gone.

Here’s the site when I shrink the horizontal down even further:

image

Whitespace.  You’re dead in the water.

How this type of error got past the Bootstrap developers is sort of beyond me.  I can’t fathom that this is by design – it has to be an oversight.

No Comments

The utility of knowledge

Personal, Philosophy

Was Voltaire an anti-semite?  I submit, for the moment, that it doesn’t matter.  Or that it does matter, but only in an academic sense. I’m unfortunately drawn into a little internal battle with myself over the utilitarian theory of knowledge.

To wit: knowledge is good only insofar as it guides today’s actions.  Should I eat these carrots?  Should I run those three miles?  Should I spend two hours working on this startup idea?  Should I go to this friend’s party?

And what is the point, the purpose, the intention of those “should” statements?  Is it personal happiness?  The greater good?  The health and well-being of those we care about?  I don’t know.  I suspect that the purpose of our actions is ultimately a personal choice – from selfish, to communitarian, or something else entirely.

Utilitarianism, on the face of it, seems absurdly reductionist.  I would like to think that there is a case to be made for “knowledge for knowledge’s sake”, even if the link between said knowledge your goals is either tenuous or impossible.

Does the possession of knowledge make one happy?

Hm.

Or, can the possession of knowledge help guide future actions to make oneself happy (or establish the greater good, or provide for the health and well-being of those you care about, etc.)?  I think yes.  I’m reminded of the assertion “those who cannot remember the past are doomed to repeat it”.  Does a supposition about the worldview of an 18th-century writer and philosopher help guide my actions today in a way that helps me achieve my goals?

The purpose of one’s actions is a slippery concept for me.  We would, I suppose, like for all of our actions to be positive; all contributing to the happiness of ourselves and others; all actions directly relatable to a desired goal.  However, in practice we know that this is not the case.  We do things that harm ourselves and others; that we know will block us from our goals; that seems stupid or bizarre or self-defeating or isolating or irrational.

Maybe the question is, how do I use the knowledge I accumulate to help tip the scales slightly in favor of a positive outcome, knowing that perfection is impossible?

(n.b. For the record, based on his writings, I conclude that Voltaire was indeed an anti-semite, if a lazy one).

No Comments

Book Review: Rousseau’s Dog

Philosophy, Reviews

Rousseau’s Dog, by David Edmonds and John Eidinow, is a small book, an unpretentious book, a short-hop-from-Seattle-to-San-Francisco book.  It tells the story of a minor conflict between the title character, Jean-Jacques Rousseau, and David Hume ca. 1766.  I had never read any prior biographical information on either protagonist, and I was pleased how the authors created a sense of character that infused the storyline.

Both were philosophers, men of letters, of thought, but wildly divergent in character: Rousseau the sensitive, suspicious, hermit; Hume, the rational, reasonable, yet oddly mendacious man of bonhomie.  Both were tremendously popular in their time, Rousseau for having written Émile, On the Social Contract, and others; Hume primarily for his six-volume The History of England – not yet known in the main for his classics of philosophy, An Enquiry Concerning Human Understanding and A Treatise of Human Nature.

The imbroglio at the heart of the story is almost so inconsequential as to barely even merit a description; and it’s also, ironically, hard to explain. Rousseau, ever goaded by his innate paranoia (the “dog” of the title), became convinced of a plot to besmirch his reputation, and, further, that Hume was central to said plot.  Of course there was no scheme; but as with many things, where there is smoke, there’s fire, and Hume was involved in minor ways with several incidents that fanned the flames in Rousseau’s mind.  A forged letter from the King of Prussia, written by a English expatriate in France, but containing a barb that originated with Hume.  A white lie about a coach from London to the countryside.  An unfortunate but totally innocent connection between Hume and one of Rousseau’s chief persecutors in Geneva.   A quip here, an omission there.

All is overreaction, and it’s interesting to read the letters urging caution and clear-thinking on both sides.   This all might have faded into nothing had not both Hume and Rousseau been among the most celebrated men of letters in Europe in their time.  Tabloids – that yellow boil on the backside of journalism – served as outlets for anonymous rejoinders, ripostes, barbs, and witty commentary that helped ensure that the feud lasted longer, and became more public, than either might have hoped.

Hume, for his part, had heard that Rousseau was writing a tell-all chronicle (what I believe would later become the Confessions), and, against the advice of his friends and advisers, rushed to publish

A Concise and Genuine Account of the Dispute Between Mr. Hume and Mr. Rousseau; with the Letters that passed between them during their Controversy. As also the Letters of the Hon. Mr. Walpole and Mr. d’Alembert, relative to the extraordinary Affair.

I kid you not about the title.

My takeaways?  Be aware of one’s own sensibility, especially insofar as imputing motive to others; the machinations of the mind are quick to find patterns where none exist.  Also, to be virtuous and honorable even when speaking with close friends, behind closed doors; it does no good to have a laugh at another’s expense, and can perhaps even lead to (minor) dishonesty.

The book was interesting enough that I’ve picked up another volume from the period, Voltaire’s Philosophical Dictionary, which I’m eager to dive into.

No Comments

Shades of Grey

Teaching

First, an aside – is it “grey” or “gray”?   Grammarians will probably tell me “either”, or “either, depending on context”.  It’s weird that there are two spellings for exactly the same thing.  Is it my computer science background that causes me to chafe a bit at that?  I’m trying to remember a situation where, in a programming language, two keywords meant the same thing.  Hm.  Drawing a blank, but then again, I don’t know Perl all that well *zing*.

All you have to do is read English literature prior to about 1770 to know that multiple spellings were common, and it was fine.

OK, to today’s question: I taught Cloud Computing this past winter quarter at the UW PCE.  I owe you all a blog post about my teaching, which is yet to come, but today I got notice that a student who had failed was appealing, yet again.  Well, technically, it’s not a fail, but a “USP”, which I think stands for either Unsatisfactory Progress or Unsatisfactory Performance.

At any rate, he was one of three.  One of the other two dropped out midway through the quarter, and the third was unable to continue for some reason I don’t know and knew she was going to get a USP, but took her pill.

One particular student, however, escalated.  He first escalated to one of the program people at the UW, then to me, and I declined his request. I won’t rehash the details, but I was firmly convinced that he exhibited USP-level work.  He then escalated again to someone else in the UW, and I had to defend my decision, which I did.

Six weeks later, he is escalating yet again.

Ugh.

At this point I’m tired.  I’m wondering why he cares so much, when he (to my mind, at least) didn’t particularly care DURING the quarter.  My natural instinct is to stick by my guns, but the truth is I’m not that invested in his grade.  If he passes, so what?  As a teacher, did I sign up to be a gateway?  Am I required to defend my position to the death? (metaphorically, of course).

Today’s answer: no.  I taught, and I loved teaching, and nearly all of the students responded positively, and learned a thing or three.  If one person didn’t, and wants to abuse the system to get a credit that I don’t particularly think they deserve, then perhaps that is just the way things should be.  The squeaky wheel gets the grease; the complaining student gets the credit.

He goes on my do-not-hire list, however. Winking smile

1 Comment

Scripting Forefront TMG Load Balancer Draining

Software

So this is kind of cool.  Part of my recent infrastructure work involved setting up a remote deployment system, which seemed to work pretty well.  There was a gotcha, though: the “money shot” in the web site portion was a simple cp (Copy-Item) from a staging folder to the “real” folder, which meant that, for the couple seconds that the copy was happening, as the worker process was restarting, that users could get weird errors, including 404s and 500s.  Not that probable, perhaps, but not good.

The next step was to take a look at our Microsoft Forefront TMG (Threat Management Gateway) servers.  We have two of them, a primary and secondary, to which an NLB (Network Load Balancer) directs traffic based on remote IP address.  Each TMG server, in turn, can direct incoming HTTP requests to one of multiple web servers in a web farm.

TMG has the concept of draining connections.  Draining, in this context, essentially means that you want to prevent new connections from hitting a particular server in a web farm.  This is exactly what we want, but in an automated fashion.

The idea this week was to try to script TMG to drain all connections to Box A before we actually deploy; then, after we confirm that we have a good deploy, do a “resume” of Box A – essentially telling TMG that the server is good to put back in to the rotation.

So, first of all, TMG is only scriptable via a COM interface.  Ugh.  I hazard that this is due to the ISA Server legacy behind TMG; but that, in 2012, a Microsoft product is not directly scriptable in PowerShell via cmdlets and managed code is sort of a pain in my rear.

Whatever. I can get around that, using:

PS> $obj = New-Object –ComObject <whatever>

In this case, the <whatever> is FPC.Root, which is the root node in the TMG object hierarchy.  From there you can drill down through .Arrays to .RuleElements to .ServerFarms to .PublishedServers and call the .DrainStopped property on the server in question, followed by .Save().  Interestingly, you can’t get where you want to go via the Policies route, which, if you look at the TMG Administration GUI, you would naturally think is the case.

An even more interesting tidbit: when running PowerShell scripts interactively on the TMG servers, using RDP, the hierarchy reports slightly different information than when I use PS remoting to run a remote script on the TMG server.  I noticed this because I started out using our secondary TMG server as the remote script host; but it was reporting back errors like this:

0xC00403A1 The property or method Save is not supported when the configuration is stored only on the local computer.

When I ran the same code interactively on our secondary TMG server, it worked.

And, when I changed the remote script host target from our secondary to our primary TMG server, that error went away.  Weird.  It’s like the object instantiation is context-sensitive and knows that if you are running on the primary TMG server, it can apply .Save() globally, or universally, if you will.

At this point I have the deployment script draining and resuming connections, but our local TMG expert pointed out that there may be a lag in synchronizing the “Drained” status between the two TMG servers, so I need to add a little wait block in there that makes sure that after I call Save() on the Drain or Resume request, that we don’t proceed until both TMG servers know the status and stop accepting new requests for a given web server.

Finding good information on how to script TMG on Google was plenty difficult.  Finding information on how to script TMG using PowerShell remoting was even more difficult.  I’m hoping that this post helps steer some people the right way.

No Comments

Odds and Ends

Personal

Last week flew by – I was heads-down most of the week on some stuff that required a lot of concentration, which probably helped.  I was in the “flow state”, if you will, and got a lot accomplished.  It felt good.

This week I feel like I need some creative stimulus, an outlet, a change of scenery, something.  At least I have a good book that I’m about 2/3 of the way through; that’s a start.  Unfortunately, it’s non-fiction.  Fortunately, it’s *about* creativity and creative types; so … net win?  Slightly?  (The book is called “Rousseau’s Dog”, by the way, and is an entertaining little history about Jean-Jacques Rousseau and David Hume in the 1760’s.  Ah, the lost art of letter writing…it’s all I can do to send a postcard these days.

Baseball game last night.  Called after 3 innings because the other team got cold toes.  Who knew that there was a “10-run rule” that you could invoke when your team is only ahead by 9 runs?  I was the official scorekeeper so I know these things.  I don’t think anybody minded too much – as all Magnolians know, the wind that comes hurtling down the playfield in the late afternoons can be bitterly cold.

Will went 0 for 1 with a walk, and the 0 was a strikeout caused by the pitching machine throwing forehead-high.  Grr.  It’s a machine; it responds to your commands; get it right.

Next home game I’ll probably ump again. I’m learning that the two key things about being and umpire are (a) being loud and (b) being clear.  It’s your field; by being loud and clear you help move the game along and give everyone that sense of security they want from a well-managed game.

Audrey went 4-for-4 in her last softball game.  She’s a good little athlete.  As she develops strength she’s going to be more and more successful – right now she’s still in that long, lean, wispy stage.

I’ve got about 50 emails piled up in my Read/Review and/or Follow Up folders. Ugh.  Last week, again.  I need to schedule time each day for email maintenance, rather than just “find” time.  First thing in the morning is bad, because it’s when I’m most productive; end of the workday is bad, because I’m usually trying to make it to practice or some event or other.  Evenings I’m usually not eager to jump on the laptop.  Hm.

Saw a very forgettable movie on pay-per-view the other night.  Cowboys vs. Aliens.  Don’t watch it, if you haven’t yet.  I’m excited for the new Avengers movie and may try to find time to get away and see it in the theater.

Of course the main thing I’m looking forward to is the FA Cup final this Saturday between the mighty heroes of Liverpool FC and the low, mean, despicable simulationists of Chelsea FC.  I don’t think I’ll be able to watch it live (baseball again), but maybe the replay at 5 PM.  GO REDS.

No Comments

Continuous Deployment

Software

So my challenge this week (well, one of them) is to figure out a source control model that supports Continuous Deployment.  Continuous Deployment is, of course, the operational model whereby changes to code get deployed automatically (or nearly automatically, for the risk-averse) several/dozens/hundreds of times a day to production environments, in response to a change in the source code or resources or configuration values or persistence structures.

The simplest workflow is:

  1. Developer commits a change to source
  2. A continuous integration server picks up the change from the VCS, and runs one or more builds
  3. The builds pass all the tests
  4. The CI server or some other process picks up the build artifacts and pushes them to production.
  5. Repeat!

It gets a little tricky when trying to design the proper VCS workflow.  In days past, I’ve worked in a slower environment that was very attentive to VCS workflows, and our process revolved around the so-called stable trunk paradigm: features were developed in branches, and then, during a period of several hours, some manual steps were run to merge tested changes back into the trunk, which was then branched to a “release branch”, from which the actual deployment artifacts were produced.  During subsequent feature development, if any production bug were discovered, we’d fix it in the release branch, and merge changes back to trunk and then to all open feature branches.

It worked well, but when faced with the goal of Continuous Deployment, stable trunk seems to be untenable.  Automatically managing 3 open release branches per day, 2 of which would be rendered obsolete, seems like a pain in the ass.

So, unstable trunk?  Trunk always contains releasable code?  That makes my gut churn a bit:

  • Release A
  • Developer “Hacky” commits changes A’, which fails some tests
  • While A’ is building and testing, a bug is discovered in A, which requires a fix A’’ to trunk.
  • We can’t release A’’ until Developer “Hacky” fixes her problems in A’.

Well, we could, but the mechanism would be back to feature branches, where each feature is developed in a branch, and when done/tested/passed QA, merged back into the trunk.

I still don’t know how to avoid that period of a few minutes where the merge has occurred, but the tests have not yet been confirmed as passing.  If we need to fix a bug in production RIGHT NOW that seems like a weak spot, unless we introduce something like:

  • branch trunk T to T’
  • merge feature branch into T’
  • run tests on T’
  • merge T’ back to trunk T

but, if someone has committed to T in the meantime, what do you do?  Run the whole process over again, I guess.  I gets to a point where it’s turtles all the way down.

One thing CD seems to eliminate from discussion is the promotion model, where a human is responsible for deciding when code gets promoted from staging to production.  Or, if you have that model, it’s automatic and implicit in the deployment process.

It also means – I think – that you should have feature branches for bigger features, whose code you don’t necessarily want to push to production until the entire feature is complete.  I know there’s a whole sub-literature on the topic of introducing “hidden features” into production, which are either partially complete or outright broken, but I don’t like that.

I found a couple articles on Continuous Deployment very worthwhile:

A short non-technical article about Etsy’s CD setup, written by Fred Wilson

The key takeaway from this was that we don’t roll back failures, we fix them.  That’s interesting.  The calm, dispassionate, conservative part of me quails slightly at the thought of not having the ability to rollback, but…maybe?  Maybe?

Eric Ries’s “Continuous Deployment in 5 Easy Steps”

This one has an interesting dimension: stopping the line via a commit check script, e.g. if a build breaks, stop all new commits from happening.  VCS-wide, no less.  That seems a bit heavy-handed, but it probably results in a very disciplined approach from developers prior to committing anything.  To the detriment of speed?  Maybe.  Hm.

Timothy Fitz on IMVU’s Continuous Deployment process

He talks a bit about a personal bugaboo of mine, the intermittently failing test.  I HATE those, and I don’t use the word “hate” lightly.  I have spent many man-months of my life figuring out how to write tests (and thus, code) that doesn’t mysteriously blow up in the presence of weird input or context, and I like that he (correctly) notes that as the CD process scales, you MUST address this issue or you will be a dead duck.

No Comments

Bats Alive

Kids, Personal

Tuesday night Will had a game against Magnolia Rotary Tuesday night, in light rain.  The field was dry, since it started raining only once the game was underway, and we got five innings in about two hours and ten minutes.

This was the first game that the kids, as a team, really hit the ball consistently and well and several had hits to the outfield.  As you can guess, these hits brought out the enthusiasm in the dugout – not much beats a big offensive display when you’re eight years old. Smile

Will was the starting pitcher, and like most of the kids in their first-ever outing, had problems throwing strikes.  He’s overthinking things.  Still, I was very proud of him for getting out there in the spotlight, and trying hard to use the techniques that the coaches and I have been teaching him.

For the third time, I worked the pitching machine for our team after the first two innings of kid pitch, and I’m getting a good idea of how to tweak the machine ever-so-slightly to get the right pitch for the player.  There’s a little screw tensioner with a spring just below where the ball sits on the swing arm that has a big effect – a half-turn can cause a foot’s worth of difference at the plate.  Also noticeable is the effect if the rear of the machine slides even a half-inch left or right – this can mean the difference between a ball straight down the middle vs. one that’s off the plate.

Practice tonight – not sure if it will happen with the rain – then pictures at 8 AM (!) Saturday morning, then a game at 9 AM.

I’m really having fun so far this spring and I think Will is too.

No Comments

Mini-Rebase

Personal

There’s a “thing” in Git called a rebase which allows you to place items in new locations, as you wish.

I need a rebase.

Proximal cause: I’m sick.  I hate being sick. I’m a bad sick person.  I whine, I moan, I think my life is about to end, I’m unfocused and cranky and self-pitying.

Less proximal cause: I don’t think I’ve quite adjusted to my new schedule yet, with the new job and the new baseball & softball seasons.  Baseball and softball is a huge commitment, and I’m not doing the drop-off thing; I’m at every practice I can (which is most); I’m helping coach Will’s AA team; and I’m also volunteering for scorekeeping and umpiring as well.

Work-wise, it’s been a much more steady schedule than I’ve been accustomed to: get in early, but stay at the office til 3:30 or 4:00 PM every weekday, with not a lot of work on the weekends.  Thankfully, not too many meetings, but there are the usual team lunches, sprint retros, technical discussions, etc. that essentially mean I’m tied to the chair during the week.  I’m used to much more flexibility and weirder hours, even if longer.  Sitting in a chair for two four- or five-hour stretches for five consecutive days just isn’t quite what I’m used to.  For team-building, it’s great, and I could probably spin off a long thread about optimal work schedules, locations, and environments to build team morale and cohesiveness, so I can’t complain.  I just need to get in the right mindset that I’m a “day job” guy now (for the moment?)

Part of the fallout from feeling like I’ve not quite adjusted to the schedule is that I’ve felt a half-day behind almost from Day 1.  Each couple weeks, I look at my progress and I feel like I should be a half-day ahead of where I actually am.  Am I less productive, or am I just doing a (relatively) poor job of estimating?  Dunno.  I’m not used to that feeling, however.  It sorta sucks.

I’m really liking the infrastructure stuff I’m working on, particularly the build and deployment scripts in PowerShell, MSBuild, and TeamCity.  It should be pretty slick when I get done (in a half day).

Baseball is in a little lull.  No game until next Thursday for Will and a week from tomorrow for Audrey.  That said, there’s still plenty of practices Saturday mornings and two afternoons per week.

I think I need more ibuprofen.  My neck hurts.  Womp womp.

No Comments
« Older Posts