Linode + GoDaddy - 1and1

I have never liked, but I had a good package deal from their early days and so continued to use them for small web sites and applications. Yesterday, I went to add support for a new domain that I bought at GoDaddy and I could not figure out how to add hosting for an external domain. While the feature might be in the interface it was sufficiently impregnable that I gave up looking. It was also the last straw for me and I have started to move all my sites to Linode and my domain registrations to GoDaddy. Both GoDaddy and Linode have gotten better over the years and so am comfortable with the transfer. Now for the work.

Update: Done! (And quite expensive in the end due to too many domain names I seem to want to keep.)

Starting a miniatures wargaming club in South Kingstown, RI

I would like to start a miniatures wargaming club in South Kingstown, RI. I am interested in many periods with battles or skirmishes fought on the land, in the sea, and in the air. At this time I have dark age figures I use with Saga and so am most keen on playing more of this game. I am currently building ancients armies to play To The Strongest and steampunk factions to play In Her Majesty's Name or Gaslight in 2016. I am also interested in Napoleonic fleet battles, modern guerrilla skirmishes, and non-historical miniature games such as Games Workshop's Lord of the Rings, and space battles using Starmada, Star Wars X-Wing, and Star Wars: Armada.

My plan is for the group to meet at the Kingston Free Library's Potter Hall twice a month during the week, starting around 6 PM and finishing up around 9 PM. I suggest that we commit to always having 2 regular game rules played and adding others as wanted.

If you are interested in attending a planning meeting (online or in person) please contact Andrew Gilmartin at or at 401-441-2062.

Update: The club now has a web site at Great Swamp Wargamers.

Tim Cook is right

There has been a lot of criticism of Tim Cook's 60 Minutes comment that the US lacks the vocational skills to host the scale of manufacturing that the Apple has in China. The commentators that I have read do not understand that for every multiple of manual laborers you need a skilled laborer. A manufacturing line does not work without having skilled and experienced designers and maintainers. The less manufacturing that happens in the US the less we have those skills and experiences. Not to mention the concomitant need of local suppliers of raw materials, parts, and consultative or otherwise specialized skills. The world might be a global market, but manufacturing is a local activity.

For a specific data point, look to your school district and see how much vocational education is being funded. Do you see that where once your school district had its own vocation school or track in High School and now that has been replaced with a single regional vocational school? Do you see that the remaining high school "shop" classes in High School metal, wood, automobile, etc have been underfunded and full-time faculty are now part-time? Do you hear the school administration's mantra what "fewer students want this education" and then ask yourself, "why would this generation's interests be vastly different than any previous generation's interests?" We see the same mantra and consequences in music, the visual arts, and the performance arts programs.

Tim Cook is right.

Re: Suggestions on best practices for school web sites

I wrote Suggestions on best practices for school web sites 6 years ago and it is still pertinent.

Incompetent formaters

Grumble. Why do people spend so much time and energy on making documents or presentations look good when they are not competent to do so? Just stick to the style guide and spend the time and energy making sure the content is accurate and the form appropriate.

(In the 80s I worked with many very smart people who needed help getting their content out of overly formatted hell. I find it despairing that every generation has to repeat the same information delivery problems of the past.)

El Capitan and horrible glyphs

I spent a day upgrading my MacBook Pro from Mavericks, OS X 10.9, to El Capitan, OS X 10.11, and then downgrading it back to Mavericks. I needed to downgrade my OS back to Mavericks as the system fonts on El Capitan produce horrible glyphs on my older external monitor[*] and, further, my 52 years old eyes were not able to adjust to the high contract between the visual strength of the background and the visual weakness of the glyphs. No amount of hardware adjustment or software calibration resolved the problem. Apple's visual design drive to near invisible text -- on OS X and iOS -- is going to push me away from their products.

[*] Acer B243H 24" Widescreen LCD Monitor

Bundling a Java tool into an OS X application

A quick reminder to myself about bundling a Java tool into an OS X application.

Directory structure


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "">
<plist version="1.0">


APP_DIR=$(dirname $(dirname $(dirname $0)))
APP_NAME=$(basename $APP_DIR .app)

$(/usr/libexec/java_home -v 1.8)/bin/jconsole \
-J-Dapple.laf.useScreenMenuBar=true \
-J-Dapple.awt.antialiasing=true \
-J-Xdock:name="$APP_NAME" \
-J-Xdock:icon="$APP_DIR/Contents/Resources/Application.icns" \"$APP_NAME"

The Melting Pot Anxiety

My company had our year end lunch at The Melting Pot. While I did enjoy our lunch the long drive home had me thinking
  1. I had to cook my own meal!
  2. How much bacteria sharing happened?
  3. When is the salmonella poisoning going to set in?
I doubt that I will be returning.

Comments (not given) at last night's School Committee meeting

Here are my intended remarks to the South Kingstown School Committee yesterday (Dev 8). Due to the meeting running late I was not able to stay until the Community Comment portion of the meeting. (I left at 9:30, some 2 hours into the meeting.)

Good evening,

When I have first considered speaking at tonight's meeting I intended to address the Strategic Plan. I wanted to raise concerns that the Plan does not address long term financial planning, long term physical infrastructure planning, nor long term technology infrastructure planning -- a rapidly increasing and continuing cost.

I was hoping that today's agenda would have an updated Plan that at least addressed adding an historical perspective on the changes with regard to the 2010-2015 Plan. This perspective was requested at the last SC meeting by committee members. Unfortunately, the agenda does not include a copy of the Plan and so I have to assume that it has not changed.

But then I realized how large the meeting's agenda was and I wondering how a 3 hour meeting was going to cover

  • Dual Language Initiative,
  • Late Start Survey Results,
  • PARCC results,
  • Grading Policy,
  • Strategic Plan,
  • Resolutions to the General Assembly,
  • the recognitions,
  • the pro forma actions,
  • ...

Any one of these subjects should be expected to have significant discussion and take up many hours. And for the community we can not address the SC for more than 3 minutes. 3 minutes to cover 8 subjects with all their entangled details. I clean my teeth for 3 minutes. How can I or anyone else speak to the agenda's issues in such a short time?

How can I ask for a statement of the progress of replacing Simone Palmer's role of 1:1 leadership and STEM coordination?

How can I point out that the proposed grading policy does not allow for summative grading range that does not have a zero? That is, it has no bottom.

How can I point out that the PARCC results speak to a very bad test design and a very bad vendor review?

How can the HS score of 29.5 in Math and 38.3 in Literacy be anything but a dismal showing even in relation to other school districts?

How can we have wasted so much instructional time, money, and energy on PARCC?

So I have decided to address the issue of pacing for the SC meetings.

My understanding is that the Thursday before the public meeting the chairwoman and the Superintendent set the meeting's agenda. Why pack in so much? The SC members non-verbal communication, body language, clearly reveal the weight of the material to cover.

Is there too much to cover in the number of scheduled meetings?

Luckily, the 2016 Meeting Schedule is is also on tonight's agenda. This schedule is notable for its lack of information on the known work for the 2016 year's meetings and the number of open time slots per meeting. This seems to be a minimum aid to help guide the pacing of the SC's work.

Let's not bump the Strategic Plan from its next meeting, its 3rd "first reading" meeting.

Thank you for your attention this evening.

Educationally, the buck stops here

