December 31, 2009

IMS Basic LTI LMS Certification (DRAFT)

I promised I would have a first cut at IMS Basic LTI Certification done by the end of the year. I must be slipping because I still have nine hours left before the deadline.

This is draft stuff - I am not the authority on this certification, the IMS LTI Working Group and the IMS Technical Board must approve all of these procedures before they are really a certification. But for now we can play with it and get some feedback into the process and make sure this stuff comes out right.

Here is some documentation for the procedure:

http://www.dr-chuck.com/ims/blti-cert/lmscert.htm

Here is a cool video that I made of Sakai passing the certification test:

http://vimeo.com/8474727

Let me know if you have any comments.

Posted by csev at 03:14 PM

December 30, 2009

Chuck's Charitable Giving Strategy

It is coming up on the end of the year so it is the ideal time to make charitable donations because you can deduct them immediately after the first of the year. You will notice that organizations like Creative Commons and Wikipedia pick this time of year to try to get donations from individuals - a very good strategy.

I saw this blog post by Heather Ford (an MSI Student at Berkeley) because someone in my Twitterverse re-tweeted it:

Why I [Heather] won’t support Creative Commons or Wikipedia this year.

I think that we should all give based on who we are and our passion and clearly Heather has a strong reason why she is making her choices.

I am not writing this post to agree or disagree with Heather - I do recommend that you read her post since it is full of passion. When I read her post it triggered me to write a post about my own thinking on charitable giving.

So here are my rules for charitable giving and the organizations I give to:

  • I never give to organizations that solicit me - and never give to organizations that call on the phone. My feeling is that if they are calling me, too much of my money is going to covering the fund-raising costs.
  • I do not like giving to any national organization because their budgets are generally way too high and their overhead keeps money from getting to where it is really needed. You can look at the IRS 990 form for an organization to get a sense of where it spends its money - they are always public but often hard to find. If I were to give to a national organization, I would limit it to an organization that had less than $500K of revenue. The Python Software foundation is a good example. You might want to Google "Python Software Foundation 990" to see both a responsible revenue/expense report and an organization that is good about truly revealing what it does and how it spends money. I think larger entities need to fund raise from corporations rather than individuals - just my preference.
  • Give locally. This year I gave to three organizations - my total cash giving was $2500. In each case, I walked in, wrote a check and handed it to them personally. It is nice to see a smile on someone's face when you give them cash. And doing it around the holiday season is particularly fun.
  • Give to your alma-mater - where you went to college. I got all three of my degrees from Michigan State University and while they indeed gave me lots of parking tickets, I am very appreciative of how much my degrees have helped my life. Don't just give to the fund-raising folks for the university. Give your money to the department that you graduated from. And give them the money as "un-designated" money so they can use it for anything. You don't have to give a lot - but start an annual pattern and increase your giving when you can. In the state of Michigan, you get such a big tax credit for donations to public Michigan universities that your donation feels almost free after taxes - and it means a lot to them.

So with all that philosophy in hand, here are the organizations that I gave money to this year:

  • CHUM Therapeutic Riding and Bonnie DePue. CHUM provides services for handicapped kids to ride horses for personal growth and physical therapy. I know that every single penny I give will touch the lives of handicapped children directly. There is no overhead, nothing fancy - only a non-profit and services. I gave less this year than I usually do - I try to give as much each year as I can.
  • Michigan State University Computer Science Department - Where I got all my degrees.
  • Michigan State University Department of Theater - Summer Circle. This is free and outside in June of each year and I have enjoyed it for over 25 years - so I like to support them.

Oh yeah and I always give to the Salvation Army bell ringers and buy popcorn from the Cub Scouts - there are in person and committed enough to be there when I walk by coming out of Sam's Club - they deserve something for that commitment. And I once was that cub scout sitting in the cold hawking popcorn and nice people bought popcorn from me.

So overall, I give where I feel a passion and feel driven to give. I give where I feel there will be impact to the served population and not just paying the executive team's salaries. And really I give to express my thanks.

Have a happy new year everyone...

Posted by csev at 02:36 PM

