<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Marc Liberatore</title>
    <link>http://people.cs.umass.edu/~liberato/home/</link>
      <atom:link href="http://people.cs.umass.edu/~liberato/home/index.xml" rel="self" type="application/rss+xml" />
    <description>Marc Liberatore</description>
    <generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Mon, 24 Oct 2022 00:00:00 +0000</lastBuildDate>
    <image>
      <url>http://people.cs.umass.edu/~liberato/home/media/icon_hu6e46c0b66a1036eabfd1f12dbe94ae95_1124_512x512_fill_lanczos_center_3.png</url>
      <title>Marc Liberatore</title>
      <link>http://people.cs.umass.edu/~liberato/home/</link>
    </image>
    
    <item>
      <title>Don&#39;t make me tap the sign</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2026-04-20-dont-make-me-tap/</link>
      <pubDate>Thu, 16 Apr 2026 09:00:00 -0500</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2026-04-20-dont-make-me-tap/</guid>
      <description>&lt;p&gt;Believe what you will about the utility of LLMs, and whether they produce useful output or not. But now that they exist, every system that is or was regulated in some way by the production of a legible signal of human effort (problem sets, letters of reference, essays, govenment filings, lawsuits, and on and on) will break, to varying degrees.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Received the Faculty Distinguished Teaching Award</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2026-04-16-received-dta/</link>
      <pubDate>Thu, 16 Apr 2026 09:00:00 -0500</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2026-04-16-received-dta/</guid>
      <description>&lt;p&gt;I am honored to learn I have been &lt;a href=&#34;https://www.umass.edu/news/article/2025-26-faculty-distinguished-teaching-award-winners-announced&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;named a recipient&lt;/a&gt; of the 2025-26 &lt;a href=&#34;https://www.umass.edu/ctl/grants-awards/distinguished-teaching-award-dta&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Distinguished Teaching Award&lt;/a&gt;, which honors exemplary teaching at UMass Amherst.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Not admitting graduate students or hiring assistants/staff in AY25-26</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2025-05-05-not-admitting/</link>
      <pubDate>Mon, 05 May 2025 12:00:00 -0500</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2025-05-05-not-admitting/</guid>
      <description>&lt;p&gt;I am not able to admit graduate students (MS or MS/PhD or PhD) or hire assistants (TAs/RAs) or other positions (graders, engineers, interns, etc.). Nor am I taking on new advisees or planning to do so in the forseeable future. Please don&amp;rsquo;t solicit me on these topics, as unfortunately I will not be able to help you.&lt;/p&gt;
&lt;p&gt;Terminal MS students in CICS should also note that the College generally bars them from receiving assistantships anywhere on campus (not just within CICS). See the &lt;a href=&#34;https://www.cics.umass.edu/academics/academic-policies/graduate-programs-policies/ms-degree-requirements&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;last section, &amp;ldquo;Campus Employment,&amp;rdquo; of our MS requirements page&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Using Thunderbird (SMTP/IMAP) with Microsoft Exchange 365 and Modern Authentication at UMass Amherst</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2022-02-01-using-thunderbird/</link>
      <pubDate>Tue, 01 Feb 2022 12:00:00 -0500</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2022-02-01-using-thunderbird/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Update 2022-08-04:&lt;/strong&gt; I&amp;rsquo;m told that UMass changed its Azure authentication policy in late June, and Thunderbird now once again works out-of-the-box with UMass&amp;rsquo;s Office 365 mail service.&lt;/p&gt;
