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. http://colinm.org/language_checklist.html

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;