Smart Views and Grade Center Problems in Blackboard 8.0.307.0

Some time ago, we received a report of an instructor having problems accessing the grade center within their course. The confirmed behavior resulted in several similar errors (often depending on the browser used) when attempting to load the grade center. These errors all began with the string “An unexpected error occurred while loading the Grade Center”, followed by varying statements, such as:

  • TypeError: this.visibleRows[pos] is null
  • syntax error
  • TypeError: Result of expression ‘a’ [null] is not an object.

After digging up a thread with a helpful post by Eric Knickerbocker that suggested that this might have been caused by an errant “smart View”, we were able to confirm that they had indeed being playing with smart views. That same thread offered a solution involving some URL hacking. This allowed us to get the tool to load appropriately,using a url that looked something like this:

https://your.server.edu/webapps/gradebook/do/instructor/manageCustomViews?course_id=THECOURSEID

While we still have not been able to determine the specific steps to replicate the problem, we have some theories. It may have something to do with smart view attempting to include disabled users in a view. Shortly after purging a data source, we noticed that the problem seemed to have resolved itself – only to return a day later. This was before the instructor had removed all the smart views in the course. A few of the smart views in question were being built on specific users, i.e. the view was created by selecting all the users in the list. It may be that certain logic behind the smart view function is failing when it attempts to access a record that is no longer enabled.

Safety First

If you choose to implement the above solution to get a grade center back, you should back up your data first. Downloading it in the form of a comma separated or tab delimited file will make sure that you have a local copy that is readily accessible.

You can do this by using the same method as described above. For example, to get to the download page without loading the grade center, you should be able to access a url like this:

https://your.server.edu/webapps/gradebook/do/instructor/downloadGradebook?dispatch=viewDownloadOptions&course_id=THECOURSEID

Generating a full course export and archive is also highly recommended before proceeding with something like this.

Taken For Granted

Anna on Marriage:

“None of what I’ve written above is new. It’s all been said before, including by me. But I think it’s worth repeating over and over until something changes.”

Indeed. And rarely is it said so well.

I think we found the link to the video she mentions by way of a tweet from Jim Woodell. Thanks Jim!

Why Blog

Once in a while Dave Winer hits one out of the park – this is one of those times:

“ … the posts I’ve written here have served as a calling card, a way of keeping my name and ideas on people’s minds.
… And that’s the role of a blog, it’s a way of communicating what you’re doing. Companies, consultants and authors need to do a lot of communicating, and blogs allow you to go direct, and be more efficient, less diluted. People get a real feel for who you are and how you think and what you’re like as a person.”

As sensational as that title (and some of the content that follows) is, if you can see past the numbers the logic is all right there. This post could just as easily been titled, ‘Why I blog’.

Pollanation

Bates College has posted an edited transcript of a talk by Michael Pollan that a few of us schlepped up to Lewiston to see a few weeks ago. It was worth the trip. After many were turned out due to limited capacity, he offered to repeat the talk again the following morning. We were lucky enough to be putting the standing in standing room only (those sitting on the floor had to leave) we wouln’t have made it back up there on a Tuesday morning.

Part of what was edited out of the posted transcript appears to be the questions and answers at the end. This is unfortunate, because they were some of the best parts of the talk. Mr. Pollan fielded questions regarding local food consumption and production, how the country handles food aid to other countries, and victory gardens on the white house lawn, among others. A number of these questions centered around a recent article of his in the New York Times.

They videotaped the event so I was hoping they would put it online. As yet I haven’t seen it show up, or at least haven’t found it anywhere. I guess if they are only posting edited transcripts, there’s not much hope to see the full session in video. Oh well.

I should mention that I discovered this event via one of my new-found favorite local blogs. Portland Psst! serves up “Food gossip. Reviews. And overheards.”, and offers a solid linkroll to boot. It’s not the easiest to pronounce when telling your friends about it (Portland what?), but Portland Psst! is a highly reccomended addition to your newsreader. What’s more, they just celebrated their 1,111th posting (on 11/1, no less!), so hop on over and give ‘em a slap on the back and a hearty hullo.

Return of the lazy sheep: auto-tagging delicious posts with greasmonkey

I use delicious to bookmark sites of interest. I also use it to send links to friends, since it makes for a much less intrusive way to send links than email. When I save a link, I want to describe it as best as possible so that I can find it again when I return. To this end, I add as many tags as I can.

One of the most powerful features of delicious is it’s ability to suggest tags for sites that other’s have already saved. By copying and pasting all these tags, I can be that much more confident of successfully retrieving the link with a search. However, this makes for a cumbersome workflow, especially when all I want to do is save a bookmark.

When I came across John Resig’s LazySheep bookmarklet, I was pumped. Alas, I was too late – the tool no longer worked due to API changes on del.icio.us. My excitement turned to disappointment. It was back to copy-paste or using ill-fitting extensions.

Enter the Auto Tag

Not to long ago, I finally got around to perusing the userscripts archive for a real solution. After all, I can’t be the only one with this workflow, right?

