<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/assets/atom.xsl" type="text/xsl"?><feed
	xmlns="http://www.w3.org/2005/Atom"
	xmlns:thr="http://purl.org/syndication/thread/1.0"
	xml:lang="en-US"
	><title>Sacha Chua - tag - perl</title>
	<subtitle>Emacs, sketches, and life</subtitle>
	<link rel="self" type="application/atom+xml" href="https://sachachua.com/blog/tag/perl/feed/atom/index.xml" />
  <link rel="alternate" type="text/html" href="https://sachachua.com/blog/tag/perl" />
  <id>https://sachachua.com/blog/tag/perl/feed/atom/index.xml</id>
  <generator uri="https://11ty.dev">11ty</generator>
	<updated>2015-10-16T18:57:00Z</updated>
<entry>
		<title type="html">Wow, literate devops with Emacs and Org does actually work on Windows</title>
		<link rel="alternate" type="text/html" href="https://sachachua.com/blog/2015/10/wow-literate-devops-with-emacs-and-org-does-actually-work-on-windows/"/>
		<author><name><![CDATA[Sacha Chua]]></name></author>
		<updated>2015-10-16T22:58:05Z</updated>
    <published>2015-10-16T18:57:00Z</published>
    <category term="emacs" />
<category term="org" />
		<id>https://sachachua.com/blog/?p=28428</id>
		<content type="html"><![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>]]></content>
		</entry><entry>
		<title type="html">Sketchnote: Fun With Dead Languages: Damian Conway</title>
		<link rel="alternate" type="text/html" href="https://sachachua.com/blog/2013/08/sketchnote-fun-with-dead-languages-damian-conway/"/>
		<author><name><![CDATA[Sacha Chua]]></name></author>
		<updated>2013-08-07T06:11:39Z</updated>
    <published>2013-08-07T01:22:11Z</published>
    <category term="geek" />
<category term="sketchnotes" />
		<id>https://sachachua.com/blog/?p=25710</id>
		<content type="html"><![CDATA[<p>Here are my notes from Damian Conway’s talk “Fun With Dead Languages”. =) I heard him give an older version of this talk years ago, and I’m amused to find that my Latin dabbling gave me a much deeper appreciation of this talk. </p>
<p>As always, click on the image to view a larger version, which you can print out if you want.</p>
<p><a href="https://sachachua.com/blog/wp-content/uploads/2013/08/20130806-Fun-with-Dead-Languages-Damian-Conway1.png"><img loading="lazy" title="20130806 Fun with Dead Languages - Damian Conway" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="20130806 Fun with Dead Languages - Damian Conway" src="https://sachachua.com/blog/wp-content/uploads/2013/08/20130806-Fun-with-Dead-Languages-Damian-Conway_thumb1.png" width="640" height="480"></a></p>
<p>Please feel free to share this under the Creative Commons Attribution License! =)</p>
<p>If you like this, check out <a href="http://damian.conway.org/">Damian Conway’s site</a> or this paper on <a href="http://www.csse.monash.edu.au/~damian/papers/HTML/Perligata.html">Lingua::Latina::Perligata</a>. Like these sketches? Check out my other <a href="https://sachachua.com/blog/category/sketchnotes">sketchnotes</a> and <a href="https://sachachua.com/blog/category/visual-book-notes">visual book reviews</a>.</p>
<p>You can <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2013%2F08%2Fsketchnote-fun-with-dead-languages-damian-conway%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>]]></content>
		</entry>
</feed>