iPad Recommended Apps

iPad: toy or worktool? I continue to become increasingly enamoured with the use of my iPad as not only a source of diversion, but also as an incredibly powerful work tool. Here are some my faves in both respects:

For work

Evernote — Seriously, if you’re living without Evernote, my question to you is “How?”.  This is the note-taking app.  Store your notes and organize them in notebooks, all of which sync up between any devices you have the app installed on and also between the web-based interface.  Some of the really great parts of this service for students are:

  • You can still take notes by hand and have them stored digitally (OCR and such) by using the Penultimate app or with the Evernote Moleskine (I use the Moleskine because I like taking my notes with pen and paper)
  • The Peek app is perfect for using your Evernote note collection for study purposes (note that this does require a Smart Cover)
  • Cost: free (they do offer a premium service for $5/mo, which gives you access to some extra features)

Trello — I’ve used many apps aimed at project management/organization, especially in my years a freelance developer. They usually fell into one of two categories: so complex that you spent more of your time trying to organize your work than you actually spent doing it, or significantly inadequate to provide the ability to manage complex tasks. Trello is one of the first apps that seems to me to strike the balance. The other big plus: it’s completely cloud-based, meaning iOS apps, an Android app, and fully-functional site if you’re working at a desktop. Everything syncs in real-time, so you’re always up-to-date on your progress with your tasks. Instead of reinventing the wheel and trying to explain how to use Trello, I’ll refer you to the Trello tour.

  • Cost: free

Lucidchart — As in most IT-related positions, documentation is king. Documentation is often greatly enhanced by the addition of meaningful graphics. Enter Lucidchart. Lucidchart allows you create all sorts of diagrams: networking block diagrams, flowcharts, UML layouts, ERDs, org charts, wireframes, mockups, and the list goes on. Create all your diagrams in their (amazing) web-based app and save them in your Google Drive (or let Lucidchart store them for you in their own cloud storage). They also just released an iPad app which works great, too.

  • Cost: free (though you are limited in how many diagrams you can create and how complex those diagrams can be without a paid account; the free account is typically adequate for most workflows, though).

Haiku Deck — PowerPoint: powerful, complicated, and possibly a bit overdone. Haiku Deck takes an approach to creating presentations that I really like: simplicity. You create your content; Haiku Deck analyzes your content and goes out on the ‘net and finds artwork for you to use for your slide backgrounds. The result? Stunning presentations that you don’t have to spend a week to finish. Note, however, that this app only works for the iPad. Note also that if you’re going to present your Haiku Deck slides from your iPad that you’ll need a suitable video cable to connect the iPad to the projector.

  • Cost: free!

More to come soon!

Automating Outlook Item Deletions with Perl

