There is a shop in the heart of Kreuzberg in Berlin that sells nothing but tiny instruments. I’ve walked by it several times, over several trips to the city, and each time I do I become more interested in tiny instruments.

Most especially the “banjo uke” (aka “banjolele”), a ukulele-sized banjo (or is it a ukulele in with banjo clothing?). It ticks all my “strange hybrid” boxes, it’s portable, and it sounds (I imagine, for I’ve never heard one) like a banjo, the most sweet and mournful of the stringed instruments.

And so, ever since, I’ve had my eye out for a banjo uke of my own: every time we’ve been to Halifax in the last couple of years I wander into the Halifax Folklore Centre trying to look all cool and musiciany and inevitably panic and flee before any of the clerks have a chance to quiz me on pentatony or fret management before they allow me to touch anything.

Which is why I knew I had to spring into action this morning when the following Kijiji alert hit my inbox:

It was a banjo uke. In Prince Edward Island. In nearby Vernon River, no less.

I phone.

Still got it? Yes! Can I see it? Come any time! How about 2:00 p.m.? See you then!

I pile into the car at 1:30 p.m. and head east toward Vernon River. Take the second left turn after the bridge as instructed. Locate №176. Pull into the driveway. Brave the rain and dash to the side door.

“You Pete?” asks the wealthy American industrialist renovator (assumptions on all but the last point).

“Come on in,” he says, “this is Sam. Want a coffee?”

The banjo uke is presented. Purchased at auction somewhere near Vinalhaven, Maine. It’s a Le Domino brand, made in America, with a domino pattern on the front and back. In not-bad-shape.

I do a round of My Dog Has Fleas. Hold it up to the light.

“I’ll take it!” I proclaim.

For how often does one find a domino-pattern-emblazoned banjo uke for sale in Vernon River?

Back out into the rain.

In the car it occurs to me that, relatively speaking, I’m not too far from Georgetown where I recall there being a business, across from the Kings Playhouse, in the business of repairing stringed instruments. “The Guitar Man,” it was called. I had ice cream next door last summer. Unable to track down a phone number, I decide to brave the rain and drive up for a visit.

“Maybe he’s a reclusive luthier with no phone,” I reason to myself.

I arrive in beautiful downtown Georgetown 30 minutes later. No sign of The Guitar Man where I remember him. The personable administrator in Georgetown Town Hall spots me looking confused and asks if she can help. I tell my story.

“He moved to Charlottetown in the spring,” she reveals.

I am ushered into Town Hall and she offers to give me the new address in town. Unable to find it quickly, she simply raises the luthier on the phone, chats for a second, and then hands me the phone.

“You’re not the first person to drive to Georgetown by accident looking for me,” the luthier explains.

We make arrangements for me to visit his new in-town shop; as it happens I walk by every day on the way back from Oliver’s school drop-off and pay it no heed.

“Be sure to go to the Maroon Pig while you’re in Georgetown,” the luthier recommends.

This recommendation is seconded by the personable administrator.

So I go to the Maroon Pig. Which is an art gallery and bakery. I feel compelled to purchase things, as on this rainy day it seems like customers will be rare. I purchase a sticky bun, violating my don’t-eat-sugar habit of late, and some dessert for the family and a loaf of bread.

I almost drop the sticky bun on my way out the door but I catch it at the last minute. It is very good but, having a don’t-eat-sugar habit of late, it immediately sends me into a bizarre sort of sugar mania. It’s not unpleasant.

I drive back to town. Find the luthier: AMJ Guitars he is called. “Your Downtown Guitar Service Shop” says his website. Amazing. We have a downtown guitar service shop in Charlottetown. I should have been buying banjo ukes years ago.

Adam, the luthier (Adam M Johnston) is the least pretentious luthier I have ever met. Yes, he can breath some new life into the banjo uke, he tells me: clean it up, lower the (insert technical term for the thingy that holds up the strings) and re-string it. $40 plus strings. Seems like the deal of the century.

He’s got a lot of work queued up, so it will be a few weeks. “Fine,” I tell him, “I’ve gone 47 years without owning a banjo uke; I can wait another couple of weeks.”

So, other than My Dog Has Fleas, I’ve still yet to play my new banjo uke. But already it’s taken me to Georgetown for sticky buns and made me aware I’ve a luthier just 3 blocks from my house.