Sure enough – after a few clicks the AutoTag 2 userscript was installed and my hopes were confirmed. The standard bookmarklet in the browser now pre-fills the tags field, to which I can add or remove as needed.

Sheep on Safari, but no NetNewsWire

I use a few different browsers, including webkit based applications like Safari. Greasemonkey isn’t available for webkit browsers, but Greasekit is (you’ll need SIMBL).

My motivation for installing this for Safari was guided by another desire – to get the delicious button in NetNewsWire to run the AutoTag 2 userscript. I still haven’t figured out how to do this, but I have a few ideas to work around it.

For example, perhaps there is a way to add a custom Fluid app (it has userscript capability built right in) to the list of apps suggested in the preferences. An easier route might be to just replace one of those apps with a Fluid app, by renaming the Fluid app to something like, say, Pukka or Cocoalicious and dropping it into the Application folder.

Bah-Bah Bad Sheep?

It might be worth noting that his idea of “Lazy Sheep tagging” hasn’t been without it’s detractors. There has been some discussion as to the impact of this practice on the larger community, and it’s benefit for the user. Generally, the concern seems to be centered around the idea that by copying other people’s tags (being a lazy sheep) you are devaluing the data.

Part of this appears to be a reaction to how the LazySheep tool worked, in that it didn’t actually allow you to add your own tags. Instead, it automatically grabbed all the tags and saved the link without opening the delicious interface. This in itself offers an interesting look at differing approaches to the user experience – should the user even need to see the interface? What should constitute interaction?

As tempting as it is to delve into these juicy user experience questions, I think I’ll refrain from joining a 3 year old conversation for now. In the meantime, happy grazing.

Short and Stout

The Hyper Text Coffee Pot Control Protocol is a little over 10 and a half years old:

“The Hyper Text Coffee Pot Control Protocol (HTCPCP for short) is a protocol for controlling, monitoring, and diagnosing coffee pots. … Although the RFC describing the protocol is an April Fools’ Day joke and not to be taken seriously, it specifies the protocol itself accurately enough for it to be a real, non-fictional protocol.”

Users of the spec should take note of return code 418, “I’m a teapot”:

“Any attempt to brew coffee with a teapot should result in the error code “418 I’m a teapot”. The resulting entity body MAY be short and stout.”

Fixing Numara Footprint’s addressbook search with a Greasemonkey Userscript

UVM uses Numara Footprints to track client support tickets. When creating tickets from client submitted email, the application automatically fills out the contact information for the client, using their email to search against LDAP.

This search fails if the address from the incoming ticket is in the format uid@uvm.edu (as opposed to first.last@uvm.edu). This results in a significant number of tickets coming into the system with only an email address in the contact field.

It seems the only way to fix this is by copying the uid, clearing out the rest of the fields, and searching by uid again. This needs to be done for every affected ticket.

Firebugs, Greasemonkies, and Mr. DOM

Lately I’ve found myself spending too much time copying and pasting fields in footprints. So the other day I took a quick spin through the ticket editing interface with my trusty Firebug. Minutes later I was able to replicate the functionality needed to fix the problem, using Javascript and the supplied DOM elements.

The next logical step was to encapsulate this into something that can be used outside of the development interface, and triggered automatically.

Enter the Greasemonkey. Greasemonkey is an extension for Mozilla Firefox that allows you to run custom scripts on pages that you are visiting. Think of Greasemonkey as a little mechanic that lives in your browser. It has a bunch of tools that it uses to alter or fix pages that you visit. These tools are known as Userscripts.

Turns out it’s pretty easy to write these Userscripts. Based on my spelunking in the DOM cave with Firebug, I slapped together a Userscript to fix my address book problem upon opening the ticket. Now when I load up the ticket editing interface, the contact information is automatically filled out — even if the ticket was created with an inconveniently formatted email address.

Lazyweb to the rescue

I was in a hurry, and didn’t feel like digging through my old code or writing new stuff to handle some of the grunt work that this tool needed. I borrowed a handy email address parser from Ben Nadel at Kinky Solutions, and a url parameter grabbing function from Netlobo.

Installation and use

  1. You’ll first need the Greasemonkey extension for Firefox. If you need this (or Userscripts in general) in Safari, I’d recommend taking a look at SIMBL and Greasekit.
  2. Install the Userscript.

Goodwill all around

goodwill.jpg Looks like Goodwill is on Twitter (not to mention Facebook and MySpace).

At the moment, their Tweets seem to consist mostly of press releases and hiring opportunities. It would be nice to see them start highlighting interesting items on their auction site as well.

Reuse is my favorite of the three R’s. The others, if you are wondering, being Reduce and Recycle. While Reducing consumption is on it’s face the most effective, Reusing is much more fun. It takes much less energy and resources than Recycling. That makes it the coolest sibling, no contest.

Goodwill’s emphasis on reuse is one reason it is up there in my favorite types of businesses. Add to that a local focus and a belief in people, and you have a solid winner.

It’s good to see such solid non-profit organizations embracing marketing tools like these.