I recently did some work in Perl to automate a one-way “sync” of items from a public Exchange/Outlook calendar to a personal calendar which is shared (for Mac users). My “sync” is achieved by first purging all of the items in my local calendar, then copying in the relevant items from the public calendar (only a subset of the items in the public calendar are copied to the local calendar). My script continually would fail when attempting to delete all of the items in the local calendar. I began to notice a pattern emerge, as the deletion loop would fail on the (n/2) + 1th item, where n is the total number of items in the calendar (i.e. it would delete half the items and fail on the next item with a Cannot call method "Delete" on an undefined value. error). This would happen regardless of the number of items that I was trying to delete. This led me to revise my loop (which attempted to delete every item in the calendar using the GetNext method to a recursive method which, on each iteration of the method, deletes half the items in the list, then passes a reference to the list to itself again, until it recurses down to the base case of “one item left”, at which point the single remaining item in the list is deleted and the function returns locus of control back to the “main” loop.

For the sake of context, here’s the code that defines my calendars, MAPI namespaces, and basically sets up the environment for the remainder of the program:

my $ns = $ol->GetNameSpace("MAPI") or die "Couldn't open MAPI namespace.\n";
my $myLeaveCal = $ns->Folders("campbellbs\@longwood.edu")->Folders("Calendar")->Folders("Library Leave") or die "Couldn't open Brad's Leave Calendar\n";
my $pubFoldersRoot = $ns->Folders("Public Folders - campbellbs\@longwood.edu") or die "Couldn't open 'Public Folders'.\n";
my $pubFolders = $pubFoldersRoot->Folders("All Public Folders") or die "Couldn't open 'All Public Folders'.\n";
my $pubCalFolder = $pubFolders->Folders("Resource Calendars") or die "Couldn't open 'Resource Calendars'.\n";
my $sharedLeaveCal = $pubCalFolder->Folders("Library Leave") or die "Couldn't open 'Library Leave' (calendar).\n";

my $sharedLeaveItems = $sharedLeaveCal->{Items};

$sharedLeaveItems = $sharedLeaveItems->Restrict("[End] >= '$startmon/$startday/$startyear 00:00'");

my @itemsToDisplay;
my $myLeaveItems = $myLeaveCal->{Items};
my $numSharedLeaveItems = $sharedLeaveItems->{Count};
my $numMyLeaveItems = $myLeaveItems->{Count};

my $itShared = $sharedLeaveItems->GetFirst;

Here’s the defunct loop code that would fail on the (n/2) + 1th item:

my $itMy = $myLeaveItems->GetFirst;
for (my $i=0;$i<$numMyLeaveItems;$i++) {
  if ($itMy) {
  $itMy = $myLeaveItems->GetNext;

Here’s the sub definition for the shiny new recursive deletion method:

sub deleteCalItems {
  my $myLeaveCalRef = shift;
  my $itemsRef = $myLeaveCalRef->{Items};
  my $totalNumItems = $itemsRef->{Count};
  print "\n".'deleteCalItems::$totalNumItems => '.$totalNumItems."\n";
  if ($totalNumItems > 1) {
    my $itemMy = $itemsRef->GetFirst;
    my $stop = ($totalNumItems/2);
    for (my $i=0; $i<$stop; $i++) {
      $itemMy = $itemsRef->GetNext;
  } else {
    my $itemMy = $itemsRef->GetFirst;

And here’s how I implement in the “main” loop:

if ($numMyLeaveItems > 0) {

It works flawlessly, and I’ve now been able to put the script on a cron timer and no longer have to worry with manually deleting the items in the local calendar before I copy in items from the public calendar.

I read other posts from folks who dealt with similar problems trying to delete lists of items in Outlook using Perl’s Win32::OLE interface. I never tried this directly in VB within Outlook, so I’m not sure whether the problem is strictly a Perl problem or strictly a VB problem, but I do know that this fixes the problem. If you’re experiencing a similar problem, try adapting this recursive function for your script!


Building a “Mini” ILS using MS Access [Part 2 of 5]

Why Access?

Access has never traditionally been a “go-to” platform for me to build out an application such as this one.  Typically, I would use some sort of web-based application framework (I.e. CakePHP, CodeIgniter, Catalyst, etc.) or my usual mainstay in Drupal for this sort of project.  In this case, however, solutions such as these were disqualified on several criteria:

Continue reading

XPath for Querying Only Names of Applicants from Commonwealth of Virginia RMS System

If you’re an employee of a Virginia agency and have ever been part of a search committee or are directly involved with hiring, chances are you’ve encountered the admin/HR side of the State’s RMS system. Internally, we use an Excel spreadsheet to keep track of applicants and their applications. One incredibly frustrating thing about this system (at least to me) is that there is no apparent way to export data from it. When you’re looking at 100+ applicants for a position, typing each applicant’s name into your eval spreadsheet is time-consuming and error-prone. I figured out this little bit of XPath that will give you an enumerated list of names, which you can simply copy from the XPath evaluation screen and copy into Excel using Firefox and its XPath plugin:


Viewing Public Exchange Calendars in Outlook 2011 on a Mac

A member of the library staff has had a somewhat long-standing issue over the inability to view Exchange’s shared public items (particularly calendars); in our case, this staff member was unable to view a public “leave calendar,” where all scheduled employee absences are logged (a problem somewhat amplified by the fact that this staff member is in an administrative position). While there are a number of workarounds for this, most of them fall short of a long-term, workable solution. I found this post while looking around for a possible solution and got excited up until the point that I saw that there really isn’t any viable method for keeping the “mirrored” calendar synced up with the real, public calendar.

Enter Perl.
Continue reading

Multiple JOINs in MS Access

This one bit me while putting together a query for a form while working on my custom ILS:

For multiple joins in Access, you have to nest each JOIN in parentheses, like so:

SELECT a.columna, b.columnb, c.columnc
FROM ((tablea AS a) LEFT JOIN tableb AS b ON a.id = b.id)
LEFT JOIN tablec AS c ON a.id = c.id

Whereas in other SQL-speaking relational databases, queries with this syntax will work just fine:

SELECT a.columna, b.columnb, c.columnc
FROM tablea AS a LEFT JOIN tableb AS b ON a.id = b.id 
LEFT JOIN tablec AS c ON a.id = c.id

Found this solution at Things I’ve Learned: Multiple LEFT JOINs in MS Access.

Sierra Fixes List(s) in a Usable Format: Redux

After a wonderfully positive response to my previous post containing a link to the spreadsheet I created by scraping Innovative’s CSDirect pages for upcoming fixes, I received requests for the actual script/method that produces that spreadsheet. The bit.ly link at the end of this post is a Github gist that contains the Perl script that I wrote that performs this function; so you will need to have a Perl interpreter installed to use this. For Windows users, I highly recommend Strawberry Perl if you don’t have some pre-existing Perl distro in place. Once again, I’m running on Strawberry Perl 5.16.3 (64-bit multithread) on Win 7 Enterprise; I can’t see any reasons why this shouldn’t work equally well on a recent Perl distro on other platforms as well. If you run into any problems, feel to leave a comment, and I’ll be glad to help sort it out.

Happy scraping!


Template Selection When Creating New Bib Records


I’ve found a hiccup with the reserves. For some reason when I go to create a new bib record, the ‘select template’ screen doesn’t come up. It just starts the bib creation process. I should have the option to choose the ‘reserv: Personal Reserves’ template when I try to create a new bib from the ‘catalog’ drop-down. I know we had a similar issue at circ with the new patron templates, and [redacted] was able to resolve it.



From the admin application, make the following changes:

  • Authorizations and Authentication > Expand “+” on user > Edit > Settings > New Records > New Record Templates > Bibliographic > set to “Always prompt for template”
  • Authorizations and Authentication > Expand “+” on user > Edit > Settings > Record Templates > check “reserv – Personal Reserves”

Building a “Mini” ILS using MS Access [Part I]

I started a new project recently, a venture of Longwood’s Library to assist the University’s Speech, Hearing, and Learning Services department (they’re soon to change their name) in indexing and cataloging all of its materials. Initially, the plan was to catalog all of the department’s holdings into Sierra. After some further discussions, we realized that wasn’t an optimal solution for the Library or for SHLS, Continue reading

Sierra Fixes List(s) in a Usable Format

I’ve generally found III’s list of upcoming/pending Sierra fixes web-based format lacking greatly in usability. I’ve written a Perl script that parses those webpages and gets the data into a spreadsheet-based format. I’ll further refine the program such that you can simply download the latest version from a webpage in the future, but for now I thought I’d go ahead and attach the most current version of the spreadsheet in case you were trying to munge the website for info like I have been.

The file can be downloaded here.