Graduate School Final Project

I promised Stacy Lovdahl I’d post this the other day and then promptly forgot. Sorry, Stacy.

I took a graduate course on curriculum development and implementation this semester through Ball State. Not many of the assignments were open-ended enough to make for interesting blog fodder, so I didn’t post much. For my final project, I chose to redesign the course of study for my school based on an inquiry model. There are two components: the redesign document and the theory backing it up. They’re both available as Google docs with comments opened.

Many, many thanks to Michelle Baldwin and Kelly Tenkely from Anastasis Academy for late-night questions about inquiry mapping, standards reporting, and pretty much anything I couldn’t wrap my head around. Check out the work they’re doing…it’s amazing.

Updating the getText Extension

In October, I wrote about a bookmark application to get the text of a website for analysis in the Lexile analyzer tool. It’s a pain in the keister to copy text from a website, open a document, paste the text, save as a plain text file, then reupload to the Lexile website. The bookmark tool does the hard part for you (the clicks…all the clicks…) so you just download the formatted file and upload it to the Lexile site.

Depending on what you try and analyze, you might get an angry message like this one:

Seriously, who uses ASCII?

Nerdspeak, engage!

The only reason you’d use ASCII is if you, A) want to support legacy browsers (Netscape Navigator 1.0 anyone?) or, B) need to speed up query time on a string or a database. Modern web browsers are so much more efficient now, most sites use something called UTF-8. I’m guessing ASCII is needed for the Lexile analyzer so it can give you the score faster than it could with modern encodings.

Anyways, I pushed a fix to the applet tonight. It works by taking the text you highlight and encodes it to ASCII before downloading. So, still no conversions. And no angry red messages. And no more worrying about encodings.

You can grab the extension here or take a look at the source for yourself and tinker around.

More Scripts to Make Life Easier

It’s been an intense week of teaching, church band practice, and Google Apps Scripting. I’m really focusing this year on using the computer to do what it does well so I can focus on doing my job better. In particular, I’m using the desktop to do repetitive, marginal jobs as efficiently as possible.

This week, I’ve got two new tools in my belt to help out.

docTranslate

I happen to have a higher number of ESL students this year, some of whom are brand new to the country. Besides feeling more and more awkward about only speaking one language myself, I needed to find a way to help them with the language barrier.

After speaking with our ESL specialist, she gave the okay for me to print Spanish on the back of my English notes pages. (I was concerned about creating crutches, but she assured me that it would be more helpful than harmful in the long run. I need to learn Spanish.) Taking my notes, one by one, and putting them through Google Translate would have taken way too much time. So, I turned to a script.

doctranslate.gs

// This function converts a document from English to Spanish quickly.
// The post from http://stackoverflow.com/questions/25509159/how-i-can-get-the-textwrap-image-in-google-doc/25509591#25509591
// was helpful for creating the logic to check for images in the document.

