<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/assets/rss.xsl" type="text/xsl"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"

>
<channel>
	<title>Sacha Chua - tag - library</title>
	<atom:link href="https://sachachua.com/blog/tag/library/feed/index.xml" rel="self" type="application/rss+xml" />
	<atom:link href="https://sachachua.com/blog/tag/library" rel="alternate" type="text/html" />
	<link>https://sachachua.com/blog/tag/library/feed/index.xml</link>
	<description>Emacs, sketches, and life</description>
  
	<lastBuildDate>Wed, 13 May 2026 14:32:18 GMT</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>daily</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>11ty</generator>
  <item>
		<title>Scripting and the Toronto Public Library&#8217;s movie collection</title>
		<link>https://sachachua.com/blog/2015/12/scripting-toronto-public-librarys-movie-collection/</link>
		<dc:creator><![CDATA[Sacha Chua]]></dc:creator>
		<pubDate>Wed, 09 Dec 2015 05:00:00 GMT</pubDate>
    <category>geek</category>
		<guid isPermaLink="false">https://sachachua.com/blog/?p=28509</guid>
		<description><![CDATA[<p>We hardly ever watch movies in the theatre now, since we prefer watching movies with subtitles and the ability to pause. Fortunately, the Toronto Public Library has a frequently updated collection of DVDs. The best time to grab a movie is when it&#8217;s a new release, since DVDs that have been in heavy circulation can get pretty scratched up from use. However, newly released movies can&#8217;t be reserved. You need to find them at the library branches they&#8217;re assigned to, and then you can borrow them for seven days. You can check the status of each movie online to see if it&#8217;s in the library or when it&#8217;s due to be returned.</p>
<p>Since there are quite a few movies on our watch list, quite a few library branches we can walk to, and some time flexibility as to when to go, checking all those combinations is tedious. I wrote a script that takes a list of branches and a list of movie URLs, checks the status of each, and displays a table sorted by availability and location. My code gives me a list like this:</p>
<table border="2" frame="hsides" rules="groups" cellspacing="0" cellpadding="6">
<colgroup>
<col class="org-left">
<col class="org-left">
<col class="org-left">
<col class="org-left"> </colgroup>
<tbody>
<tr>
<td class="org-left">In Library</td>
<td class="org-left">Annette Street</td>
<td class="org-left">Mad Max Fury Road</td>
<td class="org-left">M 10-8:30 T 12:30-8:30 W 10-6 Th 12:30-8:30 F 10-6 Sat 9-5</td>
</tr>
<tr>
<td class="org-left">In Library</td>
<td class="org-left">Bloor/Gladstone</td>
<td class="org-left">Inside Out</td>
<td class="org-left">M 9-8:30 T 9-8:30 W 9-8:30 Th 9-8:30 F 9-5 Sat 9-5 Sun 1:30-5</td>
</tr>
<tr>
<td class="org-left">In Library</td>
<td class="org-left">Bloor/Gladstone</td>
<td class="org-left">Match</td>
<td class="org-left">M 9-8:30 T 9-8:30 W 9-8:30 Th 9-8:30 F 9-5 Sat 9-5 Sun 1:30-5</td>
</tr>
<tr>
<td class="org-left">In Library</td>
<td class="org-left">Jane/Dundas</td>
<td class="org-left">Avengers: Age of Ultron</td>
<td class="org-left">M 9-8:30 T 9-8:30 W 9-8:30 Th 9-8:30 F 9-5 Sat 9-5</td>
</tr>
<tr>
<td class="org-left">In Library</td>
<td class="org-left">Jane/Dundas</td>
<td class="org-left">Ant-Man</td>
<td class="org-left">M 9-8:30 T 9-8:30 W 9-8:30 Th 9-8:30 F 9-5 Sat 9-5</td>
</tr>
<tr>
<td class="org-left">In Library</td>
<td class="org-left">Jane/Dundas</td>
<td class="org-left">Mad Max Fury Road</td>
<td class="org-left">M 9-8:30 T 9-8:30 W 9-8:30 Th 9-8:30 F 9-5 Sat 9-5</td>
</tr>
<tr>
<td class="org-left">In Library</td>
<td class="org-left">Jane/Dundas</td>
<td class="org-left">Minions</td>
<td class="org-left">M 9-8:30 T 9-8:30 W 9-8:30 Th 9-8:30 F 9-5 Sat 9-5</td>
</tr>
<tr>
<td class="org-left">In Library</td>
<td class="org-left">Perth/Dupont</td>
<td class="org-left">Chappie</td>
<td class="org-left">T 12:30-8:30 W 10-6 Th 12:30-8:30 F 10-6 Sat 9-5</td>
</tr>
<tr>
<td class="org-left">In Library</td>
<td class="org-left">Runnymede</td>
<td class="org-left">Ant-Man</td>
<td class="org-left">M 9-8:30 T 9-8:30 W 9-8:30 Th 9-8:30 F 9-5 Sat 9-5</td>
</tr>
<tr>
<td class="org-left">In Library</td>
<td class="org-left">Runnymede</td>
<td class="org-left">Minions</td>
<td class="org-left">M 9-8:30 T 9-8:30 W 9-8:30 Th 9-8:30 F 9-5 Sat 9-5</td>
</tr>
<tr>
<td class="org-left">In Library</td>
<td class="org-left">St. Clair/Silverthorn</td>
<td class="org-left">Kingsman: the Secret Service</td>
<td class="org-left">T 12:30-8:30 W 10-6 Th 12:30-8:30 F 10-6 Sat 9-5</td>
</tr>
<tr>
<td class="org-left">In Library</td>
<td class="org-left">St. Clair/Silverthorn</td>
<td class="org-left">Mad Max Fury Road</td>
<td class="org-left">T 12:30-8:30 W 10-6 Th 12:30-8:30 F 10-6 Sat 9-5</td>
</tr>
<tr>
<td class="org-left">In Library</td>
<td class="org-left">Swansea Memorial</td>
<td class="org-left">Ant-Man</td>
<td class="org-left">T 10-6 W 1-8 Th 10-6 Sat 10-5</td>
</tr>
<tr>
<td class="org-left">In Library</td>
<td class="org-left">Swansea Memorial</td>
<td class="org-left">Chappie</td>
<td class="org-left">T 10-6 W 1-8 Th 10-6 Sat 10-5</td>
</tr>
<tr>
<td class="org-left">In Library</td>
<td class="org-left">Swansea Memorial</td>
<td class="org-left">Kingsman: the Secret Service</td>
<td class="org-left">T 10-6 W 1-8 Th 10-6 Sat 10-5</td>
</tr>
<tr>
<td class="org-left">In Library</td>
<td class="org-left">Swansea Memorial</td>
<td class="org-left">Kingsman: the Secret Service</td>
<td class="org-left">T 10-6 W 1-8 Th 10-6 Sat 10-5</td>
</tr>
<tr>
<td class="org-left">In Library</td>
<td class="org-left">Swansea Memorial</td>
<td class="org-left">Mad Max Fury Road</td>
<td class="org-left">T 10-6 W 1-8 Th 10-6 Sat 10-5</td>
</tr>
<tr>
<td class="org-left">In Library</td>
<td class="org-left">Swansea Memorial</td>
<td class="org-left">Minions</td>
<td class="org-left">T 10-6 W 1-8 Th 10-6 Sat 10-5</td>
</tr>
<tr>
<td class="org-left">2015-12-08</td>
<td class="org-left">Perth/Dupont</td>
<td class="org-left">Terminator Genisys</td>
<td class="org-left">T 12:30-8:30 W 10-6 Th 12:30-8:30 F 10-6 Sat 9-5</td>
</tr>
<tr>
<td class="org-left">2015-12-08</td>
<td class="org-left">Perth/Dupont</td>
<td class="org-left">Mad Max Fury Road</td>
<td class="org-left">T 12:30-8:30 W 10-6 Th 12:30-8:30 F 10-6 Sat 9-5</td>
</tr>
<tr>
<td class="org-left">2015-12-09</td>
<td class="org-left">Swansea Memorial</td>
<td class="org-left">Avengers: Age of Ultron</td>
<td class="org-left">T 10-6 W 1-8 Th 10-6 Sat 10-5</td>
</tr>
</tbody>
</table>
<p>… many more rows omitted. =)</p>
<p>With this data, I can decide that Swansea Memorial has a bunch of things I might want to check out, and pick that as the destination for my walk. Sure, there&#8217;s a chance that someone else might check out the movies before I get there (although I can minimize that by getting to the library as soon as it opens), or that the video has been misfiled or misplaced, but overall, the system tends to work fine.</p>
<p>It&#8217;s easy for me to send the output to myself by email, too. I just select the part of the table I care about and use Emacs&#8217; <code>M-x shell-command-on-region</code> (<code>M-|</code>) to mail it to myself with the command <code>mail -s "Videos to check out" sacha@sachachua.com</code>.</p>
<p>The first time I ran my script, I ended up going to Perth/Dupont to pick up seven movies in addition to the two I picked up from Annette Library. Many of the movies had been returned but not yet shelved, so the librarian retrieved them from his bin and gave them to me. When I got back, W- looked at the stack of DVDs by the television and said, &#8220;You know that&#8217;s around 18 hours of viewing, right?&#8221; It&#8217;ll be fine for background watching. =)</p>
<p>Little things like this make me glad that I can write scripts and other tiny tools to make my life better. Anything that involves multiple steps or combining information from multiple sources might be simpler with a script. I wrote this script as a command-line tool with NodeJS, since I&#8217;m comfortable with the HTML request and parsing libraries available there.</p>
<p>Anyway, here&#8217;s the code, in case you want to build on the idea. Have fun!</p>
<div class="org-src-container">
<pre class="src src-js2">/* Shows you which videos are available at which libraries.

   Input: A json filename, which should be a hash of the form:
   {"branches": {"Branch name": "Additional branch details (ex: hours)", ...},
   "videos": [{"Title": "URL to library page"}, ...]}.

   Example: {
   "branches": {
   "Runnymede": "M 9-8:30 T 9-8:30 W 9-8:30 Th 9-8:30 F 9-5 Sat 9-5"
   },
   "videos": [
   {"title": "Avengers: Age of Ultron", "url": "http://www.torontopubliclibrary.ca/detail.jsp?Entt=RDM3350205&amp;R=3350205"}
   ]}

   Output:
   Status,Branch,Title,Branch notes
*/

var rp = require('request-promise');
var moment = require('moment');
var async = require('async');
var cheerio = require('cheerio');
var q = require('q');
var csv = require('fast-csv');
var fs = require('fs');

if (process.argv.length &lt; 3) {
  console.log('Please specify the JSON file to read the branches and videos from.');
  process.exit(1);
}

var config = JSON.parse(fs.readFileSync(process.argv[2]));
var branches = config.branches;
var videos = config.videos;

/*
  Returns a promise that will resolve with an array of [status,
  branch, movie, info], where status is either the next due date, "In
  Library", etc. */
function checkStatus(branches, movie) {
  var url = movie.url;
  var matches = url.match(/R=([0-9]+)/);
  return rp.get(
    'http://www.torontopubliclibrary.ca/components/elem_bib-branch-holdings.jspf?print=&amp;numberCopies=1&amp;itemId='
      + matches[1]).then(function(a) {
        var $ = cheerio.load(a);
        var results = [];
        var lastBranch = '';              
        $('tr.notranslate').each(function() {
          var row = $(this);
          var cells = row.find('td');
          var branch = $(cells[0]).text().replace(/^[ \t\r\n]+|[ \t\r\n]+$/g, '');
          var due = $(cells[2]).text().replace(/^[ \t\r\n]+|[ \t\r\n]+$/g, '');
          var status = $(cells[3]).text().replace(/^[ \t\r\n]+|[ \t\r\n]+$/g, '');
          if (branch) { lastBranch = branch; }
          else { branch = lastBranch; }
          if (branches[branch]) {
            if (status == 'On loan' &amp;&amp; (matches = due.match(/Due: (.*)/))) {
              status = moment(matches[1], 'DD/MM/YYYY').format('YYYY-MM-DD');
            }
            if (status != 'Not Available - Search in Progress') {
              results.push([status, branch, movie.title, branches[branch]]);
            }
          }
        });
        return results;
      });
}

function checkAllVideos(branches, videos) {
  var results = [];
  var p = q.defer();
  async.eachLimit(videos, 5, function(video, callback) {
    checkStatus(branches, video).then(function(result) {
      results = results.concat(result);
      callback();
    });
  }, function(err) {
    p.resolve(results.sort(function(a, b) {
      if (a[0] == 'In Library') {
        if (b[0] == 'In Library') {
          if (a[1] &lt; b[1]) return -1;
          if (a[1] &gt; b[1]) return 1;
          if (a[2] &lt; b[2]) return -1;
          if (a[2] &gt; b[2]) return 1;
          return 0;
        } else {
          return -1;
        }
      }
      if (b[0] == 'In Library') { return 1; }
      if (a[0] &lt; b[0]) { return -1; }
      if (a[0] &gt; b[0]) { return 1; }
      return 0;
    }));
  });
  return p.promise;
}

checkAllVideos(branches, videos).then(function(result) {
  csv.writeToString(result, {}, function(err, data) {
    console.log(data);
  });
});
</pre>
</div>
<p>P.S. Okay, I&#8217;m <em>really</em> tempted to walk over to Swansea Memorial, but W- reminds me that we&#8217;ve got a lot of movies already waiting to be watched. So I&#8217;ll probably just walk to the supermarket, but I&#8217;m looking forward to running this script once we get through our backlog of videos!</p>

<p>You can <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2015%2F12%2Fscripting-toronto-public-librarys-movie-collection%2F&body=Name%20you%20want%20to%20be%20credited%20by%20(if%20any)%3A%20%0AMessage%3A%20%0ACan%20I%20share%20your%20comment%20so%20other%20people%20can%20learn%20from%20it%3F%20Yes%2FNo%0A">e-mail me at sacha@sachachua.com</a>.</p>]]></description>
		</item><item>
		<title>Exploring neighbourhood libraries and other notes from the Toronto Public Library Hackathon</title>
		<link>https://sachachua.com/blog/2015/11/exploring-neighbourhood-libraries-and-other-notes-from-the-toronto-public-library-hackathon/</link>
		<dc:creator><![CDATA[Sacha Chua]]></dc:creator>
		<pubDate>Mon, 16 Nov 2015 05:39:00 GMT</pubDate>
    <category>visualization</category>
<category>development</category>
<category>geek</category>
<category>kaizen</category>
		<guid isPermaLink="false">https://sachachua.com/blog/?p=28468</guid>
		<description><![CDATA[<p>UPDATE 2015-11-30: <a href="http://torontopubliclibrary.typepad.com/digital_design_studio/2015/11/great-ideas-and-teamwork-displayed-at-inaugural-tpl-hackathon.html">Here&apos;s the Toronto Public Library&apos;s recap, along with other videos.</a></p>
<p>UPDATE 2015-11-27: Here&apos;s the video of my hackathon pitch:</p>
<p><iframe loading="lazy" src="https://www.youtube.com/embed/wnZHIWB-zD4" width="640" height="360" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>
<p>UPDATE 2015-11-18: I figured out how to make this&#xA0;entirely client-side, so you don&apos;t have to run a separate server. First, install&#xA0;either <a href="http://tampermonkey.net">Tampermonkey</a> (Chrome) or <a href="https://addons.mozilla.org/en-us/firefox/addon/greasemonkey/">Greasemonkey</a> (Firefox). Then install the user script <a href="https://github.com/sachac/explore-neighbourhood-libraries/raw/master/insert-visualize-link.user.js">insert-visualize-link.user.js</a>&#xA0;, and the Visualize link should appear next to the library branch options on Toronto Public Library search result&#xA0;pages. See the <a href="https://github.com/sachac/explore-neighbourhood-libraries">Github repository</a> for more details.</p>
<p>Yay! My neighbourhood library visualization won at the <a href="http://www.torontopubliclibrary.ca/hackathon/">Toronto Public Library hackathon</a>. It added a Visualize link to the search results page which mapped the number of search results by branch. For example, here&apos;s a visualization of a search that shows items matching &quot;<a href="http://www.torontopubliclibrary.ca/search.jsp?Ntt=avengers+comics">Avengers comics</a>&quot;.</p>
<p><img loading="lazy" class="alignnone size-medium wp-image-28470" src="https://sachachua.com/blog/wp-content/uploads/2015/11/avengers-640x287.png" alt="avengers" width="640" height="287" srcset="https://sachachua.com/blog/wp-content/uploads/2015/11/avengers-640x287.png 640w, https://sachachua.com/blog/wp-content/uploads/2015/11/avengers-280x126.png 280w, https://sachachua.com/blog/wp-content/uploads/2015/11/avengers.png 1366w" sizes="(max-width: 640px) 100vw, 640px"></p>
<p>It&apos;s a handy way to see which branches you might want to go to so that you can browse through what&apos;s there in person.</p>
<p>Librarians could also use it to help them plan their selections, since it&apos;s easy to see the distribution across branches. For example, here&apos;s the visualization for <a href="http://www.torontopubliclibrary.ca/search.jsp?N=37918+20491">books in Tagalog</a>.</p>
<p><a href="https://sachachua.com/blog/wp-content/uploads/2015/11/tagalog.png"><img loading="lazy" class="alignnone size-medium wp-image-28471" src="https://sachachua.com/blog/wp-content/uploads/2015/11/tagalog-640x363.png" alt="tagalog" width="640" height="363" srcset="https://sachachua.com/blog/wp-content/uploads/2015/11/tagalog-640x363.png 640w, https://sachachua.com/blog/wp-content/uploads/2015/11/tagalog-280x159.png 280w, https://sachachua.com/blog/wp-content/uploads/2015/11/tagalog.png 1057w" sizes="(max-width: 640px) 100vw, 640px"></a></p>
<p>The collections roughly match up with <a href="http://www.toronto.ca/wellbeing">Wellbeing Toronto</a>&apos;s data on Tagalog as the home language, although there are some areas that could probably use collections of their own.</p>
<p><a href="https://sachachua.com/blog/wp-content/uploads/2015/11/tagalog-census.png"><img loading="lazy" class="alignnone size-medium wp-image-28472" src="https://sachachua.com/blog/wp-content/uploads/2015/11/tagalog-census-640x480.png" alt="tagalog census" width="640" height="480" srcset="https://sachachua.com/blog/wp-content/uploads/2015/11/tagalog-census-640x480.png 640w, https://sachachua.com/blog/wp-content/uploads/2015/11/tagalog-census-267x200.png 267w, https://sachachua.com/blog/wp-content/uploads/2015/11/tagalog-census.png 960w" sizes="(max-width: 640px) 100vw, 640px"></a></p>
<p>Incidentally, I was delighted to learn that Von Totanes had done a detailed analysis of the library&apos;s Filipino collections in the chapter he wrote in <i>Filipinos in Canada: Disturbing Invisibility</i> (Coloma, McElhinny, and Tungohan, 1992). Von sent me the chapter after I mentioned the hackathon on Facebook; yay people bumping into other people online!</p>
<p>Personally, I&apos;m looking forward to using this visualization to see things like which branches have new videos. Videos released in the past year can only be borrowed in person &#x2013; you can&apos;t request them online &#x2013; so it&apos;s good to check branches regularly to see if they&apos;re there. It would be even better if the library search engine had a filter for &quot;On the shelf right now&quot;, but in the meantime, this visualization tool gives me a good idea of our chances of picking up something new to watch while we&apos;re folding laundry. =)</p>
<p><b>Notes</b></p>
<p><a href="https://github.com/sachac/explore-neighbourhood-libraries">https://github.com/sachac/explore-neighbourhood-libraries</a></p>
<p>More notes will probably follow, but here are a few quick drawings:</p>
<p><img loading="lazy" class="alignnone size-medium wp-image-28473" src="https://sachachua.com/blog/wp-content/uploads/2015/11/2015-11-15b-Tech-Exploring-neighbourhood-libraries-index-card-tpl-hackathon-640x383.png" alt="2015-11-15b Tech - Exploring neighbourhood libraries &#45;&#45; index card #tpl #hackathon" width="640" height="383" srcset="https://sachachua.com/blog/wp-content/uploads/2015/11/2015-11-15b-Tech-Exploring-neighbourhood-libraries-index-card-tpl-hackathon-640x383.png 640w, https://sachachua.com/blog/wp-content/uploads/2015/11/2015-11-15b-Tech-Exploring-neighbourhood-libraries-index-card-tpl-hackathon-280x168.png 280w, https://sachachua.com/blog/wp-content/uploads/2015/11/2015-11-15b-Tech-Exploring-neighbourhood-libraries-index-card-tpl-hackathon.png 1497w" sizes="(max-width: 640px) 100vw, 640px"></p>
<p></p><div class="sketch-thumbnail"><a class="photoswipe" href="https://sketches.sachachua.com/filename/2015-11-15b%20Tech%20-%20Exploring%20neighbourhood%20libraries%20&#45;&#45;%20index%20card%20%23tpl%20%23hackathon.png" data-src="https://sketches.sachachua.com/static/2015-11-15b%20Tech%20-%20Exploring%20neighbourhood%20libraries%20&#45;&#45;%20index%20card%20%23tpl%20%23hackathon.png" data-title="2015-11-15b Tech - Exploring neighbourhood libraries &#45;&#45; index card #tpl #hackathon" data-w="1497" data-h="896"><picture>
      <img src="https://sketches.sachachua.com/thumbnails/2015-11-15b%20Tech%20-%20Exploring%20neighbourhood%20libraries%20&#45;&#45;%20index%20card%20%23tpl%20%23hackathon.png" width="" height="" alt="2015-11-15b Tech - Exploring neighbourhood libraries &#45;&#45; index card #tpl #hackathon" loading="lazy" decoding="async">
      <figcaption>2015-11-15b Tech - Exploring neighbourhood libraries &#45;&#45; index card #tpl #hackathon</figcaption>
    </picture></a></div><p></p>
<p><img loading="lazy" class="alignnone size-medium wp-image-28474" src="https://sachachua.com/blog/wp-content/uploads/2015/11/2015-11-15c-Kaizen-and-the-Toronto-Public-Library-hackathon-index-card-tpl-hackathon-kaizen-improvement-640x383.png" alt="2015-11-15c Kaizen and the Toronto Public Library hackathon &#45;&#45; index card #tpl #hackathon #kaizen #improvement" width="640" height="383" srcset="https://sachachua.com/blog/wp-content/uploads/2015/11/2015-11-15c-Kaizen-and-the-Toronto-Public-Library-hackathon-index-card-tpl-hackathon-kaizen-improvement-640x383.png 640w, https://sachachua.com/blog/wp-content/uploads/2015/11/2015-11-15c-Kaizen-and-the-Toronto-Public-Library-hackathon-index-card-tpl-hackathon-kaizen-improvement-280x168.png 280w, https://sachachua.com/blog/wp-content/uploads/2015/11/2015-11-15c-Kaizen-and-the-Toronto-Public-Library-hackathon-index-card-tpl-hackathon-kaizen-improvement.png 1497w" sizes="(max-width: 640px) 100vw, 640px"></p>
<p></p><div class="sketch-thumbnail"><a class="photoswipe" href="https://sketches.sachachua.com/filename/2015-11-15c%20Kaizen%20and%20the%20Toronto%20Public%20Library%20hackathon%20&#45;&#45;%20index%20card%20%23tpl%20%23hackathon%20%23kaizen%20%23improvement.png" data-src="https://sketches.sachachua.com/static/2015-11-15c%20Kaizen%20and%20the%20Toronto%20Public%20Library%20hackathon%20&#45;&#45;%20index%20card%20%23tpl%20%23hackathon%20%23kaizen%20%23improvement.png" data-title="2015-11-15c Kaizen and the Toronto Public Library hackathon &#45;&#45; index card #tpl #hackathon #kaizen #improvement" data-w="1497" data-h="896"><picture>
      <img src="https://sketches.sachachua.com/thumbnails/2015-11-15c%20Kaizen%20and%20the%20Toronto%20Public%20Library%20hackathon%20&#45;&#45;%20index%20card%20%23tpl%20%23hackathon%20%23kaizen%20%23improvement.png" width="" height="" alt="2015-11-15c Kaizen and the Toronto Public Library hackathon &#45;&#45; index card #tpl #hackathon #kaizen #improvement" loading="lazy" decoding="async">
      <figcaption>2015-11-15c Kaizen and the Toronto Public Library hackathon &#45;&#45; index card #tpl #hackathon #kaizen #improvement</figcaption>
    </picture></a></div><p></p>
<p></p><div class="sketch-thumbnail"><a class="photoswipe" href="https://sketches.sachachua.com/filename/2015-11-15d%20Other%20reflections%20from%20TPL%20hackathon%20&#45;&#45;%20index%20card%20%23tpl%20%23hackathon%20%23introversion%20%23prototyping%20%23presenting.png" data-src="https://sketches.sachachua.com/static/2015-11-15d%20Other%20reflections%20from%20TPL%20hackathon%20&#45;&#45;%20index%20card%20%23tpl%20%23hackathon%20%23introversion%20%23prototyping%20%23presenting.png" data-title="2015-11-15d Other reflections from TPL hackathon &#45;&#45; index card #tpl #hackathon #introversion #prototyping #presenting" data-w="1497" data-h="896"><picture>
      <img src="https://sketches.sachachua.com/thumbnails/2015-11-15d%20Other%20reflections%20from%20TPL%20hackathon%20&#45;&#45;%20index%20card%20%23tpl%20%23hackathon%20%23introversion%20%23prototyping%20%23presenting.png" width="" height="" alt="2015-11-15d Other reflections from TPL hackathon &#45;&#45; index card #tpl #hackathon #introversion #prototyping #presenting" loading="lazy" decoding="async">
      <figcaption>2015-11-15d Other reflections from TPL hackathon &#45;&#45; index card #tpl #hackathon #introversion #prototyping #presenting</figcaption>
    </picture></a></div><p></p>
<p></p><div class="sketch-thumbnail"><a class="photoswipe" href="https://sketches.sachachua.com/filename/2015-11-15d%20Other%20reflections%20from%20TPL%20hackathon%20&#45;&#45;%20index%20card%20%23tpl%20%23hackathon%20%23introversion%20%23prototyping%20%23presenting.png" data-src="https://sketches.sachachua.com/static/2015-11-15d%20Other%20reflections%20from%20TPL%20hackathon%20&#45;&#45;%20index%20card%20%23tpl%20%23hackathon%20%23introversion%20%23prototyping%20%23presenting.png" data-title="2015-11-15d Other reflections from TPL hackathon &#45;&#45; index card #tpl #hackathon #introversion #prototyping #presenting" data-w="1497" data-h="896"><picture>
      <img src="https://sketches.sachachua.com/thumbnails/2015-11-15d%20Other%20reflections%20from%20TPL%20hackathon%20&#45;&#45;%20index%20card%20%23tpl%20%23hackathon%20%23introversion%20%23prototyping%20%23presenting.png" width="" height="" alt="2015-11-15d Other reflections from TPL hackathon &#45;&#45; index card #tpl #hackathon #introversion #prototyping #presenting" loading="lazy" decoding="async">
      <figcaption>2015-11-15d Other reflections from TPL hackathon &#45;&#45; index card #tpl #hackathon #introversion #prototyping #presenting</figcaption>
    </picture></a></div><p></p>
<p><img loading="lazy" class="alignnone size-medium wp-image-28476" src="https://sachachua.com/blog/wp-content/uploads/2015/11/2015-11-15e-Ideas-for-following-up-on-TPL-hackathon-index-card-prototyping-tpl-hackathon-640x383.png" alt="2015-11-15e Ideas for following up on TPL hackathon &#45;&#45; index card #prototyping #tpl #hackathon" width="640" height="383" srcset="https://sachachua.com/blog/wp-content/uploads/2015/11/2015-11-15e-Ideas-for-following-up-on-TPL-hackathon-index-card-prototyping-tpl-hackathon-640x383.png 640w, https://sachachua.com/blog/wp-content/uploads/2015/11/2015-11-15e-Ideas-for-following-up-on-TPL-hackathon-index-card-prototyping-tpl-hackathon-280x168.png 280w, https://sachachua.com/blog/wp-content/uploads/2015/11/2015-11-15e-Ideas-for-following-up-on-TPL-hackathon-index-card-prototyping-tpl-hackathon.png 1497w" sizes="(max-width: 640px) 100vw, 640px"></p>
<p></p><div class="sketch-thumbnail"><a class="photoswipe" href="https://sketches.sachachua.com/filename/2015-11-15e%20Ideas%20for%20following%20up%20on%20TPL%20hackathon%20&#45;&#45;%20index%20card%20%23prototyping%20%23tpl%20%23hackathon.png" data-src="https://sketches.sachachua.com/static/2015-11-15e%20Ideas%20for%20following%20up%20on%20TPL%20hackathon%20&#45;&#45;%20index%20card%20%23prototyping%20%23tpl%20%23hackathon.png" data-title="2015-11-15e Ideas for following up on TPL hackathon &#45;&#45; index card #prototyping #tpl #hackathon" data-w="1497" data-h="896"><picture>
      <img src="https://sketches.sachachua.com/thumbnails/2015-11-15e%20Ideas%20for%20following%20up%20on%20TPL%20hackathon%20&#45;&#45;%20index%20card%20%23prototyping%20%23tpl%20%23hackathon.png" width="" height="" alt="2015-11-15e Ideas for following up on TPL hackathon &#45;&#45; index card #prototyping #tpl #hackathon" loading="lazy" decoding="async">
      <figcaption>2015-11-15e Ideas for following up on TPL hackathon &#45;&#45; index card #prototyping #tpl #hackathon</figcaption>
    </picture></a></div><p></p>
<p>&#xA0;</p>
<p>The <a href="https://github.com/sachac/explore-neighbourhood-libraries">code</a> works by extracting the branch names and totals on the left side of search pages and combining those with the <a href="http://www.torontopubliclibrary.ca/data/library-data.kml">locations of the branches (KML)</a>. I don&apos;t really need the server component, so I&apos;m thinking of rewriting the script so that it runs entirely client-side &#8211; maybe as a Chrome extension or as a user script. That way, other people can play with the idea without running their own server (and without my having to keep a server around), and we can try it out without waiting for the library to integrate it into their website. That said, it would be totally awesome to get it into the interface of the Toronto Public Library! We&apos;ll just have to see if it can happen. =) Happy to chat with library geeks to get this sorted out.</p>
<p>It was fun working on this. W- decided to join me at the last minute, so it turned into a fun weekend of hanging out with my husband at the library. I wanted to keep my weekend flexible and low-key, so I decided not to go through the team matchmaking thing. W- found some comfy chairs in the corner of the area, I plugged in the long extension cord I brought, and we settled in.</p>
<p>I learned a lot from the hackathon mentors. In particular, I picked up some excellent search and RSS tips from <a href="https://twitter.com/waharnum">Alan Harnum</a>. You can&apos;t search with a blank query, but he showed me how you can start with a text string, narrow the results using the facets on the left side, and then remove the text string from the query in order to end up with a search that uses only the facets. He also showed me that the RSS feed had extra information that wasn&apos;t in the HTML source and that it could be paginated with URL parameters. Most of the RSS feeds I&apos;d explored in the past were nonpaginated subsets of the information presented on the websites, so it was great to learn about the possibilities I had overlooked.</p>
<p>The faceted search was exactly what I needed to list recent videos even if I didn&apos;t know what they were called, so I started thinking of fun tools that would make hunting for popular new videos easier. (There have been quite a few times when I&apos;ve gone to a library at opening time so that I could snag a video that was marked as available the night before!) In addition to checking the specific item&apos;s branch details to see where it was on the shelf and which copies were out on loan, I was also curious about whether we were checking the right library, or if other libraries were getting more new videos than our neighbourhood library was.</p>
<p>W- was curious about the Z39.50 protocol that lets you query a library catalogue. I showed him the little bits I&apos;d figured out last week using <code>yaz-client</code> from the <code>yaz</code> package, and he started digging into the protocol reference. He figured out how to get it to output XML (<code>format xml</code>) and how to search by different attributes. I&apos;m looking forward to reading his notes on that.</p>
<p>Me, I figured that there might be something interesting in the visualization of new videos and other items. I hadn&apos;t played around a lot with geographic visualization, so it was a good excuse to pick up some skills. First, I needed to get the data into the right shape.</p>
<p><b>Step 1: Extract the data and test that I was reading it correctly</b></p>
<p>I usually find it easier to start with the data rather than visualizations. I like writing small data transformation functions and tests, since they don&apos;t involve complex external libraries. (If you miss something important when coding a visualization, often nothing happens!)</p>
<p>I wrote a function to extract information from the branch CSV on the <a href="http://hackathon.tplcs.ca/">hackathon data page</a>, using <code>fast-csv</code> to read it as an array of objects. I tested that with <code>jasmine-node</code>. Tiny, quick accomplishment.</p>
<p>Then I worked on extracting the branch result count from the search results page. This was just a matter of finding the right section, extracting the text, and converting the numbers. I saved a sample results page to my project and used <a href="https://github.com/cheeriojs/cheerio">cheerio</a> to parse it. I decided not to hook it up to live search results until I figured out the visualization aspect. No sense in hitting the library website repeatedly or dealing with network delays.</p>
<p><b>Step 2: Make a simple map that shows library branches</b></p>
<p>I started with the <a href="https://developers.google.com/maps/tutorials/visualizing/earthquakes">Google Maps earthquake tutorial</a>. The data I&apos;d extracted had addresses but not coordinates. I tried using the Google geocoder, but with my rapid tests, I ran into rate limits pretty early. Then it occurred to me that with their interest in open data, the library was the sort of place that would probably have a file with branch coordinates in terms of latitude and longitude. The hackathon data page didn&apos;t list any obvious matches, but a search for Toronto Public Library KML (an extension I remembered from W-&apos;s explorations with GPS and OpenStreetMap) turned up the <a href="http://www.torontopubliclibrary.ca/data/library-data.kml">file I wanted</a>. I wrote a test to make sure this worked as I expected.</p>
<p><b>Step 3: Combine the data</b></p>
<p>At first I tried to combine the data on the client side, making one request for the branch information and another request for the results information. It got a bit confusing, though &#8211; I need to get the hang of using <code>require</code> in a from-scratch webpage. I decided the easiest way to try my idea out was to just make the server combine the data and return the GeoJSON that the tutorial showed how to visualize. That way, my client-side HTML and JS could stay simple.</p>
<p><b>Step 4: Fiddle with the visualization options</b></p>
<p>Decisions, decisions&#x2026; Red was too negative. Blue and green were hard to see. W- suggested orange, and that worked out well with Google Maps&apos; colours. Logarithmic scale or linear scale? Based on a maximum? After experimenting with a bunch of options, I decided to go with a linear scale (calculated on the server), since it made sense for the marker for a branch with a thousand items to be significantly bigger than a branch with five hundred items. I played with this a bit until I came up with maximum and minimum sizes that made sense to me.</p>
<p><b>Step 5: Hook it up to live search data</b></p>
<p>I needed to pass the URL of the search results, and I knew I wanted to be able to call the visualization from the search results page itself. I used <a href="http://tampermonkey.net/">TamperMonkey</a> to inject some Javascript into the Toronto Public Library webpage. The library website didn&apos;t use JQuery, so I looked up the plain-vanilla Javascript way of selecting and modifying elements.</p>
<div class="org-src-container">
<pre class="src src-js2">document.querySelector(&apos;#refinements-library_branch&apos;)
  .parentNode.querySelector(&apos;h3&apos;).innerHTML =
  &apos;Library Branch &lt;a target=&quot;_blank&quot; style=&quot;color: white; &apos; +
  &apos;text-decoration: underline&quot; &apos; +
  &apos;href=&quot;http://localhost:9000/viz.html?url=&apos; +
  encodeURIComponent(location.href) + &apos;&quot;&gt;(Visualize)&lt;/a&gt;&apos;;
</pre>
</div>
<p><b>Step 6: Tweak the interface</b></p>
<p>I wanted to display information on hover and filter search results on click. Most of the tutorials I saw focused on how to add event listeners to individual markers, but I eventually found an example that showed how to <a href="https://developers.google.com/maps/documentation/javascript/examples/layer-data-event">add a listener</a> to <code>map.data</code> and get the information from the event object. I also found out that you could add a <code>title</code> attribute and get a simple tooltip to display, which was great for confirming that I had the data all lined up properly.</p>
<p><b>Step 7: Cache the results</b></p>
<p>Testing with live data was a bit inconvenient because of occasional timeouts from the library website, so I decided to cache search results to the filesystem. I didn&apos;t bother writing code for checking last modification time, since I knew it was just for demos and testing.</p>
<p><b>Step 8: Prettify the hover</b></p>
<p>The tooltip provided by <code>title</code> was a little bare, so I decided to spend some time figuring out how to make better information displays before taking screenshots for the presentation. I found an example that showed how to create and move an InfoWindow based on the <a href="https://duncan99.wordpress.com/2011/11/04/google-maps-api-adding-infowindows-in-response-to-user-clicks/">event&apos;s location</a> instead of relying on marker information, so I used that to show the information with better formatting.</p>
<p><b>Step 9: Make the presentation</b></p>
<p>Here&apos;s how I usually plan short presentations:</p>
<ol class="org-ol">
<li>Figure out the key message and the flow.</li>
<li>Pick a target words-per-minute rate and come up with a word budget.</li>
<li>Draft the script, checking it against my word budget.</li>
<li>Read the script out loud a few times, checking for time, tone, and hard-to-say phrases.</li>
<li>Annotate the script with notes on visual aids.</li>
<li>Make visuals, take screenshots, etc.</li>
<li>Record and edit short videos, splitting them up in Camtasia Studio by using markers so that I can control the pace of the video.</li>
<li>Copy the script (or keywords) into the presenter&apos;s notes.</li>
<li>Test the script for time and flow, and revise as needed.</li>
</ol>
<p>I considered two options for the flow. I could start with the personal use case (looking for new videos) and then expand from there, tying it into the library&apos;s wider goals. That would be close to how I developed it. Or I could start with one of the hackathon challenges, establish that connection with the library&apos;s goals, and then toss in my personal use case as a possibly amusing conclusion. After chatting about it with W- on the subway ride home from the library, I decided to start with the second approach. I figured that would make it easier for people to connect the dots in terms of relevance.</p>
<p>I used ~140wpm as my target, minus a bit of a buffer for demos and other things that could come up, so roughly 350 words for 3 minutes. I ran through the presentation a few times at home, clocking in at about 2:30. I tend to speak more quickly when I&apos;m nervous, so I rehearsed with a slightly slower pace. That way, I could get a sense of what the pace should sound like. During the actual presentation, though, I was a teensy bit over time &#8211; there was a bit of unexpected applause. Also, even though I remembered to slow down, I didn&apos;t breathe as well as I probalby should&apos;ve; I still tend to breathe a little shallowly when I&apos;m on stage. Maybe I should pick a lower WPM for presentations and add explicit breathing reminders. =)</p>
<p>I normally try to start with less material and then add details to fit the time. That way, I can easily adjust if I need to compress my talk, since I&apos;ve added details in terms of priority. I initially had a hard time concisely expressing the problem statement and tying together the three examples I wanted to use, though. It took me a few tries to get things to fit into my word budget <b>and</b> flow in a way that made me happy.</p>
<p>Anyway, once I sorted out the script, I came up with some ideas for the visuals. I didn&apos;t want a lot of words on the screen, since it&apos;s hard to read and listen at the same time. Doodles work well for me. I sketched a few images and created a simple sequence. I took screenshots for the key parts I wanted to demonstrate, just in case I didn&apos;t get around to doing a live demo or recording video. That way, I didn&apos;t have to worry about scrambling to finish my presentation. I could start with something simple but presentable, and then I could add more frills if I had time.</p>
<p>Once the static slides were in place, I recorded and edited videos demonstrating the capabilities. Video is a nice way to give people a more real sense of how something works without risking as many technical issues as a live demo would.</p>
<p>I had started with just my regular resolution (1366&#215;768 on my laptop) and a regular browser window, but the resulting video was not as sharp as it could have been. Since the presentation template had 4:3 aspect ratio, I redid the video with 1024&#215;768 resolution and a full-screen browser in order to minimize the need for resizing.</p>
<p>I sped up boring parts of the video and added markers where I wanted to split it into slides. Camtasia Studio rendered the video into separate files based on my markers. I added the videos to individual slides, setting them to play automatically. I like the approach of splitting up videos onto separate slides because it allows me to narrate at my own pace instead of speeding up or slowing down to match the animation.</p>
<p>I copied the segments of my script to the presenter notes for each slide, and I used Presenter View to run through it a few more times so that I could check whether the pace worked and whether the visuals made sense. Seemed all right, yay!</p>
<p>Just in time, too. I had a quick lunch and headed off to the library for the conclusion of the hackathon.</p>
<p>There wsa a bit of time before the presentations started. I talked to Alan again to show him what I&apos;d made, hear about what he had been working on, and pick his brain to figure out which terms might resonate with the internal jargon of the library &#8211; little things, like what they call the people who decide what kinds of books should be in which libraries, or what they call the things that libraries lend. (Items? Resources? Items.) Based on his feedback, I edited my script to change &quot;library administrators&quot; to &quot;selection committees&quot;. I don&apos;t know if it made a difference, but it was a good excuse to learn more about the language people used.</p>
<p>I tested that the presentation displayed fine on the big screen, too. It turned out that the display was capable of widescreen input at a higher resolution than what I&apos;d set, but 1024&#215;768 was pretty safe and didn&apos;t look too fuzzy, so I left it as it was. I used my presentation remote to flip through the slides while confirming that things looked okay from the back of the room (colours, size, important information not getting cut off by people&apos;s heads, etc.). The hover text was a bit small, but it gave the general idea.</p>
<p>And then it was presentation time. I was third, which was great because once I finished, I could focus on other people&apos;s presentations and learn from their ideas. Based on W-&apos;s cellphone video, it looks like I remembered to use the microphone so that the library could record, and I remembered to look up from my presenter notes and gesture from time to time (hard when you&apos;re hidden behind the podium, but we do what we can!). I stayed pretty close to my script, but I hope I kept the script conversational enough that it sounded more like me instead of a book. I didn&apos;t have the mental bandwidth to keep an eye on the timer in the center of the presenter view, but fortunately the time worked out reasonably well. I concluded just as the organizer was getting up to nudge me along, and I&apos;d managed to get to all the points I wanted to along the way. Whew!</p>
<p>Anyway, that&apos;s a quick braindump of the project and what it was like to hack it together. I&apos;ll probably write some more about following up on ideas and about other people&apos;s presentations, but I wanted to get this post out there while the experience was fresh in my head. It was fun. I hope the Toronto Public Library will take the hackathon ideas forward, and I hope they&apos;ll get enough out of the hackathon that they&apos;ll organize another one! =)</p>

<p>You can <a href="https://sachachua.com/blog/2015/11/exploring-neighbourhood-libraries-and-other-notes-from-the-toronto-public-library-hackathon/#comment">view 1 comment</a> or <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2015%2F11%2Fexploring-neighbourhood-libraries-and-other-notes-from-the-toronto-public-library-hackathon%2F&body=Name%20you%20want%20to%20be%20credited%20by%20(if%20any)%3A%20%0AMessage%3A%20%0ACan%20I%20share%20your%20comment%20so%20other%20people%20can%20learn%20from%20it%3F%20Yes%2FNo%0A">e-mail me at sacha@sachachua.com</a>.</p>]]></description>
		</item><item>
		<title>Wow, literate devops with Emacs and Org does actually work on Windows</title>
		<link>https://sachachua.com/blog/2015/10/wow-literate-devops-with-emacs-and-org-does-actually-work-on-windows/</link>
		<dc:creator><![CDATA[Sacha Chua]]></dc:creator>
		<pubDate>Fri, 16 Oct 2015 18:57:00 GMT</pubDate>
    <category>emacs</category>
<category>org</category>
		<guid isPermaLink="false">https://sachachua.com/blog/?p=28428</guid>
		<description><![CDATA[<p>Since I persist in using Microsoft Windows as my base system, I&#8217;m used to not being able to do the kind of nifty tricks that other people do with Emacs and shell stuff.</p>
<p>So I was delighted to find that the <a href="http://www.howardism.org/Technical/Emacs/literate-devops.html">literate devops</a> that Howard Abrams described – running shell scripts embedded in an Org Mode file on a remote server – actually worked with Plink.</p>
<p>Here&#8217;s my context: The Toronto Public Library publishes a list of new books on the 15th of every month. I&#8217;ve written a small Perl script that parses the list for a specified category and displays the Dewey decimal code, title, and item ID. I also have another script (Ruby on Rails, part of quantifiedawesome.com) that lets me request multiple items by pasting in text containing the item IDs. Tying these two together, I can take the output of the library new releases script, delete the lines I&#8217;m not interested in, and feed those lines to my library request script.</p>
<p>Instead of starting Putty, sshing to my server, and typing in the command line myself, I can now use <code>C-c C-c</code> on an Org Mode block like this:</p>
<div class="org-src-container">
<pre class="src src-org"><span class="org-org-block-begin-line">#+begin_src sh :dir /sacha@direct.sachachua.com:~</span>
perl library-new.pl Business
<span class="org-org-block-end-line">#+end_src</span>
</pre>
</div>
<p>That&#8217;s in a task that&#8217;s scheduled to repeat monthly, for even more convenience, and I also have a link there to my web-based interface for bulk-requesting files. But really, now that I&#8217;ve got it in Emacs, I should add a <code>#+NAME:</code> above the <code>#+RESULTS:</code> and have Org Mode take care of requesting those books itself.</p>
<p>On a related note, I&#8217;d given up on being able to easily use TRAMP from Emacs on Windows before, because Cygwin SSH was complaining about a non-interactive terminal.</p>
<pre class="example">ssh -l sacha  -o ControlPath=c:/Users/Sacha/AppData/Local/Temp/tramp.13728lpv.%r@%h:%p -o ControlMaster=auto -o ControlPersist=no -e none direct.sachachua.com &amp;&amp; exit || exit
Pseudo-terminal will not be allocated because stdin is not a terminal.
ssh_askpass: exec(/usr/sbin/ssh-askpass): No such file or directory
Permission denied, please try again.
ssh_askpass: exec(/usr/sbin/ssh-askpass): No such file or directory
Permission denied, please try again.
ssh_askpass: exec(/usr/sbin/ssh-askpass): No such file or directory
Permission denied (publickey,password).
</pre>
<p>As it turns out, setting the following made it work for me.</p>
<div class="org-src-container">
<pre class="src src-emacs-lisp">(setq tramp-default-method <span class="org-string">"plink"</span>)
</pre>
</div>
<p>Now I can do things like the following:</p>
<div class="org-src-container">
<pre class="src src-emacs-lisp">(find-file <span class="org-string">"/sacha@direct.sachachua.com:~/library-new.pl"</span>)
</pre>
</div>
<p>… which is, incidentally, this file (edited to remove my credentials):</p>
<div class="org-src-container">
<pre class="src src-perl"><span class="org-comment-delimiter">#</span><span class="org-comment">!/usr/bin/perl</span>
<span class="org-comment-delimiter"># </span><span class="org-comment">Displays new books from the Toronto Public Library</span>
<span class="org-comment-delimiter">#</span>
<span class="org-comment-delimiter"># </span><span class="org-comment">Author: Sacha Chua (sacha@sachachua.com)</span>
<span class="org-comment-delimiter">#</span>
<span class="org-comment-delimiter"># </span><span class="org-comment">Usage:</span>
<span class="org-comment-delimiter"># </span><span class="org-comment">perl library-new.pl &lt;category&gt; - print books</span>
<span class="org-comment-delimiter"># </span><span class="org-comment">perl library-new.pl &lt;file&gt; &lt;username&gt; &lt;password&gt; - request books</span>
<span class="org-comment-delimiter">#</span>
<span class="org-keyword">use</span> <span class="org-constant">Date</span>::Parse;

<span class="org-comment-delimiter">#</span><span class="org-comment">!/usr/bin/perl -w</span>
<span class="org-keyword">use</span> <span class="org-constant">strict</span>;
<span class="org-keyword">use</span> <span class="org-constant">URI</span>::URL;
<span class="org-keyword">use</span> <span class="org-constant">WWW</span>::Mechanize;
<span class="org-keyword">use</span> <span class="org-constant">WWW</span>::Mechanize::FormFiller;
<span class="org-keyword">use</span> <span class="org-constant">WWW</span>::Mechanize::TreeBuilder;
<span class="org-keyword">use</span> <span class="org-constant">HTML</span>::TableExtract;
<span class="org-keyword">use</span> <span class="org-constant">Data</span>::Dumper;
<span class="org-keyword">sub</span> <span class="org-function-name">process_account</span>($$$);
<span class="org-keyword">sub</span> <span class="org-function-name">trim</span>($);
<span class="org-keyword">sub</span> <span class="org-function-name">to_renew</span>($$);
<span class="org-keyword">sub</span> <span class="org-function-name">clean_string</span>($);

<span class="org-comment-delimiter"># </span><span class="org-comment">Get the arguments</span>
<span class="org-keyword">if</span> ($#<span class="org-underline"><span class="org-variable-name">ARGV</span></span> &lt; 0) {
    print <span class="org-string">"Usage:\n"</span>;
    print <span class="org-string">"perl library-new.pl &lt;category/filename&gt; [username] [password]\n"</span>;
    <span class="org-keyword">exit</span>;
}

<span class="org-type">my</span> $<span class="org-variable-name">agent</span> = WWW::Mechanize-&gt;new( autocheck =&gt; 1 );
<span class="org-type">my</span> $<span class="org-variable-name">formfiller</span> = WWW::Mechanize::FormFiller-&gt;new();
<span class="org-keyword">if</span> ($#<span class="org-underline"><span class="org-variable-name">ARGV</span></span> &gt; 0) {
  <span class="org-type">my</span> $<span class="org-variable-name">filename</span> = shift(@<span class="org-underline"><span class="org-variable-name">ARGV</span></span>);
  <span class="org-type">my</span> $<span class="org-variable-name">username</span> = <span class="org-string">"NOT ACTUALLY MY USERNAME"</span>;
  <span class="org-type">my</span> $<span class="org-variable-name">password</span> = <span class="org-string">"NOT ACTUALLY MY PASSWORD"</span>;
  print <span class="org-string">"Requesting books\n"</span>;
  request_books($<span class="org-variable-name">agent</span>, $<span class="org-variable-name">username</span>, $<span class="org-variable-name">password</span>, $<span class="org-variable-name">filename</span>);
} <span class="org-keyword">else</span> {
  <span class="org-type">my</span> $<span class="org-variable-name">category</span> = shift(@<span class="org-underline"><span class="org-variable-name">ARGV</span></span>);
  WWW::Mechanize::TreeBuilder-&gt;meta-&gt;apply($<span class="org-variable-name">agent</span>);
  print_new_books($<span class="org-variable-name">agent</span>, $<span class="org-variable-name">category</span>);
}


<span class="org-comment-delimiter">## </span><span class="org-comment">FUNCTIONS ###############################################</span>

<span class="org-comment-delimiter"># </span><span class="org-comment">Perl trim function to remove whitespace from the start and end of the string</span>
<span class="org-keyword">sub</span> <span class="org-function-name">trim</span>($)
{
  <span class="org-type">my</span> $<span class="org-variable-name">string</span> = shift;
  $<span class="org-variable-name">string</span> =~ s<span class="org-string">/^\s+//</span>;
  $<span class="org-variable-name">string</span> =~ s<span class="org-string">/\s+$//</span>;
  <span class="org-keyword">return</span> $<span class="org-variable-name">string</span>;
}

<span class="org-keyword">sub</span> <span class="org-function-name">request_books</span>($$$$)
{
  <span class="org-type">my</span> $<span class="org-variable-name">agent</span> = shift;
  <span class="org-type">my</span> $<span class="org-variable-name">username</span> = shift;
  <span class="org-type">my</span> $<span class="org-variable-name">password</span> = shift;
  <span class="org-type">my</span> $<span class="org-variable-name">filename</span> = shift;

  <span class="org-comment"># Read titles and IDs</span>
  open(DATA, $<span class="org-variable-name">filename</span>) or <span class="org-keyword">die</span>(<span class="org-string">"Couldn't open file."</span>);
  <span class="org-type">my</span> @<span class="org-underline"><span class="org-variable-name">lines</span></span> = &lt;<span class="org-constant">DATA</span>&gt;;
  close(DATA);

  <span class="org-type">my</span> %<span class="org-underline"><span class="org-variable-name">requests</span></span> = ();

  <span class="org-type">my</span> $<span class="org-variable-name">line</span>;
  <span class="org-type">my</span> $<span class="org-variable-name">title</span>;
  <span class="org-type">my</span> $<span class="org-variable-name">id</span>;
  <span class="org-keyword">foreach</span> $<span class="org-variable-name">line</span> (@<span class="org-underline"><span class="org-variable-name">lines</span></span>) {
    ($<span class="org-variable-name">title</span>, $<span class="org-variable-name">id</span>) = split <span class="org-string">/\t/</span>, $<span class="org-variable-name">line</span>;
    chomp $<span class="org-variable-name">id</span>;
    $<span class="org-variable-name">requests</span>{$<span class="org-variable-name">id</span>} = $<span class="org-variable-name">title</span>;
  }

  <span class="org-comment"># Log in</span>
  log_in_to_library($<span class="org-variable-name">agent</span>, $<span class="org-variable-name">username</span>, $<span class="org-variable-name">password</span>);
  print <span class="org-string">"Retrieving checked-out and requested books..."</span>;
  <span class="org-comment"># Retrieve my list of checked-out and requested books</span>
  <span class="org-type">my</span> $<span class="org-variable-name">current_ids</span> = get_current_ids($<span class="org-variable-name">agent</span>);

  <span class="org-comment"># Retrieve a stem URL that I can use for requests</span>
  <span class="org-type">my</span> $<span class="org-variable-name">base_url</span> = <span class="org-string">'https://www.torontopubliclibrary.ca/placehold?itemId='</span>;
  <span class="org-type">my</span> @<span class="org-underline"><span class="org-variable-name">already_out</span></span>;
  <span class="org-type">my</span> @<span class="org-underline"><span class="org-variable-name">success</span></span>;
  <span class="org-type">my</span> @<span class="org-underline"><span class="org-variable-name">failure</span></span>;
  <span class="org-comment"># For each line in the file</span>
  <span class="org-keyword">while</span> (($<span class="org-variable-name">id</span>, $<span class="org-variable-name">title</span>) = each(%<span class="org-underline"><span class="org-variable-name">requests</span></span>)) {
    <span class="org-comment"># Do I already have it checked out or on hold? Skip.</span>
    <span class="org-keyword">if</span> ($<span class="org-variable-name">current_ids</span>-&gt;{$<span class="org-variable-name">id</span>}) {
      push @<span class="org-underline"><span class="org-variable-name">already_out</span></span>, $<span class="org-variable-name">title</span> . <span class="org-string">" ("</span> . $<span class="org-variable-name">current_ids</span>-&gt;{$<span class="org-variable-name">id</span>} . <span class="org-string">")"</span>;
    } <span class="org-keyword">else</span> {
      <span class="org-comment"># Request the hold</span>
      <span class="org-type">my</span> $<span class="org-variable-name">url</span> = $<span class="org-variable-name">base_url</span> . $<span class="org-variable-name">id</span>;
      $<span class="org-variable-name">agent</span>-&gt;get($<span class="org-variable-name">url</span>);
      $<span class="org-variable-name">agent</span>-&gt;form_name(<span class="org-string">'form_place-hold'</span>);
      $<span class="org-variable-name">agent</span>-&gt;submit();
      <span class="org-keyword">if</span> ($<span class="org-variable-name">agent</span>-&gt;content =~ <span class="org-string">/The hold was successfully placed/</span>) {
        <span class="org-comment"># print "Borrowed ", $title, "\n";</span>
        <span class="org-comment">## Did it successfully get checked out? Save title in success list</span>
        push @<span class="org-underline"><span class="org-variable-name">success</span></span>, $<span class="org-variable-name">title</span>;
      } <span class="org-keyword">else</span> {
        <span class="org-comment"># Else, save title and ID in fail list</span>
        push @<span class="org-underline"><span class="org-variable-name">failure</span></span>, $<span class="org-variable-name">title</span> . <span class="org-string">"\t"</span> . $<span class="org-variable-name">id</span>;
      }
    }
  }
  <span class="org-comment"># Print out success list</span>
  <span class="org-keyword">if</span> ($#<span class="org-underline"><span class="org-variable-name">success</span></span> &gt; 0) {
    print <span class="org-string">"BOOKS REQUESTED:\n"</span>;
    <span class="org-keyword">foreach</span> <span class="org-type">my</span> $<span class="org-variable-name">title</span> (@<span class="org-underline"><span class="org-variable-name">success</span></span>) {
      print $<span class="org-variable-name">title</span>, <span class="org-string">"\n"</span>;
    }
    print <span class="org-string">"\n"</span>;
  }
  <span class="org-comment"># Print out already-out list</span>
  <span class="org-keyword">if</span> ($#<span class="org-underline"><span class="org-variable-name">already_out</span></span> &gt; 0) {
    print <span class="org-string">"ALREADY REQUESTED/CHECKED OUT:\n"</span>;
    <span class="org-keyword">foreach</span> <span class="org-type">my</span> $<span class="org-variable-name">s</span> (@<span class="org-underline"><span class="org-variable-name">already_out</span></span>) {
      print $<span class="org-variable-name">s</span>, <span class="org-string">"\n"</span>;
    }
    print <span class="org-string">"\n"</span>;
  }
  <span class="org-comment"># Print out fail list</span>
  <span class="org-keyword">if</span> ($#<span class="org-underline"><span class="org-variable-name">failure</span></span> &gt; 0) {
    print <span class="org-string">"COULD NOT REQUEST:\n"</span>;
    <span class="org-keyword">foreach</span> <span class="org-type">my</span> $<span class="org-variable-name">s</span> (@<span class="org-underline"><span class="org-variable-name">failure</span></span>) {
      print $<span class="org-variable-name">s</span>, <span class="org-string">"\n"</span>;
    }
    print <span class="org-string">"\n"</span>;
  }
}

<span class="org-keyword">sub</span> <span class="org-function-name">get_current_ids</span>($)
{
  <span class="org-type">my</span> $<span class="org-variable-name">agent</span> = shift;
  <span class="org-type">my</span> %<span class="org-underline"><span class="org-variable-name">current_ids</span></span> = ();
  <span class="org-type">my</span> $<span class="org-variable-name">string</span> = $<span class="org-variable-name">agent</span>-&gt;content;
  <span class="org-keyword">while</span> ($<span class="org-variable-name">string</span> =~ m<span class="org-string">/TITLE\^([0-9]+)\^/</span>g) {
    $<span class="org-variable-name">current_ids</span>{$<span class="org-variable-name">1</span>} = <span class="org-string">'requested'</span>;
  }
  <span class="org-keyword">while</span> ($<span class="org-variable-name">string</span> =~ m<span class="org-string">/RENEW\^([0-9]+)\^/</span>g) {
    $<span class="org-variable-name">current_ids</span>{$<span class="org-variable-name">1</span>} = <span class="org-string">'checked out'</span>;
  }
  <span class="org-keyword">return</span> \%<span class="org-underline"><span class="org-variable-name">current_ids</span></span>;
}

<span class="org-keyword">sub</span> <span class="org-function-name">print_new_books</span>($$)
{
  <span class="org-type">my</span> $<span class="org-variable-name">agent</span> = shift;
  <span class="org-type">my</span> $<span class="org-variable-name">category</span> = shift;
  $<span class="org-variable-name">agent</span>-&gt;env_proxy();
  $<span class="org-variable-name">agent</span>-&gt;get(<span class="org-string">'http://oldcatalogue.torontopubliclibrary.ca'</span>);
  $<span class="org-variable-name">agent</span>-&gt;follow_link(text_regex =&gt; qr<span class="org-string">/Our Newest Titles/</span>);
  $<span class="org-variable-name">agent</span>-&gt;follow_link(text_regex =&gt; qr<span class="org-string">/$category/</span>i);

  <span class="org-type">my</span> $<span class="org-variable-name">continue</span> = 1;
  <span class="org-keyword">while</span> ($<span class="org-variable-name">continue</span>) {
    print_titles_on_page($<span class="org-variable-name">agent</span>);
    <span class="org-keyword">if</span> ($<span class="org-variable-name">agent</span>-&gt;form_with_fields(<span class="org-string">'SCROLL^F'</span>)) {
      $<span class="org-variable-name">agent</span>-&gt;click(<span class="org-string">'SCROLL^F'</span>);
    } <span class="org-keyword">else</span> {
      $<span class="org-variable-name">continue</span> = 0;
    }
  }
}

<span class="org-comment-delimiter"># </span><span class="org-comment">Print out all the entries on this page</span>
<span class="org-keyword">sub</span> <span class="org-function-name">print_titles_on_page</span>($)
{
  <span class="org-type">my</span> $<span class="org-variable-name">agent</span> = shift;
  <span class="org-type">my</span> @<span class="org-underline"><span class="org-variable-name">titles</span></span> = $<span class="org-variable-name">agent</span>-&gt;look_down(<span class="org-keyword">sub</span> {
                                $<span class="org-variable-name">_</span>[0]-&gt;tag() eq <span class="org-string">'strong'</span> and
                                $<span class="org-variable-name">_</span>[0]-&gt;parent-&gt;attr(<span class="org-string">'class'</span>) and
                                $<span class="org-variable-name">_</span>[0]-&gt;parent-&gt;attr(<span class="org-string">'class'</span>) eq <span class="org-string">'itemlisting'</span>; });
  <span class="org-keyword">foreach</span> <span class="org-type">my</span> $<span class="org-variable-name">title</span> (@<span class="org-underline"><span class="org-variable-name">titles</span></span>) {
    <span class="org-type">my</span> $<span class="org-variable-name">hold</span> = $<span class="org-variable-name">title</span>-&gt;parent-&gt;parent-&gt;parent-&gt;parent-&gt;look_down(<span class="org-keyword">sub</span> {
                                                          $<span class="org-variable-name">_</span>[0]-&gt;attr(<span class="org-string">'alt'</span>) and
                                                          $<span class="org-variable-name">_</span>[0]-&gt;attr(<span class="org-string">'alt'</span>) eq <span class="org-string">'Place Hold'</span>; });
    <span class="org-type">my</span> $<span class="org-variable-name">id</span> = <span class="org-string">""</span>;
    <span class="org-type">my</span> $<span class="org-variable-name">call_no</span> = <span class="org-string">""</span>;
    <span class="org-keyword">if</span> ($<span class="org-variable-name">hold</span> &amp;&amp; $<span class="org-variable-name">hold</span>-&gt;parent &amp;&amp; $<span class="org-variable-name">hold</span>-&gt;parent-&gt;attr(<span class="org-string">'href'</span>) =~ <span class="org-string">/item_id=([^&amp;]+)&amp;.*?callnum=([^ "&amp;]+)/</span>) {
      $<span class="org-variable-name">id</span> = $<span class="org-variable-name">1</span>;
      $<span class="org-variable-name">call_no</span> = $<span class="org-variable-name">2</span>;
    }
    print $<span class="org-variable-name">call_no</span> . <span class="org-string">"\t"</span> . $<span class="org-variable-name">title</span>-&gt;as_text . <span class="org-string">"\t"</span> . $<span class="org-variable-name">id</span> . <span class="org-string">"\n"</span>;
  }
}

<span class="org-keyword">sub</span> <span class="org-function-name">clean_string</span>($)
{
    <span class="org-type">my</span> $<span class="org-variable-name">string</span> = shift;
    $<span class="org-variable-name">string</span> =~ s<span class="org-string">#^.*?(&lt;form id="renewitems" [^&gt;]+&gt;)#&lt;html&gt;&lt;body&gt;\1#</span>s;
    $<span class="org-variable-name">string</span> =~ s<span class="org-string">#&lt;/form&gt;.*#&lt;/form&gt;&lt;/html&gt;#</span>s;
    $<span class="org-variable-name">string</span> =~ s<span class="org-string">#&lt;table border="0" bordercolor="red".*(&lt;table border="0" bordercolor="blue" cellspacing="0" cellpadding="0"&gt;)#\1#</span>s;
    $<span class="org-variable-name">string</span> =~ s<span class="org-string">#&lt;/table&gt;.*&lt;/form&gt;#&lt;/table&gt;&lt;/form&gt;#</span>s;
<span class="org-comment-delimiter"># </span><span class="org-comment">Clean up for parsing</span>
    $<span class="org-variable-name">string</span> =~ s<span class="org-string">#&lt;!&#45;&#45; Print the date due &#45;&#45;&gt;##</span>g;
    $<span class="org-variable-name">string</span> =~ s<span class="org-string">#&lt;br&gt; &lt;!&#45;&#45; Displays Date &#45;&#45;&gt;##</span>g;
    <span class="org-keyword">return</span> $<span class="org-variable-name">string</span>;
}

<span class="org-keyword">sub</span> <span class="org-function-name">log_in_to_library</span>($$$) {
    <span class="org-type">my</span> $<span class="org-variable-name">agent</span> = shift;
    <span class="org-type">my</span> $<span class="org-variable-name">username</span> = shift;
    <span class="org-type">my</span> $<span class="org-variable-name">password</span> = shift;
    $<span class="org-variable-name">agent</span>-&gt;get(<span class="org-string">'http://beta.torontopubliclibrary.ca/youraccount'</span>);
    $<span class="org-variable-name">agent</span>-&gt;form_name(<span class="org-string">'form_signin'</span>);
    $<span class="org-variable-name">agent</span>-&gt;current_form-&gt;value(<span class="org-string">'userId'</span>, $<span class="org-variable-name">username</span>);
    $<span class="org-variable-name">agent</span>-&gt;current_form-&gt;value(<span class="org-string">'password'</span>, $<span class="org-variable-name">password</span>);
    $<span class="org-variable-name">agent</span>-&gt;submit();
}
</pre>
</div>
<p>Ah, Emacs!</p>

<p>You can <a href="https://sachachua.com/blog/2015/10/wow-literate-devops-with-emacs-and-org-does-actually-work-on-windows/#comment">view 5 comments</a> or <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2015%2F10%2Fwow-literate-devops-with-emacs-and-org-does-actually-work-on-windows%2F&body=Name%20you%20want%20to%20be%20credited%20by%20(if%20any)%3A%20%0AMessage%3A%20%0ACan%20I%20share%20your%20comment%20so%20other%20people%20can%20learn%20from%20it%3F%20Yes%2FNo%0A">e-mail me at sacha@sachachua.com</a>.</p>]]></description>
		</item><item>
		<title>Quantified Awesome: Analyzing my non-fiction reading, and why I don&rsquo;t mind paying taxes</title>
		<link>https://sachachua.com/blog/2013/08/quantified-awesome-analyzing-my-non-fiction-reading-and-why-i-dont-mind-paying-taxes/</link>
		<dc:creator><![CDATA[Sacha Chua]]></dc:creator>
		<pubDate>Fri, 09 Aug 2013 12:00:00 GMT</pubDate>
    <category>quantified</category>
		<guid isPermaLink="false">https://sachachua.com/blog/?p=25537</guid>
		<description><![CDATA[<p><em>Update Aug 22 2013: See <a href="https://sachachua.com/blog/feed/index.xml#bookpreso">presentation</a> at the end of this post.</em></p>
<p><a href="https://sachachua.com/blog/wp-content/uploads/2013/07/image51.png"><img loading="lazy" title="image" style="border-top: 0px; border-right: 0px; background-image: none; float: right; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" align="right" src="https://sachachua.com/blog/wp-content/uploads/2013/07/image_thumb51.png" width="168" height="186"></a>I built library-book tracking into <a href="http://quantifiedawesome.com">Quantified Awesome</a> in October 2011, hard-coding the patterns used by the Toronto Public Library system. I regularly hit the 50-book checkout limit and sometimes have to check items out on my husband’s account, so it really helps to have a system that can tell me what’s due and when on all the library cards that we have. </p>
<p><strong>Crunching the numbers</strong></p>
<p>In the 668 days (or 95.5 weeks) between October 1, 2011 and the time I exported my data for number-crunching, we checked out 1,252 items, or an average of 13 items a week. That included 250 movies and 44 other videos (TV series, documentaries, and so on). I’m boggled to find out that I checked out only 8 science fiction books. There were 152 other fiction books, including graphic novels and manga.</p>
<p>… 250 movies borrowed from the library results in saving of $150+ a month assuming we snag DVDs at $15. Not that we would watch 2.6 movies a week if we had to pay for them. In November 2011, I tracked the <a href="https://sachachua.com/blog/2011/11/things-im-learning-from-tracking/">retail prices and page count of the books I read</a>: $1,075 and 10,671 pages in a <em>month, </em>boggle. I don’t read all of those pages thoroughly, mind you; <a href="https://sachachua.com/blog/2012/03/visual-book-notes-how-to-read-a-book/">I tend to skim books looking for just what I need.</a> Still, there’s no denying that the Toronto Public Library saves me a heck of a lot of book and entertainment money.</p>
<p>I figured I’d probably want to take a look at my reading list at some point, so I had programmed the system to record titles and Dewey Decimal System classifications as well. Fiction books and feature movies tend to have generic codes, but nonfiction books show me interesting patterns in my reading habits. </p>
<p>Here are my top categories:</p>
<table style="border-collapse: collapse; line-height: normal" cellspacing="0" cellpadding="0" width="416" border="1">
<colgroup>
<col style="width: 227pt; mso-width-source: userset; mso-width-alt: 11044" width="302">
<col style="width: 85pt; mso-width-source: userset; mso-width-alt: 4132" width="113"></colgroup>
<tbody>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>Dewey Decimal Classification</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>Number of items</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">650 &#8211; Management &amp; auxiliary services</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">328</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">330 &#8211; Economics</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">82</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">150 &#8211; Psychology</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">59</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">740 &#8211; Drawing &amp; decorative arts</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">45</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">800 &#8211; Literature, rhetoric &amp; criticism</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">38</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">000 &#8211; Computer science, knowledge &amp; systems</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">33</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">640 &#8211; Home economics &amp; family living</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">30</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">610 &#8211; Medical sciences; Medicine</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">22</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">300 &#8211; Social sciences, sociology &amp; anthropology</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">18</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">340 &#8211; Law</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">14</font></td>
</tr>
</tbody>
</table>
<p>Here are my top sub categories:</p>
<table style="border-collapse: collapse; line-height: normal" cellspacing="0" cellpadding="0" width="545" border="1">
<colgroup>
<col style="width: 324pt; mso-width-source: userset; mso-width-alt: 15798" width="432">
<col style="width: 85pt; mso-width-source: userset; mso-width-alt: 4132" width="113"></colgroup>
<tbody>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>Dewey Decimal Classification</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>Number of items</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">658 &#8211; General management</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">213</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">650 &#8211; Management &amp; auxiliary services</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">92</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">332 &#8211; Financial economics</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">45</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">808 &#8211; Rhetoric &amp; collections of literature</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">37</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">741 &#8211; Drawing &amp; drawings</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">28</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">158 &#8211; Applied psychology</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">24</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">153 &#8211; Mental processes and intelligence</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">22</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">641 &#8211; Food &amp; drink</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">19</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">005 &#8211; Computer programming, programs &amp; data</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">18</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">613 &#8211; Personal health &amp; safety</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">15</font></td>
</tr>
</tbody>
</table>
<p>Here they are, broken down by Dewey decimal group:</p>
<table style="border-collapse: collapse; line-height: normal" cellspacing="0" cellpadding="0" width="572" border="1">
<colgroup>
<col style="width: 344pt; mso-width-source: userset; mso-width-alt: 16786" width="459">
<col style="width: 85pt; mso-width-source: userset; mso-width-alt: 4132" width="113"></colgroup>
<tbody>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>Dewey Decimal Classification</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>Number of items</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>650 &#8211; Management &amp; auxiliary services</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>328</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">658 &#8211; General management</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">213</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">650 &#8211; Management &amp; auxiliary services</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">92</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">657 &#8211; Accounting</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">9</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">659 &#8211; Advertising &amp; public relations</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">5</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">651 &#8211; Office services</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">4</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">652 &#8211; Processes of written communication</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">3</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">653 &#8211; Shorthand</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">2</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>330 &#8211; Economics</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>82</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">332 &#8211; Financial economics</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">45</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">338 &#8211; Production</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">15</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">331 &#8211; Labor economics</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">10</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">330 &#8211; Economics</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">9</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">339 &#8211; Macroeconomics &amp; related topics</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">2</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">333 &#8211; Land economics</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">1</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>150 &#8211; Psychology</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>59</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">158 &#8211; Applied psychology</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">24</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">153 &#8211; Mental processes and intelligence</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">22</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">155 &#8211; Differential and developmental psychology</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">11</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">152 &#8211; Perception, movement, emotions, and drives</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">1</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">150 &#8211; Psychology</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">1</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>740 &#8211; Drawing &amp; decorative arts</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>45</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">741 &#8211; Drawing &amp; drawings</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">28</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">743 &#8211; Drawing &amp; drawings by subject</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">10</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">745 &#8211; Decorative arts</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">7</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>800 &#8211; Literature, rhetoric &amp; criticism</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>38</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">808 &#8211; Rhetoric &amp; collections of literature</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">37</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">809 &#8211; Literary history &amp; criticism</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">1</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>000 &#8211; Computer science, knowledge &amp; systems</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>33</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">005 &#8211; Computer programming, programs &amp; data</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">18</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">006 &#8211; Special computer methods</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">12</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">001 &#8211; Knowledge</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">2</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">003 &#8211; Systems</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">1</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>640 &#8211; Home economics &amp; family living</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>30</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">641 &#8211; Food &amp; drink</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">19</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">646 &#8211; Sewing, clothing, personal living</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">5</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">640 &#8211; Home economics &amp; family living</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">3</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">647 &#8211; Management of public households</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">1</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">644 &#8211; Household utilities</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">1</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">643 &#8211; Housing &amp; household equipment</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">1</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>610 &#8211; Medical sciences; Medicine</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>22</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">613 &#8211; Personal health &amp; safety</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">15</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">616 &#8211; Diseases</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">4</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">612 &#8211; Human physiology</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">3</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>300 &#8211; Social sciences, sociology &amp; anthropology</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>18</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">306 &#8211; Culture &amp; institutions</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">7</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">303 &#8211; Social processes</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">4</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">305 &#8211; Social groups</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">3</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">302 &#8211; Social interaction</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">3</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">304 &#8211; Factors affecting social behavior</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">1</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>340 &#8211; Law</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>14</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">346 &#8211; Private law</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">8</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">343 &#8211; Military, tax, trade, industrial law</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">4</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">349 &#8211; Law of specific jurisdictions &amp; areas</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">2</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>490 &#8211; Other languages</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>13</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">495 &#8211; Languages of East &amp; Southeast Asia</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">13</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>690 &#8211; Buildings</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>12</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">690 &#8211; Buildings</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">8</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">695 &#8211; Roof covering</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">2</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">696 &#8211; Utilities</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">1</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">692 &#8211; Auxiliary construction practices</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">1</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>170 &#8211; Ethics (Moral philosophy)</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>9</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">170 &#8211; Ethics (Moral philosophy)</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">5</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">174 &#8211; Occupational ethics</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">2</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">171 &#8211; Ethical systems</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">2</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>370 &#8211; Education</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>6</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">371 &#8211; School management; special education; alternative education</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">5</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">372 &#8211; Elementary education</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">1</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>720 &#8211; Architecture</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>5</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">729 &#8211; Design &amp; decoration</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">2</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">728 &#8211; Residential &amp; related buildings</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">2</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">720 &#8211; Architecture</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">1</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>810 &#8211; American literature in English</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>5</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">813 &#8211; Fiction</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">2</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">818 &#8211; Miscellaneous writings</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">1</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">819 &#8211; Puzzle activities</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">1</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">814 &#8211; Essays</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">1</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>680 &#8211; Manufacture for specific uses</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>4</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">684 &#8211; Furnishings &amp; home workshops</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">2</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">688 &#8211; Other final products &amp; packaging</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">1</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">686 &#8211; Printing &amp; related activities</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">1</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>770 &#8211; Photography &amp; photographs</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>4</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">775 &#8211; Digital photography</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">2</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">779 &#8211; Photographs</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">1</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">778 &#8211; Fields &amp; kinds of photography</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">1</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>470 &#8211; Italic languages; Latin</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>4</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">478 &#8211; Classical Latin usage</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">4</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>910 &#8211; Geography &amp; travel</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>4</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">915 &#8211; Asia</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">4</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>420 &#8211; English &amp; Old English</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>3</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">422 &#8211; English etymology</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">2</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">428 &#8211; Standard English usage</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">1</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>510 &#8211; Mathematics</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>3</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">519 &#8211; Probabilities &amp; applied mathematics</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">3</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>400 &#8211; Language</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>3</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">401 &#8211; Philosophy &amp; theory</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">3</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>070 &#8211; News media, journalism &amp; publishing</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>3</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">070 &#8211; News media, journalism &amp; publishing</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">3</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>620 &#8211; Engineering &amp; Applied operations</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>3</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">629 &#8211; Other branches of engineering</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">2</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">620 &#8211; Engineering &amp; Applied operations</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">1</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>390 &#8211; Customs, etiquette, folklore</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>2</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">398 &#8211; Folklore</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">2</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>160 &#8211; Logic</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>2</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">160 &#8211; Logic</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">2</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>360 &#8211; Social services; association</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>2</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">362 &#8211; Social welfare problems &amp; services</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">2</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>020 &#8211; Library &amp; information sciences</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>2</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">025 &#8211; Library operations</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">1</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">021 &#8211; Library relationships</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">1</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>750 &#8211; Painting &amp; paintings</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>2</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">759 &#8211; Geographical, historical, areas, persons treatment</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">1</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">751 &#8211; Techniques, equipment, forms</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">1</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>380 &#8211; Commerce, communications, transport</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>2</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">381 &#8211; Internal commerce (Domestic trade)</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">2</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>970 &#8211; General history of North America</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>2</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">977 &#8211; General history of North America; North central United States</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">1</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">974 &#8211; General history of North America; Northeastern United States</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">1</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>700 &#8211; Arts</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>2</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">709 &#8211; Historical, areas, persons treatment</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">1</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">700 &#8211; Arts</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">1</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>190 &#8211; Modern Western philosophy</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>1</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">191 &#8211; Modern Western philosophy of the United States and Canada</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">1</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>030 &#8211; Encyclopedias &amp; books of facts</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>1</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">031 &#8211; Encyclopedias in American English</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">1</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>780 &#8211; Music</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>1</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">786 &#8211; Keyboard &amp; other instruments</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">1</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>290 &#8211; Other &amp; comparative religions</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>1</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">296 &#8211; Judaism</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">1</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>210 &#8211; Natural theology</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>1</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">210 &#8211; Natural theology</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">1</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>520 &#8211; Astronomy &amp; allied sciences</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>1</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">523 &#8211; Specific celestial bodies &amp; phenomena</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">1</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>950 &#8211; General history of Asia; Far East</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>1</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">952 &#8211; General history of Asia; Japan</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">1</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>710 &#8211; Civic &amp; landscape art</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>1</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">712 &#8211; Landscape architecture</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">1</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>630 &#8211; Agriculture</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>1</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">635 &#8211; Garden crops (Horticulture)</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">1</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>500 &#8211; Sciences</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>1</strong></font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">501 &#8211; Philosophy &amp; theory</font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000">1</font></td>
</tr>
<tr style="height: 15pt" height="20">
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>Grand Total</strong></font></td>
<td><font face="Calibri"></font><font style="font-size: 11pt" color="#000000"><strong>776</strong></font></td>
</tr>
</tbody>
</table>
<p>I read a <em>lot</em> of management, personal finance, and psychology books. I enjoy reading them. I read them at breakfast, over lunch, before bed, on weekend afternoons. I’m not surprised by the proportions, although I’m a little surprised by the number – have I really checked out an average of eight nonfiction books a week? Gotten through more than 300 management-related books? Neat.</p>
<p><strong>Time</strong></p>
<p>The time data in my current system goes back to November 29, 2011. Excluding the nonfiction books that were returned before then (although still including the books I currently have checked out that I haven’t read yet), there are 727 nonfiction books checked out. Let’s assume I’ve read or skimmed through 80% of those (I’m probably closer to 90%) – that’s ~580 books. I’ve tracked 123.3 hours as “Discretionary – Productive – Nonfiction”. This undercounts the number of hours because I tend to read things over meals and during subway commutes, so let’s double that time to be in the right ballpark for multitasking. That’s a little less than half an hour per book… which is actually quite reasonable, considering I skim through most books in 10-15 minutes each and spend maybe two hours reading selected books in depth (the ones that I take notes on, for example).</p>
<p>This is what my nonfiction reading habit looks like, with the dark boxes indicating when I read more. (This doesn’t take into account reading while doing other things.)</p>
<p><a href="https://sachachua.com/blog/wp-content/uploads/2013/07/image52.png"><img loading="lazy" title="image" style="border-top: 0px; border-right: 0px; background-image: none; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="1" alt="image" src="https://sachachua.com/blog/wp-content/uploads/2013/07/image_thumb52.png" width="640" height="55"></a></p>
<p>That’s interesting… I read a lot more frequently when I was starting up my business in January/February 2012 (although I wonder what happened in April!). I read more sporadically now. I think it’s because I’m re-figuring-out my strategies for taking notes and applying ideas to my life. </p>
<p><strong>How do I pick books to read?</strong></p>
<p>The library releases lists of new books on the 15th or 16th of every month. I’ve written a small script that extracts the titles, authors, and IDs of the book into a text file that I can review. I delete the lines that I’m not interested in, and my script then requests the books that remain on the list. I monitor the new releases because I don’t want to wait for the usual press</p>
<p>When I ‘m learning about a topic, I tend to check out six or more books related to it. A wide variety of books lets me see different viewpoints, and I can focus on books of better quality.</p>
<p>I occasionally look at Amazon’s recommendations for other ideas, although the books are often not yet available at the library.</p>
<p>Sketchnoting a new release can have high impact, which is another reason why I monitor the new releases. I sometimes reach out to publishers for review copies as well.</p>
<p>The library doesn’t carry everything. I usually add other interesting releases to my Amazon wishlist. I rarely buy books, though, because there’s just such an interesting backlog that I haven’t yet gotten through. I buy books if there are clever illustrations that I’d like to use for ongoing inspiration, or if I want to give the book to a friend, or if it’s an older book that someone has recommended to me and the library doesn’t stock it. Now that I have a business, I usually file those books as business expenses.</p>
<p><strong>So much for quantity. If I’m reading all that, what am I doing with it?</strong></p>
<p>I use books to:</p>
<ul>
<li>Learn about different viewpoints and approaches, especially scenarios that I might not anticipate on my own</li>
<li>Learn how to organize and communicate complex ideas</li>
<li>Get shortcuts on explaining ideas – for example, I don’t have to explain outsourcing from scratch, because I can point people to the 4-Hour Work Week for starters</li>
</ul>
<p>Many of the ideas I pick up from books resurface in my blog posts and experiments. Books help me recognize what’s going on in real life, because the authors have already come up with words for them. I also like applying the advice from books – much to learn.</p>
<p>I frequently recommend books to other people. Visual book reviews make that easier. I try to slow down and recognize books that I’ll probably recommend to others so that I can make visual book reviews of them while I have the book. Sometimes I’ll take quick text notes for myself and then use that for reference. If I find myself recommending the book frequently, then I’ll check it out again and make better notes.</p>
<p>I don’t review my book notes much, relying instead on situations to trigger my memories. When I come across something that’s related to a book I’ve read, or I talk to someone who could benefit from a book recommendation, I dig through my visual and text-based notes.</p>
<p><strong>Next steps</strong></p>
<p>“Better” isn’t about reading more books – it’s about being able to apply, organize, and share what I’m learning from those books. I want to learn more about doing good research: identifying a topic to explore, synthesizing insights from multiple sources, and adding personal experiences or ideas. The process might look like this:</p>
<ul>
<li>Outline a topic for research</li>
<li>Search the library catalogue for resources; also check bibliographies, Amazon, and other recommendations </li>
<li>File properly-cited notes so that I can give credit later on</li>
<li>Compare and organize ideas from different sources</li>
<li>Test ideas in small experiments</li>
<li>Write blog posts, then articles, then e-books</li>
</ul>
<p>Visual book reviews are another way for me to grow. In addition to making visual book reviews of interesting new releases, I’d like to revisit the books that were a big influence on me in order to make visual reviews of them too.</p>
<p>Yay for Quantified Self and tracking. Onward!</p>
<p>(Also, if you’re curious about tracking your own library use: I can probably extend Quantified Awesome to support other libraries with online interfaces, but you’re going to need to walk me through how your library works.) </p>
<p><a name="bookpreso"></a><br>
<em>Update from August 22, 2013</em>: Here&#8217;s a presentation I&#8217;m putting together for <a href="http://quantifiedself.ca">Quantified Self Toronto</a>.<br>
<iframe loading="lazy" src="http://www.slideshare.net/slideshow/embed_code/25494434" width="476" height="400" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe></p>

<p>You can <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2013%2F08%2Fquantified-awesome-analyzing-my-non-fiction-reading-and-why-i-dont-mind-paying-taxes%2F&body=Name%20you%20want%20to%20be%20credited%20by%20(if%20any)%3A%20%0AMessage%3A%20%0ACan%20I%20share%20your%20comment%20so%20other%20people%20can%20learn%20from%20it%3F%20Yes%2FNo%0A">e-mail me at sacha@sachachua.com</a>.</p>]]></description>
		</item><item>
		<title>Sketchnotes: Sal Sloan of Fetching! at the Toronto Public Library: Small Business Networking Event</title>
		<link>https://sachachua.com/blog/2012/03/sal-sloan-of-fetching-at-the-toronto-public-library-small-business-networking-event/</link>
		<dc:creator><![CDATA[Sacha Chua]]></dc:creator>
		<pubDate>Wed, 14 Mar 2012 01:53:11 GMT</pubDate>
    <category>business</category>
<category>connecting</category>
<category>delegation</category>
<category>entrepreneurship</category>
<category>sketchnotes</category>
		<guid isPermaLink="false">https://sachachua.com/blog/?p=23217</guid>
		<description><![CDATA[<p><a href="https://sachachua.com/blog/wp-content/uploads/2012/03/fetching-small.png"><img loading="lazy" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="fetching-small" src="https://sachachua.com/blog/wp-content/uploads/2012/03/fetching-small_thumb.png" alt="fetching-small" width="580" height="448" border="0"></a></p>
<p>(Click on the image to see the larger version)</p>
<p>The Toronto Public Library hosts monthly networking events for people who are interested in starting a small business. Most people have not yet started a business. It’s a good opportunity to ask questions and learn from someone who has figured some things out.</p>
<p>Sal Sloan came up with the business idea for <a href="http://fetching.ca/">Fetching!</a> when she got a dog. She had signed up for a fitness bootcamp, and the combination of exercising herself <em>and</em> walking her dog wore her out. Why not combine the two activities – help people exercise with their dogs? With a $10,000 loan from her parents, Sal started Fetching! by focusing on exercise for people and obedience training for dogs. With early success, Sal broadened her scope to focusing on helping people have active fun with their pets. She has been doing the business for two and a half years, and continues to work part-time on another job. This helps her grow the business organically by avoiding financial pressures.</p>
<p>One of the lessons I took away from the conversation was the power of delegating work to other people. Sal knew that other personal trainers could run sessions much better than she could, so she hired good people whom she could trust to represent her company. She’s looking for someone who can help her with the business side so that she can grow more, too. After I bank some money from this consulting engagement, I might start my <a href="https://sachachua.com/blog/category/delegation">delegation experiments</a> again.</p>
<p>The session was an interesting contrast to <a href="https://sachachua.com/blog/2012/02/sketchnotes-small-business-network-meetup-with-kristina-chau-at-the-toronto-reference-library/">last month’s meetup</a> with Kristina Chau of notyouraverageparty, who had been in business for three years and who was struggling to scale up beyond herself. Sal has clearly put work into figuring out how to scale up, and it’s great to see how it paid off.</p>

<p>You can <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2012%2F03%2Fsal-sloan-of-fetching-at-the-toronto-public-library-small-business-networking-event%2F&body=Name%20you%20want%20to%20be%20credited%20by%20(if%20any)%3A%20%0AMessage%3A%20%0ACan%20I%20share%20your%20comment%20so%20other%20people%20can%20learn%20from%20it%3F%20Yes%2FNo%0A">e-mail me at sacha@sachachua.com</a>.</p>]]></description>
		</item><item>
		<title>Library shortcuts</title>
		<link>https://sachachua.com/blog/2008/12/library-shortcuts/</link>
		<dc:creator><![CDATA[Sacha Chua]]></dc:creator>
		<pubDate>Mon, 08 Dec 2008 02:34:05 GMT</pubDate>
    <category>library</category>
		<guid isPermaLink="false">https://sachachua.com/blog/?p=5401</guid>
		<description><![CDATA[<p><strong>Matt Price</strong> e-mailed me about this wonderful piece of wizardry he added to <a href="http://yubnub.org">YubNub</a> (which is kinda like a command line for the Web). He set up the <a href="http://yubnub.org/kernel/man?args=tpl">tpl</a> command, which searches the Toronto Public Library. This prompted me to finally make YubNub the default handler for my Mozilla Firefox address bar, which you can also do by going to <strong>about:config</strong> and setting or creating the <strong>keyword.URL</strong> option to <strong>http://yubnub.org/parser/parse?command=</strong></p>
<p>This is good stuff, and one of the many reasons why blogging saves me time and lets me hear about all sorts of interesting things. =) Matt, thanks for sharing!</p>

<p>You can <a href="https://sachachua.com/blog/2008/12/library-shortcuts/#comment">view 5 comments</a> or <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2008%2F12%2Flibrary-shortcuts%2F&body=Name%20you%20want%20to%20be%20credited%20by%20(if%20any)%3A%20%0AMessage%3A%20%0ACan%20I%20share%20your%20comment%20so%20other%20people%20can%20learn%20from%20it%3F%20Yes%2FNo%0A">e-mail me at sacha@sachachua.com</a>.</p>]]></description>
		</item>
	</channel>
</rss>