December 27, 2009

Repost: From the IMS Developer's Forum

This is a repost from the IMS Developer's forum - I forgot to put this in my own blog.

Possible issues with the OAuth C# library. I was working with some folks on C# Basic LTI and came across a seeming interoperability. Here is the discussion:

I looked at the Java Implementations and the PHP implementation and both seem to go to some length *to* double URL-encode the signature string. The PHP code interoperates with the Java code as distributed.

This results in the base signature string having %2520 where there are spaces. Which looks like a mistaken double-encode - but I think that it is an intentional double encode.

If you look at this page (broken into multiple lines to enhance readiblilty)

http://hueniverse.com/2008/10/beginners-guide-to-oauth-part-iv-signing-requests/

After you pick "Non-URL Safe Parameter" expand the little + signs and follow it through - it ends up with a base string that includes a %2520:

GET&http%3A%2F%2Fphotos.example.net%3A8001%2FPhotos&oauth_consumer_key %3Ddpf43f3%252B%252Bp%252B%25232l4k3l03%26oauth_nonce %3Dkllo~9940~pd9333jh%26oauth_signature_method%3DHMAC-SHA1 %26oauth_timestamp%3D1191242096%26oauth_token%3Dnnch734d %25280%25290sl2jdk%26oauth_version%3D1.0%26photo%2520size%3D300%2525 %26title%3DBack%2520of%2520%2524100%2520Dollars%2520Bill

As I look at the sample Java code below - it is effectively double encoding very much on purpose.

So far, this suggests that it is *correct* when spaces turn into %2520 in the pre-signature string instead of %20. So I am thinking that the the sample VB.NET code from oauth.net *might* be wrong.

Sample Java code

public static String getBaseString(OAuthMessage message) 
throws IOException, URISyntaxException { 
  List<Map.Entry<String, String>> parameters; 
  String url = message.URL; 
  int q = url.indexOf('?'); 
  if (q < 0) { 
    parameters = message.getParameters(); 
  } else { 
     // Combine the URL query string with the other parameters: 
    parameters = new ArrayList<Map.Entry<String, String>>(); 
    parameters.addAll(OAuth.decodeForm(message.URL.substring(q + 1))); 
    parameters.addAll(message.getParameters()); 
    url = url.substring(0, q); 
  } 
  return OAuth.percentEncode(message.method.toUpperCase()) + '&' 
    + OAuth.percentEncode(normalizeUrl(url)) + '&' 
    + OAuth.percentEncode(normalizeParameters(parameters)); 
} 

protected static String normalizeParameters( 
Collection<? extends Map.Entry> parameters) 
throws IOException { 
  if (parameters == null) { 
    return ""; 
  } 
  List<ComparableParameter> p = new ArrayList<ComparableParameter>( 
parameters.size()); 
  for (Map.Entry parameter : parameters) { 
    if (!"oauth_signature".equals(parameter.getKey())) { 
      p.add(new ComparableParameter(parameter)); 
    } 
  } 
  Collections.sort(p); 
  return OAuth.formEncode(getParameters(p)); 
} 

public static void formEncode(Iterable<? extends Map.Entry> parameters, 
OutputStream into) throws IOException { 
  if (parameters != null) { 
    boolean first = true; 
    for (Map.Entry parameter : parameters) { 
      if (first) { 
        first = false; 
      } else { 
        into.write('&'); 
      } 
      into.write(percentEncode(toString(parameter.getKey())) 
        .getBytes()); 
      into.write('='); 
      into.write(percentEncode(toString(parameter.getValue())).getBytes()); 
    }  
  } 
}
Posted by csev at 12:24 PM

December 26, 2009

Copyright Experience on YouTube!

I logged in to YouTube today and was greeted by the following message, "You have videos that may contain content that is owned by someone else." My first thought was, "Yikes - I am not intentionally a bad guy - nor am I intent on ripping anyone off - what had I done wrong?" It gave me a link to the offending video:

