<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom='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' version='2.0'><channel><atom:id>tag:blogger.com,1999:blog-14589096</atom:id><lastBuildDate>Mon, 21 May 2012 06:11:14 +0000</lastBuildDate><category>olympics</category><category>scala</category><category>Versager</category><category>funny</category><category>clojure</category><category>python</category><category>twitter</category><category>programming</category><category>time wasting</category><category>zensur</category><category>social</category><category>testing</category><category>nonsense</category><category>Verbrecher</category><category>quiz</category><title>Gerhard Häring</title><description></description><link>http://blog.ghaering.de/</link><managingEditor>noreply@blogger.com (Gerhard Häring)</managingEditor><generator>Blogger</generator><openSearch:totalResults>12</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-14589096.post-6587727714926729637</guid><pubDate>Tue, 03 Jan 2012 00:16:00 +0000</pubDate><atom:updated>2012-01-03T01:19:19.589+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>clojure</category><title>Vocabulary trainer in Clojure</title><description>&lt;title&gt;~/src/gh/voc/train.clj.html&lt;/title&gt;    &lt;style type="text/css"&gt;&lt;!-- pre { font-family: monospace; color: #cccccc; background-color: #000000; } body { font-family: monospace; color: #cccccc; background-color: #000000; } .clojureParen8 { color: #ff00ff; } .clojureParen7 { color: #836fff; } .clojureParen6 { color: #00ffff; } .clojureParen5 { color: #00ff7f; } .clojureParen4 { color: #00ff00; } .clojureParen3 { color: #adff2f; } .clojureParen2 { color: #ffff00; } .clojureParen1 { color: #ffa500; } .Constant { color: #ffa0a0; } .Comment { color: #80a0ff; } .Statement { color: #ffff00; } .Identifier { color: #40ffff; } .Special { color: #ffa500; } --&gt;&lt;/style&gt;  &lt;br /&gt;&lt;pre&gt;&lt;span class="Special"&gt;(&lt;/span&gt;&lt;span class="Identifier"&gt;use&lt;/span&gt; &lt;span class="Special"&gt;'&lt;/span&gt;&lt;span class="Special"&gt;[&lt;/span&gt;clojure.string &lt;span class="Statement"&gt;:only&lt;/span&gt;&lt;span class="clojureVector"&gt; &lt;/span&gt;&lt;span class="Special"&gt;(&lt;/span&gt;&lt;span class="clojureSexpLevel0"&gt;split split-lines&lt;/span&gt;&lt;span class="Special"&gt;)])&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Comment"&gt;; file is tab-seperated pairs of foreign and native words&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Special"&gt;(&lt;/span&gt;&lt;span class="Special"&gt;let&lt;/span&gt; &lt;span class="Special"&gt;[&lt;/span&gt;contents &lt;span class="Special"&gt;(&lt;/span&gt;&lt;span class="Identifier"&gt;slurp&lt;/span&gt;&lt;span class="clojureSexpLevel0"&gt; &lt;/span&gt;&lt;span class="Constant"&gt;"100a.txt"&lt;/span&gt;&lt;span class="clojureSexpLevel0"&gt; &lt;/span&gt;&lt;span class="Statement"&gt;:encoding&lt;/span&gt;&lt;span class="clojureSexpLevel0"&gt; &lt;/span&gt;&lt;span class="Constant"&gt;"utf-8"&lt;/span&gt;&lt;span class="Special"&gt;)&lt;/span&gt;&lt;br /&gt;      lines &lt;span class="Special"&gt;(&lt;/span&gt;split-lines contents&lt;span class="Special"&gt;)&lt;/span&gt;&lt;br /&gt;      pairs &lt;span class="Special"&gt;(&lt;/span&gt;&lt;span class="Statement"&gt;map&lt;/span&gt; &lt;span class="Special"&gt;#(&lt;/span&gt;split &lt;span class="Special"&gt;%&lt;/span&gt;&lt;span class="clojureAnonFn"&gt; &lt;/span&gt;&lt;span class="Constant"&gt;#"\t"&lt;/span&gt;&lt;span class="Special"&gt;)&lt;/span&gt;&lt;span class="clojureSexpLevel0"&gt; lines&lt;/span&gt;&lt;span class="Special"&gt;)]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="clojureParen1"&gt;(&lt;/span&gt;&lt;span class="Special"&gt;loop&lt;/span&gt; &lt;span class="Special"&gt;[&lt;/span&gt;my-pairs &lt;span class="Special"&gt;(&lt;/span&gt;&lt;span class="Identifier"&gt;shuffle&lt;/span&gt;&lt;span class="clojureSexpLevel0"&gt; pairs&lt;/span&gt;&lt;span class="Special"&gt;)]&lt;/span&gt;&lt;br /&gt;    &lt;span class="clojureParen2"&gt;(&lt;/span&gt;&lt;span class="Special"&gt;let&lt;/span&gt; &lt;span class="Special"&gt;[&lt;/span&gt;pair &lt;span class="Special"&gt;(&lt;/span&gt;&lt;span class="Identifier"&gt;first&lt;/span&gt; my-pairs&lt;span class="Special"&gt;)]&lt;/span&gt;&lt;br /&gt;      &lt;span class="clojureParen3"&gt;(&lt;/span&gt;&lt;span class="Special"&gt;do&lt;/span&gt;&lt;br /&gt;        &lt;span class="clojureParen4"&gt;(&lt;/span&gt;&lt;span class="Identifier"&gt;println&lt;/span&gt;&lt;span class="clojureParen4"&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span class="clojureParen4"&gt;(&lt;/span&gt;&lt;span class="Identifier"&gt;println&lt;/span&gt; &lt;span class="clojureParen5"&gt;(&lt;/span&gt;&lt;span class="Identifier"&gt;first&lt;/span&gt; &lt;span class="clojureParen6"&gt;(&lt;/span&gt;&lt;span class="Identifier"&gt;first&lt;/span&gt; my-pairs&lt;span class="clojureParen6"&gt;)&lt;/span&gt;&lt;span class="clojureParen5"&gt;)&lt;/span&gt;&lt;span class="clojureParen4"&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span class="clojureParen4"&gt;(&lt;/span&gt;&lt;span class="Special"&gt;if&lt;/span&gt; &lt;span class="clojureParen5"&gt;(&lt;/span&gt;&lt;span class="Identifier"&gt;not=&lt;/span&gt; &lt;span class="clojureParen6"&gt;(&lt;/span&gt;&lt;span class="Identifier"&gt;read-line&lt;/span&gt;&lt;span class="clojureParen6"&gt;)&lt;/span&gt;&lt;span class="clojureSexpLevel5"&gt; &lt;/span&gt;&lt;span class="clojureParen6"&gt;(&lt;/span&gt;&lt;span class="Identifier"&gt;second&lt;/span&gt; pair&lt;span class="clojureParen6"&gt;)&lt;/span&gt;&lt;span class="clojureParen5"&gt;)&lt;/span&gt;&lt;br /&gt;          &lt;span class="clojureParen5"&gt;(&lt;/span&gt;&lt;span class="Special"&gt;do&lt;/span&gt;&lt;br /&gt;            &lt;span class="clojureParen6"&gt;(&lt;/span&gt;&lt;span class="Identifier"&gt;println&lt;/span&gt; &lt;span class="Constant"&gt;"wrong, correct is:"&lt;/span&gt;&lt;span class="clojureSexpLevel6"&gt; &lt;/span&gt;&lt;span class="clojureParen7"&gt;(&lt;/span&gt;&lt;span class="Identifier"&gt;second&lt;/span&gt; pair&lt;span class="clojureParen7"&gt;)&lt;/span&gt;&lt;span class="clojureParen6"&gt;)&lt;/span&gt;&lt;br /&gt;            &lt;span class="clojureParen6"&gt;(&lt;/span&gt;&lt;span class="Statement"&gt;recur&lt;/span&gt; &lt;span class="clojureParen7"&gt;(&lt;/span&gt;&lt;span class="Identifier"&gt;shuffle&lt;/span&gt; my-pairs&lt;span class="clojureParen7"&gt;)&lt;/span&gt;&lt;span class="clojureParen6"&gt;)&lt;/span&gt;&lt;span class="clojureParen5"&gt;)&lt;/span&gt;&lt;br /&gt;          &lt;span class="clojureParen5"&gt;(&lt;/span&gt;&lt;span class="Special"&gt;do&lt;/span&gt;&lt;br /&gt;            &lt;span class="clojureParen6"&gt;(&lt;/span&gt;&lt;span class="Identifier"&gt;println&lt;/span&gt; &lt;span class="Constant"&gt;"correct"&lt;/span&gt;&lt;span class="clojureParen6"&gt;)&lt;/span&gt;&lt;br /&gt;            &lt;span class="clojureParen6"&gt;(&lt;/span&gt;&lt;span class="Special"&gt;if&lt;/span&gt; &lt;span class="clojureParen7"&gt;(&lt;/span&gt;&lt;span class="Identifier"&gt;seq&lt;/span&gt; &lt;span class="clojureParen8"&gt;(&lt;/span&gt;&lt;span class="Identifier"&gt;rest&lt;/span&gt; my-pairs&lt;span class="clojureParen8"&gt;)&lt;/span&gt;&lt;span class="clojureParen7"&gt;)&lt;/span&gt;&lt;span class="clojureSexpLevel6"&gt; &lt;/span&gt;&lt;span class="Comment"&gt;; (seq idiomatic for (not (empty?&lt;/span&gt;&lt;br /&gt;              &lt;span class="clojureParen7"&gt;(&lt;/span&gt;&lt;span class="Statement"&gt;recur&lt;/span&gt; &lt;span class="clojureParen8"&gt;(&lt;/span&gt;&lt;span class="Identifier"&gt;rest&lt;/span&gt; my-pairs&lt;span class="clojureParen8"&gt;)&lt;/span&gt;&lt;span class="clojureParen7"&gt;)&lt;/span&gt;&lt;span class="clojureParen6"&gt;)&lt;/span&gt;&lt;span class="clojureParen5"&gt;)&lt;/span&gt;&lt;span class="clojureParen4"&gt;)&lt;/span&gt;&lt;span class="clojureParen3"&gt;)&lt;/span&gt;&lt;span class="clojureParen2"&gt;)&lt;/span&gt;&lt;span class="clojureParen1"&gt;)&lt;/span&gt;&lt;span class="Special"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14589096-6587727714926729637?l=blog.ghaering.de' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.ghaering.de/2012/01/vocabulary-trainer-in-clojure.html</link><author>noreply@blogger.com (Gerhard Häring)</author><thr:total>0</thr:total><georss:featurename>Harburg, Germany</georss:featurename><georss:point>53.556866 9.994622</georss:point><georss:box>53.2550405 9.362908 53.8586915 10.626336</georss:box></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-14589096.post-1086452207543787288</guid><pubDate>Mon, 02 Jan 2012 10:44:00 +0000</pubDate><atom:updated>2012-01-03T01:20:59.510+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>clojure</category><title>Monty Hall problem in Clojure</title><description>&lt;title&gt;~/src/gh/goat.clj.html&lt;/title&gt;    &lt;style type="text/css"&gt;&lt;!-- pre { font-family: monospace; color: #cccccc; background-color: #000000; } body { font-family: monospace; color: #cccccc; background-color: #000000; } .Constant { color: #ffa0a0; } .clojureParen3 { color: #adff2f; } .Statement { color: #ffff00; } .clojureParen2 { color: #ffff00; } .Identifier { color: #40ffff; } .clojureParen1 { color: #ffa500; } .PreProc { color: #ff80ff; } .Special { color: #ffa500; } .Comment { color: #80a0ff; } --&gt;&lt;/style&gt;  &lt;br /&gt;&lt;pre&gt;&lt;span class="Comment"&gt;; Monty Hall problem in Clojure&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Special"&gt;(&lt;/span&gt;&lt;span class="PreProc"&gt;defn&lt;/span&gt; pick-first-guess &lt;span class="Special"&gt;[&lt;/span&gt;doors&lt;span class="Special"&gt;]&lt;/span&gt;&lt;br /&gt;  &lt;span class="clojureParen1"&gt;(&lt;/span&gt;&lt;span class="Identifier"&gt;first&lt;/span&gt; doors&lt;span class="clojureParen1"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="Special"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Special"&gt;(&lt;/span&gt;&lt;span class="PreProc"&gt;defn&lt;/span&gt; change-guess &lt;span class="Special"&gt;[&lt;/span&gt;doors&lt;span class="Special"&gt;]&lt;/span&gt;&lt;br /&gt;  &lt;span class="clojureParen1"&gt;(&lt;/span&gt;&lt;span class="Special"&gt;if&lt;/span&gt; &lt;span class="clojureParen2"&gt;(&lt;/span&gt;&lt;span class="Identifier"&gt;=&lt;/span&gt; &lt;span class="Statement"&gt;:goat&lt;/span&gt;&lt;span class="clojureSexpLevel2"&gt; &lt;/span&gt;&lt;span class="clojureParen3"&gt;(&lt;/span&gt;&lt;span class="Identifier"&gt;second&lt;/span&gt; doors&lt;span class="clojureParen3"&gt;)&lt;/span&gt;&lt;span class="clojureParen2"&gt;)&lt;/span&gt;&lt;span class="clojureSexpLevel1"&gt; &lt;/span&gt;&lt;span class="clojureParen2"&gt;(&lt;/span&gt;&lt;span class="Identifier"&gt;last&lt;/span&gt;&lt;span class="clojureSexpLevel2"&gt; doors&lt;/span&gt;&lt;span class="clojureParen2"&gt;)&lt;/span&gt;&lt;br /&gt;    &lt;span class="clojureParen2"&gt;(&lt;/span&gt;&lt;span class="Identifier"&gt;second&lt;/span&gt; doors&lt;span class="clojureParen2"&gt;)&lt;/span&gt;&lt;span class="clojureParen1"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="Special"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Special"&gt;(&lt;/span&gt;&lt;span class="Special"&gt;def&lt;/span&gt; samples &lt;span class="clojureParen1"&gt;(&lt;/span&gt;&lt;span class="Statement"&gt;map&lt;/span&gt; &lt;span class="Identifier"&gt;shuffle&lt;/span&gt;&lt;span class="clojureSexpLevel1"&gt; &lt;/span&gt;&lt;span class="clojureParen2"&gt;(&lt;/span&gt;&lt;span class="Identifier"&gt;repeat&lt;/span&gt; &lt;span class="Constant"&gt;1000&lt;/span&gt;&lt;span class="clojureSexpLevel2"&gt; &lt;/span&gt;&lt;span class="Special"&gt;[&lt;/span&gt;&lt;span class="Statement"&gt;:goat&lt;/span&gt; &lt;span class="Statement"&gt;:goat&lt;/span&gt;&lt;span class="clojureVector"&gt; &lt;/span&gt;&lt;span class="Statement"&gt;:car&lt;/span&gt;&lt;span class="Special"&gt;]&lt;/span&gt;&lt;span class="clojureParen2"&gt;)&lt;/span&gt;&lt;span class="clojureParen1"&gt;)&lt;/span&gt;&lt;span class="Special"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Special"&gt;(&lt;/span&gt;&lt;span class="Identifier"&gt;count&lt;/span&gt; &lt;span class="clojureParen1"&gt;(&lt;/span&gt;&lt;span class="Statement"&gt;filter&lt;/span&gt; &lt;span class="Special"&gt;#(&lt;/span&gt;&lt;span class="Identifier"&gt;=&lt;/span&gt; &lt;span class="Special"&gt;%&lt;/span&gt;&lt;span class="clojureAnonFn"&gt; &lt;/span&gt;&lt;span class="Statement"&gt;:car&lt;/span&gt;&lt;span class="Special"&gt;)&lt;/span&gt;&lt;span class="clojureSexpLevel1"&gt; &lt;/span&gt;&lt;span class="clojureParen2"&gt;(&lt;/span&gt;&lt;span class="Statement"&gt;map&lt;/span&gt; pick-first-guess samples&lt;span class="clojureParen2"&gt;)&lt;/span&gt;&lt;span class="clojureParen1"&gt;)&lt;/span&gt;&lt;span class="Special"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="Special"&gt;(&lt;/span&gt;&lt;span class="Identifier"&gt;count&lt;/span&gt; &lt;span class="clojureParen1"&gt;(&lt;/span&gt;&lt;span class="Statement"&gt;filter&lt;/span&gt; &lt;span class="Special"&gt;#(&lt;/span&gt;&lt;span class="Identifier"&gt;=&lt;/span&gt; &lt;span class="Special"&gt;%&lt;/span&gt;&lt;span class="clojureAnonFn"&gt; &lt;/span&gt;&lt;span class="Statement"&gt;:car&lt;/span&gt;&lt;span class="Special"&gt;)&lt;/span&gt;&lt;span class="clojureSexpLevel1"&gt; &lt;/span&gt;&lt;span class="clojureParen2"&gt;(&lt;/span&gt;&lt;span class="Statement"&gt;map&lt;/span&gt; change-guess samples&lt;span class="clojureParen2"&gt;)&lt;/span&gt;&lt;span class="clojureParen1"&gt;)&lt;/span&gt;&lt;span class="Special"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14589096-1086452207543787288?l=blog.ghaering.de' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.ghaering.de/2012/01/monty-hall-problem-in-clojure.html</link><author>noreply@blogger.com (Gerhard Häring)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-14589096.post-6633017348807187041</guid><pubDate>Tue, 31 Aug 2010 11:24:00 +0000</pubDate><atom:updated>2010-08-31T13:24:14.183+02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>social</category><category domain='http://www.blogger.com/atom/ns#'>quiz</category><category domain='http://www.blogger.com/atom/ns#'>twitter</category><category domain='http://www.blogger.com/atom/ns#'>time wasting</category><title>Twitter Spelling Test</title><description>&lt;a href="http://theoatmeal.com/quiz/twitter_spell"&gt;&lt;img src="http://theoatmeal.com/img/quizzes/generated/8_95_a.jpg" alt="The Twitter Spelling Test" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;Created by &lt;a href="http://theoatmeal.com"&gt;Oatmeal&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14589096-6633017348807187041?l=blog.ghaering.de' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.ghaering.de/2010/08/twitter-spelling-test.html</link><author>noreply@blogger.com (Gerhard Häring)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-14589096.post-8918143793525444732</guid><pubDate>Thu, 25 Mar 2010 11:34:00 +0000</pubDate><atom:updated>2010-03-25T12:34:08.418+01:00</atom:updated><title>Youtube down</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;I've seen that for the first time in years.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_h1AHp80pJ6g/S6tKEx1fg-I/AAAAAAAAAM4/cesqvs2xe08/s1600/youtube_down.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_h1AHp80pJ6g/S6tKEx1fg-I/AAAAAAAAAM4/cesqvs2xe08/s320/youtube_down.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14589096-8918143793525444732?l=blog.ghaering.de' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.ghaering.de/2010/03/youtube-down.html</link><author>noreply@blogger.com (Gerhard Häring)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_h1AHp80pJ6g/S6tKEx1fg-I/AAAAAAAAAM4/cesqvs2xe08/s72-c/youtube_down.png' height='72' width='72'/><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-14589096.post-3332665708185431406</guid><pubDate>Thu, 18 Mar 2010 09:31:00 +0000</pubDate><atom:updated>2010-03-18T10:31:25.971+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>python</category><category domain='http://www.blogger.com/atom/ns#'>programming</category><category domain='http://www.blogger.com/atom/ns#'>scala</category><title>Experimenting with Scala</title><description>This is my first useful &lt;b&gt;Scala&lt;/b&gt; program. It was ported from a Python program (see below). In 1993 I wrote an equivalent in Modula-2 ;-)&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;import scala.io.Source;&lt;br /&gt;import java.io.File;&lt;br /&gt;import scala.util.Random;&lt;br /&gt;&lt;br /&gt;object voc {&lt;br /&gt;  def train(lst : List[Tuple2[String, String]]) : Unit = {&lt;br /&gt;    println();&lt;br /&gt;    if (lst.length == 0) {&lt;br /&gt;      println(":-D");&lt;br /&gt;      return;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    val shuffled = Random.shuffle(lst);&lt;br /&gt;    val current = shuffled.head;&lt;br /&gt;    println("&gt;&gt;&gt; " + current._1);&lt;br /&gt;    var line = Console.readLine();&lt;br /&gt;    if (line == current._2) {&lt;br /&gt;      println("correct");&lt;br /&gt;      train(shuffled.tail);&lt;br /&gt;    } else {&lt;br /&gt;      print("\007");&lt;br /&gt;      println("wrong - correct is: " + current._2);&lt;br /&gt;      train(shuffled);&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  def main(args: Array[String]) {&lt;br /&gt;    val lst = Source.fromFile(new File(args(0))).getLines()&lt;br /&gt;          .map { s =&gt; s.split("\t") }&lt;br /&gt;          .filter( l =&gt; l.length == 2 )&lt;br /&gt;          .map (l =&gt; Tuple2(l.head, l.last))&lt;br /&gt;          .toList;&lt;br /&gt;&lt;br /&gt;    train(lst);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Python version:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;from __future__ import with_statement&lt;br /&gt;import random&lt;br /&gt;import sys&lt;br /&gt;&lt;br /&gt;def train(lst):&lt;br /&gt;    while len(lst) &gt; 0:&lt;br /&gt;        random.shuffle(lst)&lt;br /&gt;&lt;br /&gt;        lang1, lang2 = lst[0]&lt;br /&gt;&lt;br /&gt;        print "&gt;&gt;&gt;", lang1&lt;br /&gt;        try:&lt;br /&gt;            answer = raw_input("answer: ").strip()&lt;br /&gt;        except EOFError:&lt;br /&gt;            # ^Z pressed, ignore&lt;br /&gt;            continue&lt;br /&gt;&lt;br /&gt;        if answer == lang2:&lt;br /&gt;            print "correct"&lt;br /&gt;            lst = lst[1:]&lt;br /&gt;        else:&lt;br /&gt;            print chr(7)&lt;br /&gt;            print "wrong - correct is =&gt;", lang2&lt;br /&gt;&lt;br /&gt;        print&lt;br /&gt;        print&lt;br /&gt;&lt;br /&gt;    print ":-D"&lt;br /&gt;&lt;br /&gt;def main():&lt;br /&gt;    filename = sys.argv[1]&lt;br /&gt;&lt;br /&gt;    lst = []&lt;br /&gt;    for line in open(filename):&lt;br /&gt;        line = line.strip()&lt;br /&gt;        if not line:&lt;br /&gt;            continue&lt;br /&gt;        parts = line.split("\t")&lt;br /&gt;        assert len(parts) == 2&lt;br /&gt;        lst.append(parts)&lt;br /&gt;&lt;br /&gt;    train(lst)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;if __name__ == "__main__":&lt;br /&gt;    main()&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14589096-3332665708185431406?l=blog.ghaering.de' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.ghaering.de/2010/03/experimenting-with-scala.html</link><author>noreply@blogger.com (Gerhard Häring)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-14589096.post-7462986854284283177</guid><pubDate>Sun, 14 Mar 2010 16:24:00 +0000</pubDate><atom:updated>2010-03-14T17:24:45.134+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>programming</category><title>PHP, the forgotten programming language</title><description>I just took a quiz and had a complete blackout of PHP. Can &lt;b&gt;you&lt;/b&gt; name the 25 most popular programming languages? Quiz &lt;a href="http://www.sporcle.com/games/moogles/programlanguages"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_h1AHp80pJ6g/S50NoxQVieI/AAAAAAAAAMw/TyyPB_DoO3I/s1600-h/PHP_Blackout.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_h1AHp80pJ6g/S50NoxQVieI/AAAAAAAAAMw/TyyPB_DoO3I/s320/PHP_Blackout.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14589096-7462986854284283177?l=blog.ghaering.de' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.ghaering.de/2010/03/php-forgotten-programming-language.html</link><author>noreply@blogger.com (Gerhard Häring)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_h1AHp80pJ6g/S50NoxQVieI/AAAAAAAAAMw/TyyPB_DoO3I/s72-c/PHP_Blackout.png' height='72' width='72'/><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-14589096.post-8619657230640138106</guid><pubDate>Wed, 17 Feb 2010 16:16:00 +0000</pubDate><atom:updated>2010-02-17T17:17:39.570+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>nonsense</category><category domain='http://www.blogger.com/atom/ns#'>funny</category><category domain='http://www.blogger.com/atom/ns#'>olympics</category><title>Olympic Winter Games</title><description>How little do &lt;b&gt;you &lt;/b&gt;care?&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_h1AHp80pJ6g/S3wWED-M2yI/AAAAAAAAAMM/E91zHAnrjik/s1600-h/spam_wintergames.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/_h1AHp80pJ6g/S3wWED-M2yI/AAAAAAAAAMM/E91zHAnrjik/s400/spam_wintergames.png" width="380" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;Vote at &lt;a href="http://www.spiegel.de/spam/0,1518,678370,00.html"&gt;SPON&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14589096-8619657230640138106?l=blog.ghaering.de' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.ghaering.de/2010/02/olympic-winter-games.html</link><author>noreply@blogger.com (Gerhard Häring)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_h1AHp80pJ6g/S3wWED-M2yI/AAAAAAAAAMM/E91zHAnrjik/s72-c/spam_wintergames.png' height='72' width='72'/><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-14589096.post-6460930303809178164</guid><pubDate>Mon, 18 Jan 2010 16:39:00 +0000</pubDate><atom:updated>2010-01-18T17:39:24.533+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Versager</category><category domain='http://www.blogger.com/atom/ns#'>Verbrecher</category><title>Schreiber vs. Brüderle</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_h1AHp80pJ6g/S1SNjTIN5gI/AAAAAAAAAME/X6TSO9a3MvU/s1600-h/schreiber.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_h1AHp80pJ6g/S1SNjTIN5gI/AAAAAAAAAME/X6TSO9a3MvU/s320/schreiber.jpg" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_h1AHp80pJ6g/S1SNgMfXLbI/AAAAAAAAAL8/xmFEBBCWGzY/s1600-h/bruederle.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_h1AHp80pJ6g/S1SNgMfXLbI/AAAAAAAAAL8/xmFEBBCWGzY/s320/bruederle.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt; &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/14589096-6460930303809178164?l=blog.ghaering.de' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.ghaering.de/2010/01/schreiber-vs-bruderle.html</link><author>noreply@blogger.com (Gerhard Häring)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_h1AHp80pJ6g/S1SNjTIN5gI/AAAAAAAAAME/X6TSO9a3MvU/s72-c/schreiber.jpg' height='72' width='72'/><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-14589096.post-8458065503244559197</guid><pubDate>Thu, 05 Nov 2009 00:15:00 +0000</pubDate><atom:updated>2009-11-05T01:16:29.671+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>testing</category><category domain='http://www.blogger.com/atom/ns#'>programming</category><title>Interesting read about unit tests</title><description>&lt;a href="http://blogs.msdn.com/cashto/archive/2009/03/31/it-s-ok-not-to-write-unit-tests.aspx"&gt;It's OK Not to Write Unit Tests &lt;/a&gt; is an interesting blog post. Recommended to make you think again why you write them, if what you're writing are really unit tests, etc.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14589096-8458065503244559197?l=blog.ghaering.de' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.ghaering.de/2009/11/interesting-read-about-unit-tests.html</link><author>noreply@blogger.com (Gerhard Häring)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-14589096.post-1808979620672815391</guid><pubDate>Mon, 05 Oct 2009 11:06:00 +0000</pubDate><atom:updated>2009-10-05T13:11:01.136+02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>zensur</category><title>Unverständnis bei Bosbach von CDU</title><description>"Ich verstehe die Kritik der Liberalen an den auf Kinderpornografie beschränkten Netzsperren nicht." Es gebe kein Recht auf ungehinderten Zugriff auf Kinderpornografie im Internet, betonte Bosbach.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.spiegel.de/netzwelt/web/0,1518,652802,00.html"&gt;Netzwelt-Ticker: Google Wave strandet an der Hypeküste - SPIEGEL ONLINE - Nachrichten - Netzwelt&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Liberale wollen im Internet weiter freien Zugriff auf KiPo haben, während die CDU das Netz für uns sicher machen will. So einfach ist das-&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14589096-1808979620672815391?l=blog.ghaering.de' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.ghaering.de/2009/10/unverstandnis-bei-bosbach-von-cdu.html</link><author>noreply@blogger.com (Gerhard Häring)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-14589096.post-8426734711584091745</guid><pubDate>Tue, 16 Jun 2009 08:09:00 +0000</pubDate><atom:updated>2009-06-16T10:10:07.677+02:00</atom:updated><title>2009-01-07: Creating self-signed certificates</title><description>Note to self: When my self-signed certificate for my mail server expires next year at about the same time, this should fix it:&lt;br /&gt;&lt;blockquote&gt;openssl req -config /etc/ssl/openssl.cnf \&lt;br /&gt;-new -x509 -nodes -out /etc/ssl/certs/dovecot.pem \&lt;br /&gt;-keyout /etc/ssl/private/dovecot.pem&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14589096-8426734711584091745?l=blog.ghaering.de' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.ghaering.de/2009/06/2009-01-07-creating-self-signed.html</link><author>noreply@blogger.com (Gerhard Häring)</author><thr:total>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-14589096.post-112168772661379635</guid><pubDate>Mon, 18 Jul 2005 11:52:00 +0000</pubDate><atom:updated>2009-11-05T01:16:56.200+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>programming</category><title>The really hard bugs ...</title><description>D. Richard Hipp today on the SQLite mailing list:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: black; font-style: italic;"&gt;I am constantly amazed at the prevailing idea (exemplified&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black; font-style: italic;"&gt;by Java) that software should be strongly typed and should&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black; font-style: italic;"&gt;not use goto statement or pointers - all in the name of&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black; font-style: italic;"&gt;reducing bugs - but that it is OK to use multiple threads&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black; font-style: italic;"&gt;within the same address space.  Strong typing helps prevent&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black; font-style: italic;"&gt;only bugs that are trivially easy to locate and fix.  The&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black; font-style: italic;"&gt;use of goto statements and pointers likewise results in&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black; font-style: italic;"&gt;deterministic problems that are easy to test for and&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black; font-style: italic;"&gt;relatively easy to track down and correct.  But threading&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black; font-style: italic;"&gt;bugs tend to manifest themselves as timing-dependent&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black; font-style: italic;"&gt;glitches and lock-ups that are hardware and platform&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black; font-style: italic;"&gt;dependent, that never happen the same way twice, and that&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black; font-style: italic;"&gt;only appear for customers after deployment and never in a&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black; font-style: italic;"&gt;testing environment.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14589096-112168772661379635?l=blog.ghaering.de' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.ghaering.de/2005/07/really-hard-bugs.html</link><author>noreply@blogger.com (Gerhard Häring)</author><thr:total>1</thr:total></item></channel></rss>
