<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-34619686</id><updated>2012-01-28T12:06:25.748-05:00</updated><category term='mind'/><category term='education'/><category term='ai'/><category term='web'/><category term='organization'/><category term='books'/><category term='latex'/><category term='teb'/><category term='gwt'/><category term='theology'/><category term='logo'/><category term='nlp'/><category term='academia'/><category term='ubicomp'/><category term='python'/><category term='software engineering'/><category term='haskell'/><category term='wikis'/><category term='atlhack'/><category term='vim'/><category term='review'/><category term='linux'/><category term='scheme'/><category term='miscellaneous'/><category term='retro'/><category term='macintosh'/><category term='research'/><category term='linguistics'/><category term='olpc'/><category term='java'/><category term='logic'/><category term='politics'/><category term='culture'/><category term='morphology'/><category term='games'/><category term='music'/><category term='lisp'/><category term='language'/><category term='aefi'/><category term='school'/><category term='philosophy'/><category term='emulation'/><category term='meta'/><category term='ui'/><category term='machine translation'/><category term='atlanta'/><category term='unix'/><category term='functional programming'/><category term='languages'/><category term='history'/><category term='design'/><category term='statistics'/><category term='machine learning'/><category term='ubuntu'/><category term='readings'/><category term='google'/><category term='R'/><title type='text'>Penguin Parens</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default?start-index=101&amp;max-results=100'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>120</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-34619686.post-6645897634534443065</id><published>2012-01-19T01:15:00.002-05:00</published><updated>2012-01-19T01:17:30.726-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='culture'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='politics'/><title type='text'>and we're back</title><content type='html'>&lt;a href="https://www.eff.org/deeplinks/2012/01/internet-its-best"&gt;Well done, Internets!&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In solidarity with everybody doing the #j18 protests against SOPA and PIPA, I blacked out this blog and my academic web page; I'd be really surprised if this directly caused anybody to call any legislators. My email to my family on the topic was probably more effective: one of my uncles wrote back, saying he'd signed a petition. So: rad!&lt;br /&gt;&lt;br /&gt;The protests seem to have been incredibly loud and fairly effective.&amp;nbsp;At this point, a congressperson would have to be incredibly dense to not get the sense that the public outcry against censoring the Internet in the US is enormous. A number of Republicans,&amp;nbsp;including some former co-sponsors,&amp;nbsp;have taken the opportunity to switch to opposing the bills, which seems politically expedient. (&lt;a href="http://www.dailykos.com/story/2012/01/18/1056100/-SOPA,-and-the-idiocy-of-Democrats"&gt;article on DailyKos&lt;/a&gt;&amp;nbsp;about this. Kos wonders why Democrats seem to be willing to be left holding the bag...)&lt;br /&gt;&lt;br /&gt;But even if we manage to get SOPA and PIPA scrapped, we're still left with two fundamental problems.&lt;br /&gt;&lt;br /&gt;(1) The MPAA and RIAA can try to break the Internet again later, because they'll still own a significant number of congresspeople. Say if &lt;a href="http://keepthewebopen.com/"&gt;OPEN&lt;/a&gt;&amp;nbsp;picks up steam and gets passed, will that be enough for them? The music and movie industries have fought tooth-and-nail against new technologies for decades; what's to stop them from taking another run against the Internet, or against whatever we have in the future? How can we reduce their money and influence, over time? As an angry Internet activist, getting all of your family and friends to boycott all media produced by major labels and studios seems extraordinarily hard. I must admit: I totally bought an Andrew W.K. CD not too long ago, and we have Netflix at our house. Should we cancel it?&lt;br /&gt;&lt;br /&gt;(2) More fundamentally: &lt;i&gt;large companies can own congresspeople&lt;/i&gt;. How can we take control of Congress, as citizens? Note that I didn't say "take &lt;i&gt;back&lt;/i&gt; Congress" -- there's been a disconcerting connection between money and power for our entire history. If you haven't read Howard Zinn's &lt;a href="http://www.historyisaweapon.com/zinnapeopleshistory.html"&gt;A People's History of the United States&lt;/a&gt;, I highly recommend it.&lt;br /&gt;&lt;br /&gt;People much more insightful and more dedicated than me have written quite a lot about this, but I suspect the solution really is campaign finance reform. Simply taking away the incentives to make awful decisions, while encouraging good behavior that &lt;i&gt;at least some people&lt;/i&gt;&amp;nbsp;like would probably result in a Congress that... makes fewer awful decisions and has a double-digit approval rating. I think term limits would also be useful, so that congresspeople don't have to worry about re-election so often (although, how to incentivize good behavior in the last term? ...), and some sort of rules to keep former congresspersons from becoming lobbyists, so we can prevent the Chris Dodd situation from happening again. He still goes by "Senator Dodd", but this year he quit the senate to become the head of the MPAA.&lt;br /&gt;&lt;br /&gt;Oh, also: Super PACs, and the Citizens United decision.&lt;br /&gt;&lt;br /&gt;However we move forward: today, a large number of people who had never tried to contact their elected representatives, now have. The more often we do it, the lower the psychological barrier! There are even phone apps: (&lt;a href="http://sunlightlabs.com/blog/2009/congress-theres-an-android-app-for-that/"&gt;android&lt;/a&gt;, &lt;a href="http://realtimecongress.org/"&gt;iphone&lt;/a&gt;). I use the Android one all the time; it's extremely convenient.&lt;br /&gt;&lt;br /&gt;Right. Anyway. Stop reading this blog, and go read what Lawrence Lessig has to say. I'll get back to doing some computational linguistics. Maybe you should too!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-6645897634534443065?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/6645897634534443065/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=6645897634534443065' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/6645897634534443065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/6645897634534443065'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2012/01/and-were-back.html' title='and we&apos;re back'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-2671043847803841036</id><published>2011-12-31T21:10:00.001-05:00</published><updated>2011-12-31T21:10:52.203-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='machine translation'/><category scheme='http://www.blogger.com/atom/ns#' term='nlp'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='readings'/><title type='text'>reading: Readings in Machine Translation</title><content type='html'>Post before the end of the year!&lt;br /&gt;&lt;br /&gt;I'm really enjoying &lt;a href="http://mitpress.mit.edu/catalog/item/default.asp?tid=8799&amp;amp;ttype=2"&gt;Readings in Machine Translation&lt;/a&gt;&amp;nbsp;-- it's got all of these great MT papers from past decades, going from the &lt;a href="http://www.mt-archive.info/Weaver-1949.pdf"&gt;Warren Weaver memo from 1949&lt;/a&gt;&amp;nbsp;to the Brown et al. paper where they make stat-mt fashionable again in the early 90s. Apparently, a lot of the papers in the volume were somewhat hard to find online in 2003.&lt;br /&gt;&lt;br /&gt;Really interesting: so far, the early papers have had some very detailed descriptions of the low-level particulars. "Well, we're going to need this many memory drums...", "oh, and the words will be stored in memory in alphabetical order" (which seems very archaic), and a fixation on picking the right word in the target language, in sort of a word-sense disambiguation sense (which is slightly fashionable again!).&lt;br /&gt;&lt;br /&gt;So for people into MT who want a sense of history, these are papers that it seems like one should read -- I mean, Sergei Nirenburg and friends picked them out, so they've got to be good, right?&lt;br /&gt;&lt;br /&gt;If you haven't read the 1949 Warren Weaver memo, though -- even if you're not an NLP person -- do yourself a favor and go ahead and read it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-2671043847803841036?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/2671043847803841036/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=2671043847803841036' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/2671043847803841036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/2671043847803841036'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2011/12/reading-readings-in-machine-translation.html' title='reading: Readings in Machine Translation'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-1518873459676553676</id><published>2011-11-30T22:19:00.001-05:00</published><updated>2011-11-30T23:06:45.817-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='unix'/><category scheme='http://www.blogger.com/atom/ns#' term='wikis'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>securing your MoinMoin wiki</title><content type='html'>I really like &lt;a href="http://moinmo.in/"&gt;MoinMoin&lt;/a&gt;; it's straightforward, it's Pythonic, it's got WikiWords. Great! I've been keeping a&amp;nbsp;&lt;a href="http://hackmode.org/wiki"&gt;bunch of notes on one&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The IU&amp;nbsp;Computational Linguistics group had an aging MoinMoin too, but most of the edits and new accounts were spam. I suspect the edits were being done by humans too, because they were pretty good at fitting into the markup of existing pages.&lt;br /&gt;&lt;br /&gt;We replaced it with a new install (&lt;a href="http://cl.indiana.edu/wiki/FrontPage"&gt;here it is&lt;/a&gt;) and make it a bit more secure. We&amp;nbsp;&lt;a href="http://moinmo.in/HelpOnAccessControlLists#Usage_Examples"&gt;disallowed anonymous edits&lt;/a&gt;, and made it so that you can't just arbitrarily create accounts, which took a code change. I added the "if not request.user.isSuperUser() ..."&amp;nbsp;block (&lt;a href="http://moinmo.in/FeatureRequests/DisableUserCreation"&gt;suggested here&lt;/a&gt;) to MoinMoin/action/newaccount.py. The rest of the changes described on that page aren't necessary -- just make it refuse new account requests.&lt;br /&gt;&lt;br /&gt;Then it occurred to me: spammers have probably been trying to spam my personal wiki too! I checked: there were about a hundred spam accounts; a new one every day or two. My Moin was allowing arbitrary account creation, but they were all useless because only I could edit pages!&lt;br /&gt;&lt;br /&gt;So in the interest of discouraging future webcrap, let me issue a warning: CyrilleVincent, SabaFaulkner, CasinoBonus, life insurance quotes, and ChickyBowen -- I'm coming for you. And you'd best sleep with one eye open, paydayloansuk214. &lt;i&gt;If that's your real name.&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-1518873459676553676?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/1518873459676553676/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=1518873459676553676' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/1518873459676553676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/1518873459676553676'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2011/11/securing-your-moinmoin-wiki.html' title='securing your MoinMoin wiki'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-6543908152992877811</id><published>2011-10-09T00:04:00.001-04:00</published><updated>2011-10-09T00:08:44.942-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='culture'/><category scheme='http://www.blogger.com/atom/ns#' term='education'/><category scheme='http://www.blogger.com/atom/ns#' term='theology'/><category scheme='http://www.blogger.com/atom/ns#' term='philosophy'/><category scheme='http://www.blogger.com/atom/ns#' term='readings'/><title type='text'>reading: Religious Literacy by Stephen Prothero</title><content type='html'>Not too long ago, I read the very thought-provoking&amp;nbsp;&lt;i&gt;Religious Literacy: What Every American Needs to Know and Doesn't&lt;/i&gt;, by&amp;nbsp;&lt;a href="http://www.stephenprothero.com/"&gt;Stephen Prothero&lt;/a&gt;, likely because it came &lt;a href="http://parentingbeyondbelief.com/blog/?p=1842"&gt;recommended by Dale McGowan&lt;/a&gt;. The discussion of the history of religious education in the US is fantastic.&lt;br /&gt;&lt;br /&gt;The main argument of the book is that, until recent decades, we knew quite a lot about Protestantism, &amp;nbsp;through instruction at home, in churches, and even in the school system. People apparently used the verb "catechize", as something you did to children.&amp;nbsp;But this knowledge of what's actually in the Bible, and actual church doctrines is, these days, largely lost on us in the US, even though we're very caught up in our religious identities and church attendance is huge.&lt;br /&gt;&lt;br /&gt;Political discourse is full of religious allusions, but we often don't get the references. I would have appreciated more examples of problems that this causes in practice -- is it really an issue for being a citizen in a democracy?&lt;br /&gt;&lt;br /&gt;Prothero notes, early on, that Europeans are much less religious than Americans but more familiar with religious content. Dale McGowan says "faith is most easily sustained in ignorance"; knowing a thing or three about a few different religions makes it easier to not get caught up in any of them. Is the major problem caused by religious ignorance that it makes it easier for preachers and politicians to jerk people around by telling them that God says thus-and-such?&lt;br /&gt;&lt;br /&gt;While Prothero doesn't address the question of why the more broadly-educated Europeans don't tend to be churchgoers, he does put forth a policy suggestion, that our curricula should have more information about the world's religions. And while I agree that it's probably a good idea, he doesn't say much about the sorts of changes we might see, with better religious studies education.&amp;nbsp;I must admit, I have a hard time thinking of education-about-religion as anything except a strategy against the influence of seemingly-devout people.&lt;br /&gt;&lt;br /&gt;Perhaps I'll pick up his more recent book, &lt;i&gt;God Is Not One&lt;/i&gt;, about the fundamental disagreements between different religions, contrasting with the framing you'd get from &lt;a href="http://en.wikipedia.org/wiki/Huston_Smith"&gt;Huston Smith&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/Karen_Armstrong"&gt;Karen Armstrong&lt;/a&gt;, who argue that different religions are grasping towards the same fundamental truth.&amp;nbsp;I'm really curious about his personal position, because Prothero identifies himself as an Episcopalian, but hasn't thus far talked about any particular benefits of people believing any particular thing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-6543908152992877811?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/6543908152992877811/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=6543908152992877811' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/6543908152992877811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/6543908152992877811'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2011/10/reading-religious-literacy-by-stephen.html' title='reading: Religious Literacy by Stephen Prothero'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-3203295830721845478</id><published>2011-07-31T23:15:00.000-04:00</published><updated>2011-08-01T02:15:26.018-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ai'/><category scheme='http://www.blogger.com/atom/ns#' term='machine translation'/><category scheme='http://www.blogger.com/atom/ns#' term='nlp'/><category scheme='http://www.blogger.com/atom/ns#' term='language'/><title type='text'>cross-lingual word sense disambiguation</title><content type='html'>Have I mentioned what I've been working on recently? Maybe I haven't.&lt;br /&gt;&lt;br /&gt;In general, I'm working on cross-lingual &lt;a href="http://en.wikipedia.org/wiki/Word-sense_disambiguation"&gt;word- and phrase-sense disambiguation&lt;/a&gt;. WSD/PSD is the problem of deciding, for a given word or phrase, which meaning was intended, for some pre-defined sets of meanings. You might get the possible senses out of a dictionary, where they're nicely enumerated, or perhaps from WordNet. The stock example is "bank" -- is it the side of a river, or is it a building where they do financial services? Or, is it the abstract financial institution?&lt;br /&gt;&lt;br /&gt;There's a brilliant bit from the prescient Warren Weaver, from 1955 (&lt;a href="http://aclweb.org/anthology-new/J/J98/J98-1000.pdf"&gt;via&lt;/a&gt;):&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;If one examines the words in a book, one at a time as through an&amp;nbsp;opaque mask with a hole in it one word wide, then it is obviously&amp;nbsp;impossible to determine, one at a time, the meaning of the words . . . .&amp;nbsp;But if one lengthens the slit in the opaque mask, until one can see not&amp;nbsp;only the central word in question but also say N words on either side,&amp;nbsp;then if N is large enough one can unambiguously decide the meaning&amp;nbsp;of the central word . . . . The practical question is: "What minimum&amp;nbsp;value of N will, at least in a tolerable fraction of cases, lead to the&amp;nbsp;correct choice of meaning for the central word?&lt;/blockquote&gt;&lt;br /&gt;The "cross-lingual" kind of WSD means that we care about exactly the distinctions that cause you to pick a different word in a given target language, typically because the CLWSD system is meant to be integrated into an MT system; &lt;a href="http://aclweb.org/anthology-new/D/D07/D07-1007.pdf"&gt;that's becoming fashionable&lt;/a&gt;&amp;nbsp;(Carpuat and Wu, 2007). So in this setting, say if you're translating "bank" from English into Spanish, your system doesn't have to decide if it's the building or the institution that owns it -- it's still "banco". Now a riverbank is an "orilla".&lt;br /&gt;&lt;br /&gt;In the general case, your system might end up learning how to make distinctions that you as a human didn't know you had to make -- for example, I'm given to understand that Japanese doesn't have just one word for "brother", but "older brother" and "younger brother", which are different enough concepts that they get totally separate words.&lt;br /&gt;&lt;br /&gt;Making these choices is typically treated as a classification problem: you get some features for a bunch of instances of usage of a source word, and do supervised learning to get a classifier with (hopefully) good accuracy on the problem of predicting whether this is a "banco" usage or an "orilla" usage. The features are typically things like "which words are in the surrounding context?", or perhaps something fancier based on a parse of the sentence or knowledge about the document as a whole -- whatever you think will be predictive of what the target-language word should be. Hopefully your learning algorithm has some good way of filtering out irrelevant features.&lt;br /&gt;&lt;br /&gt;And then, once that's all put together, hopefully you have some extra signal to feed into your translation system, and it makes better word choices, and everybody's happy.&lt;br /&gt;&lt;br /&gt;And that's cross-lingual word/phrase-sense disambiguation!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-3203295830721845478?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/3203295830721845478/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=3203295830721845478' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/3203295830721845478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/3203295830721845478'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2011/08/cross-lingual-word-sense-disambiguation.html' title='cross-lingual word sense disambiguation'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-4875587377887438111</id><published>2011-06-05T19:06:00.001-04:00</published><updated>2011-06-05T19:06:59.597-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linguistics'/><category scheme='http://www.blogger.com/atom/ns#' term='readings'/><category scheme='http://www.blogger.com/atom/ns#' term='mind'/><category scheme='http://www.blogger.com/atom/ns#' term='language'/><title type='text'>Mr. Verb on metaphor</title><content type='html'>Oh, also: there was this great &lt;a href="http://mr-verb.blogspot.com/2011/06/intelligence-establishment-and-metaphor.html"&gt;Mr. Verb post&lt;/a&gt;, where they talk about government funding to do research on metaphor. Link to an article in The Atlantic:&amp;nbsp;&lt;a href="http://www.theatlantic.com/technology/archive/2011/05/why-are-spy-researchers-building-a-metaphor-program/239402/"&gt;Why Are Spy Researchers Building a 'Metaphor Program'&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;Here's &lt;a href="http://www.iarpa.gov/solicitations_metaphor.html"&gt;the job posting&lt;/a&gt;, which sounds &lt;i&gt;awesome,&lt;/i&gt;&amp;nbsp;except that it will probably ultimately lead to people getting exploded:&lt;br /&gt;&lt;blockquote&gt;The Metaphor Program will exploit the fact that metaphors are pervasive in everyday talk and reveal the underlying beliefs and worldviews of members of a culture. In the first phase of the two-phase program, performers will develop automated tools and techniques for recognizing, defining and categorizing linguistic metaphors associated with target concepts and found in large amounts of native-language text. The resulting conceptual metaphors will be validated using empirical social science methods. In the second phase, the program will characterize differing cultural perspectives associated with case studies of the types of interest to the Intelligence Community. Performers will apply the methodology established in the first phase and will identify the conceptual metaphors used by the various protagonists, organizing and structuring them to reveal the contrastive stances.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-4875587377887438111?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/4875587377887438111/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=4875587377887438111' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/4875587377887438111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/4875587377887438111'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2011/06/mr-verb-on-metaphor.html' title='Mr. Verb on metaphor'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-302647887015764452</id><published>2011-06-05T18:57:00.003-04:00</published><updated>2011-06-05T21:49:37.126-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linguistics'/><category scheme='http://www.blogger.com/atom/ns#' term='readings'/><category scheme='http://www.blogger.com/atom/ns#' term='mind'/><category scheme='http://www.blogger.com/atom/ns#' term='language'/><title type='text'>Metaphors We Live By</title><content type='html'>I just finished reading Lakoff and Johnson's &lt;cite&gt;&lt;a href="http://www.amazon.com/Metaphors-We-Live-George-Lakoff/dp/0226468011"&gt;Metaphors We Live By&lt;/a&gt;&lt;/cite&gt;. The most central claim of the book is that metaphor isn't just about language, but that it's a core part of cognition, and that a great deal of our experience is shaped by the metaphors that we use to understand the world.&lt;br /&gt;&lt;br /&gt;The authors talk a few times about how we understand love: is it more like a journey, or more like a collaborative work of art? Is a marriage like a partnership, or like a haven from the outside world? One's way of thinking about either of these things probably has a direct effect on experience and behavior.&lt;br /&gt;&lt;br /&gt;I'm left with some questions, though, and maybe you've got insights that you'd like to share. In the later chapters, the authors go on to say that understanding metaphor this way requires rethinking a lot of philosophy, particularly what it means to say that a sentence is true. I don't know enough about philosophy-of-language to say whether it's actually been shaken to its core (&lt;i&gt;philosophy is a physical structure&lt;/i&gt;), but fairly common sentences like "she's a cool drink of water" (&lt;i&gt;attractive person is refreshing&lt;/i&gt;), "he threw in the towel" (&lt;i&gt;this situation is a boxing match and he gave up&lt;/i&gt;) or even "I see what you mean" (&lt;i&gt;knowing/understanding is seeing&lt;/i&gt;) seem pretty hard to represent in propositional logic.&lt;br /&gt;&lt;br /&gt;I think I buy the argument that establishing their truth or falsity is possible only if you understand the metaphor that the speaker is using -- but it's a very typical case, that the speaker is using some metaphor or another. It's nearly impossible to speak or reason without using metaphors (&lt;i&gt;similarity is physical closeness&lt;/i&gt;), so maybe in general a good theory of meaning really does have to take this into account.&lt;br /&gt;&lt;br /&gt;Is there a point at which a metaphor becomes an honestly frozen form, though? What happens if you learn an expression without knowing its etymology, and just say it because it's that kind of situation? You learn a classifier for "throw in the towel" situations, and say it appropriately, but maybe you don't know anything about boxing. I'll start watching for this sort of situation: maybe it happens a lot.&lt;br /&gt;&lt;br /&gt;Also, do Lakoff and Johnson essentially agree or disagree with Doug Hofstadter, who says that &lt;a href="http://prelectur.stanford.edu/lecturers/hofstadter/analogy.html"&gt;analogy is the core of cognition&lt;/a&gt;? (&lt;a href="http://www.youtube.com/watch?v=n8m7lFQ3njk"&gt;the video of Doug's talk&lt;/a&gt; is totally worth watching).&lt;br /&gt;&lt;br /&gt;I'll probably read some of the more recent work on this: &lt;a href="http://markturner.org/mtcr.html"&gt;More than Cool Reason&lt;/a&gt;&amp;nbsp;(metaphor in poetry), and &lt;a href="http://books.google.com/books?id=R-4YBCYx6YsC&amp;amp;lpg=PR9&amp;amp;ots=WMem5FCjRK&amp;amp;dq=moral%20politics&amp;amp;lr&amp;amp;pg=PP1#v=onepage&amp;amp;q&amp;amp;f=true"&gt;Moral Politics&lt;/a&gt;&amp;nbsp;(metaphor in reasoning about politics) both sound really interesting, possibly even relevant to the real world.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-302647887015764452?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/302647887015764452/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=302647887015764452' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/302647887015764452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/302647887015764452'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2011/06/metaphors-we-live-by.html' title='Metaphors We Live By'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-3221096688787169167</id><published>2011-04-17T18:31:00.000-04:00</published><updated>2011-04-17T18:31:05.004-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='software engineering'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Python tip: 3.2 adds a memoization decorator</title><content type='html'>This is a really handy thing to have around, in case you've got expensive computations that you want done more than once. I've written a clumsier version of this myself, once or twice -- but it makes sense to have in the standard library!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://docs.python.org/py3k/library/functools.html#functools.lru_cache"&gt;http://docs.python.org/py3k/library/functools.html#functools.lru_cache&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There's some other neat stuff in the functools package too: currying and reducing. Pretty slick!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-3221096688787169167?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/3221096688787169167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=3221096688787169167' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/3221096688787169167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/3221096688787169167'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2011/04/python-tip-32-adds-memoization.html' title='Python tip: 3.2 adds a memoization decorator'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-5636948056445239221</id><published>2011-03-31T23:47:00.001-04:00</published><updated>2011-04-01T02:15:01.099-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='machine translation'/><category scheme='http://www.blogger.com/atom/ns#' term='culture'/><category scheme='http://www.blogger.com/atom/ns#' term='academia'/><category scheme='http://www.blogger.com/atom/ns#' term='research'/><category scheme='http://www.blogger.com/atom/ns#' term='language'/><title type='text'>CMU's Avenue Project</title><content type='html'>Before there was &lt;a href="http://www.cs.indiana.edu/~gasser/Research/hltdi.html"&gt;HLTDI&lt;/a&gt;, there was Carnegie Mellon's &lt;a href="http://www.cs.cmu.edu/~avenue/"&gt;Avenue Project&lt;/a&gt;, which seems to have had basically the same goal as us -- produce good machine translation systems for under-resourced languages, especially those spoken by under-resourced indigenous people.&lt;br /&gt;&lt;br /&gt;Avenue itself doesn't seem to have been under-resourced, though -- they sent people to South America (Chile, Peru, Bolivia...) to collect training data, and seemed to have a lot of contacts with local educators and language experts. They got quite a few papers out of this line of research, and apparently wrote a lot of good software. They had a much deeper pool of money (and arguably talent) than we do.&lt;br /&gt;&lt;br /&gt;And now... the website is dormant, the PhD students involved seem to have graduated, the data and software are not publicly available, and the researchers seem to have moved on to other things.&amp;nbsp;(one of the resulting doctors is the illimitable&amp;nbsp;&lt;a href="https://sites.google.com/site/katharinaprobst/"&gt;Kathrin Probst&lt;/a&gt;, who hipped me to Avenue when we were both at Google Atlanta, although I didn't really grasp how serious it was at the time -- darn her for being so humble!)&lt;br /&gt;&lt;br /&gt;They were pretty gracious in giving us the Quechua data that they collected (and said we could redistribute it), and I've been &lt;a href="http://hackmode.org/wiki/PapersFromAvenue"&gt;reading a bunch of their papers&lt;/a&gt;, but I'm left some sadness about the whole enterprise -- they surely already went through a lot of the problems that HLTDI is going to have to address. Why can't we just check out and fork their code?&lt;br /&gt;&lt;br /&gt;... maybe I should ask for their software too. Science is supposed to be easily replicable, isn't it?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-5636948056445239221?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/5636948056445239221/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=5636948056445239221' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/5636948056445239221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/5636948056445239221'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2011/03/cmus-avenue-project.html' title='CMU&apos;s Avenue Project'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-444918106591341841</id><published>2011-03-24T20:53:00.003-04:00</published><updated>2011-03-24T20:58:26.290-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='ui'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>did you know: F-Spot can export to picasa, flickr, etc!</title><content type='html'>If you're using &lt;a href="http://picasaweb.google.com/"&gt;Picasa Web Albums&lt;/a&gt;, and you're on Linux (maybe a small audience for this post), you don't have to manually upload your files on the web interface or use the &lt;a href="http://picasa.google.com/linux/"&gt;Picasa client&lt;/a&gt;. The Picasa client is OK, I guess, but it's actually a thinly veiled Windows app bundled with a version of Wine. It's not all that snappy, and it doesn't feel like the rest of the apps on the Linux desktop, and it's not open source.&lt;br /&gt;&lt;br /&gt;But! F-Spot is native, and well-integrated with Gnome, and Free Software... and it can &lt;a href="http://library.gnome.org/users/f-spot/unstable/picasa.html.en"&gt;very easily upload your photos to picasaweb&lt;/a&gt;, or other online photo-hosting places. That's pretty rad.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-444918106591341841?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/444918106591341841/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=444918106591341841' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/444918106591341841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/444918106591341841'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2011/03/did-you-know-f-spot-can-export-to.html' title='did you know: F-Spot can export to picasa, flickr, etc!'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-6559065577687574401</id><published>2011-02-24T16:24:00.001-05:00</published><updated>2011-02-24T19:23:03.161-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nlp'/><category scheme='http://www.blogger.com/atom/ns#' term='readings'/><title type='text'>Scripts, Plans, Goals and Understanding</title><content type='html'>So, years ago, &lt;a href="http://www.techweenie.org/"&gt;Kurt Eiselt&lt;/a&gt;, who was then a professor at Georgia Tech, did an independent study with me on NLP/NLU. It was pretty great, though mostly because it got me excited about the field. We wrote really simple parsers for really tiny subsets of English, in Common Lisp, and talked about how language might work cognitively. He had me get a copy of Schank and Abelson's classic &lt;i&gt;Scripts, Plans, Goals and Understanding&lt;/i&gt;. I read some of it, but for the most part, it's just sat on my shelf for the better part of a decade.&lt;br /&gt;&lt;br /&gt;Out of a sense of "geez, this is something I should have read, I'm an NLP researcher now", I've been working through it. It's kind of slow going: I find Schank kind of light on the details and heavy on the intuition, fairly vague. Maybe the later chapters have more detail about the story understanding system they purportedly built in the 70s.&lt;br /&gt;&lt;br /&gt;But if there's been a chunk that's worth reading, it's this, at the very end of chapter 5.&lt;br /&gt;&lt;blockquote&gt;John couldn't get a taxi, so he rode his horse downtown and into a restaurant. He beat up another customer and took a menu from him. He decided to have a steak. The waiter came along and John offered him a bottle of scotch if he listened to John tell him what he wanted to eat. John went to the kitchen and told the cook to give him a steak, because the cook could always deduct the gift from his income tax. When the cook refused, John offered to give him guitar lessons, and that worked. While John was eating the steak, the waiter came back and stole $10 from John's wallet. Then John got on his horse and rode out.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-6559065577687574401?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/6559065577687574401/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=6559065577687574401' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/6559065577687574401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/6559065577687574401'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2011/02/scripts-plans-goals-and-understanding.html' title='Scripts, Plans, Goals and Understanding'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-5703728614017735552</id><published>2011-02-22T17:15:00.001-05:00</published><updated>2011-02-22T17:16:38.971-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Python tip: dir() with no arguments</title><content type='html'>If you do Python, you probably knew that you can ask an object what it has on it by saying &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;dir(theobject)&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;I just found this out, though: you can also say &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;dir()&lt;/span&gt; with no arguments to find out everything that's in your current namespace. No more losing temporary variables that you forgot about earlier in the repl. It works for finding out which modules you have loaded, too. Holy cow.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; dir()&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;['__builtins__', '__doc__', '__name__', '__package__']&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; x = "this string is amazing"&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; dir()&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;['__builtins__', '__doc__', '__name__', '__package__', &lt;b&gt;'x'&lt;/b&gt;]&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-5703728614017735552?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/5703728614017735552/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=5703728614017735552' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/5703728614017735552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/5703728614017735552'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2011/02/python-tip-dir-with-no-arguments.html' title='Python tip: dir() with no arguments'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-4115274472018316237</id><published>2011-02-05T21:26:00.000-05:00</published><updated>2011-02-05T21:26:57.387-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='culture'/><category scheme='http://www.blogger.com/atom/ns#' term='nlp'/><category scheme='http://www.blogger.com/atom/ns#' term='linguistics'/><category scheme='http://www.blogger.com/atom/ns#' term='machine learning'/><title type='text'>Machine of Death Remix Corpus!</title><content type='html'>&lt;a href="http://machineofdeath.net/"&gt;Machine of Death&lt;/a&gt; is fantastic. And it turns out that most of the stories in &lt;i&gt;Machine of Death&lt;/i&gt; allow derivative works...&lt;br /&gt;&lt;br /&gt;And when I hear "derivative works", I think the word "remix". But what's a remix of a text? Cut-up poetry? n-gram models to generate ominous-sounding emails to your family? Counting how many times the word "of" appears? The original text, but with randomized capitalization? This is for you to decide. Well, it is now. Here's all the derivs-allowed stories, conveniently pulled out and converted to ASCII.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/narorumo/wiki/MachineOfDeathRemixCorpus"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Machine of Death Remix Corpus.&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Use this to train your poetry bot, or your story understanding system, or your unexpected other thing! Share and enjoy :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-4115274472018316237?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/4115274472018316237/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=4115274472018316237' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/4115274472018316237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/4115274472018316237'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2011/02/machine-of-death-remix-corpus.html' title='Machine of Death Remix Corpus!'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-9087781690191869568</id><published>2011-02-02T16:27:00.002-05:00</published><updated>2011-02-03T00:13:23.350-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nlp'/><category scheme='http://www.blogger.com/atom/ns#' term='academia'/><category scheme='http://www.blogger.com/atom/ns#' term='research'/><title type='text'>empiricism, faith, computational linguistics</title><content type='html'>&lt;a href="http://www.cs.indiana.edu/~gasser/"&gt;Mike&lt;/a&gt;  sent me a fantastic  piece by &lt;a href="http://www.d.umn.edu/~tpederse/"&gt;Ted Pederson&lt;/a&gt;, calling for NLP/CL researchers to care more about having reproducible results and maintainable software.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.aclweb.org/anthology/J/J08/J08-3010.pdf"&gt;Empiricism Is Not a Matter of Faith&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It's sad that this is a problem; it should be easy to get other researchers' software up and running, reproduce the results reported in papers, and plug things into other things -- but I think we're moving in that direction. At least one CL conference, &lt;a href="http://www.cicling.org/why_verify.htm"&gt;CICLING&lt;/a&gt;, explicitly calls for open software and reproducible results. Which is pretty cool.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-9087781690191869568?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/9087781690191869568/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=9087781690191869568' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/9087781690191869568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/9087781690191869568'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2011/02/empiricism-faith-computational.html' title='empiricism, faith, computational linguistics'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-3003327140740980604</id><published>2011-01-20T13:51:00.002-05:00</published><updated>2011-11-30T22:58:35.585-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='research'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='organization'/><category scheme='http://www.blogger.com/atom/ns#' term='wikis'/><title type='text'>keeping notes on a wiki</title><content type='html'>Stepping firmly into 2005, I decided to  keep notes and links and miscellanea on my own &lt;a href="http://hackmode.org/wiki"&gt;personal wiki&lt;/a&gt;! I'm trying to be better about remembering things, and also about keeping my stuff in a somewhat public, web-accessible place.&lt;br /&gt;&lt;br /&gt;And I really like MoinMoin! It was &lt;a href="http://hackmode.org/wiki/WikiSetUpNotes"&gt;easy to set up on our Ubuntu server&lt;/a&gt;. Up until now, I've mostly just kept a bunch of text files in version  control, organized chronologically. But a wiki can be nonlinear, which  is cool. Maybe sooner or later, my labmates will wiki with me on a shared wiki space...&lt;br /&gt;&lt;br /&gt;How do you manage notes to yourself? Do you use a physical notebook? Some other kind of software? (where does it run?)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-3003327140740980604?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/3003327140740980604/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=3003327140740980604' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/3003327140740980604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/3003327140740980604'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2011/01/keeping-notes-on-wiki.html' title='keeping notes on a wiki'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-2194674008590150833</id><published>2010-11-27T01:44:00.001-05:00</published><updated>2010-11-27T01:46:37.152-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linguistics'/><category scheme='http://www.blogger.com/atom/ns#' term='language'/><title type='text'>"What a good blog post this is."</title><content type='html'>You don't happen to know what this phenomenon is called, do you? I've been looking around, and haven't managed to Google it yet.&lt;br /&gt;&lt;br /&gt;(1) What a tall guy he is.&lt;br /&gt;(2) I just realized what a tall guy he is.&lt;br /&gt;&lt;br /&gt;That's definitely not the same thing as the question word being in front and, say, being the object of the verb...&lt;br /&gt;(3) What did the dog knock over?&lt;br /&gt;&lt;br /&gt;You can't rearrange (1) such that the "what" goes away.&lt;br /&gt;(4) * He is what a tall guy.&lt;br /&gt;&lt;br /&gt;If you were going to draw a parse tree, what would it look like? Surely a lot of ink has been spilled about it? I don't even know what it's called for sure. Something like a "wh-exclamatory statement"?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-2194674008590150833?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/2194674008590150833/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=2194674008590150833' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/2194674008590150833'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/2194674008590150833'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2010/11/what-good-blog-post-this-is.html' title='&quot;What a good blog post this is.&quot;'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-6022253173658012473</id><published>2010-10-23T01:22:00.001-04:00</published><updated>2010-10-23T01:22:36.564-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='machine translation'/><category scheme='http://www.blogger.com/atom/ns#' term='academia'/><title type='text'>workshop on FOSS machine translation!</title><content type='html'>&lt;a href="http://www.uoc.edu/freerbmt11/"&gt;Second International Workshop on Free/Open-Source Rule-Based Machine Translation&lt;/a&gt;. And it's in Barcelona! What could possibly be better?&lt;br /&gt;&lt;br /&gt;I should probably go to this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-6022253173658012473?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/6022253173658012473/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=6022253173658012473' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/6022253173658012473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/6022253173658012473'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2010/10/workshop-on-foss-machine-translation.html' title='workshop on FOSS machine translation!'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-1417440127184608472</id><published>2010-10-23T00:45:00.001-04:00</published><updated>2010-10-23T01:07:24.292-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='machine translation'/><category scheme='http://www.blogger.com/atom/ns#' term='linguistics'/><category scheme='http://www.blogger.com/atom/ns#' term='academia'/><category scheme='http://www.blogger.com/atom/ns#' term='research'/><category scheme='http://www.blogger.com/atom/ns#' term='language'/><title type='text'>extended abstract for a workshop, MTMRL</title><content type='html'>On Wednesday, I submitted a mini-writeup of my project this semester to the &lt;a href="http://http://cl.haifa.ac.il/MT/"&gt;Machine Translation and Morphologically-rich Languages&lt;/a&gt; workshop. My code definitely isn't in a useful state yet, but they say that works-in-progress are OK.&lt;br /&gt;&lt;br /&gt;I'll let you know if my project gets accepted. The workshop is in Israel, which would be a really interesting place to visit!&lt;br /&gt;&lt;br /&gt;Here's what I wrote:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Abstract&lt;/b&gt;&lt;blockquote&gt;Here we describe a work-in-progress approach for learning valencies of verbs in a morphologically rich language using only a morphological analyzer and an unannotated corpus. We will compare the results from applying this approach to an unannotated Arabic corpus with those achieved by processing the same text in treebank form. The approach will then be applied to an unannotated corpus from Quechua, a morphologically rich but resource-scarce language.&lt;/blockquote&gt;&lt;a href="http://www.cs.indiana.edu/~alexr/nonpubs/mt-mrl.html"&gt;See the rest here&lt;/a&gt;; it's short! (&lt;a href="http://www.cs.indiana.edu/~alexr/nonpubs/mt-mrl.pdf"&gt;or as a pdf&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Just in case you're not familiar with the idea of valency for verbs: &lt;a href="http://en.wikipedia.org/wiki/Valency_(linguistics)"&gt;wikipedia&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-1417440127184608472?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/1417440127184608472/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=1417440127184608472' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/1417440127184608472'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/1417440127184608472'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2010/10/extended-abstract-for-workshop-mtmrl.html' title='extended abstract for a workshop, MTMRL'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-1201050602301737854</id><published>2010-09-22T16:12:00.010-04:00</published><updated>2010-09-23T20:44:06.589-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linguistics'/><category scheme='http://www.blogger.com/atom/ns#' term='mind'/><category scheme='http://www.blogger.com/atom/ns#' term='language'/><title type='text'>apparently you're wrong about what's grammatical in your language</title><content type='html'>From Liliane Haegeman's &lt;em&gt;Introduction to Government and Binding Theory&lt;/em&gt;.&lt;blockquote&gt;7e. Once that [that Bill had left] was clear, we gave up.&lt;br /&gt;&lt;br /&gt;The sentence is odd for most native speakers: it is not acceptable. However, this sentence is formed according to the same principle that we posited to account for the formation of (7b)-(7d), i.e., that one sentence may become part of another sentence. Hence (7e) would be &lt;b&gt;grammatical&lt;/b&gt;, though it is not acceptable.&lt;br /&gt;&lt;br /&gt;Faced with intuitions such as that for (7e) the linguist might decide to modify the grammar he has formulated in such a way that sentence (7e) is considered to be ungrammatical. He may also decide, however, that (7e) is grammatical, and that the unacceptability of the sentence is due to independent reasons. For instance, (7e) may be argued to be unacceptable because the sentence is hard to process. In the latter case the unacceptability is not strictly due to linguistic factors but is due to the more general mechanisms used for processing information.&lt;br /&gt;&lt;br /&gt;The native speaker who judges a sentence cannot decide whether it is grammatical. He only has &lt;b&gt;intuitions&lt;/b&gt; about &lt;b&gt;acceptability&lt;/b&gt;. It is for the linguist to determine whether the unacceptability of a sentence is due to grammatical principles or whether it may be due to other factors. It is the linguist's task to determine what makes (7e) unacceptable.&lt;/blockquote&gt;As a linguist, I'm going to tell you that your na&amp;iuml;ve intuition that this sentence is ungrammatical is just because you're not smart enough to process the grammatical rules that you know subconsciously -- rules that are in fact &lt;a href="http://en.wikipedia.org/wiki/Universal_grammar"&gt;mostly encoded in your DNA&lt;/a&gt;. What?&lt;br /&gt;&lt;br /&gt;Seriously: I'd posit that, if your theory about a language doesn't account for what actual native speakers count as a valid sentence, then your theory is wrong! Is Haegeman representing the general Chomskyan position correctly here?&lt;br /&gt;&lt;br /&gt;Our goal as scientists is to account for what happens observably. In what way does a proposed grammar of a language count as a falsifiable scientific theory if you can just say "in reality, that sentence is grammatical -- there were just processing difficulties"?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-1201050602301737854?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/1201050602301737854/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=1201050602301737854' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/1201050602301737854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/1201050602301737854'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2010/09/apparently-youre-wrong-about-whats.html' title='apparently you&apos;re wrong about what&apos;s grammatical in your language'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-3197003010885611000</id><published>2010-08-23T23:36:00.009-04:00</published><updated>2010-09-10T13:07:09.585-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='culture'/><category scheme='http://www.blogger.com/atom/ns#' term='linguistics'/><category scheme='http://www.blogger.com/atom/ns#' term='readings'/><category scheme='http://www.blogger.com/atom/ns#' term='languages'/><title type='text'>Don't Sleep, There Are Snakes</title><content type='html'>I just recently finished reading &lt;cite&gt;Don't Sleep, There Are Snakes&lt;/cite&gt; by &lt;a href="http://en.wikipedia.org/wiki/Daniel_Everett"&gt;Dan Everett&lt;/a&gt;; it's about the &lt;a href="http://en.wikipedia.org/wiki/Pirah%C3%A3_people"&gt;Pirahã&lt;/a&gt; people of the Amazon, and the years that he spent with them, originally as a missionary, but then as a linguist.&lt;br /&gt;&lt;br /&gt;Everett has great stories to tell, and his telling of them is exciting -- moving to a tiny riverside village in the middle of the jungles of Brazil, with your family, sounds crazy. I can't imagine bringing small children into the rain forest...&lt;br /&gt;&lt;br /&gt;His descriptions of the Pirahã culture and language are also fantastic; the Pirahã people only really want to talk about things they've experienced directly, and are largely uninterested in ideas and techniques from the outside world. It's basically not done for them to talk about things that no living Pirahã has seen. They don't appear to have a creation myth of their own, and aren't very much into creation myths that missionaries might have to offer.&lt;br /&gt;&lt;br /&gt;And the language has all of these wild properties: most notably, it doesn't seem to feature arbitrary-depth recursion, so its modifiers don't stack, there aren't dependent clauses, and apparently the language doesn't have conjunctions at all. Also it can apparently be whistled or hummed, and it has &lt;a href="http://en.wikipedia.org/wiki/Evidentiality"&gt;evidentiality&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;The whistle-ability and evidentiality aren't unknown among the world's languages; they just seem strange relative to most of us. The lack of recursion, though, throws into doubt a lot of what we think is inherent and unique in human language. Everett's claims have apparently caused a nontrivial amount of ink and vitriol to be spilled; he's been personally called a charlatan by Chomsky (according to wikipedia).&lt;br /&gt;&lt;br /&gt;So, altogether: I enjoyed reading it quite a lot. Everett writes compellingly about his (and his family's) adventures trying to live in the rain forest, about the Pirahã people, about language and cognition and culture, and about his losing his faith gradually, on being confronted with a people who aren't much into abstractions or things that happened centuries ago -- and in fact don't talk about them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-3197003010885611000?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/3197003010885611000/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=3197003010885611000' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/3197003010885611000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/3197003010885611000'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2010/08/dont-sleep-there-are-snakes.html' title='Don&apos;t Sleep, There Are Snakes'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-3658692623175556820</id><published>2010-07-04T01:11:00.002-04:00</published><updated>2010-07-04T01:27:15.001-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='ui'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>disabling the popups on links on wordpress</title><content type='html'>So, those blogs you read, very nice blogs, on wordpress.com. They have these giant things that pop up when you roll over links.&lt;br /&gt;&lt;br /&gt;Maybe you've thought about how to get rid of them, but haven't done it yet? (they're called "&lt;a href="http://lorelle.wordpress.com/2006/12/29/wordpresscom-please-stop-using-snap-preview/"&gt;Snap Previews&lt;/a&gt;...")&lt;br /&gt;&lt;br /&gt;There are a few ways to make them gone. If you just add shots.snap.com to your AdBlock (&lt;a href="http://en.wikipedia.org/wiki/Hosts_(file)#Internet_resources_blocking"&gt;or your /etc/hosts file&lt;/a&gt;), then that'll solve the problem.&lt;br /&gt;&lt;br /&gt;Another alternative is politely asking them to not pop up; you can set an option by clicking the little "gear" icon when the window does come up. That'll store your preference in a cookie for who-knows how long.&lt;br /&gt;&lt;br /&gt;I just put this line in my /etc/hosts, though.&lt;br /&gt;&lt;code&gt;127.0.0.1 shots.snap.com&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-3658692623175556820?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/3658692623175556820/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=3658692623175556820' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/3658692623175556820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/3658692623175556820'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2010/07/disabling-popups-on-links-on-wordpress.html' title='disabling the popups on links on wordpress'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-8931789835023572310</id><published>2010-06-22T02:00:00.000-04:00</published><updated>2010-06-22T02:02:20.531-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nlp'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>May I present: kompressr</title><content type='html'>&lt;div&gt;&lt;a href="http://kompressr.appspot.com/"&gt;&lt;span style="font-size:200%"&gt;kompressr: make text shorter harnessing the power of acronyms (MTSHTPOA)&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Try it out, let me know what you think and if it breaks :) Should be useful for making long papers shorter, by automatically extracting acronyms and using them wherever possible.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Public beta!&lt;sup&gt;&lt;small&gt;tm&lt;/small&gt;&lt;/sup&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(running on App Engine, with NLTK!)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-8931789835023572310?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/8931789835023572310/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=8931789835023572310' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/8931789835023572310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/8931789835023572310'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2010/06/may-i-present-kompressr.html' title='May I present: kompressr'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-18299982448957385</id><published>2010-05-26T22:45:00.004-04:00</published><updated>2010-05-26T23:58:28.775-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='unix'/><category scheme='http://www.blogger.com/atom/ns#' term='ui'/><category scheme='http://www.blogger.com/atom/ns#' term='languages'/><title type='text'>quick commandline trick: find files that you can write to</title><content type='html'>Here's a trick I found useful today:&lt;br /&gt;&lt;span style="font-size:150%"&gt;&lt;code&gt;find . -writable -type f&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;tt&gt;find&lt;/tt&gt; (&lt;a href="http://manpages.ubuntu.com/manpages/lucid/en/man1/find.1.html"&gt;rtfm&lt;/a&gt;) can do all kinds of crazy things. What this does is list out all the files under the current directory that aren't directories, and that you have write access to. Useful for Perforce users -- in p4, if a file is writable, either you're editing it in a change list, or you just accidentally made it writable and you &lt;em&gt;should&lt;/em&gt; be editing it in a change list.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-18299982448957385?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/18299982448957385/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=18299982448957385' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/18299982448957385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/18299982448957385'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2010/05/quick-commandline-trick-find-files-that.html' title='quick commandline trick: find files that you can write to'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-2854415107419377756</id><published>2010-05-18T02:14:00.005-04:00</published><updated>2010-05-18T02:24:19.216-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nlp'/><category scheme='http://www.blogger.com/atom/ns#' term='linguistics'/><category scheme='http://www.blogger.com/atom/ns#' term='school'/><category scheme='http://www.blogger.com/atom/ns#' term='readings'/><category scheme='http://www.blogger.com/atom/ns#' term='machine learning'/><title type='text'>the literature: Realization with CCG</title><content type='html'>My "Alternative Syntactic Theories" class this semester was pretty interesting. I'd only spent so much time thinking about the difficulties that you face when trying to come up with a good formalism for describing the syntax of human languages. It's a big hairy problem! So this was a good exercise for me.&lt;br /&gt;&lt;br /&gt;For my project for the class, I read a bunch of papers by the great &lt;a href="http://www.ling.ohio-state.edu/~mwhite/"&gt;Michael White&lt;/a&gt; about the work that he and his colleagues have been doing on realization (aka generating text) with &lt;a href="http://openccg.sourceforge.net/"&gt;OpenCCG&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If you're interested in CCG, text generation, or text generation with CCG...&lt;br /&gt;- &lt;a href="http://tinyurl.com/alexr-ccg-generation"&gt;Here are my presentation slides&lt;/a&gt;&lt;br /&gt;- and here's my writeup about it: &lt;a href="http://www.cs.indiana.edu/~alexr/nonpubs/alexr-ccg-generation.html"&gt;html&lt;/a&gt;, &lt;a href="http://www.cs.indiana.edu/~alexr/nonpubs/alexr-ccg-generation.pdf"&gt;pdf&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-2854415107419377756?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/2854415107419377756/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=2854415107419377756' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/2854415107419377756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/2854415107419377756'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2010/05/literature-realization-with-ccg.html' title='the literature: Realization with CCG'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-863715934854971310</id><published>2010-05-01T00:40:00.004-04:00</published><updated>2010-05-01T00:52:21.851-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='theology'/><category scheme='http://www.blogger.com/atom/ns#' term='review'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>nice wireless card for Ubuntu: TP-Link TL-WN651G</title><content type='html'>I just got my &lt;a href="http://www.amazon.com/gp/product/B000N43QN6"&gt;TP-Link TL-WN651G&lt;/a&gt; wireless card, popped it in the computer, and it Just Worked. (Ubuntu Karmic, 9.10).&lt;br /&gt;&lt;br /&gt;It uses the Atheros chipset (Atheros AR5001X+), and Ubuntu figures it right out, with the ath5k wireless driver.&lt;br /&gt;&lt;br /&gt;So if you're looking for an inexpensive PCI wireless card that you can use on Linux without using a binary blob and ndiswrapper, this is a good choice!&lt;br /&gt;&lt;br /&gt;Hooray :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-863715934854971310?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/863715934854971310/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=863715934854971310' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/863715934854971310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/863715934854971310'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2010/05/nice-wireless-card-for-ubuntu-tp-link.html' title='nice wireless card for Ubuntu: TP-Link TL-WN651G'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-2691114733615941162</id><published>2010-04-26T15:29:00.004-04:00</published><updated>2010-04-26T15:42:07.979-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='machine translation'/><category scheme='http://www.blogger.com/atom/ns#' term='research'/><category scheme='http://www.blogger.com/atom/ns#' term='machine learning'/><category scheme='http://www.blogger.com/atom/ns#' term='language'/><title type='text'>what I'm working on: XDG and weighted constraint solving</title><content type='html'>&lt;span style="font-style: italic;"&gt;Abstract:&lt;/span&gt; It turns out that coordination (the use of conjunctions) is really hard for most grammatical theories. We're working on ways to handle it with graceful failure by selectively relaxing constraints in our constraint-based parser -- ideally we can come up with an approach for handling unfamiliar grammatical structures just by tweaking the weights on our constraints.&lt;br /&gt;&lt;br /&gt;Slides from Tuesday's talk:&lt;br /&gt;&lt;div&gt;&lt;a href="http://www.cs.indiana.edu/%7Egasser/CLCT10.2/"&gt;Mike's slides&lt;/a&gt;: background for the project&lt;/div&gt;&lt;div&gt;&lt;a href="http://tinyurl.com/alexr-wcsp-cookietalk"&gt;My slides&lt;/a&gt;: recent progress with weighted constraint solving&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;So in the previous post...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In the previous post, I discussed dependency grammar, XDG, and introduced why coordination is hard for DG. The plan for our current work is to allow some of the constraints described by the grammar to be broken, such that we can get reasonable parses from input sentences that we know are valid.&lt;br /&gt;&lt;br /&gt;This fairly simple case of English coordination is hard to describe with our formalism, and as we expand our system to handle new languages, we're certainly not going to have complete grammars. It would also be nice if we could handle sentences with actual mistakes, but that'll have to be future work.  In general, we'd like to be able to tweak our system to (badly) support sentences that our grammar doesn't explicitly handle just by finding out which constraints to relax. There may be other cases where we need to make changes to the grammar, but we'd like to avoid that as much as possible.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Engineering issues and weighted constraint solving&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Getting to the point where we can relax constraints and "fail gracefully" took some programming work. XDG so far has only used hard constraints, which means that if one of the rules for the grammar can't be satisfied, then the parser just gives up and you don't get a parse. The original XDG implementation is done in &lt;a href="http://www.mozart-oz.org/"&gt;Mozart/Oz&lt;/a&gt;, which has constraint programming built right into the language; Mike's version uses &lt;a href="http://labix.org/python-constraint"&gt;python-constraint&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So what I did, is I hooked our parser up to a "weighted" constraint solver, &lt;a href="http://carlit.toulouse.inra.fr/cgi-bin/awki.cgi/ToolBarIntro"&gt;toulbar2&lt;/a&gt;. It's actively under development by friendly researchers at INRA, from &lt;span style="font-style: italic;"&gt;Toul&lt;/span&gt;ouse and &lt;span style="font-style: italic;"&gt;Bar&lt;/span&gt;celona.&lt;br /&gt;&lt;br /&gt;Weighted constraint solving is pretty simple. We define a problem, which contains a bunch of constraints, and each constraint pertains to some variables. A solution to the problem is a total assignment to all of the variables, and each solution has some penalty associated with it, due to violating constraints. There's a cost to violating each constraint. To solve a problem, you just have to say what the variables and constraints and costs are, and what the maximum cost you're willing to accept is.&lt;br /&gt;&lt;br /&gt;toulbar2 is really fast. It's written in C++ and has some clever solving algorithms. Once it gets rolling, it can parse a sentence with a bunch of lexical ambiguity and an embedded clause, "the old man that argues eats", in about three seconds. For comparison, python-constraint takes 70 to 90.&lt;br /&gt;&lt;br /&gt;The only problem with this is that to run toulbar2, we first have to translate the problem into the standard WCSP format, which takes several steps:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;list each constraint and the variables involved (OK, easy)&lt;/li&gt;&lt;li&gt;write down the "default cost" for each constraint (OK, easy -- it's 0.)&lt;/li&gt;&lt;li&gt;store a mapping for all of our variables and their domains, since toulbar2's format wants everything to be an integer (OK.)&lt;/li&gt;&lt;li&gt;write down every single non-default assignment to the relevant variables (OH NOES COMBINATORIAL EXPLOSION.)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;This is a problem because (a) we don't know ahead of time which assignments are going to violate the constraint, and (b) there still may be quite a few of them. Going through all possible assignments for each constraint is expensive both in I/O and in dumb combinatorial search. (NB: it's still much smaller than the search space for the problem as a whole, since each constraint only pertains to some of the variables in the problem!)&lt;br /&gt;&lt;br /&gt;To get around the worst part of this problem, I came up with a dumb hack that I rather like: skip constraints where there are more than 15 variables, and let toulbar2 over-generate solutions. After the toulbar2 solver returns, then just prune down the solutions that went over-cost.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Parsing a simple sentence with coordination&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Getting a parse that I like for "Dolores and Jake eat yogurt", where there are subject links from eat to both "Dolores" and "Jake", and "and" is unconnected, only required a few tweaks, done by hand:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Allow motherless nodes (code change, not good)&lt;/li&gt;&lt;li&gt;add CONJ as a part of speech (grammar change)&lt;/li&gt;&lt;li&gt;Allow breaking these three principles: valency (to allow for more than one subject), tree (every node has exactly 1 mother), and agree (eg, agreement between subjects and verbs)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;The problem with this is that this is just one parse among many many that are generated, and the one that I wanted was the 30th generated. The approach here, simply allowing a given principle to be broken, is way too coarse. We shouldn't just say "valency constraints can be broken", we should have more fine-grained features that encode "valency between what"!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Next steps: Optimization problem&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Once we write down these features, we can treat tweaking the costs as an optimization problem, where our parameters are the costs for violating each kind of constraint, and maximum cost. We'll consider the grammar and the test sentences as fixed.&lt;br /&gt;&lt;br /&gt;We want to know: how can we set the parameters so that we can parse the good sentences, but not the bad ones? And can we get parses that we like? There are many different incomplete parses that we could assign to a sentence -- which one of them should we reward?&lt;br /&gt;&lt;br /&gt;To get started on this problem, we just need to know which constraints need to be relaxed so that the desired parse is in there somewhere, and after that, we can (hopefully) optimize the parameters with something like simulated annealing or genetic algorithms.&lt;br /&gt;&lt;br /&gt;What I don't have an idea about yet is how to know what kinds of sentences will require tweaks to the grammar, or worse, to the parser code, in order to get sensible parses. For example, to get this coordination example to work, I had to make both of these kinds of changes, even if they were small -- the grammar had no idea about conjunctions, even conjunctions with no arcs attached to them, and the parser threw an exception if a word had no arcs attached.&lt;br /&gt;&lt;br /&gt;From an engineering perspective, there's a lot left to do to speed up the parser. This will probably involve finding a tighter way to integrate toulbar2 with our XDG system, and I'm imagining some clever ways to avoid having to list out all the possible assignments after the first time, so the optimization process won't take forever.&lt;br /&gt;&lt;br /&gt;Questions and suggestions gratefully accepted :) Thanks for reading!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-2691114733615941162?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/2691114733615941162/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=2691114733615941162' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/2691114733615941162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/2691114733615941162'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2010/04/what-im-working-on-xdg-and-weighted.html' title='what I&apos;m working on: XDG and weighted constraint solving'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-7571379347908129892</id><published>2010-04-25T20:20:00.006-04:00</published><updated>2010-04-25T20:34:09.916-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='machine translation'/><category scheme='http://www.blogger.com/atom/ns#' term='research'/><category scheme='http://www.blogger.com/atom/ns#' term='machine learning'/><category scheme='http://www.blogger.com/atom/ns#' term='language'/><title type='text'>what I'm working on: Dependency Grammar and XDG</title><content type='html'>&lt;div&gt;&lt;i&gt;Abstract:&lt;/i&gt; It turns out that coordination (the use of conjunctions) is really hard for most grammatical theories. We're working on ways to handle it with graceful failure by selectively relaxing constraints in our constraint-based parser -- ideally we can come up with an approach for handling unfamiliar grammatical structures just by tweaking the weights on our constraints.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This post and the next one (forthcoming!) are basically a talk that &lt;a href="http://www.cs.indiana.edu/~gasser"&gt;Mike&lt;/a&gt; and I gave on Tuesday.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you like slides, here are the slides:&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.cs.indiana.edu/~gasser/CLCT10.2/"&gt;Mike's slides&lt;/a&gt;: background for the project&lt;/div&gt;&lt;div&gt;&lt;a href="http://tinyurl.com/alexr-wcsp-cookietalk"&gt;My slides&lt;/a&gt;: recent progress with weighted constraint solving&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;b&gt;About Dependency Grammar and XDG&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For our translation system, we're using a &lt;a href="http://en.wikipedia.org/wiki/Dependency_grammar"&gt;dependency grammar&lt;/a&gt; formalism called XDG, the Extensible Dependency Grammar. In dependency grammar, instead of representing your analysis of a sentence as a tree of nested phrases, you're interested in the individual relationships between words (eg, "this noun is the subject of this verb"), so the analysis of a sentence ends up being a directed graph with labeled arcs, instead of a tree of phrases, like you might have with &lt;a href="http://en.wikipedia.org/wiki/Phrase_structure_grammar"&gt;phrase-structure grammars&lt;/a&gt;. There are nice diagrams of this in Mike's slides. XDG was developed by &lt;a href="http://www.ps.uni-saarland.de/~rade/"&gt;Ralph Debusmann&lt;/a&gt; in his doctoral work -- his implementation of it is done in Mozart/Oz, and we're working on a new one in Python.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are several competing DGs, of course.  But XDG has a few nice properties that set it apart from other approaches, and one of them is that it's constraint-based. The task of producing a parse is expressed as a constrained search; there are rules in the grammar associated with each word (or class of words) that say things like "I'm a verb, and I need a subject, and it must come before me". So when we start to try to analyze a sentence, we list all of the possible links between words, find all of the constraints that apply, and then set a general-purpose constraint solver on the problem.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Another other neat thing about XDG is that it's multi-layered -- an analysis is actually a multigraph. So some of the links in the analysis represent syntax (or even different aspects of syntax, as we're doing for English), and some of them can represent your semantic model. And there are constraints that describe the relationships between different layers. In the next few months, we want to replace "semantic model" with "syntax of the target language for the translation"!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So XDG has these functions called "principles", and when these are run, they add to the list of constraints on the analysis. Some of them include the principle that the analysis should be a tree, or a planar graph (called "projectivity" in Linguistics World), and that we get other desiderata like verbs agreeing with their nouns. ("she jumps" is OK, but not "they jumps")&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This works out pretty well, actually. In his dissertation, Debusmann comes up with fairly broad-coverage grammars for English and German, both of which have some involved syntax. What his grammars don't cover, though, is coordination -- he doesn't have support for conjunctions at all. &lt;i&gt;It turns out that conjunctions are really hard for most grammar formalisms.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;It's especially bad for dependency grammar because it seems like an inherently phrasal thing. What's the subject of this sentence?&lt;/div&gt;&lt;blockquote&gt;Jake and Dolores eat yogurt.&lt;/blockquote&gt;&lt;div&gt;You really want to say that it's "Jake and Dolores", but DG can't do that! Each link in the parse goes from one word to one other word. And there's a constraint that says that each verb has only one subject. What to do?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Worse, the sort of sentence that syntacticians seem to love: "Dolores makes and Max delivers yogurt" -- the two verbs here seem to share a direct object. But our "tree principle" says that each word in the graph should only have one head.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Well, let's break the constraints!&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;... that's the next post, in preparation!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-7571379347908129892?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/7571379347908129892/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=7571379347908129892' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/7571379347908129892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/7571379347908129892'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2010/04/what-im-working-on-dependency-grammar.html' title='what I&apos;m working on: Dependency Grammar and XDG'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-6686353289288818248</id><published>2010-04-20T23:29:00.008-04:00</published><updated>2010-04-21T00:26:10.971-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='machine translation'/><category scheme='http://www.blogger.com/atom/ns#' term='research'/><title type='text'>what I'm working on: L3 overview</title><content type='html'>&lt;div&gt;I haven't been writing much about what I'm working on. So let me tell you! If you prefer code to text about code: &lt;a href="http://code.google.com/p/hltdi-l3/"&gt;here's our project&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm working with the &lt;a href="http://www.cs.indiana.edu/~gasser/Research/hltdi.html"&gt;HLTDI group&lt;/a&gt; at IU, with Prof. Mike Gasser. Our &lt;a href="http://www.cs.indiana.edu/~gasser/Research/projects.html"&gt;goal&lt;/a&gt; is to do machine translation for medium-sized languages (say, those with a few million speakers) that don't have a lot of money behind them, and thus, not a lot of training data available. There are &lt;a href="http://www.cs.cmu.edu/~avenue/"&gt;projects&lt;/a&gt; at other universities to do similar things, so we're definitely not alone. A lot of people would like to have good MT for "minority languages".&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You might be familiar with &lt;a href="http://en.wikipedia.org/wiki/Statistical_machine_translation"&gt;statistical machine translation&lt;/a&gt;, which is all the rage right now, and with good reason! It works impressively well in cases where you have enough training data to sensibly cover the space of sentences that you'd like to translate. &lt;a href="http://www.nytimes.com/2010/03/09/technology/09translate.html"&gt;This is what Google is doing&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's not what we're doing, for three reasons: (1) for the languages that we'd like to handle, &lt;a href="http://en.wikipedia.org/wiki/Quechua"&gt;Quechua&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Amharic"&gt;Amharic&lt;/a&gt;, there's some training data available, but not nearly enough to get a good SMT system going. (2) Both of these languages happen to have really complex morphology, so the probability of seeing a given word is extremely low, since so many different words are possible, and (3) we're not doing translation at all, yet. (but we will.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Since we won't have enough training text to infer what we need from examples, we're going to have to make claims about what the grammars of our target languages are, and build parsers based on that. We'll see how much of the task we can off-load to machine learning over time, but we're prepared to do some grammar engineering if we need to. It turns out, thankfully, that when a language has complex morphology, it tends to have simpler syntax! You have to put the information somewhere.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So what we do have, is a bunch of &lt;a href="http://www.cs.indiana.edu/~gasser/Research/software.html"&gt;morphological analyzers&lt;/a&gt; that Mike made, and we're working on &lt;a href="http://code.google.com/p/hltdi-l3/"&gt;the parser&lt;/a&gt;, which is going to grow to be the whole MT system once we work out how to make our grammar formalism generate the output language while it's parsing the input language, what you might call "&lt;a href="http://www.google.com/search?sourceid=chrome&amp;amp;ie=UTF-8&amp;amp;q=synchronous+grammar"&gt;synchronous grammar&lt;/a&gt;".&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;More about the parser and what I've been working on there, in the next post!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-6686353289288818248?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/6686353289288818248/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=6686353289288818248' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/6686353289288818248'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/6686353289288818248'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2010/04/what-im-working-on-l3-overview.html' title='what I&apos;m working on: L3 overview'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-4109814817188903949</id><published>2010-04-13T20:16:00.004-04:00</published><updated>2010-04-13T20:30:32.071-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='culture'/><category scheme='http://www.blogger.com/atom/ns#' term='linguistics'/><category scheme='http://www.blogger.com/atom/ns#' term='language'/><title type='text'>my dialect and subjunctive verbs</title><content type='html'>I got corrected on &lt;a href="http://en.wikipedia.org/wiki/English_subjunctive#To_express_a_doubt_or_supposition"&gt;subjunctive verb usage&lt;/a&gt; today, which I found odd enough to blog about.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My utterance was something like: "If it was..." -- and I got interrupted with "if it &lt;b&gt;were&lt;/b&gt;". My immediate response: "My dialect doesn't do that."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Rudeness aside, what would you say, and under what circumstances? What are the odds, do you think, that my interlocutor has the "if I be..." construction?&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-4109814817188903949?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/4109814817188903949/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=4109814817188903949' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/4109814817188903949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/4109814817188903949'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2010/04/my-dialect-and-subjunctive-verbs.html' title='my dialect and subjunctive verbs'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-8274667878417036583</id><published>2010-03-27T23:24:00.006-04:00</published><updated>2010-03-27T23:45:10.984-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='culture'/><category scheme='http://www.blogger.com/atom/ns#' term='theology'/><category scheme='http://www.blogger.com/atom/ns#' term='mind'/><title type='text'>from Dan Dennett: "Preachers who are not Believers"</title><content type='html'>&lt;div&gt;From a recent article by Dan Dennett and Linda LaScola, "Preachers who are not Believers", which I saw on &lt;a href="http://www.cognitionandculture.net/index.php?option=com_content&amp;amp;view=article&amp;amp;id=622:varieties-of-disbelief&amp;amp;catid=29:dan&amp;amp;Itemid=34"&gt;the International Cognition and Culture Institute blog&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;They managed to reach out and find some actual pastors of churches, who happen to not believe much of what their church-people probably expect they believe, and interview them. They turn out to be really thoughtful, compassionate people. With jobs that must be pretty difficult at times. Awesome paper.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;From Jack, age 50, a Southern Baptist minister of 15 years:&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;“OK, this God created me. It’s a perfect God that knows everything; can do anything. And somehow it got messed up, and it’s my fault. So he had to send his son to die for me to fix it. And he does. And now I’m supposed to beat myself to death the rest of my life over it. It makes no sense to me. Don’t you think a God could come up with a better plan than that?”&lt;/p&gt;&lt;p&gt;“What kind of personality; what kind of being is this that had to create these other beings to worship and tell him how wonderful he is? That makes no sense, if this God is all-knowing and all-wise and all-wonderful. I can’t comprehend that that’s what kind of person God is.”&lt;/p&gt;&lt;p&gt;“Every church I’ve been in preached that the Jonah in the Whale story is literally true. And I’ve never believed that. You mean to tell me a human was in the belly of that whale? For three days? And then the whale spit him out on the shoreline? And, of course, their convenient logic is, ‘Well, God can do anything.’”&lt;/p&gt;&lt;p&gt;“Well, I think most Christians have to be in a state of denial to read the Bible and believe it. Because there are so many contradicting stories. You’re encouraged to be violent on one page, and you’re encouraged to give sacrificial love on another page. You’re encouraged to bash a baby’s head on one page, and there’s other pages that say, you know, give your brother your fair share of everything you have if they ask for it.”&lt;/p&gt;&lt;p&gt;“But if God was going to reveal himself to us, don’t you think it would be in a way that we wouldn’t question? ...I mean, if I was wanting to have...people teach about the Bible...I would probably make sure they knew I existed. ...I mean, I wouldn’t send them mysterious notes, encrypted in a way that it took a linguist to figure out.”&lt;/p&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-8274667878417036583?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/8274667878417036583/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=8274667878417036583' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/8274667878417036583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/8274667878417036583'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2010/03/from-dan-dennett-preachers-who-are-not.html' title='from Dan Dennett: &quot;Preachers who are not Believers&quot;'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-2767306989000244932</id><published>2010-02-21T21:45:00.006-05:00</published><updated>2010-04-13T21:07:46.829-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linguistics'/><category scheme='http://www.blogger.com/atom/ns#' term='morphology'/><category scheme='http://www.blogger.com/atom/ns#' term='school'/><category scheme='http://www.blogger.com/atom/ns#' term='languages'/><category scheme='http://www.blogger.com/atom/ns#' term='language'/><title type='text'>Morphology: derivation and inflection</title><content type='html'>Morphology is the study of the structure of words, and the processes by which they're produced. Within morphology, we talk about (among other things), derivation and inflection. It took a little bit of reading for me to understand the difference between the two, so hopefully I can explain it to you.&lt;br /&gt;&lt;br /&gt;Derivation is when new words, typically of a different part of speech, are produced from existing words. In English, we have quite a few affixes to change a word's the category, and interestingly, they're not very regular. To make something &lt;em&gt;black&lt;/em&gt;, you &lt;em&gt;blacken&lt;/em&gt; it, but to make something hollow, you &lt;em&gt;hollow&lt;/em&gt; it. In &lt;cite&gt;Calvin and Hobbes&lt;/cite&gt;, Calvin uses &lt;em&gt;verb&lt;/em&gt; as a verb that means "turn something into a verb". To make something into a product, you can (recently) &lt;em&gt;productize&lt;/em&gt; it. What word can you use to make something blue? Have you ever bluified something?&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Inflectional_morphology"&gt;Inflection&lt;/a&gt; is &lt;a href="http://en.wikipedia.org/wiki/Inflection#Inflection_vs._derivation"&gt;rather simpler&lt;/a&gt;. It takes a base form of a word and encodes some extra meaning in it -- what extra meaning varies by language, but it's often things like plurality or gender. Typically the language requires that words be inflected properly.&lt;br /&gt;&lt;br /&gt;Languages differ pretty broadly how much information a given inflected word carries. For example, a verb in Spanish carries more bits than one in English, so in Spanish ("Hablo castellano.") you often don't have to specify the subject of a verb, because its inflection makes it clear who you're talking about [0]. Some languages encode quite a lot of information in one verb: maybe its object, the whole tense (so no need for modal verbs like "would" or "haber"), the genders of all the participants, maybe even how the speaker came to know the information in question [1].&lt;br /&gt;&lt;br /&gt;I have a whole lot of linguistics to learn. It's interesting being around a department where a lot of the people are linguists by background, when I've only put so much time and attention into it. So you'll get more posts like this, rest assured.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;[0] This feature, of not having to specify pronouns, is called being a &lt;a href="http://en.wikipedia.org/wiki/Pro-drop_language"&gt;pro-drop&lt;/a&gt; language. Some languages can drop more pronouns than Spanish!&lt;br /&gt;&lt;br /&gt;[1] This feature, &lt;a href="http://en.wikipedia.org/wiki/Evidentiality"&gt;grammatical evidentiality&lt;/a&gt;, is extremely awesome, and we need to adopt it in English.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;References:&lt;br /&gt;&lt;a href="http://www.indiana.edu/~hlw/Derivation/intro.html"&gt;http://www.indiana.edu/~hlw/Derivation/intro.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Inflectional_morphology"&gt;http://en.wikipedia.org/wiki/Inflectional_morphology&lt;/a&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Evidentiality"&gt;http://en.wikipedia.org/wiki/Evidentiality&lt;/a&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Inflection#Inflection_vs._derivation"&gt;http://en.wikipedia.org/wiki/Inflection#Inflection_vs._derivation&lt;/a&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Pro-drop_language"&gt;http://en.wikipedia.org/wiki/Pro-drop_language&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-2767306989000244932?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/2767306989000244932/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=2767306989000244932' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/2767306989000244932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/2767306989000244932'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2010/02/morphology-derivation-and-inflection.html' title='Morphology: derivation and inflection'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-2218776483664004852</id><published>2010-02-07T23:05:00.004-05:00</published><updated>2010-02-07T23:46:12.749-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='latex'/><category scheme='http://www.blogger.com/atom/ns#' term='academia'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='ui'/><title type='text'>drawing trees with LaTeX</title><content type='html'>So, whatever you think about producing documents with LaTeX (personally, I'm pretty ambivalent, for reasons that I may go into later), if you want to draw parse trees with it, there's a nice package to do that: &lt;a href="http://www.ling.upenn.edu/advice/latex/qtree/"&gt;qtree&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikibooks.org/wiki/LaTeX/Packages/Installing_Extra_Packages"&gt;Installing packages from CTAN manually looks hard&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If you're on Ubuntu/Debian, though, you just need to install these two packages: texlive-humanities, texlive-pictures.&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;qtree&lt;/tt&gt; itself is in texlive-humanities, but it depends on a package, &lt;tt&gt;pict2e&lt;/tt&gt;, that's only in texlive-pictures, so you have to install them both or it won't work.&lt;br /&gt;&lt;br /&gt;And then you can draw some trees just by specifying the bracketing of the phrases (see the qtree docs for exactly how).&lt;br /&gt;&lt;br /&gt;&lt;img src="http://1.bp.blogspot.com/_QxOlkv8KV00/S2-WvNCLedI/AAAAAAAAFcA/Nktk8r_kwcs/s400/prettynice.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5435729012956297682" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-2218776483664004852?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/2218776483664004852/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=2218776483664004852' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/2218776483664004852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/2218776483664004852'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2010/02/drawing-trees-with-latex.html' title='drawing trees with LaTeX'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_QxOlkv8KV00/S2-WvNCLedI/AAAAAAAAFcA/Nktk8r_kwcs/s72-c/prettynice.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-5653930579993228302</id><published>2010-01-08T01:01:00.007-05:00</published><updated>2010-01-08T02:10:00.812-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='retro'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='review'/><title type='text'>review: a new Model M from Unicomp!</title><content type='html'>My favorite keyboard is the &lt;a href="http://en.wikipedia.org/wiki/Model_M_keyboard"&gt;Model M&lt;/a&gt;. They're big, loud, heavy, and made of equal parts joy and engineering. Typing on one makes the familiar clattering racket that everybody loves.&lt;br /&gt;&lt;br /&gt;Lindsey just gave me &lt;a href="http://pckeyboards.stores.yahoo.net/customizer.html"&gt;a new one&lt;/a&gt;! My 1988 version (IBM part #1391401) is still fine, of course. But now I can bring one to the lab.&lt;br /&gt;&lt;br /&gt;The new keyboard is beautiful; they're making them with USB now, and they come in black! It's not quite as heavy as my 80's vintage keyboard (no big metal plate inside), and while the keys themselves are easily removable, this model doesn't have separate keycaps. But it's just as clicky as you remember, and the feel is perfect. This design is apparently the same as some of the latter-day IBM versions.&lt;br /&gt;&lt;br /&gt;The company manufacturing the M now, &lt;a href="http://pckeyboards.stores.yahoo.net/"&gt;Unicomp&lt;/a&gt;, is great, and they totally deserve your business.&lt;br /&gt;&lt;br /&gt;The first keyboard they shipped us actually had some problems with it -- a few of the keys were sticking! So I called up the company and got Jim on the phone almost immediately. He suggested that I pull the offending keys off and then pop them back in place (usually good M maintenance advice). After some fidgeting, we determined that I wasn't going to be able to fix it myself, so he had a replacement sent out the very next day!&lt;br /&gt;&lt;br /&gt;So fantastic. And now I have two Ms.&lt;br /&gt;&lt;br /&gt;(&lt;a href="http://jseliger.com/2008/05/07/product-review-unicomp-customizer-keyboard/"&gt;here's another Unicomp review&lt;/a&gt;; the blogger and everybody in the comments over there seems to have had a great customer service experience too.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-5653930579993228302?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/5653930579993228302/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=5653930579993228302' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/5653930579993228302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/5653930579993228302'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2010/01/review-new-model-m-from-unicomp.html' title='review: a new Model M from Unicomp!'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-334757582619821737</id><published>2010-01-03T19:49:00.006-05:00</published><updated>2010-04-21T16:31:21.602-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='culture'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='history'/><title type='text'>Guns, Germs, and Steel on invention</title><content type='html'>For my holiday break reading, I just finished &lt;cite&gt;Guns, Germs, and Steel&lt;/cite&gt;, by Jared Diamond. I heartily recommend it! It's about the broad patterns in human history: lots of it is about the development of agriculture ("food production", he usually calls it), how and why it happened where it did, and the historical ramifications as societies develop and come into contact/conflict with other societies.&lt;br /&gt;&lt;br /&gt;There's a lot about germs, too. The diseases that a society carries and develops resistances to are extremely important when running into another group. A people can be totally wiped out, faced with a disease it's not accustomed to.&lt;br /&gt;&lt;br /&gt;But I wanted to share with you a bit that particularly resonated with me, as a technology-producing person.&lt;blockquote&gt;Thus, the commonsense view of invention that served as our starting point reverses the usual roles of invention and need. It also overstates the importance of rare geniuses, such as Watt and Edison. That "heroic theory of invention," as it is termed, is encouraged by patent law, because an applicant for a patent must prove the novelty of the invention submitted. Inventors thereby have a financial incentive to denigrate or ignore previous work. From a patent lawyer's perspective, the ideal invention is one that arises without any precursors, like Athene springing fully formed from the forehead of Zeus.&lt;br /&gt;&lt;br /&gt;In reality, even for the most famous and apparently decisive modern inventions, neglected precursors lurked behind the bald claim that "X invented Y." For instance, we are regularly told, "James Watt invented the steam engine in 1769," supposedly inspired by watching steam rise from a tea-kettle's spout. Unfortunately for this splendid fiction, Watt actually got the idea for his particular steam engine while repairing a model of Thomas Newcomen's steam engine, which Newcomen had invented 57 years earlier and of which over a hundred had been manufactured in England by the time of Watt's repair work. Newcomen's engine, in turn, followed the steam engine that the Englishman Thomas Savery patented in 1698, which followed the steam engine that the Frenchman Denis Papin designed (but did not build) around 1680, which in turn had precursors in the ideas of the Dutch scientist Christiaan Huygens and others. All this is not to deny that Watt greatly improved Newcomen's engine (by incorporating a separate steam condenser and a double-acting cylinder), just as Newcomen had greatly improved Savery's.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-334757582619821737?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/334757582619821737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=334757582619821737' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/334757582619821737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/334757582619821737'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2010/01/guns-germs-and-steel-on-invention.html' title='&lt;cite&gt;Guns, Germs, and Steel&lt;/cite&gt; on invention'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-455172699173826561</id><published>2010-01-02T16:53:00.005-05:00</published><updated>2010-01-02T17:57:25.266-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='culture'/><category scheme='http://www.blogger.com/atom/ns#' term='miscellaneous'/><title type='text'>Foundation Beyond Belief launches!</title><content type='html'>&lt;a href="http://www.foundationbeyondbelief.org/"&gt;&lt;img src="http://www.dalemcgowan.com/images/FBBsquare60.jpg"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The new website for the Foundation Beyond Belief is up! The mission is: &lt;strong&gt;"To demonstrate humanism at its best by supporting efforts to improve this world and this life; to challenge humanists to embody the highest principles of humanism, including mutual care and responsibility; and to help and encourage humanist parents to raise confident children with open minds and compassionate hearts."&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.foundationbeyondbelief.org"&gt;Foundation Beyond Belief&lt;/a&gt; is a non-profit, charitable foundation that wants to encourage compassion and charitable giving for [secular] humanists. It's also working on providing support and education for non-theistic parents.&lt;br /&gt;&lt;br /&gt;However you might feel about churches, one thing that they're good at is charity and volunteer projects. You're big-hearted and well-meaning -- but do you have somebody reminding you to volunteer for Habitat For Humanity and donate to feed the homeless every week? Apparently in the US, religious people give more to nonprofits than non-religious (according to &lt;a href="http://www.mint.com/blog/wp-content/uploads/2009/12/CharityWhoCares-3.jpg"&gt;this guide from Mint&lt;/a&gt;, via &lt;a href="http://friendlyatheist.com/2010/01/02/do-god-fearing-or-godless-people-give-more-to-charity/"&gt;FriendlyAtheist&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;That's what FBB is for. With FBB, you can make one-time donations, or sign up for monthly giving, and you choose how your donation is distributed! Contributions are tax deductible, and go 100% to the organizations benefited! (you can also choose to donate to FBB itself, which of course has operating costs)&lt;br /&gt;&lt;br /&gt;There's an online community, etc! Pretty exciting!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-455172699173826561?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/455172699173826561/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=455172699173826561' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/455172699173826561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/455172699173826561'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2010/01/foundation-beyond-belief-launches.html' title='Foundation Beyond Belief launches!'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-463770123890703481</id><published>2009-12-30T21:40:00.005-05:00</published><updated>2009-12-30T22:16:29.426-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ai'/><category scheme='http://www.blogger.com/atom/ns#' term='nlp'/><category scheme='http://www.blogger.com/atom/ns#' term='education'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>here come some explanatory examples</title><content type='html'>Having recovered from all that fruitcake and holiday cheer, I've started digging through the code I wrote over the past semester, looking for things that could be straightforward examples.&lt;br /&gt;&lt;br /&gt;So far, I've got:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;calculating the entropy of a discrete random variable&lt;/li&gt;&lt;li&gt;a cute implementation of finite-state automata with matrix multiplication&lt;/li&gt;&lt;li&gt;calculating the probability of a Markov process going to a particular state, again with matrix multiplication&lt;/li&gt;&lt;li&gt;a simple CYK-style chart parser for probabilistic grammars (computing inside probabilities, outside probabilities, and the most probable parse)&lt;/li&gt;&lt;li&gt;a parse evaluator that gives precision and recall for parse trees&lt;/li&gt;&lt;li&gt;probabilistic part-of-speech taggers that take into account bigrams, both by trying all combinations of tags for the words and using the Viterbi algorithm&lt;/li&gt;&lt;li&gt;Some pretty clean code for hidden Markov models in general&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;I've already checked these in over on &lt;a href="http://code.google.com/p/narorumo/"&gt;narorumo&lt;/a&gt;. They're all in Python, but some depend on nltk or numpy.&lt;br /&gt;&lt;br /&gt;They'll be increasingly clean and documented over the next week or so. I hope these are helpful to somebody!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-463770123890703481?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/463770123890703481/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=463770123890703481' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/463770123890703481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/463770123890703481'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2009/12/here-come-some-explanatory-examples.html' title='here come some explanatory examples'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-3968192348761257668</id><published>2009-11-16T22:09:00.010-05:00</published><updated>2009-11-16T23:04:10.526-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nlp'/><category scheme='http://www.blogger.com/atom/ns#' term='education'/><category scheme='http://www.blogger.com/atom/ns#' term='academia'/><category scheme='http://www.blogger.com/atom/ns#' term='school'/><title type='text'>explanatory power of working examples</title><content type='html'>The NLP algorithms I've been studying since I started back at school aren't particularly complex. But they're often described with really dense notation: maybe your field does this too! Here's a description, for example, of how to calculate an "outside probability" -- it's the (joint) probability that a particular nonterminal symbol covers a certain chunk of text, and the words outside the span of that nonterminal. This is from &lt;a href="http://faculty.washington.edu/fxia/"&gt;Fei Xia's&lt;/a&gt; &lt;a href="http://faculty.washington.edu/fxia/courses/LING572/inside-outside.ppt"&gt;lecture slides&lt;/a&gt; (and I think these are pretty good).&lt;br /&gt;&lt;br /&gt;&lt;img style="width: 400px; height: 106px;" src="http://1.bp.blogspot.com/_QxOlkv8KV00/SwIVvSH734I/AAAAAAAAFTs/0Vnz6KopIj0/s400/outside.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5404906404861173634" /&gt;&lt;br /&gt;&lt;br /&gt;Maybe what I need is more practice picking apart dense notation, but in all honesty I have trouble keeping track of what the different letters mean. Maybe a nice &lt;a href="http://en.wikipedia.org/wiki/Dynamic_programming"&gt;dynamic programming&lt;/a&gt; implementation springs to mind for people smarter than me, but I have to stare at it (and the surrounding slides) for quite a while!&lt;br /&gt;&lt;br /&gt;I think I'd be making a pretty good contribution to the world if I took the algorithms I'm learning and wrote down the most straightforward pseudocode and prose versions I can, with a running Python implementation and descriptive variable names. Surely many people out there would find code easier to digest!&lt;br /&gt;&lt;br /&gt;Somebody's already done precisely this with the &lt;a href="http://en.wikipedia.org/wiki/Viterbi_algorithm"&gt;Viterbi Algorithm&lt;/a&gt; wikipedia page, and I'm very grateful to that somebody.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-3968192348761257668?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/3968192348761257668/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=3968192348761257668' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/3968192348761257668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/3968192348761257668'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2009/11/explanatory-power-of-working-examples.html' title='explanatory power of working examples'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_QxOlkv8KV00/SwIVvSH734I/AAAAAAAAFTs/0Vnz6KopIj0/s72-c/outside.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-8610738711022074234</id><published>2009-11-04T02:30:00.007-05:00</published><updated>2009-11-04T11:19:39.451-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='miscellaneous'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Lenovo: you have to buy Windows, As Per Policy</title><content type='html'>I got a pretty quick response from the Lenovo sales people -- complete with verbiage at the bottom emphasizing how the email was &lt;em&gt;confidential and legally privileged&lt;/em&gt;, and any retransmission, dissemination, or other public use is &lt;em&gt;strictly prohibited&lt;/em&gt;. They should have put the EULA for the email at the top, before I scrolled down! I might not have agreed to read the email! Geez, or worse, what if somebody accidentally read it over my shoulder in a coffee shop!&lt;br /&gt;&lt;br /&gt;Anyway, they said:&lt;blockquote&gt;We do not have option to sell any unit without operating system as per policy.&lt;/blockquote&gt;&lt;br /&gt;So I guess I won't &lt;a href="http://penguinparens.blogspot.com/2009/10/trying-to-buy-thinkpad-without-paying.html"&gt;buy a ThinkPad&lt;/a&gt;. I'm just not willing to pay The Microsoft Tax when I'm not going to use Windows.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-8610738711022074234?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/8610738711022074234/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=8610738711022074234' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/8610738711022074234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/8610738711022074234'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2009/11/lenovo-you-have-to-buy-windows-as-per.html' title='Lenovo: you have to buy Windows, As Per Policy'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-6844351674497782312</id><published>2009-11-04T02:10:00.003-05:00</published><updated>2009-11-04T02:29:14.339-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='languages'/><title type='text'>Python generator expressions</title><content type='html'>I just found out about this: &lt;a href="http://docs.python.org/2.6/reference/expressions.html#generator-expressions"&gt;Python has a really concise way to make new generators&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It looks like a list comprehension, just without the brackets. Before I knew about this feature, &lt;a href="http://code.google.com/p/nltk/source/browse/trunk/nltk/nltk/tag/hmm.py#1262"&gt;the code I was reading&lt;/a&gt; looked pretty mysterious.&lt;br /&gt;&lt;br /&gt;There are some nice examples of cases where you might want to use this sort of thing in &lt;a href="http://www.python.org/dev/peps/pep-0289/"&gt;the relevant PEP&lt;/a&gt;. Especially pleasant uses from the PEP include passing a generator to the dictionary constructor, like so:&lt;br /&gt;&lt;code&gt;d = dict( (k, func(k)) for k in keylist)&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;... and, useful for me personally, getting the set of words in a file, all in one go:&lt;br /&gt;&lt;code&gt;s = set(word  for line in f  for word in line.split())&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Good to know!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-6844351674497782312?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/6844351674497782312/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=6844351674497782312' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/6844351674497782312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/6844351674497782312'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2009/11/python-generator-expressions.html' title='Python generator expressions'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-1899603933247577048</id><published>2009-10-25T18:39:00.007-04:00</published><updated>2009-10-25T20:22:03.397-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='miscellaneous'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>trying to buy a ThinkPad without paying for Windows</title><content type='html'>I &lt;a href="http://penguinparens.blogspot.com/2009/06/back-from-google-io-got-new-laptop.html"&gt;got that Dell Mini 12&lt;/a&gt; some time ago, and honestly it's been a pain. It's a good-looking machine, and the keyboard and screen are nice, but the &lt;a href="http://en.wikipedia.org/wiki/Poulsbo_(chipset)"&gt;Poulsbo chipset&lt;/a&gt; just has terrible Linux support. Like every third time I get an update, something breaks, and I haven't been able to make it suspend/resume reliably in months -- oh, and X just broke again. What I really want is a little ThinkPad.&lt;br /&gt;&lt;br /&gt;So I just sent this email to Lenovo:&lt;blockquote&gt;Hey, good evening,&lt;br /&gt;&lt;br /&gt;I'd love to purchase a ThinkPad X200. I haven't found the option on your website, though, for how I can buy one without Windows? Could you point me to that link?&lt;br /&gt;&lt;br /&gt;I'm simply not going to use Windows; I would install Linux on it as soon as I get the machine anyway, and I don't want to pay for software I won't use.&lt;br /&gt;&lt;br /&gt;So if you can sell me a ThinkPad with no Windows, that would be fantastic, and I'll be really happy and gladly give you money and say nice things about your company.&lt;br /&gt;&lt;br /&gt;Thanks very much!&lt;br /&gt;&lt;br /&gt;--&lt;br /&gt;-- Alex Rudnick&lt;/blockquote&gt;We'll see what they say! I might just buy the laptop anyway, not agree to the Windows EULA, and then go through the hullabaloo to refund it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-1899603933247577048?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/1899603933247577048/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=1899603933247577048' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/1899603933247577048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/1899603933247577048'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2009/10/trying-to-buy-thinkpad-without-paying.html' title='trying to buy a ThinkPad without paying for Windows'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-5171054274989856950</id><published>2009-10-18T23:55:00.004-04:00</published><updated>2009-10-19T00:35:51.091-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='research'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='logic'/><category scheme='http://www.blogger.com/atom/ns#' term='languages'/><title type='text'>constraint programming in Python</title><content type='html'>You may be familiar with &lt;a href="http://en.wikipedia.org/wiki/Constraint_programming"&gt;constraint programming&lt;/a&gt;, an approach where, instead of describing &lt;em&gt;how&lt;/em&gt; to solve a problem, you describe what a possible solution looks like, and let a generalized solver find possible solutions. This is the sort of thing you might do with Prolog, Oz, or any number of libraries for your favorite programming language.&lt;br /&gt;&lt;br /&gt;If your favorite programming language is Python, there are at least two different libraries for this approach! Unfortunately, they're both called "python-constraint"; this led to some confusion on my part. Here they are:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.logilab.org/project/logilab-constraint"&gt;logilab-constraint&lt;/a&gt;. &lt;strong&gt;This is packaged in Debian/Ubuntu as "python-constraint"&lt;/strong&gt;. It's put out by the French company &lt;a href="http://www.logilab.fr/"&gt;LogiLab&lt;/a&gt;, who contribute a bunch of Free Software useful for doing AI-flavored things. Their &lt;a href="http://www.logilab.org/project/logilab-hmm"&gt;HMM library&lt;/a&gt; is pretty slick too.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://labix.org/python-constraint"&gt;python-constraint&lt;/a&gt; is a package by &lt;a href="http://labix.org"&gt;Gustavo Niemeyer&lt;/a&gt;, and it's got this &lt;a href="http://labix.org/python-constraint"&gt;really nice tutorial&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I mention these because my new research group is using this latter one to build a dependency grammar system based on &lt;a href="http://www.ps.uni-sb.de/~rade/xdg.html"&gt;Ralph Debusmann's XDG&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;And more about that, as we get to it :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-5171054274989856950?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/5171054274989856950/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=5171054274989856950' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/5171054274989856950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/5171054274989856950'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2009/10/constraint-programming-in-python.html' title='constraint programming in Python'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-3430506551453527814</id><published>2009-10-12T15:20:00.005-04:00</published><updated>2009-10-12T15:41:56.397-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='statistics'/><category scheme='http://www.blogger.com/atom/ns#' term='languages'/><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>normal distributions and R</title><content type='html'>When I'm using &lt;a href="http://www.r-project.org/"&gt;R&lt;/a&gt; to do statistical things (such as homework), I feel somewhat torn -- it's got so many nice functions that come built in, but the language itself is slightly clunky, and integrating code that I've written in R with bigger projects seems like it would be kind of a pain. That's a general problem with picking any special-purpose language, though -- I might make similar complaints about Matlab/Octave or even Prolog...&lt;br /&gt;&lt;br /&gt;I note, though, that I haven't jumped ship to NumPy yet.&lt;h2&gt;pnorm and qnorm&lt;/h2&gt;&lt;br /&gt;I just wanted to mention these fantastically easy-to-use functions that come built right in: &lt;code&gt;pnorm&lt;/code&gt; and &lt;code&gt;qnorm&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;pnorm&lt;/code&gt; is what you use if you have a z-score and you want the probability that a value in the distribution would come up as less than that score. This is equivalent to looking up probability values in the "z" tables in the back of your stats book. &lt;code&gt;pnorm(0)&lt;/code&gt; gives you 0.5, since half of all values are going to have a value less than 0.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;qnorm&lt;/code&gt; does the inverse -- you give it a probability and it gives you back the z-score below which that much of the probability mass lies. So if you give it 0.5, it gives you back 0.&lt;br /&gt;&lt;br /&gt;Both of these functions can take more parameters -- you can specify your distribution mean and stddev (so you don't have to use z-scores), for example. Type "?qnorm" for the docs!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-3430506551453527814?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/3430506551453527814/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=3430506551453527814' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/3430506551453527814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/3430506551453527814'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2009/10/normal-distributions-and-r.html' title='normal distributions and R'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-732006640170944871</id><published>2009-08-18T16:47:00.007-04:00</published><updated>2009-08-18T17:27:59.967-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='atlhack'/><category scheme='http://www.blogger.com/atom/ns#' term='scheme'/><category scheme='http://www.blogger.com/atom/ns#' term='atlanta'/><title type='text'>ICFP programming contest 2009!</title><content type='html'>Not too long ago, &lt;a href="http://www.cs.indiana.edu/~lkuper"&gt;Lindsey Kuper&lt;/a&gt; and I stepped into the ring once again to compete in the &lt;a href="http://icfpcontest.org/"&gt;ICFP Programming Contest&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;She's &lt;a href="http://geekbuffet.wordpress.com/2009/08/18/my-experience-in-the-2009-icfp-programming-contest-part-1-of-2/"&gt;writing up the full story&lt;/a&gt; over on Geek Buffet.&lt;br /&gt;&lt;br /&gt;The quick recap, however! The problem had to deal with orbital mechanics -- we were to control a simulated satellite as it orbits a simulated earth. First, you just had to transfer orbits, then meet other satellites, and it got increasingly complex from there.&lt;br /&gt;&lt;br /&gt;Thankfully, the physics simulator for each kind of problem was included. All you had to do to use it was implement the contest-specific VM! (Easy, right?) Thankfully, the specification for the VM was super-clear, and we got it working surprisingly quickly.&lt;br /&gt;&lt;br /&gt;By the end of the contest, we could handle the first two problem types, and that was competitive enough for 120th place worldwide, by the morning when they turned off the leaderboard. Good show, us!&lt;br /&gt;&lt;br /&gt;For the full scoop, &lt;a href="http://geekbuffet.wordpress.com/2009/08/18/my-experience-in-the-2009-icfp-programming-contest-part-1-of-2/"&gt;go read Lindsey's account&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/narorumo/source/browse/trunk/icfp09"&gt;Here's the code!&lt;/a&gt; We used Scheme and Python, and R for the visualizations.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-732006640170944871?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/732006640170944871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=732006640170944871' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/732006640170944871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/732006640170944871'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2009/08/icfp-programming-contest-2009.html' title='ICFP programming contest 2009!'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-8393357426048243035</id><published>2009-08-11T23:00:00.008-04:00</published><updated>2009-08-12T16:39:50.217-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nlp'/><category scheme='http://www.blogger.com/atom/ns#' term='academia'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='machine learning'/><title type='text'>change of scenery and reviewing conference submissions</title><content type='html'>So you may not have heard yet, but last month, I left &lt;a href="http://code.google.com/webtoolkit"&gt;Google Atlanta&lt;/a&gt;, packed up my cats and my computers, and headed to &lt;a href="http://www.cs.indiana.edu/"&gt;Indiana University&lt;/a&gt;. &lt;a href="http://www.cs.indiana.edu/~lkuper"&gt;Lindsey Kuper&lt;/a&gt; helped quite a bit, both in motivation to do this and in the actual moving process. So I'm a PhD student now, very exciting! I'll be working on natural language processing and machine learning -- something I'd wanted to focus on for quite a while.&lt;br /&gt;&lt;br /&gt;But in my last two weeks at the Goog, I had this really interesting opportunity, presented by my colleague &lt;a href="http://katharina.probst.googlepages.com/home"&gt;Katharina Probst&lt;/a&gt;. She's a reviewer for the &lt;a href="http://www.comp.polyu.edu.hk/conference/cikm2009/about/"&gt;Conference on Information and Knowledge Management&lt;/a&gt; (is this the same as being on the program committee?), and asked if I wanted to help. It seemed like good practice for my upcoming stint as an academic.&lt;br /&gt;&lt;br /&gt;So we (I, with her guidance and sanity-checking) had this pile of eight papers to get through. Some were fairly mundane, like learning classifiers to determine if a message is a flame, or summarizing a group of documents; one was particularly targeted at finding references to rabbinic literature in other rabbinic literature (they don't use ACM-style citations, typically). And so on. A few were written very clearly and had well-motivated discussions on why the problem is interesting and important, and others... not so much. This is why we have peer review.&lt;br /&gt;&lt;br /&gt;But it was an interesting experience, and I'm glad I took it. My tech lead, &lt;a href="http://code.google.com/eclipse"&gt;Miguel&lt;/a&gt;, graciously let me use my "20%" time to Advance Science and just review papers for a day. I wanted to do a good job of reviewing, so I read the papers really closely, took a lot of notes, and wrote a few paragraphs in response for each one. Katharina at least seemed to think that it was good feedback, so that was reassuring. (although I would have liked more feedback on my feedback).&lt;br /&gt;&lt;br /&gt;Once the other reviewer's ratings came in, I was fairly pleased to see that my ratings weren't far off from the other reviews. If I missed some amazing gem of wisdom, then at least it was apparently hard to find -- the papers I liked the best were accepted. I was more concerned, honestly, that I would mistake some stale old idea as a clever new one. But again, that's why we have many eyes on these things.&lt;br /&gt;&lt;br /&gt;Alright! So now I just have to produce some stuff for other people to review. To the lab!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-8393357426048243035?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/8393357426048243035/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=8393357426048243035' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/8393357426048243035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/8393357426048243035'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2009/08/change-of-scenery-and-reviewing.html' title='change of scenery and reviewing conference submissions'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-8818658202046117738</id><published>2009-08-08T00:53:00.003-04:00</published><updated>2009-08-08T01:06:54.194-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='unix'/><category scheme='http://www.blogger.com/atom/ns#' term='ui'/><title type='text'>goto: a utility for bash</title><content type='html'>Do you ever find yourself, while using bash, wanting to get to a particular file that you know is way down in a big tree of files -- maybe a big Java source tree, or some other nested file structure? You know you want Foo.java, but is it in src/com/foocorp/package/a/b/c, or maybe somewhere else?&lt;br /&gt;&lt;br /&gt;Announcing &lt;a href="http://narorumo.googlecode.com/svn/trunk/goto/"&gt;goto&lt;/a&gt;, a bash utility which solves just that problem! Now you can just say:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;you@computer:~/project$ goto Foo.java&lt;br /&gt;you@computer:~/project/src/com/foocorp/whatever/path/to$ vim Foo.java&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;... instead of whatever business you were going to do with &lt;code&gt;locate&lt;/code&gt; or &lt;code&gt;find&lt;/code&gt; or your IDE, or just manually sifting for it.&lt;br /&gt;&lt;br /&gt;Here's the &lt;a href="http://narorumo.googlecode.com/svn/trunk/goto/README"&gt;README&lt;/a&gt;. Comments, complaints, and patches welcome! (and if you find this useful, I'd be really pleased if you'd let me know!)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-8818658202046117738?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/8818658202046117738/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=8818658202046117738' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/8818658202046117738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/8818658202046117738'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2009/08/goto-utility-for-bash.html' title='goto: a utility for bash'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-5682107912441123486</id><published>2009-08-07T23:49:00.004-04:00</published><updated>2009-08-08T00:30:45.822-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='unix'/><category scheme='http://www.blogger.com/atom/ns#' term='ui'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>More Ubuntu: getting the NetworkManager Applet back</title><content type='html'>Ubuntu comes with this really great network selection applet that sits on your gnome panel. It's called the NetworkManager applet, and it looks and acts more or less like the analogous dropdown menu on Mac OS X. Unfortunately, if you remove it from your panel, it's unintuitive how to get it back.&lt;br /&gt;&lt;br /&gt;Maybe you accidentally removed it, and then, after some research, tried "nm-applet" from the command line, messed with the Network Monitor and the Network Connections preference page, and even tried editing &lt;code&gt;nm-system-settings.conf&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;What you really want to do is right click on your panel, click &lt;b&gt;Add to Panel&lt;/b&gt;, and select &lt;b&gt;Notification Area&lt;/b&gt;. Why the nice NetworkManager Applet and battery status applet both live in the Notification Area remains a mystery.&lt;br /&gt;&lt;br /&gt;Like so:&lt;br /&gt;&lt;img src="http://2.bp.blogspot.com/_QxOlkv8KV00/Snz63fX6VrI/AAAAAAAAFSw/LFNhGwYJFU0/s400/Screenshot-Add-to-Panel.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5367440687140329138" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-5682107912441123486?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/5682107912441123486/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=5682107912441123486' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/5682107912441123486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/5682107912441123486'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2009/08/more-ubuntu-getting-networkmanager.html' title='More Ubuntu: getting the NetworkManager Applet back'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_QxOlkv8KV00/Snz63fX6VrI/AAAAAAAAFSw/LFNhGwYJFU0/s72-c/Screenshot-Add-to-Panel.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-8096048301907373752</id><published>2009-07-09T19:21:00.003-04:00</published><updated>2009-07-09T19:29:30.211-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='unix'/><category scheme='http://www.blogger.com/atom/ns#' term='ui'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Why your Ubuntu Netbook Remix windows are maximized all the time</title><content type='html'>I was curious why my windows were all immediately getting maximized on my new kinda-netbook Dell Mini 12, running UNR (with the "Classic Desktop" mode). It's the sort of behavior you can imagine wanting -- with a small screen, maybe you do want to maximize everything? But I wanted to turn it off.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ubuntuforums.org/archive/index.php/t-1137271.html"&gt;This thread&lt;/a&gt; has the answer!&lt;br /&gt;&lt;br /&gt;UNR comes with a program called "Maximus", which was in my Startup Applications. To make the behavior go away, just go to &lt;strong&gt;System &amp;gt; Preferences &amp;gt; Startup Applications&lt;/strong&gt; and remove Maximus from that list. Problem solved!&lt;br /&gt;&lt;br /&gt;Seems odd that this is a process running in the background, instead of, say, a window manager setting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-8096048301907373752?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/8096048301907373752/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=8096048301907373752' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/8096048301907373752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/8096048301907373752'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2009/07/why-your-ubuntu-netbook-remix-windows.html' title='Why your Ubuntu Netbook Remix windows are maximized all the time'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-572041540184829094</id><published>2009-06-01T00:01:00.004-04:00</published><updated>2009-06-01T22:20:32.122-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>back from Google I/O, got a new laptop!</title><content type='html'>I can speak for myself, at least, in saying that it felt pretty darn good to be on the &lt;a href="http://code.google.com/webtoolkit"&gt;GWT&lt;/a&gt; team for &lt;a href="http://code.google.com/events/io/"&gt;Google I/O&lt;/a&gt;. The &lt;a href="http://wave.google.com/"&gt;Google Wave&lt;/a&gt; demo at the keynote got a standing ovation, and they made a pretty big deal about how they used GWT and it was a wonderful tool for their work. Pretty fantastic. A standing ovation at a tech conference. Totally electric.&lt;br /&gt;&lt;br /&gt;Anyway! I got back, and my &lt;a href="http://www.dell.com/content/products/productdetails.aspx/laptop-inspiron-12"&gt;Dell Mini 12&lt;/a&gt; with Ubuntu preinstalled had arrived! It's really pretty. The keyboard is a little more cramped than I'd expected (especially with the punctuation keys) but it's got a nice clicky feel. I'm not super-impressed with the Ubuntu version Dell shipped -- it's a specialized distribution of Hardy (last year's version) with some Dell and Yahoo-specific goodies. But the built-in camera and suspend/resume work beautifully! And no Microsoft tax! Not bad, really!&lt;br /&gt;&lt;br /&gt;I'm probably about to install a fresh new (9.04) Ubuntu Netbook Remix on it.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update!&lt;/b&gt; There's a bit of a funky driver issue with running the stock Ubuntu instead of the one Dell provides, but it's very surmountable. Here's &lt;a href="http://www.tipsandthoughts.com/?p=4"&gt;how to install Ubuntu "Jaunty" on your Dell Mini 12&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-572041540184829094?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/572041540184829094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=572041540184829094' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/572041540184829094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/572041540184829094'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2009/06/back-from-google-io-got-new-laptop.html' title='back from Google I/O, got a new laptop!'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-4101166531002112186</id><published>2009-05-20T16:45:00.003-04:00</published><updated>2009-05-20T16:50:02.170-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Scala article on the Scala site!</title><content type='html'>I helped &lt;a href="http://lexspoon.org"&gt;Lex Spoon&lt;/a&gt; and Toby Reyelts write an article about running Scala on App Engine.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.scala-lang.org/node/1826"&gt;Here's the article&lt;/a&gt;! As of right now, it's linked from the front page on &lt;a href="http://www.scala-lang.org/"&gt;the Scala site&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In the article, we mention my &lt;a href="http://code.google.com/p/scala-gwt-dlx/"&gt;Scala/GWT sudoku solver&lt;/a&gt;, which is now available on Google Code. It's also &lt;a href="http://gwtdlx.appspot.com/"&gt;live on App Engine&lt;/a&gt; right now!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-4101166531002112186?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/4101166531002112186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=4101166531002112186' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/4101166531002112186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/4101166531002112186'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2009/05/scala-article-on-scala-site.html' title='Scala article on the Scala site!'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-8634436508082729186</id><published>2009-04-21T22:43:00.012-04:00</published><updated>2009-04-22T10:06:20.070-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='languages'/><title type='text'>Further steps: Scala/GWT/App Engine/Eclipse</title><content type='html'>I've been excited about &lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt; recently, for a number of reasons -- it's a modern language with lots of great features that you might expect if you've been looking at Haskell or ML. It's got pattern matching, a concise syntax, type inference, and first-order functions. The really killer thing about Scala, though, is how well it integrates with Java.&lt;br /&gt;&lt;br /&gt;You can very easily have a mixed Scala and Java project, and make calls back and forth; Scala and Java packages sit in the same package hierarchy and compile to the same bytecode -- it all just works, &lt;a href="http://www.scala-lang.org/node/266"&gt;pretty much seamlessly&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So, clearly, the right thing to do is hook Scala up to &lt;a href="http://code.google.com/webtoolkit/doc/1.6/DevGuideServerCommunication.html#DevGuideRemoteProcedureCalls"&gt;GWT RPC&lt;/a&gt; and run it on &lt;a href="http://code.google.com/appengine"&gt;App Engine&lt;/a&gt;. Let's do that. This is as awesome as it's going to get, at least until the GWT compiler supports Scala and we can do our client side in Scala too.&lt;br /&gt;&lt;br /&gt;I assume you've already installed both the &lt;a href="http://code.google.com/eclipse"&gt;Google Pluin for Eclipse&lt;/a&gt; and the &lt;a href="http://www.scala-lang.org/node/94"&gt;Scala IDE for Eclipse&lt;/a&gt;. I'm using Eclipse 3.4.&lt;br /&gt;&lt;br /&gt;Make a new "Web Application" project (with &lt;b&gt;File &amp;gt; New&lt;/b&gt;, or just click the blue "g" icon). Click the boxes for both "Google Web Toolkit" and "App Engine" -- our client side will be in GWT, and the server on App Engine.&lt;br /&gt;&lt;br /&gt;Right now, our new project has "Java" nature, but not the "Scala" nature. Add Scala by right-clicking the project and choosing &lt;b&gt;Scala &amp;gt; Add Scala Nature&lt;/b&gt;. We're also going to make sure we have a copy of the Scala runtime library once we deploy to the server. Find out where &lt;code&gt;scala-library.jar&lt;/code&gt; sits (expand out the "Scala Library" container in your project) and copy it into the project's &lt;code&gt;war/WEB-INF/lib&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Now, down to business. There's a RemoteServiceServlet currently implemented in Java, and we're going to replace it with Scala code -- this is the thing that gets called on the server side when the client makes an RPC request. Find &lt;code&gt;GreetingServiceImpl.java&lt;/code&gt; and delete it.&lt;br /&gt;&lt;br /&gt;To replace it with a class implemented in Scala, right-click your "gwtscalademo.server" package and select &lt;b&gt;New &amp;gt; Other &amp;gt; Scala Wizards &gt; Scala Class&lt;/b&gt;. The class we deleted was a servlet and referenced by the web.xml, so give the Scala class the same name: GreetingServiceImpl.&lt;br /&gt;&lt;br /&gt;Here's my version:&lt;br /&gt;&lt;code style="white-space:pre;overflow:auto"&gt;package gwtscalademo.server&lt;br /&gt;import gwtscalademo.client.GreetingService&lt;br /&gt;import com.google.gwt.user.server.rpc.RemoteServiceServlet&lt;br /&gt;&lt;br /&gt;class GreetingServiceImpl&lt;br /&gt;  extends RemoteServiceServlet&lt;br /&gt;  with GreetingService {&lt;br /&gt;    def greetServer(input:String):String = {&lt;br /&gt;      return "Hello from Scala, " + input + "!"&lt;br /&gt;    }&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;Note that while in Java, we'd have said &lt;code&gt;implements&lt;/code&gt;, in Scala we say &lt;code&gt;with&lt;/code&gt;.  As I understand it, this means that Java interfaces get mapped onto &lt;a href="http://www.scala-lang.org/node/126"&gt;Scala traits&lt;/a&gt;. Hip!&lt;br /&gt;&lt;br /&gt;Now you should be able to run the app locally -- right-click your project and select &lt;b&gt;Run As &amp;gt; Web Application&lt;/b&gt;. Once you've &lt;a href="http://www.artima.com/shop/programming_in_scala"&gt;learned Scala&lt;/a&gt; and made it do something interesting (you're on your own there), you can deploy it to App Engine!&lt;br /&gt;&lt;br /&gt;Woo!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-8634436508082729186?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/8634436508082729186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=8634436508082729186' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/8634436508082729186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/8634436508082729186'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2009/04/further-steps-scalagwtapp-engineeclipse.html' title='Further steps: Scala/GWT/App Engine/Eclipse'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-6256921735838665361</id><published>2009-02-11T02:19:00.003-05:00</published><updated>2009-02-11T02:32:04.519-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='miscellaneous'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='unix'/><title type='text'>HOWTO not get "/usr/bin/env: bad interpreter"</title><content type='html'>If you get this:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;bash: ./my-script.py: /usr/bin/env: bad interpreter: Permission denied&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The partition your script lives on may be mounted with the "user" option set. "user" implies "noexec" (see the manpage for "mount"), which is going to keep you from running executables. And while running a binary executable from this kind of partition fails more clearly, trying to run a script with a shebang gives you this more confusing error message.&lt;br /&gt;&lt;br /&gt;To fix! Add "exec" after your "user" flag in /etc/fstab. (again, see "man mount").&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-6256921735838665361?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/6256921735838665361/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=6256921735838665361' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/6256921735838665361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/6256921735838665361'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2009/02/howto-not-get-usrbinenv-bad-interpreter.html' title='HOWTO not get &quot;/usr/bin/env: bad interpreter&quot;'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-5842393326572398597</id><published>2009-01-17T23:56:00.004-05:00</published><updated>2009-01-18T00:12:51.869-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='logo'/><category scheme='http://www.blogger.com/atom/ns#' term='languages'/><title type='text'>Lisp insights from learning Logo</title><content type='html'>So I was just writing a simple recursive procedure in Logo. I wanted to go down a list, cons up a new list, and return the empty list when I get to the end.&lt;br /&gt;&lt;br /&gt;My first pass, once I found out how to return something from a function (Logo procedures aren't expressions -- you have to explicitly return) had a line like this:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;if (stacks = []) (output [])&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Running the procedure gave me the helpful error message:&lt;br /&gt;&lt;code&gt;output didn't output to if  in astep&lt;br /&gt;[if (stacks = [] ) (output [] )]&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Pardon?&lt;br /&gt;&lt;br /&gt;When I remembered that Logo's "if" wants a list of instructions, it clicked with my new nugget of knowledge that &lt;a href="http://www.cs.berkeley.edu/%7Ebh/v1ch2/proced.html"&gt;literal lists are &lt;span style="font-style: italic;"&gt;quoted&lt;/span&gt; in Logo&lt;/a&gt;. Then I understood what was going on: this "if" is neither a macro (like in Scheme, or most languages) nor lazily evaluated (like Haskell). It's a regular function, but one that expects quoted code to evaluate on demand at runtime.  Rubyists and Smalltalkers: this is something like how an if block works for you, yes?&lt;br /&gt;&lt;br /&gt;Here's an analogy into Python, for the non-Lispers out there:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;def myIf(tf, truecode, falsecode):&lt;br /&gt;&amp;nbsp;&amp;nbsp;code = {True : truecode, False : falsecode}&lt;br /&gt;&amp;nbsp;&amp;nbsp;return eval(code[tf])&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&gt;&gt;&gt; myIf(0 == 1, "'it was ' + 'true'", "'it was not true'.upper()")&lt;br /&gt;'IT WAS NOT TRUE'&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&gt;&gt;&gt; myIf(0 == 0, "'it was ' + 'true'", "'it was not true'.upper()")&lt;br /&gt;'it was true'&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Also, apparently Logo in general has dynamic scope -- which shouldn't surprise me, since lexical scope is relatively new in Lisp. And Berkeley Logo in particular has macros. Maybe my little compiler project is going to be harder than I expected. Honestly, I was imagining I'd be done if I could just parse it, do some simple transformations on the tree and spit JavaScript.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-5842393326572398597?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/5842393326572398597/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=5842393326572398597' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/5842393326572398597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/5842393326572398597'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2009/01/lisp-insights-from-learning-logo.html' title='Lisp insights from learning Logo'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-5418947745673361571</id><published>2009-01-11T00:32:00.011-05:00</published><updated>2009-01-18T00:15:45.466-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><category scheme='http://www.blogger.com/atom/ns#' term='education'/><category scheme='http://www.blogger.com/atom/ns#' term='logo'/><category scheme='http://www.blogger.com/atom/ns#' term='languages'/><title type='text'>my code has a side effect: learning!</title><content type='html'>So I'm working through the exercises in &lt;a href="http://book.realworldhaskell.org/"&gt;Real World Haskell&lt;/a&gt;. &lt;a href="http://code.google.com/p/narorumo/source/browse/#svn/trunk/rwh"&gt;Here's what I've got so far&lt;/a&gt;. As of this writing, I'm in the middle of chapter 4. RWH totally deserves all the buzz it's been getting; it's very approachable and well-written, and my Haskell is improving rapidly. The book is still free online, but I bought the printed copy, in large part because Bryan O'Sullivan gave such a &lt;a href="http://en.oreilly.com/oscon2008/public/schedule/detail/2852"&gt;great talk&lt;/a&gt; at OSCON.&lt;br /&gt;&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;a href="http://code.google.com/p/narorumo/source/browse/#svn/trunk/wogo"&gt;My earlier Haskell project&lt;/a&gt; had stalled out due to my not being very good at the language yet. What I want to do is build a compiler for &lt;a href="http://en.wikipedia.org/wiki/Logo_%28programming_language%29"&gt;Logo&lt;/a&gt; that produces JavaScript, with the turtle graphics on a canvas tag. Logo is an acceptable Lisp! I'd love to see it get more use.&lt;br /&gt;&lt;br /&gt;Interestingly, though:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;There's already a beautiful Logo implementation that runs in javascript: &lt;a href="http://code.google.com/p/papert/"&gt;papert&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://shiftpop.blogspot.com/"&gt;Mark&lt;/a&gt; is &lt;a href="http://atlhack.org/2009/01/07/hackfest-10000101/"&gt;working on&lt;/a&gt; something like papert, but for Processing -- he wants to put your Processing sketches, how you say, in the cloud.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;There are some really nice (and free!) introductory CS texts that feature Logo. &lt;a href="http://www.cs.berkeley.edu/%7Ebh/logo.html"&gt;Brian Harvey&lt;/a&gt; has a pretty serious three-volume set. And there's a &lt;a href="http://openbookproject.net/thinkcs/logo.php"&gt;version&lt;/a&gt; of &lt;a href="http://www.greenteapress.com/"&gt;How to Think Like a Computer Scientist&lt;/a&gt; &lt;a href="http://openbookproject.net/thinkcs/logo.php"&gt;done in Logo&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-5418947745673361571?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/5418947745673361571/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=5418947745673361571' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/5418947745673361571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/5418947745673361571'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2009/01/my-code-has-side-effect-learning.html' title='my code has a side effect: learning!'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-4719183215105427550</id><published>2008-11-23T11:08:00.003-05:00</published><updated>2008-11-23T17:55:45.826-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='unix'/><category scheme='http://www.blogger.com/atom/ns#' term='ui'/><title type='text'>Fixing your Ubuntu suspend/resume problems</title><content type='html'>After some recent update, my Ubuntu box (currently "&lt;a href="http://en.wikipedia.org/wiki/Intrepid_Ibex"&gt;Intrepid Ibex&lt;/a&gt;") started having a problem where the networking wouldn't come back up when waking from suspend mode. My machine uses the "forcedeth" ethernet driver (quite a name \m/ ).&lt;br /&gt;&lt;br /&gt;The fix! Mentioned tersely &lt;a href="https://bugs.launchpad.net/ubuntu/+source/linux/+bug/288281"&gt;over here&lt;/a&gt;, and slightly more clearly &lt;a href="https://wiki.ubuntu.com/IntrepidReleaseNotes/#Wireless%20doesn%27t%20work%20after%20suspend%20with%20ath_pci%20driver"&gt;over here&lt;/a&gt;, all I had to do was create a file &lt;span style="font-family:courier new;"&gt;/etc/pm/config.d/01-modules&lt;/span&gt; that contains this line:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SUSPEND_MODULES="forcedeth"&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Apparently you can name the file &lt;span style="font-family:courier new;"&gt;&lt;/span&gt;something else, as long as it's in the same directory, but this one worked for me. And of course, if you're having trouble with a different driver, change "forcedeth" to the right module name.&lt;br /&gt;&lt;br /&gt;It's 2008 -- why is power management still tricky on Linux? Users (like your non-technical family members) should never have to do this sort of thing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-4719183215105427550?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/4719183215105427550/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=4719183215105427550' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/4719183215105427550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/4719183215105427550'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2008/11/fixing-your-ubuntu-suspendresume.html' title='Fixing your Ubuntu suspend/resume problems'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-3712930931151696875</id><published>2008-11-16T11:38:00.003-05:00</published><updated>2008-11-16T11:47:10.705-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='ui'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='machine learning'/><title type='text'>I could have just emailed them a photo of my shelf</title><content type='html'>I seem to have just spent 20 minutes flipping through Amazon's book recommendations, finding books that I already own and checking the box that says so. This, of course, made other books that I already own pop up, which I then clicked. And it was kind of fun. Thoughts that ran through my head included "I have the first edition but not this latest one, does that count?" and "&lt;a href="http://rockstargirl.org"&gt;Lindsey&lt;/a&gt; has that one -- that's almost like I have it, right?"&lt;br /&gt;&lt;br /&gt;Excellent design, Amazon dudes and dudettes. I don't begrudge you that training data at all.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-3712930931151696875?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/3712930931151696875/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=3712930931151696875' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/3712930931151696875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/3712930931151696875'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2008/11/i-could-have-just-emailed-them-photo-of.html' title='I could have just emailed them a photo of my shelf'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-5985643350763288798</id><published>2008-10-09T01:11:00.006-04:00</published><updated>2008-10-09T01:33:34.156-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='olpc'/><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='ui'/><title type='text'>Debian on the OLPC</title><content type='html'>I should go to bed, but I'm having so much fun setting up Debian on my XO laptop.&lt;br /&gt;&lt;br /&gt;It was super-easy getting it installed (&lt;a href="http://wiki.laptop.org/go/Installing_Debian_as_an_upgrade"&gt;instructions here&lt;/a&gt;); you use the same command for updating to a new version of the standard olpc software &lt;span style="font-style: italic;"&gt;and&lt;/span&gt; for installing Debian. Or &lt;a href="http://wiki.laptop.org/go/Edubuntu"&gt;Edubuntu&lt;/a&gt;, apparently.&lt;br /&gt;&lt;br /&gt;For extra disk space, I blew away the default Sugar/Fedora install -- it's pretty easy to get back to a fresh state, just in case I want to set that up again later.&lt;br /&gt;&lt;br /&gt;In 472 megs, I have the base Debian, X.org, subversion, vim, fluxbox, mzscheme, and the Glasgow Haskell Compiler, the install for which pulled in gcc, so was big.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-5985643350763288798?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/5985643350763288798/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=5985643350763288798' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/5985643350763288798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/5985643350763288798'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2008/10/debian-on-olpc.html' title='Debian on the OLPC'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-2131879462356445093</id><published>2008-09-14T18:42:00.004-04:00</published><updated>2008-09-15T00:32:50.225-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>sudokudlx: Automatic Sudoku Solving with Dancing Links</title><content type='html'>In case I hadn't shown you yet, here's my Python implementation of a Dancing Links sudoku solver, on appengine!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sudokudlx.appspot.com/"&gt;http://sudokudlx.appspot.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Also, I've written a bit about &lt;a href="http://code.google.com/p/narorumo/wiki/SudokuDLX"&gt;how to use Dancing Links (DLX) to solve sudoku puzzles&lt;/a&gt;. Soon, I'll write up how to implement DLX.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-2131879462356445093?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/2131879462356445093/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=2131879462356445093' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/2131879462356445093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/2131879462356445093'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2008/09/sudokudlx-automatic-sudoku-solving-with.html' title='sudokudlx: Automatic Sudoku Solving with Dancing Links'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-8867140924448426749</id><published>2008-09-07T00:21:00.003-04:00</published><updated>2008-09-07T00:33:10.714-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='language'/><title type='text'>plats is Swedish for "locale".</title><content type='html'>My first pass for solving the &lt;a href="http://penguinparens.blogspot.com/2008/09/figuring-out-users-language-preferences.html"&gt;problem from a few days ago&lt;/a&gt; is now live on appengine.&lt;br /&gt;&lt;br /&gt;Check it out: &lt;a href="http://plats.appspot.com"&gt;http://plats.appspot.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Just include a script in your page and you get a variable or a meta tag (for GWT apps) to tell you which locale you should be in. &lt;a href="http://code.google.com/docreader/#p=narorumo&amp;amp;s=narorumo&amp;amp;t=Plats"&gt;Details here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-8867140924448426749?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/8867140924448426749/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=8867140924448426749' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/8867140924448426749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/8867140924448426749'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2008/09/plats-is-swedish-for-locale.html' title='plats is Swedish for &quot;locale&quot;.'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-5657013639184426277</id><published>2008-09-04T23:45:00.005-04:00</published><updated>2008-09-07T00:33:35.723-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='language'/><title type='text'>figuring out the user's language preferences, client-side</title><content type='html'>Your browser sends an HTTP header field called "&lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html"&gt;Accept-Language&lt;/a&gt;" (see 14.4) when you make a request to a web server. It tells the server which languages you prefer, and in which ordering, so the server can send you localized content with graceful fallbacks. You can muck with these, for example, in your Firefox settings under Preferences &gt; Content &gt; Languages.&lt;br /&gt;&lt;br /&gt;So I'd like to do this on the client side. I had the bright idea that I would just build an XMLHttpRequest object and &lt;span style="font-style: italic;"&gt;ask&lt;/span&gt; it what headers it was about to send (XHRs do send this field), but GWT's HTTP objects don't let you get at request headers that you haven't explicitly set. The very good reason for this is that &lt;a href="http://www.w3.org/TR/2008/WD-XMLHttpRequest-20080415/#notcovered"&gt;XMLHttpRequest objects don't let you query their headers&lt;/a&gt;. Oh noes.&lt;br /&gt;&lt;br /&gt;It may be that the way to do this is with a bit of server-side cleverness, but that's not the answer I want. Unless somebody happens to have a way to snag these settings from JavaScript...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-5657013639184426277?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/5657013639184426277/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=5657013639184426277' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/5657013639184426277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/5657013639184426277'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2008/09/figuring-out-users-language-preferences.html' title='figuring out the user&apos;s language preferences, client-side'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-1007485533511910775</id><published>2008-08-29T00:31:00.005-04:00</published><updated>2008-08-29T00:47:53.088-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><category scheme='http://www.blogger.com/atom/ns#' term='ui'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='atlanta'/><title type='text'>GWT 1.5 release!</title><content type='html'>Wooooo, new version of GWT! This is huge. We've been working really hard on this for quite a while.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/webtoolkit"&gt;http://code.google.com/webtoolkit&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;What's new? &lt;a href="http://code.google.com/docreader/#p=google-web-toolkit-doc-1-5&amp;amp;s=google-web-toolkit-doc-1-5&amp;amp;t=Newfeatures"&gt;Check check check it!&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-1007485533511910775?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/1007485533511910775/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=1007485533511910775' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/1007485533511910775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/1007485533511910775'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2008/08/gwt-15-release.html' title='GWT 1.5 release!'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-5750636115928001789</id><published>2008-08-18T14:24:00.004-04:00</published><updated>2008-08-18T14:31:39.747-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='ui'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Firefox 3: you can drag tabs between windows!</title><content type='html'>That's a pretty neat feature: drag a tab from the tab bar on one Firefox window into another one. You can also drag them into your bookmarks toolbar.&lt;br /&gt;&lt;br /&gt;I'd like a way to grab hold of a tab and drag it out into space, forming a new window, but this might be hard to implement --  some systems would make a link on the Desktop. Failing that, an "open this tab in new window" command would be nice.&lt;br /&gt;&lt;br /&gt;I could put in a feature request, I suppose -- or even a patch! How hard could that be to implement?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-5750636115928001789?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/5750636115928001789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=5750636115928001789' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/5750636115928001789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/5750636115928001789'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2008/08/firefox-3-you-can-drag-tabs-between.html' title='Firefox 3: you can drag tabs between windows!'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-157506687546427291</id><published>2008-07-08T22:49:00.006-04:00</published><updated>2008-07-08T23:28:51.716-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='languages'/><title type='text'>Lisp snippets on a Tuesday night</title><content type='html'>The &lt;a href="http://www.icfpcontest.org/"&gt;ICFP contest&lt;/a&gt; is coming up, and &lt;a href="http://rockstargirl.org/"&gt;Lindsey Kuper&lt;/a&gt; and I have been building our Scheme muscles. I was looking for an implementation of hash tables (or just some quick way to do a map), and I ran across the &lt;a href="http://srfi.schemers.org/"&gt;SRFI&lt;/a&gt;s -- Scheme Requests for Implementation. It's a semi-standard library of useful stuff for Scheme, and it's &lt;a href="http://docs.plt-scheme.org/srfi/index.html"&gt;bundled with recent PLT Schemes&lt;/a&gt;! You can just say: &lt;code&gt;(require srfi/n)&lt;/code&gt; to load up the &lt;span style="font-style: italic;"&gt;n&lt;/span&gt;th SRFI; they're numbered. Particularly, I've been playing with the extended libraries for &lt;a href="http://srfi.schemers.org/srfi-1/"&gt;lists&lt;/a&gt;, &lt;a href="http://srfi.schemers.org/srfi-13/"&gt;strings&lt;/a&gt;, and &lt;a href="http://srfi.schemers.org/srfi-69/"&gt;hash tables&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;On the Common Lisp side of things; I just ran across the insanely useful &lt;code&gt;&lt;a href="http://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node230.html"&gt;describe&lt;/a&gt;&lt;/code&gt;, which prints out what the system knows about a given object -- if it's a function with a docstring, the docstring will be in there. Also potentially useful: &lt;code&gt;&lt;a href="http://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node224.html"&gt;disassemble&lt;/a&gt;&lt;/code&gt;. Give it a function; it does what it sounds like!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-157506687546427291?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/157506687546427291/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=157506687546427291' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/157506687546427291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/157506687546427291'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2008/07/lisp-snippets-on-tuesday-night.html' title='Lisp snippets on a Tuesday night'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-6718066885390844711</id><published>2008-06-09T23:43:00.006-04:00</published><updated>2008-06-10T02:35:58.067-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='education'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='languages'/><title type='text'>reconsidering applets</title><content type='html'>Applets are a really tempting idea. The JVM is a serious piece of machinery; despite its startup time, once it gets rolling, Java can go fast indeed. And although it hasn't been very widely used, applets and javascript have had a means of calling back and forth for quite a while. It's called &lt;a href="http://developer.mozilla.org/en/docs/LiveConnect"&gt;LiveConnect&lt;/a&gt;. (although LiveConnect may be &lt;a href="http://developer.mozilla.org/en/docs/Gecko_Plugin_API_Reference:Scripting_plugins"&gt;replaced&lt;/a&gt; at some point...)&lt;br /&gt;&lt;br /&gt;So, a beefy, fast VM that runs inside the browser, coupled with a nice web UI, and no manual installs for your users -- big win?&lt;span style="font-style: italic;"&gt; &lt;/span&gt;Maybe! On considering this, one of my first thoughts was to put Jython into an applet and build something akin to &lt;a href="http://coweb.cc.gatech.edu/mediaComp-plan/94"&gt;JES&lt;/a&gt;  -- a little Jython IDE in the browser! The kids would love it!&lt;span style="font-style: italic;"&gt;&lt;/span&gt; So I set out to make this happen, or at least build a proof-of-concept.&lt;br /&gt;&lt;br /&gt;I ran into a serious snag, though --  the Jython interpreter works by compiling to bytecode and bringing it up with the class loader, the latter of which applets aren't typically allowed to do. Special permission can be granted with a Java policy file, but that's a very high barrier to entry. It's certainly not the sort of thing a person might do on a public terminal. Signing the applets may also be an option -- but that's also a pain, and anecdotally, I think signed applets may not always get the same rights, cross-platform.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Once I understood the permissions issue, I did get a little Jython repl going -- it  just hooks "eval" up to some javascript for output. Nothing fancy, but kind of satisfying. &lt;/span&gt;For now, though, it doesn't look like Jython IDEs are coming to the browser. Until we rewrite it to not use of the class loader. Or just use some more modern approach.&lt;br /&gt;&lt;br /&gt;Some other people have had similar thoughts!&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://tams-www.informatik.uni-hamburg.de/applets/jython/index-old.html"&gt;Interactive Jython Console&lt;/a&gt;: this one, for the exact same reasons that mine does, requires a java policy file.&lt;/li&gt;&lt;li&gt;the &lt;a href="http://code.google.com/p/ruby-in-browser/"&gt;ruby-in-browser&lt;/a&gt; project. It does exactly pretty much what it sounds like it does, also by means of an applet and LiveConnect. Interestingly, JRuby doesn't seem to use the class loader, it just works! &lt;a href="http://ruby-in-browser.googlecode.com/svn/trunk/evalruby/index.html"&gt;Check out the demo&lt;/a&gt;! [thanks for the heads-up, &lt;a href="http://rockstargirl.org/"&gt;Lindsey Kuper&lt;/a&gt;!] &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-6718066885390844711?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/6718066885390844711/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=6718066885390844711' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/6718066885390844711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/6718066885390844711'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2008/06/reconsidering-applets.html' title='reconsidering applets'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-1625387236289070495</id><published>2008-05-28T13:05:00.006-04:00</published><updated>2008-05-28T13:34:47.215-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>GWT 1.5RC1 -- we're pretty pumped.</title><content type='html'>Google Web Toolkit 1.5 RC1 is live!&lt;br /&gt;&lt;a href="http://googlewebtoolkit.blogspot.com/2008/05/google-web-toolkit-15-release-candidate.html"&gt;http://googlewebtoolkit.blogspot.com/2008/05/google-web-toolkit-15-release-candidate.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Get the bits while they're hot.&lt;br /&gt;&lt;a href="http://code.google.com/webtoolkit/download.html"&gt;http://code.google.com/webtoolkit/download.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;GWT 1.5 has a whole lot of wild improvements, &lt;a href="http://code.google.com/docreader/#p%28google-web-toolkit-doc-1-5%29s%28google-web-toolkit-doc-1-5%29t%28Whatsnewin15%29"&gt;detailed here&lt;/a&gt; -- but importantly, compiler now supports Java 5 features and produces even tighter code than before, and the &lt;a href="http://code.google.com/docreader/#p%28google-web-toolkit-doc-1-5%29s%28google-web-toolkit-doc-1-5%29t%28ReleaseNotes_1_5_Ui%29"&gt;UI library has had some pretty serious reworking&lt;/a&gt; -- there's a new API for working directly with the DOM in a typesafe way, and GWT apps now come with nice styling by default. We've been working pretty hard.&lt;br /&gt;&lt;br /&gt;Oh, and don't miss the &lt;a href="http://code.google.com/docreader/#p%28google-web-toolkit-doc-1-5%29"&gt;new documentation browser&lt;/a&gt; :) Much better &lt;a href="http://code.google.com/p/google-web-toolkit-doc-1-5/w/list"&gt;than browsing the GWT wiki docs by hand&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Share and enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-1625387236289070495?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/1625387236289070495/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=1625387236289070495' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/1625387236289070495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/1625387236289070495'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2008/05/gwt-15rc1-were-pretty-pumped.html' title='GWT 1.5RC1 -- we&apos;re pretty pumped.'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-2527041294249337356</id><published>2008-05-01T23:37:00.004-04:00</published><updated>2008-05-01T23:46:44.694-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='languages'/><title type='text'>Real World Haskell</title><content type='html'>In case you haven't been exposed to enough &lt;a href="http://www.haskell.org/"&gt;Haskell&lt;/a&gt; buzz recently, there's a new book in the works: &lt;cite&gt;Real World Haskell&lt;/cite&gt; by Bryan O'Sullivan, to be published by O'Reilly. In addition to the abstract functional loveliness that you expect, they're going to build webapps that talk to databases, which is not the first thing that pops into my mind when I think "Haskell".&lt;br /&gt;&lt;br /&gt;&lt;a href="http://book.realworldhaskell.org/beta/"&gt;Beta chapters are here.&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;(if you knew where to look, there was an announcement on LtU about being an &lt;span style="font-style: italic;"&gt;alpha&lt;/span&gt; reviewer, to get at the pre-pre-release chapters...)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-2527041294249337356?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/2527041294249337356/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=2527041294249337356' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/2527041294249337356'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/2527041294249337356'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2008/05/real-world-haskell.html' title='Real World Haskell'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-8064989879604331245</id><published>2008-04-16T00:34:00.004-04:00</published><updated>2008-04-16T01:02:27.031-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><category scheme='http://www.blogger.com/atom/ns#' term='miscellaneous'/><category scheme='http://www.blogger.com/atom/ns#' term='unix'/><category scheme='http://www.blogger.com/atom/ns#' term='ui'/><title type='text'>vim tip: don't mess up the indentation when you paste</title><content type='html'>vim does really lovely autoindenting. But what happens when you want to paste in pre-formatted text from somewhere else? All your code indents way off to the side, oh noes! Here's what to do.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;:set paste&lt;/code&gt;&lt;br /&gt;Okay, now paste.&lt;br /&gt;&lt;code&gt;:set nopaste&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Perfect. I rated &lt;a href="http://www.vim.org/tips/tip.php?tip_id=330"&gt;this tip&lt;/a&gt; "life-changing".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-8064989879604331245?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/8064989879604331245/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=8064989879604331245' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/8064989879604331245'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/8064989879604331245'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2008/04/vim-tip-dont-mess-up-indentation-when.html' title='vim tip: don&apos;t mess up the indentation when you paste'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-4963867058325922200</id><published>2008-03-25T23:30:00.002-04:00</published><updated>2008-03-25T23:49:31.788-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nlp'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='meta'/><category scheme='http://www.blogger.com/atom/ns#' term='language'/><title type='text'>Penguin Parens: referenced by NLTK!</title><content type='html'>A while ago, &lt;a href="http://penguinparens.blogspot.com/2006/10/nltk-and-generating-horoscopes.html"&gt;I was working on remixing horoscopes&lt;/a&gt; and I gushed quite a bit about the lovely free Python NLP toolkit &lt;a href="http://nltk.org/index.php/Main_Page"&gt;NLTK&lt;/a&gt;. And I was honored to get a comment from &lt;a href="http://www.csse.unimelb.edu.au/%7Esb"&gt;Steven Bird&lt;/a&gt;, one of the NLTK developers and an eminent natural language researcher.&lt;br /&gt;&lt;br /&gt;It turns out that they quoted my blog post for the "&lt;a href="http://nltk.org/index.php/Quotes"&gt;Quotes&lt;/a&gt;" page. Aw :)&lt;br /&gt;&lt;br /&gt;I'm &lt;a href="http://homestarrunner.com/senorialday.html"&gt;checking out their circumstance&lt;/a&gt; again, so to speak -- and it's grown so much. They've got most of a &lt;a href="http://nltk.org/index.php/Book"&gt;textbook&lt;/a&gt; (free online!) put together. And the &lt;a href="http://nltk.org/doc/api/"&gt;API&lt;/a&gt; is gigantic, so much code! Amazing. I'm going to have to dig back into it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-4963867058325922200?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/4963867058325922200/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=4963867058325922200' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/4963867058325922200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/4963867058325922200'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2008/03/penguin-parens-referenced-by-nltk.html' title='Penguin Parens: referenced by NLTK!'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-785350627497328978</id><published>2008-03-23T14:08:00.002-04:00</published><updated>2008-03-23T15:08:24.248-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='retro'/><category scheme='http://www.blogger.com/atom/ns#' term='macintosh'/><category scheme='http://www.blogger.com/atom/ns#' term='history'/><category scheme='http://www.blogger.com/atom/ns#' term='emulation'/><title type='text'>you need more retrocomputing:  Mini vMac and old Apple software</title><content type='html'>So I was looking for &lt;a href="http://wiki.laptop.org/go/Activities"&gt;cool activities&lt;/a&gt; for my new &lt;a href="http://www.laptop.org/laptop/"&gt;XO laptop&lt;/a&gt;, and I ran across &lt;a href="http://minivmac.sourceforge.net/"&gt;Mini vMac&lt;/a&gt;, an emulator for the &lt;a href="http://en.wikipedia.org/wiki/Macintosh_Plus"&gt;Macintosh Plus&lt;/a&gt;; it's cross-platform, but if you happen to have an XO, here's the &lt;a href="http://wiki.laptop.org/go/Mini_vMac"&gt;.xo activity&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;And it works really well! You'll need a ROM image, y'know, &lt;a href="http://rolli.ch/MacPlus/welcome.html"&gt;taken from the Mac Plus that you personally own&lt;/a&gt;, and also an image from a "System" disk (available on that same page).&lt;br /&gt;&lt;br /&gt;But! As the Mini vMac page points out, you can get old Macintosh System software from somewhere else -- Apple's own &lt;a href="http://www.info.apple.com/support/oldersoftwarelist.html"&gt;Older Software Downloads page&lt;/a&gt;, which features all sorts of outdated Apple software. System disks, drivers for bizarre old SCSI hardware... and &lt;a href="http://en.wikipedia.org/wiki/Hypercard"&gt;Hypercard&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The Mini vMac page also links to this fantastic &lt;a href="http://minivmac.sourceforge.net/sw/index.html"&gt;compendium of old macintosh software&lt;/a&gt; from third parties, which has even more wild old stuff, like vim 3, forgotten Lisps and MLs, games that you might remember.&lt;br /&gt;&lt;br /&gt;I'm going to have to run this fullscreen on my Macbook Pro, woo!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-785350627497328978?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/785350627497328978/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=785350627497328978' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/785350627497328978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/785350627497328978'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2008/03/you-need-more-retrocomputing-mini-vmac.html' title='you need more retrocomputing:  Mini vMac and old Apple software'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-8817326469059171420</id><published>2008-03-07T02:26:00.009-05:00</published><updated>2008-03-07T04:35:22.688-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='retro'/><category scheme='http://www.blogger.com/atom/ns#' term='miscellaneous'/><category scheme='http://www.blogger.com/atom/ns#' term='ui'/><category scheme='http://www.blogger.com/atom/ns#' term='history'/><title type='text'>more retrocomputing: procedural graphics languages!</title><content type='html'>One of my first online experiences -- and probably the first for a lot of people, came in the form of &lt;a href="http://en.wikipedia.org/wiki/Prodigy_%28online_service%29"&gt;Prodigy&lt;/a&gt;, over dialup, on an old DOS box. At the time, Prodigy wasn't an ISP as such -- it was an insular online community, with its own exclusive content and games and message boards and email. Of course, this model wasn't sustainable forever...&lt;br /&gt;&lt;br /&gt;But! The interesting thing about Prodigy was the graphics. It was clear, at the time, that it wasn't downloading "images" as such -- y'know, like &lt;a href="http://en.wikipedia.org/wiki/Raster_graphics"&gt;raster graphics&lt;/a&gt; -- it was drawing in terms of commands that would build pictures out of shapes. This was kind of cool; the dialup link was slow enough that you could see it building the picture, usually bigger background shapes first, then the details would get filled in. It occurs to me now that it must have been somebody's job to work out how to draw pictures like this...&lt;br /&gt;&lt;br /&gt;It turns out that Prodigy was using the standard language for this: &lt;a href="http://en.wikipedia.org/wiki/NAPLPS"&gt;NAPLPS&lt;/a&gt;, the North American Presentation Level Protocol Syntax. And there were &lt;a href="http://en.wikipedia.org/wiki/Videotex"&gt;several&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Viewtron"&gt;other&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Alex_%28videotex_service%29"&gt;services&lt;/a&gt; that used the same approach -- some of them sent the commands over modems, like Prodigy, but some went over TV, during that mystical &lt;a href="http://en.wikipedia.org/wiki/Vertical_blanking_interval"&gt;vertical blanking interval&lt;/a&gt; that broadcast engineers talk about.&lt;br /&gt;&lt;br /&gt;Speaking of sending non-raster graphics down the wire: did you know that there's a set of drawing commands understood by some DEC terminals? It's true. It's called &lt;a href="http://www.vt100.net/docs/vt3xx-gp/chapter1.html"&gt;ReGIS&lt;/a&gt;. At one point, &lt;a href="http://fluidtoons.blogspot.com/"&gt;Brett&lt;/a&gt; and I got our hands on some old DEC terminals and spent a few afternoons messing around with this on something that must've been a vt340 or vt420. You can find out all sorts of wonderful things about DEC terminals at the super-top-notch &lt;a href="http://vt100.net/"&gt;vt100.net&lt;/a&gt;. These things seem to be indestructable; I held on to the vt220 for years, passing the joy forward sometime in college; it was still chatting amiably over the serial port on my Linux box, and almost as old as I was.&lt;br /&gt;&lt;br /&gt;That's all for now. Happy hacking!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-8817326469059171420?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/8817326469059171420/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=8817326469059171420' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/8817326469059171420'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/8817326469059171420'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2008/03/more-retrocomputing-procedural-graphics.html' title='more retrocomputing: procedural graphics languages!'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-2737269920621846496</id><published>2008-02-29T23:59:00.004-05:00</published><updated>2008-03-01T01:21:57.837-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='miscellaneous'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>in which alexr surprises you by linking to Microsoft software</title><content type='html'>If you &lt;a href="http://images.google.com/images?hl=en&amp;amp;q=time+breakdown+of+modern+web+design"&gt;build web applications&lt;/a&gt;, you've got to contend with Internet Explorer, versions 6 and 7. The quandary is that it's not clear how to have both versions installed at the same time. Some people have resorted to using several virtual machines, but this turns out to be overkill.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://rockstargirl.org/"&gt;Lindsey Kuper&lt;/a&gt; comes to our rescue, and points out this article: &lt;a href="http://www.tech-recipes.com/rx/1188/ie7_use_ie6_ie7_together"&gt;Using IE6 and IE7 together&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://browsers.evolt.org/download.php?/ie/32bit/standalone/ie6eolas_nt.zip"&gt;The first approach&lt;/a&gt; in that article was especially helpful for me: there's a version of IE6 bundled with all the libraries, ready to go even if the updates have installed IE7 for you. It works great, in as far as IE6 can be said to "work great".&lt;br /&gt;&lt;br /&gt;What &lt;span style="font-style: italic;"&gt;is&lt;/span&gt; surprisingly nice is the &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=e59c3964-672d-4511-bb3e-2d5e1db91038&amp;amp;displaylang=en"&gt;Internet Explorer Developer Toolbar&lt;/a&gt;. This is from those cats in Redmond, and I'm surprised it's not more widely publicized. It comes with a very functional DOM inspector that users of &lt;a href="http://www.getfirebug.com/"&gt;Firebug&lt;/a&gt; will figure out pretty quickly, and it works with that standalone IE6.&lt;br /&gt;&lt;br /&gt;So! Now you can more easily and precisely diagnose just which inane and hateful things the IE rendering engine is doing to your app!&lt;br /&gt;&lt;br /&gt;Happy hacking, and good luck :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-2737269920621846496?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/2737269920621846496/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=2737269920621846496' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/2737269920621846496'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/2737269920621846496'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2008/02/in-which-alexr-surprises-you-by-linking.html' title='in which alexr surprises you by linking to Microsoft software'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-5702301216995156643</id><published>2008-02-26T23:18:00.001-05:00</published><updated>2008-02-26T23:23:11.141-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='culture'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='software engineering'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Today's viewing: Linus on git.</title><content type='html'>Not too many months ago, &lt;a href="http://www.youtube.com/watch?v=4XpnKHJAok8"&gt;Linus gave a talk at Google about git&lt;/a&gt;, the distributed version control system he built for use in managing the Linux kernel. He spoke, in typical non-diplomatic Linus style, about why everybody should switch to git and why CVS, Subversion, Perforce, and non-distributed source control in general is broken.&lt;br /&gt;&lt;br /&gt;"There's a few of them in the room, I suspect -- you're stupid!"&lt;br /&gt;-- Linus calls out the svn developers on hand&lt;br /&gt;&lt;br /&gt;The Linux kernel team had previously been using the proprietary BitKeeper, which a number of kernel developers (including Alan Cox, with his Mighty Unix Beard) chose not to use. Before that, source control for the kernel was handled by sending patches around -- preferable to using centralized source control, according to Linus.&lt;br /&gt;&lt;br /&gt;So let it be known that I haven't actually /used/ git yet, or in fact any distributed source control system -- but I like the idea so far. In this post, I'll outline the reasons Linus lays out for why we should be using git.&lt;br /&gt;&lt;br /&gt;First off, the distributed nature of git also has performance and convenience benefits, from the simple fact that it doesn't need to make network roundtrips.  Having your own repository on the local machine means that you're always set to go, even if the network is slow or unavailable.&lt;br /&gt;&lt;br /&gt;Secondly, traditional source control makes branching and merging branches hard (Linus points out that many real-live software developers have never done it), so you don't want to commit your work until it's ready to be seen by others -- this means that you can't do much version control during the actual code-writing process. Contrastingly, in distributed source control, every checkout acts as its own branch, so each developer has at least one. This has the benefit that you can commit to your own repository whenever you want -- and then back up to previous versions whenever you like.&lt;br /&gt;&lt;br /&gt;Centralized approaches to source control are particular drag when people are depending on your committed code as correct, or at least non-breaking -- you're not allowed to commit until your changes are ready for the rest of the team. As a project gets bigger, the associated test suite (hopefully) does as well, eventually leading to a pretty involved testing procedure that developers are supposed to complete before committing. And as Linus puts it, "... people make one-liner changes and ignore the test suite, because they know that those one-liners can't /possibly/, /possibly/ break." And then these breaking changes get pushed out to the rest of the team. The alternative approach, with git, is that you commit to your own version of the repository whenever you want, and when you're ready, your teammates can pull from you -- but in the mean time, you get all the benefits of having your own branch(es).&lt;br /&gt;&lt;br /&gt;Thirdly -- social benefits! In his development process, Linus only pulls code from ten or fifteen other developers, whom he trusts to have filtered "up" appropriate changes from the people that they interact with. As he puts it, "if you have determined that somebody else is smarter than you -- go for it!" So the Linux kernel source control process mirrors the social networks of trust that make the whole thing happen. In the end, a lot of people end up only looking at the Linus branch, the defacto "official" one.&lt;br /&gt;&lt;br /&gt;This dodges the social issue of giving out commit access to the central repository. Traditionally when managing a project, you create this class of people who are "ostensibly not morons", and typically, you make that group of people too small. Distributed model makes this go away, because everybody has his own branch. And if you happen to do good work in your own branch, then people start pulling from you! "That alone means that every single open-source project should use nothing but a distributed model."&lt;br /&gt;&lt;br /&gt;So. That's what Linus said. Will everyone switch to git or some other distributed source control? We'll find out. Adoption would certainly be helped out if major project-hosting sites like Sourceforge or Google Code added git support. But sort of the point of the distributed model is that there's no one central hosting point...&lt;br /&gt;&lt;br /&gt;Maybe I'll try it out. I'll let you know.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-5702301216995156643?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/5702301216995156643/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=5702301216995156643' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/5702301216995156643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/5702301216995156643'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2008/02/todays-viewing-linus-on-git.html' title='Today&apos;s viewing: Linus on git.'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-7073307432839903981</id><published>2008-01-07T00:38:00.000-05:00</published><updated>2008-01-07T01:35:01.624-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ai'/><category scheme='http://www.blogger.com/atom/ns#' term='readings'/><category scheme='http://www.blogger.com/atom/ns#' term='machine learning'/><title type='text'>today's reading: Neighbourhood Components Analysis</title><content type='html'>&lt;a href="http://scholar.google.com/scholar?cluster=11997995618429793722"&gt;Goldberger, Roweis, Hinton, and Salakhutdinov: Neighbourhood Components Analysis.&lt;/a&gt; The punchline: &lt;span style="font-style: italic;"&gt;... learning a linear transformation of the input space such that in the transformed space, KNN performs well.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I've been making an effort to read more academic papers. This one came up for one of the many reading groups at the Goog, and I picked it out of my stack a few days ago. Here's the abstract.&lt;blockquote&gt;In this paper we propose a novel method for learning a Mahalanobis distance measure to be used in the KNN classification algorithm. The algorithm directly maximizes a stochastic variant of the leave-one-out KNN score on the training set. It can also learn a low-dimensional lin- ear embedding of labeled data that can be used for data visualization and fast classification.  Unlike other methods, our classification model is non-parametric, making no assumptions about the shape of the class distributions or the boundaries between them.  The performance of the method is demonstrated on several data sets, both for metric learning and linear dimensionality reduction.&lt;/blockquote&gt;This is a very common, general problem for machine learning -- you want to build a classifier, and you think you might like to use &lt;a href="http://en.wikipedia.org/wiki/K-nearest_neighbor_algorithm"&gt;K Nearest Neighbors&lt;/a&gt;; it's dead simple, and a lot of the time, it gets the job done. No complicated models to train up -- if you want to classify an instance (ooh, here's an animal -- is it a kitty?), you just find the &lt;span style="font-style: italic;"&gt;k&lt;/span&gt; most similar instances in your bank of examples and let them vote it out. Four of the five most-similar things in your example set are kitties? Alright, we'll call the new one a kitty. You have to tune &lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;k &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;as a parameter to work well with your dataset, of course, and you can get slightly more sophisticated by introducing weighted voting -- things that are less similar to the instance you're trying to classify are considered less important.&lt;br /&gt;&lt;br /&gt;The remaining question, though -- how do you decide what counts as "similar"? Typically, you use some sort of distance metric (Euclidean or Manhattan, for example) -- plot all of your instances in some high-dimensional space and see what's close. What if some of your features are noisy or irrelevant, though? Well, you could do some &lt;a href="http://en.wikipedia.org/wiki/Feature_selection"&gt;feature selection&lt;/a&gt; and prune those features out. Worse! What if you have several &lt;a href="http://en.wikipedia.org/wiki/Mutual_information"&gt;informative&lt;/a&gt; features, but they happen to be on very different scales, such that distances in one overwhelm distances in another? Well, you could manually scale them until you get some good results...&lt;br /&gt;&lt;br /&gt;This is starting to sound like maybe K-Nearest Neighbors isn't all that easy to use, out of the box.&lt;br /&gt;&lt;br /&gt;This paper actually solves both of those cases. Goldberger et al harness the power of linear algebra and come up with a way to learn a projection -- just a matrix -- from the original feature space, where distance metrics might not be very useful for KNN, into a new feature space, where your distance metric does the right thing. In effect, this is the feature selection and the scaling, all in one go, and they do it in such a way as to minimize the &lt;a href="http://everything2.com/index.pl?node_id=1208995"&gt;Leave-One-Out error&lt;/a&gt;, all tuned for your particular data set.&lt;br /&gt;&lt;br /&gt;That's kind of cool.&lt;br /&gt;&lt;br /&gt;As an added bonus, if you restrict the transform to project into three or fewer dimensions (just make sure the matrix is the right shape, and you're good!), then the same algorithm produces what sounds like a very nice visualization of your data. Features that are informative in discriminating your classes will be stretched out, and instances in the same class will tend to clump -- otherwise, KNN wouldn't work very well.&lt;br /&gt;&lt;br /&gt;Lovely paper, guys! Very well-written, clearly explained, and addresses a problem probably a lot of people have had. The only issue I can raise so far -- it's not clear how long it takes to learn the transformation. This might be a very slow process, and all we're given in the paper is something to the effect of "oh, just optimize this function and you're good..." ... the machine learning pros among us can probably just look at the formula and knock it out in a few lines of Matlab (or supposedly Lisp, if you're Charles Isbell), but I would've liked a little more discussion on the implementation side... maybe they posted some code somewhere.&lt;br /&gt;&lt;br /&gt;Happy hacking :) &lt;tt&gt;alexr&lt;/tt&gt; out!&lt;br /&gt;&lt;tt&gt;&lt;/tt&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-7073307432839903981?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/7073307432839903981/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=7073307432839903981' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/7073307432839903981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/7073307432839903981'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2008/01/todays-reading-neighbourhood-components.html' title='today&apos;s reading: Neighbourhood Components Analysis'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-2641442707019225867</id><published>2008-01-05T01:47:00.001-05:00</published><updated>2009-01-18T17:43:52.272-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><category scheme='http://www.blogger.com/atom/ns#' term='software engineering'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='languages'/><title type='text'>Design Patterns Ahoy: Violator Pattern</title><content type='html'>So, at work, every so often somebody brings up the "Violator" Pattern, typically with a slight smirk. Up until recently, I wasn't at all well-versed in design patterns, but this seems like a field that one, as a professional programmer, should be at least familiar with. So I picked up the classic &lt;a href="http://en.wikipedia.org/wiki/Design_Patterns"&gt;Gang of Four&lt;/a&gt; book and started reading through it.&lt;br /&gt;&lt;br /&gt;And while, so far, it seems like just good, solid advice about software design -- and at the risk of sounding uncritical, is it really so bad to have common names for commonly-occurring software structures? -- ... no "Violator" pattern is to be found in Gang of Four. Or on the &lt;a href="http://c2.com/cgi/wiki?WelcomeVisitors"&gt;C2 design patterns wiki&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;And I wanted to work out for myself what this mysterious Violator Pattern could be. And I figured it out today. In &lt;a href="http://code.google.com/webtoolkit/"&gt;GWT&lt;/a&gt;, you can use the JavaScript Native Interface to make calls from code written in JavaScript into methods written in Java. And when you do this, the compiler totally ignores the access modifiers on the methods you're calling. That's the Violator pattern.&lt;br /&gt;&lt;br /&gt;A paragon of OO design, verily :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-2641442707019225867?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/2641442707019225867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=2641442707019225867' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/2641442707019225867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/2641442707019225867'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2008/01/design-patterns-ahoy-violator-pattern.html' title='Design Patterns Ahoy: Violator Pattern'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-5600875463276268080</id><published>2007-10-06T14:18:00.000-04:00</published><updated>2007-10-06T14:37:04.581-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='miscellaneous'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='ui'/><title type='text'>ye can't get ye flask</title><content type='html'>So I tried Second Life again, despite my difficulties getting going with it the first time. Surely they've got stuff ironed out now, right?&lt;br /&gt;&lt;br /&gt;And it's pretty easy to sign up, and you get a fairly nice-looking avatar by default (mine was "city chic", which pretty much describes me in First Life as well), and you download the client, which they probably have one for your platform, and it all works. And you find yourself on this friendly-looking island and the tutorial tells you how to walk around and say things and stuff. And there are a few other virtual people standing around.&lt;br /&gt;&lt;br /&gt;But it's not clear if they can hear you when you speak -- and if they're trying to chat with you, how would you find out? Maybe there's a "chat" window that you can pull up. I found a window that maybe wanted to be that one ("History"?) ... but only some of my utterances seemed to show up there.&lt;br /&gt;&lt;br /&gt;So I walked around on that little island for a few minutes, trying to figure out how to get to another island -- and there's this "teleport" button, but how do I use it, and why is it grayed out?&lt;br /&gt;&lt;br /&gt;... after a while, I found that I'd hit something that turned off my walking. My arrow keys would turn me in place, but I couldn't walk around anymore. And there's no clear "oh, you're in 'don't walk anymore' mode" indicator. Buh?&lt;br /&gt;&lt;br /&gt;And that was enough to end my second foray into Second Life. There are only so many minutes in the day.&lt;br /&gt;&lt;br /&gt;I think my experience was rather more anticlimactic than &lt;a href="http://www.toothpastefordinner.com/journal/journal.php?user=toothpaste&amp;amp;id=573&amp;amp;readcomment=1"&gt;Drew's&lt;/a&gt;. He at least found out how to go places. But neither of us could figure out how to hit people.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-5600875463276268080?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/5600875463276268080/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=5600875463276268080' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/5600875463276268080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/5600875463276268080'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2007/10/ye-cant-get-ye-flask.html' title='ye can&apos;t get ye flask'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-8681017580425207176</id><published>2007-09-11T20:35:00.000-04:00</published><updated>2007-09-11T21:03:23.475-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='nlp'/><category scheme='http://www.blogger.com/atom/ns#' term='education'/><category scheme='http://www.blogger.com/atom/ns#' term='miscellaneous'/><category scheme='http://www.blogger.com/atom/ns#' term='atlhack'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='languages'/><title type='text'>possible upcoming projects</title><content type='html'>I need a cool side project. I have a bunch of ideas that I think would be interesting: here they are. I've already started futzing around with a few of these... comments or suggestions are definitely welcome.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;New Things To Build&lt;br /&gt;- &lt;/span&gt;Sketch out and build an online community where kids can make stuff in code and share it with each other, like &lt;a href="http://www.cc.gatech.edu/elc/moose-crossing/"&gt;MOOSE Crossing&lt;/a&gt; only awesome and on the web and easy to use and linkable. Does this want to be made of &lt;a href="http://scratch.mit.edu/"&gt;Scratch&lt;/a&gt;, or similar to it? Can we include proper inheritance? Make it work for the &lt;a href="http://laptop.org/"&gt;OLPC&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://penguinparens.blogspot.com/search/label/teb"&gt;TEB&lt;/a&gt;. Make TEB awesome. Does TEB want to use/be part of/merge with gnoetry? Related: That horoscope remixer thing that never worked right.&lt;br /&gt;&lt;br /&gt;- Some automated way to calculate Erdos numbers, probably with the help of DBLP.&lt;br /&gt;&lt;br /&gt;- A Scrabble bot. I've been thinking about this a lot, actually, looking at different algorithms for permuting strings -- but I think I can do Scrabble without looking at permutations... maybe all you really care about is &lt;span style="font-style: italic;"&gt;&lt;/span&gt;whether certain groups of letters constitute the same &lt;a href="http://en.wikipedia.org/wiki/Multiset"&gt;bag&lt;/a&gt;. If it turns out we don't have to permute things (in &lt;span style="font-style: italic;"&gt;n!&lt;/span&gt;), then we can probably plan several turns ahead. This might be similar to &lt;a href="http://www.research.ibm.com/massive/tdl.html"&gt;playing Backgammon&lt;/a&gt;,, but maybe we can't do something like &lt;a href="http://en.wikipedia.org/wiki/Temporal_difference_learning"&gt;that kind of policy learning&lt;/a&gt;; your set of possible actions changes so much every turn, and you'd have to use probability estimates to look into future turns...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Interesting Exercises, way already done by other people&lt;br /&gt;- &lt;/span&gt;Build a language and virtual machine. Educational for me, not very useful for other people. Recommended by Strick. Building a VM at a pretty high level of abstraction might not be that hard, just think about stack frames and returning things.  At what level do things like the Python VM work? The JVM?  Surely there are different approaches used for this; what are they? Would it be hard to build something with multithreading in mind from the bottom up? What about a purely functional lambda-calculus implementation?&lt;br /&gt;&lt;br /&gt;- Write a checkers bot. Tree search, AB pruning, etc. are pretty well understood, even by me -- the hard thing would be an evaluation function.&lt;br /&gt;&lt;br /&gt;- Build a MUD, or at least a MUD framework. &lt;span style="font-style: italic;"&gt;But in Scheme.&lt;/span&gt; &lt;a href="http://ynniv.com/"&gt;ynniv&lt;/a&gt; and I somehow never got around to that...&lt;br /&gt;&lt;br /&gt;- Another Sudoku solver. But in Haskell.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-8681017580425207176?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/8681017580425207176/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=8681017580425207176' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/8681017580425207176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/8681017580425207176'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2007/09/possible-upcoming-projects.html' title='possible upcoming projects'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-5294429662150433352</id><published>2007-08-23T12:58:00.000-04:00</published><updated>2007-08-23T13:21:24.881-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='languages'/><title type='text'>James Gosling, it turns out, thought harder about type inference than I did</title><content type='html'>So for a while, I'd been &lt;a href="http://penguinparens.blogspot.com/2006/10/type-inference-weirdness-in-java-15.html"&gt;wondering about the type system in Java&lt;/a&gt;, thinking that perhaps I'd found a shortcoming -- if you have a more general type (say, "Thing"), and a more specific type (say, "Chair", which extends "Thing") -- then why isn't List&amp;lt;Chair&amp;gt;&lt;chair&gt; a subtype of List&amp;lt;Thing&amp;gt;&lt;thing&gt;, meaning that you could pass a List of Chairs into a method that takes a List of Things?&lt;br /&gt;&lt;br /&gt;The mighty Toby R, in a conversation with me and &lt;a href="http://yak.net/"&gt;Strick&lt;/a&gt;,  shed some light on the situation and led me to understand why this is not the case. The particular use-case is: when you're in the method that takes List&amp;lt;Thing&amp;gt;&lt;thing&gt;, &lt;span style="font-style: italic;"&gt;you can add Things to that list.&lt;/span&gt; And the Things you add could well be Basketballs. So when the method returns, the caller is still expecting to have a list of Chairs, not realizing that there are now Basketballs in the list... so Java cleverly disallows this case.&lt;br /&gt;&lt;br /&gt;(also, somehow I missed &lt;a href="http://penguinparens.blogspot.com/2006/10/type-inference-weirdness-in-java-15.html#comment-3275514546157031481"&gt;an anonymous comment&lt;/a&gt;, probably from my mother, well-respected for her work on type theory, which explained that exact case)&lt;br /&gt;&lt;br /&gt;Now in a purely functional language, where you don't go around getting references to objects and modifying them, I'd like to posit that this wouldn't be a problem -- but perhaps there are other problematic situations? ...&lt;/thing&gt;&lt;/thing&gt;&lt;/chair&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-5294429662150433352?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/5294429662150433352/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=5294429662150433352' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/5294429662150433352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/5294429662150433352'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2007/08/james-gosling-it-turns-out-thought.html' title='James Gosling, it turns out, thought harder about type inference than I did'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-5840025541236083148</id><published>2007-08-22T17:58:00.002-04:00</published><updated>2009-01-18T17:44:29.480-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><category scheme='http://www.blogger.com/atom/ns#' term='software engineering'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='languages'/><category scheme='http://www.blogger.com/atom/ns#' term='language'/><title type='text'>typing about typing about types</title><content type='html'>&lt;div style="text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_QxOlkv8KV00/Rsyx4ZC75-I/AAAAAAAAAJo/Hbz3eN-jTLQ/s1600-h/typesandtypes.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://3.bp.blogspot.com/_QxOlkv8KV00/Rsyx4ZC75-I/AAAAAAAAAJo/Hbz3eN-jTLQ/s400/typesandtypes.png" alt="" id="BLOGGER_PHOTO_ID_5101648060257920994" border="0" /&gt;&lt;/a&gt;As we make the push to handle Java 1.5 features in GWT (it's about time!) I'm having flashbacks to undergraduate Compilers. Perhaps this is unsurprising, considering what I'm working on. Part of the difficulty in the problem is that whether you're talking about types in the code that constitutes the compiler itself, types in the code that the user is going to put in, or types in the output code... we use the same word. Oh my. (much worse, I suppose, is the code you get with the &lt;a href="http://www.cs.princeton.edu/%7Eappel/modern/ml/"&gt;Appel book&lt;/a&gt;, where half of the words on the screen are helpfully "ty" or "typ". Jebus.)&lt;br /&gt;&lt;br /&gt;But! All of this means that by the next &lt;a href="http://code.google.com/webtoolkit/"&gt;GWT&lt;/a&gt; release, you'll likely have some code that I touched in your hands. Woo.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-5840025541236083148?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/5840025541236083148/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=5840025541236083148' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/5840025541236083148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/5840025541236083148'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2007/08/typing-about-typing-about-types.html' title='typing about typing about types'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_QxOlkv8KV00/Rsyx4ZC75-I/AAAAAAAAAJo/Hbz3eN-jTLQ/s72-c/typesandtypes.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-3766573654921187496</id><published>2007-08-12T23:12:00.000-04:00</published><updated>2007-08-13T00:32:31.739-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='culture'/><category scheme='http://www.blogger.com/atom/ns#' term='education'/><category scheme='http://www.blogger.com/atom/ns#' term='academia'/><category scheme='http://www.blogger.com/atom/ns#' term='readings'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>this blog post: for you, $50.</title><content type='html'>I recently met a fellow who's working on a doctorate in literature, but his previous background is in &lt;a href="http://en.wikipedia.org/wiki/Library_science"&gt;Library Science&lt;/a&gt;&lt;sup&gt;W&lt;/sup&gt;. I wasn't sure what the interesting problems in library science might be, so I wandered over to the wikipedia article and started falling through the links.&lt;br /&gt;&lt;br /&gt;A few links out, I ran into the &lt;a href="http://en.wikipedia.org/wiki/Serials_crisis"&gt;Serials Crisis&lt;/a&gt; article. Apparently (and Wikipedia articles close to the "Library Science" one are never wrong), the costs of subscribing to scholarly journals keep on going up -- libraries only have so much money for subscriptions, but there are ever-more academics and subfields, thus more journals. And if a given library cancels its subscription from a particular journal, that publisher's fixed costs are still fixed, so prices increase for the remaining subscribers.&lt;br /&gt;&lt;br /&gt;The traditional academic journal system had seemed pretty shaky, especially in light of the Web; upsetting publisher websites (Springer, ACM Portal, IEEE's site...) seem like their sole purpose is to keep the enterprising students from reading an article. In light of how most of the science behind the articles is publicly funded in the first place, the articles seem like they should be public as well.&lt;br /&gt;&lt;br /&gt;I wouldn't mind seeing companies like Springer just going away; universities seem totally capable of hosting journals -- over the web especially! There may be some compelling reason for the current system, and I'll try to find it out... but for the short term, tools like Google Scholar could go a little further out of their way to help us find the full text of an article!&lt;br /&gt;&lt;br /&gt;Also:&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Open_access"&gt;http://en.wikipedia.org/wiki/Open_access&lt;/a&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Open_access_journal"&gt;http://en.wikipedia.org/wiki/Open_access_journal&lt;/a&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Open_access_publishing"&gt;http://en.wikipedia.org/wiki/Open_access_publishing&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.unc.edu/scholcomdig/whitepapers/panitch-michalak.html"&gt;The Serials Crisis: A White Paper for the UNC-Chapel Hill Scholarly Communications Convocation&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.lib.uwaterloo.ca/society/crisis.html"&gt;The Crisis in Scholarly Publishing&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.unc.edu/scholcomdig/whitepapers/panitch-michalak.html"&gt;&lt;b style=""&gt;&lt;/b&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-3766573654921187496?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/3766573654921187496/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=3766573654921187496' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/3766573654921187496'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/3766573654921187496'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2007/08/this-blog-post-for-you-50.html' title='this blog post: for you, $50.'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-7025314538737240777</id><published>2007-08-10T17:56:00.000-04:00</published><updated>2007-08-10T18:18:35.229-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='languages'/><title type='text'>You get spoiled by languages with first-class functions</title><content type='html'>Earlier today, I needed to take a list of strings and grab all of them that end with ".html". Very simple task. My first thought is of course something like:&lt;br /&gt;&lt;br /&gt;[fn for fn in fns if fn.endswith(".html")]&lt;br /&gt;&lt;br /&gt;Or even:&lt;br /&gt;filter( lambda x: x.endsWith(".html"), fns)&lt;br /&gt;&lt;br /&gt;Or the equivalent Lisp. Y'know, with "loop" and "collect". (Common Lisp has, as they say, the Cadillac of loop syntax)&lt;br /&gt;&lt;br /&gt;Or something to that extent. But then I remembered that I was writing in Java, and I ended up writing a for-loop. There's no clean, idiomatic way to say that in Java, is there? Do you have to build up the list procedurally? ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-7025314538737240777?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/7025314538737240777/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=7025314538737240777' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/7025314538737240777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/7025314538737240777'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2007/08/you-get-spoiled-by-languages-with-first.html' title='You get spoiled by languages with first-class functions'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-2490622051063450226</id><published>2007-08-05T00:42:00.000-04:00</published><updated>2007-08-05T00:49:46.610-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='software engineering'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='readings'/><category scheme='http://www.blogger.com/atom/ns#' term='languages'/><title type='text'>"If I knew the answer ahead of time, I wouldn't be writing this program!"</title><content type='html'>&lt;p&gt;On the plane back from San Francisco to Atlanta, I read Thomas and Hunt's &lt;span style="font-style: italic;"&gt;Pragmatic Unit Testing&lt;/span&gt;. It's a very quick read, about 120 pages plus appendices. And while it's very light, it has what seems like a lot of helpful advice for good design and development practice. To be honest, I've never done much unit testing in the past, thinking "oh, that's what those corporate software engineer guys do -- pssh." But! It turns out that these days, I &lt;span style="font-style: italic;"&gt;am&lt;/span&gt; a corporate software engineer, and anyway one should always be looking out for new ways to hack more effectively.&lt;/p&gt;  &lt;p&gt; There's a bunch of important principles to take away from  &lt;span style="font-style: italic;"&gt;Pragmatic Unit Testing&lt;/span&gt;. The one that stuck with me the most, though, is that when designing and writing code, you've got to think: "how am I going to test this?". The significance of this is not just "oh man, I'm going to have to write a unit test for my method"; it gets back to that generally-understood but oft-ignored idea that every logical unit of your code really wants to be its own method, a modular thing that you can use separately -- because you're going to have to use that same calculation again somewhere else. And Don't Repeat Yourself. &lt;/p&gt;  &lt;p&gt; For example: if you have a method that calculates how to do something and then does it (say with a call to another library), maybe you want to make that two methods: the calculation and then a call to that calculation coupled with the library call. This will be easier to test -- you're not really interested in testing a third-party library, just your own calculations -- and as a happy side-effect, your code is now cleaner and more reusable! &lt;/p&gt;  &lt;p&gt; Similarly, separating out the backend code from the GUI (two of the things that get my hackles up the most in this life are terms "business logic" and "MVC") lets you properly test the Stuff That Does Stuff on its own. One example in the book hit particularly close to home -- a small GUI application where all the caculations and I/O happened mixed in with the Swing code. &lt;/p&gt;  &lt;p&gt; That example, and in fact the whole book, brought on flashbacks to a project I'd worked on recently. One of my friends and I (and he's one of the sharpest guys I know) inherited a fairly involved program and ended up sinking months trying to fix it up. This system suffered from pretty much every pitfall in the book: random silently-caught exceptions, real work happening mixed in with the GUI code, needlessly long, opaque, nigh-untestable (let alone "tested") methods, repetition all over the place. Worse! It was built by a guy who'd supposedly specialized in software engineering -- and he did pretty much everything that Thomaas and Hunt warn against! Not a pleasant situation. I'm sure you can relate. &lt;/p&gt;  &lt;p&gt; Of course, I knew at the time that this was atrocious code. But now maybe I'll be a bit more principled in my development, working with a lean towards easy testability. Unit testing will probably be a good discipline to get into. &lt;/p&gt;  &lt;p&gt; On the other hand, I've been reading about (and writing a bit of) Haskell. All this murky business of setting up and tearing down state, "proving" to yourself that each function does what you think it does "for the boundary cases" -- it all relies on the idea that you're going to be able to predict where you're going to make the bugs (by heuristic, habits, and mnemonics). And if you're smart enough to predict where the bugs are going to pop up, it seems like there's something better you could do to keep them from being introduced at all. In &lt;span style="font-style: italic;"&gt;ML for the Working Programmer&lt;/span&gt;, L.C. Paulson suggests that a mark of the professional in the future will be writing functionally (in ML). The modularity practices seem like the Right Thing, useful for the functional programmer as well as the OO, but if your code could be formally verified, how much more confident would you be that it was correct for the general case? Simple testing is nothing like a proper proof. &lt;/p&gt;  &lt;p&gt; But who ever writes proof-carrying code?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-2490622051063450226?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/2490622051063450226/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=2490622051063450226' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/2490622051063450226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/2490622051063450226'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2007/08/if-i-knew-answer-ahead-of-time-i.html' title='&quot;If I knew the answer ahead of time, I wouldn&apos;t be writing this program!&quot;'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-8201336659462710682</id><published>2007-08-04T02:17:00.000-04:00</published><updated>2007-08-04T02:28:34.690-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='culture'/><category scheme='http://www.blogger.com/atom/ns#' term='miscellaneous'/><category scheme='http://www.blogger.com/atom/ns#' term='languages'/><category scheme='http://www.blogger.com/atom/ns#' term='language'/><title type='text'>further readings: one day, I'll have something coherent to say about type systems</title><content type='html'>&lt;p style="font-style: italic;"&gt; The first finder of any error in my books receives $2.56; significant suggestions are also worth $0.32 each. If you are really a careful reader, you may be able to recoup more than the cost of the books this way. &lt;/p&gt; &lt;p&gt;&lt;span style="font-style: italic;"&gt; However, people who have read the book &lt;/span&gt;&lt;cite&gt;&lt;u&gt;Eats, Shoots &amp; Leaves&lt;/u&gt;&lt;/cite&gt;&lt;span style="font-style: italic;"&gt; should not expect a reward for criticizing the ways in which I use commas. Punctuation is extremely important to me, but I insist on doing it my own way. &lt;/span&gt;&lt;br /&gt;&lt;/p&gt;-- Don "The Lion" Knuth, &lt;a href="http://www-cs-faculty.stanford.edu/~knuth/taocp.html"&gt;The Art of Computer Programming&lt;/a&gt; homepage.&lt;br /&gt;&lt;br /&gt;*laughs* We love you, Don.&lt;br /&gt;&lt;br /&gt;Also: there's so much to read in this life. I've recently picked up books on proper C++ technique, security, and proper unit testing, and I'll probably give those some priority on my ever-growing Queue. Of course, there's all those books on statistical NLP that need to get read in the near future if I'm going to be of any help to anyone.&lt;br /&gt;&lt;br /&gt;I've been in on a few conversations recently about C++ and pitfalls and bugs that can arise when using it. The more I think about these, particularly random language-specific casting rules and several different competing ways to represent strings, the more I think that Haskell is going to be a good idea. Or possibly SML.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-8201336659462710682?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/8201336659462710682/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=8201336659462710682' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/8201336659462710682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/8201336659462710682'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2007/08/further-readings-one-day-ill-have.html' title='further readings: one day, I&apos;ll have something coherent to say about type systems'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-4118876576342558263</id><published>2007-07-26T17:04:00.002-04:00</published><updated>2009-01-18T17:44:40.340-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><category scheme='http://www.blogger.com/atom/ns#' term='education'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='languages'/><title type='text'>(ping)</title><content type='html'>It's been a while since I've last posted: I should make an effort to have exciting technical things to say more often.&lt;br /&gt;&lt;br /&gt;But! In the last few months, I've graduated, got a &lt;a href="http://www.mobilehci2007.org/"&gt;paper accepted to a conference&lt;/a&gt;, taught six weeks of summer camps to enthusiastic middle- and highschool kids, and made all the preparations to start up work with the Goog. My first day is Monday.&lt;br /&gt;&lt;br /&gt;Topics that I've been looking into and will hopefully post about soon:&lt;br /&gt;- Haskell -- maybe one day I'll have a more consistent opinion about how I feel about static vs. dynamic typing. Writing here on the issue will probably help sort it out. Or just building something big with Haskell.&lt;br /&gt;- Statistics. I went out and bought &lt;a href="http://www.stat.cmu.edu/~larry/all-of-statistics/index.html"&gt;All of Statistics&lt;/a&gt; and I've been thumbing through it a bit.&lt;br /&gt;- CS Education and edutech. Good goodness, education. I've spent most of my summer with the childrens, trying out different ways of convincing them they want to know what I think they should know. It's been going well, for the most part.&lt;br /&gt;- &lt;a href="http://code.google.com/webtoolkit/"&gt;GWT&lt;/a&gt; and associated topics in Javascript and Ajax. I'm joining the GWT team in just a few days, so I'm working pretty hard on learning it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-4118876576342558263?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/4118876576342558263/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=4118876576342558263' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/4118876576342558263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/4118876576342558263'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2007/07/ping.html' title='(ping)'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-3822544450980911881</id><published>2007-05-25T00:36:00.001-04:00</published><updated>2007-05-25T14:45:47.358-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='education'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='ui'/><category scheme='http://www.blogger.com/atom/ns#' term='languages'/><title type='text'>more exciting edutech!</title><content type='html'>&lt;a href="http://scratch.mit.edu/"&gt;Scratch&lt;/a&gt;, from the Lifelong Kindergarten group at MIT, is this lovely environment for kids (or other novice programmers) where you can make funky animations and play sounds and do cool effects! The cool effects are a major selling point -- you can get funny animations right off the bat. Everybody loves a fisheye effect. And it has this lovely website, where kids can share and tag their projects! Web 2.0 ahoy!&lt;br /&gt;&lt;br /&gt;It's really easy to figure out, especially if you've seen things like the LEGO mindstorms interface, or &lt;a href="http://www.alice.org/"&gt;Alice&lt;/a&gt; -- commands snap together with a familiar building-blocks metaphor. This is to say that there's a fairly standard vocabulary for childrens programming environments, these days...&lt;br /&gt;&lt;br /&gt;The Scratch intro "Facilitorial" video is &lt;a href="http://www.youtube.com/watch?v=jxDw-t3XWd0"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Also fairly interesting (and brand new on my radar as of today), is &lt;a href="http://www.greenfoot.org/"&gt;Greenfoot&lt;/a&gt;, which is another educational programming environment, perhaps for slightly older kids. It makes it easy to do simulations with different kinds of "actors" on these nice 2D worlds (they can be grid-worlds, but they don't have to be)... although you have to write some Java, it looks like, to build up your new behaviors. Maybe this is awesome too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-3822544450980911881?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/3822544450980911881/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=3822544450980911881' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/3822544450980911881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/3822544450980911881'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2007/05/more-exciting-edutech.html' title='more exciting edutech!'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-6276593230569384719</id><published>2007-04-25T19:43:00.000-04:00</published><updated>2007-04-25T22:15:00.396-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='miscellaneous'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='ui'/><category scheme='http://www.blogger.com/atom/ns#' term='languages'/><title type='text'>you'll probably tell me that Emacs already does this</title><content type='html'>In the future, my text editor will have an option to make it think of camelCaps and underscores_in_identifiers as word boundaries.&lt;br /&gt;&lt;br /&gt;How useful would that be for you?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-6276593230569384719?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/6276593230569384719/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=6276593230569384719' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/6276593230569384719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/6276593230569384719'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2007/04/youll-probably-tell-me-that-emacs.html' title='you&apos;ll probably tell me that Emacs already does this'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-3802977050117249662</id><published>2007-04-23T10:35:00.001-04:00</published><updated>2008-03-07T04:26:58.051-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='retro'/><category scheme='http://www.blogger.com/atom/ns#' term='culture'/><category scheme='http://www.blogger.com/atom/ns#' term='education'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='history'/><title type='text'>retrocomputing from the other side of the pond</title><content type='html'>Here's what I found out on my recent voyage through the wikipedias! Semi-vicarious nostalgia ahoy!&lt;br /&gt;&lt;br /&gt;In the early 1980s, the BBC started an initiative called the BBC Computer Literacy Project, a major part of which was the production of the &lt;a href="http://en.wikipedia.org/wiki/BBC_Micro"&gt;BBC Micro&lt;/a&gt;, a machine produced by Acorn Computers, complete with its own line of peripherals including expandable memory and various pluggable co-processors. There was an associated television show, &lt;i&gt;&lt;a href="http://en.wikipedia.org/wiki/The_Computer_Programme"&gt;The Computer Programme&lt;/a&gt;&lt;/i&gt;, which ran in various incarnations through the decade and featured music from Kraftwerk. The computers came with &lt;a href="http://en.wikipedia.org/wiki/BBC_BASIC"&gt;BBC BASIC&lt;/a&gt;, a rather more advanced system than the BASICs that were shipping stateside -- it had proper named subroutines and if/then/else, features most users on the MS-DOS side of things wouldn't see until QBASIC.&lt;br /&gt;&lt;br /&gt;The mind-blowing part of the project was &lt;a href="http://en.wikipedia.org/wiki/Telesoftware"&gt;Telesoftware&lt;/a&gt;, whereby computer programs were sent embedded in the broadcast television signal, using &lt;a href="http://en.wikipedia.org/wiki/Teletext"&gt;Teletext&lt;/a&gt;, which is how the closed-captioning data was sent in Britain at the time. Analogue technology like broadcast TV feels so alien these days... but the Beeb was busy using it to send example programs to eager learners at home.&lt;br /&gt;&lt;br /&gt;There seems to be a pretty active &lt;a href="http://www.bbcbasic.co.uk/bbcbasic.html"&gt;online&lt;/a&gt; &lt;a href="http://groups.google.com/group/comp.sys.acorn.programmer/topics"&gt;community&lt;/a&gt; of BBC/Acorn enthusiasts out there, two and a half decades later.&lt;br /&gt;&lt;br /&gt;You know how to use the Googles, of course, but here's &lt;a href="http://bbc.nvg.org/history.php3"&gt;another, more detailed overview of the BBC/Acorn system&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-3802977050117249662?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/3802977050117249662/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=3802977050117249662' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/3802977050117249662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/3802977050117249662'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2007/04/retrocomputing-from-other-side-of-pond.html' title='retrocomputing from the other side of the pond'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-3633380573100305696</id><published>2007-04-18T12:08:00.000-04:00</published><updated>2007-04-18T12:20:29.979-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='languages'/><title type='text'>java 6: apparently even less of a loss than java 5!</title><content type='html'>Java 6. It's so hot right now. Java 6.&lt;br /&gt;&lt;br /&gt;Well, I'm excited anyway. The new &lt;a href="http://java.sun.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.html"&gt;Scripting API&lt;/a&gt; provides a standard interface for embedding other languages in Java and making calls between the two. See if there's already a project to handle your favorite language &lt;a href="https://scripting.dev.java.net/"&gt;here&lt;/a&gt; -- there probably is, unless you like Common Lisp. There's  even a mechanism for manipulating namespaces in the embedded language, pretty snappy.&lt;br /&gt;&lt;br /&gt;Apparently recent releases of Jython already have hooks to support the new API. Maybe the next version of &lt;a href="http://coweb.cc.gatech.edu/mediacomp-plan/94"&gt;JES&lt;/a&gt; should be rewritten with that in mind, say once Jython 2.2 is stable. And perhaps we'll see &lt;a href="http://armedbear.org/abcl.html"&gt;ABCL&lt;/a&gt; ported to the new standard...&lt;br /&gt;&lt;br /&gt;Also in Java 6, the &lt;a href="http://java.sun.com/developer/JDCTechTips/2005/tt1115.html#1"&gt;built-in support for splash screens&lt;/a&gt; is kinda cute. And they're saying that the whole shebang is faster and prettier. Good job, guys!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-3633380573100305696?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/3633380573100305696/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=3633380573100305696' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/3633380573100305696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/3633380573100305696'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2007/04/java-6-apparently-even-less-of-loss.html' title='java 6: apparently even less of a loss than java 5!'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-6468275055918537228</id><published>2007-04-17T14:25:00.000-04:00</published><updated>2007-04-17T16:27:36.894-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='macintosh'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='readings'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>tools for blogging and reading</title><content type='html'>I had an idea for a tool today, one to keep track of links that you want to blog about, assuming you keep a buffer of a few links hanging around like I do. Usually, I have a bookmark folder set aside for the next batch of links, but it might be nice to have a special command that would let you right-click on a link and save it to somewhere. Later on, you'll be able to paste back your links (maybe with HTML link code) into arbitrary text boxes using another context-menu command. This probably wants to be a Firefox extension.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ravelite.org/"&gt;Graham&lt;/a&gt; suggests that this would be better with online storage -- it could sync up with your del.icio.us bookmarks and keep track of what you've already blogged about. Perhaps someday soon I'll be cool enough to use del.icio.us.&lt;br /&gt;&lt;br /&gt;Speaking of reading things on the web and managing one's reading -- please allow me to direct your attention to &lt;a href="http://bibdesk.sf.net/"&gt;BibDesk&lt;/a&gt; and &lt;a href="http://www2.blogger.com/skimm-app.sf.net"&gt;Skim&lt;/a&gt;, a pair of apps for the Mac designed with your reading pleasure in mind. The first is a bibliography manager that works with BibTeX format and has a lovely UI and lets you drag references around and whatnot, and the latter is for reading, highlighting, and annotating your papers, which is traditionally pretty difficult with a PDF.&lt;br /&gt;&lt;br /&gt;The downside of these is that they're Cocoa apps and Mac-only, but they're pretty much what I'll want to build when I get around to putting together that cross-platform Python paper manager thing I've been thinking about...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-6468275055918537228?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/6468275055918537228/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=6468275055918537228' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/6468275055918537228'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/6468275055918537228'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2007/04/tools-for-blogging-and-reading.html' title='tools for blogging and reading'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-7589751469546116391</id><published>2007-04-12T15:46:00.000-04:00</published><updated>2007-04-12T16:43:25.410-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='unix'/><category scheme='http://www.blogger.com/atom/ns#' term='ui'/><category scheme='http://www.blogger.com/atom/ns#' term='languages'/><title type='text'>things that start with p</title><content type='html'>Programmable completion for bash (mentioned &lt;a href="http://penguinparens.blogspot.com/2007/02/programmable-tab-completion-you-may.html"&gt;earlier&lt;/a&gt;) is still a pretty exciting idea. I came up against the first situation where I felt like it needed to be extended today, though.&lt;br /&gt;&lt;br /&gt;I've taken to using &lt;tt&gt;jar&lt;/tt&gt; to deal with .zip files, so I can use consistent &lt;tt&gt;tar&lt;/tt&gt; syntax and don't have to remember how to use the zip options. But! The bash_completion file for Ubuntu doesn't include ".zip" as an extension that it looks for when tab-completing files for &lt;tt&gt;jar&lt;/tt&gt;, oh noes!&lt;br /&gt;&lt;br /&gt;Easy enough to fix, right? I pop open /etc/bash_completion and start searching for "jar". There's a section near the second occurrence that looks like:&lt;pre&gt;         _filedir '?(e|j|w)ar'&lt;br /&gt;&lt;/pre&gt;After some fiddling, I change that one line to " _filedir '?(ear|jar|war|zip)' ". And it works! For reference, that the &lt;tt&gt;_filedir&lt;/tt&gt; function looks like &lt;a href="http://www.google.com/codesearch?hl=en&amp;q=+compgen+bash_completion+filedir+show:VQ2Eo4F-sCg:U-vJgvOj4jo:z4ellqjhBM4&amp;amp;sa=N&amp;cd=7&amp;amp;ct=rc&amp;cs_p=http://www.linux-m32r.org/public/rootfs2.6_05_base_20060113.0926.tar.bz2&amp;amp;cs_f=./rootfs2.6_05_base/etc/bash_completion#a15"&gt;this&lt;/a&gt;. It's painfully obvious to everyone what this does, yes?&lt;br /&gt;&lt;br /&gt;To be totally fair, there's some explanatory comments right above it... but it's obtuse things like this that make we want to switch to a shell with a more sensible scripting language. bash is often line noise. We claim that allowing users to modify their environments to fit their needs is one of the major benefits of Free Software, but are we doing enough to encourage that? How is your mom supposed to pick up bash script? It seems like &lt;tt&gt;&lt;a href="http://www.scsh.net/"&gt;scsh&lt;/a&gt; &lt;/tt&gt;isn't meant for interactive use as your daily shell, but what if your everyday environment had a more modern language embedded in it? Are things like that already out there?&lt;br /&gt;&lt;br /&gt;Also: speaking of Scheme embedded in things, &lt;a href="http://jscheme.sourceforge.net/"&gt;JScheme&lt;/a&gt;  is  a dialect of Scheme with a very simple interface to Java, called the &lt;a href="http://jscheme.sourceforge.net/jscheme/doc/javadot.html"&gt;Javadot notation &lt;/a&gt;. It's by Peter Norvig and crew, fairly recently updated and feature-complete. Also on Peter's (fantastic) site, you can find his older &lt;a href="http://www.norvig.com/jscheme.html"&gt;"mercilessly small, easily modifiable version"&lt;/a&gt;. I very badly to embed this in &lt;a href="http://coweb.cc.gatech.edu/mediaComp-plan/94"&gt;JES&lt;/a&gt;. Media Computation in Scheme ahoy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-7589751469546116391?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/7589751469546116391/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=7589751469546116391' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/7589751469546116391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/7589751469546116391'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2007/04/things-that-start-with-p.html' title='things that start with p'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-4811412009047640073</id><published>2007-04-09T16:00:00.000-04:00</published><updated>2007-04-17T14:26:52.896-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='culture'/><category scheme='http://www.blogger.com/atom/ns#' term='miscellaneous'/><title type='text'>Alice wants him. Bob fears him. Charlie wants to be him.</title><content type='html'>&lt;a href="http://www.schneier.com/blog/"&gt;Bruce Schneier&lt;/a&gt; not only has a &lt;a href="http://geekz.co.uk/schneierfacts/"&gt;Bruce Schneier Facts &lt;/a&gt;page devoted to him -- he's aware of it and has a favorite Bruce Schneier Fact.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;My favorite so far: "Bruce Schneier writes his books and essays by generating random alphanumeric text of an appropriate length and then decrypting it."&lt;/i&gt; -- Bruce Schneier &lt;a href="http://www.schneier.com/blog/archives/2006/08/bruce_schneier.html#c107175"&gt;in the comments&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-4811412009047640073?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/4811412009047640073/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=4811412009047640073' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/4811412009047640073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/4811412009047640073'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2007/04/alice-wants-him-bob-fears-him-charlie.html' title='Alice wants him. Bob fears him. Charlie wants to be him.'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-6842624907146893029</id><published>2007-03-31T13:02:00.000-04:00</published><updated>2007-03-31T13:12:32.200-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='languages'/><title type='text'>list comprehensions!</title><content type='html'>&lt;a href="http://en.wikipedia.org/wiki/List_comprehension"&gt;List comprehensions&lt;/a&gt;. I've been a fan of these for a while, but I'd like to share:&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;tenpercent = len(lines) / 10&lt;br /&gt;testset = random.sample(lines, tenpercent)&lt;br /&gt;trainingset = [line for line in lines if line not in testset]&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;Python makes me warm and fuzzy on the inside. Also, random.sample() is pretty sexy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-6842624907146893029?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/6842624907146893029/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=6842624907146893029' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/6842624907146893029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/6842624907146893029'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2007/03/list-comprehensions.html' title='list comprehensions!'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-7472089822617596483</id><published>2007-03-28T14:20:00.000-04:00</published><updated>2007-03-28T17:26:49.556-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ai'/><category scheme='http://www.blogger.com/atom/ns#' term='aefi'/><category scheme='http://www.blogger.com/atom/ns#' term='readings'/><category scheme='http://www.blogger.com/atom/ns#' term='mind'/><title type='text'>brains 'n' balancing training data</title><content type='html'>- &lt;a href="http://samarin.wordpress.com/"&gt;Martin&lt;/a&gt; points us to a nice article over on &lt;a href="http://scienceblogs.com/developingintelligence/"&gt;Developing Intelligence&lt;/a&gt;: &lt;a href="http://scienceblogs.com/developingintelligence/2007/03/why_the_brain_is_not_like_a_co.php"&gt;10 Important Differences Between Brains and Computers&lt;/a&gt;. Your computational metaphor just breaks down eventually, y'know? The brain is not very much like a Von Neumann computer. It's a lot squishier.&lt;br /&gt;&lt;br /&gt;If building classifiers is your thing, you may be interested to take a look at these articles:&lt;br /&gt;&lt;br /&gt;- Gustavo E. A. P. A. Batista , Ana L. C. Bazzan, and Maria Carolina Monard:&lt;span style="text-decoration: underline;"&gt; &lt;/span&gt;&lt;a href="http://www.inf.ufrgs.br/%7Emas/masbio/papers/balancing-training-data-for.pdf"&gt;Balancing Training Data for Automated Annotation of Keywords: a Case Study&lt;/a&gt;.&lt;br /&gt;Three researchers, seven middle names, one novel technique for building balanced data sets out of unbalanced ones for training classifiers: generate new instances of your minority class by interpolating between examples actually in your dataset. I'm still trying to decide whether this approach should work for the general case -- does it make too many assumptions about the shape of the space? Particularly: can you arbitrarily draw lines (in higher-dimensional space) between positive instances? What if there are negative instances between those two? Which dimensions do you look at first, and how is this better than just adding some noise or weighting positive examples higher? (is that last option the same as simply counting them several times?)&lt;br /&gt;&lt;br /&gt;- Foster Provost: &lt;a href="http://pages.stern.nyu.edu/%7Efprovost/Papers/skew.PDF"&gt;Machine Learning from Imbalanced Data Sets 101&lt;/a&gt;.&lt;br /&gt;A basic overview of the problem, examining the motivation for building classifiers at all and some different approaches to sampling. The award for Best Name Ever goes to Dr. Foster Provost.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-7472089822617596483?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/7472089822617596483/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=7472089822617596483' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/7472089822617596483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/7472089822617596483'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2007/03/brains-n-balancing-training-data.html' title='brains &apos;n&apos; balancing training data'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-5137985080959927879</id><published>2007-03-23T15:09:00.001-04:00</published><updated>2010-01-05T13:44:32.408-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='ui'/><category scheme='http://www.blogger.com/atom/ns#' term='readings'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>reading feeds over the web</title><content type='html'>It seems like all the &lt;a href="http://samarin.wordpress.com/"&gt;cool&lt;/a&gt; &lt;a href="http://ravelite.org/"&gt;kids&lt;/a&gt; are using &lt;a href="http://www.google.com/reader/"&gt;Google Reader&lt;/a&gt; these days, and I must admit, I'm impressed. The interface is so clean, and a web-based feed reader where you can aggregate all of your habitual reading seems like the right thing. And the ability to &lt;a href="http://www.google.com/help/reader/sharing.html"&gt;share&lt;/a&gt; items from your feed with your friends without making link-only blog posts (or forwarding emails around) is pretty compelling. On the other hand, the point of so much of the web thus far has been linking to other parts of the web: it has &lt;a href="http://catandgirl.com/?p=957"&gt;a mysterious self-referential nature&lt;/a&gt;... does this sort of sharing diminish that aspect? Does a meta-feed like this put you, as the independent media maven that you are, on a different level than the well-established weblogs? When you stop putting links in your blog and publish a Google Reader feed, are you more like BoingBoing or metafilter, or less?&lt;br /&gt;&lt;br /&gt;It is the future. We've got dynabooks and memexes, and we use them to distribute pictures of cats doing cute things.&lt;br /&gt;&lt;br /&gt;O my vast readership, I address to you this question: how do you read news online? Do you have some separate feed reader program? Do you use your browser's RSS features? Google Reader? Your LiveJournal friends page? Something else?&lt;br /&gt;&lt;br /&gt;And moreover: for the LiveJournal denziens, does anyone know of a good method for reading "friends-only" posts through Google Reader? There are a few posts out in the world on this topic, but nobody seems to have a decisive answer yet... perhaps we can answer the question definitively.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-5137985080959927879?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/5137985080959927879/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=5137985080959927879' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/5137985080959927879'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/5137985080959927879'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2007/03/reading-feeds-over-web.html' title='reading feeds over the web'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-7743073837809536122</id><published>2007-02-26T14:26:00.000-05:00</published><updated>2007-02-26T14:35:48.004-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='miscellaneous'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='unix'/><title type='text'>Ripping DVDs with Free Software!</title><content type='html'>Just today, a friend of mine needed a copy of a DVD that she could take around with her on a hard drive. So I thought, "well, I'll just take the disk image of it..."&lt;br /&gt;&lt;br /&gt;But Apple's DVD player won't play DRM'd disk images, of course.&lt;br /&gt;&lt;br /&gt;However! Here's &lt;a href="http://howto.diveintomark.org/ipod-dvd-ripping-guide/"&gt;a very nice howto&lt;/a&gt; for some &lt;a href="http://handbrake.m0k.org/"&gt;very friendly software&lt;/a&gt; for Linux, Mac OS X, and BeOS (I know you've all got BeBoxes out there) that'll make video files from your DVDs, no sweat. Super-easy to use. Your mom could do it.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.boingboing.net/2005/10/12/howto_rip_a_dvd_with.html"&gt;Thanks for the link, Cory Doctorow!&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-7743073837809536122?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/7743073837809536122/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=7743073837809536122' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/7743073837809536122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/7743073837809536122'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2007/02/ripping-dvds-with-free-software.html' title='Ripping DVDs with Free Software!'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-6113128985798119044</id><published>2007-02-26T14:24:00.000-05:00</published><updated>2007-02-26T15:02:47.254-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='unix'/><category scheme='http://www.blogger.com/atom/ns#' term='ui'/><title type='text'>programmable tab completion: you may already have it!</title><content type='html'>Not long ago, I was doing some mundane upgrade task on the Ubuntu box on my desk. I'd switched out monitors and video cards, and I wanted to make it reconfigure X.org. I type out "dpkg-reconfigure x..." (details are orthogonal, I suppose). But the amazing thing was, I hit tab out of habit, and bash magically filled in the name of the package and some other options, appropriate for the context!&lt;br /&gt;&lt;br /&gt;It turns out that this is a feature known as &lt;a href="http://www.caliban.org/bash/#completion"&gt;Programmable Completion&lt;/a&gt;, available in modern versions of &lt;tt&gt;bash&lt;/tt&gt; and enabled by default in Ubuntu! Who knew?&lt;br /&gt;&lt;br /&gt;For example, the Ubuntu version of the programmable completion only fills in ".java" files when you're issuing a "javac" command, and it auto-completes class names (but not .class files) when you're trying to run a Java program from the command line. Flippin' sweet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-6113128985798119044?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/6113128985798119044/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=6113128985798119044' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/6113128985798119044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/6113128985798119044'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2007/02/programmable-tab-completion-you-may.html' title='programmable tab completion: you may already have it!'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-6634348977974667650</id><published>2007-02-05T01:03:00.000-05:00</published><updated>2007-02-05T15:06:07.954-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ai'/><category scheme='http://www.blogger.com/atom/ns#' term='teb'/><category scheme='http://www.blogger.com/atom/ns#' term='culture'/><category scheme='http://www.blogger.com/atom/ns#' term='nlp'/><category scheme='http://www.blogger.com/atom/ns#' term='language'/><title type='text'>Programmatic poetry: oh noetry!</title><content type='html'>Automatic generation of texts has been on my mind for rather a while. Particularly, I've been thinking about poetry and the what characterizes it, in contrast to, say, technical manuals or want ads. Some (five?) years ago, my cohort &lt;a href="http://consubstantialpaneity.wordpress.com/"&gt;Esther&lt;/a&gt; and I had set at the generation problem from an ontology standpoint, trying to figure out what it would take to get thematic relationships into an automatic poem. We didn't get very far, probably because at that point my first instinct was to code everything from scratch in C!&lt;br /&gt;&lt;br /&gt;Anyway, it turns out that there are non-me people interested in this sort of thing, and the ever-helpful &lt;a href="http://ravelite.org/"&gt;Graham&lt;/a&gt; has pointed out a bunch of interesting things happening in the field!&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://theprostheticimagination.blogspot.com/"&gt;The prosthetic imagination&lt;/a&gt; is a blog by a one &lt;a href="http://etc.wharton.upenn.edu/AboutJim.aspx"&gt;Jim Carpenter&lt;/a&gt;, who's been working on &lt;a href="http://etc.wharton.upenn.edu/"&gt;Erica T. Carter&lt;/a&gt; (aka "the electronic text composition project", &lt;a href="http://grandtextauto.gatech.edu/2007/01/29/erica-3-stirs/"&gt;mentioned on GrandTextAuto here&lt;/a&gt;), which uses probabilistic grammars to generate free verse poems. I think the output is pretty convincing ("convincingly &lt;i&gt;what?&lt;/i&gt;"); according to Mr. Carpenter, it's rather unnerving to readers who've been informed that they were composed by machine.&lt;br /&gt;&lt;br /&gt;It's interesting how people react, when confronted with "creativity" from a non-human source; one is reminded of &lt;a href="http://www.unc.edu/%7Emumukshu/gandhi/gandhi/hofstadter.htm"&gt;Douglas Hofstadter's surprising reaction&lt;/a&gt; to &lt;a href="http://arts.ucsc.edu/faculty/cope/"&gt;David Cope&lt;/a&gt;'s lovely work with algorithmic music composition, which makes music, in a sense, in the style of other composers.&lt;br /&gt;&lt;br /&gt;I'll have to read more, but I'm not entirely sure, if it's just using hierarchical grammars, how Erica is different from &lt;a href="http://www.elsewhere.org/pomo"&gt;The Postmodernism Generator&lt;/a&gt; (the best-known use of the world-famous &lt;a href="http://dev.null.org/dadaengine/"&gt;dada engine&lt;/a&gt;)... but I'll report back on this later.&lt;br /&gt;&lt;br /&gt;- There is an &lt;a href="http://epc.buffalo.edu/"&gt;Electronic Poetry Center&lt;/a&gt; at Buffalo. Interesting!&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://www.beardofbees.com/gnoetry.html"&gt;Gnoetry&lt;/a&gt; is another system out there, and a very prolific one at that, apparently connected to this super-fascinating &lt;a href="http://www.beardofbees.com/"&gt;Beard of Bees&lt;/a&gt; publishing group. &lt;i&gt;Language is a prosthesis of an ancient neuro-chemical regime; but now the chemical author is dead.  Gnoetry places language at a remove from its typical sources: pre-conscious governance, psycho-historical flux, conscious-mind narration.&lt;/i&gt; &lt;strike&gt;YES.&lt;/strike&gt; I will be getting in contact with these guys.&lt;br /&gt;&lt;br /&gt;- At upenn, they have a series of readings, &lt;a href="http://www.writing.upenn.edu/wh/events/machine/"&gt;M^&lt;4|\3&lt;/a&gt;, with all sorts of "literary uses of technology" things going on, including, next week, &lt;a href="http://en.wikipedia.org/wiki/Flarf_poetry"&gt;Flarf poetry&lt;/a&gt; (!) .&lt;br /&gt;&lt;br /&gt;- Speaking of literary uses of technology, the &lt;a href="http://www.gtrlabs.com/projects/workbench"&gt;GTR Language Workbench&lt;/a&gt; looks like something between Eclipse and a word processor... I'm not quite sure what to make of it yet.&lt;br /&gt;&lt;br /&gt;I'm all excited. Let's get hacking.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-6634348977974667650?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/6634348977974667650/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=6634348977974667650' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/6634348977974667650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/6634348977974667650'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2007/02/programmatic-poetry-oh-noetry.html' title='Programmatic poetry: oh noetry!'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-6014873743618554315</id><published>2007-01-30T16:11:00.000-05:00</published><updated>2007-01-30T16:56:51.999-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='language'/><title type='text'>begging the question, language composition and orthogonality</title><content type='html'>Not too long ago, one of my friends used the phrase "begs the question" in the colloquial sense of "what we're talking about suggests that this other issue should be addressed".&lt;br /&gt;&lt;br /&gt;And I've come to the point in my life where this doesn't bother me anymore, despite the fact that I know the technical rhetorical sense of &lt;a href="http://en.wikipedia.org/wiki/Begging_the_question"&gt;"begging the question"&lt;/a&gt; -- an argument presupposing what it's trying to prove, often implicitly. I prove that unicorns exist thus: all those magical one-horned horses out there are unicorns. I prove that there's an objectively extant material world by kicking a rock and hurting my foot.&lt;br /&gt;&lt;br /&gt;This post, of course, begs the question: will I be secure enough as an armchair philosopher to start using the phrase in the vernacular sense? I'm torn: there are few things I like less in the world than prescriptive grammar, but few things I like quite as much as precise, expressive expression.&lt;br /&gt;&lt;small&gt;&lt;/small&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-6014873743618554315?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/6014873743618554315/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=6014873743618554315' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/6014873743618554315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/6014873743618554315'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2007/01/begging-question-language-composition.html' title='begging the question, language composition and orthogonality'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-4090805828499979569</id><published>2007-01-24T23:33:00.000-05:00</published><updated>2007-01-25T11:12:29.387-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='atlhack'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='ui'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>gmaps and quicksilver</title><content type='html'>So I've started work on &lt;a href="http://penguinparens.blogspot.com/2007/01/all-cool-kids-are-doing-google-maps.html"&gt;the gmaps mashup for runners I'd mentioned last time&lt;/a&gt;... the Google Maps API is very straightforward, easy to understand. And getting a simple example working is quick. I'm not surprised, but it turns out to be very pleasant.  &lt;a href="http://www.google.com/apis/maps/documentation/"&gt;Everything you wanted to know about gmaps&lt;/a&gt; is right there, have at!&lt;br /&gt;&lt;br /&gt;Also: my ATLhack compatriot &lt;a href="http://www.subwindow.com/"&gt;Erik&lt;/a&gt; introduced me to this really nice interface tweak for Mac OS X -- &lt;a href="http://quicksilver.blacktree.com/"&gt;quicksilver&lt;/a&gt;. It lets you do a lot less mousing on the Mac, which is a pretty welcome change -- a quick key-tap, and it pops up a window where you type the first few letters of something, say an application or a folder or whatever, and it searches out what you probably mean! It seems like it's more efficient than reaching for the mouse, and for right now I've taken everything off my Dock to see if quicksilver is a viable replacement. Thanks, Erik!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-4090805828499979569?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/4090805828499979569/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=4090805828499979569' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/4090805828499979569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/4090805828499979569'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2007/01/gmaps-and-quicksilver.html' title='gmaps and quicksilver'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-689076030660044081</id><published>2007-01-18T22:03:00.000-05:00</published><updated>2007-01-25T12:33:44.398-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='ui'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Run and jump on that gmaps bandwagon!</title><content type='html'>All the cool kids are doing &lt;a href="http://maps.google.com/"&gt;Google Maps&lt;/a&gt; mashups, and it just occurred to me, while chatting with &lt;a href="http://ravelite.org/"&gt;Graham&lt;/a&gt;: we could do one that picks a meeting place for runners to meet. Say given starting points for n runners, it finds some convenient corner for everybody to get together. For the case of two people (say, me and Graham), it might be just the midpoint on the best path between our houses -- but what about a big running club? And what if some runners are stronger than other? Clearly, some weighting and scaling is in order. And you could put in how fast you expect to run and when you want to get there, and it could tell you when you should leave, adjusted for traffic!&lt;br /&gt;&lt;br /&gt;Maybe not as immediately useful as &lt;a href="http://www.gmap-pedometer.com/"&gt;Gmaps Pedometer&lt;/a&gt;, but it'd be fun to put together. The API looks kinda neat, and I should learn this newfangled Web 2.0-AJAX-web-services schlock one of these days...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-689076030660044081?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/689076030660044081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=689076030660044081' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/689076030660044081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/689076030660044081'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2007/01/all-cool-kids-are-doing-google-maps.html' title='Run and jump on that gmaps bandwagon!'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-4484766325934366613</id><published>2007-01-17T11:56:00.001-05:00</published><updated>2009-01-18T14:19:30.608-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='ai'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='languages'/><title type='text'>Mapping and reducing is like popping and locking for programmers</title><content type='html'>If you don't read &lt;a href="http://lambda-the-ultimate.org/"&gt;Lambda the Ultimate&lt;/a&gt;, that's quite alright. But fairly often over there, you find a link to &lt;a href="http://lambda-the-ultimate.org/classic/message10106.html"&gt;Why Functional Programming Matters&lt;/a&gt;, by John Hughes. Recently, I decided to sit down and actually read it. It's mind-expanding!&lt;br /&gt;&lt;br /&gt;Previously, I'd thought about mapping functions onto lists as an operational thing, a set of steps to complete, but that's not the cleanest way to think about it. Mapping is actually a special case of "reduce", an operation where you just go through and replace the all the "cons" functions in a list expression with something else, then evaluate the expression again. "map" functions have a cons in the function they're reducing with, so the end result is another list.&lt;br /&gt;&lt;br /&gt;For example: you might write, in lisp: "(mapcar #'(lambda(x) (* x 2)) '(1 2 3 4))", yielding (2 4 6 8).. and you might think of that procedurally... but a map is just a reduce where "cons composed with the mapped function" replaces every "cons". Append can be written similarly; it's all essentially just replacement, function composition and evaluation. The paper also goes into beautiful issues like lazy evaluation (the author says that if he wrote the paper now, the examples would be in Haskell!) and continues to do some lovely examples, some numerical and one very close to our heart: a bot that plays tic-tac-toe, optimally, with pruned game trees.&lt;br /&gt;&lt;br /&gt;Years ago, &lt;a href="http://www.cs.ubc.ca/%7Eeiselt/"&gt;Kurt Eiselt&lt;/a&gt; told me that the future of computing was going to be functional languages on very-parallel hardware; functional languages, at least in principle, make synchronization easier by limiting or removing-altogether side effects. (although reconciling this idea with stateful, event-driven end-user applications is another issue!)  To an extent, it looks like he was right, and the future is here! &lt;a href="http://labs.google.com/papers/mapreduce.html"&gt;MapReduce&lt;/a&gt; is the method Google is using to crunch super-giant datasets with enormously parallel clusters. It's not just for functional languages, of course, but the idea is there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-4484766325934366613?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/4484766325934366613/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=4484766325934366613' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/4484766325934366613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/4484766325934366613'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2007/01/mapping-and-reducing-is-like-popping.html' title='Mapping and reducing is like popping and locking for programmers'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34619686.post-7049126954244651692</id><published>2007-01-05T03:05:00.001-05:00</published><updated>2008-03-07T04:27:15.948-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='retro'/><category scheme='http://www.blogger.com/atom/ns#' term='culture'/><category scheme='http://www.blogger.com/atom/ns#' term='aefi'/><category scheme='http://www.blogger.com/atom/ns#' term='history'/><category scheme='http://www.blogger.com/atom/ns#' term='languages'/><title type='text'>Possibly interesting, but almost definitely not useful!</title><content type='html'>- My aunt, years ago, had a &lt;a href="http://en.wikipedia.org/wiki/EMate_300"&gt;Newton eMate 300&lt;/a&gt;, and I recently found a Newton PDA while cleaning out the space behind an A/C unit -- in any case, I've had this weird fascination with Newtons for years. Now, you can relive the Newton Magic that you probably never experienced in the first place, under emulation! The &lt;a href="http://www.kallisys.com/newton/einstein/en"&gt;Einstein Platform&lt;/a&gt; is a Newton emulator that works pretty well -- and you can &lt;a href="http://www.unna.org/view.php?/development/Debugger_Images"&gt;find Newton ROM images here&lt;/a&gt;. It's kinda interesting. (Although I got stuck in fullscreen mode once, careful!)&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://research.sun.com/self/"&gt;Self&lt;/a&gt;. It's been &lt;a href="http://www.gliebe.de/self/"&gt;ported to Linux&lt;/a&gt;. It's one of those languages that one feels like &lt;a href="http://en.wikipedia.org/wiki/Self_programming_language"&gt;one should learn more about&lt;/a&gt;. It has interesting family relationships with SmallTalk and Dylan and JavaScript...&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://thinkingmeat.com/newsblog/?p=642"&gt;Thinking Meat celebrates the holidays&lt;/a&gt;. I just found this blog, but  over at &lt;a href="http://thinkingmeat.com/newsblog/"&gt;the Thinking Meat Project&lt;/a&gt;, she has a lovely article about taking part in the culture around the holidays and coming to terms with the cognitive dissonance from enjoying good Bach choral music while feeling like one shouldn't be participating in religious rites, for consistency's sake. It can hard to balance these things, particularly soon after giving up a faith.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34619686-7049126954244651692?l=penguinparens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://penguinparens.blogspot.com/feeds/7049126954244651692/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34619686&amp;postID=7049126954244651692' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/7049126954244651692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34619686/posts/default/7049126954244651692'/><link rel='alternate' type='text/html' href='http://penguinparens.blogspot.com/2007/01/possibly-interesting-but-almost.html' title='Possibly interesting, but almost definitely not useful!'/><author><name>Alex Rudnick</name><uri>https://profiles.google.com/112102953760812482041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Zt63hZtFtrw/AAAAAAAAAAI/AAAAAAAAGJU/P_akyIdrlC8/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry></feed>