CHUM 2006 Drill Team Video (http://www.youtube.com/watch?v=vM6drBOzVjo)

Then it dawned on me - we had used "You Raise Me Up" by Selah as the background for the drill team. My thoughts raced - this was non-profit and this was about handicapped children riding horses and showing what they could do in front of their friends family and fans. How could YouTube be so heartless as to take away the background music from such a lovely and poignant moment. As the cameraman, I even sniffle part-way through the video, it was so moving for me personally. The music was what made it so poignant and without the music there would be no point. What hoops would I have to jump through to get the so important music back? Could I pay money to license the music? Probably there would not even be anyone to beg to restore the music. How could big powerful YouTube be so heartless and not notice the emotion in this video and cut us some slack?

With all these negative thoughts in my mind, I clicked on the video, expecting to hear silence and the dreaded "copyrighted material removed" message. Without the music, the video was meaningless - so I knew I had no other choice but to take it down. And it had 1800+ views and from the comments, it also moved some of those viewers to tears as well.

Drill Team AdThe video started out silent, but about five seconds in, the music was there! And about 2 seconds later an ad popped up for "You Lift Me Up". The Drill Team Video was still intact!

So I went back to the YouTube page where it said "Copyright Info" and this is what it said:

"Your video, Drill Team 2006 Video - Dedicated to Chum, may include content that is owned or licensed by these content owners: WMG Type: Audio content. No action is required on your part. Your video is still available worldwide. In some cases ads may appear next to your video."

Woah - the right thing just happened. I wonder if a human was involved in this - if so - thanks! Perhaps they saw that the video was very respectful of the original work and lovingly added value to the work without any attempt on my part to make money off the original work and instead my work hopefully in some small way added value to their work by honoring Selah's work rather than ripping it off.

It is nice when things work out in a win-win for everyone. Thanks YouTube.

Posted by csev at 12:53 PM

December 24, 2009

Saying: Folks who bring up vague "security holes" in competing products as their advantage are usually squirting squid ink.

I thought this one was funny so I wrote it in my blog. I was engaging in E-Mail reparte when I thought this one up :)

Folks who bring up vague "security holes" in competing products as their advantage are usually squirting squid ink.

I won't say who I was talking to or what we were talking about..

Posted by csev at 02:56 PM

December 23, 2009

First complete draft of "Python for Informatics" is ready for review

I spent the last week significantly revising "Think Python" in preparation for use in my course SI502 - Networked Programming that starts January 6.

I am at the point where I have reasonably polished text for the first 10 chapters of the book - which is what I will give to the students at the beginning of the semester and will be the first half of the course.

https://source.sakaiproject.org/contrib//csev/trunk/pyinf/tex/book.pdf

Once the course starts, I will write three more chapters (likely the night before lecture) when the topics come up in the class (Chapters 13, 14, and 15) in the extended table of contents in this version of the book.

https://source.sakaiproject.org/contrib//csev/trunk/pyinf/tex/book_full.pdf

I don't where I will go next after that, I may write the visualization chapter (18) - we will see how that course goes. In a sense the book_full.pdf is where I would like to see the book before I publish it for anything other than use in my class.

Of course, books are always smoothed by use in classes and I expect that by using this book in SI502 I will get solid feedback from my students and grad-student instructors.

Of course any comments are always welcome.

I am pretty geeked since it took less than 10 days to produce this book. Now I spend the rest of the break, writing some code, preparing for class in January, and starting that *other* book I keep meaning to write but keep getting distracted from.

Posted by csev at 03:57 PM

December 19, 2009

Rough Draft of "Python for Informatics"

Well it has taken a week to get to the first rough draft of my new SI502 text book titled, "Python for Informatics". Thanks to Allan B. Downey and Cambridge University Press and their forward looking open copyright, I already have 162 pages done. So far I have written a preface, changed Chapter 1, changed the order of the chapters, removed all text regarding recursion, removed object oriented and graphics content that was too advanced, and ran it all through LaTeX.

Here is a link to the most recent draft: Python for Informatics: Exploring Information. (This will always point to the latest draft.)

Here is the text from the preface of the book:

Remixing an Open Book

