Using Web Annotation as an Educational Tool in the Classroom

Over the past year or so, along with IST M.S. student Anthony Pinter, I’ve been exploring how Web annotation tools such as or Lacuna Stories can be used in the classroom. I’ve also been trying to create my own ideal format of a Web-based textbook for Internet Law, which would have excellent navigation, readability on any device (including when printed), footnotes, and integrated annotation. A very early version of our work is available at

I’m most interested in using the annotation tools to help students in creating case briefs, according to my guidelines for How to Brief a Case. Anthony and I conducted a small usability study on the Web page in spring 2016, with a group of almost 150 students in IST 432. Anthony was able to present this work at I Annotate 2016 in Berlin, in a presentation titled “Using Web Annotation as an Educational Tool in the Classroom” (PDF). I think Anthony did a great job with the presentation; you can watch the video of his talk here.

Unsolicited Advice

This academic year was the second one in which I had the pleasure of serving as an honors advisor for IST and SRA students in the Schreyer Honors College. Honors advisees are assigned to me in their junior year, and so right now those first students are submitting their honors theses getting ready for commencement. I’m really proud of what they’ve accomplished—even though I, unlike their thesis supervisors, can take absolutely zero credit for their success—and so I just wanted to highlight their excellent work here:

Integration: Making Technology Work for You and Your Students

On Saturday, March 19, I’ll be speaking at the Penn State Teaching and Learning with Technology Symposium. Along with Bart Pursel, I’ll be presenting in the Integration: Making Technology Work for You and Your Students session. This will be my first time presenting at the Symposium, and my fourth year as an attendee; it’s always a great time.

I believe that a video of the session will be posted eventually, but in the meantime, here are the slides.

Hail, Caesar!

This serves as a follow-up to my award-winning (untrue) blog post on How to Create Your Own Weather Forecast Program Using Python. This time around, we’re going to learn how to program own our Caesar cipher (encrypting and decrypting) using Python, as well as how to hack that same cipher. I suppose the ambitious student could combine these two tutorials in order to send encrypted weather forecasts to his friend. Here’s what you’ll be making:

Caesar cipher

To be very clear, most of the content in this tutorial is merely a modified version of Hacking Secret Ciphers with Python. In particular, I’ve tweaked and combined components of chapters 6, 7, and 12 in a way that I hope students will find interesting. If you find this material interesting, I encourage you to read the entire book, which is available in its entirety for free online.

Getting Started with Python

If you’re a Penn State IST student, you can use the classroom computers, which come pre-loaded with Python and IDLE. If you’re not on campus, you can access them through your browser (this is very cool).

If you’re not a Penn State IST student, or if you want to install Python on your own computer, I encourage you to read Chapter 2 (“Installing Python”) of Hacking Secret Ciphers with Python.

Preparing for Detecting English

I often have to evaluate written work created by college students, so I have signficant experience in detecting when something is written in English, and when it is not (ha!). Our Python script will face the same issue when we brute-force hack the encrypted string; it will use the Caesar deciphering code with every possible key, then evaluate the results against a dictionary of English words. As a heuristic, we’ll say that if 20% of the words in the deciphered message are found in the dictionary file, and 85% of the characters are letters or spaces, then we’ve possibly identified the correct key.

We could re-create this code ourselves, but once again Al Sweigart’s Hacking Secret Ciphers with Python has us covered; see Chapter 12 (“Detecting English Programmatically”). I encourage you to read the entire chapter, but in the interest of creating a tutorial that can hopefully be completed in about an hour, you should:

  • Download the dictionary file and save it to your computer’s desktop. This file contains a whole bunch of English words. You’re probably already familiar with many of them.
  • Download and save it to your computer’s desktop. This is a Python module that simply returns true or false, according to the heuristic described above, as to whether the message contains English.

Shifting Keys

In the spirit of putting the bottom line up front, here’s the completed script:

You can paste that into IDLE, save as, then hit F5 on your keyboard to run the program.

As I said, this is mostly a combination of chapters 6 (for encryption and decryption), 7 (for brute force hacking), and 12 (for detecting English) of the hacking Python book. For line-by-line commentary on how the code works, please see those chapters. My version of the script merely combines the several functions together, and adds some error-checking.

What’s Next?

I don’t know, Christmas I guess? But if you mean in terms of learning more Python and/or cryptography, I recommend:

Finding Myself

There are many wonderful things about the IST Building, but navigability isn’t one of them. Students understandably get lost trying to find my office. The College does publish floor plans, but they are, perplexingly, hidden in a faculty/staff-only intranet. With the start of the semester around the corner, I thought it would be helpful to publish these resources:

  1. IST Building first floor plan
  2. Second floor plan
  3. Third floor plan