NetNewsWire to FriendFeed

nnw-to-ff.pngAfter building an applescript to post items from NetNewsWire to FriendFeed, I settled on using FriendFeed’s own bookmarklet from within NetNewsWire. Here’s the how and why.

I’ve been using NetNewsWire’s Clippings feature as a sort of light-weight alternative to posting links to my del.icio.us account. It makes for a one-click bookmarking experience, without having to wait for the del.icio.us tagger to load. I still use del.icio.us to save links that I’ll want to reference later, or that I want to send to someone (i.e. tagging it with for:username) since I don’t generally send links via email.

This tagless approach to bookmarking by way of the Clippings tool works pretty well most of the time. It generates an RSS feed, which these days is fairly easily re-mixable, and thus integrates into things like Feedheads in Facebook, and other places. Yet it is missing features, like being able to add a brief blurb, or allow others to comment.

Enter FriendFeed, which does have these features. However it doesn’t quite allow for the auto import of NetNewsWire’s clippings feed. It does import Google Reader’s shared items, but it sounds like a NNW to Google Reader sync is a long way off, at the least (though there does appear to be some workarounds). Hopefully the folks at FriendFeed will add NewsGator as a service soon, but for now NetNewsWire is pretty easy to script, and FriendFeed’s API can be used with a one line curl command. With that in mind, I started by adapting the existing “blogselection” script to post the current headline to FriendFeed.

set theFriendFeedUser to "YOURUSERNAME"
set theFriendFeedSecretKey to "YOURSECRETKEY" -- get it at https://friendfeed.com/account/api
tell application "NetNewsWire"
  set theArticle to the selectedHeadline
  if theArticle is not false then
    set theText to the description of the theArticle
    set theLink to the URL of theArticle
    set theTitle to the title of theArticle
    set theBlog to the givenName of the subscription of theArticle
    set theBlogLink to the home URL of the subscription of theArticle
    do shell script "curl -u \"" & theFriendFeedUser & ":" & theFriendFeedSecretKey & "\" -d \"title=" & theTitle & "&link=" & theLink & "\" http://friendfeed.com/api/share"
  end if
end tell

Since I didn’t want to store the keys in the script, I adapted Andrew Faden and Larry Staton’s del.icio.us applescript to allow local storage of the user and api key.

Applescript is still kind of awkward, and to be able to allow the entry of a block of text was looking like more trouble than it would have been worth. I also couldn’t seem to find a solid set of documentation on NetNewsWire’s applescript hooks (perhaps my Google Fu failed me here – am I missing something, or is this just not well documented?).

After using the script for a bit, and feeling lukewarm about it, I realized that you can call a bookmarklet as a script in NetNewsWire. Could it be that easy? Turns out it is. All you need to do is copy the bookmarklet’s javascript (which can be done via a right click and a copy link location) into a .js file and paste it into a file to be saved in NetNewsWire’s scripts directory.

Now you have access to the Friendfeed bookmarklet and all it’s bells and whistles, which include being able to include images by clicking on them. Who needs a FFFFOUND! invite, when you have FriendFeed?

If you’re interested in the applescript, you can download or clone it from github.

I think I can, I know I can

Friend (and client) Mark Floegel is one of my favorite writers. If you’re not subscribed to his commentaries (available in RSS format or via mailing list), you are missing out.

When Mark wrote the other day of his troubles with blogging, I started composing a response in my head, with encouragement – likely somewhere along the lines of the title at the top of this post. As it turns out, someone did it for me. A few days later, Ethan Marcotte’s Unstoppable Robot Ninja pointed it’s steely finger to an inspiring “Dear Shaun” letter.

Your $x (whatever your reason for it) is not some fragile vase that is going to shatter the second you $y. It is as strong as you decide it is, and the boundaries are where you set them.

Alison vocalizes something I’m constantly struggling with. She so elegantly reminds us that the slow dogged pursuit of [insert goal here] is not about perfection, but about one boot in front of the other. Even if you only take a step once in a while. However, the more steps you take, the easier it gets to lift your foot.

My Special Lady Friend’s sister is starting a tea company. I encouraged her to start blogging, but I think it took her a while to warm up to it. The last time I saw her she confirmed this, and suggested that the tipping point for her was when she realized she just had to do it. Once she got past that point, things flew along, and she seems to have taken to blogging like the British to, well, tea. This describes about every post I’ve ever written, and is a story any writer is likely to be familiar with.

The guilt of procrastination and the fear of flawed results that creeps into the back of my mind is a constant battle. Yet it’s when we move forward without fear that we can learn and grow. The pursuit of perfection is a noble banner to carry, but in the words of the Kwisatz Haderach, “fear is the mind killer”. More to the point, practice makes perfect. Or perhaps at least it makes for improvement.

Ah, but once again, I’m rambling, and falling into digression (and probably bad english). The above isn’t meant as an exercise in finger wagging (self directed or otherwise), but in writing.

Mr. Floegel, you don’t have to “blog” a lick – but please, pretty please, don’t stop writing.