It is quite natural for academics who are continuously told to ”publish or perish” to want to always create something from scratch that is their own contribution. This book is an for me experiment in ”re-mixing” an book titled Think Python: How to Think Like a Computer Scientist written by Allen B. Downey, Jeff Elkner and others.

In December of 2009, I was preparing to teach SI502 - Networked Programming at the University of Michigan for the fifth semester in a row and decided it was time to write a Python textbook that focused on exploring data rather than a first programming course for Computer Scientists. My goal in SI502 was to teach people life-long data handling skills using Python. Few of my students would ever be professional computer programmers - instead, they would be librarians, managers, lawyers, biologists, economists, etc. In short, they represented every field outside of Computer Science.

I never seemed to find the perfect book for my course so I set out to write just such a book. Luckily at a faculty meeting three weeks before I was about to start my new book from scratch, Dr. Atul Prakash showed me the Think Python book which he had been using to teach his Python courses.

Think Python did follow the structure of most introductory Computer Science textbooks. It is a well- written text with a focus on simple explanations and ease of learning. Jeff Elkner is a High School teacher and so the language in the book is understandable at a High School level.

The book was available under the GNU Free Documentation License so I had all the permission I needed to use the book as the base material for my book. As a courtesy, I sent a note to Allen and Cambridge Press letting them know what I was about to do to their book.

I expect that by the time I am done with Python for Informatics over fifty percent of the book will be new. The overall structure will be changed to get to doing data analysis problems as quickly as possible and have a series of running examples about data analysis. Then I will add sections on regular expressions, data vizualization, working with spreadsheet data, structured query language using SQLIte3, web scraping, and calling REST-based Application Program Interfaces using Twitter.

What is interesting is how much of the original Think Python book material is completely relevant to this book and how much will fit right into Python for Informatics with virtually no change.

By starting with the Think Python book, I won’t have to write the basic descriptions of the Python language or how to debug programs and instead focus on the topical material that is the value-add of Python for Informatics.

I hope that this book serves an example of why open materials are so important to the future of education, and want to publicly thank Allen B. Downey and Cambridge University Press for their forward looking decision to make the book available under an open Copyright. I hope they are pleased with the results of my efforts and I hope that you the reader are pleased with our collective efforts.

Charles Severance December 19, 2009

Posted by csev at 01:32 PM

December 18, 2009

Why should you learn to write programs?

This is the first section of the first chapter of a new book project I am playing with called "Python for Informatics" which is a remix of the book "Think Python" by Allen B. Downey. Comments welcome.

Writing programs (or programming) is a very creative and rewarding activity. You can write programs for many reasons ranging from making your living to solving a difficult data analysis problem to having fun to helping someone else solve a problem. This book assumes that everyone needs to know how to program and that once you know how to program, you will figure out what you want to do with your newfound skills.

We are surrounded in our daily lives with computers ranging from laptops to cell phones. We can think of these computers as our "personal assistants" who can take care of many things on our behalf. The hardware in our current-day computers is essentially built to continuously as us the question, "What would you like me to do next?".

Our computers are fast and have vasts amounts of memory and could be very helpful to us if we only knew the language to speak to explain to the computer what we would like it to "do next". If we knew this language we could tell the computer to do tasks on our behalf that were reptitive. Interestingly, the kinds of things computers can do best are often the kinds of things that we humans find boring and mind-numbing.

For example, look at the first three paragraphs of this chapter and tell me the most commonly used word and how many times the word is used. While you were able to read and understand the words in a few seconds, counting them is almost painful because is is not the kind of problem that human minds are designed to solve. For a computer the opposite is true, reading and understanding text from a piece of paper is hard for a computer to do but counting the words and telling you how many times the most used word was used is very easy for the computer:

python words.py
Enter file:words.txt
to 16

Our "personal information analysis assistant'' quickly told us that the word "to" was used ten times in the first three paragraphs of this chapter.

It is this very fact that computers are good at things that humans are not so good at is why you need to become skilled at talking "computer language". Once you learn this new language, you can delegate mundane tasks to your partner (the computer), leaving more time for you to do the things that you are uniquely suited for. You bring creativity, intuition, and inventiveness to this partnership.