I attended last night's School Committee meeting and it is clear that South Kingstown parents like the new Dual Language Instruction. If ever there was a program to rally around for next year's elections then it is this one. In contrast, all the 1:1 technology stuff is meh.

Three times during the DLI discussion SC members implied that the Town Council that would ultimately decided on DLI's expansion into all the elementary schools. One member even said "they are your elected officials." Wait! That's wrong. The SC are our elected officials to make decisions about educational goals, policies and the budgeting to make them happen.

Now, I don't actually believe the SC members were trying to distance themselves from this responsibility at all. The SC unanimously supported DLI. What I am sure they were trying to say was that they will make it happen, but with new programs its is very helpful to have community support at the joint TC & SC budget meetings. Unfortunately, it has been my experience that most people don't understand that the TC has NO role in making education decisions. Their only legal role is to transfer tax money to the SC. The SC needs to continually clear up this misunderstanding. Perhaps they need a big sign behind them that says

Educationally, the buck stops here

Matt Caron's primer on hunting and weapons

A fews days ago I posted a statement that gun type should be restricted and purposeful. Matt Caron has kindly give me (and y'all) a primer on hunting and weapons used. Very helpful to understand an issue that is so often debated in the absence of facts. Please do take the time to read his comments.

Update: Matt has posted an updated version of his comments to his own blog at A primer on what constitutes "common" firearms in various market segments.

Limit the gun types and not gun owners

I don't object to the principle of owning a gun. I don't even think the right to gun ownership should be linked to 2nd amendment. In the USA you have the right to something unless it is explicitly taken away. What I do object to is ownership of a gun type that has no reasonable civilian use. If you want to hunt then you can get the rifle or shotgun agreed upon for this purpose. If you want to range shoot then you can choose between the handguns agreed upon for this purpose. If you want to defend your family and homestead then, again, you have a limited choice. Every other type of weapon is unnecessary and should be unavailable. Our government limits a lot of stuff and, more often than not, they are useful limits. I want my government to limit the types of guns and, far less so, limit who can own guns.

JSTORE Daily and my expending awareness of my ignorance

JSTORE Daily is a great source of short articles referencing scholarly work related to the news of the day. I highly recommend subscribing to it. Today's article about the planned parenthood killer exposes that for most evangelical Americans God's grace is received based on faith alone without regard or dependence on good works. The faithful is with sin until grace is given and so he or she need have no moral code. I find this very disturbing. And further evidence of how little I know about the worldview of the people of this vast country.

Where are the ducks? Update

I spoke with Terry Murphy of the South Kingstown's municipal Parks and Recreation department today for an update on the disc golf course at the Curtis Corner athletic fields. DEM has advised them that the island should not have been used for a course hole nor should it have been bridged. The course hole has been removed. The bridged will be removed within a few days. The DEM said that the Town should just let the island return naturally to its previous state. And I hope the ducks return.

The DEM and Town are also reviewing other disc golf hole locations around the pond that would be in violation if built.

Terry also said that the Town is will not be continuing to clear the understory of the course. The design of the course calls for narrow paths connecting the holes. So, like the island, the understory will be left to grow back and for the needed paths between the holes to be shaped and preserved with normal course use.

Bash's process substitution

Oh to have been in the mind of the bash designer! Just when you think "Damn! This tool does now allow you to write to stdout." you remember bash's process substitution and write some-command input-file >(cat).


I was making a 3' × 4' board for our Saga game next month and I wanted most of it to be dirt terrain. So I searched for what people use for "dirt." Well, it turns out people do not seem to use actual dirt. Really!? Well, being a rebel, I choose to. I dug up some clay from the yard, baked it for an hour at 450 F so as to dry it and kill the bacteria, and then sieved it on to the board coated with near full strength wood glue. It worked out well. (I then sort of ruined it with coats of clear acrylic unevenly applied. Damn.) So, my question is, why don't people use actual dirt for dirt terrain?

Guidelines for presenting a document for discussion

The following guidelines are for presenting a document for discussion. They seem obvious, but it seems they are not in common practice in public policy fields, esp. the South Kingstown School District.

Revision number
What revision number is the document? The number should be (mostly) consecutive -- 1, 2, 3, etc -- but, when not, at least increasing. If an established document is being changed then consider using the software version system. Revision number must be in the footer of every page.
Revision date
When was the revision finalized? Use YYYY-MM-DD date format so as to avoid international date ambiguity. (Is "10/2/12" Oct 2, 2012 or Feb 10, 2012, or Feb 12, 2010.) Revision date must be in the footer of every page.
Revision history
Summarize how the document changed with each revision. The revision history is usually located in the front matter and presented as a table of revision number, revision date, revision authors, and revision summary columns.
Page numbers
What page am I looking at and how many pages are there in total? Page number and page count must be in the footer of every page.
Line numbers
Use line numbers to give the discussants a means to directly reference a portion of the sentence or the paragraph for discussion. Line numbers appear in the left margin of every page. Line numbers are consecutive across the whole document (and not just per page). It is common to only show every 5th or 10th line number. ¶ With online documents there are no fixed lines so use numbered paragraphs.
When content is changed change bars allow the reviewer to focus only on the changed content. With a long document, or one that has had intense discussion, not having to reread the whole document aids in moving along the document to completion. Change bars are usually placed in the left margin, but either is fine.
Table of contents
For a long document a table of contents, especially an annotated table of contents, is a guide to quickly understanding the overall structure of the document's content. A good table of contents can substitute for an executive summary.

Also of interest:

  • The International harmonized stage codes is a rather sophistated encoding of ISO's document development process. I just use WORKING (not yet draft), DRAFT (not yet final), FINAL.

Context and orientation for the draft strategic plan for 2015-2020

It was good to see so many parents at last night's School Committee meeting. Most were there to address the changes to the home schooling policy or in support of the dual language immersion program. Unusually, the chair (Maureen Cotter) asked that the parents addressing the policy change speak during that period of the agenda. I was not able to stay for that discussion: I really hope that all the parents were allowed to speak as as long as they needed.

The earlier part of the meeting was a first reading of the district's 2015-2020 strategic plan [1]. It is interesting to compare this plan with the 2010-2015 plan [2]. There no cohesion between the two. It is as if they were prepared for two different school districts.

During public comments I did ask for context to be added to the plan: What were the 2010-2015 goals achieved and goals unachieved? What are directions are we continuing in and what directions are we changing? I was heartened to hear Scott Mueller and Jonathan Daly-LaBelle​ reiterate this need. I was less hearted to hear Superintendent Stringfellow's defensiveness that this had already been covered in their retreats. She may have been speaking but clearly there was little communication. I have asked for the records from the July 21 retreat.

The draft strategic plan is a document for discussion, but its form does not aid that. I always find it bothersome when presented with a document for discussion that's content is not referenceable. Mr Mueller, nor any other Committee member, should have to fumble around to orient others to a specific part of the document. In a followup letter I noted that numbering lines or paragraphs is a feature of Microsoft Word and Microsoft Word is part of the $21,422.40 licensing fees authorized at the same meeting. Sigh.



How are branches being used? A visualization

I really like the terminal for visualizations. There is something in its restrictions that gives it the right balance of detail for rough visualizations. The fixed width font, the ASCII character set, the small overall grid, etc, all help. I wanted to see how our developers are using branches over the last 180 days. This script gets the branches log and outputs a chart for days that had checkins by each developer. Note that a day without checkins by anyone will have no column in the chart.

The code is

date1=$(date -v -180d +'%Y-%m-%d')
date2=$(date -v -1d +'%Y-%m-%d')

svn log --revision {$date1}:{$date2} $svn | perl -e '
  my %D = (); # dates
  my %U = (); # users
  while( <> ) {
    if ( /\| (.*?) \| (\d\d\d\d-\d\d-\d\d) / ) {
      my $u = $1;
      my $d = $2;
      $D{$d} ||= {};
      $D{$d}->{$u} += 1;
      $U{$u} = 1;
  my @d = sort keys %D;
  my ( $l ) = reverse sort map { length($_); } @d; # max length
  for my $u ( sort keys %U ) {
    printf( "%*s %s | ", -$l, $u, $d[0] );
    for my $d ( @d ) {
      print $D{$d}->{$u} ? "*" : "-";
    printf( " | %s\n", $d[$#d] );

Update: A failing of this script is that it only shows days with activity. Days without activity by any developer will be missing from the timeline. I replaced this script with this one
#!/usr/bin/perl -w

use strict;
use DateTime;

my $svn_url='svn+ssh://.../branches';

my $stop = DateTime->today();
my $start = $stop->clone()->subtract( days => shift @ARGV || 90 );

my %W = (); # week days
my %D = (); # dates
my %U = (); # users

# initialize the dates and the weekdays hashs with days between the start and stop dates
for ( my $next = $start->clone(); $next->compare($stop) <= 0; $next->add( days => 1) ) {
 my $F = $next->strftime('%Y-%m-%d');
 $D{$F} = {};
 $W{$F} = $next->day_of_week();

# collect the svn usage data
if ( open( IN, "svn log --revision \{$start\}:\{$stop\} $svn_url |" ) ) { 
 while( <IN> ) {
  if ( /\| (.*?) \| (\d\d\d\d-\d\d-\d\d) / ) {
   my $u = $1;
   my $d = $2;
   if ( defined $D{$d} ) {
    $D{$d}->{$u} += 1;
    $U{$u} = 1;

my @d = sort keys %D;
my ( $l ) = reverse sort { $a <=> $b } map { length($_); } keys %U; # max user length

# output the chart
for my $u ( sort keys %U ) {
 printf( "%*s %s | ", -$l, $u, $d[0] );
 for my $d ( @d ) {
  print $D{$d}->{$u} ? "*" : "-";
 printf( " | %s\n", $d[$#d] );

# output the line of mondays
printf( "%*s %*s | ", -$l, "", length($d[0]), "" );
for my $d ( @d ) {
 print $W{$d} == 1 ? "M" : " ";
printf( " |\n" );



Sometimes you wonder how you didn't know something for so long. In this case, it is using a conditional expression in conjunction with a for loop.

perl -e '$mx = $_ > $mx ? $_ : $mx for ( 1, 6, 2, 3, 5, 4 ); print "$mx\n"'

Early morning interesting readings 2015-11-03

Early morning interesting readings:


Tim's response to my question as to whether I should tear my hair out at home or at tonight's School Committee meeting:

Challenge them on their policy regarding reptilians and shape shifters vis a vis chemtrails.

"The Future of the News is [...]" without journalists

A colleague sent me this article written by the creative director of the New York Times Lab


What a load of crap. I can't believe that this creative director can be as uninformed as this article makes him sound. I am sure he has read lots about hypertext and other forms of prose or code reuse, so something else must be going on.

The role of a good journalist is to be able to create a new, coherent explanation of an event or circumstances as facts are continued to be found and updated. As a reader I am greatly appreciative of this story telling. Of having the news story structure and the facts in context of time and place. This is a skill that takes lots of practice. And it makes journalists expensive. "They" need cheaper workers. Since this is a people problem let's solve the problem, once again, with software.

Drones and remote infrastructure

I am very hopeful that the combination of drones, 3D printing, and information processing will combine to make a less intrusive infrastructure for our needs. That is, if you don't need to the build a highway to get materials and workers to a site to build a facility -- dam, bridge, breakwater, broadcast tower, etc -- the overall impact can be less and, moreover, hidden from sight. The whole job can be done remotely. Core77 has some useful information/videos related to this this week. See 4 Drone Projects Change the Comtemporary Landscape.

The downside, of course, is that vandals can also use the same technology to break infrastructure. I am currently waiting for the first instance of skyscraper graffiti.

Update: I did not have to wait long! The Drone That Will Change Graffiti: An Interview with KATSU.

Nihilist Password Security Questions


Innovation Powered by Technology education conference

At the last minute I decided to attend today's Innovation Powered by Technology education conference presented by RIDE. What I came away with was 3 really important facts.

The first is that SK has been foolish to go about its 1:1 initiate without first drawing insight and action plans from the many successes and failures of other RI districts. West Warwick, for example, has 4,000 Chromebooks since 2013 and yet we are struggling with 500 Windows 7 laptops.

The second is that the RI school districts do not seem to actively cooperate with one another on anything. When I asked what model could be copied from another cooperation I was met with silence. I find this very odd and sad.

The third was an unexpected reassurance from, of all places, Providence's Village Green Virtual charter school. (Think kids in cubicles. But read on.) The 4 presenters gave a very clear description of the school's methodology and its successes and failures. What was reassuring was that even with all the technology available teaching works best one-on-one, in workshops, and in interdisciplinary school-wide projects.

Oh, and a fourth fact. Never expect 800 people gathered in a single, concrete floored room, and seated at 100 banquet tables to be able to hear the presenters. The RI convention center really is a poor facility.

Where are the ducks?

Letter to the Town Council:

Where are the ducks?

I was distressed this morning to find that the Town has expanded the disc golf course at the Curtis Corner athletic fields around the small pond located between the tennis courts and the bike path. The peaceful walk in a small woods surrounding a pond with many its habitats is now gone. The island that once offered protection for several species of waterfowl is now vacant, having been cleared and bridged to hold a disc golf "target."

What once looked like

Now looks like

South Kingstown offers much in support of active recreation in the town. The "Parks & Recreation" department has quietly changed to just"Recreation." Not all recreation needs fields and equipment. Supporting a walk in the woods is a recreation and one that comes at almost no cost. This walk at Curtis Corner and the one at Old Mountain Field are the only 2 walks within the town. We are now down to 1.

I ask that you please reverse the expansion of disc golf course into the woods around the pond. (And not expand it further, elsewhere.) Remove the "targets." Remove the "tee boxes." Replant native underbrush. And leave it alone for a few years to recover.

Yours truly,
Andrew Gilmartin

"black eyes"

I have never seen this painting trick before. The figure's eyes are painted as though they were bruised, ie they have "black eyes." This really look effective on Dark Age folks. Source

I have a feeling that Matt and I would work together very well, but those around us would mostly like think our strong, perhaps heated, discussions as argumentative and determinantal to company health and moral. Wimps.

All government contractors to be restricted so that...

I had this crazy idea this morning. Got to share. I want all government contractors to be restricted so that

  1. The highest paid employee makes no more than 10x the lowest paid employee.
  2. No employee can have more than a 10% share of the company.
  3. The company is not to make more that a 10% profit.
  4. The employees have union representation.

Which answer goes with which question?

Gripe. In real-time group discussions -- Skype, Slack, HipChat, etc -- the interleaving of messages from the multiple participants will cause confusion when many questions are open and answers are given without context. Which answer goes with which question? So, when the question is "do we need to do X with Y" then answer "Re X with Y, yes" and not "yes". It takes so little extra time and, really, if you are that short on time then find another job where clear communication is not important.

It is easier to build a strong children than to repair broken adults

Original image can be found at INTRODUCING KIRSTEN RICKERT

Online texts for the introductory languages at the high school

My letter to the Superintendent regards 1:1 and online texts:

My son Owen is taking French II this semester. I asked why he takes his (heavy) French textbook to school when he could use the online version with his laptop. (As he could do in French I last year.) He said that French II did not have an online textbook. Student gossip was that the school bought Spanish textbooks instead. I asked Mr Mezzanotte about this and he explained that Spanish was now offered at the middle school (and so textbooks were needed) and that high school upperclassmen also take Spanish I and II and are without 1:1 laptops.

Spanish was 1 of the 4 1:1 pilot projects last year. This decision seems like a step backward and not a step forward for 1:1 at the high school. And, I would think, especially so for the pilot's teacher. An alternative would have been to send the Spanish I & II textbooks from the high school to the middle school, provide online textbooks for high school Spanish and French, and then provide laptops to the few upperclassmen taking introductory languages. Without addressing the mixed grade classroom any early success for 1:1 is really hampered.

What can be done now to provide online texts for the introductory languages at the high school?

"that's my work"

I was reviewing the changes in iOS 9 today. It was a bittersweet moment. What I was seeing were interactions and interfaces and coordinations that had I had so wanted to be involved with developing when I was 20. I am too far removed from the tools and skills needed to do this kind of work today. Perhaps I should just be glad that these tools exist and that I use them. It would have been gratifying to point to a patch of pixels and tell my family "that's my work."

Programming Language Checklist

Regards the checklist item "Shift-reduce conflicts in parsing seem to be resolved using rand()", I think I have used that language.

Printing duplex, again

This posting is mostly here to remind myself about printing duplex on a Mac. Without some tool to help it is almost impossible for me to remember how to allways be successful manually printing duplex on a simplex printer. Not finding a good tool, I wrote the following script. Place this script in your "$HOME/Library/PDF Services" directory as, for example, "Process for Duplex" and now your "PDF" menu in the Print dialog box will have a "Process for Duplex" option. When you select this option it runs this script.

What this script does is to separate out each page of the original PDF into its own file. It then joins all the odd pages together in ascending order (eg, 1, 3, 5, 7) into an "odd pages" PDF. It then joins all the even pages together in descending order (eg, 6, 4, 2) into an "even pages" PDF. Further, if there are an odd number of pages then the first even numbered page is a blank page (eg, blank, 6, 4, 2). This blank page is needed to force the last odd pages to be printed with a blank "back". The script then opens the odd and even pages documents in Preview for review and normal printing.

To print the document first print the odd pages. Take the printed pages as a group and place them so that the blank side is up and the top edge is placed at the head of the printer tray. (I have a Dell B1163w laser printer and it prints on the face up page in the tray in starting at the head. Your printer is likely to be different.


function split() {
   pages=$(/usr/local/bin/pdfinfo "$file" | perl -ne 'print "$1" if /^Pages:\s+(\d+)/')

   /usr/local/bin/pdfseparate "$file" "$dir/p-%d.pdf"

   # prepare the list of odd pages in assending
   for o in $(seq 1 2 $pages)
      O="$O $f"
   # join the odd pages into one file
   /usr/local/bin/pdfunite $O "$odd"

   if [ $((pages % 2)) == 1 ]
      # add a blank page to for the "back" of the last page
      base64 --decode --output "$f" <<EOH
      pages=$((pages -1))
   # prepare the list of even pages in descending/reverse order
   for e in $(seq $pages -2 2)
      E="$E $f"
   # join the even pages into one file
   /usr/local/bin/pdfunite $E "$even"

   # remove the intermediary files
   rm -f $O $E

# remove title and printer settings
shift 2

for f in "$@"
   dir=$(mktemp -d "/tmp/duplex-XXXX")
   split "$f" "$dir" "$dir/odd.pdf" "$dir/even.pdf"
   open "$dir/even.pdf"
   open "$dir/odd.pdf"


Update: Matt points out that monochrome, duplex laser printers are under $100 and so you really don't have to manually handle the paper. He is right. I just happen to have an almost new printer and so can't justify replacing it yet.

Rick Wormeli and standards-based assessment and grading

Last night I attended Rick Wormeli’s lecture in the Cumberland, RI. He was invited to speak and train at the Cumberland High School in the day and talk with the parents in the evening. He was bringing his expertise in standards-based assessment and grading. When I first heard about the lecture I thought, “Ok, I will go and listen to a Common Core advocate because I need to understand the opposition.” I expected to be annoyed throughout the lecture. My expectations could not have been more wrong.

When Wormeli says “standards-based” he is not talking about any particular instructional program. What he means is that the student will be assessed and graded only on evidence of mastery of the standards. It is not based on student behaviors, neat notebooks, hygiene, or other subjective judgments. To do so is “grade falsification” and that is unethical. (He raises the unethical issue often.)

With a standard everyone involved has a clear picture of what needs to be mastered and how the evidence of mastery contributes to the grade. How the student achieves mastery does not contribute to the grade. The path, as it were, can be different for different children. And it is the teacher’s professional role to find that path with the student. Thomas Guskey in Education Leadership asks of teachers “Is my purpose to select talent or develop it?” Clearly it is to develop it.

He advocates for rework. “When,” he asks, “is a professional evaluated on the average of his or her work over time?” When you pass your driving test on the second try you have passed the driving test. You have shown evidence of mastery. You are not told that based on the average of the two tests you will need to take and pass a third test so as to raise your average. What matters most is the current level of achievement and not the past levels. The same is true for students. If the student shows evidence of mastery of the standard then the student has passed. Formative tests and quizzes are to aid the student and teacher in evaluating progress towards mastery. They are not graded. They are diagnostics. It is only the summative tests that are. And these can be retaken/reworked.

He is quite formal with how he consent to rework. He wants to know when and how the student expects to spend their time to improve their understanding of the standard? This then becomes a contract between him, the student, and the parents. In Mr Wormeli’s class rework is not an opportunity to skip the preparation for the original test or assignment.

Wormeli state that the standards should be atleast school-wide if not wider. Without that there is no way to fairly accesses students. If Ms World’s History 101 class uses a different standard than Mr Universe’s History 101 then how can either teacher know that the student is prepared for Ms Congeniality’s History 202 class? All that the teachers know for sure is that the student was passed along. And that is all the administration knows. And that is all the parents know. The student, you can be sure, knows the truth.

Wormeli is a dynamic speaker. He has vast teaching experience at elementary and secondary schools. He seems to have countless experiences and examples to draw upon. He is funny, playful, and, when needed, skewering. He is also very well rehearsed.

He covered lots of other ground and had time, mental, and physical conditions allowed he and the audience would have remained in the auditorium well into the night. I do plan to follow up on his lecture by reading his writings and viewing the videos he has done.

Ongoing attacks on servers around the world

"The Norse Map is a Wargames-style visualization of ongoing attacks on servers around the world. Though it shows honeypots rather than actual private or government targets, the result is a live snapshot of trends in computer mischief."

Access protocols and availability contracts

I read Reference Lists and Tables of Content and skimmed the referred to Data Packages and Research Object Bundle 1.0 and came quickly away with certain opinion that the days of defining a static data collection specification have pasted. Clearly, where the data for a research experiment can be petabytes in size a static data set is unlikely to be passed around its community of interest. What is needed is a common access protocol for data.

Now there are many hundreds of such protocols in application today. HTTP is an access protocol and one with content negotiation too. The W3C has a boat load of specifications within the SOAP space that are relevant. The semantic web is another deep source. Even the now long in the tooth Object Management Group's CORBA specifications all cover the same ground.

The point of course is that we really don't need another green fields specification and especially one for static data dumps. Instead we need to agree to access protocols and availability contracts. Unfortunately, I have nothing more to add right now as it is not really my problem.

Remove formatting in Skype messages

Our development team uses Skype for messaging, voice conference, and screen sharing. It has proven itself a reliable tool year in and year out. Unfortunately, for a software development team it is sometimes unhelpful, especially when it mistakenly interprets data or code as emoji or formatting instructions. I assume that Skype developers use Skype for their communication too and so will have the same frustrations with it interpreting message text as our team has.

Skype's Preferences dialog does allow disabling emoji but not formatting (at least on the Mac). To remove Skype formatting in messages were, for example tilde means strike-through and asterisks means bold do the following

  1. Quite Skype, 
  2. Edit the file $HOME/Library/Application Support/Skype/shared.xml, 
  3. Replace <EnableWiki>1</EnableWiki> with <EnableWiki>0</EnableWiki>,
  4. Save the file, and
  5. Restart Skype.

Update: Blogger's editor seems to have similar issues!

True is true and false is false.

If you send me to code examples containing either of the following you are not going to be hired, ever.
test ? true : false
if ( test ) { return true; } return false;

Letter to SC about Blended Learning

My letter to the South Kingstown School Committee of my grave concerns about the administration's objective for Blended Learning in our schools. It is mostly a reworking of an earlier blog posting.

"programs you depend on are written by dicks and idiots"

Good programming rant Programming Sucks. Take way is "programs you depend on are written by dicks and idiots." Say it loud brother.

Blended Learning

Yesterday I had the opportunity to talk with the High School’s new Principal Robert Mezzanotte and the STEM Coordinator Simone Palmer. The purpose of the meeting was to provide fuller answers to my 10 questions to the Superintendent of a few weeks ago. The meeting went as one would expect. And, as in many meeting that includes people, it was the side comments made and comments missing that were significant.

The Principal said that the successful introduction of “Blended Learning“ was his first priority. Until a week or so ago I had not heard of Blended Learning. Or if I had, I had assumed the term was the new educational term for computers in the classroom. It is not. Blended Learning is an approach to achieving an end goal of personalized student education through the use of technology for instruction. Let me try to explain.

High Schools use the same method of instruction today that I had when I attended. A teacher presents the same instruction to all students sitting in formation facing her. In the Blended Learning community this is called Traditional Instruction learning.

Before I move on, keep this diagram handy.

From Traditional Instruction the instruction and learning will move to Macro Differentiated learning. Here the teacher teaches to groups of students in the classroom. Each group is composed of students at the same “content level,” that is, the  a group of kids that “get it”, a group of kids that “don’t get it” and groups of kids that “sorta get it.” The teacher made the decision as to the groupings. The teacher will rotate between the groups over the duration of the class period. The teacher continues to drive the instruction (short lectures to small groups) and the instructional materials are not expected or, rather, not required to be online. (The online part is an efficiency that becomes important later, so keep watch.)

From Macro Differentiation the instruction and learning will move to Micro Differentiated learning. Here the teacher works with more and smaller groups of students. Some groups contain just one student — the smartest and the dumbest. When a teacher is not attending to a group that group will be busy learning from instruction delivered online and assessed continuously online. Progress is a calculation without  allowance to character or circumstances.

From Micro Differentiation the instruction and learning will move to Individual Mastery learning. Here all students have individualized online instruction, tutoring, and assessment. The teachers are available for coaching as are their peers — that is student to student coaching. Each lesson is a step in a chain without variance. Only the speed that the student moves along it is different. To be fair, each link in the chain may contain different content richness for the kids that “get it” and the ones that “don’t get it.”

From Individual Mastery we come to Blended Learning’s final destination of Fully Personalized learning. Here the student is master and commander of their own education. Directed by their own interests. A classroom is now a selection from an online catalog of available syllabi. Assessment is automatic and continuous. Peer to peer coaching and evaluation is routine. Learning has become “teacher-proof”. If you still have the diagram open, the information visual for Fully Personalized has a teacher sitting outside the student's learning. There is no direct connection between the two.

I am quite unsure where the teachers are in the Fully Personalized form of learning. The obvious place is an educational utopia where instruction is undifferentially produced for a student ideal that is hermetically delivered without an atom harmed. I might be overthinking this.
I don’t want Blended Learning. How about you?

"Specializing in what I have not done before."

Paul Kahn, one of the two founders of Dynamic Diagrams, once described his design agency as "specializing in what they have not done before." As I work to understand how secondary education is using technology in the classroom in the light of Federal, State, and local obligations and expectations I am constantly reminded of Paul's maxim and of avoiding being little more than a dilettante.

A visual hack for organizing your notes

I am always advocating for keeping and carrying only one notebook for all projects. Maintaining a single notebook does have its own problems and so I watch for interesting solutions to them. One problem is how to quickly find project specific notes? This solution is a simple means to visually organize the notebook's content.

From Japan, a Brilliant Notebook Hack for Organizing Your Notes: A simple trick to easily index and find the information you need

I am reminded that it is time to revisit my Keeping Your Academic Shit Together document.

Small things matter

A method we have in our common library is a check that a string is null, empty, or contains only whitespace. I suspect everyone has this method somewhere in their code. Ours was written a decade ago and we have not had need to replace it -- it works and has no obvious downside to normal operations.

However, every now and then I am reminded of something I learned at Tazz Networks when one of the teams was reviewing performance bottlenecks. The code that lowercased unicode strings was contributing to well over 1% of the total running time. The only reason for this high overhead was that at no time did anyone -- senior or junior -- state what the standard letter case was for hash table keys. And so, for example, the key butter was found in the code as "Butter", "butter", "BUTTER", and my favorite k.upper() only to lowered soon after! None of theses uses came from outside of the system (that is, user data) and so the development organization had complete control over their representation.

So what about the empty string check? The code is

return s == null || s.trim().length() == 0;

The use of trim always bothered me because it allocates a new string containing the original string without the leading and trailing whitespace. I would have been less bothered, perhaps, if we used this check infrequently, but some of the core code needs to check for empty because the development organization never set the standard for an empty string. If all empty strings could to guaranteed to be of zero length or, better yet, a sentinel value then the check would then be

return string == EMPTY_STRING

which is going to be very fast.

So, for now, the empty check has to look at the content of the string. I replaced the original check code with

if (s != null) {
    for (int l = s.length(), i = 0; i < l; i++) {
        if (!Character.isWhitespace(s.charAt(i))) {
            return false;
return true;

In the case where the candidate string is the empty string or a string without leading whitespace this implementation is about 18% faster (100M iterations). When the candidate string contains just one leading whitespace it is 481% faster. The candidate string needs 34 leading whitespace characters before the two methods have similar run times.

I am going to keep the new code. Small things matter. Especially, when frequently used.

Update revision date with Google App Script

I was bitching about what Google Documents is missing for technical documents. Which, in all honestly, is not much, especially, in the light of the revision and collaboration tools it does have -- and had on its first day.

Since I like to have revision dates and numbers in my documents how hard could it be to script their automatic update. Not hard at all. The following script will add an "Update Revision" menu item to a "Scripts" menu and when invoked it will replace all occurances of "Revision YYYY-MM-DD HH:MM" in headers, footers, and the body with the current timestamp.

function onOpen() {
      .addItem('Update Revision', 'updateRevisionTimestamp')

function updateRevisionTimestamp() {
  var doc = DocumentApp.getActiveDocument();
  var date = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "yyyy-MM-dd HH:mm");
  var revisionPattern = "Revision [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}";
  var revisionReplacement = "Revision " + date;
  var body = doc.getBody();
  if ( body ) {
    body.replaceText(revisionPattern, revisionReplacement);
  var footer = doc.getFooter();
  if ( footer ) {
    footer.replaceText(revisionPattern, revisionReplacement);
  var header = doc.getHeader();
  if ( header ) {
    header.replaceText(revisionPattern, revisionReplacement);
  return doc;  

Jolokia is remote JMX with JSON over HTTP.

We use JMX a lot for low level, dynamic management of our systems. Even the most basic of MBean implementation that uses the "MBean" interface suffix and one concrete class implementation is far better than nothing. With our commitment to using JMX we have, over the years, developed a set of Java annotations and machinery to publish POJOs as MBeans.

We continue to use JConsole, over Java Visual VM, because of its utter simplicity. The tool does have some issues, but we know them well and they do not distract from the need to manage something quickly. The one area where this tool and other tools that I am aware of fall down is making the same change on several deployments.

For this we fall back to using the bash shell and Jolokia. Jolokia is remote JMX with JSON over HTTP. It is a servlet that is part of our standard Tomcat deployment. We have been using it for many years and it has not failed us yet. So, if I need to change some state on all our machines I run

    curl "http://$h/jmx/write/object-name/attribute-name/new-value &

Where object name, etc are replaced as expected. (Curl is normally called with --silent and --fail command line options.)

Mistake-Proofing & software poka-yokes

Chase's & Stewart's Mistake-Proofing is a useful read about the theory and practice of avoiding mistakes in manufacturing and service. It is a short book and so just skims the surface of the field, but it gave me enough information to better understand some problems my software development organization has with its "manufacturing."

The problem we have is that we don't so much have a data pipeline with state change at the joints, ie fixed points in the flow, but more a leaky data pipe where the leaks are the state changes. (We inherited much of this code from a systems integrator hired before my time.) Changing the whole flow is not possible right now and so how can we mistake-proof the leaks?

Mistake-Proofing advocates poka-yokes as a means to avoiding mistakes. The term is from Japan, where all the quality focused manufacturing ideas have come from since Deming arrived after WWII! It means to avoid (yokeru) mistakes (poka). We see them all the time all around us. Some are actual devices -- the car engine won't start unless the clutch is depressed -- and some are conventions -- hot water is on the left. In software, a common poka-yoke is method argument checking. For example,

public void m( String v ) {
  if ( v == null ) throw new IllegalArgumentException("v must not be null");

Other, more complicated poka-yokes are based on the satisfaction of accumulated conditions. For example,

if ( ! ( x && y && z ) ) throw new IllegalStateException("...");

So, Mistake-Proofing has given me a renewed inducement to improve our system and a nomenclature to use.

Note: I find negating a single conjunction of conditions, ( ! ( x && y && z ) ), more readable than a disjunction of negated conditions, ( ! x || ! y || ! z ).  Code readability is itself mistake-proofing.

Developing post of my education about schools

This a developing post of my education about schools in the USA. It will be idiosyncratic. I tend to pick up anything and read it. In time it will become an annotated bibliography to a thesis that will not be needed.
Tough P. How Children Succeed, Grit, Curiosity, and the Hidden Power of Character. Mariner Books; 2013.
Good book with supporting evidence for putting as much emphasis on building character as inculcating academics in secondary education. Last chapters feel like filler. Worth reading.
Berger R. An Ethic of Excellence, Building a Culture of Craftsmanship with Students. Heinemann Educational Books; 2003.
Good book that articulates how a child needs to see and reach for excellence and from that milesone build a successful school life. Worth reading.
Christensen C. Is K–12 blended learning disruptive? An introduction to the theory of hybrids; 2013
A white paper that brings Christensen's Innovator's Dilemma to education. Unsettling vocabulary of business in the context of students & teachers. I have much to disagree with here. Overall, there is no evidence given of how hybrid (or fully disruptive) learning models are successful (vis a vis educating the student and strengthening the teacher) nor how they are cost effective. Much hand waving. Worth reading, if only for ammunition.
Laptop multitasking hinders classroom learning for both users and nearby peers
Useful data point that learning is hindered more for the observer of than for the user of the laptop. 17% more.
If I am going to be successful in lobbying for a high school education deserving of our children I will need to learn a whole new kind of politeness and patients, and expect progress and not perfection. Perhaps this was not the year to give up booze.


Since I often write blog postings with embedded code I get frustrated with Blogger's editors. Neither the "Compose" nor the "HTML" variants work right when the code contains anything that looks like an HTML element or entity. My last posting lead to me looking for a Markdown editor and I discovered MacDown. I have used it once, to date, and it worked flawlessly!

Traversing, aka picking for scraping part 2

Extending the idea in the Picking for scraping posting is the traverse. A traverse safely traverses a (typically) hierarchical data structure where any of the intermediary traversal steps may encounter a missing node. For example, in an hypothetical application most data instances have a value at the end of the a traversal from A to B to C to D, however, this data instance is missing the B node. Traversing from A to B is safe, but traversing from B to C will result in an null pointer exception (NPE).

The common ways to avoid NPEs while traversing is to check each node for null before traversing it. And so you see code that looks like a ladder, eg

value = data
if ( value != null ) value = value.A
if ( value != null ) value = value.B
if ( value != null ) value = value.C
if ( value != null ) value = value.D

While this works it is very cumbersome and prone to copy-paste errors due to small variations found on some ladder rungs.

Some languages offer syntax support for traversing. This is called a null coalescing operator. Java, the language I mostly work in, does not have this operator and so a different solution is needed.

The solution I use allows for a safe traversing using data format specific classes. That is, XML has its own traverser, Json has its own traverser, etc. A fully general mechanism might be possible, but the technique is simple and so really does not warrant one. Here is the example of safely traversing some Json data

value = new Traverse(data).at('A').at('B').at('C').at('D').value()

Or, let's have B be an array and we want to traverse the first element

value = new Traverse(data).at('A').at('B').at(0).at('C').at('D').value()

The dictionary at() method is

public Traverse at( String key ) {
    if ( value != null ) {
        if ( value instanceof Map ) {
            value = ((Map)value).get(key);
            // data might be null indicating an unsuccessful, 
            // but safe from NPE, traversal
        else {
            // an unsuccessful traversal always sets data to null
            value = null;
    return this;

While the array at() method is

public Traverse at( int index ) {
    if ( value != null ) {
        if ( value instanceof List ) {
            value = ((List)value).get(index);
            // data might be null indicating an unsuccessful, 
            // but safe from NPE, traversal
        else {
            // an unsuccessful traversal always sets data to null
            value = null;
    return this;

As with the Builder pattern, the Traverse pattern always returns the traverse instance.

A common aspect is the check for type and this can be refactored out.

public Traverse at( int index ) {
    List l = cast(List.class);
    if ( l != null ) {
        data = l.get(index);
    return this;

protected <T> T cast( Class expectedClass ) {
    if ( value != null &amp;&amp; ! expectedClass.isAssignableFrom(value.getClass()) {
        value = null;
    return (T) value;

Expanded, working versions of XML traversal and Json traversal are at [TODO].

Oh, how do you get the traversed to value?

public <T> T value() {
    return (T) value;


My boss was a member and, later, chairman of the Lenox, MA school committee for over 10 years. I am glad for his explanations of the alien world known locally as the South Kingstown School District.

Re: 10 questions for the Superintendent and School Committee Chairwoman

I received a response to my letter with some questions about the 1:1 initiative. Note that the formatting is incorrect in some areas: I have asked for a clearer document.

I still need time to consider it. On the surface it says the right things and says them politely. (Very much Pauline Lisi's voice.) I am told that for more detail I need to meet with two other administrators. It has not been my experience that a meeting is more conducive to detail than a prepared document. The response is a step forward, but not the stride I was hoping for.

On Apple's removal of historical reenactment games

Apple's removal of historical reenactment games because they contain images of the Confederate battle flag is ahistorical, reactionary, stupid, and introduces a double standard where none existed before. I guess I can look forward to Apple resolving this problem by removing all historical games because there was always a loser. And what about the winners that were equally immoral or racist such as Mao, Pol Pot, Stalin, Winston Churchill, Woodrow Wilson, Franklin D. Roosevelt, ...

Printed capitals

There has been a little discussion on Facebook as to whether children should learn cursive handwriting or not. I think they should, but ... I count on one hand the meetings I have been in where the presenter had legible handwriting. That is, readable from 5, 10, and 15 feet away -- even in yellow, the abomination of dry-erase marker colors. What the presenter never learned is that for public presentations capitals only, printed text is many times more legible than anything else. So, if you do teach your children cursive make sure that when the boys and gals are making labels and posters have them use printed capitals. Ok, I got that off my chest.

I owe Jared Rosoff much gratitude for his example.

10 questions for the Superintendent and School Committee Chairwoman

Here is the letter I have sent to the Superintendent and School Committee Chairwoman with 10 questions about the School District's technology plan.

How a neural network learns video

A well presented example of how a neural network learns, in this case, to play a simple video game. Worth watching even if you know how neural networks work so you can better explain them to others.

Each laptop costs about $1222 over the next 3 years

As I drove home from the office tonight I was fixated on what the total cost of 1 laptop would be for the 1:1 initiative over the next 3 years -- by then all 1000 HS students will have laptops. So, I pulled up an empty spreadsheet and entered some numbers.

In short, if you assume a 20% failure rate of laptops -- not unreasonable given the hazardous environment a backpack and the ground are -- each laptop will cost $1222. At this price you could buy a new chromebook each year. If you reduce the failure rate to 10% the total cost is $1053. Still less than one new chromebook per year. No administrative costs are included as I do not know what the current staffing expectations are.

Now, you might say, but these laptops are to last 8 years, isn't that going to reduce the per student cost? Well, if the failure rate is 20% then EVERY laptop will be replaced within 4 years. If the failure rate is 10%, yes, the per student cost will go down. I am unsure what shape an 8 year old laptop will be in. But I know that I do not want to use a 2007 laptop today.

Update: I forgot to add that if you buy Chromebooks at $200 each, insurance each new laptop for 1 year, and expect 20% failure rate the cost per student is $360. Copy the spreadsheet and play with the numbers yourself.

No cost for insurance and home internet

I did receive word that the School District will not require students to purchase insurance for the laptops. And for families unable to afford home internet access the District will also cover those costs find external funding.

School Committee stands for educational equity

The South Kingstown School Committee was not aware of the requirement for students to maintain the laptops. Scott Mueller spoke directly the educational inequity of this situation and asked that the technology policy, that was to be voted on last night, be returned to the sub-committee for further work. The other SC members unanimously agreed to this.

Tonight's school committee meeting

I intend to speak during the community comments section of tonight's school committee meeting. Here are my notes; feel free to add your own comments.

Update: See School Committee stands for educational equity.

Weekend Workbench

The work this weekend was normal springtime home maintenance. I finally finished off topping off the trench holding the french drain and gutter drain (two separate pipes). We had to carry a lot of stone! Finished priming the screen doors. The possibility of rain prevented me from getting a top coat on them.

Owen and I have continued to play Firefly. Owen really wants to crew his firefly with all the Firefly cast and so this has become his game goal! I also played The Speicherstadt on Saturday at the Wakefield Board Games Meetup. I really like the game and will likely purchase it this year. I am told it will be back in print soon.

Differences between the information meeting and the one-to-one laptop FAQ

Differences between the information given at the June meeting and the one-to-one laptop FAQ

1. The devices are mandatory.

2. The student can not use their own laptop.

3. The maintenance cost (via an insurance policy) is $60.

4. The student will not be allowed to decorate their laptop so as to distinguish it.

5. The student will most likely need a home internet connection (and using Cox's $10/month option is suggested).

Update: See School Committee stands for educational equity.

And what do we do when we don't have our laptops?

Some questions for the School District not addressed in the 1:1 FAQ [1].

At the June informational meeting it was said that the laptops would need to be returned prior to PARCC testing for "certification". Would you please provide more detail? For example, where are some questions that come to mind.

1. PARCC testing this year spanned 10 days, will the laptops be held securely during this period to ensure their continued certification?

2. How many days or weeks before the testing will the laptops need to remain with the school?

3. Will the student be allowed to use their laptop during this PARCC certification and testing period in school?

[1] Note that the FAQ was distributed as a PDF document and not as a link and so this link goes to my Dropbox site.

Update: Make sure to ask ALL your questions about the one-to-one FAQ on the feedback form because you can only use it ONCE!
Update: See School Committee stands for educational equity.

Cropping multiple pages at once

I print stuff, but I don't like wasting paper or ink. Research papers in PDF tend to be formatted for use in a journal. Chapters in PDF tend to be formated to use in a book. All have extra marginal whitespace. I found out today that OS X's Preview application can crop all selected pages at once. The steps are:
  1. Choose the View menu's Thumbnails
  2. Select all the pages in the sidebar. 
  3. Choose the Tools menu's Rectangular Selection item. 
  4. Select the rectangular region you want to keep. 
  5. Choose the Tools menu's Crop

Picking for scraping

One of our developers coded what is essentially a data scraper. The implementation is very brittle. It has to become more robust. Without rewriting it, one technique is to use "pickers" to get valid values from a poor quality input. The way a picker works is that you declare where to get the data, what type it is, and what a default value is. A different picker is created for each way a value is accessed. Don't worry, there tends to be only a handful of data access patterns so not a lot of code will be created.

For example, the following code caused an NPE this morning because result didn't have a "data" child:

Element data = result.getChild("data");
int count = new Integer(Strings.noNull(data.getAttributeValue("count"), "0")).intValue();

If a picker were used then the code would have returned zero, the default value.

int count = picker(result,"data","count",0);

The key aspect of the picker is that it checks every working value before using it. For the example above, the picker would be implemented as

int picker(Element tree, String elementName, String attributeName, int defaultValue) {
    if (tree == null) {
        return defaultValue;
    Element element = tree.getChild(elementName);
    if (element == null) {
        return defaultValue;
    String attributeValue = element.getAttributeValue(attributeName);
    if (attributeValue == null) {
        return defaultValue;
    try {
        return Integer.parseInt(attributeValue);
    catch (NumberFormatException e) {
        return defaultValue;

Extra Credits: The Myth of the Gun

This is the best explanation of our culture's adoration of the gun by examining the cultural differences between us and Japan and the first-person shooter video games each creates. Well worth your time to watch.

Poor planning continues with one-to-one laptop initiative

Update: I have since heard that the School District is backing away (or correcting) statements made in the information meeting. In short, no student would be denied a laptop to be taken home because of family need -- those with hardships would be privately accommodated. Good to know that speaking out does work. However, we have yet to hear if the District continues to expect parents to still pay $55/year per laptop.

I attended yesterday's (June 2) information meeting about the High School's and School District's initiative to have students take laptops home. This was the second time this meeting had been given; having been given a month earlier. It was a poor example of a public meeting. There was no written agenda. There was no written details of important dates, costs, etc. There was no sign-up sheet so the presenters could follow up with attendees on questions unanswered during the meeting. And lastly, there was no one tasked with guiding the overall meeting.

The meeting was well attended. It looked like a full house of 50 to 70 attendees. I expect we were all there to get a clear understanding of the program and the expectations of teachers, students, parents, and administrators. We did not get that.

The meeting was divided into three parts. 1) An introduction which included an unnecessary motivational video and a welcome example of current use in a Spanish class. 2) Information on the laptops selected and the costs to the parents. And lastly, 3) information on the rollout in August.

The bombshell that was dropped on the parents was that the district is not taking responsibility for the costs of maintaining the laptops. The parents are expected to buy insurance at $55 per year. It was also stated that the parents would have to pay for the full four years of insurance up front, i.e. $220. Multiply that by the number of students you have in High School for final costs. As the meeting broke up one of the presenters said that you might be able to make yearly payments. That these decisions were not known at the start of the meeting is just another example of poor meeting planning.

When the presenters were asked about why a student within public education was expected to pay for insurance there was no answer. Instead, we were told that having the laptop was not mandatory. That students could "checkout" one for the day when needed. There was no information on how this would be accomplished within the constraints of, for example, staffing or adjustments to busing needed to give the students time to checkout and return the laptops. It seemed clear that there that little thought had been given to even the most rudimentary logistics.

A second question that arrises is how is a teacher going to prepare a curriculum and its supporting educational materials for a classroom where he or she can not expect a uniformity of laptops and internet connections? For example, one of the High School's innovate math teachers has implemented the "upside-down classroom" where the student watches videoed lectures at home and does "homework" in the classroom where their questions can be addressed immediately and with appropriate, individual instruction. How does the student without the laptop at home or in a home without an wireless internet connection participate? Why is the teacher expected to create more than one teaching plan?

One presenter answered that students could use the computers at the public library as though that was a reasonable option. Given that the public library is funded by the Municipality and not the School District, let's only consider this solution when the School District steps up to funding the additional hours and computers needed to support this. Again, another example of a lack of planning.

I could continue to critique the planning around the one-to-one laptop initiative. When this initiative first started I asked to be involved. I was invited to participate in the planning meetings. After attending the first few meetings it was clear that the initiative was actually being driven by PARCC testing requirements for computers and the need to hide the costs of this under the guise of instructional advancement. Perhaps this characterization is too harsh, but I have yet to see anything from the District that shows me different.
Update: See School Committee stands for educational equity.

Packing up my wargaming stuff

I have decided to pack up my wargaming stuff for the foreseeable future. I had high expectations when I started. I really needed a hobby where I would be making stuff and then playing with it. Wargaming has this in spades. I did make and I did play, but in 3 years of time, effort, and lots of money I have made very little and played very little. Too little to warrant continuing when there are other draws on me.

The best aspect of this period was meeting the Wednesday Gamers. I am very grateful for Al's, Leo's, Kim's, and Maurice's fellowship, encouragement, information, insights, and, of course, the games we played. Leo and Maurice always have prepared or are in the process of preparing scenarios in the worlds of Lord of the Rings, The Lost Regiments, dark ages, American Civil War river conflicts, and WWII. All I had to do was show up and play. When we played Saga, however, I would bring my Welsh and Viking miniatures.

Al has hosted the Wednesday Gamers during this time. He and his wife are retiring now and by the end of June they will have moved to Tennessee. Now seems like a good time to make a break. I will play an occasional game with the Wednesday Gamers in Maurice's basement -- if they will have me.

Back to packing up my work table.

Update 1: The work table's paints, tools, and junk are packed up. Owen and I are using the big table to play the Firefly board game. (We can't play these long duration board games in the house as the the cats want to play too and, well, they don't follow the rules nor turn order.)

Update 2: Owen and I finished our first game of Firefly. We really enjoyed the game. And if, like us, you enjoyed the TV series then there is real joy when you get Kaylee or Wash to join your crew!

Product Idea #1

While walking Milo this morning we passed several groups of disc golfers wondering around in the scrub looking for lost discs. I suggested to Milo that perhaps the disc's should come with an embedded bluetooth beacon. He thought the idea was a good one, but that it would cut into his flushing work. I reminded him that, here, on this walk, there are always lacrosse balls to find.

Later it occurred to me that if the discs just chirped that would be sufficient.

$10 Plasma TV

Another project taken care of this weekend. I found a Vizio VP322 HDTV10A plasma TV last year that looked too new to be broken. So, I took it home and found that it was broken. It would remain powered on for a few seconds and then it would shut down. A check on the internet found that this model was built with capacitors that frequently failed. After opening it up I found that, sure enough, there were two "jiffy pop" capacitors. I bought replacements from Mouser and today installed them. The TV now works. Total repair cost was around $10.

I will keep it powered on for a few more hours to see if anything else breaks. Until then, I have plugged in a Chromecast and have DIY videos running in the background.

The hardest part of fixing the TV was not the soldering, but forgetting where the speakers' ground wires were connected and which screws were for which holes. I clearly made good guesses, but I do have several screws left!

The capacitors that Vizio had been using may have come from the manufacturer that had been making knock-offs from design documents stolen from a competitor. The problem, as I understand it, was that the documents were incomplete and so the materials created for the knock-offs was wrong and of a poor quality. When you open the back of any TV you will find many dozens of capacitors and, together, this adds a substantial cost to the manufacturing. So, that cheap TV from Walmart is cheap because it is made of marginal quality parts. But you already knew that.