Building your own reminder system

By reeset / On / In C#, Family, Library, Microsoft

One of the hats I wear is as a member of the Independence Library Board.  I love it because I don’t work with public libraries as often as I’d like to in my real job, and honestly, the Independence Public Library is the center of the community.  The Library is a center for adults looking for education opportunities, kids looking for resources, and home to a number of talented librarians that are dedicated to encouraging a love of reading to our community.  It’s one of the few libraries I’ve ever known to have both a children’s and adult reading programs and takes advantage of that in the summer – by having the adults and kids compete against each other to see who logs the most pages (the kids always win). 

Each board meeting is interesting, because as the economy became more difficult for people, more people turned to the library.  Every month, the library sees more circulations, more bodies in the building, more kids, more adults – just more.  And they do it on a budget that doesn’t accurately reflect the impact that they have on the community. 

Anyway, one of the things that the Library has going for it is a very active friends program – and through that group (and some grant funds), the library was able to purchase a number of Laptop computers for circulation within the Library.  The Library currently has some, 8-10 terminals that are always being used and the laptops would provide additional seats, and allow people to work anywhere within the library using the wifi.

The Library setup the laptops using the usual software – DeepFreeze, etc. to provide a fairly locked down environment.  However, what was missing was a customizable timer on the machines.  Essentially, the staff was looking for a way to make it easier for patrons checking out the laptops to avoid fines.  The Laptops circulate for a finite period of time within the building.  Once that time is over, the clock starts ticking for fines.  To avoid confusion, and help make it easier for patrons to know when the clock was running out – I’d offered to work on building a simplified timer/kiosk program. 

The impetus for this work comes from Access 2007 I think.  I had attended the hackfest before the conference and one of the project ideas was an open source timing program.  I had worked on and developed a proof of concept that I passed on.  And while I never worked on the code since – I kept a copy myself.  When we were talking about things that would be helpful, I was reminded of this work. 

Now, unfortunately, I couldn’t use much of the old project at all.  The needs were slightly different – but it helped me have a place to start so that I wasn’t just looking at a blank screen.  So, with idea in hand, I decided to see how much time it would take to whip together an application that could meet the needs. 

I’ll admit, nights like tonight make me happy that I still do more than write code in scripting languages like python and ruby.  Taking about 3 hours, I put together a feature complete application that meets our specific needs.  I’ll be at the Oregon Library Association meeting this week, and if folks find this kind of work interesting, I’ll make it a bit more generic and post the source for anyone that wants to tinker with it.

So what does it do?  It’s pretty simple.  Basically, it’s an application that keeps time for the user and provides some built-in kiosk functionality to prevent the application was being disabled. 

Here are a few of the screen shots:

When the program is running, you see the clock situated in the task tray

Click on the icon, and see the program menu

Preferences – password protected



Because we have a large Hispanic population, all the strings will need be able to be translated.  This was essentially is just the locked message.  I’ll ensure the others are customizable as well – maybe with an option to just use Google Translate (even though it far, far from perfect) if a need to just get the gist across is the most important.

Run an action (both functions require a password)

Place your cursor over the icon to get the minutes

Information box letting you know you are running out of time

Sample lockout screen

In order to run any of the functions, you must authenticate yourself.  In order to disable the lockout screen, you must authenticate yourself.  What’s more, while the program is running, it creates a low-level keyboard hook to capture and pre-process all keystrokes, disabling things like escape keys, the windows key, ctrl+alt+del so that once this screen comes up – a user can not break out of it without shutting off the computer (which would result in needing to log in).  Coupled with DeepFreeze and some group policy settings, my guess is that this will suffice.

The source code itself is a few thousand lines of code, with maybe a 1000 or 1500 lines of actual business logic and the remainder around the UI/threading components.  Short and simple.

Hopefully, I’ll get a chance to do a little testing and get some feedback later this week – but for now – I’m just happy that maybe I can give a little bit back to the community library that gives so much to my family.  And if I hear from anyone that this might be of interest outside my library – I’ll certainly post the code up to github.


MarcEdit 5.8 Update

By reeset / On / In MarcEdit

I’ve posted a new update to MarcEdit.  Lots of changes.  I’ll post some further information on a few changes tomorrow – but in the mean time, here’s the update list:

  1. Bug Fix: Z39.50 — automatic format support when syntax isn’t directly coded as marc, but MARC data is returned (i.e., UNIMARC as an example)
  2. Bug Fix: Z39.50 — batch search would capture multiple records, but the variable reporting the query items that returned multiple items could sometimes be overwritten.
  3. Bug Fix: Field Count — Labels will no longer overlap when users have set system fonts to display above 100%
  4. Behavior Change: Find All Jump List — no longer will it minimize when an item is selected. Now, it will jump to the record, but the list will remain visible.
  5. Bug Fix: Export Tab Delimited — Enlarged the subfield box and enabled additional data to be attached to the subfield
  6. Bug Fix: Export Tab Delimited — when working from a set of loaded settings, only the headers would be printed.
  7. Bug Fix: Z39.50 Batch Search — Gracefully handle exception when error file cannot be created.
  8. Enhancement: Extract/Delete Selected Records — Multiple select
  9. Enhancement: Added find records without Field/Subfield to Edit Shortcuts
  10. Bug Fix: Export Tab Delimited Settings arguments list will clear when loading settings (clearing old items before adding new ones)
  11. Enhancement: Export Tab Delimited Settings — Added Clear Settings option.
  12. Behavior Change: Export Tab Delimited Settings — No longer have to select MARC/no MARC before processing
  13. Bug Fix: lcase option leaving a \ before the replaced text. This is corrected.
  14. Enhancement: MarcEngine loose algorithm wouldn’t ignore Byte Order Marker (BOM) data causing problems with character encodings. This has been updated so that BOM data is ignored and filtered out.
  15. Bug Fix: Delimited Text Translator Constant data would prefix a number before the added data. This has been corrected.
  16. Bug Fix: Delimited Text Translator ability to process Excel 2010 xml files was broken. This has been corrected.
  17. Enhancement: Classify Tool now has the ability to exclude dates from serials and integrated resources
  18. New Tool: MARC SQL Explorer is a new tool designed to provide the ability to import MARC data into a database (or read records from a database). The SQL Explorer supports SQLite and MySQL.
  19. Bug Fix: EAD => MARC XSLT Translation update
  20. Enhancement: Task Automation Editor keeps focus when moving specific tasks up and down the task list.
  21. Enhancement: Task Automation Editor inserts new tasks into the task list next to the nearest selected task.
  22. Enhancement: Task Automation Editor — if a new items is added or deleted and the editor is closed without saving, a prompt will occur.
  23. Enhancement: De-duplication of records between multiple files allowing for the extraction of a file without duplication or just unique records.
  24. Enhancement: Support proxy detection when doing automated updates.
  25. Enhancement: MARCEngine COM update — previously, GetError returned errors associated with the XSLT processing. This function will now return errors for a number of other functions. I’ll continue to update this.