Posted by csev at 12:00 PM

December 16, 2009

OpenSocial Widgets - Validating Signed Requests

It is fun when things move quickly. On Monday morning while reading Twitter on my inbound commute, I saw a tweet from Martin Dougiamas about Moodle 2.0 design being different than Moodle 1.0 since things are very different in 2009 than in 2003. He saw things like Ning, etc as part of the mix these days. Back in 2003 things were much simpler so Moodle 1.x could be much simpler.

So I thought to myself, "If Martin is thinking about Ning - maybe I should take a look at it...". I asked a few friends if they knew anything about Ning. It turns out Michael Korkuska knows some folks at Ning - so I asked Michael if Ning is interested in education. He said there was some interest in education (I was sending E-Mail to Michael Monday night while driving home).

So on the last 40 minutes of my commute Monday night, I idly wondered if there was a way to plug learning tools into Ning using IMS Basic LTI (my obsession).

Tuesday morning, I figured I would work through the Ning developer documentation and make a Ning App. So I started to look at Ning Apps. Woah! Ning Apps are OpenSocial apps. Well that *is* pretty cool excuse to learn OpenSocial coding. Sure it is Javascript, but they give you little pre-provisioned APIs to so stuff like set and get preferences (kind of like SCORM). And they tell you if the current user is the Owner of the widget or just a viewer of the widget. Cool! This will be easy - I was "almost done" before I even started.

Then I realized that this is all Javascript and as such there is zero security. Crap! People can run the whole thing in a Javascript debugger and call any API they like - grrr.

But then I found signed requests and how to validate requests - and in Python even! We are back in business:

http://wiki.opensocial.org/index.php?title=Introduction_To_Signed_Requests
http://wiki.opensocial.org/index.php?title=Validating_Signed_Requests

Oh yes... And then you can preload the data talking server to server to do this in parallel - and make these preloads signed.

http://wiki.opensocial.org/index.php?title=Remote_Data_Requests