Many years ago, my father discovered the world’s most perfect timepiece, and he later passed that knowledge on to me, his firstborn (and arguably best) son. That watch is the Casio Men’s F105W-1A Sport Watch, and it is amazing. It boasts the following features:

  • is $11.49
  • per above, you can lose it or break it and you don’t have to care; just buy another one
  • the battery lasts for approximately 35 years
  • glows!
  • you don’t have to worry about people trying to steal it
  • does not send you notifications when you receive an email
  • is really basic and beautifully designed


casio watch

You should buy one.

How to Create Your Own Weather Forecast Program Using Python

In this tutorial we’ll explore how to access the Wunderground API (application programming interface) using Python. What we create will be very simple but it will give you a good idea of what you can do with Python and with APIs.

Wunderground (and most APIs, such as those provided by Twitter, Facebook, and Reddit) require you to create a free API key. The API key is a code passed by programs calling the API to identify the calling program and its developer. Keys are used to track and control how the API is being used, and to prevent malicious use or abuse of the API.

To create your key, create a free account here. Click the link in the confirmation email that you’ll receive, and then sign into your account. Click “Explore My Options,” and then “Purchase Key” at the bottom of the next screen (don’t worry, you won’t be spending any money). Complete the questions on the next page (put your real name and contact email; set the project name to something like “API Test” and the website to or whatever you’d like). Select “Website”, “No”, and “No” for the three radio buttons. Enter your country and a brief description (“Learning about the Wunderground API”), and then check both boxes and click “Purchase Key.” On the next page, you’ll see your key (it will be 16 hexadecimal characters, such as “4f73eacea9c60244”). Copy and paste this into somewhere handy, because you’ll need it soon.

Wunderground’s API provides answers to a variety of questions that we can ask it. Let’s say that we were interested in learning the current weather conditions in State College. In our Web browser, we can simply construct a special URL, containing our API key and the city and state for University Park, and we’ll get a plain-text set of results back. Here’s how to build the URL (note that you must replace [your API key] with, you guessed it, your API key):[your API key]/conditions/q/16802.json

As you can see from the URL, here we’re looking at “conditions” data, which refers to the current weather. Looking at the results, you can probably see fields like zip, latitude, longitude elevation, weather, temp_f, wind_string, and feelslike_f that look interesting. What we’d like to do in this tutorial is: 1) create a Python script that returns only the information we care about; and 2) accesses the forecast data, rather the current condition data. So, let’s do that.

You may need to install Python and IDLE on your computer; you can do that here. If you’re an IST student, you can log in to Open the Start menu and type “Python”, and then launch “IDLE (Python GUI)”.

In IDLE, select File -> New File (or New Window). In that window, type the following (again, you need to replace [your API key]):

Then select Run -> Run Module. If everything worked, you should be in a loop where the script asks for your ZIP code and then spits out the current weather conditions. So far, so good. We want to access forecast data, though, and not just current condition data.

Create a new script and type and run the following (again, you need to replace [your API key]):

You can explore many more features of the Wunderground API here. If you want to learn more about Python, I think the best place to start is here.


Over the past few years I have become dangerously, hopelessly addicted to listening to podcasts. I listen to them whenever I have a few free minutes: on my (brief) commute, walking the dog, cleaning dishes, taking a shower, and even trying to fall asleep. Lately, the success of the This American Life spinoff show, Serial, has drawn more attention to the medium, and so I wanted to record some of my favorite podcasty things.