I should have been buying banjo ukes years ago.

🗓️
Travel  •  Prince Edward Island  •  Georgetown  •  Banjo Uke

I have found myself in the happy happenstance of having my very own researcher. Scott Bateman, a colleague from back in the www.gov.pe.ca days from a decade ago, is now a assistant professor in the Computer Science and Information Technology department at the University of Prince Edward Island.

Scott’s research interests include “collaborative and social computing, information seeking and visualization, and interaction techniques for video games” and in that light he approached me with an idea earlier this year: knowing of my interest in electricty generation and load monitoring (here, here, here), Scott was interested in the possibility of investigating how everyday devices in the home might be used to influence personal “energy behaviour.”

Although he didn’t put it this way (and would likely speak of this work less dramatically, being a more sensible person than I am) what he was essentially talking about was doing some work on the problems that Bruce Sterling outlined in the Viridian Manifesto in 2000. Like this:

The stark fact that our atmosphere is visibly declining is of no apparent economic interest except to insurance firms, who will simply make up their lack by gouging ratepayers and exporting externalized costs onto the general population.

With business hopeless and government stymied, we are basically left with cultural activism. The tools at hand are art, design, engineering, and basic science: human artifice, cultural and technical innovation. Granted, these may not seem particularly likely sources of a serious and successful effort to save the world. This is largely because, during the twentieth century, government and industry swelled to such tremendous high-modernist proportions that these other enterprises exist mostly in shrunken subcultural niches.

Scott proposed that he become a contract researcher for Reinvented Inc. under the Industrial Research Assistance Program of the National Research Council, investigating opportunities for the creation of what we have taken to calling, shorthand, “thingy development.” The “thingy” being, well, a thingy in a house that, in some way, modifies the owner’s energy-using behaviour in a positive way.

This seemed like a good idea to me: ideas I’m interested in both personally and “corporately” could be forwarded, Scott’s research interests could be forwarded and “market opportunities” for Reinvented might manifest. One imagines this is exactly what IRAP is supposed to do.

Scott and I are on the same page as regards to intellectual property for this enterprise: we’re both believers in the power of openness, and neither of us had any interest in keeping this work secret.

The paperwork for the IRAP funding has been wending its way through the system and this week Scott received and NDA – non-disclosure agreement – for the project from the NRC. He rightly assumed that no such NDA was required, given our commitment to openness, and replied as such.

But this got me thinking: what about, instead of an NDA, we sign an MDA, a Mandatory Disclosure Agreement. This agreement would stipulate not only that the results of this project will be made public and open, but also compel us to explain and interpret these results. To make an effort, in other words, to disclose what we’re up to.

Happily again, this aligns with another one of my research interests (if that’s what you call them), expressed most obviously in this letterpress-printed broadside from last year:

You Have An Obligation to Explain

That broadside, in turn, had its birth three years earlier in a lecture I gave to a Philosophy of Technology course at UPEI called Privacy and the Obligation to Explain.

So, in other words, ideas born in a philosophy lecture spring to life on the letterpress and then later give rise to a “working philosophy” in a computer science project that eventually might reach the “market.” I’m pretty sure that’s how a university is supposed to work.

🗓️
NDA  •  MDA  •  Design  •  Intellectual Property

While it’s possible to argue that Mitch Podolak’s greatest invention is the Winnipeg Folk Festival, an equally compelling argument can be made that it’s actually Home Routes, the Canadian “house concert circuit” that he co-founded.

Here in Charlottetown one of the stops on the Home Routes trail is the Elmwood Heritage Inn on North River Road. By chance I ended up on the mailing list for their series when my old friend Eve played there two years ago and I’ve had the pleasure of returning to Elmwood 3 or 4 times since. It is a wonderful tiny venue for music, and Carol and Jay are warm and generous hosts. It makes seeing music in larger venues seem cold and barbaric by comparison.

Yesterday was the opening of the 4th season of Home Routes concerts at Elmwood and it was a wonderful afternoon: Red Moon Road from Winnipeg, fresh off the ferry from Cape Breton, set themselves up in the living room and played to an enthusiastic crowd of about 15 people from the neighbourhood.

They had me from the opening line of their tune Come Home:

Little Wilhelmina was abandoned,
in circumstances imagined to be tragic,
maybe magic,
was involved,
Like her parents met an evil witch,
who took the baby and made a switch,
for cabbage,
and so managed to escape.