Oh and one more thing - it uses OAuth. It does use a public/private key signing pattern instead of shared secret - but hey, it works and has some cool potential for simpler bootstrapping than shared secret. (And it is Tueday lunch time - about 24 hours since I saw Martin's Tweet).

Going forward - I think that I cannot build an OpenSocial Widget that directly implements IMS Basic LTI because JavaScript is a GIANT security hole that I think is unsolvable (I asked Noah if it could be solved and he said "no" and I never question Noah on matters of breaking JavaScript security).

But I think I can make a *lovely* little App Engine Application that exports a Widget out one end and connects to IMS Basic LTI out the other end seamlessly. While it would be nice to do it inside the widget completely, it appears that here is a *LOT* of variation between OpenSocial containers and that both the spec and vendor level of support is a moving target, the safest bet is to use as little of the OpenSocial API as one can get away with and do as much as possible in our own server to maximize interoperability and the ability to put in vendor-specific hacks as needed. With that in mind, a simple and elegant approach is pretty obvious and will take a few days of hacking to build. Of course I don't have those days right now since I want to write two books over the break - perhaps this will be an independent study next semester :).

I will end thinking, "what a difference 24 hours can make" when you have people who help you come up with new ideas and people who can help you think. To reward you for reading this rambling tome this far, here is a screen shot of IMS Basic LTI inside of Ning:

.

This is not real code yet - but it does send the signed form to the tool with the auto-submit within the OpenSocial widget. Here is source code

http://www.dr-chuck.com/ning/bltihack.xml

Please do not laugh too much - because I stopped in mid-hack to work on final exams for SI502 and SI539. I stopped once I realized that my in-widget approach was pointless and that a server would need to be involved.

Posted by csev at 03:40 PM

December 12, 2009

Learning LaTeX to remix the "Think Python" book to produce "Python for Informatics"

I am thinking seriously about adopting "Think Python" by Allen B. Downey as the SI502 textbook. I like this book in particular because it is open and as such, I can alter it towards my ultimate goal of a book titled "Python for Informatics" which is focused on data analysis in Python. Think Python is a good starting point and saves me from writing the basic stuff about variables, loops, etc.

It is written in LaTeX and so I need to learn LaTeX - here are my notes so far for getting LaTeX up and running under Mac OS/X and getting the ThinkPython book to render.

Install the MacTeX-2009 Distribution 

http://www.tug.org/mactex/2009/

It needs a style file which you install in the main book directory:

LATEX to HTML - http://hevea.inria.fr/

curl -O http://hevea.inria.fr/distri/hevea.sty

Then I run these commands manually since I don't 
have make installed because it is my 
Air is always short on disk space :(

latex book
makeindex book
latex book
dvips -t letter -Ppdf -o thinkpython.ps book
open thinkpython.ps

Then the issue is how to make new figures - Allen uses the classic XFig - I am looking for an alternative - I found two.

I found jPicEdt described on a Forum on MacRumors. But I simply could not figure out how to change Font size - so I kept looking.

Then I found LaTeXDraw - and while the UI confuses me - I did figure out how to put up a text box and change the font in about 45 minutes - urrg. So I think I can make new EPS figures if I want to add a chapter or two to the book.

So it looks like I can write text, make figures and off I go. I might even learn to like LaTeX... Many thanks to Allen B. Downey for having a great book with a nice copyright. Off I go remixing your stuff... :)

Posted by csev at 03:18 PM

December 09, 2009

IMS Basic LTI - Web Briefing

I just recorded a web briefing on IMS Basic LTI - it is 30 minutes long.

http://www.vimeo.com/8073453

Here is the abstract:

This is a recorded presentation about the IMS Basic Learning Tools Interoperability standard from imsglobal.org. This talk gives a high-level technical overview of Basic LTI and talks about how Basic LTI connects to IMS Common Cartridge (CC) and IMS Learning Information Services (LIS). This also talks about the status of market adoption amongst the LMS vendors and tool providers.

Posted by csev at 08:16 AM

December 04, 2009

The Funniest Thing I have *EVER* Seen on the Internet

I am having trouble typing this blog post because I have tears streaming down my face and my throat hurts because I have been laughing so much. I had to stop looking at the page for five minutes so I could calm down enough to type this blog post.

This is a real product on Amazon. Look at the customer images, customer tags, and the reviews of the product. Just trust me - but make sure you are in a safe place where you cannot hurt yourself.

Laptop Steering Wheel Table

You have been warned. My laptop screen has tear drops on it because I laughed so hard. Wisdom of crowds - Oh My!

Posted by csev at 06:35 PM

December 02, 2009

Help Designing a new Course at UM - Technology, Movies, and Culture

I need some help of smart people. I am working up a concept for an undergraduate course about "Information and Technology". Here is the current title and description:

TECHNOLOGY, MOVIES, AND CULTURE

This course will look at modern technology through the lens of movies and other popular culture representations of technology. We will look at topics like the Internet, Security, Social Networking, Artificial Intelligence, Economics of Information, Information Visualization, and other topics viewed through a lens of popular culture. While we will use popular culture representations of technology as a starting point, we will dig more deeply and actually understand how these technologies work in reality and example where and why popular culture representations of technology disconnect from the reality of technology. We will also look at the digital and other technologies used to make films and images.

The goal of the course is to actually teach folks about technology but use films and film clips as a way to teach. I have a few films that will be starting points that I like such as: Matrix, A Beautiful Mind, Eagle Eye, iRobot, etc - but I *know* I am only scratching the surface.

I am looking for films (or TV show episodes) that did a *reasonably good* job of representing technology in a way that I could build into a lecture where we actually learned about technology.

Please send me E-Mail with your ideas - or just update this document:

http://doxs.gooxle.com/Dox?docid=0AbX1ycQalUnyZGZ6YjhoeHdfMTZndDlyNnJjdw&hl=en

I changed some letters in the domain name from c to x (twice) and from g to x - so bots have a harder time hacking my doc.

Thanks in advance - and I look forward to your ideas and suggestions.

Posted by csev at 09:36 AM