Here are my favorite podcasts, in descending order:

  1. This American Life

    First-person stories and short fiction pieces that are touching, funny, and surprising. Hosted by Ira Glass.

  2. Accidental Tech Podcast

    Three nerds discussing tech, Apple, programming, and loosely related matters.

  3. Radiolab from WNYC

    On Radiolab, science meets culture and information sounds like music. Each episode of Radiolab is an investigation – a patchwork of people, sounds, stories and experiences centered around One Big Idea.

  4. The Talk Show With John Gruber

    The director’s commentary track for Daring Fireball.

  5. Exponent

    In this program we seek to explore the massive effect technology is having not just only technology companies, but also on society as a whole.

  6. NPR Programs: Fresh Air Podcast

    Fresh Air from WHYY [Ed. note: PHILLY!], the Peabody Award-winning weekday magazine of contemporary arts and issues, is one of public radio’s most popular programs. Hosted by Terry Gross, the show features intimate conversations with today’s biggest luminaries.

  7. DecodeDC

    DecodeDC has a broad mandate: to help Americans understand how crucial political issues affect everyday life.

  8. New Yorker: The Political Scene

    A weekly discussion about politics, hosted by The New Yorker’s executive editor, Dorothy Wickenden.

  9. StartUp Podcast

    My difficult journey from man to businessman. It’s a classic start-up story, but one that’s recorded in real time.

  10. Kumail Nanjiani’s The X-Files Files

    Kumail Nanjiani (Silicon Valley, The Indoor Kids) and a guest explore their favorite cases of The X-Files. The truth is out there!

  11. WTF with Marc Maron Podcast

    Comedian Marc Maron is tackling the most complex philosophical question of our day – WTF? He’ll get to the bottom of it with help from comedian friends, celebrity guests and the voices in his own head.

  12. New Yorker: Out Loud

    A weekly conversation about what’s new in The New Yorker.

  13. The Gist

    A daily afternoon podcast about news, culture, and whatever else you’ll be discussing with friends and family tonight. With Mike Pesca.

  14. 99% Invisible

    Design is everywhere in our lives, perhaps most importantly in the places where we’ve just stopped noticing. 99% Invisible (99 Percent Invisible) is a weekly exploration of the process and power of design and architecture.

  15. Comedy Bang Bang: The Podcast

    Join host Scott Aukerman (“Comedy Bang! Bang!” on IFC, “Mr. Show”) for a weekly podcast that blends conversation and character work from today’s funniest comedians.

  16. Hypercritical (retired, but still awesome and still worth listening to)

    A weekly talk show ruminating on exactly what is wrong in the world of Apple and related technologies and businesses. Nothing is so perfect that it can’t be complained about.”


  • Overcast: this is the best podcast player for iOS.
  • GOgroove FlexSMART X2: this is the best Bluetooth radio adapter. My car is old and doesn’t have an AUX input. There is a newer GOgroove FlexSMART X3, but I haven’t tried it, and it’s more expensive anyway. This one works wonderfully.
  • SoundBot SB510: this is the best Bluetooth shower speaker. The battery lasts forever, and you can control playback using the buttons on the speaker. It’s awesome.

Enhance Ten Times

Over the years I’ve compiled a few Terminal commands that I use to customize my Mac. There are various Web sites that list many such commands, but in case you have similar tastes to mine, here is a less overwhelming selection:

System commands

Turn off Mac’s startup chime

sudo nvram SystemAudioVolume=%80

Automatically illuminate built-in MacBook keyboard in low light

defaults write kDim -bool true

Disable power button sleep

defaults write PowerButtonSleepsSystem -bool no

Finder commands

Turn off file extension change warnings

defaults write FXEnableExtensionChangeWarning -bool false

Always show scrollbars

defaults write NSGlobalDomain AppleShowScrollBars -string "Always"

Expand save panel by default

defaults write NSGlobalDomain NSNavPanelExpandedStateForSaveMode -bool true

Expand print panel by default

defaults write NSGlobalDomain PMPrintingExpandedStateForPrint -bool true

Save to disk (not to iCloud) by default

defaults write NSGlobalDomain NSDocumentSaveNewDocumentsToCloud -bool false

Disable automatic termination of inactive apps

defaults write NSGlobalDomain NSDisableAutomaticTermination -bool true

Enable full keyboard access for all controls (e.g. enable Tab in modal dialogs)

defaults write NSGlobalDomain AppleKeyboardUIMode -int 3

Display full POSIX path as Finder window title

defaults write _FXShowPosixPathInTitle -bool true

When performing a search, search the current folder by default

defaults write FXDefaultSearchScope -string “"Ccf"

Show indicator lights for open applications in the Dock

defaults write show-process-indicators -bool true

Application-specific commands

BBEdit: make Markdown the default language for all new documents

defaults write com.barebones.bbedit DefaultLanguageNameForNewDocuments -string "Markdown"

Chrome: disable print preview

defaults write DisablePrintPreview -boolean true

Use plain text mode for new TextEdit documents

defaults write RichText -int 0

Make Help Center a normal window

defaults write DevMode - bool true

Writing Help

This isn’t exactly timely for most students, but I wanted to make sure I posted it eventually.

Penn State Learning is an academic unit that provides students with assistance in a variety of areas, including by offering tutoring in writing. Writing is never easy, and one thing that always helps get a better result is to have someone review your work with a fresh set of eyes—especially when those eyes themselves belong to a solid writer—and that’s exactly what the the writing tutors can provide you, for free, on a schedule that works for you. I strongly encourage everyone to pay at least one visit to the writing tutors next year to have them help you out with one of your school assignments. Ideally it would be one of my assignments, because reading things that aren’t written well is really exhausting, and that makes me cranky.