The song is, despite the wit of the opening, a rather tragic one. But so well told, and with such musicianship:

It’s difficult to convey in words how much joy effuses from this trio; they may be the happiest band I’ve ever seen play; they genuinely love playing and it shows. Each is an accomplished musician and storyteller and each brings something to the mix; they are a trio in the truest sense of the notion, and to watch them interact is a thrill.

Red Moon Road at Elmwood

You’ll have two more chances to see Red Moon Road on Prince Edward Island this fall: they play a Home Routes concert in Summerside on September 24 (email tim@homeroutes.ca for details) and then the Trailside in Mount Stewart on October 3rd.

You really should make an effort to see them.

🗓️
Music  •  Charlottetown  •  Home Routes

I’ve extended my code that interacts with StudentsAchieve to allow the harvesting of attendance data for your child. There are now methods in the class to support grabbing attendance for a given date or range of dates and I’ve built a sample script, get-attendance-ical.php, that will grab attendance data for a range of dates and output an iCalendar file suitable for import into an application like iCal or Google Calendar.

Fortunately for me (but alas not for him), Oliver’s back-to-school cold caught up with him on Thursday, so he was absent, giving me useful data to test my regular expressions for parsing status data out of the StudentsAchieve HTML. So here’s the resulting calendar for him, loaded into iCal, showing attendance (taken twice a day) for the last week:

When I spoke about Applications vs. Capabilities back in 2009 at the Access Conference, it was this kind of thing that I was talking about: I want the entities in my life to participate in an open data ecosystem, not create “destination portals.” Don’t make me login to proprietary systems: instead, allow me to exchange data with you, using open standards, so that I can integrate you into whatever collection of tools I use to support my own particular information management needs.

In other words, build capabilities, not applications.

🗓️

I’ve been hearing about the StudentsAchieve system used by Prince Edward Island schools since I first started working with the PEI Home and School Federation. In elementary grades StudentsAchieve is only used for tracking attendance, and there’s no provision for parent access to the system, so although I’ve been actively engaged in advocating for improved access to and use of StudentsAchieve it wasn’t until today that I actually got to use it myself.

Oliver’s in intermediate school now, and starting at grade 7 the system is used to record marks and share information about homework in additional to tracking attendance, and there’s provision for online access by parents through a web system. We got our username and password for Birchwood’s StudentAchieve system this afternoon, and so, at long last, I got to take it out for a ride.

The system was first implemented on PEI in 2006, and its design and usability make it clear that it has its roots in an era in web history not particularly concerned with the niceties of either. It works, yes, but its ugly and confusing and makes me feel sad.

Fortunately all is not lost: the web is open, and web systems, by their very nature, are open to reinterpretation through code. The data, in other words, is there: if I want it to be beautiful, I can do so myself.

By way of starting this process, I’ve started to code a PHP class for automated interaction with StudentsAchieve. All this code does is to mimic the same actions that a parent takes using a web browser – logging in, clicking on things, etc. – it just does it all automatically and takes the information it finds and makes it available in “machine readable” form that can then be reimagined.

The code is primitive right now: all it does is “login” to StudentsAchieve using your parent username and password and retrieve a list of classes, teachers and email addresses (and even then it only works, as far as I know, for households with a single student).

But the heavy lifting of getting a script to login to StudentsAchieve is done, and as a sort of “proof of concept” I used the code to create a PHP script to create a vCard file of all of Oliver’s teachers. Using the script I can do this:

php get-teacher-vcard.php username password

(substituting my actual parent username and password) and then this happens:

Logging in to StudentsAchieve...
Making a vCard file...
Saved a vCard file called 'BirchwoodIntermediateSchool.vcf'.
Load this into your address book.

And, sure enough, when I open that BirchwoodIntermediateSchool.vcf file in the Contacts app on my Mac and then search for “Teacher”, I see all of Oliver’s teachers:

Contacts App Screen Shot

Given the hullabaloo last year about unauthorized student access to StudentsAchieve it’s important to note that this code doesn’t take advantage of any capability of StudentsAchieve not exposed to the web: you still have to be an authorized parent with a username and password to use it, and you only have access to the same information about your child that you have in an interactive web browser.

🗓️
StudentsAchieve  •  PHP  •  Home and School