function translate() {
  var doc = DocumentApp.getActiveDocument();
  var body = doc.getBody();

  // Add a page break for the translated material.
  body.appendPageBreak();

  // Get the number of elements in the document
  var elements = body.getNumChildren();

  // Use the number to loop through each element in the document.
  for( var i=0;i

This script is still a little incomplete, but it does the trick. You can read through the code to see what exactly each section does. I’m probably going to turn this into a Doc Add-On in the future, but that’s a little fuzzy right now because I can’t imagine when I’ll have the time to do that at this point. Some things to pay attention to:

  1. All images and drawings have to be inline for it to work. Googles Apps Scripts can’t see other types of images yet. It’s faster to make the copy and then reformat how you’d like.
  2. Formatting isn’t always carried perfectly. Again, it’s about the minimum-viable-product right now. Spot check the translation for format errors if that matters to your doc.
  3. This is document-specific…at the moment. You’ll need to recopy the script each time you want to use it.

I had a fluent Spanish reader check the grammar (Google Translate can be notorious for some weird translations at times) and he gave it a thumbs up, so take that how you will.

driveBox

Whiteboarding is a big part of this year in class. I want students investigating, collecting information, manipulating it, and building an argument. A lot of times, class ends before they have a chance to get clean work on paper. I needed a way for them to send photos of their work in at the close of class.

Of course, email is out. I guess that makes me old now.

We’re barely scratching the surface of Google Apps for Education at school – teachers are starting training this semester and student’s haven’t had their accounts opened up yet, so sharing back and forth isn’t really possible yet.

Some Googling turned up a great alternative, still using Google Apps, to create a public dropbox with scripts. In 20 minutes of finnagling, I had a working dropbox page which allowed students to submit things straight to my Drive with three taps. I’ve modified mine slightly from the blog post linked above. Unlike the translate function, this one requires two files.

form.html

 


  

Student Work Submission

server.gs

/*
    This is based on the template shared by Amit Agarwal (@labnol) on
    the blog, Digital Inspiration. The original post with instructions:
    http://www.labnol.org/internet/receive-files-in-google-drive/19697/
*/

// Find the form that is collecting the information to upload.
function doGet(e) {
  return HtmlService.createHtmlOutputFromFile('form.html');
}

function uploadFiles(form) {

  // Check for a folder called "Student Files" in Drive. If it's not there,
  // create one.
  try {

    var dropbox = "Student Files";
    var folder, folders = DriveApp.getFoldersByName(dropbox);

    if (folders.hasNext()) {
      folder = folders.next();
    } else {
      folder = DriveApp.createFolder(dropbox);
    }

    // Once the folder is found, create the new file
    // The file is named by attaching the Period Number to the Student Name.
    var blob = form.myFile;    
    var file = folder.createFile(blob);
    file.setName(form.classPer + form.myName);

    // Display a success message to the user.    
    return "File uploaded successfully. You can now close this window.";

    // If it fails, display the error message.
  } catch (error) {

    return error.toString();
  }

}

Those blocks of code turn into this:

2015-08-14_16-17-18

Pretty easy to figure out what to do.

If you’re interested in using either of these scripts, let me know on Twitter – @bennettscience and I can help you get them set up. Like I already mentioned, I think the translate function would work well as an Add-On, and if I get there, I’ll write another post with instructions on how to get it.

More on the scripting I’ve been doing lately…

Updated Student Response Template

A while back, I wrote about a new Google Sheets response system I created for use in class. I suggest you go back and read that first if you haven’t read it yet.

First, I uploaded the template in to the gallery. That’s the best place to download and use the spreadsheet because everything copies over correctly.

The biggest update is in the setup process. Rather than posting a URL on your board, it will now create a QR code automatically for your students to scan.

qr

Notice the tab at the bottom wasn’t there before clicking the button – it adds the code to a new sheet. You only need to do this once because the other functions (outlined in the first post) clear out responses in the template with each question.

Cleaning up PHP functions

Last year, I took some time to write a small blog theme for Anchor CMS using some PHP and a lot of CSS. Too much, if you ask me. If I had the time, I’d go back and clean a lot of it up. Maybe during a rainy day.

I haven’t logged into GitHub in a while. Teaching has been all consuming lately and I’ve not really had time to mess around with some coding projects I’d started so long ago. I hopped on tonight to grab some code for something else I’ve been working on, and alas, a problem with my theme.

Someone, somewhere thought my theme was good enough to use, which is pretty cool. But, some of the functions weren’t working correctly, and some were just plain missing (oops). I’d made a mistake somewhere in my cloning and rebasing, and I hadn’t taken the time to make sure I didn’t flub something up along the way. Anyways, long story short, he grabbed some code from my live demo site and got it working. But still. Customer support is our number one priority.

Here’s what I started with:

broke

function twitter_account() {
    return Config::get('meta.twitter');
}

function twitter_url() {
    return 'http://www.twitter.com/' . twitter_account();
}

The idea was to have someone create some metadata (twitter_account) once and then have it populate a link to their Twitter page as well as be the attribution info on any of the tweet links on posts. Easy enough, right? Wrong. The account function wasn’t returning the correct URL because I done messed up my PHP call. It should have been this:

fixed

function twitter_account() {
    return Config::get('meta.twitter');
}

function twitter_url() {
    return 'http://www.twitter.com/' . site_meta('twitter_account');
}

I’d forgotten that the twitter_account meta field only stores the data object. I have to tell the second function that there is some site metadata stored in the twitter_account call, not just the function itself. Oops.

All’s well now and it’s working fine, from what I can tell. Iteration is the game. Back to the workshop…

Science, UDL, and Lesson Design (Maker Experiment 2)

This post is a revision of the original experiment I posted two weeks ago. The main purpose of this is to add more elements of Universal Design for Learning and to elaborate more on the process used to help students build their own understanding of speed based on experimentation.


Additions

This activity will have a larger scope than the immediate physics relationship. Students will work with their biology (and health?) teachers to study human physiological reactions to activity. Things like heart rate, muscle fatigue, breathing patterns, etc can all be studied. Students will be asked to take factors like exercise patterns, sleep habits, and nutrition and evaluate their effect on physical tasks. The bicycle can then be used after a period of experimentation to take new data and draw conclusions.

To address the process of encoding and decoding graphs, I’ll be adding an activity from David Wees, a math teacher who often does experiments with web tools being used to teach through inquiry and games. Not long before I wrote the original experiment, David shared an interactive graphing game that I referenced, but didn’t pay much attention to. The player is asked to move a stickman in such a way that a real-time graph matches a pre-determined line. The graph is labeled and clearly shows the effect of any action in the game. Students can use this to form explanations of the components of graphs and how they relate to one another.

This leads into the bicycle hooked to the Raspberry Pi. The parameters are similar (distance over time) but we’re adding the physical act of pedaling as well as the physics component (speed) as outlined.


Reflection

I have to admit, this re-write is challenging. The components of UDL all seem to focus on choice, multiple means of acquisition and sharing, and multiple opportunities for learning. Rewriting an activity to include more components of UDL by adding parameters seems to be counterproductive.

That being said, my original plan did not do a whole lot to support the task of reading and creating graphs, and I think the addition of David’s stickman game will address that problem. I also think this was more an exercise in writing clearly than it was about incorporating principles of UDL. My original intent was to have simple prompts with multiple points for experimentation, assessment and revision, and I think that has been maintained (for the most part) in this update. Perhaps the wider picture is something I envision frequently, but communicate rarely.

My teaching has always focused on openness…BYOD, open Internet assessments, open-ended assignments…I think all of these things are supported by the UDL framework and are not things I articulate in new lessons. Science is a story…exploration and experimentation help us navigate that narrative. This entire activity is designed to have students do something they’re familiar with and apply it to a new idea.

Standards and goals for activities are good guides for learning, but too much of a focus on how to get students down that path robs them of authentic opportunities to experiment and defend their ideas. Rather than approaching UDL as a checklist for lesson design, we need to look beyond the components and find ways to promote the ideas they represent. Do we need a specific line in a plan that says, “Students will create an online resource for [fill in the blank]?” Or, should we allow them to come to us with the ideas for sharing and support them in that goal?

The most exciting phrase to hear in science, the one that heralds new discoveries, is not ‘Eureka!’ but ‘That’s funny…’

Isaac Asimov’s words hit home (thanks David Grossman for sharing!) I would argue that we replace “science” with “learning.” It doesn’t happen by having a section in a lesson plan for “provoking sustaining effort or persistence,” and achieving that mindset takes a serious mental shift for the teacher (and student) to achieve.

All this to say: we need to focus on providing the means to support multiple opportunities for students to learn in their own way. I don’t want to worry about what each student “prefers.” I’d rather be open enough so that each can go his or her own way and be successful.


Resources

Graph Game. [Digital]. Retrieved from http://davidwees.com/graphgame/

Astronomy Project – Day 10

I made some quick additions this afternoon to my GitHub repo for this project, which I’ve renamed to PySky. I had to do some research on the Pyephem license before I packaged it with my code. It turns out it’s available to distribute freely with other software as long as I provide my source, so now, it’s packaged with my simple python script.

Update 9:08 PM 10/16/13

Looks like I wrote the post too soon. I was able to spend some time tonight working on the script after my wife went to bed and I was able to get both of my original problems solved. The updated script is posted on GitHub.

I was able to find a nifty little piece of code to help me manage responses to prompts so my code is a little cleaner. I don’t have to have as many conditionals (if, elif, else) in my functions anymore, which makes everything look a little bit nicer.

As far as my coding, I’m working on a couple things:

  1. Users will be able to set their location, rather than having it hardcoded to South Bend (which isn’t useful at all).
  2. The program needs to be able to save the location data for all lookups. I think a global variable is a good way to do this, but I need to learn more.

Things have been crazy lately, so I haven’t touched this in a while. I’m still also working on getting the hardware I need to get my Raspberry Pi up and running. The only video-out it has is an HDMI port. I don’t have a monitor that can take HDMI, and I’m having a hard time tracking an HDMI-to-VGA adapter down. I might need to turn to Amazon for this one.

BUT, I did get another crucial piece of hardware for this little jaunt that I’m very excited about.

Of course, it happened to come on the cloudiest day of the month so far. I’ll post more pictures of the scope in a later post.

Astronomy Project – Day 5

I worked a little bit tonight on my code while Lindsey got to bed early while the baby napped. I added a menu at the beginning of the program which prompts the user to select either Stars or Planets. Then, they can put their choice in.

This is a short-term implementation for a few of reasons:

  1. For users without the PyEphem library, I need to see if I can push a download or package the data somehow.
  2. I don’t want to have a ton of menus to go through
  3. The star library is pretty small. It’s good enough now, but I need to find another one to tap into.
  4. The code is “chunky.” I want to go through and streamline when I’m more awake.

I keep thinking about how much more I’m learning working on this project as opposed to when I tried to learn Python using arbitrary lessons. It’s really driving home the idea of interest-based learning and it’s not something I’m going to forget any time soon.

If you want to see and try the new code, you can fork it on GitHub.

Astronomy Project – Day 4

I’ve been dabbling a little bit every day with this project and I’ve made some big changes since day 1.

First, with some help from Brandon Rhodes on StackOverflow, I got the function to print the altitude/azmiuth data for a planet when you run the script. This is still hardcoded for South Bend, but that’s where I live, so it makes sense. Down the line, I’ll make this a variable a user can use to set their locality.

Next, I found a python module to pull the current date and time when requesting the planet’s location. Since the Earth moved, it didn’t make sense to display the position based on date alone. Now, it will read that information from the computer and give more accurate results. Because I did this during the day, I used the sun as my object so I could check it’s position in my program vs other databases and calculators online. And this is where my brain started to hurt.

If you’re not familiar with astronomy (and I’m still learning) you can display position in a few different ways. The easiest (most popular?) way to describe position is using altitude and azimuth coordinates. The altitude is the angle of the object above the horizon and the azimuth is it’s angular distance around the horizon. So, if it’s position is 30o, 270o, it would be 30 degrees above the horizon looking due west.

You can also use celestial coordinates, right ascension and declination. RA is the angular distance from the celestial equator. In other words, if you stand on the equator and look up, you’re looking at RA = 0. The declination, on the other hand, is the direction north or south of the celestial plane. To me, this is much harder to conceptualize in my brain, which is why I prefer alt/az descriptors.

So, back to the code. I got it to print alt/az data, which was awesome. So, to make sure it was working correctly, I checked it against some other tools, and that’s when I ran into problems.


So, I went back to the code and changed it to print out the RA/Dec instead of alt/az to see what would happen.

Which was better.

I need to find some way to improve my alt/az calculations. I don’t know if it’s my location data or if there need to be adjustments to conversions, but I’m getting funny answers. For now, I’ll keep it in RA/Dec because the entire point of this program down the line is to pass this data to a telescope, so it doesn’t matter which one is easier for the user to look at. We’ll see.

If you want to see the current code, here’s the current dev code base. If you’re a python coder, feel free to fork and contribute.

Astronomy Project – Day 1

This is kind of a long story, but stick with me, because I’m excited about it.

Introduction

Earlier this year, I set a goal for myself to learn Python. I started on learning, but I didn’t really have any practical application for what I was doing.

Rising Action

I’ve always enjoyed astronomy, looking at the stars and planets, and more recently, trying to take pictures of them in my back yard.



I’m planning on buying a telescope in the near future, and part of that is going to include a simple motor to make sure I can aim it accurately and efficiently.

I’m also starting a master’s class in a couple weeks at MSU which is focusing on the maker culture idea and its implications in the classroom. Rather than purchasing a textbook for the course, we’ve been asked to buy a Raspberry Pi, Makey Makey, Squishy Circuits Kit, or a LittleBits kit.

And that’s when I had my stroke of insight. (I won’t be presumptuous and say genius. Yet.)

My project this fall is going to be going back and actually learning Python to create a program on the Raspberry Pi which can be used to control my telescope.

After doing some searching, I even found a Python library, PyEphem, which is a database of astronomical data put together (in part) by the Jet Propulsion Laboratory. Those are the guys that landed Curiosity on Mars. They know what they’re doing.

I know this is going to be a crazy six weeks of learning, working, and applying that to the classroom. While working full time. And raising my daughter.

Bring it on.

The Conflict

I’ve already started by looking back at the Python I’d already learned to see if I could begin to tap into what I’ve already found. I’ve got a public Github repository to hold all of the code as I write. Right now, it’s five lines of code that allow you to pick a planet and a date (even a future date…awesome) and it will tell you which constellation the planet appears in.

If you’ve got experience with Python, I’d really love to have your input as I go through the process.

I’m not expecting to have this totally done by the end of the semester, but I know I’m going to be learning a ton that I’ll be able to take back to the classroom someday.