&lt;p&gt;UMass recently upgraded many of its systems to use OAuth2 and two-factor authentication aka &amp;ldquo;modern authentication&amp;rdquo; (without allowing fallback to username/password only, aka &amp;ldquo;legacy authentication&amp;rdquo;). As a security nerd, I applaud this move! But it does mean that Thunderbird die-hards in units who use Microsoft Exchange 365 as their mail server, things don&amp;rsquo;t &amp;ldquo;Just Work&amp;rdquo; anymore. IMAP (that is, reading mail) still works, but SMTP (sending mail) does not.&lt;/p&gt;
&lt;p&gt;Campus IT doesn&amp;rsquo;t support Thunderbird, but a friend of mine was able to get Thunderbird working. She kindly agreed to write up her experiences. If you are a kindred spirit, perhaps this will be of help!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Dear Fellow Thunderbird Die-Hards,&lt;/p&gt;
&lt;p&gt;If you are a Thunderbird user who hates the thought of being forced to spend half your working day dealing with Microsoft Exchange, you are not alone!&lt;/p&gt;
&lt;p&gt;And if you are going nuts because you haven’t yet figured out how to keep using Thunderbird following your department’s conversion to Microsoft Exchange and the (more recent) rigorous enforcement of dual-authentication, read on!&lt;/p&gt;
&lt;p&gt;(Note before going further: I use Linux, so it’s possible things may look a little different for you if you use some other operating system.)&lt;/p&gt;
&lt;p&gt;When Thunderbird suddenly stopped working a couple weeks ago, I poked around and learned that UMass was now using an authentication method known as &amp;ldquo;OAuth2&amp;rdquo; (dual authentication). I fussed with the Thunderbird account settings, changing the authentication method to OAuth2 under Account Settings: Server settings. This seemed to do the trick for incoming mail, but no amount of changing the outgoing server (SMTP) settings made it possible for me to send mail using my UMass account.&lt;/p&gt;
&lt;p&gt;Out of desperation, I created a new personal email address and started sending mail from that, but Outlook decided to treat those emails as junk, so UMass colleagues typically weren’t getting my messages. (I’m not quite paranoid enough to believe this was retaliation from Microsoft AI for trying to get around it. Almost, but not quite.)&lt;/p&gt;
&lt;p&gt;Then my excellent friend and MSP Co-President Marc Liberatore tipped me off about Exquilla. You have to pay for it, but it’s only around $11 per year. I quickly decided I didn’t mind paying people a bit to help me keep using Thunderbird.&lt;/p&gt;
&lt;p&gt;To get Exquilla working for me, here’s what I did:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;I updated Thunderbird to the most recent release (91.5.0).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I paid the people at Exquilla (&lt;a href=&#34;https://www.exquilla.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.exquilla.com/&lt;/a&gt;) by giving them my name, email address (I used my regular UMass address in both the &amp;ldquo;Email address&amp;rdquo; and &amp;ldquo;Exchange email&amp;rdquo; fields), and credit card info. I then got a confirmation email saying that I had paid and that it should work automatically without my needing to do anything further. I hope that’s true for you, but it wasn’t for me&amp;hellip;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In Thunderbird, I opened &amp;ldquo;Add-ons and Themes&amp;rdquo; in the hamburger menu (top right). Under Extensions, I enabled Exquilla for Exchange.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I clicked on the wrench icon.&lt;/li&gt;
&lt;li&gt;I clicked &amp;ldquo;Add new account manually.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;I entered my regular UMass username and password and clicked &amp;ldquo;Next.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Then came a very frustrating period where I couldn’t get it to work. This is where it needs the Exchange Web Services (EWS) URL. There’s an option to have it auto-detect, but it kept failing. There’s also an option to type it in manually, so I hunted around the UMass website and found one document that listed the EWS URL as &lt;a href=&#34;https://exchange.umass.edu/ews/exchange.asmx&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://exchange.umass.edu/ews/exchange.asmx&lt;/a&gt;. This was actually the same as the URL it was finding when it auto-detected, and it kept failing here as well. I just kept trying and then it finally worked (I’m pretty sure it worked while auto-detecting, but either way should be the same). I wish I could tell you what changed, but I can’t—I just hope it’s smoother for you! (Note: at some point in the process, it did run through the duo-authentication, including calling my phone. I can’t remember when that was, but I do remember that it still didn’t install properly at that point. It kept failing for a bit before finally the whole thing suddenly came together, for what reason I do not know.)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Even after that, I was still having some trouble sending mail: it would send, but it would hang at the point where it was supposed to &amp;ldquo;assemble&amp;rdquo; the message and save it to my sent folder. What I finally determined is that the new system is simply not going to let me save my sent messages directly to a local folder as I used to do. Under Account Settings: Copies &amp;amp; Folders, make sure it’s set to save in the folder &amp;ldquo;Sent on &lt;a href=&#34;mailto:username@umass.edu&#34;&gt;username@umass.edu&lt;/a&gt; on outlook.office365.com.&amp;rdquo;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Also, notice that in addition to your regular account(s) and local folders in the left panel, if you scroll all the way down that panel you should see a new account, which is &amp;ldquo;&lt;a href=&#34;mailto:username@umass.edu&#34;&gt;username@umass.edu&lt;/a&gt; on outlook.office365.com.&amp;rdquo; I made sure the settings under Account Settings: Copies and Folders were correct there as well. Under that account, you’ll see a &amp;ldquo;Sent items&amp;rdquo; folder, which is where you can find copies of emails that you’ve sent. I just periodically go and scoop those up and move them to the local folder where I like to keep them—it doesn’t seem to mind my doing that, but it did object (i.e., failed to work) when I tried to set it to put them there automatically.&lt;/p&gt;
&lt;p&gt;Otherwise, I don’t actually do anything with the new account (except deal with the junk folder—hooray! I no longer have to log in to Outlook to sort junk!). I continue to use the inbox for the account I originally had at the top of the left panel, and it works just fine for incoming and outgoing.&lt;/p&gt;
&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;You might also try this web page (&lt;a href=&#34;https://exquilla.zendesk.com/hc/en-us/articles/212909826-Configuring-the-outgoing-server&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://exquilla.zendesk.com/hc/en-us/articles/212909826-Configuring-the-outgoing-server&lt;/a&gt;) if you’re having trouble sending mail—it was one of several things I consulted, and it may have helped, though I’m not sure.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In sum, don’t give up! And good luck!&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Statistical Detection of Downloaders in Freenet</title>
      <link>http://people.cs.umass.edu/~liberato/home/publication/statistical-detection-of-downloaders-in-freenet-journal/</link>
      <pubDate>Mon, 09 Nov 2020 00:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/publication/statistical-detection-of-downloaders-in-freenet-journal/</guid>
      <description></description>
    </item>
    
    <item>
      <title>Answers for Prospective Undergraduates</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2020-10-12-answers-for-prospective-undergraduates/</link>
      <pubDate>Mon, 12 Oct 2020 09:41:18 -0400</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2020-10-12-answers-for-prospective-undergraduates/</guid>
      <description>&lt;p&gt;Every fall I get emails from prospective undergraduates asking questions about UMass and our programs in CICS.&lt;/p&gt;
&lt;p&gt;These questions and requests are usually one or more of the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;How would you rate the X at UMass, where X is one or more of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;undergraduate life&lt;/li&gt;
&lt;li&gt;the undergraduate CS program&lt;/li&gt;
&lt;li&gt;the faculty in CS&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tell me why I should I choose UMass over other schools.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Will I get to take a class with a particular professor?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Will I get a top internship/job placement?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Will I get to do undergraduate research?&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This post is a collection of my thoughts on these topics.&lt;/p&gt;
&lt;p&gt;(In particular, it is not a reflection of UMass&amp;rsquo;s or CICS&amp;rsquo;s official positions on these questions, which you can learn more about &lt;a href=&#34;https://www.umass.edu/admissions/undergraduate-admissions/explore/points-pride&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;here&lt;/a&gt; and &lt;a href=&#34;https://www.cics.umass.edu/vision-mission-values&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;here&lt;/a&gt;, respectively.)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rate undergraduate life at UMass.&lt;/strong&gt; I dunno, it seems fine? Students in my classes seem to like it, for the most part. You&amp;rsquo;re asking an old man this question! It was fine when I was an undergraduate here &lt;em&gt;more than 20 years ago&lt;/em&gt; but things are different now.&lt;/p&gt;
&lt;p&gt;The factual stuff I can tell you is more about buildings than student life. Like many schools, over the last 10-15 years UMass has spent a bunch of money upgrading facilities that are student-facing. The food is fantastic. The new rec center is mostly great (&lt;s&gt;only three power racks? what the actual eff?&lt;/s&gt; Update 2022: They added more racks!). Newer classrooms are like spaceships. The new dorms have %&amp;amp;*#ing air conditioning! There is wireless (for better or for worse) basically everywhere. This is all great, and way better than the clown show that was going on back in the mid-90s, when we were reduced to stringing ethernet between dorm windows or putting up with whacko 19.2 digital modems.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rate the undergraduate CS program at UMass.&lt;/strong&gt; Mostly good, though of course the classes I teach are &lt;em&gt;particularly amazeballs&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;More seriously: Like the programs at most larger schools, there&amp;rsquo;s some lag in the curriculum&amp;rsquo;s adaptation to what is currently hot in CS, but there&amp;rsquo;s reasonably good coverage of most students&amp;rsquo; areas of interest in upper-level electives, and that&amp;rsquo;s something you might not get at a smaller liberal-arts school.&lt;/p&gt;
&lt;p&gt;One reason to pick a larger school like UMass over a school with a smaller CS program is the depth and breadth of course offerings available. The other side of this tradeoff is that generally the enrollment in CS courses is much higher at a school like UMass, so you&amp;rsquo;ll get less individual faculty attention than you might at a smaller school.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rate the CS faculty.&lt;/strong&gt; You&amp;rsquo;re asking me to judge my colleagues publicly. Come on. Go look at US News and World Report, or RateMyProfessor, or whatever.&lt;/p&gt;
&lt;p&gt;More candidly: Just like anywhere, there are people with different strengths, weaknesses, and areas where they choose to focus their energy. The administration is definitely cognizant of these factors, and generally does a good job of matching faculty interest and teaching skills with appropriate classes.&lt;/p&gt;
&lt;p&gt;For tenure-line faculty, there can be a real tension when allocating time between teaching and research, though many bring their research into the classroom and students really benefit from it.&lt;/p&gt;
&lt;p&gt;UMass is somewhat unusual among our peer institutions in that we don&amp;rsquo;t have &amp;ldquo;disposable adjuncts&amp;rdquo; &amp;ndash; poorly treated faculty who are hired on a contingent basis. Instead we have &amp;ldquo;lecturers,&amp;rdquo; faculty who focus their energy on teaching and who have competitive pay and job security. (At some schools they have the title &amp;ldquo;Teaching Professor,&amp;rdquo; though for various legal reasons we don&amp;rsquo;t do that here, yet.) Many of our introductory CS courses are taught by teaching faculty, people who are specifically interested in the teaching of undergraduate CS courses. As such, they tend to be higher quality than you might expect from naively looking at the numbers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why should I choose UMass?&lt;/strong&gt; There&amp;rsquo;s a lot packed into this question.&lt;/p&gt;
&lt;p&gt;First, you should know that like all reasonably-ranked CS programs, UMass&amp;rsquo;s is overrun by applicants. High-schoolers applying, transfer students from other colleges, and internal applicants to the major &amp;ndash; in all of these areas, there has been and continues to be more applicants than we generally have seats for.&lt;/p&gt;
&lt;p&gt;Here at UMass we&amp;rsquo;re doing everything we can to expand our capacity, as we take our role as a public university providing access to all seriously. But it remains the case that no-one here or at a comparable program is likely to spend significant amounts of their time wooing you to choose them or explaining why they stand out from the crowd. This is especially true if you&amp;rsquo;re even asking this question. A particular &lt;em&gt;University&lt;/em&gt; might do so (especially if you&amp;rsquo;re from out-of-state and willing to pay full tuition), but that&amp;rsquo;s a different story and above my pay grade.&lt;/p&gt;
&lt;p&gt;Speaking of that: If you just have a generic interest in CS and/or programming, then UMass is a great deal &amp;ndash; for in-state students. If you are from out-of-state, then it&amp;rsquo;s a less compelling value proposition. Your own state school is likely fine, and in some cases ranked competitively or above UMass. Lookin&amp;rsquo; at you, UIUC, UC-B, etc.&lt;/p&gt;
&lt;p&gt;If there&amp;rsquo;s something &lt;em&gt;specific&lt;/em&gt; to the UMass program you&amp;rsquo;re interested in, that may change the calculus somewhat and induce you to come here from out-of-state. For example, if you want access to faculty and classes in areas where our faculty are well-known, or if you want to join our Informatics program, or if you&amp;rsquo;re an international student looking to come to the US, or if your own state school doesn&amp;rsquo;t accept you because it&amp;rsquo;s too exclusive, etc. Lookin&amp;rsquo; at you, UC-B, etc.&lt;/p&gt;
&lt;p&gt;Why would you choose UMass over a liberal arts college? Because you want the breadth and depth we (or any large, world-class university) can offer, not just in CS but in many academic areas. The other side of this tradeoff, though, is that you&amp;rsquo;re unlikely to get the individual faculty attention that is a selling point at most smaller colleges. Another reason to choose a large University is that things change! You might discover that what you really enjoy about CS is the mathematical aspect, and want to change majors to Mathematical Computing. Or, you might discover a passion for medieval English literature, or comparative political science, or epidemiology, or biostatistics, or who knows what else. A large school can give you the opportunity to pursue any of these interests in a way that a small school cannot.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Will I get to take a class with a particular professor?&lt;/strong&gt; Hard to know the future! Check the &lt;a href=&#34;https://www.cics.umass.edu/academics/courses&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;teaching schedule&lt;/a&gt; for what they&amp;rsquo;ve done historically. You can also write to them and ask if they expect to be teaching the course you&amp;rsquo;re interested in some particular future year. It&amp;rsquo;s unlikely they&amp;rsquo;ll be certain, but they can at least let you know if they&amp;rsquo;re planning to be on sabbatical or the like that year.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Will I get a top internship/job placement?&lt;/strong&gt; Hard to know the future! Many of our students get placed in great spots. We have an entire staff who work with students on job preparation and the like. Learn more at &lt;a href=&#34;https://www.cics.umass.edu/careers&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;CICS Careers&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Will I get to do undergraduate research?&lt;/strong&gt; (Often paired with &amp;ldquo;can I get into a top graduate school after completing UMass&amp;rsquo;s program?&amp;rdquo;) Maybe!&lt;/p&gt;
&lt;p&gt;Some faculty love working with undergraduates and have or make the time to do so. This is often but not always done through the &lt;a href=&#34;https://www.umass.edu/honors/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Honors College&amp;rsquo;s&lt;/a&gt; various programs that encourage undergraduate research.&lt;/p&gt;
&lt;p&gt;But in the interests of full disclosure, faculty in &amp;ldquo;hot&amp;rdquo; areas are generally overrun with students asking to work with them, and tenure-line faculty in particular need to optimize their time usage for getting tenure as much as possible. Generally, this means working with graduate students, not undergraduates. But, some faculty who generally don&amp;rsquo;t work with undergrads directly still have lab setups where grad students work with undergrads. And these same hot areas tend to have associated student clubs that provide a structured way to dive into a subject area outside of classes and direct faculty interaction.&lt;/p&gt;
&lt;p&gt;In terms of graduate school, assuming you&amp;rsquo;re talking about a PhD program, one of the best things you can do is work with someone &amp;ndash; ideally a faculty member or senior graduate student &amp;ndash; on a research project and to make a meaningful contribution to it. Their letter in support of your application will be worth far more than a good transcript and/or generic letter of support from your undergraduate advisor. (MS programs tend to be easier to get into; for most students, good grades from a reasonable undergraduate institution are typically enough.)&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>A Gentle Graphical Introduction to Recursion</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2019-10-07-a-graphical-introduction-to-recursion/</link>
      <pubDate>Mon, 07 Oct 2019 10:10:00 -0400</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2019-10-07-a-graphical-introduction-to-recursion/</guid>
      <description>&lt;p&gt;These are notes from an in-class exercise on recursion I did in a First Year Seminar. The basic idea is an old one: to draw a tree recursively.&lt;/p&gt;
&lt;p&gt;(This particular exercise is directly inspired by a talk Dan Garcia gave at a recent SIGCSE about part of their CS 10 (CS Principles) class, The Beauty and Joy of Computing.)&lt;/p&gt;
&lt;h2 id=&#34;recursion-and-fractals&#34;&gt;Recursion and fractals&lt;/h2&gt;
&lt;p&gt;Many things can be expressed &amp;ldquo;recursively&amp;rdquo; that is, partly or wholly in terms of themselves. This is usually where your CS teacher immediately brings up factorial. BUT I WILL MANFULLY RESTRAIN MYSELF!&lt;/p&gt;
&lt;p&gt;Instead, I&amp;rsquo;ll point out two things to get us started:&lt;/p&gt;
&lt;p&gt;First, that recursion is a beautiful, simple (though maybe not easy) way to think about computation. The dual of the Turing machine is the lambda calculus, and it&amp;rsquo;s elegantly powered by recursion.&lt;/p&gt;
&lt;p&gt;Second, that recursion is all around us in nature, in the form of fractals, which when used colloquially means &amp;ldquo;things that are similar to themselves over extended, but finite, scales.&amp;rdquo; (Show some examples from Wikipedia.)&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re going to explore the concept of recursion graphically today, rather than with factorials and Fibonacci and the like. Well, I will probably do a little bit of factorial stuff at the end, but only because I&amp;rsquo;m contractually required.&lt;/p&gt;
&lt;h2 id=&#34;getting-started&#34;&gt;Getting started&lt;/h2&gt;
&lt;p&gt;So, we&amp;rsquo;re going to learn to draw beautiful trees that look like this (slides).&lt;/p&gt;
&lt;p&gt;But we&amp;rsquo;ll start with something simpler).&lt;/p&gt;
&lt;p&gt;The important thing to see is that this tree is self-similar; in other words, it&amp;rsquo;s fractal: each part contains smaller versions of itself. (on board)&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re going to draw this in Processing. But first, some preliminaries.&lt;/p&gt;
&lt;h2 id=&#34;setting-up-processing&#34;&gt;Setting up processing&lt;/h2&gt;
&lt;p&gt;Processing lets you do pretty arbitrary things (it&amp;rsquo;s Java, after all). We&amp;rsquo;re going to tame the complexity somewhat by doing &amp;ldquo;turtle graphics&amp;rdquo; aka &amp;ldquo;pen graphics.&amp;rdquo; In other words, we&amp;rsquo;re going to draw everything in terms of pen. The pen has three pieces of state: X, Y, and direction. This is similar to a turtle with a pen attached crawling around on a piece of paper, or my hand on the board, sorta.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;penX&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;penY&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;penDirection&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;OK. So far, so nothing. Let&amp;rsquo;s set up the sketching area:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;setup&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;600&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;600&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;penX&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;width&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;penY&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;height&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;background&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;255&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;noLoop&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Line by line, what&amp;rsquo;s happening here?&lt;/p&gt;
&lt;p&gt;&lt;code&gt;size(600, 600);&lt;/code&gt; creates a viewable (x, y) rectangle to draw on &amp;ndash; it&amp;rsquo;s the sketch, in Processing lingo. The x coordinates increase left to right, and the y coordinates increase top to bottom. This is the opposite of algebra y-axes! But it is common in graphics.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;penX = width / 2;&lt;/code&gt; and the following line center the pen on the x/y coordinates.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;background(255);&lt;/code&gt; sets the entire background to white. If you pass a value on the range 0&amp;hellip;255 as a color, Processing interprets it as a shade of grey (0 = black, 255 = white).&lt;/p&gt;
&lt;p&gt;&lt;code&gt;noLoop();&lt;/code&gt; tells Processing that once we start to draw, call draw() only one time; otherwise (by default) it is called repeatedly in an endless loop.&lt;/p&gt;
&lt;p&gt;Now, let&amp;rsquo;s teach processing how to move the pen:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;move&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;amount&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;newX&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;penX&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;radians&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;penDirection&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;amount&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;newY&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;penY&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cos&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;radians&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;penDirection&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;amount&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;line&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;penX&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;penY&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;newX&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;newY&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;penX&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;newX&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;penY&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;newY&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is a three-step process. First we have to compute where we&amp;rsquo;re going, on the basis of where we are. We use trig to figure out how far away in the x and y directions we need to go (remember, y is flipped, hence the minus). We draw a line from the pen&amp;rsquo;s current location to its new location. Then we update the pen&amp;rsquo;s location.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s test it out in a &lt;code&gt;draw()&lt;/code&gt; method:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;draw&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;move&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;50&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;OK, that works. What about if we want to turn?&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;turn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;degrees&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;penDirection&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;degrees&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;draw&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;move&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;50&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;turn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;90&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;move&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;50&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;turn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;90&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;move&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;50&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;turn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;90&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;move&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;50&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;turn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;90&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Great. How about a random walk?&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;draw&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;turn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;random&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;360&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stroke&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;random&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;255&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;random&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;255&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;random&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;255&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// random pen color each time, RGB when you pass three values&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;move&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;random&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;20&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And how about we use the mouse to turn it on and off?&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;mousePressed&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;loop&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;mouseReleased&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;noLoop&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;OK, now we&amp;rsquo;re cooking!&lt;/p&gt;
&lt;h2 id=&#34;drawing-a-tree&#34;&gt;Drawing a tree&lt;/h2&gt;
&lt;p&gt;So, back to our drawing: notice that each tree is made up of smaller trees. We&amp;rsquo;re going to write a &lt;code&gt;tree&lt;/code&gt; method that draws a tree? It&amp;rsquo;ll start with a &lt;code&gt;move()&lt;/code&gt; call to draw the trunk, then it will turn left, draw the smaller tree, turn right, draw the smaller true, and go back to where it started.&lt;/p&gt;
&lt;p&gt;In other words, It&amp;rsquo;ll start with a &lt;code&gt;move()&lt;/code&gt; call to draw the trunk, then it will turn left, draw the smaller tree &lt;em&gt;using &lt;code&gt;tree()&lt;/code&gt;&lt;/em&gt;, and so on.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Hey dawg, I heard you liked trees inside of your trees, so can you show me how I can use &lt;code&gt;tree()&lt;/code&gt; inside of &lt;code&gt;tree()&lt;/code&gt; to draw a tree?&amp;rdquo; That&amp;rsquo;s today&amp;rsquo;s magic.&lt;/p&gt;
&lt;h3 id=&#34;no-recursion-here&#34;&gt;No recursion here&lt;/h3&gt;
&lt;p&gt;First write &lt;code&gt;tree1&lt;/code&gt;. All it does is draw the trunk by moving forward &lt;code&gt;size&lt;/code&gt; and then backward &lt;code&gt;size&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;tree1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;move&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;move&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Make sure it works:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;draw&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tree1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;100&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Maybe also move the root of the tree down a bit:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// in setup()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;penY&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;height&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;9&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, let&amp;rsquo;s draw a two-level tree.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;tree2a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;move&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;turn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;15&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;move&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;75&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;move&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;75&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;turn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;30&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;move&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;75&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;move&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;75&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;turn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;15&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;move&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;At this rate, it&amp;rsquo;s gonna take a lot of code to draw a beautiful tree. Don&amp;rsquo;t worry, though, we&amp;rsquo;ll get better.&lt;/p&gt;
&lt;p&gt;Does everyone understand what&amp;rsquo;s happening above? (Trace through on board.)&lt;/p&gt;
&lt;h3 id=&#34;more-levels&#34;&gt;More levels&lt;/h3&gt;
&lt;p&gt;OK, let&amp;rsquo;s simplify a bit. Do you see that &lt;code&gt;tree2a&lt;/code&gt; contains &lt;code&gt;tree1&lt;/code&gt; if you stop and squint at it a bit? Let&amp;rsquo;s rewrite it to use &lt;code&gt;tree1&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;tree2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;move&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;turn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;15&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tree1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;75&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;turn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;30&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tree1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;75&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;turn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;15&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;move&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, I want you to write a &lt;code&gt;tree3&lt;/code&gt; that uses &lt;code&gt;tree2&lt;/code&gt;. It should &lt;em&gt;not&lt;/em&gt; use &lt;code&gt;tree1&lt;/code&gt;. (Hint: it looks almost exactly like &lt;code&gt;tree2&lt;/code&gt;; copy/paste and change three characters).&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;tree3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;move&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;turn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;15&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tree2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;75&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;turn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;30&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tree2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;75&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;turn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;15&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;move&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;How would &lt;code&gt;tree4&lt;/code&gt; look? Exactly the same, except it would call &lt;code&gt;tree3&lt;/code&gt;. So, here&amp;rsquo;s the big idea: we can write a &lt;code&gt;tree&lt;/code&gt; method that &lt;em&gt;uses itself&lt;/em&gt; to draw a tree, so long as it knows how many levels it&amp;rsquo;s expected to draw.&lt;/p&gt;
&lt;h3 id=&#34;a-recursive-tree&#34;&gt;A Recursive &lt;code&gt;tree&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;tree&lt;/code&gt; will need a &lt;code&gt;levels&lt;/code&gt; parameter in addition to size:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;tree&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;levels&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;move&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;turn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;15&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tree&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;levels&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;75&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;turn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;30&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tree&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;levels&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;75&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;turn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;15&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;move&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;What happens when we run this in our &lt;code&gt;draw()&lt;/code&gt; method?&lt;/p&gt;
&lt;p&gt;As Processing helpfully explains, there&amp;rsquo;s a problem with our &lt;em&gt;recursion&lt;/em&gt;. Let&amp;rsquo;s think about what&amp;rsquo;s going on. (on board, trace operation with levels = 2)&lt;/p&gt;
&lt;p&gt;The problem is that the methods we wrote before aren&amp;rsquo;t all exactly the same: &lt;code&gt;tree1&lt;/code&gt; in particular just drew a trunk, and no branches. So, we need a special &lt;em&gt;case&lt;/em&gt; to handle this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;tree&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;levels&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;levels&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;move&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;move&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;move&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;turn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;15&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tree&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;levels&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;75&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;turn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;30&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tree&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;levels&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;75&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;turn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;15&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;move&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And now it works. Let&amp;rsquo;s try a larger levels for a prettier tree. (show 9)&lt;/p&gt;
&lt;p&gt;This general code pattern, with a simple base case that doesn&amp;rsquo;t call the method itself, and a less simple case that does call itself, is typical of recursive code. Let&amp;rsquo;s break it down:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;tree&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;levels&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// the base case; a problem so simple we know how to handle it&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// completely&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;levels&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;move&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;move&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// the recursive case&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// do a small part here, and delegate the rest to somebody else&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// draw the trunk&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;move&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// position the pen for the left sub-tree&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;turn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;15&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// delegate drawing the left sub-tree to someone else&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tree&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;levels&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;75&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// re-position for the right sub-tree&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;turn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;30&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// delegate drawing the right sub-tree to someone else&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tree&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;levels&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;75&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// re-position to go back to the start&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;turn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;15&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// retrace our steps back to where we started&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;move&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Notice that in the recursive case, we are always making progress toward the base case &amp;ndash; here, &lt;code&gt;levels&lt;/code&gt; is guaranteed to be decremented by one each time the method calls itself, so we&amp;rsquo;re guaranteed (mostly) to hit &lt;code&gt;levels == 1&lt;/code&gt; and stop. If we don&amp;rsquo;t do this, the method calls itself indefinitely, and we end up with a &lt;code&gt;StackOverflow&lt;/code&gt; (at least in Java).&lt;/p&gt;
&lt;p&gt;What would happen if we started with &lt;code&gt;levels&lt;/code&gt; &amp;lt; 1?&lt;/p&gt;
&lt;p&gt;Sometimes a recursive program is more elegant if you have a smaller base case. What would a &amp;ldquo;zero level&amp;rdquo; tree mean? Can you rewrite the program to have a base case where &lt;code&gt;levels == 0&lt;/code&gt;?&lt;/p&gt;
&lt;h2 id=&#34;some-questions&#34;&gt;Some questions&lt;/h2&gt;
&lt;p&gt;(slides)&lt;/p&gt;
&lt;h2 id=&#34;an-exercise&#34;&gt;An exercise&lt;/h2&gt;
&lt;p&gt;Try to draw a more &amp;ldquo;beautiful&amp;rdquo; tree. Two things that might help:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;strokeWeight&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;makes the stroke (the ink left by the pen) five pixels wide instead of one.&lt;/p&gt;
&lt;p&gt;And you can change the color by red green blue components. Google has a nice color picker to help.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;stroke&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;75&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;160&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;15&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// kinda greenish&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;other-comments-on-recursion&#34;&gt;Other comments on recursion&lt;/h2&gt;
&lt;p&gt;Of course we can define factorial recursively, too. And write in in Java. And probably you can trivially transform it to its iterative form. There&amp;rsquo;s a deeper truth here, that all recursive algorithms have an iterative equivalent (and vice versa), though the problem of designing the algorithm might yield more easily to one or other. For example, how would you draw a tree of arbitrary depth iteratively? For the supernerds: without a stack?&lt;/p&gt;
&lt;p&gt;And, some other languages make use of recursion and recursive definitions much more natural than Java. For example, here&amp;rsquo;s a snippet of OCaml to computes the factorial:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ocaml&#34; data-lang=&#34;ocaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;rec&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;factorial&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;function&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;factorial&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;print_int&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;factorial&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It&amp;rsquo;s like a direct transcription of the mathematical description!&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Server-side traffic analysis reveals mobile location information over the Internet</title>
      <link>http://people.cs.umass.edu/~liberato/home/publication/server-side-traffic-analysis/</link>
      <pubDate>Thu, 20 Jun 2019 00:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/publication/server-side-traffic-analysis/</guid>
      <description></description>
    </item>
    
    <item>
      <title>College Outstanding Teacher Award</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2019-04-02-college-outstanding-teacher-award/</link>
      <pubDate>Tue, 02 Apr 2019 11:06:11 -0400</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2019-04-02-college-outstanding-teacher-award/</guid>
      <description>&lt;p&gt;I am honored to have been selected to receive the &lt;a href=&#34;https://www.cics.umass.edu/awards-programs#COTA&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;CICS Outstanding Teacher Award&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The College Outstanding Teacher Award (COTA) program was instituted as a complement to the Distinguished Teaching Award and is administered by the Provost&amp;rsquo;s Office and the individual colleges. The purpose of the award is to honor faculty members for their teaching accomplishments at the college level. The awards are given during the spring semester, and recipients are recognized at Undergraduate Commencement.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Forensic Identification of Anonymous Sources in OneSwarm</title>
      <link>http://people.cs.umass.edu/~liberato/home/publication/forensic-identification-of-anonymous-sources/</link>
      <pubDate>Wed, 01 Nov 2017 00:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/publication/forensic-identification-of-anonymous-sources/</guid>
      <description></description>
    </item>
    
    <item>
      <title>Statistical Detection of Downloaders in Freenet</title>
      <link>http://people.cs.umass.edu/~liberato/home/publication/statistical-detection-of-downloaders-in-freenet/</link>
      <pubDate>Thu, 25 May 2017 00:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/publication/statistical-detection-of-downloaders-in-freenet/</guid>
      <description></description>
    </item>
    
    <item>
      <title>Innovation with Scale</title>
      <link>http://people.cs.umass.edu/~liberato/home/publication/innovation-with-scale/</link>
      <pubDate>Sat, 08 Apr 2017 00:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/publication/innovation-with-scale/</guid>
      <description></description>
    </item>
    
    <item>
      <title>Innovation with Scale</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2017-04-06-innovation-with-scale/</link>
      <pubDate>Thu, 06 Apr 2017 09:01:01 -0400</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2017-04-06-innovation-with-scale/</guid>
      <description>&lt;p&gt;The members of teaching faculty in &lt;a href=&#34;https://www.cics.umass.edu/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;CICS&lt;/a&gt; at UMass are going to the College of St. Rose this Saturday, April 8th, to give a panel presentation on Innovation with Scale at &lt;a href=&#34;http://ccscne.org/ccscne-2017/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;CCSCNE 2017&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Being an effective teacher is challenging; to do so when your enrollment doubles or triples can be overwhelming. To teach at scale requires the application of new teaching strategies, techniques, and tools to meet the demands of increasing enrollment. These large classes also present opportunities to innovate, either in terms of pedagogy or via inclusion of technological solutions. Where faculty may have been able to rely on charm and charisma as means of connecting to students, large lectures make connecting to students difficult. Research has shown that learner-centered strategies affect student perceptions of their learning, and that peer-based instruction and mentoring improve student outcomes. Our panel seeks to share a range of adaptations, innovations, and practical strategies for facilitating rich learning experiences for undergraduates in large learning environments.&lt;/p&gt;
&lt;/blockquote&gt;
</description>
    </item>
    
    <item>
      <title>Nominated for a Distinguished Teaching Award</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2016-11-14-nominated-for-a-distinguished-teaching-award/</link>
      <pubDate>Mon, 14 Nov 2016 12:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2016-11-14-nominated-for-a-distinguished-teaching-award/</guid>
      <description>&lt;p&gt;I have been nominated for a 2016&amp;ndash;2017 Distinguished Teaching Award (DTA), a campus-wide student-driven recognition of teaching, for my teaching of &lt;a href=&#34;http://people.cs.umass.edu/~liberato/courses/2016-fall-compsci190d/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;COMPSCI 190D&lt;/a&gt; this semester.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>COMPSCI 190D (Using Data Structures) and 365/590F (Digital Forensics)</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2016-10-24-compsci-190d-and-365-slash-590f/</link>
      <pubDate>Mon, 24 Oct 2016 12:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2016-10-24-compsci-190d-and-365-slash-590f/</guid>
      <description>&lt;p&gt;Next semester (Spring 2017) I am teaching two courses: &lt;a href=&#34;http://people.cs.umass.edu/~liberato/courses/2017-spring-compsci190d/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;COMPSCI 190D&lt;/a&gt;: Using Data Structures and &lt;a href=&#34;http://people.cs.umass.edu/~liberato/courses/2017-spring-compsci365/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;COMPSCI 365/590F&lt;/a&gt;: Digital Forensics.&lt;/p&gt;
&lt;p&gt;CICS handles course wait lists centrally. If during preregistration (or add/drop) SPIRE indicates a course requires department consent, or that it is full and you want to get on a wait list, please &lt;a href=&#34;https://www.cics.umass.edu/ugrad-education/overrides&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;request an override&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;compsci-190d&#34;&gt;COMPSCI 190D&lt;/h3&gt;
&lt;p&gt;COMPSCI 190D is intended for students who have completed COMPSCI 121. It will focus on using, rather than implementing and analyzing, the data structures now studied in COMPSCI 187, along with additional structures (such as sets and maps) which are not covered there but that are useful for practical programming.&lt;/p&gt;
&lt;p&gt;For some students, 190D can serve as an alternative to 187.  It will be recognized as one of the core courses for the proposed Informatics major, and the practical programming with data structures in 190D will be adequate preparation for some courses such as COMPSCI 326.&lt;/p&gt;
&lt;p&gt;Computer Science majors (both BA and BS) must still take 187, which is a prerequisite for all the 200-level core courses.  But the College of Information and Computer Sciences (CICS) hopes that many majors and applicants to the major will find 190D to be good additional advance preparation for 187.&lt;/p&gt;
&lt;h3 id=&#34;compsci-365590f&#34;&gt;COMPSCI 365/590F&lt;/h3&gt;
&lt;p&gt;Undergraduates COMPSCI majors with a strong technical background (COMPSCI 220 or 230) and an interest understanding the technical aspects of digital forensics. This course counts as a COMPSCI elective toward the major (B.S. or B.A.). Graduate students who enroll in 590F will also find the material topical to their program of study and to their professional development. They should expect to cover more of the details, both technical and legal, than the undergraduates enrolled in 365.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>COMPSCI 190D: Using Data Structures</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2016-05-10-compsci-190d-using-data-structures/</link>
      <pubDate>Tue, 10 May 2016 12:15:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2016-05-10-compsci-190d-using-data-structures/</guid>
      <description>&lt;p&gt;Next semester (Fall 2016) I am teaching &lt;a href=&#34;http://people.cs.umass.edu/~liberato/courses/2016-fall-compsci190d/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;COMPSCI 190D: Using Data Structures&lt;/a&gt;.  COMPSCI 190D is intended for students who have completed COMPSCI 121. It will focus on using, rather than implementing and analyzing, the data structures now studied in COMPSCI 187, along with additional structures (such as sets and maps) which are not covered there but that are useful for practical programming.&lt;/p&gt;
&lt;p&gt;For some students, 190D can serve as an alternative to 187.  It will be recognized as one of the core courses for the proposed Informatics major, and the practical programming with data structures in 190D will be adequate preparation for some courses such as COMPSCI 326.&lt;/p&gt;
&lt;p&gt;Computer Science majors (both BA and BS) must still take 187, which is a prerequisite for all the 200-level core courses.  But the College of Information and Computer Sciences (CICS) hopes that many majors and applicants to the major will find 190D to be good additional advance preparation for 187.&lt;/p&gt;
&lt;p&gt;CICS handles course wait lists centrally. If during preregistration (or add/drop) SPIRE indicates the course requires department consent, or if it is full and you want to get on the wait list, please &lt;a href=&#34;https://www.cics.umass.edu/ugrad-education/overrides&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;request an override&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>COMPSCI 391L/591L: Computer Crime Law</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2016-05-10-compsci-391l-slash-591l-computer-crime-law/</link>
      <pubDate>Tue, 10 May 2016 12:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2016-05-10-compsci-391l-slash-591l-computer-crime-law/</guid>
      <description>&lt;p&gt;Next semester (Fall 2016) I am teaching &lt;a href=&#34;http://people.cs.umass.edu/~liberato/courses/2016-fall-compsci391l/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;COMPSCI 391L/591L: Computer Crime Law&lt;/a&gt;. COMPSCI 391L/591L is a study, analysis, and discussion of the legal issues related to crimes involving computers and networks, including topical actions by dissidents and governments. We will also study the technologies of forensic investigation, intelligence gathering, privacy enhancement, and censorship resistance.&lt;/p&gt;
&lt;p&gt;Our main legal topics will include recent and important case law, statutes, and constitutional clauses concerning authorization, access, search and seizure, wiretaps, the right to privacy, and FISA. Our technology topics will include methods of investigation and resistance in the context of the Internet and Cellular networks. Students are assumed to have no background in legal concepts. All students will be required to complete substantial legal readings, complete significant written analysis of rulings, learn about technologies in detail, and participate in lively class discussion. Graduate students enrolled in 591L will be expected to read selected current law and technical articles and to analyze state-of-the-art systems in the context of law and policy.&lt;/p&gt;
&lt;p&gt;CICS handles course wait lists centrally. If during preregistration (or add/drop) SPIRE indicates the course requires department consent, or if it is full and you want to get on the wait list, please &lt;a href=&#34;https://www.cics.umass.edu/ugrad-education/overrides&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;request an override&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Joining the CICS Faculty</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2016-05-09-joining-the-cics-faculty/</link>
      <pubDate>Mon, 09 May 2016 12:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2016-05-09-joining-the-cics-faculty/</guid>
      <description>&lt;p&gt;I will be joining the CICS faculty as a lecturer in Fall 2016.&lt;/p&gt;
&lt;p&gt;Lecturers in CICS have many responsiblities, including teaching up to six courses per year (or equivalent based on other duties and activities) at both the undergraduate and MS level, curriculum development, and undergraduate advising, as well as additional administrative and scholarly duties as determined by the Chair of the Faculty.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Joined the PETS 2017 TPC</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2016-03-18-joined-the-pets-2017-tpc/</link>
      <pubDate>Wed, 24 Feb 2016 14:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2016-03-18-joined-the-pets-2017-tpc/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve joined the &lt;a href=&#34;http://petsymposium.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;PETS&lt;/a&gt; 2017 TPC. The Privacy Enhancing Technologies Symposium is the premier venue for novel research on the theoretical and practical aspects of privacy technologies. Please submit your work!&lt;/p&gt;
&lt;p&gt;As of 2015, PETS has moved to an open-access journal/conference hybrid model. Articles are submitted for review to an issue of the PoPETs open-access journal, and accepted articles are made freely available online by De Gruyter: &lt;a href=&#34;http://www.degruyter.com/view/j/popets&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.degruyter.com/view/j/popets&lt;/a&gt;. Since this change, we have seen an increase in the number and diversity of submissions. We believe that the major revisions model has also led to an increase in quality of the accepted publications.&lt;/p&gt;
&lt;p&gt;The PETS event consists of presentations of articles accepted to PoPETs, as well as keynotes, associated workshops such as HotPETs, and a range of social activities.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Characterization of Contact Offenders and Child Exploitation Material Trafficking on Five Peer-to-Peer Networks</title>
      <link>http://people.cs.umass.edu/~liberato/home/publication/characterization-of-contact-offenders-and/</link>
      <pubDate>Mon, 01 Feb 2016 00:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/publication/characterization-of-contact-offenders-and/</guid>
      <description></description>
    </item>
    
    <item>
      <title>CyberCorps® Scholarship for Service at UMass</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2016-01-26-cybercorpsr-scholarship-for-service-at-umass/</link>
      <pubDate>Tue, 26 Jan 2016 11:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2016-01-26-cybercorpsr-scholarship-for-service-at-umass/</guid>
      <description>&lt;p&gt;UMass has been awarded an NSF CyberCorps® Scholarship for Service grant (&lt;a href=&#34;http://www.nsf.gov/awardsearch/showAward?AWD_ID=1565521&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;DGE-1565521&lt;/a&gt;). In short, undergraduate or graduate students who are U.S. citizens or permanent residents and studying cybersecurity are eligible for tuition and fee waivers and generous stipends.&lt;/p&gt;
&lt;p&gt;To apply, visit the &lt;a href=&#34;https://cyber.cs.umass.edu/sfs&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;UMass SFS page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;More information is available in the &lt;a href=&#34;https://www.cics.umass.edu/news/umass-amherst-receives-42-million-train-next-national-cybersecurity-workforce&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;official press release&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Discovering Specification Violations in Networked Software Systems</title>
      <link>http://people.cs.umass.edu/~liberato/home/publication/discovering-specification-violations-in-networked/</link>
      <pubDate>Mon, 02 Nov 2015 00:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/publication/discovering-specification-violations-in-networked/</guid>
      <description></description>
    </item>
    
    <item>
      <title>Nominated for a Distinguished Teaching Award</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2015-10-20-nominated-for-a-distinguished-teaching-award/</link>
      <pubDate>Tue, 20 Oct 2015 15:30:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2015-10-20-nominated-for-a-distinguished-teaching-award/</guid>
      <description>&lt;p&gt;I have been nominated for a 2015-2016 Distinguished Teaching Award (DTA), a campus-wide student-driven recognition of teaching, for my teaching of &lt;a href=&#34;http://people.cs.umass.edu/~liberato/courses/2015-spring-cmpsci187/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;CMPSCI 187&lt;/a&gt; last semester.&lt;/p&gt;
&lt;p&gt;(DTA selection evaluations are only conducted when nominees teach during a Fall semester. I am not teaching this semester, so I must defer my nomination.)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>COMPSCI 290NW: A Networked World</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2015-09-30-compsci-290nw-a-networked-world/</link>
      <pubDate>Wed, 30 Sep 2015 15:30:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2015-09-30-compsci-290nw-a-networked-world/</guid>
      <description>&lt;p&gt;Next semester (Spring 2016) I am &lt;em&gt;tentatively&lt;/em&gt; scheduled to be the instructor for &lt;a href=&#34;http://www-net.cs.umass.edu/cs290nw/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;COMPSCI 290NW: A Networked World&lt;/a&gt;. Last offered in Fall 2014, COMPSCI 290NW is &lt;em&gt;not&lt;/em&gt; intended for CS majors, but it is an excellent introduction to networking, the Internet, and related technologies for non-majors. It is of particular interest to students pursuing the IT minor and for (BDIC) Informatics majors.&lt;/p&gt;
&lt;p&gt;The College of Information and Computer Sciences handles course wait lists centrally. If during preregistration (or add/drop) SPIRE indicates the course is full and you want to get on the wait list, please &lt;a href=&#34;https://www.cics.umass.edu/ugrad-education/overrides&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;request an override&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Discovering Specification Violations in Networked Software Systems</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2015-08-06-discovering-specification-violations-in-networked-software-systems/</link>
      <pubDate>Thu, 06 Aug 2015 12:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2015-08-06-discovering-specification-violations-in-networked-software-systems/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://people.cs.umass.edu/&amp;amp;nbsp;brian/bibliography/index.php?q=Walls:2015&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Discovering Specification Violations in Networked Software Systems&lt;/a&gt;, written in collaboration with &lt;a href=&#34;http://www.cse.psu.edu/&amp;amp;nbsp;rjw37/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Robert Walls&lt;/a&gt;, &lt;a href=&#34;http://people.cs.umass.edu/&amp;amp;nbsp;brun/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Yuriy Brun&lt;/a&gt;, and &lt;a href=&#34;http://people.cs.umass.edu/&amp;amp;nbsp;brian/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Brian Levine&lt;/a&gt;, has been accepted to the &lt;a href=&#34;http://issre.net/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;IEEE International Symposium on Software Reliability Engineering&lt;/a&gt; (ISSRE 2015).&lt;/p&gt;
&lt;p&gt;From the abstract:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Publicly released software implementations of network protocols often have bugs that arise from latent specification violations. We present APE, a technique that explores program behavior to identify potential specification violations. APE overcomes the challenge of exploring the large space of behavior by dynamically inferring precise models of behavior, stimulating unobserved behavior likely to lead to violations, and refining the behavioral models with the new, stimulated behavior. APE can (1) discover new specification violations, (2) verify that violations are removed, (3) identify related violations in other versions and implementations of the protocols, and (4) generate tests. APE works on binaries and requires a lightweight description of the protocol&amp;rsquo;s network messages and a violation characteristic. We use APE to rediscover the known heartbleed bug in OpenSSL, and discover one unknown bug and two unexpected uses of three popular BitTorrent clients. Manual inspection of APE-produced artifacts reveals four additional, previously unknown specification violations in OpenSSL and μTorrent.&lt;/p&gt;
&lt;/blockquote&gt;
</description>
    </item>
    
    <item>
      <title>Sybil-Resistant Mixing for Bitcoin</title>
      <link>http://people.cs.umass.edu/~liberato/home/publication/sybil-resistant-mixing-for-bitcoin/</link>
      <pubDate>Sat, 01 Nov 2014 00:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/publication/sybil-resistant-mixing-for-bitcoin/</guid>
      <description></description>
    </item>
    
    <item>
      <title>CMPSCI 187: Programming with Data Structures</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2014-10-31-cmpsci-187-programming-with-data-structures/</link>
      <pubDate>Fri, 31 Oct 2014 12:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2014-10-31-cmpsci-187-programming-with-data-structures/</guid>
      <description>&lt;p&gt;Next semester (Spring 2015) I am the instructor (with John Ridgway) for &lt;a href=&#34;http://people.cs.umass.edu/~liberato/courses/2015-spring-cmpsci187/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;CMPSCI 187: Programming with Data Structures&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Computer Science handles course wait lists centrally. If SPIRE indicates the course is full and you want to get on the wait list, please &lt;a href=&#34;https://www.cs.umass.edu/ugrad-education/overrides&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;request an override&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Joined the PETS 2015 TPC</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2014-09-09-joined-the-pets-2015-tpc/</link>
      <pubDate>Tue, 09 Sep 2014 12:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2014-09-09-joined-the-pets-2015-tpc/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve joined the &lt;a href=&#34;http://petsymposium.org/2015/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;PETS 2015&lt;/a&gt; TPC. The Privacy Enhancing Technologies Symposium is the premier venue for novel research on the theoretical and practical aspects of privacy technologies. Please submit your work!&lt;/p&gt;
&lt;h2 id=&#34;more-pets-news&#34;&gt;More PETS news&lt;/h2&gt;
&lt;p&gt;New this year, the proceedings of PETS is now PoPETS, a scholarly journal for timely research papers on privacy that brings journal-style reviewing to conference-style papers and seeks to combine the benefits of fast conference turnaround with consistent journal reviewing. PETS/PoPETs has been modeled on the success of other conference/journal hybrids such as JETS and PVLDB.&lt;/p&gt;
&lt;p&gt;Authors can submit papers to one of several submission deadlines during the year. Papers are provided with major/minor revision decisions on a predictable schedule, where we endeavor to assign the same reviewers to major revisions. Authors can address the concerns of reviewers in their revision and rebut reviewer comments before a final decision on acceptance is made. Papers accepted for publication by May 15th will be presented at that year&amp;rsquo;s symposium. Note that accepted papers must be presented at PETS.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Efficient Tagging of Remote Peers During Child Pornography Investigations</title>
      <link>http://people.cs.umass.edu/~liberato/home/publication/efficient-tagging-of-remote-peers/</link>
      <pubDate>Mon, 01 Sep 2014 00:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/publication/efficient-tagging-of-remote-peers/</guid>
      <description></description>
    </item>
    
    <item>
      <title>Sybil-Resistant Mixing for Bitcoin</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2014-08-25-sybil-resistant-mixing-for-bitcoin/</link>
      <pubDate>Mon, 25 Aug 2014 17:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2014-08-25-sybil-resistant-mixing-for-bitcoin/</guid>
      <description>&lt;p&gt;My paper &lt;a href=&#34;http://people.cs.umass.edu/~brian/bibliography/index.php?q=Bissias:2014&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Sybil-Resistant Mixing for Bitcoin&lt;/a&gt;, written in collaboration with &lt;a href=&#34;http://people.cs.umass.edu/~gbiss/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;George Bissias&lt;/a&gt;, &lt;a href=&#34;https://people.cs.umass.edu/~pinar/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Pinar Ozisik&lt;/a&gt;, and &lt;a href=&#34;http://people.cs.umass.edu/~brian/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Brian Levine&lt;/a&gt;, has been accepted to the &lt;a href=&#34;https://www.cylab.cmu.edu/news_events/events/wpes2014/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Workshop on Privacy in the Electronic Society&lt;/a&gt; workshop, held in conjunction with the &lt;a href=&#34;http://sigsac.org/ccs/CCS2014/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;ACM Conference on Computer and Communications Security&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;From the abstract:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A fundamental limitation of Bitcoin and its variants is that the movement of coin between addresses can be observed by examining the public block chain. This record enables adversaries to link addresses to individuals, and to identify multiple addresses as belonging to a single participant. Users can try to hide this information by mixing, where a participant exchanges the funds in an address coin-for-coin with another participant and address. In this paper, we describe the weaknesses of extant mixing protocols, and analyze their vulnerability to Sybil-based denial-of-service and inference attacks. As a solution,
we propose &lt;em&gt;Xim&lt;/em&gt;, a two-party mixing protocol thatis  compatible with Bitcoin and related virtual currencies.&lt;/p&gt;
&lt;p&gt;It is the first decentralized protocol to  simultaneously address Sybil attackers, denial-of-service attacks, and timing-based inference attacks. Xim is a multi-round protocol with tunably high success rates. It includes a  decentralized system for anonymously finding mix partners based on ads placed in the block chain. No outside party can confirm or find evidence of participants that pair up. We show that Xim&amp;rsquo;s design increases attacker costs linearly with the total number of participants, and that its probabilistic approach to mixing mitigates Sybil-based denial-of-service attack effects. We evaluate protocol delays based on our measurements of the Bitcoin network.&lt;/p&gt;
&lt;/blockquote&gt;
</description>
    </item>
    
    <item>
      <title>Joined the DFRWS 2015 TPC</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2014-08-22-joined-the-dfrws-2015-tpc/</link>
      <pubDate>Fri, 22 Aug 2014 09:15:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2014-08-22-joined-the-dfrws-2015-tpc/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve joined the &lt;a href=&#34;http://dfrws.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;DFRWS 2015&lt;/a&gt; TPC. DFRWS is the leading digital forensics research conference. If you&amp;rsquo;re doing work in the field on one of the many topics of interest, please submit a writeup! The tentative submission deadline is February 9th, 2015.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>CMPSCI 383: Artificial Intelligence</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2014-05-28-cmpsci-383-artificial-intelligence/</link>
      <pubDate>Wed, 28 May 2014 12:32:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2014-05-28-cmpsci-383-artificial-intelligence/</guid>
      <description>&lt;p&gt;Next semester (Fall 2014) I am the instructor for &lt;a href=&#34;http://people.cs.umass.edu/~liberato/courses/2014-fall-cmpsci383/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;CMPSCI 383: Artificial Intelligence&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Computer Science handles course wait lists centrally. If SPIRE indicates the course is full and you want to get on the wait list, please &lt;a href=&#34;https://www.cs.umass.edu/ugrad-education/overrides&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;request an override&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Location Privacy without Carrier Cooperation</title>
      <link>http://people.cs.umass.edu/~liberato/home/publication/location-privacy-without-carrier-cooperation/</link>
      <pubDate>Thu, 01 May 2014 00:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/publication/location-privacy-without-carrier-cooperation/</guid>
      <description></description>
    </item>
    
    <item>
      <title>Location Privacy without Carrier Cooperation</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2014-04-29-location-privacy-without-carrier-cooperation/</link>
      <pubDate>Tue, 29 Apr 2014 10:57:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2014-04-29-location-privacy-without-carrier-cooperation/</guid>
      <description>&lt;p&gt;My paper &lt;a href=&#34;http://people.cs.umass.edu/~brian/bibliography/index.php?q=Sung:2014&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Location Privacy without Carrier Cooperation&lt;/a&gt;, written in collaboration with &lt;a href=&#34;http://people.cs.umass.edu/~ksung/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Keen Sung&lt;/a&gt; and &lt;a href=&#34;http://people.cs.umass.edu/~brian/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Brian Levine&lt;/a&gt;, has been accepted to the &lt;a href=&#34;http://mostconf.org/2014/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Mobile Security Technologies&lt;/a&gt; workshop, held as part of the &lt;a href=&#34;http://www.ieee-security.org/TC/SPW2014&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;IEEE Computer Society Security and Privacy Workshops&lt;/a&gt;, in conjunction with the &lt;a href=&#34;http://www.ieee-security.org/TC/SP2014&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;IEEE Symposium on Security and Privacy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;From the abstract:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Cellular network operators can track the location of cell phone users as they connect to different towers. Operators may not directly control the user’s phone, but they do supply and control the SIM card that identifies the user. We seek to preserve a cellular phone user’s location privacy from cellular network operators. We propose the ZipPhone protocol for secure, virtual, and therefore easily changeable SIM cards. ZipPhone breaks the association between the user and IMSI identifier, and thus prevents the cellular operator from localizing the user.&lt;/p&gt;
&lt;/blockquote&gt;
</description>
    </item>
    
    <item>
      <title>CMPSCI 290NW: A Networked World</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2014-04-09-cmpsci-290nw-a-networked-world/</link>
      <pubDate>Wed, 09 Apr 2014 15:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2014-04-09-cmpsci-290nw-a-networked-world/</guid>
      <description>&lt;p&gt;Next semester (Fall 2014) I am the instructor for &lt;a href=&#34;http://www-net.cs.umass.edu/cs290nw/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;CMPSCI 290NW: A Networked World&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Computer Science handles course wait lists centrally. If SPIRE indicates the course is full and you want to get on the wait list, please &lt;a href=&#34;https://www.cs.umass.edu/ugrad-education/overrides&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;request an override&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Measuring a year of child pornography trafficking by U.S. computers on a peer-to-peer network</title>
      <link>http://people.cs.umass.edu/~liberato/home/publication/measuring-a-year-of-child/</link>
      <pubDate>Sat, 01 Feb 2014 00:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/publication/measuring-a-year-of-child/</guid>
      <description></description>
    </item>
    
    <item>
      <title>CMPSCI 453: Computer Networking</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2014-01-16-cmpsci453-computer-networking/</link>
      <pubDate>Thu, 16 Jan 2014 15:30:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2014-01-16-cmpsci453-computer-networking/</guid>
      <description>&lt;p&gt;This semester (Spring 2014) I am the instructor for &lt;a href=&#34;http://www-net.cs.umass.edu/cs453_spring_2014&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;CMPSCI 453: Computer Networking&lt;/a&gt;. All course material will be posted (or linked to) at the course website.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Joined the DFRWS 2014 TPC</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2013-12-02-oined-the-dfrws-2014-tpc/</link>
      <pubDate>Mon, 02 Dec 2013 12:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2013-12-02-oined-the-dfrws-2014-tpc/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve joined the &lt;a href=&#34;http://dfrws.org/2014/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;DFRWS 2014&lt;/a&gt; TPC. DFRWS is the leading digital forensics research conference. If you&amp;rsquo;re doing work in the field on one of the many topics of interest (as described in the &lt;a href=&#34;http://dfrws.org/2014/cfp.shtml&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;CFP&lt;/a&gt;), please submit a writeup! The submission deadline is February 13th, 2014.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Measuring a year of child pornography trafficking by U.S. computers on a peer-to-peer network</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2013-10-23-measuring-a-year-of-child-pornography-trafficking-by-u-dot-s-computers-on-a-peer-to-peer-network/</link>
      <pubDate>Wed, 23 Oct 2013 20:18:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2013-10-23-measuring-a-year-of-child-pornography-trafficking-by-u-dot-s-computers-on-a-peer-to-peer-network/</guid>
      <description>&lt;p&gt;My paper &lt;a href=&#34;http://people.cs.umass.edu/~brian/bibliography/index.php?q=Wolak:2013&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Measuring a year of child pornography trafficking by U.S. computers on a peer-to-peer network&lt;/a&gt;, written in collaboration with Janis Wolak and Brian Levine, has been accepted to &lt;a href=&#34;http://www.journals.elsevier.com/child-abuse-and-neglect/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Child Abuse &amp;amp; Neglect&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;From the abstract:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We used data gathered via investigative &amp;ldquo;RoundUp&amp;rdquo; software to measure a year of online child pornography (CP) trafficking activity by U.S. computers on the Gnutella peer-to-peer network. The data include millions of observations of Internet Protocol addresses sharing known CP files, identified as such in previous law enforcement investigations. We found that 244,920 U.S. computers shared 120,418 unique known CP files on Gnutella during the study year. More than 80% of these computers shared fewer than 10 such files during the study year or shared files for fewer than 10 days. However, less than 1% of computers (n = 915) made high annual contributions to the number of known CP files available on the network (100 or more files). If law enforcement arrested the operators of these high-contribution computers and took their files offline, the number of distinct known CP files available in the P2P network could be reduced by as much as 30%. Our findings indicate widespread low level CP trafficking by U.S. computers in one peer-to-peer network, while a small percentage of computers made high contributions to the problem. However, our measures were not comprehensive and should be considered lower bounds estimates. Nonetheless, our findings show that data can be systematically gathered and analyzed to develop an empirical grasp of the scope and characteristics of CP trafficking on peer-to-peer networks. Such measurements can be used to combat the problem. Further, investigative software tools can be used strategically to help law enforcement prioritize investigations.&lt;/p&gt;
&lt;/blockquote&gt;
</description>
    </item>
    
    <item>
      <title>Joined the PETS 2014 TPC</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2013-10-21-joined-the-pets-2014-tpc/</link>
      <pubDate>Mon, 21 Oct 2013 12:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2013-10-21-joined-the-pets-2014-tpc/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve joined the &lt;a href=&#34;http://petsymposium.org/2014/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;PETS 2014&lt;/a&gt; TPC. The Privacy Enhancing Technologies Symposium is the premier venue for novel research on the theoretical and practical aspects of privacy technologies. Please submit your work!&lt;/p&gt;
&lt;p&gt;If you have interesting work-in-progress, consider submitting to the associated workshop &lt;a href=&#34;http://petsymposium.org/2014/hotpets.php&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;HotPETs&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Efficient Tagging of Remote Peers During Child Pornography Investigations</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2013-10-07-efficient-tagging-of-remote-peers-during-child-pornography-investigations/</link>
      <pubDate>Mon, 07 Oct 2013 12:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2013-10-07-efficient-tagging-of-remote-peers-during-child-pornography-investigations/</guid>
      <description>&lt;p&gt;My paper &lt;a href=&#34;http://people.cs.umass.edu/~brian/bibliography/index.php?q=Liberatore:2014&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Efficient Tagging of Remote Peers During Child Pornography Investigations&lt;/a&gt;, written in collaboration with &lt;a href=&#34;http://people.cs.umass.edu/~brian/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Brian Levine&lt;/a&gt;, &lt;a href=&#34;http://www.cs.georgetown.edu/~clay/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Clay Shields&lt;/a&gt;, and &lt;a href=&#34;http://forensics.umass.edu/blynn/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Brian Lynn&lt;/a&gt;, has been accepted to the &lt;a href=&#34;http://www.computer.org/portal/web/tdsc&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;IEEE Transactions on Dependable and Secure Computing&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In it, we examine the problems inherent in using various network- and application-level identifiers in the context of forensic measurement, as exemplified in the policing of peer-to-peer file sharing networks for sexually exploitative imagery of children. We present a one-year measurement performed in the law enforcement context. We propose a tagging method marks that remote machines by providing them with application- or system-level data that is valid, but which covertly has meaning to investigators.  This tagging allows investigators to link network observations with physical evidence in a legal, forensically strong, and valid manner.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Turning Off GPS is Not Enough: Cellular location leaks over the Internet</title>
      <link>http://people.cs.umass.edu/~liberato/home/publication/turning-off-gps-is-not/</link>
      <pubDate>Sat, 13 Jul 2013 00:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/publication/turning-off-gps-is-not/</guid>
      <description></description>
    </item>
    
    <item>
      <title>Announcing mallet-LDA</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2013-06-25-announcing-mallet-lda/</link>
      <pubDate>Tue, 25 Jun 2013 14:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2013-06-25-announcing-mallet-lda/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/marcliberatore/mallet-lda&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;mallet-lda&lt;/a&gt; is a thin &lt;a href=&#34;http://clojure.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Clojure&lt;/a&gt; wrapper around &lt;a href=&#34;http://mallet.cs.umass.edu/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;MALLET&lt;/a&gt;&amp;rsquo;s LDA topic
modeling implementation. I&amp;rsquo;ve been using it for some time on an
private project. While it definitely is still rough around the edges,
I&amp;rsquo;m pushing it to GitHub in case someone else finds it useful.&lt;/p&gt;
&lt;p&gt;If I add anything useful to it (like a more idiomatic interface) I&amp;rsquo;ll
push those changes.&lt;/p&gt;
&lt;p&gt;Patches and bug reports are welcome. Please use the GitHub issue
tracker and/or send me a pull request.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>WWW 2013 Best Paper Nomination</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2013-05-15-www-2013-best-paper-nomination/</link>
      <pubDate>Wed, 15 May 2013 17:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2013-05-15-www-2013-best-paper-nomination/</guid>
      <description>&lt;p&gt;My paper &lt;a href=&#34;http://people.cs.umass.edu/~brian/bibliography/index.php?q=Hurley:2013&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Measurement and Analysis of Child Pornography Trafficking on
P2P Networks&lt;/a&gt;, written in collaboration with other members of the
&lt;a href=&#34;http://forensics.umass.edu/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Center for Forensics&lt;/a&gt;, was been nominated for Best Paper at the
&lt;a href=&#34;http://www2013.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;International World Wide Web Conference&lt;/a&gt;. It was one of only three
papers so honored, out of 122 accepted (and 831 submitted!) to the conference.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; We were the Runner-Up for Best Paper, beating out 120 other
accepted papers.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Disabling GPS is Not Enough: Cellular location leaks over the Internet</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2013-05-15-disabling-gps-is-not-enough-cellular-location-leaks-over-the-internet/</link>
      <pubDate>Wed, 15 May 2013 12:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2013-05-15-disabling-gps-is-not-enough-cellular-location-leaks-over-the-internet/</guid>
      <description>&lt;p&gt;My paper
&lt;a href=&#34;http://people.cs.umass.edu/~brian/bibliography/brian.php?q=Soroush:2013&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Disabling GPS is Not Enough: Cellular location leaks over the Internet&lt;/a&gt;,
written in collaboration with Hamed Soroush, Keen Sung, Erik
Learned-Miller, and Brian Levine, has been accepted for publication
in the proceedings of the &lt;a href=&#34;http://petsymposium.org/2013/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Privacy Enhancing Technologies Symposium&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In this paper, we show that, given a cell phone and a remote party
communicating over the Internet through 3G, the remote party can
determine locational information without explicit GPS data.
Specifically, we show that the path a cell phone and its owner take
from or to a known location can be determined from remote observations
of changes in TCP throughput. This determination is made possible by
the relative ease of acquiring training data, given our attacker model
(a streaming media service, or its data as subpoenaed by an investigator).&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Measurement and Analysis of Child Pornography Trafficking on P2P Networks (Runner-Up, Best Paper Award)</title>
      <link>http://people.cs.umass.edu/~liberato/home/publication/measurement-and-analysis-of-child/</link>
      <pubDate>Wed, 01 May 2013 00:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/publication/measurement-and-analysis-of-child/</guid>
      <description></description>
    </item>
    
    <item>
      <title>Our Work Mentioned in the Boston Globe Magazine</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2013-04-20-our-work-mentioned-in-the-boston-globe-magazine/</link>
      <pubDate>Sat, 20 Apr 2013 20:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2013-04-20-our-work-mentioned-in-the-boston-globe-magazine/</guid>
      <description>&lt;p&gt;This week&amp;rsquo;s &lt;a href=&#34;http://www.bostonglobe.com/magazine/specials/2013/04/20/craisins-and-microbes/4ebAbVqZOfx0iiX81Q5nUK/story.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Boston Globe Magazine&lt;/a&gt; has a story on innovations developed at &lt;a href=&#34;http://www.umass.edu/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;UMass&lt;/a&gt;. Among mentions of the &amp;ldquo;hockey stick&amp;rdquo; global temperature graph, an electricity generating microbe and Craisins, our work here at the &lt;a href=&#34;http://forensics.umass.edu/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Center for Forensics&lt;/a&gt; gets a mention.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>One Man&#39;s PET is Another Man&#39;s Security Vulnerability</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2013-03-14-one-mans-pet-is-another-mans-security-vulnerability/</link>
      <pubDate>Thu, 14 Mar 2013 14:35:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2013-03-14-one-mans-pet-is-another-mans-security-vulnerability/</guid>
      <description>&lt;p&gt;While reviewing for PETS this year, a thought struck me. Many privacy-enhancing technologies are, from some perspective, security vulnerabilities.&lt;/p&gt;
&lt;p&gt;In the U.S., we have very little in the way of legal protection when it comes to personal information, and privacy-enhancing technologies can be used by savvy users to protect themselves.&lt;/p&gt;
&lt;p&gt;Systems that are designed to prevent user and usage tracking (e.g., &lt;a href=&#34;http://www.torproject.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Tor&lt;/a&gt;, &lt;a href=&#34;http://cs.nyu.edu/trackmenot/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;TrackMeNot&lt;/a&gt;, &lt;a href=&#34;https://addons.mozilla.org/en-us/firefox/addon/notrace/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;NoTrace&lt;/a&gt;) often do so by breaking a property of the system they interface with. In particular, many web sites and services implicitly or explicitly expect to be able to tie user sessions together, and to track users across sites and visits. The information a user provides the server is half of a transaction (the other half being the service provided to the user). Further, in some cases, sites&amp;rsquo; terms of service or terms of use forbid attempts to circumvent this tracking.&lt;/p&gt;
&lt;p&gt;Viewed from the perspective of the web service provider, privacy-enhancing technologies are exploiting a security flaw. Users should &lt;em&gt;have to&lt;/em&gt; reveal information to receive service; privacy enhancing technologies are an &lt;em&gt;attack on a vulnerability&lt;/em&gt;, breaking the integrity of the transaction.&lt;/p&gt;
&lt;p&gt;In a better world, we would also use laws and policies to protect users&amp;rsquo;s privacy, especially as people (and researchers) claim their privacy is quite important to them.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Measurement and Analysis of Child Pornography Trafficking on P2P Networks</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2013-02-08-measurement-and-analysis-of-child-pornography-trafficking-on-p2p-networks/</link>
      <pubDate>Fri, 08 Feb 2013 09:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2013-02-08-measurement-and-analysis-of-child-pornography-trafficking-on-p2p-networks/</guid>
      <description>&lt;p&gt;My paper &lt;a href=&#34;http://people.cs.umass.edu/~brian/bibliography/index.php?q=Hurley:2013&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Measurement and Analysis of Child Pornography Trafficking on P2P Networks&lt;/a&gt;, written in collaboration with other members of the &lt;a href=&#34;http://forensics.umass.edu/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Center for Forensics&lt;/a&gt;, has been accepted for publication in the proceedings of the &lt;a href=&#34;http://www2013.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;International World Wide Web Conference&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In it, we examine a large data set collected over a year on both the Gnutella and eMule/eDonkey networks. We examine methods of target selection designed to reduce content availability (an NP-hard problem); and we discover an empirical justification for focusing on subgroups of peers that are the most aggressive, in terms of their duration and scope of activity, volume of shared content, or attempts to escape attribution.&lt;/p&gt;
&lt;p&gt;We also find that users trafficking in child sexual abuse imagery on these networks who use Tor use it inconsistently. Over 60% of linkable user sessions send traffic from non-Tor IPs at least once after first using Tor, thus removing its protection; over 90% of sessions observed on three or more days fail likewise. These sessions are linkable by the remote host because at the application level, some protocols send consistent identifiers. This problem is &lt;a href=&#34;https://blog.torproject.org/blog/bittorrent-over-tor-isnt-good-idea&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;well documented&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Moving from Noir to Compojure and lib-noir</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2013-02-06-moving-from-noir-to-compojure-and-lib-noir/</link>
      <pubDate>Wed, 06 Feb 2013 10:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2013-02-06-moving-from-noir-to-compojure-and-lib-noir/</guid>
      <description>&lt;p&gt;I have a small web application I wrote a while back, using the &lt;a href=&#34;http://www.webnoir.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Noir&lt;/a&gt;
framework. As pointed out on the &lt;a href=&#34;https://groups.google.com/forum/#!forum/clj-noir&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;clj-noir group&lt;/a&gt; by
&lt;a href=&#34;http://blog.raynes.me/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Anthony Grimes&lt;/a&gt;, Noir&amp;rsquo;s maintainer, Noir is now deprecated. So I
spent an hour or two doing the most trivial possible translation of my
application from Noir to a &lt;a href=&#34;https://github.com/weavejester/compojure&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Compojure&lt;/a&gt; + &lt;a href=&#34;https://github.com/noir-clojure/lib-noir&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;lib-noir&lt;/a&gt; based web stack.
I&amp;rsquo;m documenting the process here in case someone else finds it
helpful.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;updating-projectclj&#34;&gt;Updating &lt;code&gt;project.clj&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;First, I made the following changes to my&lt;code&gt;project.clj&lt;/code&gt; file. I
modified &lt;code&gt;:dependencies&lt;/code&gt; as follows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Removed &lt;code&gt;[noir &amp;quot;1.0.3-beta3&amp;quot;]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Added &lt;code&gt;[lib-noir &amp;quot;0.3.5&amp;quot;]&lt;/code&gt; and &lt;code&gt;[compojure &amp;quot;1.1.5&amp;quot;]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Added &lt;code&gt;[ring-server &amp;quot;0.2.7&amp;quot;]&lt;/code&gt; (to assist in starting the server,
since Noir used to do this for me)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I then added &lt;code&gt;[lein-ring &amp;quot;0.8.2&amp;quot;]&lt;/code&gt; to my &lt;code&gt;:plugins&lt;/code&gt; key, which adds
common Ring tasks to Leiningen, such as running a development server
with a simple &lt;code&gt;lein ring server&lt;/code&gt;. This necessitated the addition of a
&lt;code&gt;:ring&lt;/code&gt; key:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-clojure&#34; data-lang=&#34;clojure&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ss&#34;&gt;:ring&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;ss&#34;&gt;:handler&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;myproject/app&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;containing a map that points to the Ring handler defining my
application &amp;ndash; more about this handler in a bit. There are some other
useful things you can stick in the &lt;code&gt;:ring&lt;/code&gt; key&amp;rsquo;s map; check out the
lein-ring documentation for details.&lt;/p&gt;
&lt;p&gt;I added some additional configuration information to my &lt;code&gt;:profiles&lt;/code&gt;,
which you can read more about in the Ring documentation.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-clojure&#34; data-lang=&#34;clojure&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;ss&#34;&gt;:production&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;ss&#34;&gt;:ring&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;ss&#34;&gt;:open-browser?&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                       &lt;span class=&#34;ss&#34;&gt;:stacktraces?&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                       &lt;span class=&#34;ss&#34;&gt;:auto-reload?&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;ss&#34;&gt;:dev&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;ss&#34;&gt;:dependencies&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;ring-mock&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;0.1.3&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                        &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;ring/ring-devel&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;1.1.8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I also added &lt;code&gt;:min-lein-version &amp;quot;2.0.0&amp;quot;&lt;/code&gt; to the project map.&lt;/p&gt;
&lt;p&gt;I previously had added &lt;a href=&#34;https://github.com/weavejester/hiccup&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Hiccup&lt;/a&gt; to my dependencies; you will need to
do so, too, if you haven&amp;rsquo;t already, if you&amp;rsquo;re following this document
as a guide.&lt;/p&gt;
&lt;h2 id=&#34;converting-serverclj&#34;&gt;Converting &lt;code&gt;server.clj&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;If you used &lt;code&gt;lein new noir&lt;/code&gt; and/or followed the Noir tutorial, you
likely have a &lt;code&gt;server.clj&lt;/code&gt; file kicking around that used to be
responsible for starting the web server and adding what Noir calls
views to it. For my quick-and-dirty conversion, I chose to place my
Compojure routes in this file, and to define the Ring handler there.&lt;/p&gt;
&lt;p&gt;First, I removed &lt;code&gt;noir.server&lt;/code&gt; from my &lt;code&gt;(ns)&lt;/code&gt;form&amp;rsquo;s &lt;code&gt;:require&lt;/code&gt;. I removed
the &lt;code&gt;-main&lt;/code&gt; function, as I am now going to use &lt;code&gt;lein ring&lt;/code&gt; and related
functionality to start the web server. I added
&lt;code&gt;[compojure.route :as route]&lt;/code&gt; and &lt;code&gt;[noir.util.middleware :as nm]&lt;/code&gt; to
my &lt;code&gt;:require&lt;/code&gt;, for reasons that will become clear momentarily.&lt;/p&gt;
&lt;p&gt;I created a var, &lt;code&gt;app-routes&lt;/code&gt;
to hold the sequence of routes that my application would handle, and
initialized it with a simple catch-all to handle 404s:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-clojure&#34; data-lang=&#34;clojure&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;def &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;app-routes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;[(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;route/not-found&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;Not Found&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I also defined &lt;code&gt;app&lt;/code&gt; as the Ring handler, using lib-noir&amp;rsquo;s
&lt;code&gt;noir.util.middleware/app-handler&lt;/code&gt;, which takes a sequence of routes
and returns a handler wrapped in all of Noir&amp;rsquo;s default middleware. I
discovered the hard way if you don&amp;rsquo;t do this or some variant of
it, many of Noir&amp;rsquo;s functions, such as validation, don&amp;rsquo;t work.
Duh!&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-clojure&#34; data-lang=&#34;clojure&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;def &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;app&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;nm/app-handler&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;app-routes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you&amp;rsquo;d already converted to using lein-ring, as suggested by
&lt;a href=&#34;http://www.webnoir.org/tutorials/others/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.webnoir.org/tutorials/others/&lt;/a&gt;, you may not need to do some
or all of these steps.&lt;/p&gt;
&lt;h2 id=&#34;converting-the-views&#34;&gt;Converting the Views&lt;/h2&gt;
&lt;p&gt;Again, if you used &lt;code&gt;lein new noir&lt;/code&gt; and/or the tutorial, your pages are
defined by &lt;code&gt;defpartial&lt;/code&gt;s and &lt;code&gt;defpage&lt;/code&gt;s in files in the &lt;code&gt;views/&lt;/code&gt;
directory.&lt;/p&gt;
&lt;p&gt;In each such file, I removed &lt;code&gt;noir.core&lt;/code&gt; from its &lt;code&gt;(ns)&lt;/code&gt; form.&lt;/p&gt;
&lt;p&gt;I handled &lt;code&gt;defpartial&lt;/code&gt; by essentially macro-expanding it. &lt;code&gt;defpartial&lt;/code&gt;
is a convenience macro that returns a function that returns
Hiccup-style HTML. I replaced it with a plain old &lt;code&gt;defn&lt;/code&gt; that
wraps its contents in &lt;code&gt;(hiccup.core/html)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;defpage&lt;/code&gt; is a slightly stickier wicket. It&amp;rsquo;s a stateful abstraction
that chooses One Way to define routes and return functions that render
html; as such, it&amp;rsquo;s very simple. If you&amp;rsquo;re defining very static,
straightforward routes, it&amp;rsquo;s much less verbose than how I chose to
unpack it. Nevertheless, here&amp;rsquo;s what I did:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;I replaced each &lt;code&gt;defpage&lt;/code&gt; with a &lt;code&gt;defn&lt;/code&gt;, where the function name was
chosen to correspond to the URI. For example, &lt;code&gt;(defpage &amp;quot;/&amp;quot; [] ...&lt;/code&gt;
became &lt;code&gt;(defn index-page [] ...&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I added a route to &lt;code&gt;app-routes&lt;/code&gt; (above) to reflect this route,
e.g.,: &lt;code&gt;(GET &amp;quot;/&amp;quot; [] (the-relevant-view/index-page))&lt;/code&gt; (where
&lt;code&gt;the-relevant-view&lt;/code&gt; is the namespace the newly-defined &lt;code&gt;index-page&lt;/code&gt;
function lives in).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For &lt;code&gt;defpages&lt;/code&gt; that used the &lt;code&gt;{:as params}&lt;/code&gt; style of destructuring
to get the parameter map (as suggested in the Noir forms tutorial), I
converted &lt;code&gt;(defpage [:post &amp;quot;/user/add&amp;quot;] {:as user} ...&lt;/code&gt; to something
line &lt;code&gt;(defn user-add [user] ...&lt;/code&gt;) with a &lt;code&gt;(POST &amp;quot;/user/add&amp;quot; [:as {user :params}] (the-relevant-view/user-add user))&lt;/code&gt; route.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Finally, any uses of &lt;code&gt;(render)&lt;/code&gt; were replaced with a
direct call to the correct function to render that page.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Once this all was done, I could &lt;code&gt;lein ring server&lt;/code&gt; and things just worked.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Overtone and ClojureScript, Updated</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2013-02-01-overtone-and-clojurescript-updated/</link>
      <pubDate>Fri, 01 Feb 2013 21:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2013-02-01-overtone-and-clojurescript-updated/</guid>
      <description>&lt;p&gt;Last night I was fooling around with ClojureScript, running through examples floating around on the web. I thought &lt;a href=&#34;http://www.chris-granger.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Chris Granger&lt;/a&gt;&amp;rsquo;s post on &lt;a href=&#34;http://www.chris-granger.com/2012/02/20/overtone-and-clojurescript/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Overtone and ClojureScript&lt;/a&gt; looked neat, so I pulled the project from GitHub and tried to &lt;code&gt;lein run&lt;/code&gt; it.&lt;/p&gt;
&lt;p&gt;Alas, it failed, for several reasons. So I updated it to build correctly, and I&amp;rsquo;m posting what I did in case someone else finds it useful. My updated version of &lt;a href=&#34;https://github.com/marcliberatore/overtoneCljs&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;OvertoneCljs&lt;/a&gt; is on GitHub.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;getting-things-working&#34;&gt;Getting Things Working&lt;/h2&gt;
&lt;p&gt;The first problem I hit when trying to &lt;code&gt;lein run&lt;/code&gt; the project was Overtone failing to download piano samples. The old version of Overtone referenced in the &lt;code&gt;project.clj&lt;/code&gt; file had a hardcoded URL to the samples that was no longer live. I updated &lt;code&gt;project.clj&lt;/code&gt; to use a newer version of Overtone and solved that problem:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-clojure&#34; data-lang=&#34;clojure&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;overtone&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;0.8.1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;but created another. The API of Overtone changed between 0.6.0 and 0.8.1. In particular, the &lt;code&gt;pink-noise&lt;/code&gt; unit-generator no longer takes arguments, so the Clojure compiler choked:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Exception in thread &amp;quot;main&amp;quot; java.lang.IllegalArgumentException: Error in checker for ugen ==&amp;gt; pink-noise
You supplied too many arguments. 
Supplied args: ([1 1])
Expected arg keys: ()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I modified the relevant line (&lt;code&gt;src/overtoneinterface/models/dubstep.clj:20&lt;/code&gt;) and removed the arguments to &lt;code&gt;pink-noise&lt;/code&gt; to fix the problem. &lt;code&gt;lein run&lt;/code&gt; then got the server running and working.&lt;/p&gt;
&lt;h2 id=&#34;getting-things-stable&#34;&gt;Getting Things Stable&lt;/h2&gt;
&lt;p&gt;When Chris first whipped up this project, many of its dependencies were in a state of flux. Stable builds depend upon &lt;a href=&#34;https://github.com/technomancy/leiningen/wiki/Repeatability&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;repeatability&lt;/a&gt;. In Clojure projects, repeatability is typically handled by specifying libraries with &lt;a href=&#34;http://semver.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;semantic versions&lt;/a&gt;, and making sure these libraries are posted somewhere public, like the Maven Central Repository or Clojars.  &lt;code&gt;-SNAPSHOT&lt;/code&gt; versions break this rule and can result in build problems appearing over time.&lt;/p&gt;
&lt;p&gt;Looking at &lt;code&gt;project.clj&lt;/code&gt;, several library versions are snapshots:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-clojure&#34; data-lang=&#34;clojure&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;jayq&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;0.1.0-SNAPSHOT&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;crate&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;0.1.0-SNAPSHOT&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;fetch&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;0.1.0-SNAPSHOT&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I updated the first two to their latest stable versions:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-clojure&#34; data-lang=&#34;clojure&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;jayq&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;2.0.0&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;crate&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;0.2.4&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;When I updated fetch, it pulled in an older version of noir, which was easy enough to exclude:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[fetch &amp;#34;0.1.0-alpha2&amp;#34; :exclusions [noir]]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can use &lt;code&gt;lein deps :tree&lt;/code&gt; to see recursive dependencies, and the &lt;code&gt;lein-pedantic&lt;/code&gt; plugin to look for common pitfalls related to incompatible dependencies. The final version of my &lt;code&gt;project.clj&lt;/code&gt; has a couple of other tweaks recommended by &lt;code&gt;lein-pedantic&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Since jayq, fetch, and crate are ClojureScript libraries that are used in the ClojureScript source that Chris wrote, I needed to recompile that ClojureScript to make sure everything was OK. I added:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-clojure&#34; data-lang=&#34;clojure&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;lein-cljsbuild&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;0.3.0&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;to my plugin list (which you can do in &lt;code&gt;project.clj&lt;/code&gt; or globally in  &lt;code&gt;~/.lein/profiles.clj&lt;/code&gt;; I chose the former for repeatability reasons). Running &lt;code&gt;lein cljsbuild once&lt;/code&gt; informed me the build configuration was out of date; I updated the &lt;code&gt;:cljsbuild&lt;/code&gt; key in &lt;code&gt;project.clj&lt;/code&gt; to use the new format:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-clojure&#34; data-lang=&#34;clojure&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ss&#34;&gt;:cljsbuild&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;ss&#34;&gt;:builds&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[{&lt;/span&gt;&lt;span class=&#34;ss&#34;&gt;:source-paths&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;src&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                      &lt;span class=&#34;ss&#34;&gt;:builds&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;nil&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                      &lt;span class=&#34;ss&#34;&gt;:compiler&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;ss&#34;&gt;:pretty-print&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                 &lt;span class=&#34;ss&#34;&gt;:output-dir&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;resources/public/cljs/&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                 &lt;span class=&#34;ss&#34;&gt;:output-to&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;resources/public/cljs/bootstrap.js&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                 &lt;span class=&#34;ss&#34;&gt;:optimizations&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:simple&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}}]}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I also updated the required version of Clojure to 1.4.0 (as the current ClojureScript compiler requires it):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-clojure&#34; data-lang=&#34;clojure&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;org.clojure/clojure&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;1.4.0&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;lein cljsbuild once&lt;/code&gt; then started, but had problems when it entered non-ClojureScript directories. Since Chris wrote this example, the ClojureScript toolchain has evolved to (I think) expect Clojure and ClojureScript to be kept in separate hierarchies, so I moved &lt;code&gt;main.js&lt;/code&gt; from &lt;code&gt;src/overtoneinterface/client&lt;/code&gt; to &lt;code&gt;src-cljs/overtoneinterface/client&lt;/code&gt;. I also changed &lt;code&gt;:source-paths&lt;/code&gt; to the ClojureScript directory &lt;code&gt;[&amp;quot;src-cljs&amp;quot;]&lt;/code&gt; as part of this move.&lt;/p&gt;
&lt;p&gt;Then it was down to problems introduced by the newer versions of dependencies. crate&amp;rsquo;s &lt;code&gt;crate.macro&lt;/code&gt; namespace is now &lt;code&gt;crate.def-macros&lt;/code&gt;; updating &lt;code&gt;src-cljs/overtoneinterface/client/main.cljs&lt;/code&gt; to reflect this change allowed compilation to succeed. Similarly, I needed to account for the rename of &lt;code&gt;hiccup.page-helpers&lt;/code&gt; to &lt;code&gt;hiccup.page&lt;/code&gt; in the newer version of hiccup pulled in by the new version of noir. Finally, I explicitly passed &lt;code&gt;nil&lt;/code&gt; as the last parameter in the &lt;code&gt;remote-callback&lt;/code&gt; to quiet a compiler warning; the remote being called triggers the audio playback, but it doesn&amp;rsquo;t care about any callback (hence the nil). I&amp;rsquo;m not sure if Chris modified the API at some point, or just didn&amp;rsquo;t worry about the warning when he wrote this code.&lt;/p&gt;
&lt;p&gt;There are still some warnings being emitted by the ClojureScript compiler. They are related to &lt;code&gt;clj-&amp;gt;js&lt;/code&gt; being redefined. Since Chris wrote his example, an equivalent function was introduced into the ClojureScript runtime. Barring an update to fetch, there&amp;rsquo;s no way to fix this warning (jayq version 2.0.0 fixes this problem in that library), and no harm done by ignoring it.&lt;/p&gt;
&lt;h2 id=&#34;todo-or-not-todo&#34;&gt;TODO or not TODO&lt;/h2&gt;
&lt;p&gt;There&amp;rsquo;s lots more that could be done: noir is deprecated, so you could replace it with Compojure and lib-noir. fetch never left alpha, and there are almost certainly better alternatives available now (like &lt;a href=&#34;https://github.com/shoreleave/shoreleave-remote&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;shoreleave-remote&lt;/a&gt;). I&amp;rsquo;m not sure that the community has standardized on one yet, though. Feel free to fork!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Our Work Mentioned in New York Times Magazine</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2013-01-24-our-work-mentioned-in-new-york-times-magazine/</link>
      <pubDate>Thu, 24 Jan 2013 16:43:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2013-01-24-our-work-mentioned-in-new-york-times-magazine/</guid>
      <description>&lt;p&gt;This week&amp;rsquo;s &lt;a href=&#34;http://www.nytimes.com/pages/magazine/index.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;New York Times Magazine&lt;/a&gt;&amp;rsquo;s cover story &amp;ldquo;&lt;a href=&#34;http://www.nytimes.com/2013/01/27/magazine/how-much-can-restitution-help-victims-of-child-pornography.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;The Price of a Stolen Childhood&lt;/a&gt;,&amp;rdquo; by Emily Bazelon, describes aspects of the trafficking of child sexual abuse imagery on the Internet, and its terrible consequences for victims. The piece mentions that investigators use a tool we developed here at the &lt;a href=&#34;http://forensics.umass.edu/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Center for Forensics&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Whiteboard Diagrams as PDFs</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2013-01-21-whiteboard-diagrams-as-pdfs/</link>
      <pubDate>Mon, 21 Jan 2013 05:31:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2013-01-21-whiteboard-diagrams-as-pdfs/</guid>
      <description>&lt;p&gt;Need a quick diagram for the paper you&amp;rsquo;re working on? Instead of this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-latex&#34; data-lang=&#34;latex&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;\begin&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;{&lt;/span&gt;figure&lt;span class=&#34;nb&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;\vspace&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;{&lt;/span&gt;0.5in&lt;span class=&#34;nb&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Remember to put a diagram here!
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;\vspace&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;{&lt;/span&gt;0.5in&lt;span class=&#34;nb&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;\caption&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;{&lt;/span&gt;The to-be-written awesome caption will go here.&lt;span class=&#34;nb&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;\label&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;{&lt;/span&gt;fig:now-its-all-clear&lt;span class=&#34;nb&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;\end&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;{&lt;/span&gt;figure&lt;span class=&#34;nb&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;what if you could quickly turn a whiteboard sketch into a diagram suitable for use as a draft &amp;mdash; and maybe even for use in a camera-ready, depending upon your drawing skills &amp;mdash; in your paper?&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;I find drafting diagrams on the whiteboard is much faster than trying to do it in PowerPoint, OmniGraffle, or the like. &lt;a href=&#34;http://www.danroam.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Dan Roam&lt;/a&gt;&amp;rsquo;s non-technical but useful book &lt;a href=&#34;http://www.danroam.com/the-back-of-the-napkin/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;The Back of the Napkin&lt;/a&gt; might help convince you of this, if you aren&amp;rsquo;t too averse to what I think of as business-targeted self-help books. Randall Munroe&amp;rsquo;s &amp;ldquo;&lt;a href=&#34;http://what-if.xkcd.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;what if?&lt;/a&gt;&amp;rdquo; posts are an excellent showcase for the explanatory power of simple line drawings. Who knows? You might like your hand-drawn diagram so much that you use it as-is, and don&amp;rsquo;t end up recreating it in Powerpoint.&lt;/p&gt;
&lt;p&gt;But then how do you get it into a nice vector format for use in LaTeX or the like? Pull out your smartphone, take a picture of the whiteboard, and put it on your computer. You can use various programs to make this easier, like the Camera Upload feature in &lt;a href=&#34;https://www.dropbox.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Dropbox&lt;/a&gt;&amp;rsquo;s phone app.&lt;/p&gt;
&lt;p&gt;Smartphones usually produce JPEGs, which aren&amp;rsquo;t the ideal image format for diagrams, particularly diagrams that should have the feel of vector, rather than raster, graphics. I use several open source tools to quickly convert a JPEG like this:&lt;/p&gt;


















&lt;figure  &gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img src=&#34;../../img/2013-01-21-whiteboard-photo.jpg&#34; alt=&#34;a picture of a drawing of a drawing&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/figure&gt;

&lt;p&gt;into a small, scalable vector diagram like this:&lt;/p&gt;


















&lt;figure  &gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img src=&#34;../../img/2013-01-21-whiteboard-photo.svg&#34; alt=&#34;a drawing of a drawing&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/figure&gt;

&lt;p&gt;It&amp;rsquo;s a multi-step process. First I crop and threshold the image into a bitmap using &lt;a href=&#34;http://www.gimp.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Gimp&lt;/a&gt;, and then I vectorize it using &lt;a href=&#34;http://potrace.sourceforge.net/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;potrace&lt;/a&gt;. Specifically:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Crop, threshold, and make a bitmap:
&lt;ul&gt;
&lt;li&gt;Load the JPEG in Gimp.&lt;/li&gt;
&lt;li&gt;Select the area you want to crop.&lt;/li&gt;
&lt;li&gt;Crop using &lt;code&gt;Image&lt;/code&gt; → &lt;code&gt;Crop to Selection&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Convert to a bitmap using &lt;code&gt;Image&lt;/code&gt; → &lt;code&gt;Mode&lt;/code&gt; → &lt;code&gt;Indexed&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;(Optional) Scale the image using &lt;code&gt;Image&lt;/code&gt; → &lt;code&gt;Scale Image...&lt;/code&gt; to about 1,000 pixels or so in the shorter dimension, preserving the aspect ratio. This step isn&amp;rsquo;t necessary, but might help potrace if you have a particularly high-resolution camera on your phone.&lt;/li&gt;
&lt;li&gt;I get best results if I use &lt;code&gt;Generate optimum palette&lt;/code&gt; with two colors, rather than using &lt;code&gt;Use black and white (1-bit) palette&lt;/code&gt;. You&amp;rsquo;d think they&amp;rsquo;d be identical, but in my very limited testing, they&amp;rsquo;re not. Your results may vary.&lt;/li&gt;
&lt;li&gt;Export to a bitmap format that &lt;code&gt;potrace&lt;/code&gt; can understand. Use &lt;code&gt;File&lt;/code&gt; → &lt;code&gt;Export...&lt;/code&gt;, and save as a PBM.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Use potrace to convert from a bitmap to a vector format:
&lt;ul&gt;
&lt;li&gt;To make a PDF, try &lt;code&gt;potrace -b pdf -o file.pdf -t 10 file.pbm&lt;/code&gt;. You may want to play with the potrace algorithm&amp;rsquo;s options (see the man page); the &lt;code&gt;-t n&lt;/code&gt; option suppresses speckles of up to &lt;code&gt;n&lt;/code&gt; pixels, which I find useful in removing stray whiteboard marks; calibrate &lt;code&gt;n&lt;/code&gt; to the size of the image and the dirtiness of your whiteboard.&lt;/li&gt;
&lt;li&gt;You can use &lt;code&gt;-b svg&lt;/code&gt; to create SVG files, which can be rendered by most web browers. That&amp;rsquo;s where the preceding image came from.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;There are many ways to tweak this process. Use &lt;a href=&#34;http://www.imagemagick.org/script/index.php&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;ImageMagick&lt;/a&gt; or &lt;a href=&#34;http://www.graphicsmagick.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;GraphicsMagick&lt;/a&gt; instead of Gimp if you want to do it all at the command line, or try &lt;a href=&#34;http://inkscape.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Inkscape&lt;/a&gt;&amp;rsquo;s integrated potrace functionality if you want to do it all in a GUI.&lt;/p&gt;
&lt;p&gt;Happy drawing!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The Commonwealth Center for Forensics Is Not a State Crime Lab</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2013-01-20-the-commonwealth-center-for-forensics-is-not-a-state-crime-lab/</link>
      <pubDate>Sun, 20 Jan 2013 10:41:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2013-01-20-the-commonwealth-center-for-forensics-is-not-a-state-crime-lab/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve received several phone calls in the last hour about &amp;ldquo;breaking news related to a chemist at the Amherst state crime lab facing criminal charges.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The &lt;a href=&#34;http://forensics.umass.edu&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Commonwealth Center for Forensics&lt;/a&gt; is not a state crime lab. It is
a research center where we work on &lt;em&gt;digital&lt;/em&gt; forensics and privacy. We have no contact with, knowledge of, or comment on the chemist in question.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re a reporter looking for information, please don&amp;rsquo;t call me, as I can&amp;rsquo;t help you.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Miscellaneous LaTeX/BibTeX Tools</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2013-01-19-miscellaneous-latex-slash-bibtex-tools/</link>
      <pubDate>Sat, 19 Jan 2013 16:05:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2013-01-19-miscellaneous-latex-slash-bibtex-tools/</guid>
      <description>&lt;p&gt;There are many minor utilities that make my life easier when I&amp;rsquo;m preparing
manuscripts in LaTeX. Among them:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://gitorious.org/latexpand&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;latexpand&lt;/a&gt; is a Perl script that can perform various pre-submission tasks. I frequently use it to expand &lt;code&gt;\input&lt;/code&gt; and &lt;code&gt;\include&lt;/code&gt; directives, and to remove comments.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;http://latexdiff.berlios.de/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;latexdiff&lt;/a&gt; performs a LaTex-aware diff on the text of LaTeX source, resulting in a file you can run through &lt;code&gt;pdflatex&lt;/code&gt;. The differences are clearly marked in the resulting PDF. Further, latexdiff understands some version control systems, notably Subversion and Git, so it makes it easy to show where the text of a manuscript has changed compared to previous versions. You do keep your paper sources in version control, right?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;http://www.gerd-neugebauer.de/software/TeX/BibTool/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;bibtool&lt;/a&gt; is a swiss army knife for BibTeX files. I use it for all sorts of things, most commonly to extract from a master &lt;code&gt;.bib&lt;/code&gt; file the list of just the entries used in the current document, for example: &lt;code&gt;bibtool -x paper.aux&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;http://os.ghalkes.nl/dwdiff.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;dwdiff&lt;/a&gt; is a word-level diff tool. It can take as input the output of other diff programs using the &lt;code&gt;--diff-input&lt;/code&gt; option; this comes in handy when using &lt;code&gt;svn diff&lt;/code&gt; to see source changes. Git has built-in word-level diffs, using the &lt;code&gt;--word-diff&lt;/code&gt; (or related &lt;code&gt;--color-words&lt;/code&gt;) option to &lt;code&gt;git diff&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Octopress: Great Static Web Site Generator, or the Greatest?</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2013-01-18-octopress-great-static-site-generator/</link>
      <pubDate>Fri, 18 Jan 2013 17:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2013-01-18-octopress-great-static-site-generator/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve switched over to the so far excellent &lt;a href=&#34;http://octopress.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Octopress&lt;/a&gt;. Previously I used a lightly customized &lt;a href=&#34;http://jekyllrb.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Jekyll&lt;/a&gt; setup based on Fletcher Penney&amp;rsquo;s &lt;a href=&#34;http://fletcherpenney.net/multimarkdown/cms/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Multimarkdown CMS&lt;/a&gt;. Time for a change!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Joined the DFRWS 2013 TPC</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2012-12-19-joined-the-dfrws-2013-tpc/</link>
      <pubDate>Wed, 19 Dec 2012 12:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2012-12-19-joined-the-dfrws-2013-tpc/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve joined the &lt;a href=&#34;http://dfrws.org/2013/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;DFRWS 2013&lt;/a&gt; TPC. DFRWS is the leading digital forensics research conference. If you&amp;rsquo;re doing work in the field on one of the many topics of interest (as described in the &lt;a href=&#34;http://dfrws.org/2013/cfp.shtml&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;CFP&lt;/a&gt;), please submit a writeup! The submission deadline is February 20th, 2013.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Effectiveness and Detection of Denial-of-Service Attacks in Tor</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2012-11-15-effectiveness-and-detection-of-denial-of-service-attacks-in-tor/</link>
      <pubDate>Thu, 15 Nov 2012 12:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2012-11-15-effectiveness-and-detection-of-denial-of-service-attacks-in-tor/</guid>
      <description>&lt;p&gt;After an extended review process, my paper &lt;a href=&#34;http://dl.acm.org/citation.cfm?doid=2382448.2382449&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Effectiveness and Detection of Denial-of-Service Attacks in Tor&lt;/a&gt;, written in collaboration with Norman Danner and Danny Krizanc at &lt;a href=&#34;http://www.wesleyan.edu/mathcs/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Wesleyan&lt;/a&gt;, and a very dedicated, very talented  undergraduate, &lt;a href=&#34;http://samdk.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Sam DeFabbia-Kane&lt;/a&gt;, has been published in the &lt;a href=&#34;http://tissec.acm.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;ACM Transactions on Information and System Security&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This manuscript is a much extended and improved version of the paper we published at Financial Cryptography 2009. In it, we examine the denial-of-service attack that Borisov et al. previously proposed, both through analysis and simulation. We also describe two algorithms for detecting such attacks, one deterministic and proved correct, the other probabilistic and verified in simulation.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Effectiveness and Detection of Denial-of-Service Attacks in Tor</title>
      <link>http://people.cs.umass.edu/~liberato/home/publication/effectiveness-and-detection-of-denial-of-service/</link>
      <pubDate>Thu, 01 Nov 2012 00:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/publication/effectiveness-and-detection-of-denial-of-service/</guid>
      <description></description>
    </item>
    
    <item>
      <title>Joined the PETS 2013 TPC</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2012-08-29-joined-the-pets-2013-tpc/</link>
      <pubDate>Wed, 29 Aug 2012 12:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2012-08-29-joined-the-pets-2013-tpc/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve joined the &lt;a href=&#34;http://petsymposium.org/2013/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;PETS 2013&lt;/a&gt; TPC. The Privacy Enhancing Technologies Symposium is the premiere venue for novel research on the theoretical and practical aspects of privacy technologies. The &lt;a href=&#34;http://petsymposium.org/2013/cfp.php&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;CFP&lt;/a&gt; lists suggested topics; please submit your work! Abstracts are due February 15th, 2013, and full papers four days later.&lt;/p&gt;
&lt;p&gt;If you have interesting work-in-progress, consider submitting to the associated workshop &lt;a href=&#34;http://petsymposium.org/2013/hotpets.php&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;HotPETs&lt;/a&gt;, which has a submission deadline of April 15th, 2013.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Forensic Investigation of the OneSwarm Anonymous Filesharing System</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2011-10-17-forensic-investigation-of-the-oneswarm-anonymous-filesharing-system/</link>
      <pubDate>Mon, 17 Oct 2011 12:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2011-10-17-forensic-investigation-of-the-oneswarm-anonymous-filesharing-system/</guid>
      <description>&lt;p&gt;My paper &lt;a href=&#34;http://www.cs.umass.edu/~brian/bibliography/index.php?q=Prusty:2011&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Forensic Investigation of the OneSwarm Anonymous Filesharing System&lt;/a&gt;, written in collaboration with Swagatika Prusty and Brian Neil Levine, has been published in the &lt;a href=&#34;http://www.sigsac.org/ccs/CCS2011/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;ACM Conference on Computer and Communications Security (CCS 2011)&lt;/a&gt;. In it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We show a weaknesses of the OneSwarm system to a practical, statistical timing attack, allowing attackers to determine if a peer is the source of a file.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We correct the original analysis of the system&amp;rsquo;s robustness against collusion attacks and show it is less resistant than previously believed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We show that an application of a known TCP-based attack can determine a peer is the source of a file, if that peer has disabled rate-limiting in their client.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Forensic Investigation of the OneSwarm Anonymous Filesharing System</title>
      <link>http://people.cs.umass.edu/~liberato/home/publication/forensic-investigation-of-the-oneswarm/</link>
      <pubDate>Sat, 01 Oct 2011 00:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/publication/forensic-investigation-of-the-oneswarm/</guid>
      <description></description>
    </item>
    
    <item>
      <title>Effective Digital Forensics Research is Investigator-Centric</title>
      <link>http://people.cs.umass.edu/~liberato/home/post/2011-08-09-effective-digital-forensics-research-is-investigator-centric/</link>
      <pubDate>Tue, 09 Aug 2011 12:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/post/2011-08-09-effective-digital-forensics-research-is-investigator-centric/</guid>
      <description>&lt;p&gt;My position paper &lt;a href=&#34;http://www.cs.umass.edu/~brian/bibliography/index.php?q=Walls:2011a&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Effective Digital Forensics Research is Investigator-Centric&lt;/a&gt;, written in collaboration with Robert Walls, Brian Levine, and Clay Shields, has been published in the &lt;a href=&#34;http://static.usenix.org/event/hotsec11/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;USENIX Workshop on Hot Topics in Security (HotSec 2011)&lt;/a&gt;. In it, we point out the sharp differences of digital forensics research to computer security research, in the hopes of aiding both reviewers and researchers in their goal of producing and publishing useful, effective digital forensics research.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Effective Digital Forensics Research is Investigator-Centric</title>
      <link>http://people.cs.umass.edu/~liberato/home/publication/effective-digital-forensics-research-is/</link>
      <pubDate>Mon, 01 Aug 2011 00:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/publication/effective-digital-forensics-research-is/</guid>
      <description></description>
    </item>
    
    <item>
      <title>Empirical Tests of Anonymous Voice Over IP</title>
      <link>http://people.cs.umass.edu/~liberato/home/publication/empirical-tests-of-anonymous-voice/</link>
      <pubDate>Sat, 01 Jan 2011 00:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/publication/empirical-tests-of-anonymous-voice/</guid>
      <description></description>
    </item>
    
    <item>
      <title>Strengthening Forensic Investigations of Child Pornography on P2P Networks</title>
      <link>http://people.cs.umass.edu/~liberato/home/publication/strengthening-forensic-investigations-of-child/</link>
      <pubDate>Mon, 01 Nov 2010 00:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/publication/strengthening-forensic-investigations-of-child/</guid>
      <description></description>
    </item>
    
    <item>
      <title>Forensic Investigation of Peer-to-Peer File Sharing Networks</title>
      <link>http://people.cs.umass.edu/~liberato/home/publication/forensic-investigation-of-peer-to-peer-file/</link>
      <pubDate>Sun, 01 Aug 2010 00:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/publication/forensic-investigation-of-peer-to-peer-file/</guid>
      <description></description>
    </item>
    
    <item>
      <title>DEX: Digital Evidence Provenance Supporting Reproducibility and Comparison</title>
      <link>http://people.cs.umass.edu/~liberato/home/publication/dex-digital-evidence-provenance-supporting/</link>
      <pubDate>Sat, 01 Aug 2009 00:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/publication/dex-digital-evidence-provenance-supporting/</guid>
      <description></description>
    </item>
    
    <item>
      <title>Detecting Denial of Service Attacks in Tor</title>
      <link>http://people.cs.umass.edu/~liberato/home/publication/detecting-denial-of-service-attacks/</link>
      <pubDate>Sun, 22 Feb 2009 00:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/publication/detecting-denial-of-service-attacks/</guid>
      <description></description>
    </item>
    
    <item>
      <title>Cheat-Proof Playout for Centralized and Peer-to-Peer Gaming</title>
      <link>http://people.cs.umass.edu/~liberato/home/publication/cheat-proof-playout-for-centralized-and/</link>
      <pubDate>Thu, 01 Feb 2007 00:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/publication/cheat-proof-playout-for-centralized-and/</guid>
      <description></description>
    </item>
    
    <item>
      <title>Maximizing Transfer Opportunities in Bluetooth DTNs</title>
      <link>http://people.cs.umass.edu/~liberato/home/publication/maximizing-transfer-opportunities-in-bluetooth/</link>
      <pubDate>Fri, 01 Dec 2006 00:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/publication/maximizing-transfer-opportunities-in-bluetooth/</guid>
      <description></description>
    </item>
    
    <item>
      <title>Inferring the Source of Encrypted HTTP Connections</title>
      <link>http://people.cs.umass.edu/~liberato/home/publication/inferring-the-source-of-encrypted/</link>
      <pubDate>Sun, 01 Oct 2006 00:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/publication/inferring-the-source-of-encrypted/</guid>
      <description></description>
    </item>
    
    <item>
      <title>Privacy Vulnerabilities in Encrypted HTTP Streams</title>
      <link>http://people.cs.umass.edu/~liberato/home/publication/privacy-vulnerabilities-in-encrypted-http/</link>
      <pubDate>Sun, 01 May 2005 00:00:00 +0000</pubDate>
      <guid>http://people.cs.umass.edu/~liberato/home/publication/privacy-vulnerabilities-in-encrypted-http/</guid>
      <description></description>
    </item>
    
  </channel>
</rss>