I am deeply, passionately, monogamously, long-term lovingly committed to The New Yorker magazine. It’s the only magazine I subscribe to, a subscription that, against my character, I simply set to auto-renew in perpetuity.

I adore absolutely everything about the magazine (except the poetry and, with some rare exceptions, the fiction). If you told me I’d be sent to a desert island but could take a stack of New Yorkers with me (and, probably, some food), I’d be happy. Lonely, but happy.

So when The New Yorker redesigns parts of itself it’s a big deal in my life. And thus when I watched this video announcing some of the changes I held my breath and felt both giddy anticipation and a sense of foreboding: what if they get it wrong, I thought.

It’s not that the magazine need never change (although it’s glacial pace of change is one of its most endearing qualities), and I’ve enjoyed some of the small unannounced design touches that have been introduced in recent years. But. I. Still. Hold. My. Breath.

The September 23, 2013 issue, where the “Goings On About Town” changes will be introduced, won’t arrive in Charlottetown until sometime next week (the magazine’s cover date is the date it goes off sale, and it’s a rare week that I receive an issue before that date). I took a peek online to see what’s in store (something I almost never do: The New Yorker is about print for me, and reading it online makes it seem soulless). I don’t dislike it.

The New Yorker Goings On About Down Redesign

🗓️

My friend Claude has a much better camera than the abysmal one on my phone; he was visiting my office on auction business this morning and generously snapped a photo of the completed Youngfolk & The Kettle Black “Cameron Block Blend” coffee bag in all its two-colour splendour.

Cameron Block Blend

One of the nice things about this photo is that it lets you see the physical structure of the bag that influenced some of the design decisions: the creases that run horizontally, for example, forced me to print things closer to the “top” than I would have otherwise (although I see now, looking at this again, that the design would have benefitted from 2 or 3 additional points of leading between “Cameron Block Blend” and the body text, leading that wouldn’t have caused conflict with the creases).

🗓️

Here’s the red, printed as a second run after the black had a chance to dry for a while. I really gotta get myself a better camera. Available filled with coffee as soon as they can figure out what “Cameron Block Blend” is.

Untitled

🗓️

Oliver and I were sitting out on a bench on Victoria Row one day this summer when he noticed “Cameron Block” at the crest of the block of buildings that include Youngfolk & The Kettle Black. Which got me thinking: who was Cameron?

Cameron, it turns out, was Ewen Cameron. Among other things he was Speaker of the House of Assembly, insurance agent, realtor, shipbuilder, and teacher. He died an untimely death, at the age of 43, in 1831, drowning off what is now Victoria Park. During his legislative career Cameron was active in the consideration of bills to extend the vote to Roman Catholics and to end slavery.

The Cameron Block wasn’t completed until 54 years after Ewen Cameron’s death – it was developed by his son-in-law Horace Haszard and designed by William Critchlow Harris – but it sits on the site where the family had long roots.

To help memorialize Ewen Cameron – in an email to me, Boyde Beck called him “one of the most most tantalizing ‘might-have-beens’ in that era of politics – and the building that came after him, I’m printing up coffee bags for a “Cameron Block Blend.”  They’ll be two colour; what you see below is the black, which contains a (very) short biography of Cameron (I hope it’s enough to prompt the coffee drinker to dig deeper). Red to follow this afternoon.

Cameron Block Blend

🗓️

I want to build systems around the information that’s stored about me and the materials I’ve borrowed in the Provincial Library Service’s online system, but the SirsiDynix used for this doesn’t have any hooks to allow me to do this, so I’ll have to build my own.

By way of doing this, I need to understand to “login” to my library account in SirsiDynix from a script. Here’s what I’ve learned.

How SirsiDynix Authentication Works

The link SirsiDynix system from the front page of the Provincial Library Service’s website goes to:

http://library.pe.ca/catalogue-en

This URI is a 302 redirect to:

http://24.224.240.218/

which itself, in turn, gets 302 redirected to:

http://24.224.240.218/uhtbin/cgisirsi.exe/x/x/0/49/

This is the last URI in the journey that doesn’t contain parameter related to my “session”: this URI sends my browser a session_security cookie with a value of 259310010 and then 302 redirects me to a URI that has this value embedded in the ps parameter:

http://24.224.240.218/uhtbin/cgisirsi.exe/?ps=3SoTIEJTW9/PLS/259310010/38/1/X

which sends me a session_number cookie with the same value of 259310010 and then 302 redirects me to:

http://24.224.240.218/uhtbin/cgisirsi.exe/?ps=wyIB2k9pHm/PLS/259310010/60/1180/X

Entering my library card barcode and PIN in the header and clicking “Login” does an HTTP POST to:

http://24.224.240.218/uhtbin/cgisirsi.exe/?ps=8N5QS6vOI2/PLS/259310010/303

sending the card number as the user_id parameter and the PIN as the password parameter.

The response to this POST sets cookies of the same name (user_id and password) and updates the session_security and session_number cookies with a new value.

In the above URIs, the initial part of the ps parameter – 8N5QS6vOI2 for example – appears to be random and meaningless and I found that it could be changed or the same value used all the time without ill effect.

Automating SirsiDynix Authentication

With the above reverse-engineering, we have enough to automate the login process using PHP and cURL.

First, let’s set some variables that we’ll use later:

$user_id = "XXXXXXXXXXXXX"; // replace with your card number
$pin = "YYYY"; // replace with your PIN
$baseurl = "http://24.224.240.218"; // root URI of SirsiDynix server

The first task is to start a SirsiDynix session, and to grab the value of the session_security cookie that we’re sent back; we do this with cURL:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $baseurl . "/uhtbin/cgisirsi.exe/x/x/0/49/");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_COOKIESESSION, true);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_COOKIEFILE, "/tmp/sirsidynix-cookies.txt");
curl_setopt($ch, CURLOPT_COOKIEJAR, "/tmp/sirsidynix-cookies.txt");
$result = curl_exec($ch);

preg_match('/^Set-Cookie:\s*([^;]*)/mi', $result, $m);
parse_str($m[1], $cookies);
$session_security_cookie = $cookies['session_security'];

The key ingredients here are the setting of the CURLOPT_HEADER open to true (so that we can parse the cookie out of the headers), and setting the CURLOPT_COOKIEFILE and CURLOPT_COOKIEJAR options so that subsequent requests will pass back the same cookies.

With the value of $session_security_cookie set, we can now login by doing an HTTP POST:

$loginurl = $baseurl . "/uhtbin/cgisirsi.exe/?ps=8N5QS6vOI2/PLS/" . $session_security_cookie . "/303";
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $loginurl); 
curl_setopt($ch, CURLOPT_POSTFIELDS, "user_id=$user_id&password=$pin"); 
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_COOKIEFILE, "/tmp/sirsidynix-cookies.txt"); 
curl_setopt($ch, CURLOPT_COOKIEJAR, "/tmp/sirsidynix-cookies.txt"); 
$result = curl_exec($ch);

That’s it: we’re now “logged in” to SirsiDynix, and we can use this session to interact with the system as though we were using a web browser.

Retrieving Checked Out Items

One thing we might want to do now that we’re “logged in” is retrieve a list of the items we have checked out. We can retrieve a list of the paths for all of our checked out items like this:

$itemsurl = $baseurl . "/uhtbin/cgisirsi.exe/?ps=07P15KtNyC/CHA/" . $session_security_cookie . "/30#";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $itemsurl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_COOKIEFILE, "/tmp/sirsidynix-cookies.txt");
curl_setopt($ch, CURLOPT_COOKIEJAR, "/tmp/sirsidynix-cookies.txt");
$result = curl_exec($ch);

$regex = '/\\Details\\<\/a\\>/';
preg_match_all($regex, $result, $matches);
$checked_out_items = $matches[1];

This results in a $checked_out_items array that looks like this:

Array
(
    [0] => /uhtbin/cgisirsi.exe/?ps=obViAQ0yfH/CHA/152430023/5/3?searchdata1=293432{CKEY}&searchfield1=GENERAL^SUBJECT^GENERAL^^
    [1] => /uhtbin/cgisirsi.exe/?ps=TGF3wAfAQt/CHA/152430023/5/3?searchdata1=104284{CKEY}&searchfield1=GENERAL^SUBJECT^GENERAL^^
)

We can now iterate over those paths and parse out the title, author, ISBN and date due:

foreach($checked_out_items as $key => $url) {
    $item = $baseurl . $url;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $item);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_COOKIEFILE, "/tmp/sirsidynix-cookies.txt");
    curl_setopt($ch, CURLOPT_COOKIEJAR, "/tmp/sirsidynix-cookies.txt");
    $result = curl_exec($ch);

    $regex = '/(?:(?Us)\\(.{0,})\\<\/dd\\>)/';
    preg_match($regex, $result, $matches);
    $items[$key]['title'] = trim(html_entity_decode($matches[1]));

    $regex = '/(?:(?Us)\\\\n(.{0,}) .{0,}\\<\/dd\\>)/';
    preg_match($regex, $result, $matches);
    $items[$key]['author'] = trim(html_entity_decode($matches[1]));

    $regex = '/(?:(?Us)\\(.{0,})\\<\/dd\\>)/';
    preg_match($regex, $result, $matches);
    $items[$key]['isbn'] = trim(html_entity_decode($matches[1]));

    $regex = '/(?:(?Us)\\Due:(.{0,})\\<\/td\\>)/';
    preg_match($regex, $result, $matches);
    $items[$key]['datedue'] = trim(html_entity_decode($matches[1]));
    $items[$key]['datedue_unixtime'] = strtotime($items[$key]['datedue']);
}

Using regular expressions (put together and tested using the excellent Debuggex tool), the metadata for each item is parsed out; the result, after all items have been iterated over, is an $items array that looks like this:

Array
(
    [0] => Array
        (
            [title] => Reporting : writings from The New Yorker
            [author] => Remnick, David.
            [isbn] => 0307263584
            [datedue] => 6 Oct 2013
            [datedue_unixtime] => 1381028400
        )

    [1] => Array
        (
            [title] => Start & run a coffee bar
            [author] => Matzen, Thomas, 1963-
            [isbn] => 1551803542
            [datedue] => 6 Oct 2013
            [datedue_unixtime] => 1381028400
        )

)

Created iCalendar Events for Due Dates

Now that we’ve pulled out all the checked out items, we can create iCalendar events for each one; rather than using some sort of heavyweight iCalendar class, we just manually stitch together the iCalendar files:

foreach($items as $key => $item) {

    $ical = "";
    $ical .= "BEGIN:VCALENDAR\n";
    $ical .= "CALSCALE:GREGORIAN\n";
    $ical .= "PRODID:-//Date Due Processor //DateDue 1.1//EN\n";
    $ical .= "VERSION:2.0\n";
    $ical .= "METHOD:PUBLISH\n";
    $ical .= "BEGIN:VEVENT\n";
    $ical .= "TRANSP:TRANSPARENT\n";
    $ical .= "STATUS:CONFIRMED\n";
    $ical .= "SUMMARY:" . $item['title'] . "\n";
    $ical .= "DTSTART;VALUE=DATE:" . strftime("%Y%m%d", $item['datedue_unixtime']) . "\n";
    $ical .= "DTEND;VALUE=DATE:" . strftime("%Y%m%d", $item['datedue_unixtime']) . "\n";
    $ical .= "END:VEVENT\n";
    $ical .= "END:VCALENDAR\n";
    
    $fp = fopen("icalendar-" . $key . ".ics","w");
    fwrite($fp,$ical);
    fclose($fp);
}

When the resulting .ics files get loaded up into iCal on my Mac, they look like this:

iCal showing book dates due on calendar

Grab the Code

You can grab the code outlined above as sirsidynix-to-ical.php from GitHub; to use it in your particular SirsiDynix setup will require that you change the base URL and might require that you modify the URLs for logging in, retrieving items, and so on.

In theory you should be able to automate any action that a patron can otherwise perform interactively using a browser, from renewing loans to placing and reporting on holds. I welcome reports of the use of this code elsewhere.

🗓️

About This Blog

Photo of Peter RukavinaI am . I am a writer, letterpress printer, and a curious person.

To learn more about me, read my /now, look at my bio, listen to audio I’ve posted, read presentations and speeches I’ve written, see things I’ve favourited elsewhere, or get in touch (peter@rukavina.net is the quickest way).

I have been writing here since May 1999: you can explore the 25+ years of blog posts in the archive.

You can subscribe to an RSS feed of posts, an RSS feed of comments, an RSS feed of favourites elsewhere, or a podcast RSS feed that just contains audio posts. You can also receive a daily digests of posts by email. I also publish an OPML blogroll.

Instagram • YouTube • Vimeo • ORCID • OpenStreetMap • Internet Archive • PEI.art • Drupal • Github.